commit 35fcb21ea7064a4b3c28e11026833b778dad6f2a Author: haui Date: Wed Jun 12 19:41:16 2024 +0200 add all files diff --git a/enchantments.lua b/enchantments.lua new file mode 100644 index 0000000..379a18e --- /dev/null +++ b/enchantments.lua @@ -0,0 +1,751 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +-- Taken from https://minecraft.gamepedia.com/Enchanting + +local function increase_damage(damage_group, factor) + return function(itemstack, level) + local tool_capabilities = itemstack:get_tool_capabilities() + tool_capabilities.damage_groups[damage_group] = (tool_capabilities.damage_groups[damage_group] or 0) + level * factor + itemstack:get_meta():set_tool_capabilities(tool_capabilities) + end +end + +-- implemented via on_enchant and additions in mobs_mc; Slowness IV part unimplemented +mcl_enchanting.enchantments.bane_of_arthropods = { + name = S("Bane of Arthropods"), + max_level = 5, + primary = {sword = true}, + secondary = {axe = true}, + disallow = {}, + incompatible = {smite = true, sharpness = true}, + weight = 5, + description = S("Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites)."), + 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}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +-- requires missing MineClone2 feature +--[[mcl_enchanting.enchantments.channeling = { + name = S("Channeling"), + max_level = 1, + primary = {trident = true}, + secondary = {}, + disallow = {}, + incompatible = {riptide = true}, + weight = 1, + description = S("Channels a bolt of lightning toward a target. Works 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}}, + inv_combat_tab = true, + inv_tool_tab = false, +}]]-- + +-- implemented in mcl_death_drop +mcl_enchanting.enchantments.curse_of_vanishing = { + name = S("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 = {}, + incompatible = {}, + weight = 1, + description = S("Item destroyed on death."), + curse = true, + on_enchant = function() end, + requires_tool = false, + treasure = true, + power_range_table = {{25, 50}}, + inv_combat_tab = true, + inv_tool_tab = true, +} + +-- implemented in mcl_playerplus +mcl_enchanting.enchantments.depth_strider = { + name = S("Depth Strider"), + max_level = 3, + primary = {}, + secondary = {armor_feet = true}, + disallow = {non_combat_armor = true}, + incompatible = {frost_walker = true}, + weight = 2, + description = S("Increases underwater movement speed."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{10, 25}, {20, 35}, {30, 45}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +-- implemented via on_enchant +mcl_enchanting.enchantments.efficiency = { + name = S("Efficiency"), + max_level = 5, + primary = {pickaxe = true, shovel = true, axe = true, hoe = true}, + secondary = {shears = true}, + disallow = {}, + incompatible = {}, + weight = 10, + description = S("Increases mining speed."), + curse = false, + on_enchant = function() + -- Updating digging speed is handled by update_groupcaps which + -- is called from load_enchantments. + end, + requires_tool = false, + treasure = false, + power_range_table = {{1, 61}, {11, 71}, {21, 81}, {31, 91}, {41, 101}}, + inv_combat_tab = false, + inv_tool_tab = true, +} + +-- implemented in mcl_mobs and via register_on_punchplayer callback +mcl_enchanting.enchantments.fire_aspect = { + name = S("Fire Aspect"), + max_level = 2, + primary = {sword = true}, + secondary = {}, + disallow = {}, + incompatible = {}, + weight = 2, + description = S("Sets target on fire."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{10, 61}, {30, 71}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage) + if hitter and hitter:is_player() then + local wielditem = hitter:get_wielded_item() + if wielditem then + local fire_aspect_level = mcl_enchanting.get_enchantment(wielditem, "fire_aspect") + if fire_aspect_level > 0 then + local player_pos = player:get_pos() + local hitter_pos = hitter:get_pos() + if vector.distance(hitter_pos, player_pos) <= 3 then + mcl_burning.set_on_fire(player, fire_aspect_level * 4) + end + end + end + end +end) + +mcl_enchanting.enchantments.flame = { + name = S("Flame"), + max_level = 1, + primary = {bow = true}, + secondary = {}, + disallow = {}, + incompatible = {}, + weight = 2, + description = S("Arrows set target on fire."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{20, 50}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +-- implemented in mcl_item_entity +mcl_enchanting.enchantments.fortune = { + name = S("Fortune"), + max_level = 3, + primary = {pickaxe = true, shovel = true, axe = true, hoe = true}, + secondary = {}, + disallow = {}, + incompatible = {silk_touch = true}, + weight = 2, + description = S("Increases certain block drops."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{15, 61}, {24, 71}, {33, 81}}, + inv_combat_tab = false, + inv_tool_tab = true, +} + +-- implemented via walkover.register_global +mcl_enchanting.enchantments.frost_walker = { + name = S("Frost Walker"), + max_level = 2, + primary = {}, + secondary = {armor_feet = true}, + disallow = {non_combat_armor = true}, + incompatible = {depth_strider = true}, + weight = 2, + description = S("Turns water beneath the player into frosted ice and prevents the damage from magma blocks."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = true, + power_range_table = {{10, 25}, {20, 35}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +walkover.register_global(function(pos, _, player) + local boots = player:get_inventory():get_stack("armor", 5) + local frost_walker = mcl_enchanting.get_enchantment(boots, "frost_walker") + if frost_walker <= 0 then + return + end + local radius = frost_walker + 2 + local minp = {x = pos.x - radius, y = pos.y, z = pos.z - radius} + local maxp = {x = pos.x + radius, y = pos.y, z = pos.z + radius} + local positions = minetest.find_nodes_in_area_under_air(minp, maxp, "mcl_core:water_source") + for _, p in ipairs(positions) do + if vector.distance(pos, p) <= radius then + minetest.set_node(p, {name = "mcl_core:frosted_ice_0"}) + end + end +end) + +-- requires missing MineClone2 feature +--[[mcl_enchanting.enchantments.impaling = { + name = S("Impaling"), + max_level = 5, + primary = {trident = true}, + secondary = {}, + disallow = {}, + incompatible = {}, + weight = 2, + description = S("Trident deals additional damage to ocean mobs."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{1, 21}, {9, 29}, {17, 37}, {25, 45}, {33, 53}}, + inv_combat_tab = true, + inv_tool_tab = false, +}]]-- + +-- implemented in mcl_bows +mcl_enchanting.enchantments.infinity = { + name = S("Infinity"), + max_level = 1, + primary = {bow = true}, + secondary = {}, + disallow = {}, + incompatible = {mending = true}, + weight = 1, + description = S("Shooting consumes no regular arrows."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{20, 50}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +-- implemented via minetest.calculate_knockback +mcl_enchanting.enchantments.knockback = { + name = S("Knockback"), + max_level = 2, + primary = {sword = true}, + secondary = {}, + disallow = {}, + incompatible = {}, + weight = 5, + description = S("Increases knockback."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{5, 61}, {25, 71}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +local old_calculate_knockback = minetest.calculate_knockback +function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool_capabilities, dir, distance, damage) + local knockback = old_calculate_knockback(player, hitter, time_from_last_punch, tool_capabilities, dir, distance, damage) + local luaentity + if hitter then + luaentity = hitter:get_luaentity() + end + if hitter and hitter:is_player() and distance <= 3 then + local wielditem = hitter:get_wielded_item() + --knockback = knockback + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") + local enchant = mcl_enchanting.get_enchantment(wielditem, "knockback") + knockback = knockback + 3.22 * enchant + -- add vertical lift to knockback + local v = player:get_velocity() + local added_v = 0 + local invul = player:get_meta():get_int("mcl_damage:invulnerable") + if v and v.y <= 0.01 and v.y >= -0.01 and invul == 0 then + local regular_v = 6.4 + local enchant_v = 7 + regular_v = regular_v * math.abs(dir.y - 1) + enchant_v = enchant_v * math.abs(dir.y - 1) + if enchant == 0 then + player:add_velocity({x = 0, y = regular_v, z = 0}) + added_v = regular_v + else + player:add_velocity({x = 0, y = enchant_v, z = 0}) + added_v = enchant_v + end + -- add minimum knockback + if knockback <= 1.5 then + knockback = knockback + 4.875 + elseif knockback <= 6.19 then + knockback = knockback + 0.609375 + end + end + -- counteract forward velocity when hit + local self_dir_dot = (v.x * dir.x) + (v.z * dir.z) + if self_dir_dot < 0 then + player:add_velocity({x = v.x * -1, y = 0, z = v.z * -1}) + end + -- add player velocity to knockback + local h_name = hitter:get_player_name() + local hv = hitter:get_velocity() + local dir_dot = (hv.x * dir.x) + (hv.z * dir.z) + local hitter_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) + if dir_dot > 0 and mcl_sprint.is_sprinting(h_name) then + knockback = knockback + hitter_mag * 0.6875 + elseif dir_dot > 0 then + knockback = knockback + hitter_mag * 0.515625 + end + -- reduce floatiness + minetest.after(0.25, function() + player:add_velocity({x = 0, y = (v.y + added_v) * -0.375, z = 0}) + end) + -- reduce knockback when moving towards hitter while attacking + local self_dir_dot = (v.x * dir.x) + (v.z * dir.z) + local control = player:get_player_control() + if self_dir_dot < -4.3 and control.up and control.LMB then + knockback = knockback * 0.6 + end + -- remove knockback if invulnerable + if invul > 0 then + knockback = 0 + end + elseif hitter and hitter:is_player() and distance > 3 then + knockback = 0 + elseif luaentity and luaentity._knockback then + local kb = knockback + luaentity._knockback / 4 + local punch_dir = dir + punch_dir.y = 0 + punch_dir = vector.normalize(punch_dir) * kb + punch_dir.y = 4 + player:add_velocity(punch_dir) + knockback = 0 + end + return knockback +end + +-- implemented in mcl_mobs and mobs_mc +mcl_enchanting.enchantments.looting = { + name = S("Looting"), + max_level = 3, + primary = {sword = true}, + secondary = {}, + disallow = {}, + incompatible = {}, + weight = 2, + description = S("Increases mob loot."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{15, 61}, {24, 71}, {33, 81}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +-- requires missing MineClone2 feature +--[[mcl_enchanting.enchantments.loyalty = { + name = S("Loyalty"), + max_level = 3, + primary = {trident = true}, + secondary = {}, + disallow = {}, + incompatible = {riptide = true}, + weight = 5, + description = S("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}}, + inv_combat_tab = true, + inv_tool_tab = false, +}]]-- + +-- implemented in mcl_fishing +mcl_enchanting.enchantments.luck_of_the_sea = { + name = S("Luck of the Sea"), + max_level = 3, + primary = {fishing_rod = true}, + secondary = {}, + disallow = {}, + incompatible = {}, + weight = 2, + description = S("Increases rate of good loot (enchanting books, etc.)"), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{15, 61}, {24, 71}, {33, 81}}, + inv_combat_tab = false, + inv_tool_tab = true, +} + +-- implemented in mcl_fishing +mcl_enchanting.enchantments.lure = { + name = S("Lure"), + max_level = 3, + primary = {fishing_rod = true}, + secondary = {}, + disallow = {}, + incompatible = {}, + weight = 2, + description = S("Decreases time until rod catches something."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{15, 61}, {24, 71}, {33, 81}}, + inv_combat_tab = false, + inv_tool_tab = true, +} + +-- implemented in mcl_experience +mcl_enchanting.enchantments.mending = { + name = S("Mending"), + max_level = 1, + primary = {}, + secondary = {armor_head = true, armor_torso = true, armor_legs = true, armor_feet = true, tool = true, weapon = true}, + disallow = {}, + incompatible = {infinity = true}, + weight = 2, + description = S("Repair the item while gaining XP orbs."), + curse = false, + on_enchant = function() end, + requires_tool = true, + treasure = true, + power_range_table = {{25, 75}}, + inv_combat_tab = true, + inv_tool_tab = true, +} + +mcl_experience.register_on_add_xp(function(player, xp) + local inv = player:get_inventory() + + local candidates = { + {list = "main", index = player:get_wield_index()}, + {list = "armor", index = 2}, + {list = "armor", index = 3}, + {list = "armor", index = 4}, + {list = "armor", index = 5}, + {list = "offhand", index = 1}, + } + + local final_candidates = {} + for _, can in ipairs(candidates) do + local stack = inv:get_stack(can.list, can.index) + local wear = stack:get_wear() + if mcl_enchanting.has_enchantment(stack, "mending") and wear > 0 then + can.stack = stack + can.wear = wear + table.insert(final_candidates, can) + end + end + + if #final_candidates > 0 then + local can = final_candidates[math.random(#final_candidates)] + local stack, list, index, wear = can.stack, can.list, can.index, can.wear + local uses = mcl_util.calculate_durability(stack) + local multiplier = 2 * 65535 / uses + local repair = xp * multiplier + local new_wear = wear - repair + + if new_wear < 0 then + xp = math.floor(-new_wear / multiplier + 0.5) + new_wear = 0 + else + xp = 0 + end + + stack:set_wear(math.floor(new_wear)) + tt.reload_itemstack_description(stack) -- update tooltip + inv:set_stack(list, index, stack) + end + + return xp +end, 0) + +mcl_enchanting.enchantments.multishot = { + name = S("Multishot"), + max_level = 1, + primary = {crossbow = true}, + secondary = {}, + disallow = {}, + incompatible = {piercing = true}, + weight = 2, + description = S("Shoot 3 arrows at the cost of one."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{20, 50}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +-- requires missing MineClone2 feature +mcl_enchanting.enchantments.piercing = { + name = S("Piercing"), + max_level = 4, + primary = {crossbow = true}, + secondary = {}, + disallow = {}, + incompatible = {multishot = true}, + weight = 10, + description = S("Arrows passes through multiple objects."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{1, 50}, {11, 50}, {21, 50}, {31, 50}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +-- implemented in mcl_bows +mcl_enchanting.enchantments.power = { + name = S("Power"), + max_level = 5, + primary = {bow = true}, + secondary = {}, + disallow = {}, + incompatible = {}, + weight = 10, + description = S("Increases arrow damage."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{1, 16}, {11, 26}, {21, 36}, {31, 46}, {41, 56}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +-- implemented via minetest.calculate_knockback (together with the Knockback enchantment) and mcl_bows +mcl_enchanting.enchantments.punch = { + name = S("Punch"), + max_level = 2, + primary = {}, + secondary = {bow = true}, + disallow = {}, + incompatible = {}, + weight = 2, + description = S("Increases arrow knockback."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{12, 37}, {32, 57}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +-- requires missing MineClone2 feature +mcl_enchanting.enchantments.quick_charge = { + name = S("Quick Charge"), + max_level = 3, + primary = {crossbow = true}, + secondary = {}, + disallow = {}, + incompatible = {}, + weight = 5, + description = S("Decreases crossbow charging time."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{12, 50}, {32, 50}, {52, 50}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +-- unimplemented +--[[mcl_enchanting.enchantments.respiration = { + name = S("Respiration"), + max_level = 3, + primary = {armor_head = true}, + secondary = {}, + disallow = {non_combat_armor = true}, + incompatible = {}, + weight = 2, + description = S("Extends underwater breathing time."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{10, 40}, {20, 50}, {30, 60}}, + inv_combat_tab = true, + inv_tool_tab = false, +}]]-- + +-- requires missing MineClone2 feature +--[[mcl_enchanting.enchantments.riptide = { + name = S("Riptide"), + max_level = 3, + primary = {trident = true}, + secondary = {}, + disallow = {}, + incompatible = {channeling = true, loyalty = true}, + weight = 2, + description = S("Trident launches player with itself when thrown. Works 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}}, + inv_combat_tab = true, + inv_tool_tab = false, +}]]-- + +-- implemented via on_enchant +mcl_enchanting.enchantments.sharpness = { + name = S("Sharpness"), + max_level = 5, + primary = {sword = true}, + secondary = {axe = true}, + disallow = {}, + incompatible = {bane_of_arthropods = true, smite = true}, + weight = 5, + description = S("Increases damage."), + 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}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +-- implemented in mcl_item_entity +mcl_enchanting.enchantments.silk_touch = { + name = S("Silk Touch"), + max_level = 1, + primary = {pickaxe = true, shovel = true, axe = true, hoe = true}, + secondary = {shears = true}, + disallow = {}, + incompatible = {fortune = true}, + weight = 1, + description = S("Mined blocks drop themselves."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{15, 61}}, + inv_combat_tab = false, + inv_tool_tab = true, +} + +-- implemented via on_enchant and additions in mobs_mc +mcl_enchanting.enchantments.smite = { + name = S("Smite"), + max_level = 5, + primary = {sword = true}, + secondary = {axe = true}, + disallow = {}, + incompatible = {bane_of_arthropods = true, sharpness = true}, + weight = 5, + description = S("Increases damage to undead mobs."), + 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}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +-- implemented in mcl_playerplus +mcl_enchanting.enchantments.soul_speed = { + name = S("Soul Speed"), + max_level = 3, + primary = {}, + secondary = {armor_feet = true}, + disallow = {non_combat_armor = true}, + incompatible = {frost_walker = true}, + weight = 2, + description = S("Increases walking speed on soul sand."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = true, + power_range_table = {{10, 25}, {20, 35}, {30, 45}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +-- requires missing MineClone2 feature +--[[mcl_enchanting.enchantments.sweeping_edge = { + name = S("Sweeping Edge"), + max_level = 3, + primary = {sword = true}, + secondary = {}, + disallow = {}, + incompatible = {}, + weight = 2, + description = S("Increases sweeping attack damage."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{5, 20}, {14, 29}, {23, 38}}, + inv_combat_tab = true, + inv_tool_tab = false, +}]]-- + +-- 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 +mcl_enchanting.enchantments.unbreaking = { + name = S("Unbreaking"), + max_level = 3, + primary = {armor_head = true, armor_torso = true, armor_legs = true, armor_feet = true, pickaxe = true, shovel = true, axe = true, hoe = true, sword = true, fishing_rod = true, bow = true}, + secondary = {tool = true}, + disallow = {non_combat_armor = true}, + incompatible = {}, + weight = 5, + description = S("Increases item durability."), + curse = false, + on_enchant = function(itemstack, level) + local name = itemstack:get_name() + if not minetest.registered_tools[name].tool_capabilities then + return + end + + local tool_capabilities = itemstack:get_tool_capabilities() + tool_capabilities.punch_attack_uses = tool_capabilities.punch_attack_uses * (1 + level) + itemstack:get_meta():set_tool_capabilities(tool_capabilities) + + -- Updating digging durability is handled by update_groupcaps + -- which is called from load_enchantments. + end, + requires_tool = true, + treasure = false, + power_range_table = {{5, 61}, {13, 71}, {21, 81}}, + inv_combat_tab = true, + inv_tool_tab = true, +} diff --git a/engine.lua b/engine.lua new file mode 100644 index 0000000..dd01d59 --- /dev/null +++ b/engine.lua @@ -0,0 +1,732 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local F = minetest.formspec_escape + +function mcl_enchanting.is_book(itemname) + return itemname == "mcl_books:book" or itemname == "mcl_enchanting:book_enchanted" or + itemname == "mcl_books:book_enchanted" +end + +function mcl_enchanting.get_enchantments(itemstack) + if not itemstack then + return {} + end + return minetest.deserialize(itemstack:get_meta():get_string("mcl_enchanting:enchantments")) or {} +end + +function mcl_enchanting.unload_enchantments(itemstack) + local itemdef = itemstack:get_definition() + local meta = itemstack:get_meta() + if itemdef.tool_capabilities then + meta:set_tool_capabilities(nil) + meta:set_string("groupcaps_hash", "") + end + if meta:get_string("name") == "" then + meta:set_string("description", "") + meta:set_string("groupcaps_hash", "") + end +end + +function mcl_enchanting.load_enchantments(itemstack, enchantments) + if not mcl_enchanting.is_book(itemstack:get_name()) then + mcl_enchanting.unload_enchantments(itemstack) + for enchantment, level in pairs(enchantments or mcl_enchanting.get_enchantments(itemstack)) do + local enchantment_def = mcl_enchanting.enchantments[enchantment] + if enchantment_def.on_enchant then + enchantment_def.on_enchant(itemstack, level) + end + end + mcl_enchanting.update_groupcaps(itemstack) + end + tt.reload_itemstack_description(itemstack) +end + +function mcl_enchanting.set_enchantments(itemstack, enchantments) + itemstack:get_meta():set_string("mcl_enchanting:enchantments", minetest.serialize(enchantments)) + mcl_enchanting.load_enchantments(itemstack) +end + +function mcl_enchanting.get_enchantment(itemstack, enchantment) + return mcl_enchanting.get_enchantments(itemstack)[enchantment] or 0 +end + +function mcl_enchanting.has_enchantment(itemstack, enchantment) + return mcl_enchanting.get_enchantment(itemstack, enchantment) > 0 +end + +function mcl_enchanting.get_enchantment_description(enchantment, level) + local enchantment_def = mcl_enchanting.enchantments[enchantment] + return enchantment_def.name .. + (enchantment_def.max_level == 1 and "" or " " .. mcl_util.to_roman(level)) +end + +function mcl_enchanting.get_colorized_enchantment_description(enchantment, level) + return minetest.colorize(mcl_enchanting.enchantments[enchantment].curse and mcl_colors.RED or mcl_colors.GRAY, + mcl_enchanting.get_enchantment_description(enchantment, level)) +end + +function mcl_enchanting.get_enchanted_itemstring(itemname) + local def = minetest.registered_items[itemname] + return def and def._mcl_enchanting_enchanted_tool +end + +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.not_enchantable_on_enchanting_table(itemname) + return mcl_enchanting.get_enchantability(itemname) == -1 +end + +function mcl_enchanting.is_enchantable(itemname) + return mcl_enchanting.get_enchantability(itemname) > 0 or + mcl_enchanting.not_enchantable_on_enchanting_table(itemname) +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 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 + end + for disallow in pairs(enchantment_def.disallow) do + if minetest.get_item_group(itemname, disallow) > 0 then + return false + end + end + for group in pairs(enchantment_def.primary) do + if minetest.get_item_group(itemname, group) > 0 then + return true, true + end + end + for group in pairs(enchantment_def.secondary) do + if minetest.get_item_group(itemname, group) > 0 then + return true, false + end + end + return false +end + +function mcl_enchanting.can_enchant(itemstack, enchantment, level) + local enchantment_def = mcl_enchanting.enchantments[enchantment] + if not enchantment_def then + return false, "enchantment invalid" + end + local itemname = itemstack:get_name() + if itemname == "" then + return false, "item missing" + end + local supported, primary = mcl_enchanting.item_supports_enchantment(itemname, enchantment) + if not supported then + return false, "item not supported" + end + if not level then + return false, "level invalid" + end + if level > enchantment_def.max_level then + return false, "level too high", enchantment_def.max_level + elseif level < 1 then + return false, "level too small", 1 + end + local item_enchantments = mcl_enchanting.get_enchantments(itemstack) + local enchantment_level = item_enchantments[enchantment] + if enchantment_level then + return false, "incompatible", mcl_enchanting.get_enchantment_description(enchantment, enchantment_level) + end + 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 + return false, "incompatible", + mcl_enchanting.get_enchantment_description(incompatible, incompatible_level) + end + end + end + return true, nil, nil, primary +end + +function mcl_enchanting.enchant(itemstack, enchantment, level) + mcl_enchanting.set_enchanted_itemstring(itemstack) + local enchantments = mcl_enchanting.get_enchantments(itemstack) + enchantments[enchantment] = level + mcl_enchanting.set_enchantments(itemstack, enchantments) + return itemstack +end + +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 not enchanted_itemname or + enchanted_itemname ~= mcl_enchanting.get_enchanted_itemstring(combine_name) and + not mcl_enchanting.is_book(combine_name) then + return false + end + local enchantments = mcl_enchanting.get_enchantments(itemstack) + local any_new_enchantment = false + for enchantment, combine_level in pairs(mcl_enchanting.get_enchantments(combine_with)) do + local enchantment_def = mcl_enchanting.enchantments[enchantment] + local enchantment_level = enchantments[enchantment] + if enchantment_level then -- The enchantment already exist in the provided item + if enchantment_level == combine_level then + enchantment_level = math.min(enchantment_level + 1, enchantment_def.max_level) + else + enchantment_level = math.max(enchantment_level, combine_level) + end + any_new_enchantment = any_new_enchantment or ( enchantment_level ~= enchantments[enchantment] ) + elseif mcl_enchanting.item_supports_enchantment(itemname, enchantment) then -- this is a new enchantement to try to add + local supported = true + for incompatible in pairs(enchantment_def.incompatible) do + if enchantments[incompatible] then + supported = false + break + end + end + if supported then + enchantment_level = combine_level + any_new_enchantment = true + end + end + if enchantment_level and enchantment_level > 0 then + enchantments[enchantment] = enchantment_level + end + end + if any_new_enchantment then + itemstack:set_name(enchanted_itemname) + mcl_enchanting.set_enchantments(itemstack, enchantments) + end + return any_new_enchantment +end + +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 + +-- Returns the after_use callback function to use when registering an enchanted +-- item. The after_use callback is used to update the tool_capabilities of +-- efficiency enchanted tools with outdated digging times. +-- +-- It does this by calling apply_efficiency to reapply the efficiency +-- enchantment. That function is written to use hash values to only update the +-- tool if neccessary. +-- +-- This is neccessary for digging times of tools to be in sync when MineClone2 +-- or mods add new hardness values. +local function get_after_use_callback(itemdef) + if itemdef.after_use then + -- If the tool already has an after_use, make sure to call that + -- one too. + return function(itemstack, user, node, digparams) + itemdef.after_use(itemstack, user, node, digparams) + mcl_enchanting.update_groupcaps(itemstack) + end + end + + -- If the tool does not have after_use, add wear to the tool as if no + -- after_use was registered. + return function(itemstack, user, node, digparams) + if not minetest.is_creative_enabled(user:get_player_name()) then + itemstack:add_wear(digparams.wear) + end + + --local enchantments = mcl_enchanting.get_enchantments(itemstack) + mcl_enchanting.update_groupcaps(itemstack) + end +end + +function mcl_enchanting.initialize() + local register_tool_list = {} + local register_item_list = {} + for itemname, itemdef in pairs(minetest.registered_items) do + if mcl_enchanting.can_enchant_freshly(itemname) and not mcl_enchanting.is_book(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 + new_def.groups.not_in_creative_inventory = 1 + new_def.groups.not_in_craft_guide = 1 + new_def.groups.enchanted = 1 + + if new_def._mcl_armor_texture then + if type(new_def._mcl_armor_texture) == "string" then + new_def._mcl_armor_texture = new_def._mcl_armor_texture .. mcl_enchanting.overlay + end + end + + new_def._mcl_enchanting_enchanted_tool = new_name + new_def.after_use = get_after_use_callback(itemdef) + 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 + minetest.register_craftitem(new_name, new_def) + end + for new_name, new_def in pairs(register_tool_list) do + minetest.register_tool(new_name, new_def) + end +end + +function mcl_enchanting.random(pr, ...) + local r = pr and pr:next(...) or math.random(...) + + if pr and not ({ ... })[1] then + r = r / 32767 + end + + return r +end + +function mcl_enchanting.get_random_enchantment(itemstack, treasure, weighted, exclude, pr) + local possible = {} + + for enchantment, enchantment_def in pairs(mcl_enchanting.enchantments) do + local can_enchant, _, _, primary = mcl_enchanting.can_enchant(itemstack, enchantment, 1) + + if can_enchant and (primary or treasure) and (not exclude or table.indexof(exclude, enchantment) == -1) then + local weight = weighted and enchantment_def.weight or 1 + + for i = 1, weight do + table.insert(possible, enchantment) + end + end + end + + return #possible > 0 and possible[mcl_enchanting.random(pr, 1, #possible)] +end + +function mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, + ignore_already_enchanted, pr) + local itemname = itemstack:get_name() + + if (not mcl_enchanting.can_enchant_freshly(itemname) and not ignore_already_enchanted) or + mcl_enchanting.not_enchantable_on_enchanting_table(itemname) then + return + end + + itemstack = ItemStack(itemstack) + + local enchantability = minetest.get_item_group(itemname, "enchantability") + enchantability = 1 + mcl_enchanting.random(pr, 0, math.floor(enchantability / 4)) + + mcl_enchanting.random(pr, 0, math.floor(enchantability / 4)) + + enchantment_level = enchantment_level + enchantability + enchantment_level = enchantment_level + + enchantment_level * (mcl_enchanting.random(pr) + mcl_enchanting.random(pr) - 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 selected_enchantment = mcl_enchanting.get_random_enchantment(itemstack, treasure, true, nil, pr) + + if not selected_enchantment then + break + end + + local enchantment_def = mcl_enchanting.enchantments[selected_enchantment] + local power_range_table = enchantment_def.power_range_table + + local enchantment_power + + 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 + until not no_reduced_bonus_chance and mcl_enchanting.random(pr) >= (enchantment_level + 1) / 50 + + return enchantments, description +end + +function mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) + local enchantments + + repeat + enchantments = mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level, treasure, + no_reduced_bonus_chance, ignore_already_enchanted, pr) + until enchantments + + return enchantments +end + +function mcl_enchanting.enchant_randomly(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, + ignore_already_enchanted, pr) + local enchantments = mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) + + mcl_enchanting.set_enchanted_itemstring(itemstack) + mcl_enchanting.set_enchantments(itemstack, enchantments) + + return itemstack +end + +function mcl_enchanting.enchant_uniform_randomly(stack, exclude, pr) + local enchantment = mcl_enchanting.get_random_enchantment(stack, true, false, exclude, pr) + + if enchantment then + mcl_enchanting.enchant(stack, enchantment, + mcl_enchanting.random(pr, 1, mcl_enchanting.enchantments[enchantment].max_level)) + end + + return stack +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) + local itemname = itemstack:get_name() + if (not mcl_enchanting.can_enchant_freshly(itemname)) or mcl_enchanting.not_enchantable_on_enchanting_table(itemname) then + return { false, false, false } + end + 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 = table.concat({ + "formspec_version[4]", + "size[11.75,10.425]", + + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color) .. table_name) .. "]", + mcl_formspec.get_itemslot_bg_v4(1, 3.25, 1, 1), + "list[current_player;enchanting_item;1,3.25;1,1]", + mcl_formspec.get_itemslot_bg_v4(2.25, 3.25, 1, 1), + "image[2.25,3.25;1,1;mcl_enchanting_lapis_background.png]", + "list[current_player;enchanting_lapis;2.25,3.25;1,1]", + "image[4.125,0.56;7.25,4.1;mcl_enchanting_button_background.png]", + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color) .. S("Inventory")) .. "]", + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + + "listring[current_player;enchanting_item]", + "listring[current_player;main]", + "listring[current_player;enchanting]", + "listring[current_player;main]", + "listring[current_player;enchanting_lapis]", + "listring[current_player;main]", + }) + + local itemstack = inv:get_stack("enchanting_item", 1) + local player_levels = mcl_experience.get_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_core:lapis", 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[4.125," .. y .. "]" + .. + ( + slot and + "tooltip[button_" .. + i .. + ";" .. + C("#818181") .. + ((slot.description and F(slot.description)) or "") .. + " " .. + C("#FFFFFF") .. + " . . . ?\n\n" .. + ( + enough_levels and + C(enough_lapis and "#818181" or "#FC5454") .. + F(S("@1 Lapis Lazuli", i)) .. "\n" .. C("#818181") .. F(S("@1 Enchantment Levels", i)) or + C("#FC5454") .. F(S("Level requirement: @1", 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.25,1.3;button_" .. i .. ";]" + .. (slot and "image[0,0;1.3,1.3;mcl_enchanting_number_" .. i .. ending .. ".png]" or "") + .. (slot and "label[6.8,1;" .. C(can_enchant and "#80FF20" or "#407F10") .. slot.level_requirement .. "]" or "") + .. (slot and slot.glyphs or "") + .. "container_end[]" + y = y + 1.3 + end + formspec = formspec + .. + "image[" .. + (any_enchantment and 1.1 or 1.67) .. + ",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_core:lapis", 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_level(player) + if player_level < slot.level_requirement then + return + end + mcl_experience.set_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.show_enchanting_formspec(player) + awards.unlock(player:get_player_name(), "mcl:enchanter") + end +end + +function mcl_enchanting.initialize_player(player) + local inv = player:get_inventory() + inv:set_size("enchanting", 1) + inv:set_size("enchanting_item", 1) + inv:set_size("enchanting_lapis", 1) +end + +function mcl_enchanting.is_enchanting_inventory_action(action, inventory, inventory_info) + if inventory:get_location().type == "player" then + local enchanting_lists = mcl_enchanting.enchanting_lists + if action == "move" then + local is_from = table.indexof(enchanting_lists, inventory_info.from_list) ~= -1 + local is_to = table.indexof(enchanting_lists, inventory_info.to_list) ~= -1 + return is_from or is_to, is_to + elseif (action == "put" or action == "take") and table.indexof(enchanting_lists, inventory_info.listname) ~= -1 then + return true + end + else + return false + end +end + +function mcl_enchanting.allow_inventory_action(player, action, inventory, inventory_info) + local is_enchanting_action, do_limit = mcl_enchanting.is_enchanting_inventory_action(action, inventory, + inventory_info) + if is_enchanting_action and do_limit then + if action == "move" then + local listname = inventory_info.to_list + local stack = inventory:get_stack(inventory_info.from_list, inventory_info.from_index) + if stack:get_name() == "mcl_core:lapis" and listname ~= "enchanting_item" then + local count = stack:get_count() + local old_stack = inventory:get_stack("enchanting_lapis", 1) + if old_stack:get_name() ~= "" then + count = math.min(count, old_stack:get_free_space()) + end + return count + elseif inventory:get_stack("enchanting_item", 1):get_count() == 0 and listname ~= "enchanting_lapis" then + return 1 + else + return 0 + end + else + return 0 + end + end +end + +function mcl_enchanting.on_inventory_action(player, action, inventory, inventory_info) + if mcl_enchanting.is_enchanting_inventory_action(action, inventory, inventory_info) then + if action == "move" and inventory_info.to_list == "enchanting" then + local stack = inventory:get_stack("enchanting", 1) + local result_list + if stack:get_name() == "mcl_core:lapis" then + result_list = "enchanting_lapis" + stack:add_item(inventory:get_stack("enchanting_lapis", 1)) + else + result_list = "enchanting_item" + end + inventory:set_stack(result_list, 1, stack) + inventory:set_stack("enchanting", 1, nil) + end + mcl_enchanting.show_enchanting_formspec(player) + end +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, 0, + mcl_enchanting.book_animation_loop[anim] or false) + 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.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 diff --git a/groupcaps.lua b/groupcaps.lua new file mode 100644 index 0000000..2a83727 --- /dev/null +++ b/groupcaps.lua @@ -0,0 +1,72 @@ +local groupcaps_cache = {} + +-- Compute a hash value. +function compute_hash(value) + return string.sub(minetest.sha1(minetest.serialize(value)), 1, 8) +end + +-- Get the groupcaps and hash for an enchanted tool. If this function is called +-- repeatedly with the same values it will return data from a cache. +-- +-- Parameters: +-- toolname - Name of the tool +-- level - The efficiency level of the tool +-- +-- Returns a table with the following two fields: +-- values - The groupcaps table +-- hash - The hash of the groupcaps table +local function get_efficiency_groupcaps(toolname, level) + local toolcache = groupcaps_cache[toolname] + local level = level + + if not toolcache then + toolcache = {} + groupcaps_cache[toolname] = toolcache + end + + local levelcache = toolcache[level] + if not levelcache then + levelcache = {} + levelcache.values = mcl_autogroup.get_groupcaps(toolname, level) + levelcache.hash = compute_hash(levelcache.values) + toolcache[level] = levelcache + end + + return levelcache +end + +-- Update groupcaps of an enchanted tool. This function will be called +-- repeatedly to make sure the digging times stored in groupcaps stays in sync +-- when the digging times of nodes can change. +-- +-- To make it more efficient it will first check a hash value to determine if +-- the tool needs to be updated. +function mcl_enchanting.update_groupcaps(itemstack) + local name = itemstack:get_name() + if not minetest.registered_tools[name] or not minetest.registered_tools[name].tool_capabilities then + return + end + + local efficiency = mcl_enchanting.get_enchantment(itemstack, "efficiency") + local unbreaking = mcl_enchanting.get_enchantment(itemstack, "unbreaking") + if unbreaking == 0 and efficiency == 0 then + return + end + + local groupcaps = get_efficiency_groupcaps(name, efficiency) + local hash = itemstack:get_meta():get_string("groupcaps_hash") + + if not hash or hash ~= groupcaps.hash then + local tool_capabilities = itemstack:get_tool_capabilities() + tool_capabilities.groupcaps = table.copy(groupcaps.values) + + -- Increase the number of uses depending on the unbreaking level + -- of the tool. + for group, capability in pairs(tool_capabilities.groupcaps) do + capability.uses = capability.uses * (1 + unbreaking) + end + + itemstack:get_meta():set_tool_capabilities(tool_capabilities) + itemstack:get_meta():set_string("groupcaps_hash", groupcaps.hash) + end +end diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..02ed1ee --- /dev/null +++ b/init.lua @@ -0,0 +1,367 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) +local S = minetest.get_translator(modname) + +local math = math +local vector = vector + +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_loop = {["open"] = true, ["close"] = true}, + book_animation_speed = 40, + enchantments = {}, + overlay = "^[colorize:purple:50", + --overlay = "^[invert:rgb^[multiply:#4df44d:50^[invert:rgb", + enchanting_lists = {"enchanting", "enchanting_item", "enchanting_lapis"}, + 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 .. "/groupcaps.lua") +dofile(modpath .. "/enchantments.lua") + +minetest.register_chatcommand("enchant", { + description = S("Enchant an item"), + params = S(" []"), + 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, S("Usage: /enchant []") + end + local target = minetest.get_player_by_name(target_name) + if not target then + return false, S("Player '@1' cannot be found.", target_name) + 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, S("There is no such enchantment '@1'.", enchantment) + elseif errorstring == "item missing" then + return false, S("The target doesn't hold an item.") + elseif errorstring == "item not supported" then + return false, S("The selected enchantment can't be added to the target item.") + elseif errorstring == "level invalid" then + return false, S("'@1' is not a valid number", level_str) + elseif errorstring == "level too high" then + return false, S("The number you have entered (@1) is too big, it must be at most @2.", level_str, extra_info) + elseif errorstring == "level too small" then + return false, S("The number you have entered (@1) is too small, it must be at least @2.", level_str, extra_info) + elseif errorstring == "incompatible" then + return false, S("@1 can't be combined with @2.", mcl_enchanting.get_enchantment_description(enchantment, level), extra_info) + end + else + target:set_wielded_item(mcl_enchanting.enchant(itemstack, enchantment, level)) + return true, S("Enchanting succeded.") + end + end +}) + +minetest.register_chatcommand("forceenchant", { + description = S("Forcefully enchant an item"), + params = S(" []"), + 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, S("Usage: /forceenchant []") + end + local target = minetest.get_player_by_name(target_name) + if not target then + return false, S("Player '@1' cannot be found.", target_name) + end + local itemstack = target:get_wielded_item() + local _, errorstring = mcl_enchanting.can_enchant(itemstack, enchantment, level) + if errorstring == "enchantment invalid" then + return false, S("There is no such enchantment '@1'.", enchantment) + elseif errorstring == "item missing" then + return false, S("The target doesn't hold an item.") + elseif errorstring == "item not supported" and not mcl_enchanting.is_enchantable(itemstack:get_name()) then + return false, S("The target item is not enchantable.") + elseif errorstring == "level invalid" then + return false, S("'@1' is not a valid number.", level_str) + else + target:set_wielded_item(mcl_enchanting.enchant(itemstack, enchantment, level)) + return true, S("Enchanting succeded.") + end + end +}) + +minetest.register_craftitem("mcl_enchanting:book_enchanted", { + description = S("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_alias("mcl_books:book_enchanted", "mcl_enchanting:book_enchanted") + +local function spawn_book_entity(pos, respawn) + if respawn then + -- Check if we already have a book + local objs = minetest.get_objects_inside_radius(pos, 1) + for o=1, #objs do + local obj = objs[o] + local lua = obj:get_luaentity() + if lua and lua.name == "mcl_enchanting:book" then + if lua._table_pos and vector.equals(pos, lua._table_pos) then + return + end + end + end + end + local obj = minetest.add_entity(vector.add(pos, mcl_enchanting.book_offset), "mcl_enchanting:book") + if obj then + local lua = obj:get_luaentity() + if lua then + lua._table_pos = table.copy(pos) + end + end +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}, + pointable = false, + physical = false, + textures = {"mcl_enchanting_book_entity.png", "mcl_enchanting_book_entity.png", "mcl_enchanting_book_entity.png", "mcl_enchanting_book_entity.png", "mcl_enchanting_book_entity.png"}, + static_save = false, + }, + _player_near = false, + _table_pos = nil, + on_activate = function(self, staticdata) + self.object:set_armor_groups({immortal = 1}) + mcl_enchanting.set_book_animation(self, "close") + 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(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, +}) + +local rotate +if minetest.get_modpath("screwdriver") then + rotate = screwdriver.rotate_simple +end + +minetest.register_node("mcl_enchanting:table", { + description = S("Enchanting Table"), + _tt_help = S("Spend experience, and lapis to enchant various items."), + _doc_items_longdesc = S("Enchanting Tables will let you enchant armors, tools, weapons, and books with various abilities. But, at the cost of some experience, and lapis lazuli."), + _doc_items_usagehelp = + S("Rightclick the Enchanting Table to open the enchanting menu.").."\n".. + S("Place a tool, armor, weapon or book into the top left slot, and then place 1-3 Lapis Lazuli in the slot to the right.").."\n".."\n".. + S("After placing your items in the slots, the enchanting options will be shown. Hover over the options to read what is available to you.").."\n".. + S("These options are randomized, and dependent on experience level; but the enchantment strength can be increased.").."\n".."\n".. + S("To increase the enchantment strength, place bookshelves around the enchanting table. However, you will need to keep 1 air node between the table, & the bookshelves to empower the enchanting table.").."\n".."\n".. + S("After finally selecting your enchantment; left-click on the selection, and you will see both the lapis lazuli and your experience levels consumed. And, an enchanted item left in its place."), + _doc_items_hidden = false, + 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"}, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, + 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, deco_block = 1}, + on_rotate = rotate, + 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 = minetest.get_meta(pos):get_string("name") + if table_name == "" then + table_name = S("Enchant") + end + local bookshelves = mcl_enchanting.get_bookshelves(pos) + player_meta:set_int("mcl_enchanting:num_bookshelves", math.min(15, #bookshelves)) + player_meta:set_string("mcl_enchanting:table_name", table_name) + mcl_enchanting.show_enchanting_formspec(clicker) + -- Respawn book entity just in case it got lost + spawn_book_entity(pos, true) + end, + on_construct = function(pos) + spawn_book_entity(pos) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local dname = (digger and digger:get_player_name()) or "" + if minetest.is_creative_enabled(dname) then + return + end + 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 = function(pos) + local objs = minetest.get_objects_inside_radius(pos, 1) + for o=1, #objs do + local obj = objs[o] + local lua = obj:get_luaentity() + if lua and lua.name == "mcl_enchanting:book" then + if lua._table_pos and vector.equals(pos, lua._table_pos) then + obj:remove() + end + end + end + end, + 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({ + label = "Enchanting table bookshelf particles", + interval = 1, + chance = 1, + nodenames = "mcl_enchanting:table", + action = function(pos) + local playernames = {} + for _, obj in pairs(minetest.get_objects_inside_radius(pos, 15)) do + if obj:is_player() then + table.insert(playernames, obj:get_player_name()) + end + end + if #playernames < 1 then + return + end + local absolute, relative = mcl_enchanting.get_bookshelves(pos) + for i, ap in ipairs(absolute) do + if math.random(5) == 1 then + local rp = relative[i] + local t = math.random()+1 --time + local d = {x = rp.x, y=rp.y-0.7, z=rp.z} --distance + local v = {x = -math.random()*d.x, y = math.random(), z = -math.random()*d.z} --velocity + local a = {x = 2*(-v.x*t - d.x)/t/t, y = 2*(-v.y*t - d.y)/t/t, z = 2*(-v.z*t - d.z)/t/t} --acceleration + local s = math.random()+0.9 --size + t = t - 0.1 --slightly decrease time to avoid texture overlappings + local tx = "mcl_enchanting_glyph_" .. math.random(18) .. ".png" + for _, name in pairs(playernames) do + minetest.add_particle({ + pos = ap, + velocity = v, + acceleration = a, + expirationtime = t, + size = s, + texture = tx, + collisiondetection = false, + playername = name + }) + end + end + end + end +}) + +minetest.register_lbm({ + label = "(Re-)spawn book entity above enchanting table", + name = "mcl_enchanting:spawn_book_entity", + nodenames = {"mcl_enchanting:table"}, + run_at_every_load = true, + action = function(pos) + spawn_book_entity(pos, true) + 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) +minetest.register_allow_player_inventory_action(mcl_enchanting.allow_inventory_action) +minetest.register_on_player_inventory_action(mcl_enchanting.on_inventory_action) +tt.register_priority_snippet(mcl_enchanting.enchantments_snippet) diff --git a/locale/mcl_enchanting.de.tr b/locale/mcl_enchanting.de.tr new file mode 100644 index 0000000..ecc08b5 --- /dev/null +++ b/locale/mcl_enchanting.de.tr @@ -0,0 +1,100 @@ +# textdomain: mcl_enchanting +Aqua Affinity=Aquaaffinität +Increases underwater mining speed.=Erhöht Unterwassergrabegeschwindigkeit. +Bane of Arthropods=Schrecken der Gliederfüßler +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Erhöht Schaden und gibt Langsamkeit IV an Gliederfüßlern (Spinnen, Höhlenspinenn, Silberfischchen und Endermilben). +Blast Protection=Explosionsschutz +Reduces explosion damage and knockback.=Reduziert Explosionsschaden und -rückschlag. +Channeling=Kanalisierung +Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Kanalisiert einen Blitz zu einem Ziel. Funktioniert nur während Gewitterstürmen und solange kein undurchsichtiger Block im Weg ist. +Curse of Binding=Fluch der Bindung +Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.=Gegenstand kann nicht von den Rüstungsplätzen entfernt werden, außer beim Tod, Zerbrechen oder im Kreativmodus. +Curse of Vanishing=Fluch des Verschwindens +Item destroyed on death.=Gegenstand wird bei Tod zerstört. +Depth Strider=Tiefenstreicher +Increases underwater movement speed.=Erhöht Bewegungsgeschwindigkeit im Wasser. +Efficiency=Effizienz +Increases mining speed.=Erhöht Grabegeschwindigkeit. +Feather Falling=Federfall +Reduces fall damage.=Reduziert Fallschaden. +Fire Aspect=Feueraspekt +Sets target on fire.=Zündet das Ziel an. +Fire Protection=Feuerschutz +Reduces fire damage.=Reduziert Feuerschaden +Flame=Flamme +Arrows set target on fire.=Pfeile zünden Ziel an. +Fortune=Glück +Increases certain block drops.=Erhöht bestimmte Blockabwürfe. +Frost Walker=Frostläufer +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=Verwandelt Wasser unter dem Spieler zu brüchigem Eis und verhindert Schaden von Magmablöcken. +Impaling=Aufspießen +Trident deals additional damage to ocean mobs.=Dreizack richtet Zusatzschaden an Ozeanmobs an. +Infinity=Unendlichkeit +Shooting consumes no regular arrows.=Schüsse verbrauchen keine regulären Pfeile. +Knockback=Rückschlag +Increases knockback.=Verstärkt Rückschlag. +Looting=Plünderer +Increases mob loot.=Erhöht Abwürfe von Mobs. +Loyalty=Loyalität +Trident returns after being thrown. Higher levels reduce return time.=Dreizack kehrt nach Wurf zurück. Höhere Stufen reduzieren die Rückkehrzeit. +Luck of the Sea=Glück des Meeres +Increases rate of good loot (enchanting books, etc.)=Erhöht die Rate von guten Abwürfen (verzauberte Bücher, usw.) +Lure=Köder +Decreases time until rod catches something.=Reduziert die Zeit, bis die Angel etwas fängt. +Mending=Ausbessern +Repair the item while gaining XP orbs.=Gegenstand reparieren, während man Erfahrungskugeln erhält. +Multishot=Mehrfachschuss +Shoot 3 arrows at the cost of one.=3 Pfeile zum Preis von 1 schießen. +Piercing=Durchbohren +Arrows passes through multiple objects.=Pfeile durchdringen mehrere Objekte. +Power=Stärke +Increases arrow damage.=Erhöht Pfeilschaden. +Projectile Protection=Projektilprojektion +Reduces projectile damage.=Reduziert Projektilschaden. +Protection=Schutz +Reduces most types of damage by 4% for each level.=Reduziert die meisten Schadensarten um 4% je Stufe. +Punch=Schlag +Increases arrow knockback.=Erhöht Pfeilrückschlag. +Quick Charge=Schnellladen +Decreases crossbow charging time.=Reduziert Armbrustladezeit. +Respiration=Atmung +Extends underwater breathing time.=Erhöht Unterwasseratemzeit. +Riptide=Strömung +Trident launches player with itself when thrown. Works only in water or rain.=Dreizack wirft den Spieler mit. Funktioniert nur im Wasser oder Regen. +Sharpness=Schärfe +Increases damage.=Erhöht Schaden. +Silk Touch=Sorgfalt +Mined blocks drop themselves.=Abgebaute Blöcke werfen sich selbst ab. +Smite=Qual +Increases damage to undead mobs.=Erhöht Schaden für untote Mobs. +Soul Speed=Schnelle Seele +Increases walking speed on soul sand.=Erhöht Gehgeschwindigkeit auf Seelensand. +Sweeping Edge=Schwungklinge +Increases sweeping attack damage.=Erhöht Schwungangriffsschaden. +Thorns=Dornen +Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.=Reflektiert etwas des Schadens beim Erleiden eines Treffers, auf Kosten der Haltbarkeit. +Unbreaking=Haltbarkeit +Increases item durability.=Erhöht Haltbarkeit des Gegenstands. +Inventory=Inventar +@1 Lapis Lazuli=@1 Lapislazuli +@1 Enchantment Levels=@1 Verzauberungsstufen +Level requirement: @1=Level benötigt: @1 +Enchant an item=Gegenstand verzaubern + []= [] +Usage: /enchant []=Verwendung: /enchant [] +Player '@1' cannot be found.=Spieler „@1“ kann nicht gefunden werden. +There is no such enchantment '@1'.=Es gibt keine Verzauberung namens „@1“. +The target doesn't hold an item.=Das Ziel hält keinen Gegenstand. +The selected enchantment can't be added to the target item.=Die gewählte Verzauberug kann nicht dem Ziel gegeben werden. +'@1' is not a valid number='@1' ist keine gültige Zahl +The number you have entered (@1) is too big, it must be at most @2.=Die eingegebene Zahl (@1) ist zu groß, maximal @1 erlaubt. +The number you have entered (@1) is too small, it must be at least @2.=Die eingegebene Zahl (@1) ist zu klein, minimal @1 erlaubt. +@1 can't be combined with @2.=@1 kann nicht mit @2 kombiniert werden. +Enchanting succeded.=Verzauberug erfolgreich. +Forcefully enchant an item=Einen Gegenstand zwangsweise verzaubern +Usage: /forceenchant []=Verwendung: /forceenchant [] +The target item is not enchantable.=Der Zielgegenstand ist nicht verzauberbar. +'@1' is not a valid number.='@1' ist keine gültige Zahl. +Enchanted Book=Verzaubertes Buch +Enchanting Table=Zaubertisch +Enchant=Verzaubern diff --git a/locale/mcl_enchanting.es.tr b/locale/mcl_enchanting.es.tr new file mode 100644 index 0000000..a977e8f --- /dev/null +++ b/locale/mcl_enchanting.es.tr @@ -0,0 +1,123 @@ +# textdomain: mcl_enchanting + + +### enchantments.lua ### + +Arrows passes through multiple objects.=Las flechas atraviesan multiples enemigos. +Arrows set target on fire.=Las flechas prenderan los enemigos. +Bane of Arthropods=Perdición de los Artrópodos +Channeling=Conductividad + +Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Canaliza los rayos de una tormenta hacia el enemigo. + +Curse of Vanishing=Maldición de Desaparición +Decreases crossbow charging time.=Disminuye el tiempo de carga de las ballestas. +Decreases time until rod catches something.=Disminuye el tiempo que tardan en picar los cebos en la pesca. +Depth Strider=Agilidad acuática +Efficiency=Eficiencia +Extends underwater breathing time.=Aumenta el tiempo de mantener la respiración. +Fire Aspect=Aspecto Ígneo +Flame=Fuego +Fortune=Fortuna +Frost Walker=Paso Helado +Impaling=Empalamiento +Increases arrow damage.=Incrementa el daño de las flechas. +Increases arrow knockback.=Incrementa el empuje de las flechas. +Increases certain block drops.=Incrementa la cantidad de objetos que sueltan los bloques. + +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Incrementa el daño y ralentiza a los artrópodos. (arañas, lepismas, endermitas, etc) + +Increases damage to undead mobs.=Incrementa el daño contra no-muertos. +Increases damage.=Incrementa el daño. +Increases item durability.=Incrementa la durabilidad de una herramienta. +Increases knockback.=Incrementa el empuje. +Increases mining speed.=Incrementa la velocidad de picado. +Increases mob loot.=Incrementa el botín de los enemigos. +Increases rate of good loot (enchanting books, etc.)=Incrementa la probabilidad de encontrar tesoros. +Increases sweeping attack damage.=Incrementa el daño de efecto area. +Increases underwater movement speed.=Incrementa la velocidad de nado bajo el agua. +Increases walking speed on soul sand.=Incrementa la velocidad al caminar sobre arena de Almas. +Infinity=Infinidad +Item destroyed on death.=El objeto se destruye tras tu muerte. +Knockback=Empuje +Looting=Botín +Loyalty=Lealtad +Luck of the Sea=Suerte Marina +Lure=Atracción +Mending=Reparación +Mined blocks drop themselves.=Los bloques se minarán enteros. +Multishot=Multidisparo +Piercing=Perforación +Power=Poder +Punch=Retroceso +Quick Charge=Carga Rápida +Repair the item while gaining XP orbs.=Repara los objetos portados al recibir orbes de experiencia. +Respiration=Respiración +Riptide=Propulsión acuática +Sets target on fire.=Incencia al enemigo. +Sharpness=Filo +Shoot 3 arrows at the cost of one.=Dispara 3 flechas al precio de una. +Shooting consumes no regular arrows.=No se consumiran las flechas lanzadas. +Silk Touch=Toque de Seda +Smite=Golpeo +Soul Speed=Velocidad de Almas +Sweeping Edge=Filo Arrasador +Trident deals additional damage to ocean mobs.=Incrementa el daño del tridente sobre criaturas acuáticas. + +Trident launches player with itself when thrown. Works only in water or rain.=El tridente impulsa al portador dentro del agua o bajo la lluvia. + +Trident returns after being thrown. Higher levels reduce return time.=El tridente regresa al portador tras lanzarlo. + +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=Congela el agua bajo tus pies y evita el daño de los bloques de magma. + +Unbreaking=Irrompibilidad + +### engine.lua ### + +@1 Enchantment Levels=Nivel de encantamiento: @1 +@1 Lapis Lazuli=@1 Lapis Lázuli +Inventory=Inventario +Level requirement: @1=Nivel requerido: @1 + +### init.lua ### + +'@1' is not a valid number='@1' no es un número válido +'@1' is not a valid number.='@1' no es un número válido + []= [] +@1 can't be combined with @2.=@1 no se puede combinar con @2 + +After finally selecting your enchantment; left-click on the selection, and you will see both the lapis lazuli and your experience levels consumed. And, an enchanted item left in its place.=Despues elige tu encantamiento, los niveles de experiencia y el lapis lázuli seran consumidos y el encantamiento aplicado al objeto. + +After placing your items in the slots, the enchanting options will be shown. Hover over the options to read what is available to you.=Coloca el objeto en su ranura yse mostraran los encantamientos a elegir. + +Enchant=Encantamiento +Enchant an item=Encantar objeto +Enchanted Book=Libro Encantado +Enchanting Table=Mesa de Encantamientos + +Enchanting Tables will let you enchant armors, tools, weapons, and books with various abilities. But, at the cost of some experience, and lapis lazuli.=La mesa de Encantamientos dara a tus herramientas, armas o armadura algunas habilidades magicas. Pero a coste de algo de experiencia y lapis lázuli. + +Enchanting succeded.=Encantado correctamente. +Forcefully enchant an item=Encantar objeto a la fuerza. + +Place a tool, armor, weapon or book into the top left slot, and then place 1-3 Lapis Lazuli in the slot to the right.=Coloca una herramienta, arma, armadura o libro sobre la ranura izquierda, coloca de 1 a 3 Lapis lázulis en la ranura derecha. + +Player '@1' cannot be found.=Jugador @1 no encontrado. +Rightclick the Enchanting Table to open the enchanting menu.=Clic derecho sobre la mesa de encantamientos para abrir la interfaz. +Spend experience, and lapis to enchant various items.=Experiencia y Lapis para encantar varios objetos. + +The number you have entered (@1) is too big, it must be at most @2.=@1 es muy grande, debe ser menor que @2 + +The number you have entered (@1) is too small, it must be at least @2.=@1 es muy pequeño, debe ser mayor a @2 + +The selected enchantment can't be added to the target item.=El encantamiento seleccionado no puede añadirse a ese objeto. +The target doesn't hold an item.=El jugador no sujeta un objeto. +The target item is not enchantable.=El objeto del jugador no se puede encantar. +There is no such enchantment '@1'.=@1 no es un encantamiento. + +These options are randomized, and dependent on experience level; but the enchantment strength can be increased.=Las opciones seran aleatorias dependiendo del nivel de experiencia, los niveles de encantamiento pueden ser aumentados. + +To increase the enchantment strength, place bookshelves around the enchanting table. However, you will need to keep 1 air node between the table, & the bookshelves to empower the enchanting table.=Para aumentar los niveles de encantamientos, coloca librerias alrededor y cerca de la mesa de encantamientos. + +Usage: /enchant []=Usa: /enchant [] +Usage: /forceenchant []=Usa /forceenchant [] diff --git a/locale/mcl_enchanting.fr.tr b/locale/mcl_enchanting.fr.tr new file mode 100644 index 0000000..23cf257 --- /dev/null +++ b/locale/mcl_enchanting.fr.tr @@ -0,0 +1,144 @@ +# textdomain: mcl_enchanting + + +### enchantments.lua ### + +Arrows passes through multiple objects.=Les flèches traversent plusieurs objets. +Arrows set target on fire.=Les flèches mettent le feu à la cible. +Bane of Arthropods=Fléau des arthropodes +Channeling=Canalisation + +Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Canalise un éclair vers une cible. Fonctionne uniquement pendant les orages et si la cible n'est pas obstruée par des blocs opaques. + +Curse of Vanishing=Malédiction de disparition +Decreases crossbow charging time.=Diminue le temps de chargement de l'arbalète. +Decreases time until rod catches something.=Diminue le temps jusqu'à ce qu'un poisson ne morde à l'hameçon. +Depth Strider=Agilité aquatique +Efficiency=Efficacité +Extends underwater breathing time.=Prolonge le temps de respiration sous l'eau. +Fire Aspect=Aura de feu +Flame=Flamme +Fortune=Fortune +Frost Walker=Semelles givrantes +Impaling=Empalement +Increases arrow damage.=Augmente les dégâts des flèches. +Increases arrow knockback.=Augmente le recul de la flèche. +Increases certain block drops.=Multiplie les objets droppés + +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Augmente les dégâts et applique la lenteur IV aux mobs arthropodes (araignées, araignées des cavernes, poissons d'argent et endermites). + +Increases damage to undead mobs.=Augmente les dégâts infligés aux monstres morts-vivants. +Increases damage.=Augmente les dégâts. +Increases item durability.=Augmente la durabilité des objets. +Increases knockback.=Augmente le recul. +Increases mining speed.=Augmente la vitesse de minage. +Increases mob loot.=Augmente le butin des mobs. +Increases rate of good loot (enchanting books, etc.)=Augmente le taux de bon butin (livres enchanteurs, etc.) +Increases sweeping attack damage.=Augmente les dégâts de l'épée +Increases underwater movement speed.=Augmente la vitesse de déplacement sous l'eau. +Increases walking speed on soul sand.=Augmente la vitesse de marche sur le sable des âmes. +Infinity=Infinité +Item destroyed on death.=Objet détruit à la mort. +Knockback=Recul +Looting=Butin +Loyalty=Loyauté +Luck of the Sea=Chance de la mer +Lure=Appât +Mending=Raccommodage +Mined blocks drop themselves.=Vous obtenez les blocs minés en minant. +Multishot=Tir multiple +Piercing=Perforation +Power=Puissance +Punch=Frappe +Quick Charge=Charge rapide +Repair the item while gaining XP orbs.=Réparez l'objet tout en gagnant des points d'XP. +Respiration=Apnée +Riptide=Impulsion +Sets target on fire.=Enflamme la cible. +Sharpness=Tranchant +Shoot 3 arrows at the cost of one.=Tirez 3 flèches pour le prix d'une. +Shooting consumes no regular arrows.=Le tir ne consomme pas de flèches standard. +Silk Touch=Toucher de soie +Smite=Châtiment +Soul Speed=Agilité des âmes +Sweeping Edge=Affilage +Trident deals additional damage to ocean mobs.=Le trident inflige des dégâts supplémentaires aux animaux océaniques. + +Trident launches player with itself when thrown. Works only in water or rain.=Le trident emporte le joueur avec lui-même lorsqu'il est lancé. Fonctionne uniquement sous l'eau ou sous la pluie. + +Trident returns after being thrown. Higher levels reduce return time.=Le trident revient après avoir été jeté. Des niveaux plus élevés réduisent le temps de retour. + +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=Transforme l'eau sous le joueur en glace givrée et empêche les dégâts causés par les blocs de magma. + +Unbreaking=Solidité + +### engine.lua ### + +@1 Enchantment Levels=@1 Niveaux d'enchantement +@1 Lapis Lazuli=@1 Lapis Lazuli +Inventory=Inventaire +Level requirement: @1=Niveau requis : @1 + +### init.lua ### + +'@1' is not a valid number='@1' n'est pas un nombre valide +'@1' is not a valid number.='@1' n'est pas un nombre valide. + []= [] +@1 can't be combined with @2.=@1 ne peut pas être combiné avec @2. + +After finally selecting your enchantment; left-click on the selection, and you will see both the lapis lazuli and your experience levels consumed. And, an enchanted item left in its place.=Après avoir finalement sélectionné un enchantement ; cliquer gauche la sélection, et vous verrez à la fois les lapis-lazuli et vos niveaux d'expérience consommés. Un objet enchanté est laissé à leur place. + +After placing your items in the slots, the enchanting options will be shown. Hover over the options to read what is available to you.=Après avoir placé vos objets dans les emplacements, les options d'enchantement seront montrées. Passer au-dessus des options pour lire ce qui est disponible. + +Enchant=Enchantement +Enchant an item=Enchanter un objet +Enchanted Book=Livre enchanté +Enchanting Table=Table d'enchantement + +Enchanting Tables will let you enchant armors, tools, weapons, and books with various abilities. But, at the cost of some experience, and lapis lazuli.=La table d'enchantement vous permet d'enchanter des armures, des outils, des armes et des livres avec diverses propriétés. Mais cela coûte de l'expérience et des lapis-lazuli. + +Enchanting succeded.=L'enchantement a réussi. +Forcefully enchant an item=Enchantement forcé d'un objet + +Place a tool, armor, weapon or book into the top left slot, and then place 1-3 Lapis Lazuli in the slot to the right.=Placer un outil, armure, arme ou livre dans l'emplacement en haut à gauche, puis 1-3 Lapis-Lazuli dans l'emplacement à droite. + +Player '@1' cannot be found.=Le joueur '@1' est introuvable. +Rightclick the Enchanting Table to open the enchanting menu.=Cliquer droit la table d'enchantement pour ouvrir le menu d'enchantement. +Spend experience, and lapis to enchant various items.=Dépenser de l'expérience, et des lapis pour enchanter divers objets. + +The number you have entered (@1) is too big, it must be at most @2.=Le nombre que vous avez entré (@1) est trop grand, il doit être au plus de @2. + +The number you have entered (@1) is too small, it must be at least @2.=Le nombre que vous avez entré (@1) est trop petit, il doit être au moins de @2. + +The selected enchantment can't be added to the target item.=L'enchantement sélectionné ne peut pas être ajouté à la cible. +The target doesn't hold an item.=La cible ne contient aucun élément. +The target item is not enchantable.=L'objet cible n'est pas enchantable. +There is no such enchantment '@1'.=L'enchantement '@1' n'existe pas. + +These options are randomized, and dependent on experience level; but the enchantment strength can be increased.=Ces options sont aléatoires et dépendent du niveau d'expérience ; mais la force d'enchantement peut être augmentée. + +To increase the enchantment strength, place bookshelves around the enchanting table. However, you will need to keep 1 air node between the table, & the bookshelves to empower the enchanting table.=Pour augmenter la force d'enchantement, placer des bibliothèques autour de la table d'enchantement. Cependant, vous devrez garder au moins un bloc d'air entre la table et les bibliothèques pour alimenter la table d'enchantement. + +Usage: /enchant []=Usage: /enchant [] +Usage: /forceenchant []=Usage: /forceenchant [] + + +##### not used anymore ##### + +# textdomain: mcl_enchanting +Aqua Affinity=Affinité aquatique +Increases underwater mining speed.=Augmente la vitesse de minage sous-marine. +Blast Protection=Protection contre les explosions +Reduces explosion damage and knockback.=Réduit les dégâts d'explosion et de recul. +Curse of Binding=Malédiction du lien éternel +Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.=L'objet ne peut pas être retiré des emplacements d'armure sauf en cas de mort, de rupture ou en mode créatif. +Feather Falling=Chute amortie +Reduces fall damage.=Reduit les dégats de chute. +Fire Protection=Protection contre le feu +Reduces fire damage.=Reduit les dégats de feu. +Projectile Protection=Protection contre les projectiles +Reduces projectile damage.=Réduit les dégâts causés par les projectiles. +Protection=Protection +Reduces most types of damage by 4% for each level.=éduit la plupart des types de dégâts de 4% pour chaque niveau. +Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.=Reflète une partie des dégâts subis lors de la frappe, au prix d'une réduction de la durabilité à chaque déclenchement. +Thorns=Épines diff --git a/locale/mcl_enchanting.ja.tr b/locale/mcl_enchanting.ja.tr new file mode 100644 index 0000000..1983ec4 --- /dev/null +++ b/locale/mcl_enchanting.ja.tr @@ -0,0 +1,144 @@ +# textdomain: mcl_enchanting + + +### enchantments.lua ### + +Arrows passes through multiple objects.=矢が複数のオブジェクトを貫通します。 +Arrows set target on fire.=矢がターゲットを燃やします。 +Bane of Arthropods=殺虫力 +Channeling=召雷 + +Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=ターゲットに向けて稲妻を落とします。雷雨の時、且つターゲットが不透明なブロックで遮られていない場合のみ有効です。 + +Curse of Vanishing=消滅の呪い +Decreases crossbow charging time.=クロスボウの装填時間が短くなります。 +Decreases time until rod catches something.=釣りで獲物のかかる間隔が短くなります。 +Depth Strider=水中移動 +Efficiency=効率化 +Extends underwater breathing time.=水中での呼吸時間を延長します。 +Fire Aspect=火属性 +Flame=フレイム +Fortune=幸運 +Frost Walker=氷結歩行 +Impaling=串刺し +Increases arrow damage.=矢のダメージが増加します。 +Increases arrow knockback.=矢のノックバックを強化します。 +Increases certain block drops.=特定のブロックのドロップが増加します。 + +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=虫系のMOB(クモ、洞窟グモ、シルバーフィッシュ、エンダーマイト)に対してダメージが増加し、鈍化IVを適用します。 + +Increases damage to undead mobs.=アンデッド系のMOBへのダメージが増加します。 +Increases damage.=ダメージが増加します。 +Increases item durability.=アイテムの耐久度が向上します。 +Increases knockback.=ノックバックを強化します。 +Increases mining speed.=採掘速度が増加します。 +Increases mob loot.=MOBの戦利品が増加します。 +Increases rate of good loot (enchanting books, etc.)=釣果の質が良くなります(エンチャントの本など)。 +Increases sweeping attack damage.=なぎ払い攻撃のダメージが増加します。 +Increases underwater movement speed.=水中での横移動速度が増加します。 +Increases walking speed on soul sand.=ソウルサンドとソウルソイルの上を歩く速度が増加します。 +Infinity=無限 +Item destroyed on death.=死亡時にアイテムが消滅します。 +Knockback=ノックバック +Looting=奪取 +Loyalty=忠誠 +Luck of the Sea=宝釣り +Lure=入れ食い +Mending=自己修復 +Mined blocks drop themselves.=採掘したブロックそのものをドロップするようになります。 +Multishot=拡散弾 +Piercing=貫通 +Power=パワー +Punch=衝撃 +Quick Charge=高速装填 +Repair the item while gaining XP orbs.=アイテムが経験値を得て自己を修復します。 +Respiration=水中呼吸 +Riptide=激流 +Sets target on fire.=ターゲットに火をつけます。 +Sharpness=鋭利 +Shoot 3 arrows at the cost of one.=1本分のコストで、3本の矢を同時に拡散発射します。 +Shooting consumes no regular arrows.=普通の矢は射ても消費しなくなります。 +Silk Touch=シルクタッチ +Smite=破邪 +Soul Speed=ソウルスピード +Sweeping Edge=スイープエッジ +Trident deals additional damage to ocean mobs.=トライデントは水生系のMOBに追加ダメージを与えます。 + +Trident launches player with itself when thrown. Works only in water or rain.=投擲したトライデントと共に、プレイヤーを突進させます。水中か雨天でのみ機能します。 + +Trident returns after being thrown. Higher levels reduce return time.=投擲したトライデントが手に戻ってきます。レベルが高いほど戻る時間が短縮されます。 + +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=プレイヤーの下の水を薄氷に変え、また、マグマブロックからのダメージを防ぎます。 + +Unbreaking=耐久力 + +### engine.lua ### + +@1 Enchantment Levels=@1 エンチャントレベル +@1 Lapis Lazuli=@1 ラピスラズリ +Inventory=インベントリ +Level requirement: @1=必要レベル:@1 + +### init.lua ### + +'@1' is not a valid number='@1'は有効ではない数字 +'@1' is not a valid number.='@1'は有効な数字ではありません。 + []=<プレイヤー> <エンチャント> [<レベル>] +@1 can't be combined with @2.=@1は@2と組み合わせられません。 + +After finally selecting your enchantment; left-click on the selection, and you will see both the lapis lazuli and your experience levels consumed. And, an enchanted item left in its place.=最終的にエンチャントを決めたら;選ぶ箇所を左クリックすると、ラピスラズリと経験値の両方が消費されているのがわかります。そしてエンチャントしたアイテムがその場に残されます。 + +After placing your items in the slots, the enchanting options will be shown. Hover over the options to read what is available to you.=アイテムをスロットに配置すると、エンチャント オプションが表示されます。オプションにカーソルを合わせると、利用可能なオプションが表示されます。 + +Enchant=エンチャント +Enchant an item=アイテムにエンチャントする +Enchanted Book=エンチャント本 +Enchanting Table=エンチャントテーブル + +Enchanting Tables will let you enchant armors, tools, weapons, and books with various abilities. But, at the cost of some experience, and lapis lazuli.=エンチャントテーブルでは、防具や道具、武器、本などに様々な能力をエンチャントできます。ただし多少の経験値や、ラピスラズリを費やすことになります。 + +Enchanting succeded.=エンチャントが成功しました。 +Forcefully enchant an item=アイテムに強制的にエンチャント + +Place a tool, armor, weapon or book into the top left slot, and then place 1-3 Lapis Lazuli in the slot to the right.=左上のスロットに道具、防具、武器、本を入れ、その右のスロットにラピスラズリ1~3個を入れます。 + +Player '@1' cannot be found.=プレイヤー'@1'が見つかりません。 +Rightclick the Enchanting Table to open the enchanting menu.=エンチャントテーブルを右クリックすると、エンチャント メニューが表示されます。 +Spend experience, and lapis to enchant various items.=経験値とラピスを消費して、様々なアイテムにエンチャントできます。 + +The number you have entered (@1) is too big, it must be at most @2.=入力した数値(@1)は大きすぎます、@2以下である必要があります。 + +The number you have entered (@1) is too small, it must be at least @2.=入力した数値(@1)は小さすぎます、@2以上である必要があります。 + +The selected enchantment can't be added to the target item.=選択したエンチャントは、対象アイテムに付加できません。 +The target doesn't hold an item.=対象がアイテムを保持していません。 +The target item is not enchantable.=対象アイテムは、エンチャント不可です。 +There is no such enchantment '@1'.='@1'というエンチャントはありません。 + +These options are randomized, and dependent on experience level; but the enchantment strength can be increased.=これらのオプションはランダム且つ経験値に依存します;しかし、エンチャントを強化できます。 + +To increase the enchantment strength, place bookshelves around the enchanting table. However, you will need to keep 1 air node between the table, & the bookshelves to empower the enchanting table.=エンチャントテーブルの周囲に本棚を置くと、エンチャントを強化できます。ただし、テーブルと本棚の間に空気ノードを1つ入れないと、エンチャントテーブルに力を与えられません。 + +Usage: /enchant []=使用方法:/enchant <プレイヤー> <エンチャント> [<レベル>] +Usage: /forceenchant []=使用方法:/forceenchant <プレイヤー> <エンチャント> [<レベル>] + + +##### not used anymore ##### + +# textdomain: mcl_enchanting +Aqua Affinity=水中採掘 +Increases underwater mining speed.=水中での採掘速度が向上します。 +Blast Protection=爆風耐性 +Reduces explosion damage and knockback.=爆発ダメージとノックバックを軽減します。 +Curse of Binding=束縛の呪い +Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.=次の場合を除き、防具スロットからアイテムを外せません;アイテムが破損/自身が死亡/クリエイティブモード中 +Feather Falling=落下耐性 +Reduces fall damage.=落下ダメージを軽減します。 +Fire Protection=炎上耐性 +Reduces fire damage.=火炎ダメージを軽減します(溶岩は対象外)。 +Projectile Protection=飛来物耐性 +Reduces projectile damage.=飛来物ダメージを軽減します。 +Protection=外傷耐性 +Reduces most types of damage by 4% for each level.=体の外からのダメージ全般を軽減します(レベル毎に+4%)。 +Thorns=イバラ +Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.=受けたダメージの一部を与え返せますが、その代わり耐久度が余計に削られます。 diff --git a/locale/mcl_enchanting.pl.tr b/locale/mcl_enchanting.pl.tr new file mode 100644 index 0000000..179702d --- /dev/null +++ b/locale/mcl_enchanting.pl.tr @@ -0,0 +1,100 @@ +# textdomain: mcl_enchanting +Aqua Affinity=Powinowactwo wodne +Increases underwater mining speed.=Przyspiesza wydobywanie pod wodą. +Bane of Arthropods=Zmora stawonogów +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Zwiększa obrażenia i aplikuje Spowolnienie IV stawonogom (pająkom, pająkom jaskiniowym, rybikom cukrowym i endermitom) +Blast Protection=Ochrona od wybuchów +Reduces explosion damage and knockback.=Zmniejsza obrażenia od wybuchów i odrzut. +Channeling=Przekierowanie +Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Przekierowuje błyskawicę w stronę celu. Działa tylko podczas burz jeśli cel nie jest zasłonięty przez nieprzezroczyste bloki. +Curse of Binding=Klątwa wiązania +Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.=Przedmiotu nie można zdjąć z miejsc na zbroję inaczej niż przez śmierć, zepsucie bądź w trybie kreatywnym. +Curse of Vanishing=Klątwa znikania +Item destroyed on death.=Przedmiot niszczony przy śmierci +Depth Strider=Głębinowy wędrowiec +Increases underwater movement speed.=Zwiększa prędkość poruszania pod wodą. +Efficiency=Wydajność +Increases mining speed.=Zwiększa prędkość wydobywania zasobów. +Feather Falling=Powolne opadanie +Reduces fall damage.=Zmniejsza obrażenia od upadku. +Fire Aspect=Zaklęty ogień +Sets target on fire.=Podpala cel. +Fire Protection=Ochrona przed ogniem +Reduces fire damage.=Zmniejsza obrażenia od ognia +Flame=Płomień +Arrows set target on fire.=Strzały podpalają cel. +Fortune=Fortuna +Increases certain block drops.=Zwiększa prawdopodobieństwo wypadnięcia przedmiotów z niektórych bloków. +Frost Walker=Mroźny piechur +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=Zamienia wodę pod graczem w oszroniony lód i pozwala uniknąć obrażeń od bloków magmy. +Impaling=Przebicie +Trident deals additional damage to ocean mobs.=Trójząb zadaje dodatkowe obrażenia podwodnym stworzeniom. +Infinity=Nieskończoność +Shooting consumes no regular arrows.=Strzelanie nie zużywa zwykłych strzał. +Knockback=Odrzut +Increases knockback.=Zwiększa odrzut. +Looting=Grabież +Increases mob loot.=Zwiększa liczbę przedmiotów wypadających z mobów. +Loyalty=Lojalność +Trident returns after being thrown. Higher levels reduce return time.=Trydent wraca do gracza po rzuceniu. Większy poziom zmniejsza czas powrotu. +Luck of the Sea=Morska fortuna +Increases rate of good loot (enchanting books, etc.)=Zwiększa szansę na wypadnięcie dobrych przedmiotów (zaklętych książek itp.) +Lure=Przynęta +Decreases time until rod catches something.=Zmniejsza czas po którym coś złapie się na wędkę +Mending=Naprawa +Repair the item while gaining XP orbs.=Naprawia przedmiot podczas podnoszenia kul doświadczenia. +Multishot=Wielostrzał +Shoot 3 arrows at the cost of one.=Wystrzel 3 strzały kosztem jednej. +Piercing=Przeszycie +Arrows passes through multiple objects.=Strzała przelatuje przez wiele obiektów. +Power=Moc +Increases arrow damage.=Zwiększa obrażenia od strzał. +Projectile Protection=Ochrona przed pociskami +Reduces projectile damage.=Zmniejsza obrażenia od pocisków. +Protection=Obrona +Reduces most types of damage by 4% for each level.=Zmniejsza obrażenia większości typów o 4% za każdy poziom. +Punch=Uderzenie +Increases arrow knockback.=Zwiększa odrzut strzał. +Quick Charge=Szybkie ładowanie +Decreases crossbow charging time.=Zmniejsza czas ładowania kuszy. +Respiration=Oddychanie +Extends underwater breathing time.=Zwiększa czas na który można wstrzymać oddech pod wodą. +Riptide=Torpeda +Trident launches player with itself when thrown. Works only in water or rain.=Trydent porywa gracza ze sobą podczas rzucania. Działa tylko w wodzie lub w deszczu. +Sharpness=Ostrość +Increases damage.=Zwiększa obrażenia. +Silk Touch=Jedwabny dotyk +Mined blocks drop themselves.=Z wydobywanych bloków wypadają one same. +Smite=Pogromca nieumarłych +Increases damage to undead mobs.=Zwiększa obrażenia zadawane nieumarłym mobom. +Soul Speed=Prędkość dusz +Increases walking speed on soul sand.=Zwiększa szybkość chodzenia po piasku dusz. +Sweeping Edge=Szerokie ostrze +Increases sweeping attack damage.=Zwiększa obrażenia przy ataku z zamachu. +Thorns=Ciernie +Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.=Odbija część zadanych obrażeń kosztem utraty wytrzymałości zbroi. +Unbreaking=Niezniszczalność +Increases item durability.=Zwiększa wytrzymałość przedmiotu. +Inventory=Ekwipunek +@1 Lapis Lazuli=@1 Lazurytów +@1 Enchantment Levels=@1 poziomów zaklęcia +Level requirement: @1=Wymagany poziom: @1 +Enchant an item=Zaczaruj przedmiot + []= [] +Usage: /enchant []=Użycie: /enchant [] +Player '@1' cannot be found.=Gracz '@1' nie został znaleziony. +There is no such enchantment '@1'.=Nie ma takiego zaklęcia '@1'. +The target doesn't hold an item.=Cel nie trzyma żadnego przedmiotu. +The selected enchantment can't be added to the target item.=Wybrane zaklęcie nie może zostać zaaplikowane do docelowego przedmiotu. +'@1' is not a valid number='@1' nie jest poprawną liczbą. +The number you have entered (@1) is too big, it must be at most @2.=Liczba którą wpisałaś (@1) jest zbyt duża, nie może być większa niż @2. +The number you have entered (@1) is too small, it must be at least @2.=Liczba którą wpisałaś (@1) jest zbyt mała, nie może być mniejsza niż @2. +@1 can't be combined with @2.=@1 nie może być połączone z @2. +Enchanting succeded.=Zaklinanie powiodło się. +Forcefully enchant an item=Bezwzględnie zaczaruj przedmiot. +Usage: /forceenchant []=Użycie: /forceenchant [] +The target item is not enchantable.=Docelowego przedmiotu nie można zaczarować. +'@1' is not a valid number.='@1' nie jest poprawną liczbą. +Enchanted Book=Zaklęta książka +Enchanting Table=Stół do zaklinania +Enchant=Zaczaruj diff --git a/locale/mcl_enchanting.pt_BR.tr b/locale/mcl_enchanting.pt_BR.tr new file mode 100644 index 0000000..f17678f --- /dev/null +++ b/locale/mcl_enchanting.pt_BR.tr @@ -0,0 +1,144 @@ +# textdomain: mcl_enchanting + + +### enchantments.lua ### + +Arrows passes through multiple objects.=Flechas atravessam múltiplos objetos. +Arrows set target on fire.=Flechas colocam fogo no alvo. +Bane of Arthropods=Ruína dos Artrópodes +Channeling=Condutividade + +Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Canaliza um relâmpago em direção ao alvo. Funciona apenas durante tempestades e se o alvo estiver desobistruido por blocos opacos. + +Curse of Vanishing=Maldição do Desaparecimento +Decreases crossbow charging time.=Diminui o tempo de recarga da besta. +Decreases time until rod catches something.=Diminui o tempo para a vara coletar alguma coisa. +Depth Strider=Passos Profundos +Efficiency=Eficiência +Extends underwater breathing time.=Extende o tempo de respiração em baixo da água. +Fire Aspect=Aspecto Flamejante +Flame=Chama +Fortune=Fortuna +Frost Walker=Passos Gelados +Impaling=Penetração +Increases arrow damage.=Aumenta o dano das flechas. +Increases arrow knockback.=Aumenta a repulsão das flechas. +Increases certain block drops.=Aumenta o drop de certos blocos. + +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Aumenta o dano e aplica Lentidão IV para mobs artrópodes (aranhas, aranhas de cavernas, traças e endermites). + +Increases damage to undead mobs.=Aumenta o dano para mobs mortos-vivos. +Increases damage.=Aumenta o dano +Increases item durability.=Aumenta a durabilidade do item. +Increases knockback.=Aumenta a repulsão. +Increases mining speed.=Aumenta a velocidade de mineração. +Increases mob loot.=Aumenta o saque de mobs. +Increases rate of good loot (enchanting books, etc.)=Aumenta a taxa de bons saques (livros encantados, etc.) +Increases sweeping attack damage.= +Increases underwater movement speed.=Aumenta a velocidade de movimento embaixo da água. +Increases walking speed on soul sand.=Aumenta a velocidade de caminhada na areia das almas. +Infinity=Infinidade +Item destroyed on death.=Item é destruído na morte. +Knockback=Repulsão +Looting=Saque +Loyalty=Lealdade +Luck of the Sea=Sorte do Mar +Lure=Isca +Mending=Remendo +Mined blocks drop themselves.=Blocos minerados dropam a si mesmos. +Multishot=Rajada +Piercing=Perfuração +Power=Força +Punch=Impacto +Quick Charge=Recarga Rápida +Repair the item while gaining XP orbs.=Repara o item enquanto ganha orbes de XP. +Respiration=Respiração +Riptide=Correnteza +Sets target on fire.=Coloca fogo no alvo. +Sharpness=Afiação +Shoot 3 arrows at the cost of one.=Atira 3 flechas ao custo de uma. +Shooting consumes no regular arrows.=Atirar não consome flechas normais. +Silk Touch=Toque Suave +Smite=Julgamento +Soul Speed=Velocidade das Almas +Sweeping Edge=Alcance +Trident deals additional damage to ocean mobs.=Tridente dá dano adicional em mobs oceanicos. + +Trident launches player with itself when thrown. Works only in water or rain.=Tridente lança o jogador junto de si mesmo quando lançado. + +Trident returns after being thrown. Higher levels reduce return time.=Tridente retorna depois de ser arremessado. Níveis altos reduzem o tempo de retorno. + +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=Transforma a água abaixo do jogador em gelo e previne o dano dos blocos de magma. + +Unbreaking=Inquebrável + +### engine.lua ### + +@1 Enchantment Levels=@1 Níveis de Encantamento +@1 Lapis Lazuli=@1 Lápis Lazuli +Inventory=Inventário +Level requirement: @1=Nível requerido: @1 + +### init.lua ### + +'@1' is not a valid number='@1' não é um número válido +'@1' is not a valid number.='@1' não é um número válido. + []= [] +@1 can't be combined with @2.=@1 não pode ser combinado com @2. + +After finally selecting your enchantment; left-click on the selection, and you will see both the lapis lazuli and your experience levels consumed. And, an enchanted item left in its place.=Depois de finalmente selecionar seu encantamento; clique com o botão esquerdo na seleção, e você irá ver ambos os lápis lazuli e seus níveis de experiência serem consumidos. E, um item encantado deixado em seu lugar. + +After placing your items in the slots, the enchanting options will be shown. Hover over the options to read what is available to you.=Depois de posicionar seus itens nos slots, as opções de encantamentos serão mostradas. Passe o mouse sobre as opções para ler o que está disponível para você. + +Enchant=Encantar +Enchant an item=Encantar um item +Enchanted Book=Livro Encantado +Enchanting Table=Mesa de Encantamento + +Enchanting Tables will let you enchant armors, tools, weapons, and books with various abilities. But, at the cost of some experience, and lapis lazuli.=A mesa de encantamentos permitem a você encantar armaduras, ferramentas, armas, e livros com várias habilidades. Mas, ao custo de alguma experiência, e lápis lazuli. + +Enchanting succeded.=Encantamento sucessido. +Forcefully enchant an item=Encantamento forçado em um item. + +Place a tool, armor, weapon or book into the top left slot, and then place 1-3 Lapis Lazuli in the slot to the right.=Posicione uma ferramenta, armadura, arma ou livro no slot superior esquerdo, e então posicione 1-3 lápis lazuli no slot da direita. + +Player '@1' cannot be found.=Jogador '@1' não pôde ser encontrado. +Rightclick the Enchanting Table to open the enchanting menu.=Clique com o botão direito na mesa de encantamentos para abrir o menu de encantamentos. +Spend experience, and lapis to enchant various items.=Invista experiência, e lápis para encantar vários itens. + +The number you have entered (@1) is too big, it must be at most @2.=O número que você inseriu (@1) é muito grande, deve ser no máximo @2. + +The number you have entered (@1) is too small, it must be at least @2.=O número que você inseriu (@1) é muito pequeno, deve ser no mínimo @2. + +The selected enchantment can't be added to the target item.=O encantamento selecionado não pode ser adicionado ao item alvo. +The target doesn't hold an item.=O alvo não está segurando um item. +The target item is not enchantable.=O item alvo não é encantável. +There is no such enchantment '@1'.=Não existe um encantamento '@1'. + +These options are randomized, and dependent on experience level; but the enchantment strength can be increased.=Essas opções são aleatorias, e dependentes do nível de experiência; mas a força do encantamento pode ser aumentado. + +To increase the enchantment strength, place bookshelves around the enchanting table. However, you will need to keep 1 air node between the table, & the bookshelves to empower the enchanting table.=Para aumentar a força do encantamento, posicione estantes de livros em volta da mesa de encantamentos. Porém, você precisará manter 1 bloco de ar entre a mesa e as estantes para potencializar a mesa de encantamentos. + +Usage: /enchant []=Uso: /enchant [] +Usage: /forceenchant []=Uso: /forceenchant [] + + +##### not used anymore ##### + +# textdomain: mcl_enchanting +Aqua Affinity=Afinidade Aquática +Increases underwater mining speed.=Aumenta a velocidade de mineração em baixo da água. +Blast Protection=Proteção Contra Explosões +Reduces explosion damage and knockback.=Reduz dano de explosão e repulsão. +Curse of Binding=Maldição do Ligamento +Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.=Item não pode ser removido dos slots de armadura exceto em caso de morte, quebra ou no Modo Criativo. +Feather Falling=Peso-Pena +Reduces fall damage.=Reduz o dano de queda. +Fire Protection=Proteção Contra Fogo +Reduces fire damage.=Reduz o dano do fogo. +Projectile Protection=Proteção Contra Projéteis +Reduces projectile damage.=Reduz danos de projéteis. +Protection=Proteção +Reduces most types of damage by 4% for each level.=Reduz a maioria dos tipos de danos em 4% para cada nível. +Thorns=Espinhos +Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.=Reflete parte do dano recebido quando acertado, ao custo de reduzir a durabilidade em cada processo. diff --git a/locale/mcl_enchanting.ru.tr b/locale/mcl_enchanting.ru.tr new file mode 100644 index 0000000..66d76b5 --- /dev/null +++ b/locale/mcl_enchanting.ru.tr @@ -0,0 +1,144 @@ +# textdomain: mcl_enchanting + + +### enchantments.lua ### + +Arrows passes through multiple objects.=Стрела пробивает насквозь несколько объектов. +Arrows set target on fire.=Стрелы поджигают цель. +Bane of Arthropods=Бич членистоногих +Channeling=Громовержец + +Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Бьёт молнией в цель. Работает только во время грозы, когда цель не защищена плотными блоками. + +Curse of Vanishing=Проклятье утраты +Decreases crossbow charging time.=Уменьшает время заряда снаряда. +Decreases time until rod catches something.=Уменьшает время ожидания клёва. +Depth Strider=Покоритель глубин +Efficiency=Эффективность +Extends underwater breathing time.=Увеличивает время дыхания под водой. +Fire Aspect=Заговор огня +Flame=Горящая стрела +Fortune=Удача +Frost Walker=Ледоход +Impaling=Пронзатель +Increases arrow damage.=Увеличивает урон от стрел. +Increases arrow knockback.=Увеличивает отбрасывание от стрелы. +Increases certain block drops.=Даёт шанс выпадения большего количества ресурсов из блоков. + +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Увеличивает урон и применяет Замедление IV к насекомым и членистоногим (паукам, пещерным паукам, чешуйницам и чешуйницам Края). + +Increases damage to undead mobs.=Дополнительный урон нежити. +Increases damage.=Увеличенный урон. +Increases item durability.=Увеличивает прочность предмета. +Increases knockback.=Увеличивает отдачу. +Increases mining speed.=Увеличивает скорость добычи. +Increases mob loot.=Увеличивает добычу от мобов. +Increases rate of good loot (enchanting books, etc.)=Увеличивает шанс поймать сокровище (зачарованные книги и т.п.) +Increases sweeping attack damage.=Увеличивает урон по мобам, стоящих рядом с целью. +Increases underwater movement speed.=Увеличивает скорость передвижения под водой. +Increases walking speed on soul sand.=Увеличивает скорость ходьбы по песку душ. +Infinity=Бесконечность +Item destroyed on death.=Предмет уничтожается при смерти. +Knockback=Отдача +Looting=Добыча +Loyalty=Верность +Luck of the Sea=Везучий рыбак +Lure=Приманка +Mending=Починка +Mined blocks drop themselves.=Добываемый блок выпадает сам, даже если из него должно выпадать что-то другое. +Multishot=Залп +Piercing=Бронебойность +Power=Сила +Punch=Отбрасывание +Quick Charge=Быстрая перезарядка +Repair the item while gaining XP orbs.=Предмет чинится при сборе сфер опыта. +Respiration=Подводное дыхание +Riptide=Тягун +Sets target on fire.=Поджигает цель. +Sharpness=Острота +Shoot 3 arrows at the cost of one.=Выстреливают три стрелы по стоимости одной. +Shooting consumes no regular arrows.=При стрельбе не расходуются обычные стрелы. +Silk Touch=Шёлковое касание +Smite=Небесная кара +Soul Speed=Скорость души +Sweeping Edge=Разящий клинок +Trident deals additional damage to ocean mobs.=Трезубец наносит дополнительный урон океаническим мобам. + +Trident launches player with itself when thrown. Works only in water or rain.=Трезубец тянет игрока за собой. Работает только в воде или под дождём. + +Trident returns after being thrown. Higher levels reduce return time.=Возвращает трезубец после броска. Более высокие уровни сокращают время возврата. + +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=Превращает воду под игроком в подмороженный лёд и предотвращает урон от магмовых блоков. + +Unbreaking=Прочность + +### engine.lua ### + +@1 Enchantment Levels=@1 уровень зачаровывания +@1 Lapis Lazuli=@1 лазурит(а) +Inventory=Инвентарь +Level requirement: @1=Требуемый уровень: @1 + +### init.lua ### + +'@1' is not a valid number='@1' не является допустимым числом +'@1' is not a valid number.='@1' не является допустимым числом. + []=<игрок> <зачарование> [<уровень>] +@1 can't be combined with @2.=@1 нельзя сочетать с @2. + +After finally selecting your enchantment; left-click on the selection, and you will see both the lapis lazuli and your experience levels consumed. And, an enchanted item left in its place.=Кликните на выбранное зачарование - ваш опыт и лазурит потратятся, и зачарованный предмет появится слева. + +After placing your items in the slots, the enchanting options will be shown. Hover over the options to read what is available to you.=Варианты зачарований будут показаны как только вы разместите предметы в слоты. Наведите, чтобы прочитать что вам доступно. + +Enchant=Зачаровать +Enchant an item=Зачаровать предмет +Enchanted Book=Зачарованная книга +Enchanting Table=Стол зачаровывания + +Enchanting Tables will let you enchant armors, tools, weapons, and books with various abilities. But, at the cost of some experience, and lapis lazuli.=Стол зачаровывания позволяет зачаровывать броню, инструменты, оружие и книги разными способностями. Но ценой опыта и лазурита. + +Enchanting succeded.=Зачарование выполнено. +Forcefully enchant an item=Принудительно зачаровать предмет + +Place a tool, armor, weapon or book into the top left slot, and then place 1-3 Lapis Lazuli in the slot to the right.=Поместите инстумент, броню, оружие или книгу в верхний левый слот, затем поместите 1-3 лазурита в правый слот. + +Player '@1' cannot be found.=Не удалось найти игрока '@1'. +Rightclick the Enchanting Table to open the enchanting menu.=Правый клик по столу зачаровывания, чтобы открыть меню зачаровывания. +Spend experience, and lapis to enchant various items.=Зачаровывает предметы за опыт и лазурит + +The number you have entered (@1) is too big, it must be at most @2.=Число, которое вы задали (@1), слишком велико, оно должно быть максимум @2. + +The number you have entered (@1) is too small, it must be at least @2.=Число, которое вы задали (@1), слишком мало, оно должно быть минимум @2. + +The selected enchantment can't be added to the target item.=Выбранное зачарование не может быть добавлено к целевому предмету. +The target doesn't hold an item.=Цель не держит предмета. +The target item is not enchantable.=Целевой предмет нельзя зачаровать. +There is no such enchantment '@1'.=Нет такого зачарования: '@1'. + +These options are randomized, and dependent on experience level; but the enchantment strength can be increased.=Эти опции случайны и зависят от уровня опыта; но зачарование может быть усилено. + +To increase the enchantment strength, place bookshelves around the enchanting table. However, you will need to keep 1 air node between the table, & the bookshelves to empower the enchanting table.=Чтобы усилить зачарование, поставьте книжные полки вокруг стола зачаровывания. Но вам нужно сохранять 1 блок пустого пространства между столом и полками. + +Usage: /enchant []=Использование: /enchant <игрок> <зачарование> [<уровень>] +Usage: /forceenchant []=Использование: /forceenchant <игрок> <зачарование> [<уровень>] + + +##### not used anymore ##### + +# textdomain: mcl_enchanting +Aqua Affinity= +Increases underwater mining speed.= +Blast Protection= +Reduces explosion damage and knockback.= +Curse of Binding= +Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.= +Feather Falling= +Reduces fall damage.= +Fire Protection= +Reduces fire damage.= +Projectile Protection= +Reduces projectile damage.= +Protection= +Reduces most types of damage by 4% for each level.= +Thorns= +Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.= diff --git a/locale/template.txt b/locale/template.txt new file mode 100644 index 0000000..2a0890d --- /dev/null +++ b/locale/template.txt @@ -0,0 +1,144 @@ +# textdomain: mcl_enchanting + + +### enchantments.lua ### + +Arrows passes through multiple objects.= +Arrows set target on fire.= +Bane of Arthropods= +Channeling= + +Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.= + +Curse of Vanishing= +Decreases crossbow charging time.= +Decreases time until rod catches something.= +Depth Strider= +Efficiency= +Extends underwater breathing time.= +Fire Aspect= +Flame= +Fortune= +Frost Walker= +Impaling= +Increases arrow damage.= +Increases arrow knockback.= +Increases certain block drops.= + +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).= + +Increases damage to undead mobs.= +Increases damage.= +Increases item durability.= +Increases knockback.= +Increases mining speed.= +Increases mob loot.= +Increases rate of good loot (enchanting books, etc.)= +Increases sweeping attack damage.= +Increases underwater movement speed.= +Increases walking speed on soul sand.= +Infinity= +Item destroyed on death.= +Knockback= +Looting= +Loyalty= +Luck of the Sea= +Lure= +Mending= +Mined blocks drop themselves.= +Multishot= +Piercing= +Power= +Punch= +Quick Charge= +Repair the item while gaining XP orbs.= +Respiration= +Riptide= +Sets target on fire.= +Sharpness= +Shoot 3 arrows at the cost of one.= +Shooting consumes no regular arrows.= +Silk Touch= +Smite= +Soul Speed= +Sweeping Edge= +Trident deals additional damage to ocean mobs.= + +Trident launches player with itself when thrown. Works only in water or rain.= + +Trident returns after being thrown. Higher levels reduce return time.= + +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.= + +Unbreaking= + +### engine.lua ### + +@1 Enchantment Levels= +@1 Lapis Lazuli= +Inventory= +Level requirement: @1= + +### init.lua ### + +'@1' is not a valid number= +'@1' is not a valid number.= + []= +@1 can't be combined with @2.= + +After finally selecting your enchantment; left-click on the selection, and you will see both the lapis lazuli and your experience levels consumed. And, an enchanted item left in its place.= + +After placing your items in the slots, the enchanting options will be shown. Hover over the options to read what is available to you.= + +Enchant= +Enchant an item= +Enchanted Book= +Enchanting Table= + +Enchanting Tables will let you enchant armors, tools, weapons, and books with various abilities. But, at the cost of some experience, and lapis lazuli.= + +Enchanting succeded.= +Forcefully enchant an item= + +Place a tool, armor, weapon or book into the top left slot, and then place 1-3 Lapis Lazuli in the slot to the right.= + +Player '@1' cannot be found.= +Rightclick the Enchanting Table to open the enchanting menu.= +Spend experience, and lapis to enchant various items.= + +The number you have entered (@1) is too big, it must be at most @2.= + +The number you have entered (@1) is too small, it must be at least @2.= + +The selected enchantment can't be added to the target item.= +The target doesn't hold an item.= +The target item is not enchantable.= +There is no such enchantment '@1'.= + +These options are randomized, and dependent on experience level; but the enchantment strength can be increased.= + +To increase the enchantment strength, place bookshelves around the enchanting table. However, you will need to keep 1 air node between the table, & the bookshelves to empower the enchanting table.= + +Usage: /enchant []= +Usage: /forceenchant []= + + +##### not used anymore ##### + +# textdomain: mcl_enchanting +Aqua Affinity= +Increases underwater mining speed.= +Blast Protection= +Reduces explosion damage and knockback.= +Curse of Binding= +Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.= +Feather Falling= +Reduces fall damage.= +Fire Protection= +Reduces fire damage.= +Projectile Protection= +Reduces projectile damage.= +Protection= +Reduces most types of damage by 4% for each level.= +Thorns= +Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.= diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..d163fcd --- /dev/null +++ b/mod.conf @@ -0,0 +1,5 @@ +name = mcl_enchanting +description = Enchanting for MineClone2 +depends = tt, walkover, mcl_sounds, mcl_colors, mcl_experience, mcl_util +optional_depends = screwdriver +author = Fleckenstein diff --git a/models/mcl_enchanting_book.b3d b/models/mcl_enchanting_book.b3d new file mode 100644 index 0000000..ecc8d91 Binary files /dev/null and b/models/mcl_enchanting_book.b3d differ diff --git a/sounds/attributions.txt b/sounds/attributions.txt new file mode 100644 index 0000000..261a4ad --- /dev/null +++ b/sounds/attributions.txt @@ -0,0 +1,7 @@ +Alecia Shepherd (CC BY-SA 4.0): + + mcl_enchanting_enchant.0.ogg + mcl_enchanting_enchant.1.ogg + mcl_enchanting_enchant.2.ogg + +Source: SnowSong sound and music pack diff --git a/sounds/mcl_enchanting_enchant.0.ogg b/sounds/mcl_enchanting_enchant.0.ogg new file mode 100644 index 0000000..a7f357f Binary files /dev/null and b/sounds/mcl_enchanting_enchant.0.ogg differ diff --git a/sounds/mcl_enchanting_enchant.1.ogg b/sounds/mcl_enchanting_enchant.1.ogg new file mode 100644 index 0000000..246fde3 Binary files /dev/null and b/sounds/mcl_enchanting_enchant.1.ogg differ diff --git a/sounds/mcl_enchanting_enchant.2.ogg b/sounds/mcl_enchanting_enchant.2.ogg new file mode 100644 index 0000000..4ad66d9 Binary files /dev/null and b/sounds/mcl_enchanting_enchant.2.ogg differ