From a960bf2e8e3da2dd4086a511f85aec97694d23c7 Mon Sep 17 00:00:00 2001 From: Dehydrate6684 Date: Sat, 16 Sep 2023 13:16:49 +0800 Subject: [PATCH 001/345] Update trapdoor climbable behavior --- mods/ITEMS/mcl_core/nodes_climb.lua | 48 ++++++++++++++++++++++++- mods/ITEMS/mcl_doors/api_trapdoors.lua | 50 +++++++++++++++++++++++--- 2 files changed, 93 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 33a34f899..1e94a37dc 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -33,7 +33,14 @@ minetest.register_node("mcl_core:ladder", { wall_side = { -0.5, -0.5, -0.5, -7/16, 0.5, 0.5 }, }, stack_max = 64, - groups = {handy=1,axey=1, attached_node=1, deco_block=1, dig_by_piston=1}, + groups = { + handy = 1, + axey = 1, + attached_node = 1, + deco_block = 1, + dig_by_piston = 1, + ladder = 1 + }, sounds = mcl_sounds.node_sound_wood_defaults(), node_placement_prediction = "", -- Restrict placement of ladders @@ -80,7 +87,46 @@ minetest.register_node("mcl_core:ladder", { end return itemstack end, + after_destruct = function(pos, oldnode) + local pos_above = vector.add(pos, {x = 0, y = 1, z = 0 }) + local node_above = minetest.get_node_or_nil(pos_above) + if node_above then + local is_trapdoor = minetest.get_item_group(node_above.name, "trapdoor") + + -- If node above is an opened trapdoor + if is_trapdoor == 2 then + local above_def = minetest.registered_nodes[node_above.name] + if above_def._other then + minetest.swap_node(pos_above, { + name = above_def._other, + param1 = node_above.param1, + param2 = node_above.param2, + }) + end + end + end + end, + after_place_node = function(pos, oldnode) + local pos_above = vector.add(pos, {x = 0, y = 1, z = 0 }) + local node_above = minetest.get_node_or_nil(pos_above) + + if node_above then + local is_trapdoor = minetest.get_item_group(node_above.name, "trapdoor") + + -- If node above is an opened trapdoor + if is_trapdoor == 2 then + local above_def = minetest.registered_nodes[node_above.name] + if above_def._other then + minetest.swap_node(pos_above, { + name = above_def._other, + param1 = node_above.param1, + param2 = node_above.param2, + }) + end + end + end + end, _mcl_blast_resistance = 0.4, _mcl_hardness = 0.4, on_rotate = rotate_climbable, diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index 5b7a0e5d0..c42ffd7c3 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -72,7 +72,21 @@ function mcl_doors:register_trapdoor(name, def) -- Open else minetest.sound_play(def.sound_open, {pos = pos, gain = 0.3, max_hear_distance = 16}, true) - tmp_node = {name=name.."_open", param1=me.param1, param2=me.param2} + + local bottom_node = minetest.get_node_or_nil(vector.subtract(pos, { x = 0, y = 1, z = 0 })) + local name_end = "_open" + + -- Checking if there is something underneath the trapdoor + if bottom_node then + local bottom_def = minetest.registered_nodes[bottom_node.name] + local trapdoor = minetest.get_item_group(bottom_node.name, "trapdoor") + + -- Changing trapdoor into a ladder if bottom node is climbable and not a trapdoor + if trapdoor ~= 2 and bottom_def.climbable then + name_end = "_ladder" + end + end + tmp_node = {name=name..name_end, param1=me.param1, param2=me.param2} end minetest.set_node(pos, tmp_node) end @@ -193,6 +207,7 @@ function mcl_doors:register_trapdoor(name, def) groups_open.trapdoor = 2 groups_open.not_in_creative_inventory = 1 + -- Non-climbable opened minetest.register_node(name.."_open", { drawtype = "nodebox", tiles = tiles_open, @@ -200,9 +215,35 @@ function mcl_doors:register_trapdoor(name, def) is_ground_content = false, paramtype = "light", paramtype2 = "facedir", - -- TODO: Implement Minecraft behaviour: Climbable if directly above - -- ladder w/ matching orientation. - -- Current behavour: Always climbable + sunlight_propagates = true, + pointable = true, + groups = groups_open, + _mcl_hardness = def._mcl_hardness, + _mcl_blast_resistance = def._mcl_blast_resistance, + sounds = def.sounds, + drop = name, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 5/16, 0.5, 0.5, 0.5} + }, + on_rightclick = on_rightclick, + mesecons = {effector = { + action_off = (function(pos, node) + punch(pos) + end), + }}, + on_rotate = on_rotate, + _other = name .. "_ladder" + }) + + -- Climbable opened + minetest.register_node(name.."_ladder", { + drawtype = "nodebox", + tiles = tiles_open, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + is_ground_content = false, + paramtype = "light", + paramtype2 = "facedir", climbable = true, sunlight_propagates = true, pointable = true, @@ -222,6 +263,7 @@ function mcl_doors:register_trapdoor(name, def) end), }}, on_rotate = on_rotate, + _other = name .. "_open" }) if minetest.get_modpath("doc") then From e6653b78eed3af654039234fe8d974be63360e2d Mon Sep 17 00:00:00 2001 From: Dehydrate6684 Date: Sun, 17 Sep 2023 17:03:04 +0800 Subject: [PATCH 002/345] Added directional checks --- mods/ITEMS/mcl_core/nodes_climb.lua | 96 ++++++++++++++++---------- mods/ITEMS/mcl_doors/api_trapdoors.lua | 41 ++++++++--- 2 files changed, 89 insertions(+), 48 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 1e94a37dc..ca45a39f5 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -11,6 +11,59 @@ local function rotate_climbable(pos, node, user, mode) return false end +---Checks the direction (param2) of a ladder and a trapdoor and determine if they are +---facing the same direction. +--- +---@param ladder integer The param2 value of the ladder. +---@param trapdoor integer The param2 value of the trapdoor. +---@return boolean If the ladder and trapdoor are in the same direction. +local function check_direction(ladder, trapdoor) + local convert_table = {}; + convert_table[2] = { 1, 23 } + convert_table[3] = { 3, 21 } + convert_table[4] = { 0, 20 } + convert_table[5] = { 2, 22 } + + local conversion = convert_table[ladder]; + if conversion == nil then + return false + elseif conversion[1] == trapdoor or conversion[2] == trapdoor then + return true + end + + return false +end + +---Updates the trapdoor above (if any). +--- +---@param pos mt.Vector The position of the ladder. +---@param ladder integer The param2 value of the ladder. +---@param event "place" | "destruct" The place or destruct event. +local function update_trapdoor(pos, ladder, event) + local top_pos = vector.add(pos, { x = 0, y = 1, z = 0 }) + local top_node = minetest.get_node_or_nil(top_pos) + if top_node then + local new_name = top_node.name + if event == "place" then + new_name = string.gsub(new_name, "open$", "ladder") + elseif event == "destruct" then + new_name = string.gsub(new_name, "ladder$", "open") + end + + local is_trapdoor = minetest.get_item_group(top_node.name, "trapdoor") + + -- If node above is an opened trapdoor + if is_trapdoor == 2 and check_direction(ladder, top_node.param2) then + minetest.swap_node(top_pos, { + name = new_name, + param1 = top_node.param1, + param2 = top_node.param2, + }) + end + end +end + +-- TODO: Move ladders into their own API. minetest.register_node("mcl_core:ladder", { description = S("Ladder"), _doc_items_longdesc = S("A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns."), @@ -87,45 +140,12 @@ minetest.register_node("mcl_core:ladder", { end return itemstack end, - after_destruct = function(pos, oldnode) - local pos_above = vector.add(pos, {x = 0, y = 1, z = 0 }) - local node_above = minetest.get_node_or_nil(pos_above) - - if node_above then - local is_trapdoor = minetest.get_item_group(node_above.name, "trapdoor") - - -- If node above is an opened trapdoor - if is_trapdoor == 2 then - local above_def = minetest.registered_nodes[node_above.name] - if above_def._other then - minetest.swap_node(pos_above, { - name = above_def._other, - param1 = node_above.param1, - param2 = node_above.param2, - }) - end - end - end + after_destruct = function(pos, old) + update_trapdoor(pos, old.param2, "destruct") end, - after_place_node = function(pos, oldnode) - local pos_above = vector.add(pos, {x = 0, y = 1, z = 0 }) - local node_above = minetest.get_node_or_nil(pos_above) - - if node_above then - local is_trapdoor = minetest.get_item_group(node_above.name, "trapdoor") - - -- If node above is an opened trapdoor - if is_trapdoor == 2 then - local above_def = minetest.registered_nodes[node_above.name] - if above_def._other then - minetest.swap_node(pos_above, { - name = above_def._other, - param1 = node_above.param1, - param2 = node_above.param2, - }) - end - end - end + after_place_node = function(pos) + local me = minetest.get_node(pos) + update_trapdoor(pos, me.param2, "place") end, _mcl_blast_resistance = 0.4, _mcl_hardness = 0.4, diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index c42ffd7c3..455534878 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -48,6 +48,29 @@ if minetest.get_modpath("screwdriver") then end end +---Checks the direction (param2) of a ladder and a trapdoor and determine if they are +---facing the same direction. +--- +---@param ladder integer The param2 value of the ladder. +---@param trapdoor integer The param2 value of the trapdoor. +---@return boolean If the ladder and trapdoor are in the same direction. +function check_direction(ladder, trapdoor) + local convert_table = {}; + convert_table[2] = { 1, 23 } + convert_table[3] = { 3, 21 } + convert_table[4] = { 0, 20 } + convert_table[5] = { 2, 22 } + + local conversion = convert_table[ladder]; + if conversion == nil then + return false + elseif conversion[1] == trapdoor or conversion[2] == trapdoor then + return true + end + + return false +end + function mcl_doors:register_trapdoor(name, def) local groups = table.copy(def.groups) if groups == nil then @@ -67,26 +90,24 @@ function mcl_doors:register_trapdoor(name, def) local tmp_node -- Close if minetest.get_item_group(me.name, "trapdoor") == 2 then - minetest.sound_play(def.sound_close, {pos = pos, gain = 0.3, max_hear_distance = 16}, true) - tmp_node = {name=name, param1=me.param1, param2=me.param2} - -- Open + minetest.sound_play(def.sound_close, { pos = pos, gain = 0.3, max_hear_distance = 16 }, true) + tmp_node = { name = name, param1 = me.param1, param2 = me.param2 } + -- Open else - minetest.sound_play(def.sound_open, {pos = pos, gain = 0.3, max_hear_distance = 16}, true) + minetest.sound_play(def.sound_open, { pos = pos, gain = 0.3, max_hear_distance = 16 }, true) local bottom_node = minetest.get_node_or_nil(vector.subtract(pos, { x = 0, y = 1, z = 0 })) local name_end = "_open" -- Checking if there is something underneath the trapdoor if bottom_node then - local bottom_def = minetest.registered_nodes[bottom_node.name] - local trapdoor = minetest.get_item_group(bottom_node.name, "trapdoor") - - -- Changing trapdoor into a ladder if bottom node is climbable and not a trapdoor - if trapdoor ~= 2 and bottom_def.climbable then + local is_ladder = minetest.get_item_group(bottom_node.name, "ladder") + local same_direction = check_direction(bottom_node.param2, me.param2) + if is_ladder > 0 and same_direction then name_end = "_ladder" end end - tmp_node = {name=name..name_end, param1=me.param1, param2=me.param2} + tmp_node = { name = name .. name_end, param1 = me.param1, param2 = me.param2 } end minetest.set_node(pos, tmp_node) end From cc217d008985e4a65a91305c68ace348c558f6ca Mon Sep 17 00:00:00 2001 From: Dehydrate6684 Date: Sun, 17 Sep 2023 17:13:50 +0800 Subject: [PATCH 003/345] Removed unnessary node definitions --- mods/ITEMS/mcl_doors/api_trapdoors.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index 455534878..1ea45abbf 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -254,7 +254,6 @@ function mcl_doors:register_trapdoor(name, def) end), }}, on_rotate = on_rotate, - _other = name .. "_ladder" }) -- Climbable opened @@ -284,7 +283,6 @@ function mcl_doors:register_trapdoor(name, def) end), }}, on_rotate = on_rotate, - _other = name .. "_open" }) if minetest.get_modpath("doc") then From 0c48a46f7cf9a24745e56873f6081db52afec9e6 Mon Sep 17 00:00:00 2001 From: Dehydrate6684 Date: Mon, 9 Oct 2023 13:55:08 +0800 Subject: [PATCH 004/345] Updated code based on reviews --- mods/ITEMS/mcl_core/nodes_climb.lua | 72 +++++++++++-------- mods/ITEMS/mcl_doors/api_trapdoors.lua | 98 +++++++++++--------------- 2 files changed, 83 insertions(+), 87 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index ca45a39f5..7bad7b318 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -17,15 +17,17 @@ end ---@param ladder integer The param2 value of the ladder. ---@param trapdoor integer The param2 value of the trapdoor. ---@return boolean If the ladder and trapdoor are in the same direction. -local function check_direction(ladder, trapdoor) - local convert_table = {}; - convert_table[2] = { 1, 23 } - convert_table[3] = { 3, 21 } - convert_table[4] = { 0, 20 } - convert_table[5] = { 2, 22 } +function mcl_core.check_direction(ladder, trapdoor) + local convert_table = { + nil, + { 1, 23 }, + { 3, 21 }, + { 0, 20 }, + { 2, 22 }, + } local conversion = convert_table[ladder]; - if conversion == nil then + if not conversion then return false elseif conversion[1] == trapdoor or conversion[2] == trapdoor then return true @@ -42,7 +44,10 @@ end local function update_trapdoor(pos, ladder, event) local top_pos = vector.add(pos, { x = 0, y = 1, z = 0 }) local top_node = minetest.get_node_or_nil(top_pos) - if top_node then + + + if top_node and minetest.get_item_group(top_node.name, "trapdoor") == 2 + and mcl_core.check_direction(ladder, top_node.param2) then local new_name = top_node.name if event == "place" then new_name = string.gsub(new_name, "open$", "ladder") @@ -50,26 +55,23 @@ local function update_trapdoor(pos, ladder, event) new_name = string.gsub(new_name, "ladder$", "open") end - local is_trapdoor = minetest.get_item_group(top_node.name, "trapdoor") - -- If node above is an opened trapdoor - if is_trapdoor == 2 and check_direction(ladder, top_node.param2) then - minetest.swap_node(top_pos, { - name = new_name, - param1 = top_node.param1, - param2 = top_node.param2, - }) - end + minetest.swap_node(top_pos, { + name = new_name, + param1 = top_node.param1, + param2 = top_node.param2, + }) end end -- TODO: Move ladders into their own API. minetest.register_node("mcl_core:ladder", { description = S("Ladder"), - _doc_items_longdesc = S("A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns."), + _doc_items_longdesc = S( + "A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns."), drawtype = "signlike", is_ground_content = false, - tiles = {"default_ladder.png"}, + tiles = { "default_ladder.png" }, inventory_image = "default_ladder.png", wield_image = "default_ladder.png", paramtype = "light", @@ -79,11 +81,11 @@ minetest.register_node("mcl_core:ladder", { climbable = true, node_box = { type = "wallmounted", - wall_side = { -0.5, -0.5, -0.5, -7/16, 0.5, 0.5 }, + wall_side = { -0.5, -0.5, -0.5, -7 / 16, 0.5, 0.5 }, }, selection_box = { type = "wallmounted", - wall_side = { -0.5, -0.5, -0.5, -7/16, 0.5, 0.5 }, + wall_side = { -0.5, -0.5, -0.5, -7 / 16, 0.5, 0.5 }, }, stack_max = 64, groups = { @@ -113,7 +115,7 @@ minetest.register_node("mcl_core:ladder", { -- Don't allow to place the ladder at particular nodes if (groups and (groups.glass or groups.leaves or groups.slab)) or - node.name == "mcl_core:ladder" or node.name == "mcl_core:ice" or node.name == "mcl_nether:glowstone" or node.name == "mcl_ocean:sea_lantern" then + node.name == "mcl_core:ladder" or node.name == "mcl_core:ice" or node.name == "mcl_nether:glowstone" or node.name == "mcl_ocean:sea_lantern" then return itemstack end @@ -135,7 +137,7 @@ minetest.register_node("mcl_core:ladder", { if success then if idef.sounds and idef.sounds.place then - minetest.sound_play(idef.sounds.place, {pos=above, gain=1}, true) + minetest.sound_play(idef.sounds.place, { pos = above, gain = 1 }, true) end end return itemstack @@ -155,9 +157,10 @@ minetest.register_node("mcl_core:ladder", { minetest.register_node("mcl_core:vine", { description = S("Vines"), - _doc_items_longdesc = S("Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread."), + _doc_items_longdesc = S( + "Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread."), drawtype = "signlike", - tiles = {"mcl_core_vine.png"}, + tiles = { "mcl_core_vine.png" }, color = "#48B518", inventory_image = "mcl_core_vine.png", wield_image = "mcl_core_vine.png", @@ -173,9 +176,18 @@ minetest.register_node("mcl_core:vine", { }, stack_max = 64, groups = { - handy = 1, axey = 1, shearsy = 1, swordy = 1, deco_block = 1, - dig_by_piston = 1, destroy_by_lava_flow = 1, compostability = 50, - flammable = 2, fire_encouragement = 15, fire_flammability = 100, foliage_palette_wallmounted = 1 + handy = 1, + axey = 1, + shearsy = 1, + swordy = 1, + deco_block = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 50, + flammable = 2, + fire_encouragement = 15, + fire_flammability = 100, + foliage_palette_wallmounted = 1 }, sounds = mcl_sounds.node_sound_leaves_defaults(), drop = "", @@ -217,7 +229,7 @@ minetest.register_node("mcl_core:vine", { if success then if idef.sounds and idef.sounds.place then - minetest.sound_play(idef.sounds.place, {pos=above, gain=1}, true) + minetest.sound_play(idef.sounds.place, { pos = above, gain = 1 }, true) end end return itemstack @@ -240,7 +252,7 @@ minetest.register_node("mcl_core:vine", { -- If dug, also dig a “dependant” vine below it. -- A vine is dependant if it hangs from this node and has no supporting block. on_dig = function(pos, node, digger) - local below = vector.offset(pos,0,-1,0) + local below = vector.offset(pos, 0, -1, 0) local belownode = minetest.get_node(below) minetest.node_dig(pos, node, digger) if belownode.name == node.name and (not mcl_core.check_vines_supported(below, belownode)) then diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index 1ea45abbf..61530ab98 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -48,29 +48,6 @@ if minetest.get_modpath("screwdriver") then end end ----Checks the direction (param2) of a ladder and a trapdoor and determine if they are ----facing the same direction. ---- ----@param ladder integer The param2 value of the ladder. ----@param trapdoor integer The param2 value of the trapdoor. ----@return boolean If the ladder and trapdoor are in the same direction. -function check_direction(ladder, trapdoor) - local convert_table = {}; - convert_table[2] = { 1, 23 } - convert_table[3] = { 3, 21 } - convert_table[4] = { 0, 20 } - convert_table[5] = { 2, 22 } - - local conversion = convert_table[ladder]; - if conversion == nil then - return false - elseif conversion[1] == trapdoor or conversion[2] == trapdoor then - return true - end - - return false -end - function mcl_doors:register_trapdoor(name, def) local groups = table.copy(def.groups) if groups == nil then @@ -102,7 +79,7 @@ function mcl_doors:register_trapdoor(name, def) -- Checking if there is something underneath the trapdoor if bottom_node then local is_ladder = minetest.get_item_group(bottom_node.name, "ladder") - local same_direction = check_direction(bottom_node.param2, me.param2) + local same_direction = mcl_core.check_direction(bottom_node.param2, me.param2) if is_ladder > 0 and same_direction then name_end = "_ladder" end @@ -124,20 +101,22 @@ function mcl_doors:register_trapdoor(name, def) longdesc = def._doc_items_longdesc if not longdesc then if def.only_redstone_can_open then - longdesc = S("Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can only be opened or closed by redstone power.") + longdesc = S( + "Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can only be opened or closed by redstone power.") else - longdesc = S("Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can be opened or closed by hand or redstone power.") + longdesc = S( + "Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can be opened or closed by hand or redstone power.") end end usagehelp = def._doc_items_usagehelp if not usagehelp and not def.only_redstone_can_open then usagehelp = S("To open or close this trapdoor, rightclick it or send a redstone signal to it.") end - if def.only_redstone_can_open then - tt_help = S("Openable by redstone power") - else - tt_help = S("Openable by players and redstone power") - end + if def.only_redstone_can_open then + tt_help = S("Openable by redstone power") + else + tt_help = S("Openable by players and redstone power") + end -- Closed trapdoor @@ -163,7 +142,7 @@ function mcl_doors:register_trapdoor(name, def) _doc_items_usagehelp = usagehelp, drawtype = "nodebox", tiles = tiles_closed, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + use_texture_alpha = "clip", inventory_image = def.inventory_image, wield_image = def.wield_image, is_ground_content = false, @@ -178,13 +157,15 @@ function mcl_doors:register_trapdoor(name, def) node_box = { type = "fixed", fixed = { - {-8/16, -8/16, -8/16, 8/16, -5/16, 8/16},}, + { -8 / 16, -8 / 16, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, }, + }, + mesecons = { + effector = { + action_on = (function(pos, node) + punch(pos) + end), + } }, - mesecons = {effector = { - action_on = (function(pos, node) - punch(pos) - end), - }}, on_place = function(itemstack, placer, pointed_thing) local p0 = pointed_thing.under local p1 = pointed_thing.above @@ -199,7 +180,7 @@ function mcl_doors:register_trapdoor(name, def) --local origname = itemstack:get_name() if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) - or (fpos < -0.5 and fpos > -0.999999999) then + or (fpos < -0.5 and fpos > -0.999999999) then param2 = param2 + 20 if param2 == 21 then param2 = 23 @@ -229,10 +210,10 @@ function mcl_doors:register_trapdoor(name, def) groups_open.trapdoor = 2 groups_open.not_in_creative_inventory = 1 -- Non-climbable opened - minetest.register_node(name.."_open", { + minetest.register_node(name .. "_open", { drawtype = "nodebox", tiles = tiles_open, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + use_texture_alpha = "clip", is_ground_content = false, paramtype = "light", paramtype2 = "facedir", @@ -245,22 +226,24 @@ function mcl_doors:register_trapdoor(name, def) drop = name, node_box = { type = "fixed", - fixed = {-0.5, -0.5, 5/16, 0.5, 0.5, 0.5} + fixed = { -0.5, -0.5, 5 / 16, 0.5, 0.5, 0.5 } }, on_rightclick = on_rightclick, - mesecons = {effector = { - action_off = (function(pos, node) - punch(pos) - end), - }}, + mesecons = { + effector = { + action_off = (function(pos, node) + punch(pos) + end), + } + }, on_rotate = on_rotate, }) -- Climbable opened - minetest.register_node(name.."_ladder", { + minetest.register_node(name .. "_ladder", { drawtype = "nodebox", tiles = tiles_open, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + use_texture_alpha = "clip", is_ground_content = false, paramtype = "light", paramtype2 = "facedir", @@ -274,19 +257,20 @@ function mcl_doors:register_trapdoor(name, def) drop = name, node_box = { type = "fixed", - fixed = {-0.5, -0.5, 5/16, 0.5, 0.5, 0.5} + fixed = { -0.5, -0.5, 5 / 16, 0.5, 0.5, 0.5 } }, on_rightclick = on_rightclick, - mesecons = {effector = { - action_off = (function(pos, node) - punch(pos) - end), - }}, + mesecons = { + effector = { + action_off = (function(pos, node) + punch(pos) + end), + } + }, on_rotate = on_rotate, }) if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", name, "nodes", name.."_open") + doc.add_entry_alias("nodes", name, "nodes", name .. "_open") end - end From 23468cc2ddeb85dcdf496debae3380441b9ba6db Mon Sep 17 00:00:00 2001 From: Dehydrate6684 Date: Tue, 10 Oct 2023 09:39:16 +0800 Subject: [PATCH 005/345] Used vector.offset instead of add/subtract --- mods/ITEMS/mcl_core/nodes_climb.lua | 2 +- mods/ITEMS/mcl_doors/api_trapdoors.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 7bad7b318..81022bbb3 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -42,7 +42,7 @@ end ---@param ladder integer The param2 value of the ladder. ---@param event "place" | "destruct" The place or destruct event. local function update_trapdoor(pos, ladder, event) - local top_pos = vector.add(pos, { x = 0, y = 1, z = 0 }) + local top_pos = vector.offset(pos, 0, 1, 0) local top_node = minetest.get_node_or_nil(top_pos) diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index 61530ab98..17765f27e 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -73,7 +73,7 @@ function mcl_doors:register_trapdoor(name, def) else minetest.sound_play(def.sound_open, { pos = pos, gain = 0.3, max_hear_distance = 16 }, true) - local bottom_node = minetest.get_node_or_nil(vector.subtract(pos, { x = 0, y = 1, z = 0 })) + local bottom_node = minetest.get_node_or_nil(vector.offset(pos, 0, -1, 0)) local name_end = "_open" -- Checking if there is something underneath the trapdoor From b320d008cad45df0578c0047699c3a55e08f12a4 Mon Sep 17 00:00:00 2001 From: Dehydrate6684 Date: Wed, 18 Oct 2023 08:04:54 +0800 Subject: [PATCH 006/345] Unhardcoded nil --- mods/ITEMS/mcl_core/nodes_climb.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 81022bbb3..c1514926f 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -19,14 +19,13 @@ end ---@return boolean If the ladder and trapdoor are in the same direction. function mcl_core.check_direction(ladder, trapdoor) local convert_table = { - nil, { 1, 23 }, { 3, 21 }, { 0, 20 }, { 2, 22 }, } - local conversion = convert_table[ladder]; + local conversion = convert_table[ladder - 1]; if not conversion then return false elseif conversion[1] == trapdoor or conversion[2] == trapdoor then From ec7e99019ed14903be0f1ce04818014659c1bdb6 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Sat, 21 Oct 2023 22:25:30 +0200 Subject: [PATCH 007/345] add trim advancements --- mods/HUD/mcl_achievements/init.lua | 21 +++++++ .../locale/mcl_achievements.de.tr | 4 ++ mods/HUD/mcl_achievements/locale/template.txt | 4 ++ mods/ITEMS/mcl_armor/api.lua | 10 ++- mods/ITEMS/mcl_armor/init.lua | 2 +- mods/ITEMS/mcl_armor/trims.lua | 18 ++++++ mods/ITEMS/mcl_smithing_table/init.lua | 59 ++++++++++++++---- .../silence_armor_trim_smithing_template.png | Bin 0 -> 279 bytes textures/silence_boots.png | Bin 0 -> 302 bytes textures/silence_chestplate.png | Bin 0 -> 617 bytes textures/silence_helmet.png | Bin 0 -> 529 bytes textures/silence_leggings.png | Bin 0 -> 575 bytes ...wayfinder_armor_trim_smithing_template.png | Bin 0 -> 238 bytes textures/wayfinder_boots.png | Bin 0 -> 310 bytes textures/wayfinder_chestplate.png | Bin 0 -> 390 bytes textures/wayfinder_helmet.png | Bin 0 -> 321 bytes textures/wayfinder_leggings.png | Bin 0 -> 276 bytes 17 files changed, 103 insertions(+), 15 deletions(-) mode change 100644 => 100755 mods/HUD/mcl_achievements/init.lua mode change 100644 => 100755 mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr mode change 100644 => 100755 mods/HUD/mcl_achievements/locale/template.txt mode change 100644 => 100755 mods/ITEMS/mcl_armor/api.lua mode change 100644 => 100755 mods/ITEMS/mcl_smithing_table/init.lua create mode 100644 textures/silence_armor_trim_smithing_template.png create mode 100644 textures/silence_boots.png create mode 100644 textures/silence_chestplate.png create mode 100644 textures/silence_helmet.png create mode 100644 textures/silence_leggings.png create mode 100644 textures/wayfinder_armor_trim_smithing_template.png create mode 100644 textures/wayfinder_boots.png create mode 100644 textures/wayfinder_chestplate.png create mode 100644 textures/wayfinder_helmet.png create mode 100644 textures/wayfinder_leggings.png diff --git a/mods/HUD/mcl_achievements/init.lua b/mods/HUD/mcl_achievements/init.lua old mode 100644 new mode 100755 index 4d272fe86..61ef9a9f2 --- a/mods/HUD/mcl_achievements/init.lua +++ b/mods/HUD/mcl_achievements/init.lua @@ -431,6 +431,27 @@ awards.register_achievement("mcl:wax_off", { group = "Husbandry", }) +-- Triggered in mcl_smithing_table +awards.register_achievement("mcl:trim", { + title = S("Crafting a New Look"), + description = S("Craft a trimmed armor at a Smithing Table"), + icon = "dune_armor_trim_smithing_template.png", + type = "Advancement", + group = "Adventure", +}) + +awards.register_achievement("mcl:lots_of_trimming", { + title = S("Smithing with Style"), + description = S("Apply these smithing templates at least once: Spire, Snout, Rib, Ward, Silence, Vex, Tide, Wayfinder"), + icon = "silence_armor_trim_smithing_template.png", + type = "Advancement", + group = "Adventure", + on_unlock = function(name, awdef) + -- delete json that is no longer needed + minetest.get_player_by_name(name):get_meta():set_string("mcl_smithing_table:achievement_trims", "") + end, +}) + -- NON-PC ACHIEVEMENTS (XBox, Pocket Edition, etc.) if non_pc_achievements then diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr old mode 100644 new mode 100755 index 1c6f668e5..7b73d1887 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr @@ -51,3 +51,7 @@ Bring Home the Beacon=Den Nachbarn heimleuchten Use a beacon.=Benutzen Sie ein Leuchtfeuer. Beaconator=Leuchtturmwärter Use a fully powered beacon.=Benutzen Sie ein vollständiges Leuchtfeuer. +Crafting a New Look=Ein neues Aussehen +Craft a trimmed armor at a Smithing Table=Versieh ein Rüstungsteil an einem Schmiedetisch mit einem Rüstungsbesatz +Smithing with Style=Schmieden mit Stil +Apply these smithing templates at least once: Spire, Snout, Rib, Ward, Silence, Vex, Tide, Wayfinder=Wende jede dieser Schmiedevorlagen mindestens einmal an: Turmspitze, Schnauze, Rippe, Warthof, Stille, Plagegeist, Gezeiten und Wegfinder \ No newline at end of file diff --git a/mods/HUD/mcl_achievements/locale/template.txt b/mods/HUD/mcl_achievements/locale/template.txt old mode 100644 new mode 100755 index d865b1668..89c422a08 --- a/mods/HUD/mcl_achievements/locale/template.txt +++ b/mods/HUD/mcl_achievements/locale/template.txt @@ -111,3 +111,7 @@ Voluntary Exile= Kill a raid captain. Maybe consider staying away from the local villages for the time being...= Tactical Fishing= Catch a fish... without a fishing rod!= +Crafting a New Look= +Craft a trimmed armor at a Smithing Table= +Smithing with Style= +Apply these smithing templates at least once: Spire, Snout, Rib, Ward, Silence, Vex, Tide, Wayfinder= \ No newline at end of file diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua old mode 100644 new mode 100755 index 558607785..1e88643f1 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -326,11 +326,17 @@ end tt.register_snippet(function(itemstring, toolcaps, stack) if not stack then return nil end local meta = stack:get_meta() - if meta:get_string("mcl_armor:trim_overlay") == "" then return nil end -- remember, get_string returns "" if the key doesn't exist + if not mcl_armor.is_trimmed(stack) then return nil end -- we need to get the part of the overlay image between the overlay begin ( and the trim name end _ -- we COULD easily store this info in meta, but that would bloat the meta storage, as the same few values would be stored over and over again on every trimmed item -- this is fine here as this code gets only executed when you put armor and a trim in a smithing table local full_overlay = meta:get_string("mcl_armor:trim_overlay") local trim_name = full_overlay:match("%((.-)%_") return "Upgrade:\n " .. trim_name:gsub("^%l", string.upper) .. " Armor Trim" -end) \ No newline at end of file +end) + +function mcl_armor.is_trimmed(itemstack) + -- this meta value will be there for every trimmed armor piece + -- remember, get_string returns "" if the key doesn't exist + return itemstack:get_meta():get_string("mcl_armor:trim_overlay") ~= "" +end \ No newline at end of file diff --git a/mods/ITEMS/mcl_armor/init.lua b/mods/ITEMS/mcl_armor/init.lua index e85158f6c..402d9eef3 100644 --- a/mods/ITEMS/mcl_armor/init.lua +++ b/mods/ITEMS/mcl_armor/init.lua @@ -60,7 +60,7 @@ mcl_armor = { trims = { core_textures = {}, blacklisted = {["mcl_armor:elytra"]=true, ["mcl_armor:elytra_enchanted"]=true}, - overlays = {"sentry","dune","coast","wild","tide","ward","vex","rib","snout","eye","spire"}, + overlays = {"sentry","dune","coast","wild","tide","ward","vex","rib","snout","eye","spire","silence","wayfinder"}, colors = {["amethyst"]="#8246a5",["gold"]="#ce9627",["emerald"]="#1b9958",["copper"]="#c36447",["diamond"]="#5faed8",["iron"]="#938e88",["lapis"]="#1c306b",["netherite"]="#302a26",["quartz"]="#c9bcb9",["redstone"]="#af2c23"}, }, } diff --git a/mods/ITEMS/mcl_armor/trims.lua b/mods/ITEMS/mcl_armor/trims.lua index 9e8e32625..76d37deb0 100644 --- a/mods/ITEMS/mcl_armor/trims.lua +++ b/mods/ITEMS/mcl_armor/trims.lua @@ -43,4 +43,22 @@ minetest.register_craft({ {"mcl_core:diamond","mcl_core:goldblock","mcl_core:diamond"}, {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, } +}) + +minetest.register_craft({ + output = mod_registername .. "silence", + recipe = { + {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, + {"mcl_core:diamond", mod_registername.."ward","mcl_core:diamond"}, + {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, + } +}) + +minetest.register_craft({ + output = mod_registername .. "wayfinder", + recipe = { + {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, + {"mcl_core:diamond", "mcl_maps:empty_map","mcl_core:diamond"}, + {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, + } }) \ No newline at end of file diff --git a/mods/ITEMS/mcl_smithing_table/init.lua b/mods/ITEMS/mcl_smithing_table/init.lua old mode 100644 new mode 100755 index 4690a1ed6..1794f8791 --- a/mods/ITEMS/mcl_smithing_table/init.lua +++ b/mods/ITEMS/mcl_smithing_table/init.lua @@ -88,7 +88,18 @@ local smithing_materials = { ["mcl_copper:copper_ingot"] = "copper", ["mcl_core:emerald"] = "emerald", ["mcl_nether:quartz"] = "quartz" -} +} + +local achievement_trims = { + ["mcl_armor:spire"] = true, + ["mcl_armor:snout"] = true, + ["mcl_armor:rib"] = true, + ["mcl_armor:ward"] = true, + ["mcl_armor:silence"] = true, + ["mcl_armor:vex"] = true, + ["mcl_armor:tide"] = true, + ["mcl_armor:wayfinder"] = true +} function mcl_smithing_table.upgrade_trimmed(itemstack, color_mineral, template) --get information required @@ -181,27 +192,51 @@ minetest.register_node("mcl_smithing_table:table", { on_metadata_inventory_take = function(pos, listname, index, stack, player) local inv = minetest.get_meta(pos):get_inventory() - + local function take_item(listname) local itemstack = inv:get_stack(listname, 1) itemstack:take_item() inv:set_stack(listname, 1, itemstack) end - + if listname == "upgraded_item" then + -- ToDo: make epic sound + minetest.sound_play("mcl_smithing_table_upgrade", { pos = pos, max_hear_distance = 16 }) + + if stack:get_name() == "mcl_farming:hoe_netherite" then + awards.unlock(player:get_player_name(), "mcl:seriousDedication") + elseif mcl_armor.is_trimmed(stack) then + local template_name = inv:get_stack("template", 1):get_name() + local playername = player:get_player_name() + awards.unlock(playername, "mcl:trim") + + if not awards.players[playername].unlocked["mcl:lots_of_trimming"] and achievement_trims[template_name] then + local meta = player:get_meta() + local used_achievement_trims = minetest.deserialize(meta:get_string("mcl_smithing_table:achievement_trims")) or {} + if not used_achievement_trims[template_name] then + used_achievement_trims[template_name] = true + end + + local used_all = true + for name, _ in pairs(achievement_trims) do + if not used_achievement_trims[name] then + used_all = false + break + end + end + + if used_all then + awards.unlock(playername, "mcl:lots_of_trimming") + else + meta:set_string("mcl_smithing_table:achievement_trims", minetest.serialize(used_achievement_trims)) + end + end + end + take_item("upgrade_item") take_item("mineral") take_item("template") - - -- ToDo: make epic sound - minetest.sound_play("mcl_smithing_table_upgrade", { pos = pos, max_hear_distance = 16 }) end - if listname == "upgraded_item" then - if stack:get_name() == "mcl_farming:hoe_netherite" then - awards.unlock(player:get_player_name(), "mcl:seriousDedication") - end - end - reset_upgraded_item(pos) end, diff --git a/textures/silence_armor_trim_smithing_template.png b/textures/silence_armor_trim_smithing_template.png new file mode 100644 index 0000000000000000000000000000000000000000..77e72d074b3c83e8e38e6351e99087e8b496d4d7 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!cYsfbE0E^QDS0{9<6*1amIz61 zEh8>vEmnS!Kz~0^cekjBFb-)ID+`MikN%gR`|W6NAHVL#?RS5|W*lMR;x{oe($m#t z7nb&KT=6o^HD<5v&)gvvxc$c-hqPqPW7FcqJ^qya zm7001_e4&dgd)F#*lq@HzYFt)lnyYIW=F5y^4QKnyIp2)so&J#^Y{Lj@&0?gw}#=x XW!8lpqM0E;7ch9b`njxgN@xNA)x%_f literal 0 HcmV?d00001 diff --git a/textures/silence_boots.png b/textures/silence_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..760203a4d212f39e865321bea1c68b7c39c5e21d GIT binary patch literal 302 zcmV+}0nz@6P)NklnXkN4%+G-&Ns=TbTW`^5;_Oz}73Tw9|vmVh8m6!ylPXI-Nobo_j%N8=DG$0@~GW>;)RlLuoa;Wwol< zQG3bU8*i8~<2v>NnHHg7;}?EoV^GI{4I>t6LIF{n>>Uc4@RK_y{1B9VBKaU&m1%O3e+Drr$4gdfE07*qoM6N<$f+5|8 A8vp+;4MJ`2bE~|yje&u7B|DS*6K~7FiPEJlvPEO8$ zrmt5)@~u$-ZAr`KZ8l0FDKP!6B0fG?TPNK)dmFAnGTOMHi(z8E61KF+SBgrQ(g6bm zO--USqXFB~BIv9r&#h*cU($G?fnEt6)1Z(tDGyl@?1tUukz16Dim5Ef7cCkNu&x1` zoQax8`+L1Z5)3M=yN!6nl^f`YZiK#648suLcDczjL&w8kQnEW*HJIVC)ihvUZO*KO5; zKf52pKo?)0Sd$5dy_X_>_d+0*g3Q>kf-|2TdjP;)?y-NgLD+H=;%8sM4=X7KH8;UN z-vv(5&#DAQ3<*PQMy2kdB@9M8#~ulQ6TJ#--Y^6=%$6;fCmsv3<%SQw7IS=NJWk@K zHZ@^9tNbw%2v1u~0Mceks!;-3(y}d^2hI literal 0 HcmV?d00001 diff --git a/textures/silence_helmet.png b/textures/silence_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..ad2de6ab0b9962270d5481b57a93525ad094a243 GIT binary patch literal 529 zcmV+s0`C2ZP)Iq%2#3trBBu;`+lGf#YhwUINvCiP6c@}nkFn)k9V8i9C&mWQ1J$nv@0$Z_ccq^Wpc{IES=+rE( z%sh<&Nu)+GT_F{e~c7lkC$0DuBQT0o#a+P5OLm7WaR_M?&8ovP$f{s05 z+ZLMzHP~Wb9`xGZp=t#!aE*#q2?q8|nU@Fi7EItLw5q=ANyp)kV@n@ za!mE=)!T>X9!NYL#F=pD1e3@c1 zNvN-lEZ5m4)5z8QfZdkiJHvg3ilyzp?|)7H8nSvN!$%H>W^K2_t=kzaOSp{;Hnl_^ zGrnNecK*ojb<5=n6864PXAbc`y(nq>j~V6XUdoAh+h4Y_+jVDxW9zbA>@!l|UoO5q zw_Lq1i}Tu3`O{ey_Z@k8W3jopZn5 zJFxh0lq2t_PQJx+LB`EYM8`vJKVyA%Jc@Lz3ynC0u22ire0f>MU3 LtDnm{r-UW|0bup7 literal 0 HcmV?d00001 diff --git a/textures/wayfinder_armor_trim_smithing_template.png b/textures/wayfinder_armor_trim_smithing_template.png new file mode 100644 index 0000000000000000000000000000000000000000..23fd30a87f69b05af81c2fe5bbe61ded61c09b27 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!aez;VE0BIU*W+QU-IfT+_87m3 zS&=hKlW)KKv*OYJ@^im?l0xIx-3Xg;#J_QEqPty&pQ~HZ{43Y>Eak7ak=+gAm3pH9_D~;w-gJ#Pyh9gesO4@w1JR6=b|a*tQUG7yByjR zCV%QYe-Dp_$L}=ua-otW?+cDxqG!x~c#`^bIMye>$>3)3NcQG@KJ|4>!0hcaS&vqK infd?z;y3>HuJRuF!#usjcGnxAjSQZyelF{r5}E+I@LYxf literal 0 HcmV?d00001 diff --git a/textures/wayfinder_boots.png b/textures/wayfinder_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8717ccb612bea99fc55d38ca4a7ddba3e942a5 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3-p)I`?e@QaJ%WA+A9B!Gi~9&z#z~Z{Om@ ziziK*bo$f@AY%y_baZqiCnwLDGw1Q+$4{R=-L-31LqkJOPR_)M6X(sFw{iX2<;#~< zRaLpUxuvD0g@uK6cXt;R6%`Z|BqStk+_0{ztINT`At)#aXh>mUVWwnmJRt<807*qoM6N<$f&`VT6951J literal 0 HcmV?d00001 diff --git a/textures/wayfinder_helmet.png b/textures/wayfinder_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e7fe7654128b03ef4920c2cd576c1d4ecdead9 GIT binary patch literal 321 zcmV-H0lxl;P)@E=f<;i4?3(1km$1J;OqR=?MY+Qw zz624+#xM+Fimp7xAZsRXP~?2dfpa*V9~@9hssA7{kpMKLBLH^>;K2ZNq#*#;a%#TY z4bq=qFD?{5eBf>f?HGZ3&HKW0EkibckWAD<+a`8X^xJodlD#U_1x7qX(xT*32Uy)0 zN_MIz=EXOi80oE;{(sIR^FdDrI3&N1p1yPL&KZoD#661;2jW}C#vsROK- z{VqT#5PR5`7Ki?8*6Z~uYz_96az~TgS{QH@E|=1O;77_*mR~xplu}A5_2+y7$*E7F TZJi}e00000NkvXXu0mjfL5+%Z literal 0 HcmV?d00001 diff --git a/textures/wayfinder_leggings.png b/textures/wayfinder_leggings.png new file mode 100644 index 0000000000000000000000000000000000000000..64dbe2015ccbc1bcc7ad8473581edb28197608e0 GIT binary patch literal 276 zcmV+v0qg#WP) Date: Wed, 25 Oct 2023 17:20:50 +0200 Subject: [PATCH 008/345] make diamond tools upgradeable again --- mods/ITEMS/mcl_smithing_table/init.lua | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_smithing_table/init.lua b/mods/ITEMS/mcl_smithing_table/init.lua index 1794f8791..996dcf8a9 100755 --- a/mods/ITEMS/mcl_smithing_table/init.lua +++ b/mods/ITEMS/mcl_smithing_table/init.lua @@ -167,16 +167,19 @@ minetest.register_node("mcl_smithing_table:table", { end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local stackname = stack:get_name() + local def = stack:get_definition() if listname == "upgrade_item" - and string.find(stack:get_name(),"mcl_armor:") -- allow any armor piece to go in (in case the player wants to trim them) - and not mcl_armor.trims.blacklisted[stack:get_name()] + and def._mcl_armor_element -- allow any armor piece to go in (in case the player wants to trim them) + and not mcl_armor.trims.blacklisted[stackname] + or def._mcl_upgradable -- for diamond tools or listname == "mineral" - and mcl_smithing_table.is_smithing_mineral(stack:get_name()) + and mcl_smithing_table.is_smithing_mineral(stackname) or listname == "template" - and string.find(stack:get_name(),"mcl_armor") + and string.find(stackname, "mcl_armor") then return stack:get_count() end From f2eca64e42364bc6f597d1fd552352e4818501cf Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Sun, 18 Jun 2023 20:59:37 +0200 Subject: [PATCH 009/345] Blocks with dig_by_piston no longer fill up the push limit Fix for broken nodes (e.g. sugar cane) not updating and leaving floating bits Short-term fix for minetest.dig_node not always working (checking for group dig_immediate = 3) --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 61 +++++++++++++++------- 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 58e5afd92..d85943e45 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -117,7 +117,7 @@ local function is_available(pos) return false, n end if minetest.registered_nodes[name] then - return minetest.registered_nodes[name].buildable_to, n or false, n + return minetest.registered_nodes[name].buildable_to or minetest.get_item_group(name, "dig_by_piston") == 1, n or false, n end return false, n end @@ -126,6 +126,7 @@ end function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos) -- determine the number of nodes to be pushed local nodes = {} + local dig_nodes = {} local frontiers = {pos} while #frontiers > 0 do @@ -141,8 +142,13 @@ function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos) end if not node_replaceable(nn.name) then - if #nodes >= maximum then return nil, false end - table.insert(nodes, {node = nn, pos = {x=np.x, y=np.y, z=np.z}}) + if minetest.get_item_group(nn.name, "dig_by_piston") == 1 then + -- if we want the node to drop, e.g. sugar cane, do not count towards push limit + table.insert(dig_nodes, {node = nn, pos = {x=np.x, y=np.y, z=np.z}}) + else + table.insert(nodes, {node = nn, pos = {x=np.x, y=np.y, z=np.z}}) + if #nodes > maximum then return nil, nil, false, true end + end -- add connected nodes to frontiers, connected is a vector list -- the vectors must be absolute positions @@ -152,10 +158,9 @@ function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos) and minetest.registered_nodes[nn.name].mvps_sticky then connected, has_loop = minetest.registered_nodes[nn.name].mvps_sticky(np, nn, piston_pos) if has_loop then - return {}, true + return {}, {}, true, false end end - table.insert(connected, vector.add(np, dir)) -- Make sure there are no duplicates in frontiers / nodes before @@ -172,7 +177,7 @@ function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos) duplicate = true end end - if not duplicate and not mesecon.is_mvps_stopper(minetest.get_node(cp)) then + if not duplicate and not mesecon.is_mvps_stopper(minetest.get_node(cp)) and minetest.get_item_group(nn.name, "dig_by_piston") == 0 then table.insert(frontiers, cp) end end @@ -180,7 +185,7 @@ function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos) table.remove(frontiers, 1) end - return nodes, false + return nodes, dig_nodes, false, false end function mesecon.mvps_set_owner(pos, placer) @@ -222,14 +227,14 @@ end -- movedir: direction of actual movement -- maximum: maximum nodes to be pushed function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, piston_pos) - local nodes, has_loop = mesecon.mvps_get_stack(pos, movedir, maximum, piston_pos) + local nodes, dig_nodes, has_loop, too_many = mesecon.mvps_get_stack(pos, movedir, maximum, piston_pos) - if has_loop then + if has_loop or too_many then return false end if not nodes then return end - + local newpos={} -- check node availability to push/pull into, and fill newpos[i] for i in ipairs(nodes) do @@ -253,18 +258,36 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, end end - if are_protected(nodes, player_name) then + local all_nodes = nodes + if dig_nodes and #dig_nodes > 0 then all_nodes = mesecon.mergetable(dig_nodes, nodes) end + if are_protected(all_nodes, player_name) then return end local first_dropper = nil -- remove all nodes - for id, n in ipairs(nodes) do + for id, n in ipairs(all_nodes) do n.meta = minetest.get_meta(n.pos):to_table() - local is_dropper = mesecon.is_mvps_dropper(n.node, movedir, nodes, id) + local is_dropper = mesecon.is_mvps_dropper(n.node, movedir, all_nodes, id) if is_dropper then - --local drops = minetest.get_node_drops(n.node.name, "") - minetest.dig_node(n.pos) + -- minetest.dig_node has been shown to be buggy (https://git.minetest.land/MineClone2/MineClone2/issues/3547) + if minetest.get_item_group(n.node.name, "dig_immediate") == 3 then + -- should dig as normal + minetest.dig_node(n.pos) + else + -- simulate dig_node because nothing drops otherwise + local drops = minetest.get_node_drops(n.node.name, "") + minetest.remove_node(n.pos) + for _, callback in pairs(minetest.registered_on_dignodes) do + callback(n.pos, n) + end + for _, item in ipairs(drops) do + if type(item) ~= "string" then + item = item:get_name() .. item:get_count() + end + minetest.add_item(n.pos, item) + end + end else minetest.remove_node(n.pos) local node_timer = minetest.get_node_timer(n.pos) @@ -273,13 +296,13 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, end end if is_dropper then - first_dropper = id - break + -- get id of the first dropper, but we still let everything else drop, so don't break here + if not first_dropper then first_dropper = id end end end -- update mesecons for removed nodes ( has to be done after all nodes have been removed ) - for id, n in ipairs(nodes) do + for id, n in ipairs(all_nodes) do if first_dropper and id >= first_dropper then break end @@ -287,7 +310,7 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, end -- add nodes - for id, n in ipairs(nodes) do + for id, n in ipairs(all_nodes) do if first_dropper and id >= first_dropper then break end From af206ed8b33ed4bb34b04ae9b0c264255b339d74 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Sun, 18 Jun 2023 21:14:43 +0200 Subject: [PATCH 010/345] All bamboo plant tiles can be broken with pistons --- mods/ITEMS/mcl_bamboo/bamboo_base.lua | 8 ++++---- mods/ITEMS/mcl_bamboo/globals.lua | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_bamboo/bamboo_base.lua b/mods/ITEMS/mcl_bamboo/bamboo_base.lua index 1c7e99a61..0cbea4361 100644 --- a/mods/ITEMS/mcl_bamboo/bamboo_base.lua +++ b/mods/ITEMS/mcl_bamboo/bamboo_base.lua @@ -251,7 +251,7 @@ local bamboo_def = { minetest.register_node(BAMBOO, bamboo_def) local bamboo_top = table.copy(bamboo_def) -bamboo_top.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, flammable = 3} +bamboo_top.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, dig_by_piston = 1, plant = 1, non_mycelium_plant = 1, flammable = 3} bamboo_top.tiles = {"mcl_bamboo_endcap.png"} bamboo_top.drawtype = "plantlike_rooted" --"plantlike" --bamboo_top.paramtype2 = "meshoptions" @@ -361,7 +361,7 @@ bamboo_one_def.selection_box = { {-0.05, -0.5, 0.285, -0.275, 0.5, 0.06}, } } -bamboo_one_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, flammable = 3} +bamboo_one_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, dig_by_piston = 1, plant = 1, non_mycelium_plant = 1, flammable = 3} mcl_bamboo.mcl_log(dump(mcl_bamboo.bamboo_index)) minetest.register_node(mcl_bamboo.bamboo_index[2], bamboo_one_def) local bamboo_two_def = table.copy(bamboo_def) @@ -385,7 +385,7 @@ bamboo_two_def.selection_box = { {0.25, -0.5, 0.325, 0.025, 0.5, 0.100}, } } -bamboo_two_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, flammable = 3} +bamboo_two_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, dig_by_piston = 1, plant = 1, non_mycelium_plant = 1, flammable = 3} minetest.register_node(mcl_bamboo.bamboo_index[3], bamboo_two_def) local bamboo_three_def = table.copy(bamboo_def) @@ -408,5 +408,5 @@ bamboo_three_def.selection_box = { {-0.125, -0.5, 0.125, -0.3125, 0.5, 0.3125}, } } -bamboo_three_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, flammable = 3} +bamboo_three_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, dig_by_piston = 1, plant = 1, non_mycelium_plant = 1, flammable = 3} minetest.register_node(mcl_bamboo.bamboo_index[4], bamboo_three_def) diff --git a/mods/ITEMS/mcl_bamboo/globals.lua b/mods/ITEMS/mcl_bamboo/globals.lua index f96395228..37fafc2fd 100644 --- a/mods/ITEMS/mcl_bamboo/globals.lua +++ b/mods/ITEMS/mcl_bamboo/globals.lua @@ -67,7 +67,7 @@ end local BAMBOO_ENDCAP_NAME = "mcl_bamboo:bamboo_endcap" --- For when I learn more about the pistons... +-- check if supporting block is broken. pistons now break the bamboo plant. function mcl_bamboo.break_orphaned(pos) mcl_bamboo.mcl_log("Break_Orphaned called.") local node_below = minetest.get_node(vector.offset(pos, 0, -1, 0)) From 918b8eee38f9474415470e6c3394f76999dba04d Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Tue, 20 Jun 2023 17:33:45 +0200 Subject: [PATCH 011/345] Fix unsticky defs for shulker_box_small names (some did not exist) --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index d85943e45..814c5d80d 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -930,16 +930,16 @@ mesecon.register_mvps_unsticky("mcl_chests:black_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:blue_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:brown_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:cyan_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:dark_green_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:dark_grey_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:lightblue_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:green_shulker_box_small") -mesecon.register_mvps_unsticky("mcl_chests:grey_shulker_box_small") -mesecon.register_mvps_unsticky("mcl_chests:light_blue_shulker_box_small") -mesecon.register_mvps_unsticky("mcl_chests:lime_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:orange_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:magenta_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:pink_shulker_box_small") -mesecon.register_mvps_unsticky("mcl_chests:purple_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:violet_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:red_shulker_box_small") -mesecon.register_mvps_unsticky("mcl_chests:silver_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:grey_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:white_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:yellow_shulker_box_small") -- Snow From 058684f17f8ae824dda9ced84224fc3002b824d6 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Sun, 2 Jul 2023 13:08:59 +0200 Subject: [PATCH 012/345] Improve dig_node simulation and fix duplication --- mods/ITEMS/REDSTONE/mesecons/util.lua | 9 +++++++++ mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 17 ++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons/util.lua b/mods/ITEMS/REDSTONE/mesecons/util.lua index b6602526a..12dbc0240 100644 --- a/mods/ITEMS/REDSTONE/mesecons/util.lua +++ b/mods/ITEMS/REDSTONE/mesecons/util.lua @@ -246,6 +246,15 @@ function mesecon.mergetable(source, dest) return rval end +-- +function mesecon.join_table(t1, t2) + local rval = mesecon.tablecopy(t2) + for i, v in ipairs(t1) do + table.insert(rval, mesecon.tablecopy(v)) + end + return rval +end + function mesecon.register_node(name, spec_common, spec_off, spec_on) spec_common.drop = spec_common.drop or name .. "_off" spec_common.on_blast = spec_common.on_blast or mesecon.on_blastnode diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 814c5d80d..f282f4dca 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -234,7 +234,7 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, end if not nodes then return end - + local newpos={} -- check node availability to push/pull into, and fill newpos[i] for i in ipairs(nodes) do @@ -259,7 +259,7 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, end local all_nodes = nodes - if dig_nodes and #dig_nodes > 0 then all_nodes = mesecon.mergetable(dig_nodes, nodes) end + if dig_nodes and #dig_nodes > 0 then all_nodes = mesecon.join_table(dig_nodes, nodes) end if are_protected(all_nodes, player_name) then return end @@ -270,13 +270,11 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, n.meta = minetest.get_meta(n.pos):to_table() local is_dropper = mesecon.is_mvps_dropper(n.node, movedir, all_nodes, id) if is_dropper then - -- minetest.dig_node has been shown to be buggy (https://git.minetest.land/MineClone2/MineClone2/issues/3547) - if minetest.get_item_group(n.node.name, "dig_immediate") == 3 then - -- should dig as normal - minetest.dig_node(n.pos) - else - -- simulate dig_node because nothing drops otherwise + -- if current node has already been destroyed (e.g. chain reaction of sugar cane breaking), skip it + if minetest.get_node(n.pos).name == n.node.name then + -- simulate dig_node using handle_node_drops local drops = minetest.get_node_drops(n.node.name, "") + local counted_drops = {} minetest.remove_node(n.pos) for _, callback in pairs(minetest.registered_on_dignodes) do callback(n.pos, n) @@ -285,8 +283,9 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, if type(item) ~= "string" then item = item:get_name() .. item:get_count() end - minetest.add_item(n.pos, item) + table.insert(counted_drops, item) end + minetest.handle_node_drops(n.pos, counted_drops) end else minetest.remove_node(n.pos) From 5d8688dbebfccf31c27ce7dca500236cedceffd3 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Sun, 2 Jul 2023 14:30:36 +0200 Subject: [PATCH 013/345] Change tall flowers to `buildable_to = false` --- mods/ITEMS/mcl_flowers/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index e89d01b65..24b07428a 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -252,7 +252,7 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im paramtype2 = paramtype2, palette = palette, walkable = false, - buildable_to = true, + buildable_to = false, drop = drop_bottom, _mcl_shears_drop = shears_drop, _mcl_fortune_drop = fortune_drop, @@ -354,7 +354,7 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im paramtype2 = paramtype2, palette = palette, walkable = false, - buildable_to = true, + buildable_to = false, selection_box = { type = "fixed", fixed = { -selbox_radius, -0.5, -selbox_radius, selbox_radius, selbox_top_height, selbox_radius }, From 089e3d46f18b1f09dc03a2b35ea152b996b7f110 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Sun, 2 Jul 2023 16:54:56 +0200 Subject: [PATCH 014/345] Several more blocks comply with MC piston mechanics. --- mods/ITEMS/mcl_bells/init.lua | 2 +- mods/ITEMS/mcl_lanterns/init.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_bells/init.lua b/mods/ITEMS/mcl_bells/init.lua index 32bdfe3d7..46b8b9f89 100644 --- a/mods/ITEMS/mcl_bells/init.lua +++ b/mods/ITEMS/mcl_bells/init.lua @@ -33,7 +33,7 @@ minetest.register_node("mcl_bells:bell", { "mcl_bells_bell_side.png", }, is_ground_content = false, - groups = {pickaxey=2, deco_block=1 }, + groups = {pickaxey=2, deco_block=1, dig_by_piston=1 }, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 5, _mcl_hardness = 5, diff --git a/mods/ITEMS/mcl_lanterns/init.lua b/mods/ITEMS/mcl_lanterns/init.lua index 5be325e48..f978358b7 100644 --- a/mods/ITEMS/mcl_lanterns/init.lua +++ b/mods/ITEMS/mcl_lanterns/init.lua @@ -118,7 +118,7 @@ function mcl_lanterns.register_lantern(name, def) node_placement_prediction = "", sunlight_propagates = true, light_source = def.light_level, - groups = {pickaxey = 1, attached_node = 1, deco_block = 1, lantern = 1}, + groups = {pickaxey = 1, attached_node = 1, deco_block = 1, lantern = 1, dig_by_piston=1}, selection_box = { type = "fixed", fixed = { From e5829f719d10d4c8376bcce3b603f42261ecb8e3 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Sun, 2 Jul 2023 17:08:44 +0200 Subject: [PATCH 015/345] All signs are mvps_stopper upon registration All buttons are mvps_unsticky upon registration Add some missing unmovable nodes Bamboo trapdoor is now sticky --- mods/ITEMS/REDSTONE/mesecons_button/init.lua | 5 +++ mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 36 +++++--------------- mods/ITEMS/mcl_signs/signs_api.lua | 34 ++++++++++++++++++ 3 files changed, 48 insertions(+), 27 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_button/init.lua b/mods/ITEMS/REDSTONE/mesecons_button/init.lua index 275cac2e2..b812ea956 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_button/init.lua @@ -211,6 +211,11 @@ function mesecon.register_button(basename, description, texture, recipeitem, sou output = "mesecons_button:button_"..basename.."_off", recipe = {{ recipeitem }}, }) + + if minetest.get_modpath("mesecons_mvps") then + mesecon.register_mvps_unsticky("mesecons_button:button_"..basename.."_off") + mesecon.register_mvps_unsticky("mesecons_button:button_"..basename.."_on") + end end mesecon.register_button( diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index f282f4dca..12bfd0ca8 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -433,10 +433,8 @@ mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_on") mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_off") mesecon.register_mvps_stopper("mcl_banners:hanging_banner") mesecon.register_mvps_stopper("mcl_banners:standing_banner") -mesecon.register_mvps_stopper("mcl_campfires:campfire") -mesecon.register_mvps_stopper("mcl_campfires:campfire_lit") -mesecon.register_mvps_stopper("mcl_campfires:soul_campfire") -mesecon.register_mvps_stopper("mcl_campfires:soul_campfire_lit") +mesecon.register_mvps_stopper("mcl_beehives:bee_nest") +mesecon.register_mvps_stopper("mcl_beehives:beehive") -- Unmovable by technical restrictions. -- Open formspec would screw up if node is destroyed (minor problem) @@ -467,13 +465,14 @@ mesecon.register_mvps_stopper("mcl_chests:trapped_chest") mesecon.register_mvps_stopper("mcl_chests:trapped_chest_small") mesecon.register_mvps_stopper("mcl_chests:trapped_chest_left") mesecon.register_mvps_stopper("mcl_chests:trapped_chest_right") -mesecon.register_mvps_stopper("mcl_signs:wall_sign") -mesecon.register_mvps_stopper("mcl_signs:standing_sign") -mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5") -mesecon.register_mvps_stopper("mcl_signs:standing_sign45") -mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5") mesecon.register_mvps_stopper("mcl_barrels:barrel_open") mesecon.register_mvps_stopper("mcl_barrels:barrel_closed") +mesecon.register_mvps_stopper("mcl_campfires:campfire") +mesecon.register_mvps_stopper("mcl_campfires:campfire_lit") +mesecon.register_mvps_stopper("mcl_campfires:soul_campfire") +mesecon.register_mvps_stopper("mcl_campfires:soul_campfire_lit") +mesecon.register_mvps_stopper("mcl_lectern:lectern") +mesecon.register_mvps_stopper("mcl_grindstone:grindstone") -- Unmovable by design: objects @@ -517,8 +516,6 @@ mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_2") mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_3") mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_door") -mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_trapdoor") -mesecon.register_mvps_unsticky("mcl_signs:wall_sign_bamboo") mesecon.register_mvps_unsticky("mcl_bamboo:scaffolding") -- Beds @@ -554,21 +551,6 @@ mesecon.register_mvps_unsticky("mcl_beds:bed_white_top") mesecon.register_mvps_unsticky("mcl_beds:bed_white_bottom") mesecon.register_mvps_unsticky("mcl_beds:bed_yellow_top") mesecon.register_mvps_unsticky("mcl_beds:bed_yellow_bottom") --- Buttons -mesecon.register_mvps_unsticky("mesecons_button:button_stone_off") -mesecon.register_mvps_unsticky("mesecons_button:button_stone_on") -mesecon.register_mvps_unsticky("mesecons_button:button_wood_off") -mesecon.register_mvps_unsticky("mesecons_button:button_wood_on") -mesecon.register_mvps_unsticky("mesecons_button:button_acaciawood_off") -mesecon.register_mvps_unsticky("mesecons_button:button_acaciawood_on") -mesecon.register_mvps_unsticky("mesecons_button:button_birchwood_off") -mesecon.register_mvps_unsticky("mesecons_button:button_birchwood_on") -mesecon.register_mvps_unsticky("mesecons_button:button_darkwood_off") -mesecon.register_mvps_unsticky("mesecons_button:button_darkwood_on") -mesecon.register_mvps_unsticky("mesecons_button:button_sprucewood_off") -mesecon.register_mvps_unsticky("mesecons_button:button_sprucewood_on") -mesecon.register_mvps_unsticky("mesecons_button:button_junglewood_off") -mesecon.register_mvps_unsticky("mesecons_button:button_junglewood_on") -- Cactus, Sugarcane & Vines mesecon.register_mvps_unsticky("mcl_core:cactus") mesecon.register_mvps_unsticky("mcl_core:reeds") @@ -581,7 +563,7 @@ mesecon.register_mvps_unsticky("mcl_cake:cake_4") mesecon.register_mvps_unsticky("mcl_cake:cake_5") mesecon.register_mvps_unsticky("mcl_cake:cake_6") mesecon.register_mvps_unsticky("mcl_cake:cake") --- Carpet +-- Carpet - pullable in MC but breaks when pulled downwards. At the moment, it just cannot be pulled. mesecon.register_mvps_unsticky("mcl_wool:black_carpet") mesecon.register_mvps_unsticky("mcl_wool:blue_carpet") mesecon.register_mvps_unsticky("mcl_wool:brown_carpet") diff --git a/mods/ITEMS/mcl_signs/signs_api.lua b/mods/ITEMS/mcl_signs/signs_api.lua index 7ada6a646..52bb7bbbf 100644 --- a/mods/ITEMS/mcl_signs/signs_api.lua +++ b/mods/ITEMS/mcl_signs/signs_api.lua @@ -764,6 +764,15 @@ function mcl_signs.register_sign (modname, color, _name, ttsign) table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign22_5" .. _name, 1 }) table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign45" .. _name, 2 }) table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign67_5" .. _name, 3 }) + + -- register as unpushable + if minetest.get_modpath("mesecons_mvps") then + mesecon.register_mvps_stopper("mcl_signs:wall_sign" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign45" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5" .. _name) + end end --- The same as register_sign, except caller defines the textures. Note, there is a greyscale version of the sign, @@ -1002,6 +1011,14 @@ function mcl_signs.register_sign_custom (modname, _name, tiles, color, inventory table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign45" .. _name, 2 }) table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign67_5" .. _name, 3 }) + -- register as unpushable + if minetest.get_modpath("mesecons_mvps") then + mesecon.register_mvps_stopper("mcl_signs:wall_sign" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign45" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5" .. _name) + end end --- Override an existing sign, tint the textures, and gives it an unique node name. Creates both wall and standing signs. @@ -1234,6 +1251,15 @@ function mcl_signs.reregister_sign (modname, color, _name, ttsign) table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign22_5" .. _name, 1 }) table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign45" .. _name, 2 }) table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign67_5" .. _name, 3 }) + + -- register as unpushable + if minetest.get_modpath("mesecons_mvps") then + mesecon.register_mvps_stopper("mcl_signs:wall_sign" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign45" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5" .. _name) + end end --- The same as reregister_sign, except caller defines the textures. Note, there is a greyscale version of the sign, @@ -1469,6 +1495,14 @@ function mcl_signs.reregister_sign_custom (modname, _name, tiles, color, invento table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign45" .. _name, 2 }) table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign67_5" .. _name, 3 }) + -- register as unpushable + if minetest.get_modpath("mesecons_mvps") then + mesecon.register_mvps_stopper("mcl_signs:wall_sign" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign45" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5" .. _name) + end end --- Usage: Call this with the mod's name, the wood's item string (for the planks), and with the sign's suffix. From 98cf3b7f7a27733f5672d1349c37d3a02621e625 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Tue, 4 Jul 2023 18:22:05 +0200 Subject: [PATCH 016/345] Check node_replaceable after dig_by_piston Allows tallgrass, nether vines etc to drop --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 65 +++++++++++----------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 12bfd0ca8..b36721e78 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -141,44 +141,43 @@ function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos) return end - if not node_replaceable(nn.name) then - if minetest.get_item_group(nn.name, "dig_by_piston") == 1 then - -- if we want the node to drop, e.g. sugar cane, do not count towards push limit - table.insert(dig_nodes, {node = nn, pos = {x=np.x, y=np.y, z=np.z}}) - else + if minetest.get_item_group(nn.name, "dig_by_piston") == 1 then + -- if we want the node to drop, e.g. sugar cane, do not count towards push limit + table.insert(dig_nodes, {node = nn, pos = {x=np.x, y=np.y, z=np.z}}) + else + if not node_replaceable(nn.name) then table.insert(nodes, {node = nn, pos = {x=np.x, y=np.y, z=np.z}}) if #nodes > maximum then return nil, nil, false, true end - end - - -- add connected nodes to frontiers, connected is a vector list - -- the vectors must be absolute positions - local connected = {} - local has_loop - if minetest.registered_nodes[nn.name] - and minetest.registered_nodes[nn.name].mvps_sticky then - connected, has_loop = minetest.registered_nodes[nn.name].mvps_sticky(np, nn, piston_pos) - if has_loop then - return {}, {}, true, false - end - end - table.insert(connected, vector.add(np, dir)) - - -- Make sure there are no duplicates in frontiers / nodes before - -- adding nodes in "connected" to frontiers - for _, cp in ipairs(connected) do - local duplicate = false - for _, rp in ipairs(nodes) do - if vector.equals(cp, rp.pos) then - duplicate = true + + -- add connected nodes to frontiers, connected is a vector list + -- the vectors must be absolute positions + local connected = {} + local has_loop + if minetest.registered_nodes[nn.name] and minetest.registered_nodes[nn.name].mvps_sticky then + connected, has_loop = minetest.registered_nodes[nn.name].mvps_sticky(np, nn, piston_pos) + if has_loop then + return {}, {}, true, false end end - for _, fp in ipairs(frontiers) do - if vector.equals(cp, fp) then - duplicate = true + table.insert(connected, vector.add(np, dir)) + + -- Make sure there are no duplicates in frontiers / nodes before + -- adding nodes in "connected" to frontiers + for _, cp in ipairs(connected) do + local duplicate = false + for _, rp in ipairs(nodes) do + if vector.equals(cp, rp.pos) then + duplicate = true + end + end + for _, fp in ipairs(frontiers) do + if vector.equals(cp, fp) then + duplicate = true + end + end + if not duplicate and not mesecon.is_mvps_stopper(minetest.get_node(cp)) and minetest.get_item_group(nn.name, "dig_by_piston") == 0 then + table.insert(frontiers, cp) end - end - if not duplicate and not mesecon.is_mvps_stopper(minetest.get_node(cp)) and minetest.get_item_group(nn.name, "dig_by_piston") == 0 then - table.insert(frontiers, cp) end end end From 0580b14310fac1113d9684eb3c9f4f80d058cea8 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Thu, 6 Jul 2023 14:17:54 +0200 Subject: [PATCH 017/345] Vertical pistons now save owner meta --- mods/ITEMS/REDSTONE/mesecons_pistons/init.lua | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua b/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua index 93b8df96d..262ac6eb5 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua @@ -138,14 +138,12 @@ local function piston_off(pos, node) end local function piston_orientate(pos, placer) - mesecon.mvps_set_owner(pos, placer) - -- not placed by player if not placer then return end - + -- placer pitch in degrees local pitch = placer:get_look_vertical() * (180 / math.pi) - + local node = minetest.get_node(pos) local pistonspec = minetest.registered_nodes[node.name].mesecons_piston if pitch > 55 then @@ -153,6 +151,9 @@ local function piston_orientate(pos, placer) elseif pitch < -55 then minetest.add_node(pos, {name=pistonspec.piston_down}) end + + -- set owner meta after setting node, or it will not keep + mesecon.mvps_set_owner(pos, placer) end From 0637182697739f57ebcee109071a29024910a449 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Thu, 6 Jul 2023 15:34:49 +0200 Subject: [PATCH 018/345] Tallgrass and dead bush added to dig_by_piston --- mods/ITEMS/mcl_core/nodes_misc.lua | 4 ++-- mods/ITEMS/mcl_flowers/init.lua | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_misc.lua b/mods/ITEMS/mcl_core/nodes_misc.lua index d830cc310..9986eaf2d 100644 --- a/mods/ITEMS/mcl_core/nodes_misc.lua +++ b/mods/ITEMS/mcl_core/nodes_misc.lua @@ -139,8 +139,8 @@ minetest.register_node("mcl_core:deadbush", { sunlight_propagates = true, walkable = false, buildable_to = true, - groups = {handy = 1, shearsy = 1, flammable = 3, attached_node = 1, plant = 1, non_mycelium_plant = 1, dig_by_water = 1, - destroy_by_lava_flow = 1, deco_block = 1, fire_encouragement = 60, fire_flammability = 100}, + groups = {handy = 1, shearsy = 1, flammable = 3, attached_node = 1, plant = 1, non_mycelium_plant = 1, dig_by_piston = 1, + dig_by_water = 1, destroy_by_lava_flow = 1, deco_block = 1, fire_encouragement = 60, fire_flammability = 100}, drop = { max_items = 1, items = { diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index 24b07428a..10189240b 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -128,8 +128,6 @@ local fortune_wheat_seed_drop = { overwrite = true, } --- CHECKME: How does tall grass behave when pushed by a piston? - --- Tall Grass --- local def_tallgrass = { description = S("Tall Grass"), @@ -155,7 +153,7 @@ local def_tallgrass = { groups = { handy = 1, shearsy = 1, attached_node = 1, deco_block = 1, plant = 1, place_flowerlike = 2, non_mycelium_plant = 1, - flammable = 3, fire_encouragement = 60, fire_flammability = 100, + flammable = 3, fire_encouragement = 60, fire_flammability = 10, dig_by_piston = 1, dig_by_water = 1, destroy_by_lava_flow = 1, compostability = 30, grass_palette = 1 }, sounds = mcl_sounds.node_sound_leaves_defaults(), From 3e12b3c7006aaae64c232834ab78b68980271060 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Thu, 6 Jul 2023 15:41:41 +0200 Subject: [PATCH 019/345] Check protection of certain nodes before push/pull - The node directly in front of a piston (including air) - The 'final' position of any connected nodes --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index b36721e78..d1a1171e8 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -207,6 +207,11 @@ local function are_protected(nodes, player_name) end function mesecon.mvps_push(pos, dir, maximum, player_name, piston_pos) + -- check if the node in front of the piston is protected against player_name (to prevent replacing air) + if minetest.is_protected(pos, player_name) then + return false + end + return mesecon.mvps_push_or_pull(pos, dir, dir, maximum, player_name, piston_pos) end @@ -241,6 +246,9 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, if (newpos[i].x == piston_pos.x) and (newpos[i].y == piston_pos.y) and (newpos[i].z == piston_pos.z) then return end + if minetest.is_protected(newpos[i], player_name) then + return + end if not is_available(newpos[i]) then local available = false for j in ipairs(nodes) do From 378df76e5f122f354289d16c1fe3c07c4be222dc Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Mon, 16 Oct 2023 22:06:52 +0200 Subject: [PATCH 020/345] Prevent signs from being replaced by pushed/pulled blocks --- mods/ITEMS/mcl_signs/signs_api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_signs/signs_api.lua b/mods/ITEMS/mcl_signs/signs_api.lua index 52bb7bbbf..2c0908124 100644 --- a/mods/ITEMS/mcl_signs/signs_api.lua +++ b/mods/ITEMS/mcl_signs/signs_api.lua @@ -85,7 +85,7 @@ end mcl_signs = {} -- GLOBALS -mcl_signs.sign_groups = { handy = 1, axey = 1, deco_block = 1, material_wood = 1, attached_node = 1, dig_by_piston = 1, flammable = -1 } +mcl_signs.sign_groups = { handy = 1, axey = 1, deco_block = 1, material_wood = 1, attached_node = 1, flammable = -1 } --- colors used for wools. mcl_signs.mcl_wool_colors = { unicolor_white = "#FFFFFF", From 520fd773fbc06d896f4e13dce419aff03fce4456 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Mon, 16 Oct 2023 22:07:52 +0200 Subject: [PATCH 021/345] Fix random crash when piston breaks node with no player --- mods/HUD/mcl_inventory/creative.lua | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index bb2f226a2..5dfc2b7ae 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -741,12 +741,14 @@ if minetest.is_creative_enabled("") then for _, item in ipairs(drops) do minetest.add_item(pos, item) end - end - local inv = digger:get_inventory() - if inv then - for _, item in ipairs(drops) do - if not inv:contains_item("main", item, true) then - inv:add_item("main", item) + else + -- If there is a player + local inv = digger:get_inventory() + if inv then + for _, item in ipairs(drops) do + if not inv:contains_item("main", item, true) then + inv:add_item("main", item) + end end end end From c37da143dacc0e64f019dce3ab6217fb03781cc8 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Mon, 16 Oct 2023 22:08:17 +0200 Subject: [PATCH 022/345] Add crying obsidian and lodestone to mvps_stoppers --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index d1a1171e8..9534d66c9 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -423,6 +423,7 @@ mesecon.register_mvps_stopper("mcl_core:realm_barrier") mesecon.register_mvps_stopper("mcl_core:void") mesecon.register_mvps_stopper("mcl_core:bedrock") mesecon.register_mvps_stopper("mcl_core:obsidian") +mesecon.register_mvps_stopper("mcl_core:crying_obsidian") mesecon.register_mvps_stopper("mcl_chests:ender_chest") mesecon.register_mvps_stopper("mcl_chests:ender_chest_small") mesecon.register_mvps_stopper("mcl_mobspawners:spawner") @@ -442,6 +443,7 @@ mesecon.register_mvps_stopper("mcl_banners:hanging_banner") mesecon.register_mvps_stopper("mcl_banners:standing_banner") mesecon.register_mvps_stopper("mcl_beehives:bee_nest") mesecon.register_mvps_stopper("mcl_beehives:beehive") +mesecon.register_mvps_stopper("mcl_compass:lodestone") -- Unmovable by technical restrictions. -- Open formspec would screw up if node is destroyed (minor problem) From 00cfca5947d28c824a6973a512d1f1bb1b3f7c99 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Mon, 23 Oct 2023 12:13:12 +0200 Subject: [PATCH 023/345] Make carpet sticky again --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 9534d66c9..88ca9d30e 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -572,23 +572,6 @@ mesecon.register_mvps_unsticky("mcl_cake:cake_4") mesecon.register_mvps_unsticky("mcl_cake:cake_5") mesecon.register_mvps_unsticky("mcl_cake:cake_6") mesecon.register_mvps_unsticky("mcl_cake:cake") --- Carpet - pullable in MC but breaks when pulled downwards. At the moment, it just cannot be pulled. -mesecon.register_mvps_unsticky("mcl_wool:black_carpet") -mesecon.register_mvps_unsticky("mcl_wool:blue_carpet") -mesecon.register_mvps_unsticky("mcl_wool:brown_carpet") -mesecon.register_mvps_unsticky("mcl_wool:cyan_carpet") -mesecon.register_mvps_unsticky("mcl_wool:green_carpet") -mesecon.register_mvps_unsticky("mcl_wool:grey_carpet") -mesecon.register_mvps_unsticky("mcl_wool:light_blue_carpet") -mesecon.register_mvps_unsticky("mcl_wool:lime_carpet") -mesecon.register_mvps_unsticky("mcl_wool:orange_carpet") -mesecon.register_mvps_unsticky("mcl_wool:magenta_carpet") -mesecon.register_mvps_unsticky("mcl_wool:pink_carpet") -mesecon.register_mvps_unsticky("mcl_wool:purple_carpet") -mesecon.register_mvps_unsticky("mcl_wool:red_carpet") -mesecon.register_mvps_unsticky("mcl_wool:silver_carpet") -mesecon.register_mvps_unsticky("mcl_wool:white_carpet") -mesecon.register_mvps_unsticky("mcl_wool:yellow_carpet") -- Carved & Jack O'Lantern Pumpkins, Pumpkin & Melon mesecon.register_mvps_unsticky("mcl_farming:pumpkin_face") mesecon.register_mvps_unsticky("mcl_farming:pumpkin_face_light") From 9b2b8ee56e5ea643b3dca671034af980a365da5d Mon Sep 17 00:00:00 2001 From: Dehydrate6684 Date: Sun, 5 Nov 2023 14:06:53 +0800 Subject: [PATCH 024/345] Removed direction checks --- mods/ITEMS/mcl_core/nodes_climb.lua | 36 +++----------------------- mods/ITEMS/mcl_doors/api_trapdoors.lua | 3 +-- 2 files changed, 5 insertions(+), 34 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index c1514926f..609dd3cb9 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -11,42 +11,15 @@ local function rotate_climbable(pos, node, user, mode) return false end ----Checks the direction (param2) of a ladder and a trapdoor and determine if they are ----facing the same direction. ---- ----@param ladder integer The param2 value of the ladder. ----@param trapdoor integer The param2 value of the trapdoor. ----@return boolean If the ladder and trapdoor are in the same direction. -function mcl_core.check_direction(ladder, trapdoor) - local convert_table = { - { 1, 23 }, - { 3, 21 }, - { 0, 20 }, - { 2, 22 }, - } - - local conversion = convert_table[ladder - 1]; - if not conversion then - return false - elseif conversion[1] == trapdoor or conversion[2] == trapdoor then - return true - end - - return false -end - ---Updates the trapdoor above (if any). --- ---@param pos mt.Vector The position of the ladder. ----@param ladder integer The param2 value of the ladder. ---@param event "place" | "destruct" The place or destruct event. -local function update_trapdoor(pos, ladder, event) +local function update_trapdoor(pos, event) local top_pos = vector.offset(pos, 0, 1, 0) local top_node = minetest.get_node_or_nil(top_pos) - - if top_node and minetest.get_item_group(top_node.name, "trapdoor") == 2 - and mcl_core.check_direction(ladder, top_node.param2) then + if top_node and minetest.get_item_group(top_node.name, "trapdoor") == 2 then local new_name = top_node.name if event == "place" then new_name = string.gsub(new_name, "open$", "ladder") @@ -142,11 +115,10 @@ minetest.register_node("mcl_core:ladder", { return itemstack end, after_destruct = function(pos, old) - update_trapdoor(pos, old.param2, "destruct") + update_trapdoor(pos, "destruct") end, after_place_node = function(pos) - local me = minetest.get_node(pos) - update_trapdoor(pos, me.param2, "place") + update_trapdoor(pos, "place") end, _mcl_blast_resistance = 0.4, _mcl_hardness = 0.4, diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index 17765f27e..8bbefdda3 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -79,8 +79,7 @@ function mcl_doors:register_trapdoor(name, def) -- Checking if there is something underneath the trapdoor if bottom_node then local is_ladder = minetest.get_item_group(bottom_node.name, "ladder") - local same_direction = mcl_core.check_direction(bottom_node.param2, me.param2) - if is_ladder > 0 and same_direction then + if is_ladder > 0 then name_end = "_ladder" end end From e5a260b56304e5cd959c54879c87728a86df8ef7 Mon Sep 17 00:00:00 2001 From: Dehydrate6684 Date: Sun, 5 Nov 2023 14:10:58 +0800 Subject: [PATCH 025/345] Added vines and skulk vines to ladder group --- mods/ITEMS/mcl_core/nodes_climb.lua | 15 +++++++++++---- mods/ITEMS/mcl_sculk/init.lua | 18 ++++++++++++++++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 609dd3cb9..0de0e9abd 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -15,7 +15,7 @@ end --- ---@param pos mt.Vector The position of the ladder. ---@param event "place" | "destruct" The place or destruct event. -local function update_trapdoor(pos, event) +function mcl_core.update_trapdoor(pos, event) local top_pos = vector.offset(pos, 0, 1, 0) local top_node = minetest.get_node_or_nil(top_pos) @@ -115,10 +115,10 @@ minetest.register_node("mcl_core:ladder", { return itemstack end, after_destruct = function(pos, old) - update_trapdoor(pos, "destruct") + mcl_core.update_trapdoor(pos, "destruct") end, after_place_node = function(pos) - update_trapdoor(pos, "place") + mcl_core.update_trapdoor(pos, "place") end, _mcl_blast_resistance = 0.4, _mcl_hardness = 0.4, @@ -158,7 +158,8 @@ minetest.register_node("mcl_core:vine", { flammable = 2, fire_encouragement = 15, fire_flammability = 100, - foliage_palette_wallmounted = 1 + foliage_palette_wallmounted = 1, + ladder = 1 }, sounds = mcl_sounds.node_sound_leaves_defaults(), drop = "", @@ -230,6 +231,12 @@ minetest.register_node("mcl_core:vine", { minetest.registered_nodes[node.name].on_dig(below, node, digger) end end, + after_destruct = function(pos, old) + mcl_core.update_trapdoor(pos, "destruct") + end, + after_place_node = function(pos) + mcl_core.update_trapdoor(pos, "place") + end, _mcl_blast_resistance = 0.2, diff --git a/mods/ITEMS/mcl_sculk/init.lua b/mods/ITEMS/mcl_sculk/init.lua index b2ef04152..4af60178e 100644 --- a/mods/ITEMS/mcl_sculk/init.lua +++ b/mods/ITEMS/mcl_sculk/init.lua @@ -215,9 +215,23 @@ minetest.register_node("mcl_sculk:vein", { type = "wallmounted", }, groups = { - handy = 1, axey = 1, shearsy = 1, swordy = 1, deco_block = 1, - dig_by_piston = 1, destroy_by_lava_flow = 1, sculk = 1, dig_by_water = 1, + handy = 1, + axey = 1, + shearsy = 1, + swordy = 1, + deco_block = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + sculk = 1, + dig_by_water = 1, + ladder = 1 }, + after_destruct = function(pos, old) + mcl_core.update_trapdoor(pos, "destruct") + end, + after_place_node = function(pos) + mcl_core.update_trapdoor(pos, "place") + end, sounds = sounds, drop = "", _mcl_shears_drop = true, From 952a96b57d93d770202fcf5fe2b6a8983a5447fb Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Sun, 5 Nov 2023 20:35:13 +0100 Subject: [PATCH 026/345] fix leggings trim textures --- textures/silence_leggings.png | Bin 575 -> 641 bytes textures/wayfinder_leggings.png | Bin 276 -> 97 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/textures/silence_leggings.png b/textures/silence_leggings.png index ee4e23dfe241067b62311ca266fe4b181233b3a3..83b18c856fc0676a0389bb5faadc0be18a99462e 100644 GIT binary patch literal 641 zcmV-{0)G98P)>{D&8gnF1%)&*5k%BW(ZUjF_%bC0tk*1@es2D;H zV-rP)iC&c>evExWiRH$MN+;0p7l)&5xIJ5TJh>&NQ_{P}40@tO+y*?2b}1{$7jtnlQ5->l(r8IpQql-e8ht8G zu9YY*17@L(t+FW?fGTkjzgB0>SK_5;HZQ9TPm2q-fn5d+LlZoPBvir~HsoL2d;}fP z4hg8=jQDF=nfri#sDr!E1!1Rx%$eg*1GUf(;}D1QW|V}u>ws2S2@O!^MCdY|aNcF>zc}(2sP+sfM5|bwUt=vrd&Xp~yKwzvB#E#ThJc7H55c z0A+m}ID^H`emfhODL3*3Ock~0xAiogaT?&T2+-5&NvqHbsbw@M2$bgL_!uAK7JtK^ z^S4$~SyA3wQ+$%o|LULd&-OQa&0eq>?_I6P^Vgu*Rx@wmom=NbfoZ4&0V?+eeSiou z)PQ+(ePHhud~Cq^Yy!HVhBaz2|B*d;0t~zzh3py$ z8uou(e@O4s5wR@pkV$e+w2G@FMW)4qNbTt3qEW<1igd08^1Z;H=TT)$w99T;E^o>n zHm}X-z51y3fSr;Zvh6p0NbLK&fFvrRMKU1w(1TUtM00000NkvXXu0mjfL6;*3 literal 575 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`0VEi{?^Rd~q?k&A{DK+&M^9AR%D}+*!_&nv zB;(%OnTC0{9YkE_^IT=Tv-0zuBToeHEZtlokV@n@ za!mE=)!T>X9!NYL#F=pD1e3@c1 zNvN-lEZ5m4)5z8QfZdkiJHvg3ilyzp?|)7H8nSvN!$%H>W^K2_t=kzaOSp{;Hnl_^ zGrnNecK*ojb<5=n6864PXAbc`y(nq>j~V6XUdoAh+h4Y_+jVDxW9zbA>@!l|UoO5q zw_Lq1i}Tu3`O{ey_Z@k8W3jopZn5 zJFxh0lq2t_PQJx+LB`EYM8`vJKVyA%Jc@Lz3ynC0u22ire0f>MU3 LtDnm{r-UW|0bup7 diff --git a/textures/wayfinder_leggings.png b/textures/wayfinder_leggings.png index 64dbe2015ccbc1bcc7ad8473581edb28197608e0..096b5056781f496d55e47421a7d016c0acc30a5f 100644 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH$P6TB1iv{Bq?iMILR^9L@+#X~K#H*>$S;_| p;n|HeAcx1(#W6%eGFgJPf{}qyfq_w2tP7-v!PC{xWt~$(699zd6aoMM literal 276 zcmV+v0qg#WP) Date: Mon, 6 Nov 2023 20:22:46 +0100 Subject: [PATCH 027/345] Fixed the wayfinder --- textures/wayfinder_leggings.png | Bin 97 -> 4354 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/textures/wayfinder_leggings.png b/textures/wayfinder_leggings.png index 096b5056781f496d55e47421a7d016c0acc30a5f..48da69e7b4fc1f4f903b88a40c4e894cc5135962 100644 GIT binary patch literal 4354 zcmeHKeM}qY89#>*f-_P!mI^Jf9FCeo%Gvi}8{Z8RgUyEtCN8*zlx6ez?rbixeU9&p z4b2uxLzM)Yq)FGUS(-wtWoeQ|YbzSMb}O_YgtBC7t9AKWK}nmYO#(w(*GYx4_s&2- ztu!I6|6$3#d!P6B{NCsJJY6yZ->}9qp@U(z0yf^{;I$vQ4g^;N|@sEH#EWn2YgV2#Q?_ID1pxMwgBg#ic!#jP!oK>V=ikxW{^|`?kFx z!IznC`pKV@u24spo_%?9*F*1SttmN|&}UisW9O2)%E}LKh;&rLx|fDBUie_!_74X8 z;gi?j4P);;tiGIE`|6qr{GIbx?)_}+aLH386&K82M{a(;?D8Xoe!29$XZpVy zs2Te3kFiy2sBV-Z)_b+r ztJP_@TBoxCIUM@g6XvqFEg5}3t?qhmMXxt?>sjYBx1Q7N=~5RTP2Jr3VCJ7n-|Vnk z_g}r5-F3E=mAkc7S10!uwWZ&+=gYB?53h}6_88Xg_D1?t zj#K9(Jc|{N7u{Gfaiegtb@-k>{JITG92$%4h3ZBeQ*JJFo4gFP&a_ zn)vmry|HJ1Ra3sdd|PEc{a)g(RZnXl9zWB41MkNhi35l4y}ql}lQful;>n7~V+T#g zHd7yq8}~kNrmnrK+`<3-z#q^>H5FgU)pzMV#nU? zr$2A|X#cJEI-JecYJ&%nNlfnT)fUn^3@);%x0qk5vQLpXQy z#jd^YC&AWDzX>)!YIVO+cJXGx=*aC`w}*%qzxp}k!ovqkcNAoSu8Z-YyJ{U36e9$* zG%I*GZ7dK1Z3jX5>tZ3A*}_S%hx744vu5=5H#IQNnl&{B2kHn}xq7~=Da=(jRl1m_ zEey$O))lDpV-z3=a1ss20{);##mpLomjdsyS*L*&h_uD5sdYGEs}Sa3y;iS9k>VKN zfNKiWaDJHeQdPE+DGD$$Yw9H_MCo+VXjB^|v_jaY!$^|Up|}pm5r9C%#-K#Ukf69) zrigRcIFSkSA&D1)u*^w&gotF;Xuv!?9bX{iaLmvL#VHkl9=aGE(qURu7YOKPdx%nT z10b0S=o>vm7uck_Dozw4VTLPi;DXZX*%T}@;~$EI{YpA4qvQNs06;~sDmG`yQoF-B z;~`7n;{zeZ3y3`jDe>MrV$F$7o>9`79SCrr;hlq?&Rqcml*2*U1STSfXSbO(^7<4j zFg!~suMA@}p&lGV@{BBj=nb?Hp*hBckQm9aq`_-o4D2i_dr*|kTHtt5C5FRU(7~G$8B+x za4>5s_+TViIXM+K@uoR=EY-H_#WiKBIrb!6GOFxUU8SpLV;v} zu(aH#fIzW>TqtXpqa`8i5(K|lBU8Y#=ghPNY$ukMXd5kYfE2|E3d1PW=)zG7$0>}w z4+X5Uh*$wO zlI)J+q)(PDNxM5Ot$s-qm|}KYq02PLxYHA#cOO+1qFK##kL*iGNNDSPW#1xg;@b0z z+Dp!_EitY5-S5+XbYBjdGrYBRms;h+6H`B3Wi0GneC6d^i5aaeEoYXuC*DdvaiN{v zpwFS*OTX)?T))2It<@c9-lJhZ$0kRiY K+D;a^TmB1Wq8wEK delta 79 zcmZotN}M3!$;iyWz%V2D&2b>b9N-h;3Z$1;+1>(Dj3q&S!3+-1ZlnP@Jf1F&Arg|w b608-B42%j4jKX4FAUzD8u6{1-oD!M<`~ecX From 52b65554d9e68362214302af700aedb347a96687 Mon Sep 17 00:00:00 2001 From: Araca Date: Mon, 6 Nov 2023 20:12:36 +0000 Subject: [PATCH 028/345] Do not output enchanted item if enchantment is impossible (#3998) To Fix #3672 , I avoid displaying the output item if enchantment is not possible for various reason * Level of added enchantment is below the one from input item * Incompatible enchantment Co-authored-by: Araca <> Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3998 Reviewed-by: the-real-herowl Co-authored-by: Araca Co-committed-by: Araca --- mods/ITEMS/mcl_enchanting/engine.lua | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index b5766dd28..67ef72056 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -180,16 +180,18 @@ function mcl_enchanting.combine(itemstack, combine_with) 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 + 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 - elseif mcl_enchanting.item_supports_enchantment(itemname, enchantment) then + 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 @@ -199,24 +201,18 @@ function mcl_enchanting.combine(itemstack, combine_with) 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 - local any_enchantment = false - for enchantment, enchantment_level in pairs(enchantments) do - if enchantment_level > 0 then - any_enchantment = true - break - end - end - if any_enchantment then + if any_new_enchantment then itemstack:set_name(enchanted_itemname) + mcl_enchanting.set_enchantments(itemstack, enchantments) end - mcl_enchanting.set_enchantments(itemstack, enchantments) - return true + return any_new_enchantment end function mcl_enchanting.enchantments_snippet(_, _, itemstack) From ae5564e6581eedcb02e949cb6305b8b57e0247df Mon Sep 17 00:00:00 2001 From: codiac Date: Sun, 10 Sep 2023 21:33:37 +1000 Subject: [PATCH 029/345] Make golem go home. Fixes #3288 --- mods/ENTITIES/mobs_mc/iron_golem.lua | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mobs_mc/iron_golem.lua index 6b428c6f8..9cdb6aa10 100644 --- a/mods/ENTITIES/mobs_mc/iron_golem.lua +++ b/mods/ENTITIES/mobs_mc/iron_golem.lua @@ -9,7 +9,8 @@ local S = minetest.get_translator("mobs_mc") --################### IRON GOLEM --################### -local etime = 0 +local walk_dist = 40 +local tele_dist = 80 mcl_mobs.register_mob("mobs_mc:iron_golem", { description = S("Iron Golem"), @@ -85,11 +86,23 @@ mcl_mobs.register_mob("mobs_mc:iron_golem", { punch_start = 40, punch_end = 50, }, jump = true, - on_step = function(self,dtime) - etime = etime + dtime - if etime > 10 then - if self._home and vector.distance(self._home,self.object:get_pos()) > 50 then - self:gopath(self._home) + do_custom = function(self, dtime) + self.home_timer = (self.home_timer or 0) + dtime + + if self.home_timer > 10 then + self.home_timer = 0 + if self._home then + local dist = vector.distance(self._home,self.object:get_pos()) + if dist >= tele_dist then + self.object:set_pos(self._home) + self.state = "stand" + self.order = "follow" + elseif dist >= walk_dist then + self:gopath(self._home, function(self) + self.state = "stand" + self.order = "follow" + end) + end end end end, From 06f9486e4dac1cb9143d333fa8d45c61eba3a088 Mon Sep 17 00:00:00 2001 From: codiac Date: Mon, 11 Sep 2023 15:18:39 +1000 Subject: [PATCH 030/345] Do not go home if attacking --- mods/ENTITIES/mobs_mc/iron_golem.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mobs_mc/iron_golem.lua index 9cdb6aa10..2d081e4fe 100644 --- a/mods/ENTITIES/mobs_mc/iron_golem.lua +++ b/mods/ENTITIES/mobs_mc/iron_golem.lua @@ -91,7 +91,7 @@ mcl_mobs.register_mob("mobs_mc:iron_golem", { if self.home_timer > 10 then self.home_timer = 0 - if self._home then + if self._home and self.state ~= "attack" then local dist = vector.distance(self._home,self.object:get_pos()) if dist >= tele_dist then self.object:set_pos(self._home) From 89c97690c8960731b37eabb794c32df204316924 Mon Sep 17 00:00:00 2001 From: codiac Date: Wed, 13 Sep 2023 15:21:19 +1000 Subject: [PATCH 031/345] Add a setting to enable mod nav hacks --- mods/ENTITIES/mobs_mc/iron_golem.lua | 3 ++- settingtypes.txt | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mobs_mc/iron_golem.lua index 2d081e4fe..b79971b9b 100644 --- a/mods/ENTITIES/mobs_mc/iron_golem.lua +++ b/mods/ENTITIES/mobs_mc/iron_golem.lua @@ -4,6 +4,7 @@ --License for code WTFPL and otherwise stated in readmes local S = minetest.get_translator("mobs_mc") +local allow_nav_hacks = minetest.settings:get_bool("mcl_mob_allow_nav_hacks ",false) --################### --################### IRON GOLEM @@ -93,7 +94,7 @@ mcl_mobs.register_mob("mobs_mc:iron_golem", { self.home_timer = 0 if self._home and self.state ~= "attack" then local dist = vector.distance(self._home,self.object:get_pos()) - if dist >= tele_dist then + if allow_nav_hacks and dist >= tele_dist then self.object:set_pos(self._home) self.state = "stand" self.order = "follow" diff --git a/settingtypes.txt b/settingtypes.txt index 82086de14..0b466f76f 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -207,6 +207,10 @@ mcl_mobs_overworld_threshold (Artificial light threshold to stop monster spawns mcl_mobs_overworld_sky_threshold (Skylight threshold to stop monster spawns in the Overworld) int 7 0 14 mcl_mobs_overworld_passive_threshold (Combined light threshold to stop animal and npc spawns in the Overworld) int 7 0 14 +# Enable workarounds for faulty mob navigation. +# Hack 1: teleport golems home if they are very far from home +mcl_mob_allow_nav_hacks (Mob navigation hacks) bool false + [Audio] # Enable flame sound. flame_sound (Flame sound) bool true From 71282e196eda35f748506de8918bf3433b5c5dde Mon Sep 17 00:00:00 2001 From: codiac Date: Sun, 24 Sep 2023 22:19:06 +1000 Subject: [PATCH 032/345] Move mob nav hacks to Experimental --- settingtypes.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/settingtypes.txt b/settingtypes.txt index 0b466f76f..6d4bfb9e8 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -207,10 +207,6 @@ mcl_mobs_overworld_threshold (Artificial light threshold to stop monster spawns mcl_mobs_overworld_sky_threshold (Skylight threshold to stop monster spawns in the Overworld) int 7 0 14 mcl_mobs_overworld_passive_threshold (Combined light threshold to stop animal and npc spawns in the Overworld) int 7 0 14 -# Enable workarounds for faulty mob navigation. -# Hack 1: teleport golems home if they are very far from home -mcl_mob_allow_nav_hacks (Mob navigation hacks) bool false - [Audio] # Enable flame sound. flame_sound (Flame sound) bool true @@ -294,6 +290,10 @@ fix_doubleplants (Mcimport double plant fixes) bool true # Allow players to create Minecraft-like maps. enable_real_maps (Enable Real Maps) bool true +# Enable workarounds for faulty mob navigation. +# Hack 1: teleport golems home if they are very far from home +mcl_mob_allow_nav_hacks (Mob navigation hacks) bool false + [Additional Features] # Enable Bookshelf inventories mcl_bookshelf_inventories (Enable bookshelf inventories) bool true From 32ef89aca3c0e2ac7072712694f7b98b7638ecb4 Mon Sep 17 00:00:00 2001 From: Aliaksei Urbanski Date: Sat, 11 Nov 2023 21:01:45 +0000 Subject: [PATCH 033/345] Fix minor README's imperfections (#4001) I've prepared some minor changes for `README`s. Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4001 Reviewed-by: the-real-herowl Co-authored-by: Aliaksei Urbanski Co-committed-by: Aliaksei Urbanski --- README.md | 14 +++++++------- README_locale/README.fr.md | 2 +- README_locale/README.ru.md | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 287ded5d9..4dc0ee92d 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Or you can play in “creative mode” in which you can build almost anything in ## How to play (quick start) ### Getting started * **Punch a tree** trunk until it breaks and collect wood -* Place the **wood into the 2×2 grid** (your “crafting grid” in your inventory menu and craft 4 wood planks +* Place the **wood into the 2×2 grid** (your “crafting grid” in your inventory menu) and craft 4 wood planks * Place the 4 wood planks in a 2×2 shape in the crafting grid to **make a crafting table** * **Rightclick the crafting table** for a 3×3 crafting grid to craft more complex things * Use the **crafting guide** (book icon) to learn all the possible crafting recipes @@ -37,15 +37,15 @@ Or you can play in “creative mode” in which you can build almost anything in ### Farming * Find seeds -* Craft hoe -* Rightclick dirt or similar block with hoe to create farmland +* Craft a hoe +* Rightclick dirt or a similar block with a hoe to create farmland * Place seeds on farmland and watch them grow -* Collect plant when fully grown +* Collect plants when fully grown * If near water, farmland becomes wet and speeds up growth ### Furnace -* Craft furnace -* Furnace allows you to obtain more items +* Craft a furnace +* The furnace allows you to obtain more items * Upper slot must contain a smeltable item (example: iron ore) * Lower slot must contain a fuel item (example: coal) * See tooltips in crafting guide to learn about fuels and smeltable items @@ -162,7 +162,7 @@ Bonus features (not found in Minecraft): * Built-in crafting guide which shows you crafting and smelting recipes * In-game help system containing extensive help about gameplay basics, blocks, items and more * Temporary crafting recipes. They only exist to make some otherwise unaccessible items available when you're not in creative mode. These recipes will be removed as development goes on an more features become available -* Saplings in chests in mapgen v6 +* Saplings in chests in [mapgen v6](https://wiki.minetest.net/Map_generator#v6) * Fully moddable (thanks to Minetest's powerful Lua API) * New blocks and items: * Lookup tool, shows you the help for whatever it touches diff --git a/README_locale/README.fr.md b/README_locale/README.fr.md index 9317f09f3..624e540da 100644 --- a/README_locale/README.fr.md +++ b/README_locale/README.fr.md @@ -137,7 +137,7 @@ Fonctionnalités bonus (absentes de Minecraft) : * Guide d'artisanat intégré au jeu qui montre les recettes d'artisanat et de cuisson * Système d'aide intégré au jeu contenant des informations à propos des techniques de base, blocs, objets et plus * Recettes d'artisanat temporaires. Elles existent uniquement pour rendre des objets accessibles qui ne le seraient pas autrement sauf en mode créatif. Elles seront retirées au cours de l'avancement du développement et de l'ajout de nouvelles fonctionnalités. -* Pousses dans les coffres en mapgen v6 +* Pousses dans les coffres en [mapgen v6](https://wiki.minetest.net/Map_generator#v6) * Entièrement moddable (grâce la puissante API Lua de Minetest) * Nouveaux blocs et objets : * Outil de recherche, montre l'aide de ce qu'il touche diff --git a/README_locale/README.ru.md b/README_locale/README.ru.md index ebf7f0b26..99fe93db8 100644 --- a/README_locale/README.ru.md +++ b/README_locale/README.ru.md @@ -154,12 +154,12 @@ Mineclone2, то ветка master обычно относительно ста * Некоторые вагонетки (с сундуком и с воронкой уже работают) * Пара нетривиальных блоков и предметов -Бонусные воронкой (нет в Minecraft-е): +Бонусные возможности (нет в Minecraft-е): * Встроенный гайд для крафта покажет вам рецепты крафта и переплавки * Внутриигровая справка содержит всестороннюю информацию об основах игры, блоках, предметах и прочее * Временные рецепты крафта. Они существуют, чтобы получить доступ к ранее недоступным предметам вне творческого режима. Они будут удалены как только разработка позволит им стать доступными -* Саженцы в сундуках мапгена v6 +* Саженцы в сундуках в [mapgen v6](https://wiki.minetest.net/Map_generator#v6) * Полностью модифицируема (благодаря мощному Lua API в Minetest) * Новые блоки и предметы: * Инструмент просмотра покажет справку о том чего коснется @@ -177,7 +177,7 @@ Mineclone2, то ветка master обычно относительно ста * Недостающие блоки, предметы, мобы * Некоторые предметы с другими названиями, чтобы лучше их различать * Другая музыка для проигрывателей -* Другие текступы (Pixel Perfection) +* Другие текстуры (Pixel Perfection) * Другие звуки (разные источники) * Другой движок (Minetest) * Другие пасхалки From 378b8f8f6c181086a4f71cc1987028cdec2a4909 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 13:35:12 +0100 Subject: [PATCH 034/345] Fix item not dropping at tool last use --- mods/ENTITIES/mcl_item_entity/init.lua | 113 +++++++++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 149b5ed93..2feeb640c 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -362,6 +362,119 @@ function minetest.handle_node_drops(pos, drops, digger) end end +local function user_name(user) + return user and user:get_player_name() or "" +end + +-- Returns a logging function. For empty names, does not log. +local function make_log(name) + return name ~= "" and minetest.log or function() end +end + +function minetest.node_dig(pos, node, digger) + local diggername = user_name(digger) + local log = make_log(diggername) + local def = minetest.registered_nodes[node.name] + -- Copy pos because the callback could modify it + if def and (not def.diggable or + (def.can_dig and not def.can_dig(vector.copy(pos), digger))) then + log("info", diggername .. " tried to dig " + .. node.name .. " which is not diggable " + .. minetest.pos_to_string(pos)) + return false + end + + if minetest.is_protected(pos, diggername) then + log("action", diggername + .. " tried to dig " .. node.name + .. " at protected position " + .. minetest.pos_to_string(pos)) + minetest.record_protection_violation(pos, diggername) + return false + end + + log('action', diggername .. " digs " + .. node.name .. " at " .. minetest.pos_to_string(pos)) + + local wielded = digger and digger:get_wielded_item() + local drops = minetest.get_node_drops(node, wielded and wielded:get_name()) + + -- Check to see if metadata should be preserved. + if def and def.preserve_metadata then + local oldmeta = minetest.get_meta(pos):to_table().fields + -- Copy pos and node because the callback can modify them. + local pos_copy = vector.copy(pos) + local node_copy = {name=node.name, param1=node.param1, param2=node.param2} + local drop_stacks = {} + for k, v in pairs(drops) do + drop_stacks[k] = ItemStack(v) + end + drops = drop_stacks + def.preserve_metadata(pos_copy, node_copy, oldmeta, drops) + end + + -- Handle drops + minetest.handle_node_drops(pos, drops, digger) + + if wielded then + local wdef = wielded:get_definition() + local tp = wielded:get_tool_capabilities() + local dp = minetest.get_dig_params(def and def.groups, tp, wielded:get_wear()) + if wdef and wdef.after_use then + wielded = wdef.after_use(wielded, digger, node, dp) or wielded + else + -- Wear out tool + if not minetest.is_creative_enabled(diggername) then + wielded:add_wear(dp.wear) + if wielded:get_count() == 0 and wdef.sound and wdef.sound.breaks then + minetest.sound_play(wdef.sound.breaks, { + pos = pos, + gain = 0.5 + }, true) + end + end + end + digger:set_wielded_item(wielded) + end + + local oldmetadata = nil + if def and def.after_dig_node then + oldmetadata = minetest.get_meta(pos):to_table() + end + + -- Remove node and update + minetest.remove_node(pos) + + -- Play sound if it was done by a player + if diggername ~= "" and def and def.sounds and def.sounds.dug then + minetest.sound_play(def.sounds.dug, { + pos = pos, + exclude_player = diggername, + }, true) + end + + -- Run callback + if def and def.after_dig_node then + -- Copy pos and node because callback can modify them + local pos_copy = vector.copy(pos) + local node_copy = {name=node.name, param1=node.param1, param2=node.param2} + def.after_dig_node(pos_copy, node_copy, oldmetadata, digger) + end + + -- Run script hook + for _, callback in ipairs(minetest.registered_on_dignodes) do + local origin = minetest.callback_origins[callback] + minetest.set_last_run_mod(origin.mod) + + -- Copy pos and node because callback can modify them + local pos_copy = vector.copy(pos) + local node_copy = {name=node.name, param1=node.param1, param2=node.param2} + callback(pos_copy, node_copy, digger) + end + + return true +end + -- Drop single items by default function minetest.item_drop(itemstack, dropper, pos) if dropper and dropper:is_player() then From a764818e13522dac881bb5078da78bc10d92956a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikita=20Wi=C5=9Bniewski?= Date: Tue, 14 Nov 2023 15:35:30 +0000 Subject: [PATCH 035/345] Add a new 'pumpkin' group (#4012) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Creates a new 'pumpkin' group, which combines Pumpkin, Faceless Pumkin and Jack o'Lantern under a shared category. This helps tidy up the mesecons_noteblock code a bit, and possibly other mods too. Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4012 Reviewed-by: the-real-herowl Co-authored-by: Mikita Wiśniewski Co-committed-by: Mikita Wiśniewski --- mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua | 4 ++-- mods/ITEMS/mcl_farming/pumpkin.lua | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua index ac56d8bc5..b841545b3 100644 --- a/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua @@ -152,8 +152,6 @@ function mesecon.noteblock_play(pos, param2) soundname="mesecons_noteblock_xylophone_metal" elseif block_below_name == "mcl_nether:soul_sand" then soundname="mesecons_noteblock_cowbell" - elseif block_below_name == "mcl_farming:pumpkin" or block_below_name == "mcl_farming:pumpkin_face" or block_below_name == "mcl_farming:pumpkin_face_light" then - soundname="mesecons_noteblock_didgeridoo" elseif block_below_name == "mcl_core:emeraldblock" then soundname="mesecons_noteblock_squarewave" elseif block_below_name == "mcl_farming:hay_block" then @@ -162,6 +160,8 @@ function mesecon.noteblock_play(pos, param2) soundname="mesecons_noteblock_piano_digital" elseif minetest.get_item_group(block_below_name, "wool") ~= 0 then soundname="mesecons_noteblock_guitar" + elseif minetest.get_item_group(block_below_name, "pumpkin") ~= 0 then + soundname="mesecons_noteblock_didgeridoo" elseif minetest.get_item_group(block_below_name, "material_glass") ~= 0 then soundname="mesecons_noteblock_hit" elseif minetest.get_item_group(block_below_name, "material_wood") ~= 0 then diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua index 7387a78c9..7354c0038 100644 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ b/mods/ITEMS/mcl_farming/pumpkin.lua @@ -101,7 +101,7 @@ local pumpkin_base_def = { tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png"}, groups = { handy = 1, axey = 1, plant = 1, building_block = 1, dig_by_piston = 1, dig_immediate_piston = 1, - enderman_takable = 1, compostability = 65 + pumpkin = 1, enderman_takable = 1, compostability = 65 }, sounds = mcl_sounds.node_sound_wood_defaults(), on_rotate = on_rotate, @@ -199,7 +199,7 @@ minetest.register_node("mcl_farming:pumpkin_face_light", { paramtype2 = "facedir", light_source = minetest.LIGHT_MAX, tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_face_light.png"}, - groups = {handy=1,axey=1, building_block=1, dig_by_piston=1 }, + groups = {handy=1, axey=1, pumpkin=1, building_block=1, dig_by_piston=1 }, sounds = mcl_sounds.node_sound_wood_defaults(), on_construct = function(pos) -- Attempt to spawn iron golem or snow golem From e53d9ec8d73bb634bfbab6f9cc3bbc14159344e3 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sat, 18 Nov 2023 02:30:33 +0100 Subject: [PATCH 036/345] Added comments --- mods/ENTITIES/mcl_item_entity/init.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 2feeb640c..c12bd045e 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -362,15 +362,16 @@ function minetest.handle_node_drops(pos, drops, digger) end end +-- the following code is pulled from Minetest builtin without changes except for the call order being changed, +-- until a comment saying explicitly it's the end of such code +-- TODO if this gets a fix in the engine, remove the block of code local function user_name(user) return user and user:get_player_name() or "" end - -- Returns a logging function. For empty names, does not log. local function make_log(name) return name ~= "" and minetest.log or function() end end - function minetest.node_dig(pos, node, digger) local diggername = user_name(digger) local log = make_log(diggername) @@ -474,6 +475,7 @@ function minetest.node_dig(pos, node, digger) return true end +-- end of code pulled from Minetest -- Drop single items by default function minetest.item_drop(itemstack, dropper, pos) From 6ee2dbe70c2f082421dafafc368a243c3e04b849 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Sat, 18 Nov 2023 21:21:17 +0000 Subject: [PATCH 037/345] Add MineCraft like sleeping player hud (#4011) This adds a sleeping hud/actionbar that'll be displayed to players currently not sleeping. Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4011 Reviewed-by: the-real-herowl Co-authored-by: chmodsayshello Co-committed-by: chmodsayshello --- mods/ITEMS/mcl_beds/functions.lua | 9 +++++++++ mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr | 3 ++- mods/ITEMS/mcl_beds/locale/template.txt | 3 ++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index fdb4f8f41..6c59fff04 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -383,6 +383,15 @@ function mcl_beds.on_rightclick(pos, player, is_top) end if message then mcl_title.set(player, "actionbar", {text=message, color="white", stay=60}) + else -- someone just successfully entered a bed + local connected_players = minetest.get_connected_players() + local sleep_hud_message = S("@1/@2 players currently in bed.", player_in_bed, players_in_bed_setting() * #connected_players / 100) + for _, player in pairs(connected_players) do + if not mcl_beds.player[player:get_player_name()] then -- only send message to players not sleeping. + if mcl_title.params_get(player) then mcl_title.clear(player) end -- clear, old message is still being displayed + mcl_title.set(player, "actionbar", {text=sleep_hud_message, color="white", stay=60}) + end + end end else lay_down(player, nil, nil, false) diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr index 97867b44b..6771596a5 100644 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr @@ -46,4 +46,5 @@ send!=senden! You are missing the 'shout' privilege! It's required in order to talk in chat...=Ihnen fehlt das 'shout' Privileg! Es wird benötigt, um im Chat reden zu können... You exceeded the maximum number of messages per 10 seconds!=Sie haben die maximale Anzahl an Chatnachrichten pro 10 Sekunden überschritten! Hey! Would you guys mind sleeping?=Hey, würdet Ihr bitte zu Bett gehen? -Sorry, but you have to wait @1 seconds until you may use this button again!=Sie müssen leider noch @1 Sekunden warten, bevor sie diesen Knopf erneut benutzen können! \ No newline at end of file +Sorry, but you have to wait @1 seconds until you may use this button again!=Sie müssen leider noch @1 Sekunden warten, bevor sie diesen Knopf erneut benutzen können! +@1/@2 players currently in bed.=@1/@2 Spieler aktuell im Bett. \ No newline at end of file diff --git a/mods/ITEMS/mcl_beds/locale/template.txt b/mods/ITEMS/mcl_beds/locale/template.txt index 42e59509e..e604299e0 100644 --- a/mods/ITEMS/mcl_beds/locale/template.txt +++ b/mods/ITEMS/mcl_beds/locale/template.txt @@ -46,4 +46,5 @@ send!= You are missing the 'shout' privilege! It's required in order to talk in chat...= You exceeded the maximum number of messages per 10 seconds!= Hey! Would you guys mind sleeping?= -Sorry, but you have to wait @1 seconds until you may use this button again!= \ No newline at end of file +Sorry, but you have to wait @1 seconds until you may use this button again!= +@1/@2 players currently in bed.= \ No newline at end of file From 4df6f82c649f5899288aa88511880de0648d78fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Sat, 18 Nov 2023 22:20:02 +0000 Subject: [PATCH 038/345] Fix spanish translation errors (#4018) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4018 Reviewed-by: the-real-herowl Co-authored-by: José M Co-committed-by: José M --- mods/ENVIRONMENT/lightning/locale/lightning.es.tr | 3 +-- mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr | 7 +++++-- .../REDSTONE/mcl_dispensers/locale/mcl_dispensers.es.tr | 5 ++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/mods/ENVIRONMENT/lightning/locale/lightning.es.tr b/mods/ENVIRONMENT/lightning/locale/lightning.es.tr index 5d207a5c6..3b164f530 100644 --- a/mods/ENVIRONMENT/lightning/locale/lightning.es.tr +++ b/mods/ENVIRONMENT/lightning/locale/lightning.es.tr @@ -1,4 +1,3 @@ # textdomain: lightning -@1 was struck by lightning.=@ 1 fue alcanzado por un rayo. -Let lightning strike at the specified position or yourself=Deje que un rayo golpee en la posición especificada o sobre usted mismo. +Let lightning strike at the specified position or player.No parameter will strike yourself.=Deje que un rayo golpee en la posición especificada o jugador.Ningún parámetro le golpeará a usted mismo. No position specified and unknown player=Ninguna posición especificada y jugador desconocido diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr index 6f00d76b7..19f18703b 100644 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr @@ -108,7 +108,10 @@ Put lava in a bucket.=Pon lava en un cubo. Hero of the Village=Héroe de la aldea Successfully defend a village from a raid=Defiende una aldea de una invasión Voluntary Exile=Exilio voluntario -Kill a raid captain. Maybe consider staying away from the local villages for the time being...=Mata al capitán de una invasión. -Sería mejor alejarte de las aldeas por un tiempo... +Kill a raid captain. Maybe consider staying away from the local villages for the time being...=Mata al capitán de una invasión. Sería mejor alejarte de las aldeas por un tiempo... Tactical Fishing=Pesca táctica Catch a fish... without a fishing rod!=Atrapa a un pez... ¡sin una caña de pescar! +Crafting a New Look=Forjando una nueva imagen +Craft a trimmed armor at a Smithing Table=Decora una armadura en una mesa de herrería +Smithing with Style=Forjando con estilo +Apply these smithing templates at least once: Spire, Snout, Rib, Ward, Silence, Vex, Tide, Wayfinder=Aplica estos moldes de herrería al menos una vez: agujas, hocico, costillas, guardián, silencio, vex, mareas, buscacaminos diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.es.tr b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.es.tr index cf695307a..1b1481f5c 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.es.tr +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.es.tr @@ -2,12 +2,13 @@ Dispenser=Dispensador A dispenser is a block which acts as a redstone component which, when powered with redstone power, dispenses an item. It has a container with 9 inventory slots.=Un dispensador es un bloque que actúa como un componente de redstone que, cuando se alimenta con energía de redstone, dispensa un artículo. Tiene un contenedor con 9 ranuras de inventario. Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Use the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a random item.=Coloque el dispensador en una de las 6 direcciones posibles. El "agujero" es donde los artículos saldrán volando del dispensador. Use el dispensador para acceder a su inventario. Inserte los artículos que desea dispensar. Proporcione al dispensador energía de redstone una vez para dispensar un elemento aleatorio: +The dispenser will do different things, depending on the dispensed item:= El dispensador hará diferentes cosas, dependiendo del artículo dispensado: • Arrows: Are launched=• Flechas: Se lanzan • Eggs and snowballs: Are thrown=• Huevos y bolas de nieve: Son lanzados • Fire charges: Are fired in a straight line=• Cargas de fuego: Se disparan en línea recta • Armor: Will be equipped to players and armor stands=• Armadura: Estará equipada para jugadores y armaduras • Boats: Are placed on water or are dropped=• Barcas: Se colocan en el agua o se dejan caer -• Minecart: Are placed on rails or are dropped=• Carro de minas: Se colocan sobre rieles o se dejan caer = +• Minecart: Are placed on rails or are dropped=• Carro de minas: Se colocan sobre rieles o se dejan caer • Bone meal: Is applied on the block it is facing=• Harina de hueso: Se aplica en el bloque que está enfrentando • Empty buckets: Are used to collect a liquid source=• Cubos vacíos: Se utilizan para recolectar una fuente líquida • Filled buckets: Are used to place a liquid source=• Cubos llenos: Se utilizan para colocar una fuente de líquido @@ -20,3 +21,5 @@ Place the dispenser in one of 6 possible directions. The “hole” is where ite Downwards-Facing Dispenser=Dispensador orientado hacia abajo Upwards-Facing Dispenser=Dispensador orientado hacia arriba Inventory=Inventario +9 inventory slots=9 ranuras de inventario +Launches item when powered by redstone power=Laza un artículo cuando recibe energía de redstone From 7cbba73d50b63954c401c53f8a041e1f4f6c8e08 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 23 Nov 2023 00:32:23 +0000 Subject: [PATCH 039/345] Combat (mostly PvE) rebalancing (#4005) -Added short mob invulnerability time after being hit -Added separate shorter range for hitting mobs (as opposed to node interaction) -Reworked mob knockback -Slowed down natural health regeneration from saturation -Added a setting for the saturation health regen speed Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4005 Reviewed-by: the-real-herowl Co-authored-by: Eliy21 Co-committed-by: Eliy21 --- mods/ENTITIES/mcl_mobs/combat.lua | 44 ++++++++++++++++++++++++++----- mods/ENTITIES/mcl_mobs/init.lua | 1 + mods/ITEMS/mcl_bows/bow.lua | 2 +- mods/PLAYER/mcl_hunger/init.lua | 5 ++-- settingtypes.txt | 4 +++ 5 files changed, 46 insertions(+), 10 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index 7775c1b8e..6952f6581 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -532,11 +532,28 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) return end + local time_now = minetest.get_us_time() + local is_player = hitter:is_player() if is_player then + local time_diff = time_now - self.invul_timestamp + + -- check for invulnerability time in microseconds (0.5 second) + if time_diff <= 500000 and time_diff >= 0 then + return + end + + local mob_pos = self.object:get_pos() + local player_pos = hitter:get_pos() + + -- is mob out of reach? + if vector.distance(mob_pos, player_pos) > 3 then + return + end + -- is mob protected? - if self.protected and minetest.is_protected(self.object:get_pos(), hitter:get_player_name()) then + if self.protected and minetest.is_protected(mob_pos, hitter:get_player_name()) then return end @@ -545,7 +562,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) end -- set/update 'drop xp' timestamp if hitted by player - self.xp_timestamp = minetest.get_us_time() + self.xp_timestamp = time_now end @@ -657,6 +674,9 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) -- do damage self.health = self.health - damage + -- give invulnerability + self.invul_timestamp = time_now + -- skip future functions if dead, except alerting others if self:check_for_death( "hit", {type = "punch", puncher = hitter}) then die = true @@ -672,10 +692,10 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) if not v then return end local r = 1.4 - math.min(punch_interval, 1.4) local kb = r * (math.abs(v.x)+math.abs(v.z)) - local up = 2 + local up = 2.625 if die==true then - kb=kb*2 + kb=kb*1.25 end -- if already in air then dont go up anymore when hit @@ -689,7 +709,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) if tool_capabilities.damage_groups["knockback"] then kb = tool_capabilities.damage_groups["knockback"] else - kb = kb * 1.5 + kb = kb * 1.25 end @@ -699,9 +719,19 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) end if hitter and is_player then local wielditem = hitter:get_wielded_item() - kb = kb + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") - elseif luaentity and luaentity._knockback then + local hv = hitter:get_velocity() + local dir_dot = (hv.x * dir.x) + (hv.z * dir.z) + local player_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) + local mob_mag = math.sqrt((v.x * v.x) + (v.z * v.z)) + kb = kb + 9 * mcl_enchanting.get_enchantment(wielditem, "knockback") + -- add player velocity to mob knockback + if dir_dot > 0 and mob_mag <= player_mag * 0.625 then + kb = kb + ((math.abs(hv.x) + math.abs(hv.z)) * r) + end + elseif luaentity and luaentity._knockback and die == false then kb = kb + luaentity._knockback + elseif luaentity and luaentity._knockback and die == true then + kb = kb + luaentity._knockback * 0.25 end self._kb_turn = true self._turn_to=self.object:get_yaw()-1.57 diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 843315039..630548f12 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -171,6 +171,7 @@ function mcl_mobs.register_mob(name, def) xp_min = def.xp_min or 0, xp_max = def.xp_max or 0, xp_timestamp = 0, + invul_timestamp = 0, breath_max = def.breath_max or 15, breathes_in_water = def.breathes_in_water or false, physical = true, diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 23b6b4310..174208c3c 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -48,7 +48,7 @@ function mcl_bows.shoot_arrow(arrow_item, pos, dir, yaw, shooter, power, damage, damage = damage + (enchantments.power + 1) / 4 end if enchantments.punch then - knockback = enchantments.punch * 3 + knockback = enchantments.punch * 21 end if enchantments.flame then mcl_burning.set_on_fire(obj, math.huge) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index 321139c5f..cc3965f57 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -146,8 +146,9 @@ minetest.register_globalstep(function(dtime) local food_level = mcl_hunger.get_hunger(player) local food_saturation_level = mcl_hunger.get_saturation(player) local player_health = player:get_hp() + local max_tick_timer = tonumber(minetest.settings:get("mcl_health_regen_delay")) or 4 - if food_tick_timer > 4.0 then + if food_tick_timer > max_tick_timer then food_tick_timer = 0 -- let hunger work always @@ -173,7 +174,7 @@ minetest.register_globalstep(function(dtime) end end - elseif food_tick_timer > 0.5 and food_level == 20 and food_saturation_level > 0 then -- fast regeneration + elseif food_tick_timer > max_tick_timer and food_level == 20 and food_saturation_level > 0 then -- fast regeneration if player_health > 0 and player_health < 20 then food_tick_timer = 0 player:set_hp(player_health+1) diff --git a/settingtypes.txt b/settingtypes.txt index 6d4bfb9e8..c2f97c817 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -95,6 +95,10 @@ mcl_creative_dig_speed (Creative mode dig speed) float 0.2 # If enabled the hunger mechanic will be active mcl_enable_hunger (Hunger mechanic) bool true +# Health regeneration delay when hunger bar is full +# Default:4 +mcl_health_regen_delay (Health regen delay) float 4 0 + [Mobs] # If enabled, mobs will spawn naturally. This does not affect # affect mob spawners. From 86da47b922df22fd36e1121ea8e1d2fb3e6c8dfc Mon Sep 17 00:00:00 2001 From: 3raven <3raven@noreply.git.minetest.land> Date: Sat, 25 Nov 2023 01:08:06 +0000 Subject: [PATCH 040/345] French translation update (#4006) Update french translation, add missing chain, fix typo Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4006 Reviewed-by: AFCMS Co-authored-by: 3raven <3raven@noreply.git.minetest.land> Co-committed-by: 3raven <3raven@noreply.git.minetest.land> --- .../ENTITIES/mcl_boats/locale/mcl_boats.fr.tr | 2 ++ mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr | 14 +++++++++-- .../mcl_raids/locale/mcl_raids.fr.tr | 2 ++ mods/HELP/mcl_doc/locale/template.txt | 1 + mods/HUD/awards/locale/awards.fr.tr | 6 +++++ .../locale/mcl_achievements.fr.tr | 4 ++++ mods/HUD/mcl_credits/locale/mcl_credits.fr.tr | 7 +++++- .../mcl_ver_info/locale/mcl_ver_info.fr.tr | 1 + mods/ITEMS/REDSTONE/mesecons_button/init.lua | 2 +- .../locale/mesecons_button.fr.tr | 1 + .../locale/mesecons_button.ru.tr | 2 +- .../mesecons_button/locale/template.txt | 2 +- mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr | 3 ++- mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr | 1 + .../mcl_banners/locale/mcl_banners.fr.tr | 1 + mods/ITEMS/mcl_beds/locale/mcl_beds.fr.tr | 6 +++++ mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr | 2 +- .../locale/mcl_cherry_blossom.fr.tr | 24 +++++++++++++++++++ mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr | 2 ++ .../locale/mcl_flowerpots.fr.tr | 1 + .../mcl_portals/locale/mcl_portals.fr.tr | 12 +++++----- .../mcl_sus_stew/locale/mcl_sus_stew.fr.tr | 2 ++ mods/PLAYER/mcl_music/locale/mcl_music.fr.tr | 7 ++++++ 23 files changed, 91 insertions(+), 14 deletions(-) create mode 100644 mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.fr.tr create mode 100644 mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.fr.tr create mode 100644 mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.fr.tr create mode 100644 mods/PLAYER/mcl_music/locale/mcl_music.fr.tr diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr index e1ecd9b01..2ea047154 100644 --- a/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr @@ -12,6 +12,7 @@ Water vehicle=Véhicule aquatique Sneak to dismount=Se baisser pour descendre Obsidian Boat=Bateau en obsidienne Mangrove Boat=Bateau en palétuvier +Cherry Boat=Bateau en cerisier Oak Chest Boat=Bateau en chêne avec coffre Spruce Chest Boat=Bateau en sapin avec coffre Birch Chest Boat=Bateau en bouleau avec coffre @@ -19,3 +20,4 @@ Jungle Chest Boat=Bateau en acajou avec coffre Acacia Chest Boat=Bateau en acacia avec coffre Dark Oak Chest Boat=Bateau en chêne noir avec coffre Mangrove Chest Boat=Bateau en palétuvier avec coffre +Cherry Chest Boat=Bateau en cerisier avec coffre diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr index 81c93a33b..2c71ff47e 100644 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr @@ -21,6 +21,7 @@ Mule=Mule Iron Golem=Golem de fer Llama=Lama Ocelot=Ocelot +Cat=Chat Parrot=Perroquet Pig=Cochon Polar Bear=Ours blanc @@ -48,8 +49,15 @@ Witch=Sorcière Wither=Wither Wolf=Loup Husk=Zombie Momifié +Baby Husk=Bébé Zombie Momifié Zombie=Zombie -Zombie Piglin=Zombie Cochon +Baby Zombie=Bébé Zombie +Piglin=Piglin +Baby Piglin=Bébé Piglin +Zombie Piglin=Piglin Zombie +Baby Zombie Piglin=Bébé Piglin Zombie +Sword Piglin=Piglin avec une épée +Piglin Brute=Piglin Barbare Farmer=Fermier Fisherman=Pêcheur Fletcher=Archer @@ -69,5 +77,7 @@ Dolphin=Dauphin Pillager=Pilleur Tropical fish=Poisson tropical Hoglin=Hoglin +Baby hoglin=Bébé Hoglin +Zoglin=Zoglin Strider=Arpenteur -Glow Squid=Poulpe Brillant \ No newline at end of file +Glow Squid=Poulpe Brillant diff --git a/mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.fr.tr b/mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.fr.tr new file mode 100644 index 000000000..92d40e998 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.fr.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_raids +Ominous Banner=Bannière de mauvais augure diff --git a/mods/HELP/mcl_doc/locale/template.txt b/mods/HELP/mcl_doc/locale/template.txt index de652f05e..ec825644c 100644 --- a/mods/HELP/mcl_doc/locale/template.txt +++ b/mods/HELP/mcl_doc/locale/template.txt @@ -2,6 +2,7 @@ Water can flow into this block and cause it to drop as an item.= This block can be turned into dirt with a hoe.= This block can be turned into farmland with a hoe.= +This block can be turned into grass path with a shovel.= This block acts as a soil for all saplings.= This block acts as a soil for some saplings.= Sugar canes will grow on this block.= diff --git a/mods/HUD/awards/locale/awards.fr.tr b/mods/HUD/awards/locale/awards.fr.tr index 567c86818..7c3fd2a84 100644 --- a/mods/HUD/awards/locale/awards.fr.tr +++ b/mods/HUD/awards/locale/awards.fr.tr @@ -62,3 +62,9 @@ Advancement “@1” does not exist.=Le progrès «@1» n'existe pas. Mine a block: @1=Miner un bloc : @1 Mine blocks: @1×@2=Miner des blocs : @1×@2 Awards are disabled, enable them first by using /awards enable!=Les récompenses sont désactivées, activez les d'abord en utilisant /awards enable ! +Goal Completed:=Objectif atteint : +Goal Completed!=Objectif atteint ! +Goal Completed: @1=Objectif atteint : @1 +Challenge Completed:=Défi relevé : +Challenge Completed!=Défi relevé ! +Challenge Completed: @1=Défi relevé : @1 diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr index 95800d5e9..238846cc3 100644 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr @@ -111,3 +111,7 @@ Voluntary Exile=Exil volontaire Kill a raid captain. Maybe consider staying away from the local villages for the time being...=Tuez un capitaine de pillards. Mieux vaut rester loin des villages pour l'instant... Tactical Fishing=Pêche tactique Catch a fish... without a fishing rod!=Attrapez un poisson... sans canne à pêche ! +Crafting a New Look=Motif de Jalousie +Craft a trimmed armor at a Smithing Table=Fabriquez une pièce d'armure ornée sur la table de forge +Smithing with Style=La classe de la cuirasse +Apply these smithing templates at least once: Spire, Snout, Rib, Ward, Silence, Vex, Tide, Wayfinder=Appliquez ces modèles de forge au moins une fois : Tour, Groin, Côte, Abîme, Silence, Vex, Marée, Éclaireur \ No newline at end of file diff --git a/mods/HUD/mcl_credits/locale/mcl_credits.fr.tr b/mods/HUD/mcl_credits/locale/mcl_credits.fr.tr index b34249eff..4007ad4bc 100644 --- a/mods/HUD/mcl_credits/locale/mcl_credits.fr.tr +++ b/mods/HUD/mcl_credits/locale/mcl_credits.fr.tr @@ -5,10 +5,15 @@ Contributors=Contributeurs Creator of MineClone=Créateur de MineClone Creator of MineClone2=Créateur de MineClone2 Developers=Développeurs +Past Developers=Anciens Développeurs Jump to speed up (additionally sprint)=Saut pour accélérer (peut être combiné avec sprint) Maintainers=Mainteneurs +Previous Maintainers=Anciens Mainteneurs MineClone5=MineClone5 Original Mod Authors=Auteurs des mods originaux Sneak to skip=Shift pour passer Textures=Textures -Translations=Traductions \ No newline at end of file +Translations=Traductions +Music=Musique +Funders=Fondateurs +Special thanks=Remerciements spéciaux diff --git a/mods/HUD/mcl_ver_info/locale/mcl_ver_info.fr.tr b/mods/HUD/mcl_ver_info/locale/mcl_ver_info.fr.tr index 3e6c9af6d..0a5d2bfd0 100644 --- a/mods/HUD/mcl_ver_info/locale/mcl_ver_info.fr.tr +++ b/mods/HUD/mcl_ver_info/locale/mcl_ver_info.fr.tr @@ -1,2 +1,3 @@ # textdomain: mcl_ver_info Sorry, but your version of Minetest doesn't support the latest API. Please upgrade your minetest.=Désolé, mais votre version de Minetest ne supporte la dernière API. Veuillez mettre à jour minetest. +Display Mineclone 2 game version.=Affiche la version de Mineclone 2. diff --git a/mods/ITEMS/REDSTONE/mesecons_button/init.lua b/mods/ITEMS/REDSTONE/mesecons_button/init.lua index b812ea956..8e2159045 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_button/init.lua @@ -108,7 +108,7 @@ function mesecon.register_button(basename, description, texture, recipeitem, sou if groups_off.material_wood ~= 0 then longdesc = S("A wooden button is a redstone component made out of wood which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1.5 seconds. Wooden buttons may also be pushed by arrows.") else - longdesc = S("A button is a redstone compent which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.", button_timer) + longdesc = S("A button is a redstone component which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.", button_timer) end end diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.fr.tr b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.fr.tr index 1d844bd36..7ccc763be 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.fr.tr +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.fr.tr @@ -17,3 +17,4 @@ A wooden button is a redstone component made out of wood which can be pushed to Provides redstone power when pushed=Fournit une puissance de redstone lorsqu'il est poussé Push duration: @1s=Durée de poussée : @1s Pushable by arrow=Poussable par une flèche +A button is a redstone component which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.=Un bouton est un composant redstone qui peut être poussé afin de fournir de la puissance redstone. Lorsqu'il est poussé, il fournit de la puissance redstone pendant @1 seconde. diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.ru.tr b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.ru.tr index 164d58fb2..b66a7e892 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.ru.tr @@ -17,4 +17,4 @@ A wooden button is a redstone component made out of wood which can be pushed to Provides redstone power when pushed=Выдаёт сигнал редстоуна при нажатии Push duration: @1s=Длительность нажатия: @1с Pushable by arrow=Нажимается стрелами -A button is a redstone compent which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.=Кнопка это компонент редстоуна, её можно нажать, чтобы получить сигнал редстоуна. При нажатии она включает соседние компоненты редстоуна на @1 с. +A button is a redstone component which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.=Кнопка это компонент редстоуна, её можно нажать, чтобы получить сигнал редстоуна. При нажатии она включает соседние компоненты редстоуна на @1 с. diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt index d42a03741..68d10061a 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt @@ -17,4 +17,4 @@ A wooden button is a redstone component made out of wood which can be pushed to Provides redstone power when pushed= Push duration: @1s= Pushable by arrow= -A button is a redstone compent which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.= +A button is a redstone component which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.= diff --git a/mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr b/mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr index b3a2c6dbc..09d88f5d4 100644 --- a/mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr +++ b/mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr @@ -47,4 +47,5 @@ Thorns=Épines 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. Aqua Affinity=Affinité aquatique - +#Translations for armor trims +Smithing Template '@1'=Modèle à forger '@1' diff --git a/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr index e95d16baa..e83f1d87f 100644 --- a/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr +++ b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr @@ -24,6 +24,7 @@ Bamboo Mosaic Stair=Escalier mosaïque de bambou Bamboo Plank Slab=Dalle de planches de bambou Bamboo Plank Stair=Escalier de planches de bambou Bamboo Pressure Plate=Plaque de pression de bambou +Bamboo Sign=Panneau de bambou Bamboo Slab=Dalle de bambou Bamboo Stair=Escalier de bambou Bamboo Trapdoor=Trappe de bambou diff --git a/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr b/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr index 78095a4a7..016abb6e7 100644 --- a/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr +++ b/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr @@ -76,3 +76,4 @@ You can copy the pattern of a banner by placing two banners of the same color in And one additional layer=Et une couche supplémentaire And @1 additional layers=Et @1 couches supplémentaires Paintable decoration=Décoration à peindre +Preview Banner=Aperçu de la bannière diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.fr.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.fr.tr index cc69db33b..ab4917c95 100644 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.fr.tr +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.fr.tr @@ -41,3 +41,9 @@ You will fall asleep when @1% of all players are in bed.=Vous vous endormirez lo You're in bed.=Tu es au lit. Allows you to sleep=Vous permet de dormir Respawn Anchor=Ancre de réapparition +Chat:=Discussion +send!=envoyé ! +You are missing the 'shout' privilege! It's required in order to talk in chat...=Il vous manque le privilège 'shout' ! C'est indispensable pour participer à la discussion... +You exceeded the maximum number of messages per 10 seconds!=Vous avez dépassé le nombre maximal de message par 10 secondes ! +Hey! Would you guys mind sleeping?=Eh, vous ne voulez pas dormir ? +Sorry, but you have to wait @1 seconds until you may use this button again!=Désolé, mais il faut attendre @1 seconde avant de réutiliser ce bouton ! diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr index 901be04df..6f91cd986 100644 --- a/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr +++ b/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr @@ -15,4 +15,4 @@ Damage from dispenser: 3=Dégâts du distributeur : 3 Launches arrows=Lance des flèches Crossbow=Arbalète Crossbows are ranged weapons to shoot arrows at your foes.=Les arbalètes sont des armes à distance pour tirer des flèches sur vos ennemis. -To use the crossbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Pour utiliser l'arbalète, vous devez d'abord avoir au moins une flèche n'importe où dans votre inventaire (sauf en mode créatif). Maintenez enfoncé le bouton droit de la souris pour charger, relâchez pour tirer. +To use the crossbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to load an arrow into the chamber, then to shoot press left mouse.=Pour utiliser l'arbalète, vous devez d'abord avoir au moins une flèche n'importe où dans votre inventaire (sauf en mode créatif). Maintenez enfoncé le bouton droit de la souris pour charger, relâchez pour charger la flèche dans la chambre, puis pour tirer cliquez droit. diff --git a/mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.fr.tr b/mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.fr.tr new file mode 100644 index 000000000..2f6b7db22 --- /dev/null +++ b/mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.fr.tr @@ -0,0 +1,24 @@ +# textdomain: mcl_cherry_blossom +Cherry Log=Bûche de cerisier +The trunk of a cherry blossom tree.=Le tronc d'un cerisier. +Stripped Cherry Log=Bûche de cerisier écorcée +The stripped trunk of a cherry blossom tree.=Le tronc écorcé d'un cerisier. +Cherry Bark=Bois de cerisier +This is a decorative block surrounded by the bark of a tree trunk.=Ceci est un bloc décoratif entouré de bois de cerisier +Stripped Cherry Wood=Bois de cerisier écorcé +The stripped wood of a cherry blossom tree.=Le bois écorcé d'un cerisier +Cherry Wood Planks=Planches de cerisier +Cherry Leaves=Feuilles de cerisier +Cherry blossom leaves are grown from cherry blossom trees.=Les feuilles de cerisier poussent sur les cerisiers +Cherry Sapling=Pousse de cerisier +Cherry blossom sapling can be planted to grow cherry trees.=Les pousses de cerisier peuvent être plantées pour faire pousser des cerisiers. +Cherry Door=Porte en cerisier +Cherry Trapdoor=Trappe en cerisier +Cherry Stairs=Escalier en cerisier +Cherry Slab=Dalle en cerisier +Double Cherry Slab=Double Dalle en cerisier +Cherry Sign=Panneau de cerisier +Cherry Fence=Barrière en cerisier +Cherry Gate=Portillion en cerisier +Cherry Pressure Plate=Plaque de pression en cerisier +Cherry Button=Bouton de Cerisier diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr index c7d3ddaa1..01de53274 100644 --- a/mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr @@ -22,3 +22,5 @@ Iron Trapdoor=Trappe en fer Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Les trappes en fer sont des barrières horizontales qui ne peuvent être ouvertes et fermées que par des signaux de redstone, mais pas à la main. Ils occupent la partie supérieure ou inférieure d'un bloc, selon la façon dont ils ont été placés. Lorsqu'elles sont ouvertes, elles peuvent être montées comme une échelle. Openable by players and redstone power=Ouvrable par les joueurs et puissance redstone Openable by redstone power=Ouvrable par la puissance redstone +This door is a 2-block high barrier which can only be opened by redstone power, not by hand.=Cette porte est une barrière d'une hauteur de 2 blocs qui ne peut être ouverte que par la puissance redstone et pas à la main. +This door is a 2-block high barrier which can be opened or closed by hand or by redstone power.=Cette porte est une barrière d'une hauteur de 2 blocs qui peut être ouverte ou fermée à la main ou par la puissance redstone. diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr index 362b96c57..067eded9b 100644 --- a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr @@ -24,3 +24,4 @@ Flower Pot=Pot de fleurs Flower pots are decorative blocks in which flowers and other small plants can be placed.=Les pots de fleurs sont des blocs décoratifs dans lesquels des fleurs et d'autres petites plantes peuvent être placées. Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Placez simplement une plante sur le pot de fleurs. Les pots de fleurs peuvent contenir de petites fleurs (pas plus d'un bloc), des pousses, des fougères, des buissons morts, des champignons et des cactus. Cliquez avec le bouton droit sur une plante en pot pour récupérer la plante. Can hold a small flower or plant=Peut contenir une petite fleur ou plante +Cherry Sapling Flower Pot=Pousse de Cerisier en pot diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr index 72e939785..3fca2e134 100644 --- a/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr @@ -6,14 +6,14 @@ Hop into the portal to teleport. Entering an End portal in the Overworld telepor End Portal Frame=Cadre de portail de l'End End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=Les portails de l'End sont utilisés dans la construction de portails de l'End. Chaque bloc a une prise pour un œil d'Ender. NOTE: The End dimension is currently incomplete and might change in future versions.=REMARQUE : la dimension de l'End est actuellement incomplète et pourrait changer dans les futures versions. -To create an End portal, you need 12 end portal frames and 12 eyes of ender. The end portal frames have to be arranged around a horizontal 3×3 area with each block facing inward. Any other arrangement will fail.= -Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.= +To create an End portal, you need 12 end portal frames and 12 eyes of ender. The end portal frames have to be arranged around a horizontal 3×3 area with each block facing inward. Any other arrangement will fail.=Pour créer un portail de l'End, vous avez besoin de 12 cadres de portail de l'End et 12 œil d'Ender. Les cadres de portail doivent être placé sur une surface horizontal 3*3 avec chaque bloc tourné vers l'intérieur. Tout autre disposition échouera. +Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.=Placer un œil d'Ender dans chaque bloc. Le portail apparaît au milieu après avoir placé l'œil final. Once placed, an eye of ender can not be taken back.=Une fois placé, un œil d'Ender ne peut pas être repris. End Portal Frame with Eye of Ender=Cadre de portail de l'End avec œil d'Ender -End Gateway Portal= -Used to construct end gateway portals= -An End gateway portal teleports creatures and objects to the outer End (and back!).= -Throw an ender pearl into the portal to teleport. Entering an Gateway portal near the Overworld teleports you to the outer End. At this destination another gateway portal will be constructed, which you can use to get back.= +End Gateway Portal=Portail de Passage de l'End +Used to construct end gateway portals=Utilisé pour construire des portails de passage de l'End. +An End gateway portal teleports creatures and objects to the outer End (and back!).=Un portail de passage de l'End téléporte des créatures et objets vers la bordure de l'End (et les ramène !). +Throw an ender pearl into the portal to teleport. Entering an Gateway portal near the Overworld teleports you to the outer End. At this destination another gateway portal will be constructed, which you can use to get back.=Jetez une perle d'Ender dans le portail pour vous téléporter. Entrer dans un portail de passage de l'End près de l'Overworld vous téléporte vers la bordure de l'End. À cette destination un autre portail de passage sera généré, qui pourra être utilisé pour revenir. Nether Portal=Portail du Nether A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Un portail du Nether téléporte des créatures et des objets dans la chaude et dangereuse dimension du Nether (et vice-versa !). Entrez à vos risques et périls ! Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Tenez-vous un instant dans le portail pour activer la téléportation. Entrer pour la première fois sur un portail Nether créera également un nouveau portail dans l'Overworld. Si un portail du Nether a été construit dans le Nether, il mènera à l'Overworld. Un portail du Nether est détruit si l'une des obsidiennes qui l'entourent est détruite, ou s'il a été pris dans une explosion. diff --git a/mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.fr.tr b/mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.fr.tr new file mode 100644 index 000000000..bc6ad5b88 --- /dev/null +++ b/mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.fr.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_sus_stew +Suspicious Stew=Soupe suspecte diff --git a/mods/PLAYER/mcl_music/locale/mcl_music.fr.tr b/mods/PLAYER/mcl_music/locale/mcl_music.fr.tr new file mode 100644 index 000000000..3b5a684d5 --- /dev/null +++ b/mods/PLAYER/mcl_music/locale/mcl_music.fr.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_music +You need the debug privilege in order to turn ingame music on or off for somebody else!=Vous avez besoin du privilège "debug“ pour allumer ou éteindre la musique pour une autre personne dans le jeu ! +Couldn't find player @1!= Le joueur @1 est introuvable ! +Set music for @1 to: @2=Jouer la musique @2 pour @1 +Turns music for yourself or another player on or off.=Joue ou arrête la musique pour vous ou un autre joueur. +on=on +off=off From 45532ebe6d1de88345f06895c26bbdd7ffdb91a1 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 30 Jul 2023 18:25:48 +0100 Subject: [PATCH 041/345] Add gui to list craft recipes for some stones --- mods/ITEMS/mcl_stonecutter/init.lua | 123 ++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index e75884990..a68f5cf84 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -7,6 +7,71 @@ local S = minetest.get_translator(minetest.get_current_modname()) +local recipes = { + {"mcl_core:cobble", "mcl_stairs:slab_cobble", "mcl_walls:cobble", "mcl_stairs:stair_cobble"}, + {"mcl_core:granite", "mcl_stairs:slab_granite", "mcl_walls:granite", "mcl_stairs:stair_granite", "mcl_core:granite_smooth", "mcl_stairs:stair_granite_smooth", "mcl_stairs:slab_granite_smooth"}, + {"mcl_core:diorite", "mcl_stairs:slab_diorite", "mcl_walls:diorite", "mcl_stairs:stair_diorite", "mcl_core:diorite_smooth", "mcl_stairs:stair_diorite_smooth", "mcl_stairs:slab_diorite_smooth"}, +} + + +local FMT = { + item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]", + item_image = "item_image[%f,%f;%f,%f;%s]", +} + +local function show_stonecutter_formspec(items, input) + local cut_items = {} + + local x_len = 0 + local y_len = 0.5 + + if items ~= nil then + for index, value in pairs(items) do + x_len = x_len + 1 + if x_len > 5 then + y_len = y_len + 1 + x_len = 1 + end + local test = string.format(FMT.item_image_button,x_len+1,y_len,1,1, value, value, "") + cut_items[index] = test + end + end + + local formspec = "size[9,8.75]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "label[1,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Stonecutter"))).."]".. + "list[context;main;0,0;8,4;]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "list[context;input;0.5,1.7;1,1;]".. + mcl_formspec.get_itemslot_bg(0.5,1.7,1,1).. + "list[context;output;7.5,1.7;1,1;]".. + mcl_formspec.get_itemslot_bg(7.5,1.7,1,1).. + table.concat(cut_items).. + "listring[context;output]".. + "listring[current_player;main]".. + "listring[context;input]".. + "listring[current_player;main]" + + return formspec +end + +local function update_stonecutter_slots(meta) + local inv = meta:get_inventory() + local input = inv:get_stack("input", 1) + local name = input:get_name() + + local new_output + for index, value in pairs(recipes) do + if name == value[1] then + meta:set_string("formspec", show_stonecutter_formspec(recipes[index])) + end + end +end + + minetest.register_node("mcl_stonecutter:stonecutter", { description = S("Stone Cutter"), _tt_help = S("Used to cut stone like materials."), @@ -46,6 +111,64 @@ minetest.register_node("mcl_stonecutter:stonecutter", { _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, sounds = mcl_sounds.node_sound_stone_defaults(), + + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if from_list == "output" and to_list == "input" then + local inv = meta:get_inventory() + for i=1, inv:get_size("input") do + if i ~= to_index then + local istack = inv:get_stack("input", i) + istack:set_count(math.max(0, istack:get_count() - count)) + inv:set_stack("input", i, istack) + end + end + end + update_stonecutter_slots(meta) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + elseif listname == "output" then + return 0 + else + return stack:get_count() + end + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + update_stonecutter_slots(meta) + end, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("input", 1) + inv:set_size("output", 1) + local form = show_stonecutter_formspec() + meta:set_string("formspec", form) + end, + + on_rightclick = function(pos, node, player, itemstack) + local name = player:get_player_name() + if not player:get_player_control().sneak then + local meta = minetest.get_meta(pos) + --show_stonecutter_formspec(name, "main", player) + update_stonecutter_slots(meta) + --meta:set_string("formspec", show_stonecutter_formspec(items[1])) + end + end, }) minetest.register_craft({ From 2af08c3188f4247ec6825461208ddf79b8c17a53 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 30 Jul 2023 21:58:42 +0100 Subject: [PATCH 042/345] clear formspec on taking input item --- mods/ITEMS/mcl_stonecutter/init.lua | 34 +++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index a68f5cf84..34ead2100 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -5,7 +5,7 @@ -- TO-DO: -- * Add GUI -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mcl_stonecutter") local recipes = { {"mcl_core:cobble", "mcl_stairs:slab_cobble", "mcl_walls:cobble", "mcl_stairs:stair_cobble"}, @@ -16,12 +16,10 @@ local recipes = { local FMT = { item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]", - item_image = "item_image[%f,%f;%f,%f;%s]", } local function show_stonecutter_formspec(items, input) local cut_items = {} - local x_len = 0 local y_len = 0.5 @@ -32,7 +30,7 @@ local function show_stonecutter_formspec(items, input) y_len = y_len + 1 x_len = 1 end - local test = string.format(FMT.item_image_button,x_len+1,y_len,1,1, value, value, "") + local test = string.format(FMT.item_image_button,x_len+1,y_len,1,1, value, "item_button", value) cut_items[index] = test end end @@ -64,10 +62,14 @@ local function update_stonecutter_slots(meta) local name = input:get_name() local new_output - for index, value in pairs(recipes) do - if name == value[1] then - meta:set_string("formspec", show_stonecutter_formspec(recipes[index])) + if not input:is_empty() then + for index, value in pairs(recipes) do + if name == value[1] then + meta:set_string("formspec", show_stonecutter_formspec(recipes[index])) + end end + else + meta:set_string("formspec", show_stonecutter_formspec(nil)) end end @@ -150,7 +152,12 @@ minetest.register_node("mcl_stonecutter:stonecutter", { local meta = minetest.get_meta(pos) update_stonecutter_slots(meta) end, - + on_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if listname == "input" then + update_stonecutter_slots(meta) + end + end, on_construct = function(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -159,7 +166,6 @@ minetest.register_node("mcl_stonecutter:stonecutter", { local form = show_stonecutter_formspec() meta:set_string("formspec", form) end, - on_rightclick = function(pos, node, player, itemstack) local name = player:get_player_name() if not player:get_player_control().sneak then @@ -169,6 +175,16 @@ minetest.register_node("mcl_stonecutter:stonecutter", { --meta:set_string("formspec", show_stonecutter_formspec(items[1])) end end, + on_receive_fields = function(pos, formname, fields, sender) + local sender_name = sender:get_player_name() + if minetest.is_protected(pos, sender_name) then + minetest.record_protection_violation(pos, sender_name) + return + end + if fields.item_button then + print(fields.item_button) + end + end, }) minetest.register_craft({ From 752372752197c5f05130c438c89e3e8b1d8eaafa Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 30 Jul 2023 22:41:19 +0100 Subject: [PATCH 043/345] take output from stonecutter --- mods/ITEMS/mcl_stonecutter/init.lua | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 34ead2100..88da2d2f8 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -13,7 +13,6 @@ local recipes = { {"mcl_core:diorite", "mcl_stairs:slab_diorite", "mcl_walls:diorite", "mcl_stairs:stair_diorite", "mcl_core:diorite_smooth", "mcl_stairs:stair_diorite_smooth", "mcl_stairs:slab_diorite_smooth"}, } - local FMT = { item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]", } @@ -61,7 +60,7 @@ local function update_stonecutter_slots(meta) local input = inv:get_stack("input", 1) local name = input:get_name() - local new_output + local new_output = ItemStack(meta:get_string("cut_stone")) if not input:is_empty() then for index, value in pairs(recipes) do if name == value[1] then @@ -71,8 +70,12 @@ local function update_stonecutter_slots(meta) else meta:set_string("formspec", show_stonecutter_formspec(nil)) end -end + if new_output then + new_output:set_count(2) + inv:set_stack("output", 1, new_output) + end +end minetest.register_node("mcl_stonecutter:stonecutter", { description = S("Stone Cutter"), @@ -154,9 +157,14 @@ minetest.register_node("mcl_stonecutter:stonecutter", { end, on_metadata_inventory_take = function(pos, listname, index, stack, player) local meta = minetest.get_meta(pos) - if listname == "input" then - update_stonecutter_slots(meta) + if listname == "output" then + local inv = meta:get_inventory() + local input = inv:get_stack("input", 1) + input:take_item() + inv:set_stack("input", 1, input) + meta:set_string("cut_stone", nil) end + update_stonecutter_slots(meta) end, on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -170,9 +178,7 @@ minetest.register_node("mcl_stonecutter:stonecutter", { local name = player:get_player_name() if not player:get_player_control().sneak then local meta = minetest.get_meta(pos) - --show_stonecutter_formspec(name, "main", player) update_stonecutter_slots(meta) - --meta:set_string("formspec", show_stonecutter_formspec(items[1])) end end, on_receive_fields = function(pos, formname, fields, sender) @@ -182,7 +188,9 @@ minetest.register_node("mcl_stonecutter:stonecutter", { return end if fields.item_button then - print(fields.item_button) + local meta = minetest.get_meta(pos) + meta:set_string("cut_stone", fields.item_button) + update_stonecutter_slots(meta) end end, }) From 47990eec2bd3106eb5d931c7ac3747e0a1cebd01 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Mon, 31 Jul 2023 08:56:02 +0100 Subject: [PATCH 044/345] begin adding check if item canbe cut --- mods/ITEMS/mcl_stonecutter/init.lua | 47 ++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 88da2d2f8..801dd32c0 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -13,6 +13,31 @@ local recipes = { {"mcl_core:diorite", "mcl_stairs:slab_diorite", "mcl_walls:diorite", "mcl_stairs:stair_diorite", "mcl_core:diorite_smooth", "mcl_stairs:stair_diorite_smooth", "mcl_stairs:slab_diorite_smooth"}, } +local compaitble_items = { + "mcl_core:cobble", + "mcl_core:mossycobble", + "mcl_core:stone", + "mcl_core:stone_smooth", + "mcl_core:granite", + "mcl_core:granite_smooth", + "mcl_core:diorite", + "mcl_core:diorite_smooth", + "mcl_core:andesite", + "mcl_core:andesite_smooth", + "mcl_core:stonebrick", + "mcl_core:stonebrickmossy", + "mcl_core:sandstone", + "mcl_core:redsandstone", + "mcl_ocean:prismarine", + "mcl_ocean:prismarine_brick", + "mcl_ocean:prismarine_dark", + "mcl_mud:mud_bricks", + "mcl_nether:quartzblock", + "mcl_nether:quartz_smooth", + "mcl_end:purpur_block", + "mcl_end:end_bricks", +} + local FMT = { item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]", } @@ -55,10 +80,30 @@ local function show_stonecutter_formspec(items, input) return formspec end +local function get_item_string_name(input) + local colonIndex = string.find(input, ":") + if colonIndex then + input = string.sub(input, colonIndex + 1) + else + return input + end + local whitespaceIndex = string.find(input, "%s") + if whitespaceIndex then + return string.sub(input, 1, whitespaceIndex - 1) + else + return input + end +end + local function update_stonecutter_slots(meta) local inv = meta:get_inventory() local input = inv:get_stack("input", 1) local name = input:get_name() + local name_stripped = get_item_string_name(input:to_string()) + if name_stripped ~= "" then + local itemdef = minetest.registered_items["mcl_stairs:stair_"..name_stripped] + print(itemdef) + end local new_output = ItemStack(meta:get_string("cut_stone")) if not input:is_empty() then @@ -162,8 +207,8 @@ minetest.register_node("mcl_stonecutter:stonecutter", { local input = inv:get_stack("input", 1) input:take_item() inv:set_stack("input", 1, input) - meta:set_string("cut_stone", nil) end + meta:set_string("cut_stone", nil) update_stonecutter_slots(meta) end, on_construct = function(pos) From 9da07af3700e6a8da5fa73aac95b7bbe5375ffa2 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Tue, 1 Aug 2023 09:14:09 +0100 Subject: [PATCH 045/345] Check if item can be made into stairs, slabs and walls --- mods/ITEMS/mcl_stonecutter/init.lua | 60 +++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 801dd32c0..f46603aa0 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -7,12 +7,6 @@ local S = minetest.get_translator("mcl_stonecutter") -local recipes = { - {"mcl_core:cobble", "mcl_stairs:slab_cobble", "mcl_walls:cobble", "mcl_stairs:stair_cobble"}, - {"mcl_core:granite", "mcl_stairs:slab_granite", "mcl_walls:granite", "mcl_stairs:stair_granite", "mcl_core:granite_smooth", "mcl_stairs:stair_granite_smooth", "mcl_stairs:slab_granite_smooth"}, - {"mcl_core:diorite", "mcl_stairs:slab_diorite", "mcl_walls:diorite", "mcl_stairs:stair_diorite", "mcl_core:diorite_smooth", "mcl_stairs:stair_diorite_smooth", "mcl_stairs:slab_diorite_smooth"}, -} - local compaitble_items = { "mcl_core:cobble", "mcl_core:mossycobble", @@ -28,14 +22,19 @@ local compaitble_items = { "mcl_core:stonebrickmossy", "mcl_core:sandstone", "mcl_core:redsandstone", + "mcl_core:brick_block", "mcl_ocean:prismarine", "mcl_ocean:prismarine_brick", "mcl_ocean:prismarine_dark", "mcl_mud:mud_bricks", "mcl_nether:quartzblock", "mcl_nether:quartz_smooth", + "mcl_nether:red_nether_brick", + "mcl_nether:nether_brick", "mcl_end:purpur_block", "mcl_end:end_bricks", + "mcl_blackstone:blackstone", + "mcl_blackstone:blackstone_polished" } local FMT = { @@ -95,23 +94,54 @@ local function get_item_string_name(input) end end +local function is_input_in_table(element) + for _, value in ipairs(compaitble_items) do + if value == element then + return true + end + end + return false +end + local function update_stonecutter_slots(meta) local inv = meta:get_inventory() local input = inv:get_stack("input", 1) local name = input:get_name() local name_stripped = get_item_string_name(input:to_string()) - if name_stripped ~= "" then - local itemdef = minetest.registered_items["mcl_stairs:stair_"..name_stripped] - print(itemdef) - end - + local cuttable_recipes = {} local new_output = ItemStack(meta:get_string("cut_stone")) - if not input:is_empty() then - for index, value in pairs(recipes) do - if name == value[1] then - meta:set_string("formspec", show_stonecutter_formspec(recipes[index])) + + + print(name) + if is_input_in_table(name) then + if name_stripped ~= "" then + local stair = "mcl_stairs:stair_"..name_stripped + local slab = "mcl_stairs:slab_"..name_stripped + local wall = "mcl_walls:"..name_stripped + local smooth = "mcl_core:"..name_stripped.."_smooth" + if minetest.registered_items[slab] ~= nil then + table.insert(cuttable_recipes, slab) + end + if minetest.registered_items[stair] ~= nil then + table.insert(cuttable_recipes, stair) + end + if minetest.registered_items[wall] ~= nil then + table.insert(cuttable_recipes, wall) + end + if minetest.registered_items[smooth] ~= nil then + local smooth_stair = "mcl_stairs:stair_"..name_stripped.."_smooth" + local smooth_slab = "mcl_stairs:slab_"..name_stripped.."_smooth" + + table.insert(cuttable_recipes, smooth) + if minetest.registered_items[smooth_slab] ~= nil then + table.insert(cuttable_recipes, smooth_slab) + end + if minetest.registered_items[smooth_stair] ~= nil then + table.insert(cuttable_recipes, smooth_stair) + end end end + meta:set_string("formspec", show_stonecutter_formspec(cuttable_recipes)) else meta:set_string("formspec", show_stonecutter_formspec(nil)) end From 07d2759ae4e9331d9be404f41fbef50e131c5994 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Tue, 1 Aug 2023 18:05:01 +0100 Subject: [PATCH 046/345] Check if item is a slab or not --- mods/ITEMS/mcl_stonecutter/init.lua | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index f46603aa0..bd74a8256 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -109,10 +109,8 @@ local function update_stonecutter_slots(meta) local name = input:get_name() local name_stripped = get_item_string_name(input:to_string()) local cuttable_recipes = {} - local new_output = ItemStack(meta:get_string("cut_stone")) + local new_output = meta:get_string("cut_stone") - - print(name) if is_input_in_table(name) then if name_stripped ~= "" then local stair = "mcl_stairs:stair_"..name_stripped @@ -145,10 +143,14 @@ local function update_stonecutter_slots(meta) else meta:set_string("formspec", show_stonecutter_formspec(nil)) end - - if new_output then - new_output:set_count(2) - inv:set_stack("output", 1, new_output) + if new_output = '' then + cut_item = ItemStack(new_output) + if string.find(new_output, "mcl_stairs:slab_") then + cut_item:set_count(2) + else + cut_item:set_count(1) + end + inv:set_stack("output", 1, cut_item) end end From 356045b3e325fbb881c93b33c2f54708dee82b07 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Tue, 1 Aug 2023 18:17:48 +0100 Subject: [PATCH 047/345] Add comments and drop items when destroyed --- mods/ITEMS/mcl_stonecutter/init.lua | 56 +++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index bd74a8256..59334914f 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -7,6 +7,7 @@ local S = minetest.get_translator("mcl_stonecutter") +-- compatible items for the stonecutter local compaitble_items = { "mcl_core:cobble", "mcl_core:mossycobble", @@ -41,11 +42,13 @@ local FMT = { item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]", } +-- formspecs local function show_stonecutter_formspec(items, input) local cut_items = {} local x_len = 0 local y_len = 0.5 + -- This loops through all the items that can be made and inserted into the formspec if items ~= nil then for index, value in pairs(items) do x_len = x_len + 1 @@ -79,6 +82,7 @@ local function show_stonecutter_formspec(items, input) return formspec end +-- Strips the start of the item like "mcl_core:" and removes any numbers or whitespaces after it local function get_item_string_name(input) local colonIndex = string.find(input, ":") if colonIndex then @@ -94,6 +98,7 @@ local function get_item_string_name(input) end end +-- Simply checks if the item is compaitble with the stonecutter local function is_input_in_table(element) for _, value in ipairs(compaitble_items) do if value == element then @@ -103,20 +108,25 @@ local function is_input_in_table(element) return false end +-- Updates the formspec local function update_stonecutter_slots(meta) local inv = meta:get_inventory() local input = inv:get_stack("input", 1) local name = input:get_name() - local name_stripped = get_item_string_name(input:to_string()) - local cuttable_recipes = {} local new_output = meta:get_string("cut_stone") + -- Checks if input is in the array if is_input_in_table(name) then + local cuttable_recipes = {} + local name_stripped = get_item_string_name(input:to_string()) if name_stripped ~= "" then + -- Strings for the possible items it can craft into local stair = "mcl_stairs:stair_"..name_stripped local slab = "mcl_stairs:slab_"..name_stripped local wall = "mcl_walls:"..name_stripped local smooth = "mcl_core:"..name_stripped.."_smooth" + + -- Goes through and checks if the item exists and inserts it into the table if minetest.registered_items[slab] ~= nil then table.insert(cuttable_recipes, slab) end @@ -143,7 +153,9 @@ local function update_stonecutter_slots(meta) else meta:set_string("formspec", show_stonecutter_formspec(nil)) end - if new_output = '' then + + -- Checks if the chosen item is a slab or not, if it's a slab set the output to be a stack of 2 + if new_output ~= '' then cut_item = ItemStack(new_output) if string.find(new_output, "mcl_stairs:slab_") then cut_item:set_count(2) @@ -154,6 +166,18 @@ local function update_stonecutter_slots(meta) end end +-- Only drop the items that were in the input slot +local function drop_stonecutter_items(pos, meta) + local inv = meta:get_inventory() + for i=1, inv:get_size("input") do + local stack = inv:get_stack("input", i) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end +end + minetest.register_node("mcl_stonecutter:stonecutter", { description = S("Stone Cutter"), _tt_help = S("Used to cut stone like materials."), @@ -194,6 +218,13 @@ minetest.register_node("mcl_stonecutter:stonecutter", { _mcl_hardness = 3.5, sounds = mcl_sounds.node_sound_stone_defaults(), + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + local meta2 = meta:to_table() + meta:from_table(oldmetadata) + drop_stonecutter_items(pos, meta) + meta:from_table(meta2) + end, allow_metadata_inventory_take = function(pos, listname, index, stack, player) local name = player:get_player_name() if minetest.is_protected(pos, name) then @@ -203,6 +234,25 @@ minetest.register_node("mcl_stonecutter:stonecutter", { return stack:get_count() end end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + elseif to_list == "output" then + return 0 + elseif from_list == "output" and to_list == "input" then + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if inv:get_stack(to_list, to_index):is_empty() then + return count + else + return 0 + end + else + return count + end + end, on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) local meta = minetest.get_meta(pos) if from_list == "output" and to_list == "input" then From 7fcc2e3be3bdc8c40a6203ec2112b8e3f6d858a7 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Tue, 1 Aug 2023 22:39:24 +0100 Subject: [PATCH 048/345] Minor output fixes --- mods/ITEMS/mcl_stonecutter/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 59334914f..2977538e0 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -2,8 +2,6 @@ --||||| STONECUTTER ||||| --||||||||||||||||||||||| --- TO-DO: --- * Add GUI local S = minetest.get_translator("mcl_stonecutter") @@ -163,6 +161,8 @@ local function update_stonecutter_slots(meta) cut_item:set_count(1) end inv:set_stack("output", 1, cut_item) + else + inv:set_stack("output", 1, "") end end From 0e60231c2e7fb9f8d9a7ae22dfd1590d3a6d4123 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Tue, 1 Aug 2023 22:48:45 +0100 Subject: [PATCH 049/345] Only reset output if input is empty --- mods/ITEMS/mcl_stonecutter/init.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 2977538e0..44a25d2dc 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -289,8 +289,12 @@ minetest.register_node("mcl_stonecutter:stonecutter", { local input = inv:get_stack("input", 1) input:take_item() inv:set_stack("input", 1, input) + if input:get_count() == 0 then + meta:set_string("cut_stone", nil) + end + else + meta:set_string("cut_stone", nil) end - meta:set_string("cut_stone", nil) update_stonecutter_slots(meta) end, on_construct = function(pos) From 5f0ad98daefe5f8606d79e595ac6982d44d52eb8 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 6 Aug 2023 12:45:32 +0100 Subject: [PATCH 050/345] Use node group for items that can be used in the stonecutter --- mods/ITEMS/mcl_blackstone/init.lua | 4 +-- mods/ITEMS/mcl_copper/nodes.lua | 32 +++++++++++----------- mods/ITEMS/mcl_core/nodes_base.lua | 38 +++++++++++++------------- mods/ITEMS/mcl_end/building.lua | 6 ++--- mods/ITEMS/mcl_mud/init.lua | 2 +- mods/ITEMS/mcl_nether/init.lua | 8 +++--- mods/ITEMS/mcl_ocean/prismarine.lua | 6 ++--- mods/ITEMS/mcl_stonecutter/init.lua | 42 ++--------------------------- 8 files changed, 50 insertions(+), 88 deletions(-) diff --git a/mods/ITEMS/mcl_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua index 138e02191..e1bf751cd 100644 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ b/mods/ITEMS/mcl_blackstone/init.lua @@ -12,7 +12,7 @@ minetest.register_node("mcl_blackstone:blackstone", { tiles = {"mcl_blackstone_top.png", "mcl_blackstone_top.png", "mcl_blackstone_side.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, cobble=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, cobble=1, stonecuttable=1, stonecuttable=1}, _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) @@ -103,7 +103,7 @@ minetest.register_node("mcl_blackstone:blackstone_polished", { tiles = {"mcl_blackstone_polished.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, stonecuttable=1}, _mcl_blast_resistance = 6, _mcl_hardness = 2, }) diff --git a/mods/ITEMS/mcl_copper/nodes.lua b/mods/ITEMS/mcl_copper/nodes.lua index af5a49a1c..b7b78a542 100644 --- a/mods/ITEMS/mcl_copper/nodes.lua +++ b/mods/ITEMS/mcl_copper/nodes.lua @@ -30,7 +30,7 @@ minetest.register_node("mcl_copper:block", { _doc_items_longdesc = S("A block of copper is mostly a decorative block."), tiles = {"mcl_copper_block.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 3, @@ -43,7 +43,7 @@ minetest.register_node("mcl_copper:waxed_block", { _doc_items_longdesc = S("A block of copper is mostly a decorative block."), tiles = {"mcl_copper_block.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 3, @@ -55,7 +55,7 @@ minetest.register_node("mcl_copper:block_exposed", { _doc_items_longdesc = S("Exposed copper is a decorative block."), tiles = {"mcl_copper_exposed.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -69,7 +69,7 @@ minetest.register_node("mcl_copper:waxed_block_exposed", { _doc_items_longdesc = S("Exposed copper is a decorative block."), tiles = {"mcl_copper_exposed.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -81,7 +81,7 @@ minetest.register_node("mcl_copper:block_weathered", { _doc_items_longdesc = S("Weathered copper is a decorative block."), tiles = {"mcl_copper_weathered.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -95,7 +95,7 @@ minetest.register_node("mcl_copper:waxed_block_weathered", { _doc_items_longdesc = S("Weathered copper is a decorative block."), tiles = {"mcl_copper_weathered.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -107,7 +107,7 @@ minetest.register_node("mcl_copper:block_oxidized", { _doc_items_longdesc = S("Oxidized copper is a decorative block."), tiles = {"mcl_copper_oxidized.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -120,7 +120,7 @@ minetest.register_node("mcl_copper:waxed_block_oxidized", { _doc_items_longdesc = S("Oxidized copper is a decorative block."), tiles = {"mcl_copper_oxidized.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -132,7 +132,7 @@ minetest.register_node("mcl_copper:block_cut", { _doc_items_longdesc = S("Cut copper is a decorative block."), tiles = {"mcl_copper_block_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -145,7 +145,7 @@ minetest.register_node("mcl_copper:waxed_block_cut", { _doc_items_longdesc = S("Cut copper is a decorative block."), tiles = {"mcl_copper_block_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -157,7 +157,7 @@ minetest.register_node("mcl_copper:block_exposed_cut", { _doc_items_longdesc = S("Exposed cut copper is a decorative block."), tiles = {"mcl_copper_exposed_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -171,7 +171,7 @@ minetest.register_node("mcl_copper:waxed_block_exposed_cut", { _doc_items_longdesc = S("Exposed cut copper is a decorative block."), tiles = {"mcl_copper_exposed_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -183,7 +183,7 @@ minetest.register_node("mcl_copper:block_weathered_cut", { _doc_items_longdesc = S("Weathered cut copper is a decorative block."), tiles = {"mcl_copper_weathered_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -197,7 +197,7 @@ minetest.register_node("mcl_copper:waxed_block_weathered_cut", { _doc_items_longdesc = S("Weathered cut copper is a decorative block."), tiles = {"mcl_copper_weathered_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -209,7 +209,7 @@ minetest.register_node("mcl_copper:block_oxidized_cut", { _doc_items_longdesc = S("Oxidized cut copper is a decorative block."), tiles = {"mcl_copper_oxidized_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -222,7 +222,7 @@ minetest.register_node("mcl_copper:waxed_block_oxidized_cut", { _doc_items_longdesc = S("Oxidized cut copper is a decorative block."), tiles = {"mcl_copper_oxidized_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index f36d5cabd..3f269def4 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -27,7 +27,7 @@ minetest.register_node("mcl_core:stone", { tiles = {"default_stone.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, drop = "mcl_core:cobble", sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, @@ -236,7 +236,7 @@ minetest.register_node("mcl_core:stonebrick", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"default_stone_brick.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -272,7 +272,7 @@ minetest.register_node("mcl_core:stonebrickmossy", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_mossy.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -284,7 +284,7 @@ minetest.register_node("mcl_core:stone_smooth", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_stairs_stone_slab_top.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -297,7 +297,7 @@ minetest.register_node("mcl_core:granite", { tiles = {"mcl_core_granite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -309,7 +309,7 @@ minetest.register_node("mcl_core:granite_smooth", { tiles = {"mcl_core_granite_smooth.png"}, stack_max = 64, is_ground_content = false, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -321,7 +321,7 @@ minetest.register_node("mcl_core:andesite", { tiles = {"mcl_core_andesite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -333,7 +333,7 @@ minetest.register_node("mcl_core:andesite_smooth", { tiles = {"mcl_core_andesite_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -345,7 +345,7 @@ minetest.register_node("mcl_core:diorite", { tiles = {"mcl_core_diorite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -357,7 +357,7 @@ minetest.register_node("mcl_core:diorite_smooth", { tiles = {"mcl_core_diorite_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -586,7 +586,7 @@ minetest.register_node("mcl_core:sandstone", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -598,7 +598,7 @@ minetest.register_node("mcl_core:sandstonesmooth", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -623,7 +623,7 @@ minetest.register_node("mcl_core:sandstonesmooth2", { tiles = {"mcl_core_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -649,7 +649,7 @@ minetest.register_node("mcl_core:redsandstone", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -661,7 +661,7 @@ minetest.register_node("mcl_core:redsandstonesmooth", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -685,7 +685,7 @@ minetest.register_node("mcl_core:redsandstonesmooth2", { tiles = {"mcl_core_red_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -715,7 +715,7 @@ minetest.register_node("mcl_core:brick_block", { tiles = {"default_brick.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -768,7 +768,7 @@ minetest.register_node("mcl_core:cobble", { tiles = {"default_cobble.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, cobble=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, cobble=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -780,7 +780,7 @@ minetest.register_node("mcl_core:mossycobble", { tiles = {"default_mossycobble.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua index 82f6e76e4..f96c10633 100644 --- a/mods/ITEMS/mcl_end/building.lua +++ b/mods/ITEMS/mcl_end/building.lua @@ -13,7 +13,7 @@ minetest.register_node("mcl_end:end_stone", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_end_end_stone.png"}, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), after_dig_node = mcl_end.check_detach_chorus_plant, _mcl_blast_resistance = 9, @@ -26,7 +26,7 @@ minetest.register_node("mcl_end:end_bricks", { tiles = {"mcl_end_end_bricks.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 9, _mcl_hardness = 3, @@ -38,7 +38,7 @@ minetest.register_node("mcl_end:purpur_block", { tiles = {"mcl_end_purpur_block.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, diff --git a/mods/ITEMS/mcl_mud/init.lua b/mods/ITEMS/mcl_mud/init.lua index 64ff36c09..b7542e0d5 100644 --- a/mods/ITEMS/mcl_mud/init.lua +++ b/mods/ITEMS/mcl_mud/init.lua @@ -38,7 +38,7 @@ minetest.register_node("mcl_mud:mud_bricks", { _doc_items_longdesc = S("Decorative block crafted from packed mud."), _doc_items_hidden = false, tiles = {"mcl_mud_bricks.png"}, - groups = {handy=1, pickaxey=1, building_block=1}, + groups = {handy=1, pickaxey=1, building_block=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 3, _mcl_hardness = 1.5, diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index 548bd90d5..81b6d352c 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -176,7 +176,7 @@ minetest.register_node("mcl_nether:nether_brick", { stack_max = 64, tiles = {"mcl_nether_nether_brick.png"}, is_ground_content = false, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -189,7 +189,7 @@ minetest.register_node("mcl_nether:red_nether_brick", { stack_max = 64, tiles = {"mcl_nether_red_nether_brick.png"}, is_ground_content = false, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -219,7 +219,7 @@ minetest.register_node("mcl_nether:quartz_block", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -257,7 +257,7 @@ minetest.register_node("mcl_nether:quartz_smooth", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_block_bottom.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, diff --git a/mods/ITEMS/mcl_ocean/prismarine.lua b/mods/ITEMS/mcl_ocean/prismarine.lua index fff07cb7e..e3b899a49 100644 --- a/mods/ITEMS/mcl_ocean/prismarine.lua +++ b/mods/ITEMS/mcl_ocean/prismarine.lua @@ -38,7 +38,7 @@ minetest.register_node("mcl_ocean:prismarine", { is_ground_content = false, -- Texture should have 22 frames for smooth transitions. tiles = {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -50,7 +50,7 @@ minetest.register_node("mcl_ocean:prismarine_brick", { stack_max = 64, is_ground_content = false, tiles = {"mcl_ocean_prismarine_bricks.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -62,7 +62,7 @@ minetest.register_node("mcl_ocean:prismarine_dark", { stack_max = 64, is_ground_content = false, tiles = {"mcl_ocean_prismarine_dark.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 44a25d2dc..a8d3f4d14 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -7,33 +7,6 @@ local S = minetest.get_translator("mcl_stonecutter") -- compatible items for the stonecutter local compaitble_items = { - "mcl_core:cobble", - "mcl_core:mossycobble", - "mcl_core:stone", - "mcl_core:stone_smooth", - "mcl_core:granite", - "mcl_core:granite_smooth", - "mcl_core:diorite", - "mcl_core:diorite_smooth", - "mcl_core:andesite", - "mcl_core:andesite_smooth", - "mcl_core:stonebrick", - "mcl_core:stonebrickmossy", - "mcl_core:sandstone", - "mcl_core:redsandstone", - "mcl_core:brick_block", - "mcl_ocean:prismarine", - "mcl_ocean:prismarine_brick", - "mcl_ocean:prismarine_dark", - "mcl_mud:mud_bricks", - "mcl_nether:quartzblock", - "mcl_nether:quartz_smooth", - "mcl_nether:red_nether_brick", - "mcl_nether:nether_brick", - "mcl_end:purpur_block", - "mcl_end:end_bricks", - "mcl_blackstone:blackstone", - "mcl_blackstone:blackstone_polished" } local FMT = { @@ -96,16 +69,6 @@ local function get_item_string_name(input) end end --- Simply checks if the item is compaitble with the stonecutter -local function is_input_in_table(element) - for _, value in ipairs(compaitble_items) do - if value == element then - return true - end - end - return false -end - -- Updates the formspec local function update_stonecutter_slots(meta) local inv = meta:get_inventory() @@ -114,7 +77,7 @@ local function update_stonecutter_slots(meta) local new_output = meta:get_string("cut_stone") -- Checks if input is in the array - if is_input_in_table(name) then + if minetest.get_item_group(name, "stonecuttable") > 0 then local cuttable_recipes = {} local name_stripped = get_item_string_name(input:to_string()) if name_stripped ~= "" then @@ -154,7 +117,7 @@ local function update_stonecutter_slots(meta) -- Checks if the chosen item is a slab or not, if it's a slab set the output to be a stack of 2 if new_output ~= '' then - cut_item = ItemStack(new_output) + local cut_item = ItemStack(new_output) if string.find(new_output, "mcl_stairs:slab_") then cut_item:set_count(2) else @@ -306,7 +269,6 @@ minetest.register_node("mcl_stonecutter:stonecutter", { meta:set_string("formspec", form) end, on_rightclick = function(pos, node, player, itemstack) - local name = player:get_player_name() if not player:get_player_control().sneak then local meta = minetest.get_meta(pos) update_stonecutter_slots(meta) From ca37ce5744ba8bd4b35d610e57e3b87d0cd55c30 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 6 Aug 2023 12:49:27 +0100 Subject: [PATCH 051/345] Remove hardcoded one element array --- mods/ITEMS/mcl_stonecutter/init.lua | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index a8d3f4d14..b532c68c5 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -5,14 +5,6 @@ local S = minetest.get_translator("mcl_stonecutter") --- compatible items for the stonecutter -local compaitble_items = { -} - -local FMT = { - item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]", -} - -- formspecs local function show_stonecutter_formspec(items, input) local cut_items = {} @@ -27,7 +19,7 @@ local function show_stonecutter_formspec(items, input) y_len = y_len + 1 x_len = 1 end - local test = string.format(FMT.item_image_button,x_len+1,y_len,1,1, value, "item_button", value) + local test = string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",x_len+1,y_len,1,1, value, "item_button", value) cut_items[index] = test end end From 01d43bb33aa2c483887aafadbd58741fb7f6baa7 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 6 Aug 2023 13:07:32 +0100 Subject: [PATCH 052/345] Remove unused meta on drop items --- mods/ITEMS/mcl_stonecutter/init.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index b532c68c5..77ca5c066 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -26,7 +26,7 @@ local function show_stonecutter_formspec(items, input) local formspec = "size[9,8.75]".. "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "label[1,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Stonecutter"))).."]".. + "label[1,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Stone Cutter"))).."]".. "list[context;main;0,0;8,4;]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. @@ -175,10 +175,8 @@ minetest.register_node("mcl_stonecutter:stonecutter", { after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) - local meta2 = meta:to_table() meta:from_table(oldmetadata) drop_stonecutter_items(pos, meta) - meta:from_table(meta2) end, allow_metadata_inventory_take = function(pos, listname, index, stack, player) local name = player:get_player_name() From a9f26fb3547cbe79811ef6c7736b84c2ffc36aa4 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 6 Aug 2023 20:14:58 +0100 Subject: [PATCH 053/345] use item groups to determine the cuttable items --- mods/ITEMS/mcl_blackstone/init.lua | 58 ++++++-- mods/ITEMS/mcl_copper/nodes.lua | 64 ++++---- mods/ITEMS/mcl_core/nodes_base.lua | 40 ++--- mods/ITEMS/mcl_end/building.lua | 8 +- mods/ITEMS/mcl_mud/init.lua | 2 +- mods/ITEMS/mcl_nether/init.lua | 12 +- mods/ITEMS/mcl_ocean/prismarine.lua | 6 +- mods/ITEMS/mcl_stairs/register.lua | 223 +++++++++++++++++++++++----- mods/ITEMS/mcl_stonecutter/init.lua | 67 +++------ mods/ITEMS/mcl_walls/register.lua | 30 ++-- 10 files changed, 338 insertions(+), 172 deletions(-) diff --git a/mods/ITEMS/mcl_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua index e1bf751cd..c46fba97b 100644 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ b/mods/ITEMS/mcl_blackstone/init.lua @@ -12,7 +12,7 @@ minetest.register_node("mcl_blackstone:blackstone", { tiles = {"mcl_blackstone_top.png", "mcl_blackstone_top.png", "mcl_blackstone_side.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, cobble=1, stonecuttable=1, stonecuttable=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, cobble=1, stonecuttable=21}, _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) @@ -73,7 +73,7 @@ minetest.register_node("mcl_blackstone:basalt_polished", { on_place = mcl_util.rotate_axis, on_rotate = on_rotate, is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, stonecutter_output=19}, _mcl_blast_resistance = 4.2, _mcl_hardness = 1.25, }) @@ -85,7 +85,7 @@ minetest.register_node("mcl_blackstone:basalt", { on_place = mcl_util.rotate_axis, on_rotate = on_rotate, is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, stonecuttable=19}, _mcl_blast_resistance = 4.2, _mcl_hardness = 1.25, }) @@ -103,7 +103,7 @@ minetest.register_node("mcl_blackstone:blackstone_polished", { tiles = {"mcl_blackstone_polished.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, stonecuttable=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, stonecuttable=21, stonecutter_output=21}, _mcl_blast_resistance = 6, _mcl_hardness = 2, }) @@ -112,7 +112,7 @@ minetest.register_node("mcl_blackstone:blackstone_chiseled_polished", { tiles = {"mcl_blackstone_chiseled_polished.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, stonecutter_output=21}, _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) @@ -121,7 +121,7 @@ minetest.register_node("mcl_blackstone:blackstone_brick_polished", { tiles = {"mcl_blackstone_polished_bricks.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, stonecutter_output=21}, _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) @@ -131,7 +131,7 @@ minetest.register_node("mcl_blackstone:quartz_brick", { sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), - groups = {cracky = 3, pickaxey=1, material_stone=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, stonecutter_output=14}, _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, }) @@ -193,16 +193,50 @@ minetest.registered_nodes["mcl_fire:fire"].on_construct=function(pos) end --slabs/stairs -mcl_stairs.register_stair_and_slab_simple("blackstone", "mcl_blackstone:blackstone", S("Blackstone Stair"), S("Blackstone Slab"), S("Double Blackstone Slab")) -mcl_stairs.register_stair_and_slab_simple("blackstone_polished", "mcl_blackstone:blackstone_polished", S("Polished Blackstone Stair"), S("Polished Blackstone Slab"), S("Polished Double Blackstone Slab")) -mcl_stairs.register_stair_and_slab_simple("blackstone_chiseled_polished", "mcl_blackstone:blackstone_chiseled_polished", S("Chiseled Polished Blackstone Stair"), S("Chiseled Polished Blackstone Slab"), S("Double Chiseled Polished Blackstone Slab")) -mcl_stairs.register_stair_and_slab_simple("blackstone_brick_polished", "mcl_blackstone:blackstone_brick_polished", S("Polished Blackstone Brick Stair"), S("Polished Blackstone Brick Slab"), S("Double Polished Blackstone Brick Slab")) +mcl_stairs.register_stair_and_slab("blackstone", "mcl_blackstone:blackstone", + {cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21}, + {"mcl_blackstone_top.png", "mcl_blackstone_top.png", "mcl_blackstone_side.png"}, + S("Blackstone Stairs"), + S("Blackstone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Blackstone Slab"), nil) + +mcl_stairs.register_stair_and_slab("blackstone_polished", "mcl_blackstone:blackstone_polished", + {cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21}, + {"mcl_blackstone_polished.png"}, + S("Polished Blackstone Stairs"), + S("Polished Blackstone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Polished Blackstone Slab"), nil) + +mcl_stairs.register_stair_and_slab("blackstone_chiseled_polished", "mcl_blackstone:blackstone_chiseled_polished", + {cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21}, + {"mcl_blackstone_chiseled_polished.png"}, + S("Chiseled Polished Blackstone Stairs"), + S("Chiseled Polished Blackstone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Chiseled Polished Blackstone Slab"), nil) + +mcl_stairs.register_stair_and_slab("blackstone_brick_polished", "mcl_blackstone:blackstone_brick_polished", + {cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21}, + {"mcl_blackstone_polished_bricks.png"}, + S("Polished Blackstone Brick Stair Stairs"), + S("Polished Blackstone Brick Stair Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Polished Blackstone Brick Stair Slab"), nil) --Wall mcl_walls.register_wall( "mcl_blackstone:wall", S("Blackstone Wall"), - "mcl_blackstone:blackstone" + "mcl_blackstone:blackstone", + { + "mcl_blackstone_top.png", + "mcl_blackstone_top.png", + "mcl_blackstone_side.png" + }, + "", + { cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21 } ) --lavacooling diff --git a/mods/ITEMS/mcl_copper/nodes.lua b/mods/ITEMS/mcl_copper/nodes.lua index b7b78a542..f131d9967 100644 --- a/mods/ITEMS/mcl_copper/nodes.lua +++ b/mods/ITEMS/mcl_copper/nodes.lua @@ -30,7 +30,7 @@ minetest.register_node("mcl_copper:block", { _doc_items_longdesc = S("A block of copper is mostly a decorative block."), tiles = {"mcl_copper_block.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=22}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 3, @@ -43,7 +43,7 @@ minetest.register_node("mcl_copper:waxed_block", { _doc_items_longdesc = S("A block of copper is mostly a decorative block."), tiles = {"mcl_copper_block.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=23}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 3, @@ -55,7 +55,7 @@ minetest.register_node("mcl_copper:block_exposed", { _doc_items_longdesc = S("Exposed copper is a decorative block."), tiles = {"mcl_copper_exposed.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=24}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -69,7 +69,7 @@ minetest.register_node("mcl_copper:waxed_block_exposed", { _doc_items_longdesc = S("Exposed copper is a decorative block."), tiles = {"mcl_copper_exposed.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=25}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -81,7 +81,7 @@ minetest.register_node("mcl_copper:block_weathered", { _doc_items_longdesc = S("Weathered copper is a decorative block."), tiles = {"mcl_copper_weathered.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=26}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -95,7 +95,7 @@ minetest.register_node("mcl_copper:waxed_block_weathered", { _doc_items_longdesc = S("Weathered copper is a decorative block."), tiles = {"mcl_copper_weathered.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=27}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -107,7 +107,7 @@ minetest.register_node("mcl_copper:block_oxidized", { _doc_items_longdesc = S("Oxidized copper is a decorative block."), tiles = {"mcl_copper_oxidized.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, stonecuttable=28}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -120,7 +120,7 @@ minetest.register_node("mcl_copper:waxed_block_oxidized", { _doc_items_longdesc = S("Oxidized copper is a decorative block."), tiles = {"mcl_copper_oxidized.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=29}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -132,7 +132,7 @@ minetest.register_node("mcl_copper:block_cut", { _doc_items_longdesc = S("Cut copper is a decorative block."), tiles = {"mcl_copper_block_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=22, stonecutter_output=22}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -145,7 +145,7 @@ minetest.register_node("mcl_copper:waxed_block_cut", { _doc_items_longdesc = S("Cut copper is a decorative block."), tiles = {"mcl_copper_block_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=23, stonecutter_output=23}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -157,7 +157,7 @@ minetest.register_node("mcl_copper:block_exposed_cut", { _doc_items_longdesc = S("Exposed cut copper is a decorative block."), tiles = {"mcl_copper_exposed_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=24, stonecutter_output=24}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -171,7 +171,7 @@ minetest.register_node("mcl_copper:waxed_block_exposed_cut", { _doc_items_longdesc = S("Exposed cut copper is a decorative block."), tiles = {"mcl_copper_exposed_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=25, stonecutter_output=25}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -183,7 +183,7 @@ minetest.register_node("mcl_copper:block_weathered_cut", { _doc_items_longdesc = S("Weathered cut copper is a decorative block."), tiles = {"mcl_copper_weathered_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=26, stonecutter_output=26}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -197,7 +197,7 @@ minetest.register_node("mcl_copper:waxed_block_weathered_cut", { _doc_items_longdesc = S("Weathered cut copper is a decorative block."), tiles = {"mcl_copper_weathered_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=27, stonecutter_output=27}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -209,7 +209,7 @@ minetest.register_node("mcl_copper:block_oxidized_cut", { _doc_items_longdesc = S("Oxidized cut copper is a decorative block."), tiles = {"mcl_copper_oxidized_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, stonecuttable=28, stonecutter_output=28}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -222,7 +222,7 @@ minetest.register_node("mcl_copper:waxed_block_oxidized_cut", { _doc_items_longdesc = S("Oxidized cut copper is a decorative block."), tiles = {"mcl_copper_oxidized_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=29, stonecutter_output=29}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -230,112 +230,112 @@ minetest.register_node("mcl_copper:waxed_block_oxidized_cut", { }) mcl_stairs.register_slab("copper_cut", "mcl_copper:block_cut", - {pickaxey = 2, oxidizable = 1}, + {pickaxey = 2, oxidizable = 1, stonecutter_output = 22}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Slab of Cut Copper"), nil, nil, nil, S("Double Slab of Cut Copper")) mcl_stairs.register_slab("waxed_copper_cut", "mcl_copper:waxed_block_cut", - {pickaxey = 2, waxed = 1}, + {pickaxey = 2, waxed = 1, stonecutter_output = 23}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Waxed Slab of Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Cut Copper")) mcl_stairs.register_slab("copper_exposed_cut", "mcl_copper:block_exposed_cut", - {pickaxey = 2, oxidizable = 1}, + {pickaxey = 2, oxidizable = 1, stonecutter_output = 24}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Slab of Exposed Cut Copper"), nil, nil, nil, S("Double Slab of Exposed Cut Copper")) mcl_stairs.register_slab("waxed_copper_exposed_cut", "mcl_copper:waxed_block_exposed_cut", - {pickaxey = 2, waxed = 1}, + {pickaxey = 2, waxed = 1, stonecutter_output = 25}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Waxed Slab of Exposed Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Exposed Cut Copper")) mcl_stairs.register_slab("copper_weathered_cut", "mcl_copper:block_weathered_cut", - {pickaxey = 2, oxidizable = 1}, + {pickaxey = 2, oxidizable = 1, stonecutter_output = 26}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Slab of Weathered Cut Copper"), nil, nil, nil, S("Double Slab of Weathered Cut Copper")) mcl_stairs.register_slab("waxed_copper_weathered_cut", "mcl_copper:waxed_block_weathered_cut", - {pickaxey = 2, waxed = 1}, + {pickaxey = 2, waxed = 1, stonecutter_output = 27}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Waxed Slab of Weathered Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Weathered Cut Copper")) mcl_stairs.register_slab("copper_oxidized_cut", "mcl_copper:block_oxidized_cut", - {pickaxey = 2}, + {pickaxey = 2, stonecutter_output = 28}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Slab of Oxidized Cut Copper"), nil, nil, nil, S("Double Slab of Oxidized Cut Copper")) mcl_stairs.register_slab("waxed_copper_oxidized_cut", "mcl_copper:waxed_block_oxidized_cut", - {pickaxey = 2, waxed = 1}, + {pickaxey = 2, waxed = 1, stonecutter_output = 29}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Waxed Slab of Oxidized Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Oxidized Cut Copper")) mcl_stairs.register_stair("copper_cut", "mcl_copper:block_cut", - {pickaxey = 2, oxidizable = 1}, + {pickaxey = 2, oxidizable = 1, stonecutter_output = 22}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Stairs of Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_cut", "mcl_copper:waxed_block_cut", - {pickaxey = 2, waxed = 1}, + {pickaxey = 2, waxed = 1, stonecutter_output = 23}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Waxed Stairs of Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_exposed_cut", "mcl_copper:block_exposed_cut", - {pickaxey = 2, oxidizable = 1}, + {pickaxey = 2, oxidizable = 1, stonecutter_output = 24}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Stairs of Exposed Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_exposed_cut", "mcl_copper:waxed_block_exposed_cut", - {pickaxey = 2, waxed = 1}, + {pickaxey = 2, waxed = 1, stonecutter_output = 25}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Waxed Stairs of Exposed Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_weathered_cut", "mcl_copper:block_weathered_cut", - {pickaxey = 2, oxidizable = 1}, + {pickaxey = 2, oxidizable = 1, stonecutter_output = 26}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Stairs of Weathered Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_weathered_cut", "mcl_copper:waxed_block_weathered_cut", - {pickaxey = 2, waxed = 1}, + {pickaxey = 2, waxed = 1, stonecutter_output = 27}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Waxed Stairs of Weathered Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_oxidized_cut", "mcl_copper:block_oxidized_cut", - {pickaxey = 2}, + {pickaxey = 2, stonecutter_output = 28}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Stairs of Oxidized Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_oxidized_cut", "mcl_copper:waxed_block_oxidized_cut", - {pickaxey = 2, waxed = 1}, + {pickaxey = 2, waxed = 1, stonecutter_output = 29}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Waxed Stairs of Oxidized Cut Copper"), nil, 6, nil, diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 3f269def4..41fecbde3 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -236,7 +236,7 @@ minetest.register_node("mcl_core:stonebrick", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"default_stone_brick.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=1, stonecutter_output=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -248,7 +248,7 @@ minetest.register_node("mcl_core:stonebrickcarved", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_carved.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecutter_output=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -272,7 +272,7 @@ minetest.register_node("mcl_core:stonebrickmossy", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_mossy.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=3}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -297,7 +297,7 @@ minetest.register_node("mcl_core:granite", { tiles = {"mcl_core_granite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=4}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -309,7 +309,7 @@ minetest.register_node("mcl_core:granite_smooth", { tiles = {"mcl_core_granite_smooth.png"}, stack_max = 64, is_ground_content = false, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=4, stonecutter_output=4}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -321,7 +321,7 @@ minetest.register_node("mcl_core:andesite", { tiles = {"mcl_core_andesite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=5}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -333,7 +333,7 @@ minetest.register_node("mcl_core:andesite_smooth", { tiles = {"mcl_core_andesite_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=5, stonecutter_output=5}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -345,7 +345,7 @@ minetest.register_node("mcl_core:diorite", { tiles = {"mcl_core_diorite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=6}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -357,7 +357,7 @@ minetest.register_node("mcl_core:diorite_smooth", { tiles = {"mcl_core_diorite_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=6, stonecutter_output=6}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -586,7 +586,7 @@ minetest.register_node("mcl_core:sandstone", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=9}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -598,7 +598,7 @@ minetest.register_node("mcl_core:sandstonesmooth", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=9, stonecutter_output=9}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -610,7 +610,7 @@ minetest.register_node("mcl_core:sandstonecarved", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_carved.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecutter_output=9}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -623,7 +623,7 @@ minetest.register_node("mcl_core:sandstonesmooth2", { tiles = {"mcl_core_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=9, stonecutter_output=9}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -649,7 +649,7 @@ minetest.register_node("mcl_core:redsandstone", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=10}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -661,7 +661,7 @@ minetest.register_node("mcl_core:redsandstonesmooth", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=10, stonecutter_output=10}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -673,7 +673,7 @@ minetest.register_node("mcl_core:redsandstonecarved", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_carved.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecutter_output=10}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -685,7 +685,7 @@ minetest.register_node("mcl_core:redsandstonesmooth2", { tiles = {"mcl_core_red_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=1, stonecutter_output=10}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -715,7 +715,7 @@ minetest.register_node("mcl_core:brick_block", { tiles = {"default_brick.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=16}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -768,7 +768,7 @@ minetest.register_node("mcl_core:cobble", { tiles = {"default_cobble.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, cobble=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, cobble=1, stonecuttable=7}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -780,7 +780,7 @@ minetest.register_node("mcl_core:mossycobble", { tiles = {"default_mossycobble.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=8}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua index f96c10633..b3a6adf30 100644 --- a/mods/ITEMS/mcl_end/building.lua +++ b/mods/ITEMS/mcl_end/building.lua @@ -13,7 +13,7 @@ minetest.register_node("mcl_end:end_stone", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_end_end_stone.png"}, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=20}, sounds = mcl_sounds.node_sound_stone_defaults(), after_dig_node = mcl_end.check_detach_chorus_plant, _mcl_blast_resistance = 9, @@ -26,7 +26,7 @@ minetest.register_node("mcl_end:end_bricks", { tiles = {"mcl_end_end_bricks.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=20, stonecutter_output=20}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 9, _mcl_hardness = 3, @@ -38,7 +38,7 @@ minetest.register_node("mcl_end:purpur_block", { tiles = {"mcl_end_purpur_block.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1, stonecuttable=15}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -52,7 +52,7 @@ minetest.register_node("mcl_end:purpur_pillar", { is_ground_content = false, on_place = mcl_util.rotate_axis, tiles = {"mcl_end_purpur_pillar_top.png", "mcl_end_purpur_pillar_top.png", "mcl_end_purpur_pillar.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1, stonecutter_output=15}, sounds = mcl_sounds.node_sound_stone_defaults(), on_rotate = on_rotate, _mcl_blast_resistance = 6, diff --git a/mods/ITEMS/mcl_mud/init.lua b/mods/ITEMS/mcl_mud/init.lua index b7542e0d5..5a99ff754 100644 --- a/mods/ITEMS/mcl_mud/init.lua +++ b/mods/ITEMS/mcl_mud/init.lua @@ -38,7 +38,7 @@ minetest.register_node("mcl_mud:mud_bricks", { _doc_items_longdesc = S("Decorative block crafted from packed mud."), _doc_items_hidden = false, tiles = {"mcl_mud_bricks.png"}, - groups = {handy=1, pickaxey=1, building_block=1, stonecuttable=1}, + groups = {handy=1, pickaxey=1, building_block=1, stonecuttable=30}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 3, _mcl_hardness = 1.5, diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index 81b6d352c..396bb1926 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -176,7 +176,7 @@ minetest.register_node("mcl_nether:nether_brick", { stack_max = 64, tiles = {"mcl_nether_nether_brick.png"}, is_ground_content = false, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=17}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -189,7 +189,7 @@ minetest.register_node("mcl_nether:red_nether_brick", { stack_max = 64, tiles = {"mcl_nether_red_nether_brick.png"}, is_ground_content = false, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=18}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -219,7 +219,7 @@ minetest.register_node("mcl_nether:quartz_block", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=14}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -231,7 +231,7 @@ minetest.register_node("mcl_nether:quartz_chiseled", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_chiseled_top.png", "mcl_nether_quartz_chiseled_top.png", "mcl_nether_quartz_chiseled_side.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecutter_output=14}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -245,7 +245,7 @@ minetest.register_node("mcl_nether:quartz_pillar", { is_ground_content = false, on_place = mcl_util.rotate_axis, tiles = {"mcl_nether_quartz_pillar_top.png", "mcl_nether_quartz_pillar_top.png", "mcl_nether_quartz_pillar_side.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecutter_output=14}, sounds = mcl_sounds.node_sound_stone_defaults(), on_rotate = on_rotate, _mcl_blast_resistance = 0.8, @@ -257,7 +257,7 @@ minetest.register_node("mcl_nether:quartz_smooth", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_block_bottom.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=14, stonecutter_output=14}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, diff --git a/mods/ITEMS/mcl_ocean/prismarine.lua b/mods/ITEMS/mcl_ocean/prismarine.lua index e3b899a49..e1a0a3a98 100644 --- a/mods/ITEMS/mcl_ocean/prismarine.lua +++ b/mods/ITEMS/mcl_ocean/prismarine.lua @@ -38,7 +38,7 @@ minetest.register_node("mcl_ocean:prismarine", { is_ground_content = false, -- Texture should have 22 frames for smooth transitions. tiles = {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=11}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -50,7 +50,7 @@ minetest.register_node("mcl_ocean:prismarine_brick", { stack_max = 64, is_ground_content = false, tiles = {"mcl_ocean_prismarine_bricks.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=12}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -62,7 +62,7 @@ minetest.register_node("mcl_ocean:prismarine_dark", { stack_max = 64, is_ground_content = false, tiles = {"mcl_ocean_prismarine_dark.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=13}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index eee4c5dc2..706f12cd2 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -30,167 +30,318 @@ for w=1, #woods do wood[5]) end -mcl_stairs.register_stair_and_slab_simple("stone_rough", "mcl_core:stone", S("Stone Stairs"), S("Stone Slab"), S("Double Stone Slab")) + +mcl_stairs.register_slab("stone_rough", "mcl_core:stone", + {pickaxey=1, material_stone=1, stonecutter_output=1}, + {"default_stone.png"}, + S("Stone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Stone Slab")) +mcl_stairs.register_stair("stone_rough", "group:stone", + {pickaxey=1, material_stone=1,stonecutter_output=1}, + {"default_stone.png"}, + S("Stone Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("stone", "mcl_core:stone_smooth", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=2}, {"mcl_stairs_stone_slab_top.png", "mcl_stairs_stone_slab_top.png", "mcl_stairs_stone_slab_side.png"}, S("Polished Stone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Polished Stone Slab")) -mcl_stairs.register_stair_and_slab_simple("andesite", "mcl_core:andesite", S("Andesite Stairs"), S("Andesite Slab"), S("Double Andesite Slab")) -mcl_stairs.register_stair_and_slab_simple("granite", "mcl_core:granite", S("Granite Stairs"), S("Granite Slab"), S("Double Granite Slab")) -mcl_stairs.register_stair_and_slab_simple("diorite", "mcl_core:diorite", S("Diorite Stairs"), S("Diorite Slab"), S("Double Diorite Slab")) +mcl_stairs.register_stair("andesite", "mcl_core:andesite", + {pickaxey=1, material_stone=1,stonecutter_output=5}, + {"mcl_core_andesite.png"}, + S("Andesite Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("andesite", "mcl_core:andesite", + {pickaxey=1, material_stone=1, stonecutter_output=5}, + {"mcl_core_andesite.png"}, + S("Andesite Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Andesite Slab")) -mcl_stairs.register_stair_and_slab_simple("cobble", "mcl_core:cobble", S("Cobblestone Stairs"), S("Cobblestone Slab"), S("Double Cobblestone Slab")) -mcl_stairs.register_stair_and_slab_simple("mossycobble", "mcl_core:mossycobble", S("Mossy Cobblestone Stairs"), S("Mossy Cobblestone Slab"), S("Double Mossy Cobblestone Slab")) +mcl_stairs.register_stair("granite", "mcl_core:granite", + {pickaxey=1, material_stone=1,stonecutter_output=4}, + {"mcl_core_granite.png"}, + S("Granite Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("granite", "mcl_core:granite", + {pickaxey=1, material_stone=1, stonecutter_output=4}, + {"mcl_core_granite.png"}, + S("Granite Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Granite Slab")) -mcl_stairs.register_stair_and_slab_simple("brick_block", "mcl_core:brick_block", S("Brick Stairs"), S("Brick Slab"), S("Double Brick Slab")) +mcl_stairs.register_stair("diorite", "mcl_core:diorite", + {pickaxey=1, material_stone=1,stonecutter_output=6}, + {"mcl_core_diorite.png"}, + S("Granite Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("granite", "mcl_core:diorite", + {pickaxey=1, material_stone=1, stonecutter_output=6}, + {"mcl_core_diorite.png"}, + S("Diorite Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Diorite Slab")) +mcl_stairs.register_stair("cobble", "mcl_core:cobble", + {pickaxey=1, material_stone=1,stonecutter_output=7}, + {"default_cobble.png"}, + S("Cobblestone Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("cobble", "mcl_core:cobble", + {pickaxey=1, material_stone=1, stonecutter_output=7}, + {"default_cobble.png"}, + S("Cobblestone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Cobblestone Slab")) + +mcl_stairs.register_stair("mossycobble", "mcl_core:mossycobble", + {pickaxey=1, material_stone=1,stonecutter_output=8}, + {"default_mossycobble.png"}, + S("Mossy Cobblestone Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("mossycobble", "mcl_core:mossycobble", + {pickaxey=1, material_stone=1, stonecutter_output=8}, + {"default_mossycobble.png"}, + S("Mossy Cobblestone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Mossy Cobblestone Slab")) + +mcl_stairs.register_stair("brick_block", "mcl_core:brick_block", + {pickaxey=1, material_stone=1,stonecutter_output=16}, + {"default_brick.png"}, + S("Brick Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("brick_block", "mcl_core:brick_block", + {pickaxey=1, material_stone=1, stonecutter_output=16}, + {"default_brick.png"}, + S("Brick Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Brick Slab")) mcl_stairs.register_stair("sandstone", "group:normal_sandstone", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=9}, {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, S("Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_core:sandstone") --fixme: extra parameter from previous release mcl_stairs.register_slab("sandstone", "group:normal_sandstone", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=9}, {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, S("Sandstone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Sandstone Slab"), "mcl_core:sandstone") --fixme: extra parameter from previous release -mcl_stairs.register_stair_and_slab_simple("sandstonesmooth2", "mcl_core:sandstonesmooth2", S("Smooth Sandstone Stairs"), S("Smooth Sandstone Slab"), S("Double Smooth Sandstone Slab")) + +mcl_stairs.register_stair("sandstonesmooth2", "mcl_core:sandstonesmooth2", + {pickaxey=1, material_stone=1, stonecutter_output=9}, + {"mcl_core_sandstone_top.png"}, + S("Smooth Sandstone Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("sandstonesmooth2", "mcl_core:sandstonesmooth2", + {pickaxey=1, material_stone=1, stonecutter_output=9}, + {"mcl_core_sandstone_top.png"}, + S("Smooth Sandstone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Smooth Sandstone Slab")) mcl_stairs.register_stair("redsandstone", "group:red_sandstone", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=10}, {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, S("Red Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_core:redsandstone") --fixme: extra parameter from previous release mcl_stairs.register_slab("redsandstone", "group:red_sandstone", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=10}, {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, S("Red Sandstone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Red Sandstone Slab"), "mcl_core:redsandstone") --fixme: extra parameter from previous release -mcl_stairs.register_stair_and_slab_simple("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", S("Smooth Red Sandstone Stairs"), S("Smooth Red Sandstone Slab"), S("Double Smooth Red Sandstone Slab")) + +mcl_stairs.register_stair("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", + {pickaxey=1, material_stone=1, stonecutter_output=10}, + {"mcl_core_red_sandstone_top.png"}, + S("Smooth Red Sandstone Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", + {pickaxey=1, material_stone=1, stonecutter_output=10}, + {"mcl_core_red_sandstone_top.png"}, + S("Smooth Red Sandstone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Smooth Red Sandstone Slab")) -- Intentionally not group:stonebrick because of mclx_stairs mcl_stairs.register_stair("stonebrick", "mcl_core:stonebrick", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=1}, {"default_stone_brick.png"}, S("Stone Bricks Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil, "mcl_core:stonebrick") --fixme: extra parameter from previous release mcl_stairs.register_slab("stonebrick", "mcl_core:stonebrick", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=1}, {"default_stone_brick.png"}, S("Stone Bricks Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Stone Bricks Slab"), "mcl_core:stonebrick") --fixme: extra parameter from previous release mcl_stairs.register_stair("quartzblock", "group:quartz_block", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=14}, {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, S("Quartz Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_nether:quartz_block") --fixme: extra parameter from previous release mcl_stairs.register_slab("quartzblock", "group:quartz_block", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=14}, {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, S("Quartz Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Quartz Slab"), "mcl_nether:quartz_block") --fixme: extra parameter from previous release -mcl_stairs.register_stair_and_slab_simple("quartz_smooth", "mcl_nether:quartz_smooth", S("Smooth Quartz Stairs"), S("Smooth Quartz Slab"), S("Double Smooth Quartz Slab")) +mcl_stairs.register_stair("quartz_smooth", "mcl_nether:quartz_smooth", + {pickaxey=1, material_stone=1, stonecutter_output=14}, + {"mcl_nether_quartz_block_bottom.png"}, + S("Smooth Quartz Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("quartz_smooth", "mcl_nether:quartz_smooth", + {pickaxey=1, material_stone=1, stonecutter_output=14}, + {"mcl_nether_quartz_block_bottom.png"}, + S("Smooth Quartz Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Smooth Quartz Slab")) mcl_stairs.register_stair_and_slab("nether_brick", "mcl_nether:nether_brick", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=17}, {"mcl_nether_nether_brick.png"}, S("Nether Brick Stairs"), S("Nether Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Nether Brick Slab"), nil) mcl_stairs.register_stair_and_slab("red_nether_brick", "mcl_nether:red_nether_brick", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=18}, {"mcl_nether_red_nether_brick.png"}, S("Red Nether Brick Stairs"), S("Red Nether Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Red Nether Brick Slab"), nil) -mcl_stairs.register_stair_and_slab_simple("end_bricks", "mcl_end:end_bricks", S("End Stone Brick Stairs"), S("End Stone Brick Slab"), S("Double End Stone Brick Slab")) +mcl_stairs.register_stair_and_slab("end_bricks", "mcl_end:end_bricks", + {pickaxey=1, material_stone=1, stonecutter_output=20}, + {"mcl_end_end_bricks.png"}, + S("End Stone Brick Stairs"), + S("End Stone Brick Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double End Stone Brick Slab"), nil) mcl_stairs.register_stair("purpur_block", "group:purpur_block", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=15}, {"mcl_end_purpur_block.png"}, S("Purpur Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil) mcl_stairs.register_slab("purpur_block", "group:purpur_block", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=15}, {"mcl_end_purpur_block.png"}, S("Purpur Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Purpur Slab")) -mcl_stairs.register_stair_and_slab_simple("prismarine", "mcl_ocean:prismarine", S("Prismarine Stairs"), S("Prismarine Slab"), S("Double Prismarine Slab")) +mcl_stairs.register_stair("prismarine", "mcl_ocean:prismarine", + {pickaxey=1, material_stone=1, stonecutter_output=11}, + {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, + S("Prismarine Stairs"), + mcl_sounds.node_sound_stone_defaults(), 6, 1.5, + nil) +mcl_stairs.register_slab("prismarine", "mcl_ocean:prismarine", + {pickaxey=1, material_stone=1, stonecutter_output=11}, + {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, + S("Prismarine Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Prismarine Slab")) -mcl_stairs.register_stair_and_slab_simple("mud_brick", "mcl_mud:mud_bricks", S("Mud Brick Stair"), S("Mud Brick Slab"), S("Double Mud Brick Slab")) +mcl_stairs.register_stair("prismarine_brick", "mcl_ocean:prismarine_brick", + {pickaxey=1, material_stone=1, stonecutter_output=12}, + {"mcl_ocean_prismarine_bricks.png"}, + S("prismarine Brick Stairs"), + mcl_sounds.node_sound_stone_defaults(), 6, 1.5, + nil) +mcl_stairs.register_slab("prismarine_brick", "mcl_ocean:prismarine_brick", + {pickaxey=1, material_stone=1, stonecutter_output=12}, + {"mcl_ocean_prismarine_bricks.png"}, + S("prismarine Brick Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double prismarine_brick Slab")) -mcl_stairs.register_stair_and_slab_simple("prismarine_brick", "mcl_ocean:prismarine_brick", S("Prismarine Brick Stairs"), S("Prismarine Brick Slab"), S("Double Prismarine Brick Slab")) -mcl_stairs.register_stair_and_slab_simple("prismarine_dark", "mcl_ocean:prismarine_dark", S("Dark Prismarine Stairs"), S("Dark Prismarine Slab"), S("Double Dark Prismarine Slab")) +mcl_stairs.register_stair("prismarine_dark", "mcl_ocean:prismarine_dark", + {pickaxey=1, material_stone=1, stonecutter_output=13}, + {"mcl_ocean_prismarine_dark.png"}, + S("prismarine Brick Stairs"), + mcl_sounds.node_sound_stone_defaults(), 6, 1.5, + nil) +mcl_stairs.register_slab("prismarine_dark", "mcl_ocean:prismarine_dark", + {pickaxey=1, material_stone=1, stonecutter_output=13}, + {"mcl_ocean_prismarine_dark.png"}, + S("Dark Prismarine Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Dark Prismarine Slab")) + +mcl_stairs.register_stair_and_slab("mud_brick", "mcl_mud:mud_bricks", + {pickaxey=1, material_stone=1, stonecutter_output=30}, + {"mcl_mud_bricks.png"}, + S("Mud Brick Stairs"), + S("Mud Brick Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Mud Brick Slab"), nil) mcl_stairs.register_slab("andesite_smooth", "mcl_core:andesite_smooth", - {pickaxey=1}, + {pickaxey=1, stonecutter_output=5}, {"mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, S("Polished Andesite Slab"), nil, 6, nil, S("Double Polished Andesite Slab")) mcl_stairs.register_stair("andesite_smooth", "mcl_core:andesite_smooth", - {pickaxey=1}, + {pickaxey=1, stonecutter_output=5}, {"mcl_stairs_andesite_smooth_slab.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, S("Polished Andesite Stairs"), nil, 6, nil, "woodlike") mcl_stairs.register_slab("granite_smooth", "mcl_core:granite_smooth", - {pickaxey=1}, + {pickaxey=1, stonecutter_output=4}, {"mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, S("Polished Granite Slab"), nil, 6, nil, S("Double Polished Granite Slab")) mcl_stairs.register_stair("granite_smooth", "mcl_core:granite_smooth", - {pickaxey=1}, + {pickaxey=1, stonecutter_output=4}, {"mcl_stairs_granite_smooth_slab.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, S("Polished Granite Stairs"), nil, 6, nil, "woodlike") mcl_stairs.register_slab("diorite_smooth", "mcl_core:diorite_smooth", - {pickaxey=1}, + {pickaxey=1, stonecutter_output=6}, {"mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, S("Polished Diorite Slab"), nil, 6, nil, S("Double Polished Diorite Slab")) mcl_stairs.register_stair("diorite_smooth", "mcl_core:diorite_smooth", - {pickaxey=1}, + {pickaxey=1, stonecutter_output=6}, {"mcl_stairs_diorite_smooth_slab.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, S("Polished Diorite Stairs"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("stonebrickmossy", "mcl_core:stonebrickmossy", - {pickaxey=1}, + {pickaxey=1, stonecutter_output=3}, {"mcl_core_stonebrick_mossy.png"}, S("Mossy Stone Brick Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil) mcl_stairs.register_slab("stonebrickmossy", "mcl_core:stonebrickmossy", - {pickaxey=1}, + {pickaxey=1, stonecutter_output=3}, {"mcl_core_stonebrick_mossy.png"}, S("Mossy Stone Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 77ca5c066..1fd37cdc6 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -45,60 +45,41 @@ local function show_stonecutter_formspec(items, input) return formspec end --- Strips the start of the item like "mcl_core:" and removes any numbers or whitespaces after it -local function get_item_string_name(input) - local colonIndex = string.find(input, ":") - if colonIndex then - input = string.sub(input, colonIndex + 1) - else - return input +local function check(item_name) + if string.match(item_name, "mcl_walls") then + if string.match(item_name, "%d") then + return true + end + return false end - local whitespaceIndex = string.find(input, "%s") - if whitespaceIndex then - return string.sub(input, 1, whitespaceIndex - 1) - else - return input - end + if string.match(item_name, "_outer") then + return true + elseif string.match(item_name, "_inner") then + return true + elseif string.match(item_name, "_top") then + return true + elseif string.match(item_name, "_double") then + return true + end + return false end + -- Updates the formspec local function update_stonecutter_slots(meta) local inv = meta:get_inventory() local input = inv:get_stack("input", 1) local name = input:get_name() local new_output = meta:get_string("cut_stone") + local compat_item = minetest.get_item_group(name, "stonecuttable") - -- Checks if input is in the array - if minetest.get_item_group(name, "stonecuttable") > 0 then + -- Checks if input is in the group + if compat_item > 0 then local cuttable_recipes = {} - local name_stripped = get_item_string_name(input:to_string()) - if name_stripped ~= "" then - -- Strings for the possible items it can craft into - local stair = "mcl_stairs:stair_"..name_stripped - local slab = "mcl_stairs:slab_"..name_stripped - local wall = "mcl_walls:"..name_stripped - local smooth = "mcl_core:"..name_stripped.."_smooth" - - -- Goes through and checks if the item exists and inserts it into the table - if minetest.registered_items[slab] ~= nil then - table.insert(cuttable_recipes, slab) - end - if minetest.registered_items[stair] ~= nil then - table.insert(cuttable_recipes, stair) - end - if minetest.registered_items[wall] ~= nil then - table.insert(cuttable_recipes, wall) - end - if minetest.registered_items[smooth] ~= nil then - local smooth_stair = "mcl_stairs:stair_"..name_stripped.."_smooth" - local smooth_slab = "mcl_stairs:slab_"..name_stripped.."_smooth" - - table.insert(cuttable_recipes, smooth) - if minetest.registered_items[smooth_slab] ~= nil then - table.insert(cuttable_recipes, smooth_slab) - end - if minetest.registered_items[smooth_stair] ~= nil then - table.insert(cuttable_recipes, smooth_stair) + for item_name, item_def in pairs(minetest.registered_items) do + if item_def.groups and item_def.groups["stonecutter_output"] == compat_item then + if check(item_name) == false then + table.insert(cuttable_recipes, item_name) end end end diff --git a/mods/ITEMS/mcl_walls/register.lua b/mods/ITEMS/mcl_walls/register.lua index 96a1b9b9f..241c5ecc1 100644 --- a/mods/ITEMS/mcl_walls/register.lua +++ b/mods/ITEMS/mcl_walls/register.lua @@ -1,17 +1,17 @@ local S = minetest.get_translator(minetest.get_current_modname()) -mcl_walls.register_wall("mcl_walls:cobble", S("Cobblestone Wall"), "mcl_core:cobble", {"mcl_walls_cobble_wall_top.png", "default_cobble.png", "mcl_walls_cobble_wall_side.png"}) -mcl_walls.register_wall("mcl_walls:mossycobble", S("Mossy Cobblestone Wall"), "mcl_core:mossycobble", {"mcl_walls_cobble_mossy_wall_top.png", "default_mossycobble.png", "mcl_walls_cobble_mossy_wall_side.png"}) -mcl_walls.register_wall("mcl_walls:andesite", S("Andesite Wall"), "mcl_core:andesite") -mcl_walls.register_wall("mcl_walls:granite", S("Granite Wall"), "mcl_core:granite") -mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorite") -mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block") -mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone") -mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone") -mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick") -mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy") -mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine") -mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks") -mcl_walls.register_wall("mcl_walls:netherbrick", S("Nether Brick Wall"), "mcl_nether:nether_brick") -mcl_walls.register_wall("mcl_walls:rednetherbrick", S("Red Nether Brick Wall"), "mcl_nether:red_nether_brick") -mcl_walls.register_wall("mcl_walls:mudbrick", S("Mud Brick Wall"), "mcl_mud:mud_bricks") \ No newline at end of file +mcl_walls.register_wall("mcl_walls:cobble", S("Cobblestone Wall"), "mcl_core:cobble", {"mcl_walls_cobble_wall_top.png", "default_cobble.png", "mcl_walls_cobble_wall_side.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=7}) +mcl_walls.register_wall("mcl_walls:mossycobble", S("Mossy Cobblestone Wall"), "mcl_core:mossycobble", {"mcl_walls_cobble_mossy_wall_top.png", "default_mossycobble.png", "mcl_walls_cobble_mossy_wall_side.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=8}) +mcl_walls.register_wall("mcl_walls:andesite", S("Andesite Wall"), "mcl_core:andesite", {"mcl_core_andesite.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=5}) +mcl_walls.register_wall("mcl_walls:granite", S("Granite Wall"), "mcl_core:granite", {"mcl_core_granite.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=4}) +mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorite", {"mcl_core_diorite.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=6}) +mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block", {"default_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=16}) +mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone", {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=9}) +mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone", {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_carved.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=10}) +mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick", {"default_stone_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=1}) +mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy", {"mcl_core_stonebrick_mossy.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=3}) +mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine",{{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, "", {pickaxey=1, material_stone=1, stonecutter_output=11}) +mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks", {"mcl_end_end_bricks.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=20}) +mcl_walls.register_wall("mcl_walls:netherbrick", S("Nether Brick Wall"), "mcl_nether:nether_brick", {"mcl_nether_nether_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=17}) +mcl_walls.register_wall("mcl_walls:rednetherbrick", S("Red Nether Brick Wall"), "mcl_nether:red_nether_brick", {"mcl_nether_red_nether_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=18}) +mcl_walls.register_wall("mcl_walls:mudbrick", S("Mud Brick Wall"), "mcl_mud:mud_bricks", {"mcl_mud_bricks.png"}, "", {handy=1, pickaxey=1, material_stone=1, stonecutter_output=30}) \ No newline at end of file From 524c9c1bcc9cb36f6e9582d5d907d91f57885fd6 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 6 Aug 2023 21:42:34 +0100 Subject: [PATCH 054/345] Dupe glitch fizes and remove item label --- mods/ITEMS/mcl_stonecutter/README.md | 2 +- mods/ITEMS/mcl_stonecutter/init.lua | 35 ++++++++++++++-------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/README.md b/mods/ITEMS/mcl_stonecutter/README.md index c6316a5a2..3b6e23e05 100644 --- a/mods/ITEMS/mcl_stonecutter/README.md +++ b/mods/ITEMS/mcl_stonecutter/README.md @@ -5,7 +5,7 @@ Adds the stonecutter block. Used to cut stone like materials into stairs, slabs, License of code --------------- See the main MineClone 2 README.md file. -Author: PrairieWind +Author: PrairieWind, ChrisPHP, cora License of media ---------------- diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 1fd37cdc6..2794da561 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -19,8 +19,7 @@ local function show_stonecutter_formspec(items, input) y_len = y_len + 1 x_len = 1 end - local test = string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",x_len+1,y_len,1,1, value, "item_button", value) - cut_items[index] = test + table.insert(cut_items,string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",x_len+1,y_len,1,1, value, value, "")) end end @@ -66,11 +65,11 @@ end -- Updates the formspec -local function update_stonecutter_slots(meta) +local function update_stonecutter_slots(pos,str) + local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local input = inv:get_stack("input", 1) local name = input:get_name() - local new_output = meta:get_string("cut_stone") local compat_item = minetest.get_item_group(name, "stonecuttable") -- Checks if input is in the group @@ -89,9 +88,9 @@ local function update_stonecutter_slots(meta) end -- Checks if the chosen item is a slab or not, if it's a slab set the output to be a stack of 2 - if new_output ~= '' then - local cut_item = ItemStack(new_output) - if string.find(new_output, "mcl_stairs:slab_") then + if minetest.get_item_group(str, "stonecutter_output") > 0 then + local cut_item = ItemStack(str) + if string.match(str, "mcl_stairs:slab_") then cut_item:set_count(2) else cut_item:set_count(1) @@ -112,6 +111,7 @@ local function drop_stonecutter_items(pos, meta) minetest.add_item(p, stack) end end + minetest.set_node(pos,{name="air"}) end minetest.register_node("mcl_stonecutter:stonecutter", { @@ -199,7 +199,7 @@ minetest.register_node("mcl_stonecutter:stonecutter", { end end end - update_stonecutter_slots(meta) + update_stonecutter_slots(pos) end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) local name = player:get_player_name() @@ -213,8 +213,7 @@ minetest.register_node("mcl_stonecutter:stonecutter", { end end, on_metadata_inventory_put = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos) - update_stonecutter_slots(meta) + update_stonecutter_slots(pos) end, on_metadata_inventory_take = function(pos, listname, index, stack, player) local meta = minetest.get_meta(pos) @@ -229,7 +228,7 @@ minetest.register_node("mcl_stonecutter:stonecutter", { else meta:set_string("cut_stone", nil) end - update_stonecutter_slots(meta) + update_stonecutter_slots(pos) end, on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -241,8 +240,7 @@ minetest.register_node("mcl_stonecutter:stonecutter", { end, on_rightclick = function(pos, node, player, itemstack) if not player:get_player_control().sneak then - local meta = minetest.get_meta(pos) - update_stonecutter_slots(meta) + update_stonecutter_slots(pos) end end, on_receive_fields = function(pos, formname, fields, sender) @@ -251,10 +249,13 @@ minetest.register_node("mcl_stonecutter:stonecutter", { minetest.record_protection_violation(pos, sender_name) return end - if fields.item_button then - local meta = minetest.get_meta(pos) - meta:set_string("cut_stone", fields.item_button) - update_stonecutter_slots(meta) + if fields then + for field_name, value in pairs(fields) do + local item_name = tostring(field_name) + if item_name then + update_stonecutter_slots(pos, item_name) + end + end end end, }) From 5dda3033a5b1316dd528abb0eca66cdff0f5c0c4 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 6 Aug 2023 22:17:18 +0100 Subject: [PATCH 055/345] Prevent input from being a selectable option --- mods/ITEMS/mcl_stonecutter/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 2794da561..5db74d3ac 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -44,6 +44,8 @@ local function show_stonecutter_formspec(items, input) return formspec end + +--Checks for the string for the different stair and wall positions that shouldn't be craftable local function check(item_name) if string.match(item_name, "mcl_walls") then if string.match(item_name, "%d") then @@ -77,7 +79,7 @@ local function update_stonecutter_slots(pos,str) local cuttable_recipes = {} for item_name, item_def in pairs(minetest.registered_items) do if item_def.groups and item_def.groups["stonecutter_output"] == compat_item then - if check(item_name) == false then + if check(item_name) == false and name ~= item_name then table.insert(cuttable_recipes, item_name) end end From 40fb043de2c4f894cb6e3e2b80f1dd90f5aa7f14 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Mon, 7 Aug 2023 08:45:03 +0100 Subject: [PATCH 056/345] Add stage so smooth items can't be reverted --- mods/ITEMS/mcl_core/nodes_base.lua | 16 +++++++-------- mods/ITEMS/mcl_nether/init.lua | 2 +- mods/ITEMS/mcl_stairs/register.lua | 30 ++++++++++++++--------------- mods/ITEMS/mcl_stonecutter/init.lua | 10 ++++++---- mods/ITEMS/mcl_walls/register.lua | 2 +- 5 files changed, 31 insertions(+), 29 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 41fecbde3..c6613802a 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -236,7 +236,7 @@ minetest.register_node("mcl_core:stonebrick", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"default_stone_brick.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=1, stonecutter_output=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=1, stonecutter_output=1, stonecutter_stage=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -248,7 +248,7 @@ minetest.register_node("mcl_core:stonebrickcarved", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_carved.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecutter_output=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecutter_output=1, stonecutter_stage=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -309,7 +309,7 @@ minetest.register_node("mcl_core:granite_smooth", { tiles = {"mcl_core_granite_smooth.png"}, stack_max = 64, is_ground_content = false, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=4, stonecutter_output=4}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=4, stonecutter_output=4, stonecutter_stage=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -321,7 +321,7 @@ minetest.register_node("mcl_core:andesite", { tiles = {"mcl_core_andesite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=5}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=5,}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -333,7 +333,7 @@ minetest.register_node("mcl_core:andesite_smooth", { tiles = {"mcl_core_andesite_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=5, stonecutter_output=5}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=5, stonecutter_output=5, stonecutter_stage=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -357,7 +357,7 @@ minetest.register_node("mcl_core:diorite_smooth", { tiles = {"mcl_core_diorite_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=6, stonecutter_output=6}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=6, stonecutter_output=6, stonecutter_stage=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -623,7 +623,7 @@ minetest.register_node("mcl_core:sandstonesmooth2", { tiles = {"mcl_core_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=9, stonecutter_output=9}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=9, stonecutter_output=9, stonecutter_stage=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -685,7 +685,7 @@ minetest.register_node("mcl_core:redsandstonesmooth2", { tiles = {"mcl_core_red_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=1, stonecutter_output=10}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=10, stonecutter_output=10, stonecutter_stage=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index 396bb1926..f66877707 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -257,7 +257,7 @@ minetest.register_node("mcl_nether:quartz_smooth", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_block_bottom.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=14, stonecutter_output=14}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=31, stonecutter_output=31}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index 706f12cd2..a669f2a22 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -79,7 +79,7 @@ mcl_stairs.register_stair("diorite", "mcl_core:diorite", {"mcl_core_diorite.png"}, S("Granite Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) -mcl_stairs.register_slab("granite", "mcl_core:diorite", +mcl_stairs.register_slab("diorite", "mcl_core:diorite", {pickaxey=1, material_stone=1, stonecutter_output=6}, {"mcl_core_diorite.png"}, S("Diorite Slab"), @@ -136,12 +136,12 @@ mcl_stairs.register_slab("sandstone", "group:normal_sandstone", S("Double Sandstone Slab"), "mcl_core:sandstone") --fixme: extra parameter from previous release mcl_stairs.register_stair("sandstonesmooth2", "mcl_core:sandstonesmooth2", - {pickaxey=1, material_stone=1, stonecutter_output=9}, + {pickaxey=1, material_stone=1, stonecutter_output=9, stonecutter_stage=1}, {"mcl_core_sandstone_top.png"}, S("Smooth Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("sandstonesmooth2", "mcl_core:sandstonesmooth2", - {pickaxey=1, material_stone=1, stonecutter_output=9}, + {pickaxey=1, material_stone=1, stonecutter_output=9, stonecutter_stage=1}, {"mcl_core_sandstone_top.png"}, S("Smooth Sandstone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, @@ -161,12 +161,12 @@ mcl_stairs.register_slab("redsandstone", "group:red_sandstone", S("Double Red Sandstone Slab"), "mcl_core:redsandstone") --fixme: extra parameter from previous release mcl_stairs.register_stair("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", - {pickaxey=1, material_stone=1, stonecutter_output=10}, + {pickaxey=1, material_stone=1, stonecutter_output=10, stonecutter_stage=1}, {"mcl_core_red_sandstone_top.png"}, S("Smooth Red Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", - {pickaxey=1, material_stone=1, stonecutter_output=10}, + {pickaxey=1, material_stone=1, stonecutter_output=10, stonecutter_stage=1}, {"mcl_core_red_sandstone_top.png"}, S("Smooth Red Sandstone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, @@ -174,13 +174,13 @@ mcl_stairs.register_slab("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", -- Intentionally not group:stonebrick because of mclx_stairs mcl_stairs.register_stair("stonebrick", "mcl_core:stonebrick", - {pickaxey=1, material_stone=1, stonecutter_output=1}, + {pickaxey=1, material_stone=1, stonecutter_output=1, stonecutter_stage=1}, {"default_stone_brick.png"}, S("Stone Bricks Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil, "mcl_core:stonebrick") --fixme: extra parameter from previous release mcl_stairs.register_slab("stonebrick", "mcl_core:stonebrick", - {pickaxey=1, material_stone=1, stonecutter_output=1}, + {pickaxey=1, material_stone=1, stonecutter_output=1, stonecutter_stage=1}, {"default_stone_brick.png"}, S("Stone Bricks Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, @@ -200,12 +200,12 @@ mcl_stairs.register_slab("quartzblock", "group:quartz_block", S("Double Quartz Slab"), "mcl_nether:quartz_block") --fixme: extra parameter from previous release mcl_stairs.register_stair("quartz_smooth", "mcl_nether:quartz_smooth", - {pickaxey=1, material_stone=1, stonecutter_output=14}, + {pickaxey=1, material_stone=1, stonecutter_output=31}, {"mcl_nether_quartz_block_bottom.png"}, S("Smooth Quartz Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("quartz_smooth", "mcl_nether:quartz_smooth", - {pickaxey=1, material_stone=1, stonecutter_output=14}, + {pickaxey=1, material_stone=1, stonecutter_output=31}, {"mcl_nether_quartz_block_bottom.png"}, S("Smooth Quartz Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, @@ -295,39 +295,39 @@ mcl_stairs.register_stair_and_slab("mud_brick", "mcl_mud:mud_bricks", S("Double Mud Brick Slab"), nil) mcl_stairs.register_slab("andesite_smooth", "mcl_core:andesite_smooth", - {pickaxey=1, stonecutter_output=5}, + {pickaxey=1, stonecutter_output=5, stonecutter_stage=1}, {"mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, S("Polished Andesite Slab"), nil, 6, nil, S("Double Polished Andesite Slab")) mcl_stairs.register_stair("andesite_smooth", "mcl_core:andesite_smooth", - {pickaxey=1, stonecutter_output=5}, + {pickaxey=1, stonecutter_output=5, stonecutter_stage=1}, {"mcl_stairs_andesite_smooth_slab.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, S("Polished Andesite Stairs"), nil, 6, nil, "woodlike") mcl_stairs.register_slab("granite_smooth", "mcl_core:granite_smooth", - {pickaxey=1, stonecutter_output=4}, + {pickaxey=1, stonecutter_output=4, stonecutter_stage=1}, {"mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, S("Polished Granite Slab"), nil, 6, nil, S("Double Polished Granite Slab")) mcl_stairs.register_stair("granite_smooth", "mcl_core:granite_smooth", - {pickaxey=1, stonecutter_output=4}, + {pickaxey=1, stonecutter_output=4, stonecutter_stage=1}, {"mcl_stairs_granite_smooth_slab.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, S("Polished Granite Stairs"), nil, 6, nil, "woodlike") mcl_stairs.register_slab("diorite_smooth", "mcl_core:diorite_smooth", - {pickaxey=1, stonecutter_output=6}, + {pickaxey=1, stonecutter_output=6, stonecutter_stage=1}, {"mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, S("Polished Diorite Slab"), nil, 6, nil, S("Double Polished Diorite Slab")) mcl_stairs.register_stair("diorite_smooth", "mcl_core:diorite_smooth", - {pickaxey=1, stonecutter_output=6}, + {pickaxey=1, stonecutter_output=6, stonecutter_stage=1}, {"mcl_stairs_diorite_smooth_slab.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, S("Polished Diorite Stairs"), nil, 6, nil, diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 5db74d3ac..11f4f5556 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -26,7 +26,6 @@ local function show_stonecutter_formspec(items, input) local formspec = "size[9,8.75]".. "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "label[1,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Stone Cutter"))).."]".. - "list[context;main;0,0;8,4;]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. @@ -46,12 +45,12 @@ end --Checks for the string for the different stair and wall positions that shouldn't be craftable -local function check(item_name) +local function check(item_name, input_name) + print(item_name) if string.match(item_name, "mcl_walls") then if string.match(item_name, "%d") then return true end - return false end if string.match(item_name, "_outer") then return true @@ -62,6 +61,9 @@ local function check(item_name) elseif string.match(item_name, "_double") then return true end + if minetest.get_item_group(item_name, "stonecutter_stage") == 0 and minetest.get_item_group(input_name, "stonecutter_stage") > 0 then + return true + end return false end @@ -79,7 +81,7 @@ local function update_stonecutter_slots(pos,str) local cuttable_recipes = {} for item_name, item_def in pairs(minetest.registered_items) do if item_def.groups and item_def.groups["stonecutter_output"] == compat_item then - if check(item_name) == false and name ~= item_name then + if check(item_name, name) == false and name ~= item_name then table.insert(cuttable_recipes, item_name) end end diff --git a/mods/ITEMS/mcl_walls/register.lua b/mods/ITEMS/mcl_walls/register.lua index 241c5ecc1..2307f2bfe 100644 --- a/mods/ITEMS/mcl_walls/register.lua +++ b/mods/ITEMS/mcl_walls/register.lua @@ -8,7 +8,7 @@ mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorit mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block", {"default_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=16}) mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone", {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=9}) mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone", {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_carved.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=10}) -mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick", {"default_stone_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=1}) +mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick", {"default_stone_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=1, stonecutter_stage=1}) mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy", {"mcl_core_stonebrick_mossy.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=3}) mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine",{{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, "", {pickaxey=1, material_stone=1, stonecutter_output=11}) mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks", {"mcl_end_end_bricks.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=20}) From 559f5003224d830ff4a6dc27927bbf4106d8566c Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Tue, 8 Aug 2023 07:57:49 +0100 Subject: [PATCH 057/345] Update readme for stonecutter --- mods/ITEMS/mcl_stonecutter/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mods/ITEMS/mcl_stonecutter/README.md b/mods/ITEMS/mcl_stonecutter/README.md index 3b6e23e05..e5888ea0b 100644 --- a/mods/ITEMS/mcl_stonecutter/README.md +++ b/mods/ITEMS/mcl_stonecutter/README.md @@ -2,6 +2,15 @@ mcl_stonecutter =============== Adds the stonecutter block. Used to cut stone like materials into stairs, slabs, etc. Also used as the Stone Mason Villager's jobsite. +### Adding recipes + +* To add a new compatible input the item needs to be in the group "stonecuttable". +* It's output item needs to be in the group "stonecutter_output". +* "stonecuttable" and "stonecutter_output" need to have the same number. +* Items like polished granite should only be able to make it's polished variants +while normal granite can make both. These inputs and outputs need to be in the group + "stonecutter_stage". + License of code --------------- See the main MineClone 2 README.md file. From 12568a6749abafa034b484d2c85ecd4bff7630a5 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 20 Aug 2023 17:02:55 +0100 Subject: [PATCH 058/345] use on_destruct instead of after dig node --- mods/ITEMS/mcl_stonecutter/init.lua | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 11f4f5556..128891516 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -107,6 +107,7 @@ end -- Only drop the items that were in the input slot local function drop_stonecutter_items(pos, meta) + local meta = minetest.get_meta(pos) local inv = meta:get_inventory() for i=1, inv:get_size("input") do local stack = inv:get_stack("input", i) @@ -115,7 +116,6 @@ local function drop_stonecutter_items(pos, meta) minetest.add_item(p, stack) end end - minetest.set_node(pos,{name="air"}) end minetest.register_node("mcl_stonecutter:stonecutter", { @@ -157,12 +157,7 @@ minetest.register_node("mcl_stonecutter:stonecutter", { _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, sounds = mcl_sounds.node_sound_stone_defaults(), - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - meta:from_table(oldmetadata) - drop_stonecutter_items(pos, meta) - end, + on_destruct = drop_stonecutter_items, allow_metadata_inventory_take = function(pos, listname, index, stack, player) local name = player:get_player_name() if minetest.is_protected(pos, name) then From b252e577ec1541a41b132a9249b5bcf9f3ea5228 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 17:01:37 +0100 Subject: [PATCH 059/345] Implement recipe registering API --- mods/ITEMS/mcl_stonecutter/init.lua | 107 ++++++++++++---------------- 1 file changed, 47 insertions(+), 60 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 128891516..8f4f24aa1 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -5,6 +5,30 @@ local S = minetest.get_translator("mcl_stonecutter") +mcl_stonecutter = {} +mcl_stonecutter.registered_recipes = {} + +-- API +-- input - string - name of a registered item +-- output - string - name of a registered item +-- count - int - number of the output - +-- - defaults to 1 +-- - non-int rounded down +function mcl_stonecutter.register_recipe(input, output, count) + if not (minetest.registered_items[input] and minetest.registered_items[output]) then + error("Input or output is not a registered item") + end + local n = count + if type(count) ~= "number" then + n = 1 + end + n = math.floor(n) + if not mcl_stonecutter.registered_recipes[input] then + mcl_stonecutter.registered_recipes[input] = {} + end + mcl_stonecutter.registered_recipes[input][output] = n +end + -- formspecs local function show_stonecutter_formspec(items, input) local cut_items = {} @@ -13,13 +37,13 @@ local function show_stonecutter_formspec(items, input) -- This loops through all the items that can be made and inserted into the formspec if items ~= nil then - for index, value in pairs(items) do + for name, count in pairs(items) do x_len = x_len + 1 if x_len > 5 then y_len = y_len + 1 x_len = 1 end - table.insert(cut_items,string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",x_len+1,y_len,1,1, value, value, "")) + table.insert(cut_items,string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",x_len+1,y_len,1,1, name, name, tostring(count))) end end @@ -43,66 +67,28 @@ local function show_stonecutter_formspec(items, input) return formspec end - ---Checks for the string for the different stair and wall positions that shouldn't be craftable -local function check(item_name, input_name) - print(item_name) - if string.match(item_name, "mcl_walls") then - if string.match(item_name, "%d") then - return true - end - end - if string.match(item_name, "_outer") then - return true - elseif string.match(item_name, "_inner") then - return true - elseif string.match(item_name, "_top") then - return true - elseif string.match(item_name, "_double") then - return true - end - if minetest.get_item_group(item_name, "stonecutter_stage") == 0 and minetest.get_item_group(input_name, "stonecutter_stage") > 0 then - return true - end - return false -end - - -- Updates the formspec -local function update_stonecutter_slots(pos,str) +local function update_stonecutter_slots(pos, str) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local input = inv:get_stack("input", 1) local name = input:get_name() - local compat_item = minetest.get_item_group(name, "stonecuttable") + local recipes = mcl_stonecutter.registered_recipes[name] - -- Checks if input is in the group - if compat_item > 0 then - local cuttable_recipes = {} - for item_name, item_def in pairs(minetest.registered_items) do - if item_def.groups and item_def.groups["stonecutter_output"] == compat_item then - if check(item_name, name) == false and name ~= item_name then - table.insert(cuttable_recipes, item_name) - end - end + if recipes then + meta:set_string("formspec", show_stonecutter_formspec(recipes)) + if str then + local recipe = recipes[str] + if not recipe then return end + local cut_item = ItemStack(str) + cut_item:set_count(recipe) + inv:set_stack("output", 1, cut_item) + else + inv:set_stack("output", 1, "") end - meta:set_string("formspec", show_stonecutter_formspec(cuttable_recipes)) else meta:set_string("formspec", show_stonecutter_formspec(nil)) end - - -- Checks if the chosen item is a slab or not, if it's a slab set the output to be a stack of 2 - if minetest.get_item_group(str, "stonecutter_output") > 0 then - local cut_item = ItemStack(str) - if string.match(str, "mcl_stairs:slab_") then - cut_item:set_count(2) - else - cut_item:set_count(1) - end - inv:set_stack("output", 1, cut_item) - else - inv:set_stack("output", 1, "") - end end -- Only drop the items that were in the input slot @@ -114,6 +100,7 @@ local function drop_stonecutter_items(pos, meta) if not stack:is_empty() then local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} minetest.add_item(p, stack) +-- inv:set_stack("input", i, ItemStack()) end end end @@ -127,18 +114,18 @@ minetest.register_node("mcl_stonecutter:stonecutter", { "mcl_stonecutter_bottom.png", "mcl_stonecutter_side.png", "mcl_stonecutter_side.png", - {name="mcl_stonecutter_saw.png", + {name="mcl_stonecutter_saw.png", animation={ - type="vertical_frames", - aspect_w=16, - aspect_h=16, + type="vertical_frames", + aspect_w=16, + aspect_h=16, length=1 }}, - {name="mcl_stonecutter_saw.png", + {name="mcl_stonecutter_saw.png", animation={ - type="vertical_frames", - aspect_w=16, - aspect_h=16, + type="vertical_frames", + aspect_w=16, + aspect_h=16, length=1 }} }, From 19cea45c17e7a2af516df1db0f7b1da5e2668e8f Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 21:13:16 +0100 Subject: [PATCH 060/345] Stonecutter fixes and improvements -improved stonecutter API, making it more robust -fixed a dupe bug --- mods/ITEMS/mcl_stonecutter/init.lua | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 8f4f24aa1..b32cf14fe 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -15,8 +15,12 @@ mcl_stonecutter.registered_recipes = {} -- - defaults to 1 -- - non-int rounded down function mcl_stonecutter.register_recipe(input, output, count) - if not (minetest.registered_items[input] and minetest.registered_items[output]) then - error("Input or output is not a registered item") + if mcl_stonecutter.registered_recipes[input] and mcl_stonecutter.registered_recipes[input][output] then return end + if not minetest.registered_items[input] then + error("Input is not a registered item: ".. input) + end + if not minetest.registered_items[output] then + error("Output is not a registered item: ".. output) end local n = count if type(count) ~= "number" then @@ -27,6 +31,21 @@ function mcl_stonecutter.register_recipe(input, output, count) mcl_stonecutter.registered_recipes[input] = {} end mcl_stonecutter.registered_recipes[input][output] = n + + local fallthrough = mcl_stonecutter.registered_recipes[output] + if fallthrough then + for o, c in pairs(fallthrough) do + mcl_stonecutter.register_recipe(input, o, c) + end + end + + for i, recipes in pairs(mcl_stonecutter.registered_recipes) do + for name, c in pairs(recipes) do + if name == input then + mcl_stonecutter.register_recipe(i, output, c*n) + end + end + end end -- formspecs @@ -88,6 +107,7 @@ local function update_stonecutter_slots(pos, str) end else meta:set_string("formspec", show_stonecutter_formspec(nil)) + inv:set_stack("output", 1, "") end end From ead2e772c28d4a037770d3f029de072ffd2de68f Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 21:16:05 +0100 Subject: [PATCH 061/345] First batch of stonecutter recipes under new API -core blocks -stairs -slabs -walls --- mods/ITEMS/mcl_core/mod.conf | 2 +- mods/ITEMS/mcl_core/nodes_base.lua | 13 +++++++++++++ mods/ITEMS/mcl_stairs/api.lua | 5 +++++ mods/ITEMS/mcl_stairs/mod.conf | 2 +- mods/ITEMS/mcl_stairs/register.lua | 18 +++++++++--------- mods/ITEMS/mcl_walls/init.lua | 2 ++ mods/ITEMS/mcl_walls/mod.conf | 2 +- 7 files changed, 32 insertions(+), 12 deletions(-) diff --git a/mods/ITEMS/mcl_core/mod.conf b/mods/ITEMS/mcl_core/mod.conf index 45018df75..d96f159b5 100644 --- a/mods/ITEMS/mcl_core/mod.conf +++ b/mods/ITEMS/mcl_core/mod.conf @@ -1,4 +1,4 @@ name = mcl_core description = Core items of MineClone 2: Basic biome blocks (dirt, sand, stones, etc.), derived items, glass, sugar cane, cactus, barrier, mining tools, hand, craftitems, and misc. items which don't really fit anywhere else. -depends = mcl_autogroup, mcl_init, mcl_sounds, mcl_particles, mcl_util, mcl_worlds, doc_items, mcl_enchanting, mcl_colors +depends = mcl_autogroup, mcl_init, mcl_sounds, mcl_particles, mcl_util, mcl_worlds, doc_items, mcl_enchanting, mcl_colors, mcl_stonecutter optional_depends = doc diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index c6613802a..dbf746d7c 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -1124,6 +1124,19 @@ minetest.register_node("mcl_core:snowblock", { _mcl_silk_touch_drop = true, }) +-- Stonecutter recipes +mcl_stonecutter.register_recipe("mcl_core:stone", "mcl_core:stonebrick") +mcl_stonecutter.register_recipe("mcl_core:stone", "mcl_core:stonebrickcarved") +mcl_stonecutter.register_recipe("mcl_core:stonebrick", "mcl_core:stonebrickcarved") +mcl_stonecutter.register_recipe("mcl_core:granite", "mcl_core:granite_smooth") +mcl_stonecutter.register_recipe("mcl_core:andesite", "mcl_core:andesite_smooth") +mcl_stonecutter.register_recipe("mcl_core:diorite", "mcl_core:diorite_smooth") +mcl_stonecutter.register_recipe("mcl_core:sandstone", "mcl_core:sandstonesmooth") +mcl_stonecutter.register_recipe("mcl_core:sandstone", "mcl_core:sandstonecarved") +mcl_stonecutter.register_recipe("mcl_core:redsandstone", "mcl_core:redsandstonesmooth") +mcl_stonecutter.register_recipe("mcl_core:redsandstone", "mcl_core:redsandstonecarved") + + -- Add entry aliases for the Help if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mcl_core:stone_with_redstone", "nodes", "mcl_core:stone_with_redstone_lit") diff --git a/mods/ITEMS/mcl_stairs/api.lua b/mods/ITEMS/mcl_stairs/api.lua index 6167d7e06..bebe7ba99 100644 --- a/mods/ITEMS/mcl_stairs/api.lua +++ b/mods/ITEMS/mcl_stairs/api.lua @@ -173,6 +173,9 @@ function mcl_stairs.register_stair(subname, recipeitem, groups, images, descript {recipeitem, recipeitem, recipeitem}, }, }) + + -- Stonecutter recipe + mcl_stonecutter.register_recipe(recipeitem, "mcl_stairs:stair_".. subname) end mcl_stairs.cornerstair.add("mcl_stairs:stair_"..subname, corner_stair_texture_override) @@ -343,6 +346,8 @@ function mcl_stairs.register_slab(subname, recipeitem, groups, images, descripti }, }) + mcl_stonecutter.register_recipe(recipeitem, lower_slab, 2) + end -- Help alias for the upper slab diff --git a/mods/ITEMS/mcl_stairs/mod.conf b/mods/ITEMS/mcl_stairs/mod.conf index 2fb3180b2..b3e0e2aa7 100644 --- a/mods/ITEMS/mcl_stairs/mod.conf +++ b/mods/ITEMS/mcl_stairs/mod.conf @@ -1,2 +1,2 @@ name = mcl_stairs -depends = mcl_core, mcl_sounds, mcl_nether, mcl_end, mcl_ocean, mcl_mud +depends = mcl_core, mcl_sounds, mcl_nether, mcl_end, mcl_ocean, mcl_mud, mcl_stonecutter diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index a669f2a22..228af97af 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -37,7 +37,7 @@ mcl_stairs.register_slab("stone_rough", "mcl_core:stone", S("Stone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Stone Slab")) -mcl_stairs.register_stair("stone_rough", "group:stone", +mcl_stairs.register_stair("stone_rough", "mcl_core:stone", {pickaxey=1, material_stone=1,stonecutter_output=1}, {"default_stone.png"}, S("Stone Stairs"), @@ -122,13 +122,13 @@ mcl_stairs.register_slab("brick_block", "mcl_core:brick_block", mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Brick Slab")) -mcl_stairs.register_stair("sandstone", "group:normal_sandstone", +mcl_stairs.register_stair("sandstone", "mcl_core:sandstone", {pickaxey=1, material_stone=1, stonecutter_output=9}, {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, S("Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_core:sandstone") --fixme: extra parameter from previous release -mcl_stairs.register_slab("sandstone", "group:normal_sandstone", +mcl_stairs.register_slab("sandstone", "mcl_core:sandstone", {pickaxey=1, material_stone=1, stonecutter_output=9}, {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, S("Sandstone Slab"), @@ -147,13 +147,13 @@ mcl_stairs.register_slab("sandstonesmooth2", "mcl_core:sandstonesmooth2", mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Smooth Sandstone Slab")) -mcl_stairs.register_stair("redsandstone", "group:red_sandstone", +mcl_stairs.register_stair("redsandstone", "mcl_core:redsandstone", {pickaxey=1, material_stone=1, stonecutter_output=10}, {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, S("Red Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_core:redsandstone") --fixme: extra parameter from previous release -mcl_stairs.register_slab("redsandstone", "group:red_sandstone", +mcl_stairs.register_slab("redsandstone", "mcl_core:redsandstone", {pickaxey=1, material_stone=1, stonecutter_output=10}, {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, S("Red Sandstone Slab"), @@ -186,13 +186,13 @@ mcl_stairs.register_slab("stonebrick", "mcl_core:stonebrick", mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Stone Bricks Slab"), "mcl_core:stonebrick") --fixme: extra parameter from previous release -mcl_stairs.register_stair("quartzblock", "group:quartz_block", +mcl_stairs.register_stair("quartzblock", "mcl_nether:quartz_block", {pickaxey=1, material_stone=1, stonecutter_output=14}, {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, S("Quartz Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_nether:quartz_block") --fixme: extra parameter from previous release -mcl_stairs.register_slab("quartzblock", "group:quartz_block", +mcl_stairs.register_slab("quartzblock", "mcl_nether:quartz_block", {pickaxey=1, material_stone=1, stonecutter_output=14}, {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, S("Quartz Slab"), @@ -234,13 +234,13 @@ mcl_stairs.register_stair_and_slab("end_bricks", "mcl_end:end_bricks", mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double End Stone Brick Slab"), nil) -mcl_stairs.register_stair("purpur_block", "group:purpur_block", +mcl_stairs.register_stair("purpur_block", "mcl_end:purpur_block", {pickaxey=1, material_stone=1, stonecutter_output=15}, {"mcl_end_purpur_block.png"}, S("Purpur Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil) -mcl_stairs.register_slab("purpur_block", "group:purpur_block", +mcl_stairs.register_slab("purpur_block", "mcl_end:purpur_block", {pickaxey=1, material_stone=1, stonecutter_output=15}, {"mcl_end_purpur_block.png"}, S("Purpur Slab"), diff --git a/mods/ITEMS/mcl_walls/init.lua b/mods/ITEMS/mcl_walls/init.lua index caf8b34fe..09a35b549 100644 --- a/mods/ITEMS/mcl_walls/init.lua +++ b/mods/ITEMS/mcl_walls/init.lua @@ -282,6 +282,8 @@ function mcl_walls.register_wall(nodename, description, source, tiles, inventory {source, source, source}, } }) + + mcl_stonecutter.register_recipe(source, nodename) end end diff --git a/mods/ITEMS/mcl_walls/mod.conf b/mods/ITEMS/mcl_walls/mod.conf index b6b221007..b099e4c1d 100644 --- a/mods/ITEMS/mcl_walls/mod.conf +++ b/mods/ITEMS/mcl_walls/mod.conf @@ -1,3 +1,3 @@ name = mcl_walls -depends = mcl_core, mcl_end, mcl_ocean, mcl_nether, mcl_sounds, mcl_mud +depends = mcl_core, mcl_end, mcl_ocean, mcl_nether, mcl_sounds, mcl_mud, mcl_stonecutter optional_depends = doc From d46b9071a05b6d0b82c0476f65d913632a680f7e Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 21:17:36 +0100 Subject: [PATCH 062/345] Added nether and end stonecutter recipes --- mods/ITEMS/mcl_end/building.lua | 2 ++ mods/ITEMS/mcl_end/mod.conf | 2 +- mods/ITEMS/mcl_nether/init.lua | 4 ++++ mods/ITEMS/mcl_nether/mod.conf | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua index b3a6adf30..fec0df475 100644 --- a/mods/ITEMS/mcl_end/building.lua +++ b/mods/ITEMS/mcl_end/building.lua @@ -211,3 +211,5 @@ minetest.register_craft({ }, }) +mcl_stonecutter.register_recipe("mcl_end:end_stone", "mcl_end:end_bricks") +mcl_stonecutter.register_recipe("mcl_end:purpur_block", "mcl_end:purpur_pillar") diff --git a/mods/ITEMS/mcl_end/mod.conf b/mods/ITEMS/mcl_end/mod.conf index 021417e86..3547074cf 100644 --- a/mods/ITEMS/mcl_end/mod.conf +++ b/mods/ITEMS/mcl_end/mod.conf @@ -1,2 +1,2 @@ name = mcl_end -depends = screwdriver, mcl_sounds, mcl_util, doc_items, mcl_worlds, mcl_structures \ No newline at end of file +depends = screwdriver, mcl_sounds, mcl_util, doc_items, mcl_worlds, mcl_structures, mcl_stonecutter diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index f66877707..10a7b4dc5 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -415,5 +415,9 @@ minetest.register_craft({ } }) +-- TODO register stonecutter recipe for chiseled nether brick when it is added +mcl_stonecutter.register_recipe("mcl_nether:quartz_block", "mcl_nether:quartz_chiseled") +mcl_stonecutter.register_recipe("mcl_nether:quartz_block", "mcl_nether:quartz_pillar") + dofile(minetest.get_modpath(minetest.get_current_modname()).."/nether_wart.lua") dofile(minetest.get_modpath(minetest.get_current_modname()).."/lava.lua") diff --git a/mods/ITEMS/mcl_nether/mod.conf b/mods/ITEMS/mcl_nether/mod.conf index f5ffa61ac..afeca9967 100644 --- a/mods/ITEMS/mcl_nether/mod.conf +++ b/mods/ITEMS/mcl_nether/mod.conf @@ -1,3 +1,3 @@ name = mcl_nether -depends = mcl_core, mcl_sounds, mcl_util, walkover, doc_items, mcl_colors +depends = mcl_core, mcl_sounds, mcl_util, walkover, doc_items, mcl_colors, mcl_stonecutter optional_depends = doc, screwdriver From 6ebd3ccb7db073648c8df819ca2b48531e34c753 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 21:18:39 +0100 Subject: [PATCH 063/345] Third batch of stonecutter recipes -deepslate -blackstone -quartz bricks --- mods/ITEMS/mcl_blackstone/init.lua | 9 ++++++++- mods/ITEMS/mcl_blackstone/mod.conf | 2 +- mods/ITEMS/mcl_deepslate/init.lua | 6 ++++++ mods/ITEMS/mcl_deepslate/mod.conf | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua index c46fba97b..ab8ecd2fa 100644 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ b/mods/ITEMS/mcl_blackstone/init.lua @@ -12,7 +12,7 @@ minetest.register_node("mcl_blackstone:blackstone", { tiles = {"mcl_blackstone_top.png", "mcl_blackstone_top.png", "mcl_blackstone_side.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, cobble=1, stonecuttable=21}, + groups = {cracky = 3, pickaxey=1, material_stone=1, cobble=1}, _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) @@ -400,3 +400,10 @@ minetest.register_craft({ { "group:soul_block" }, } }) + +-- stonecutter recipes +mcl_stonecutter.register_recipe("mcl_blackstone:basalt", "mcl_blackstone:basalt_polished") +mcl_stonecutter.register_recipe("mcl_blackstone:blackstone", "mcl_blackstone:blackstone_polished") +mcl_stonecutter.register_recipe("mcl_blackstone:blackstone_polished", "mcl_blackstone:blackstone_chiseled_polished") +mcl_stonecutter.register_recipe("mcl_blackstone:blackstone_polished", "mcl_blackstone:blackstone_brick_polished") +mcl_stonecutter.register_recipe("mcl_nether:quartz_block", "mcl_blackstone:quartz_brick") diff --git a/mods/ITEMS/mcl_blackstone/mod.conf b/mods/ITEMS/mcl_blackstone/mod.conf index 8728f5b01..14a482067 100644 --- a/mods/ITEMS/mcl_blackstone/mod.conf +++ b/mods/ITEMS/mcl_blackstone/mod.conf @@ -1,3 +1,3 @@ name = mcl_blackstone author = debian044 -depends = mcl_core, screwdriver, mcl_stairs, mclx_stairs, mcl_walls, mclx_fences, mcl_torches, mcl_fire +depends = mcl_core, screwdriver, mcl_stairs, mclx_stairs, mcl_walls, mclx_fences, mcl_torches, mcl_fire, mcl_stonecutter, mcl_nether diff --git a/mods/ITEMS/mcl_deepslate/init.lua b/mods/ITEMS/mcl_deepslate/init.lua index b4549159f..0abb0c579 100644 --- a/mods/ITEMS/mcl_deepslate/init.lua +++ b/mods/ITEMS/mcl_deepslate/init.lua @@ -243,6 +243,10 @@ for i = 1, 3 do output = "mcl_deepslate:deepslate_"..deepslate_variants[i+1][1].." 4", recipe = { { s, s }, { s, s } } }) + mcl_stonecutter.register_recipe( + "mcl_deepslate:deepslate_"..deepslate_variants[i][1], + "mcl_deepslate:deepslate_"..deepslate_variants[i+1][1] + ) end for _, p in pairs({ "bricks", "tiles" }) do @@ -275,3 +279,5 @@ minetest.register_craft({ { "mcl_stairs:slab_deepslate_cobbled" }, }, }) + +mcl_stonecutter.register_recipe("mcl_deepslate:deepslate_cobbled", "mcl_deepslate:deepslate_chiseled") diff --git a/mods/ITEMS/mcl_deepslate/mod.conf b/mods/ITEMS/mcl_deepslate/mod.conf index 7e9a44cfc..e542c3fb0 100644 --- a/mods/ITEMS/mcl_deepslate/mod.conf +++ b/mods/ITEMS/mcl_deepslate/mod.conf @@ -1,4 +1,4 @@ name = mcl_deepslate author = NO11 -depends = mcl_raw_ores, mcl_core, mcl_sounds, mcl_dye, mcl_util, screwdriver, mobs_mc, walkover, mcl_walls, mcl_stairs, mcl_brewing, mcl_mobitems, mcl_furnaces, mcl_farming, mcl_worlds +depends = mcl_raw_ores, mcl_core, mcl_sounds, mcl_dye, mcl_util, screwdriver, mobs_mc, walkover, mcl_walls, mcl_stairs, mcl_brewing, mcl_mobitems, mcl_furnaces, mcl_farming, mcl_worlds, mcl_stonecutter optional_depends = mcl_copper From 0c7b4d473c408ded017e0669f37b15941f7e9f34 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 21:19:09 +0100 Subject: [PATCH 064/345] Copper blocks stonecutter recipes --- mods/ITEMS/mcl_copper/crafting.lua | 6 ++++++ mods/ITEMS/mcl_copper/mod.conf | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_copper/crafting.lua b/mods/ITEMS/mcl_copper/crafting.lua index 41084afb3..6754534db 100644 --- a/mods/ITEMS/mcl_copper/crafting.lua +++ b/mods/ITEMS/mcl_copper/crafting.lua @@ -59,6 +59,12 @@ for _, w in ipairs(waxable_blocks) do }) end +local cuttable_blocks = { "block", "waxed_block", "block_exposed", "waxed_block_exposed", "block_weathered", "waxed_block_weathered", "block_oxidized", "waxed_block_oxidized" } + +for _, w in ipairs(cuttable_blocks) do + mcl_stonecutter.register_recipe("mcl_copper:"..w, "mcl_copper:"..w.."_cut") +end + minetest.register_craft({ output = "mcl_copper:copper_ingot 9", recipe = { diff --git a/mods/ITEMS/mcl_copper/mod.conf b/mods/ITEMS/mcl_copper/mod.conf index a48ee56f7..64937b2e1 100644 --- a/mods/ITEMS/mcl_copper/mod.conf +++ b/mods/ITEMS/mcl_copper/mod.conf @@ -1,4 +1,4 @@ name = mcl_copper author = NO11 -depends = mcl_core, mcl_sounds, mcl_stairs, mcl_util, mcl_oxidation +depends = mcl_core, mcl_sounds, mcl_stairs, mcl_util, mcl_oxidation, mcl_stonecutter description = Adds Copper Ore, blocks and items. From fd17bf1a29c3644e93aeeb0b3922de7b617e0923 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 21:27:42 +0100 Subject: [PATCH 065/345] Removed old implementation groups --- mods/ITEMS/mcl_blackstone/init.lua | 22 +++---- mods/ITEMS/mcl_copper/nodes.lua | 64 +++++++++---------- mods/ITEMS/mcl_core/nodes_base.lua | 44 ++++++------- mods/ITEMS/mcl_end/building.lua | 8 +-- mods/ITEMS/mcl_mud/init.lua | 4 +- mods/ITEMS/mcl_nether/init.lua | 12 ++-- mods/ITEMS/mcl_ocean/prismarine.lua | 6 +- mods/ITEMS/mcl_stairs/register.lua | 98 ++++++++++++++--------------- mods/ITEMS/mcl_walls/register.lua | 30 ++++----- 9 files changed, 144 insertions(+), 144 deletions(-) diff --git a/mods/ITEMS/mcl_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua index ab8ecd2fa..e42554f59 100644 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ b/mods/ITEMS/mcl_blackstone/init.lua @@ -73,7 +73,7 @@ minetest.register_node("mcl_blackstone:basalt_polished", { on_place = mcl_util.rotate_axis, on_rotate = on_rotate, is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, stonecutter_output=19}, + groups = {cracky = 3, pickaxey=1, material_stone=1}, _mcl_blast_resistance = 4.2, _mcl_hardness = 1.25, }) @@ -85,7 +85,7 @@ minetest.register_node("mcl_blackstone:basalt", { on_place = mcl_util.rotate_axis, on_rotate = on_rotate, is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, stonecuttable=19}, + groups = {cracky = 3, pickaxey=1, material_stone=1}, _mcl_blast_resistance = 4.2, _mcl_hardness = 1.25, }) @@ -103,7 +103,7 @@ minetest.register_node("mcl_blackstone:blackstone_polished", { tiles = {"mcl_blackstone_polished.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, stonecuttable=21, stonecutter_output=21}, + groups = {cracky = 3, pickaxey=1, material_stone=1}, _mcl_blast_resistance = 6, _mcl_hardness = 2, }) @@ -112,7 +112,7 @@ minetest.register_node("mcl_blackstone:blackstone_chiseled_polished", { tiles = {"mcl_blackstone_chiseled_polished.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, stonecutter_output=21}, + groups = {cracky = 3, pickaxey=1, material_stone=1}, _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) @@ -121,7 +121,7 @@ minetest.register_node("mcl_blackstone:blackstone_brick_polished", { tiles = {"mcl_blackstone_polished_bricks.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, stonecutter_output=21}, + groups = {cracky = 3, pickaxey=1, material_stone=1}, _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) @@ -131,7 +131,7 @@ minetest.register_node("mcl_blackstone:quartz_brick", { sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), - groups = {cracky = 3, pickaxey=1, material_stone=1, stonecutter_output=14}, + groups = {cracky = 3, pickaxey=1, material_stone=1}, _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, }) @@ -194,7 +194,7 @@ end --slabs/stairs mcl_stairs.register_stair_and_slab("blackstone", "mcl_blackstone:blackstone", - {cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21}, + {cracky=3, pickaxey=1, material_stone=1}, {"mcl_blackstone_top.png", "mcl_blackstone_top.png", "mcl_blackstone_side.png"}, S("Blackstone Stairs"), S("Blackstone Slab"), @@ -202,7 +202,7 @@ mcl_stairs.register_stair_and_slab("blackstone", "mcl_blackstone:blackstone", S("Double Blackstone Slab"), nil) mcl_stairs.register_stair_and_slab("blackstone_polished", "mcl_blackstone:blackstone_polished", - {cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21}, + {cracky=3, pickaxey=1, material_stone=1}, {"mcl_blackstone_polished.png"}, S("Polished Blackstone Stairs"), S("Polished Blackstone Slab"), @@ -210,7 +210,7 @@ mcl_stairs.register_stair_and_slab("blackstone_polished", "mcl_blackstone:blacks S("Double Polished Blackstone Slab"), nil) mcl_stairs.register_stair_and_slab("blackstone_chiseled_polished", "mcl_blackstone:blackstone_chiseled_polished", - {cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21}, + {cracky=3, pickaxey=1, material_stone=1}, {"mcl_blackstone_chiseled_polished.png"}, S("Chiseled Polished Blackstone Stairs"), S("Chiseled Polished Blackstone Slab"), @@ -218,7 +218,7 @@ mcl_stairs.register_stair_and_slab("blackstone_chiseled_polished", "mcl_blacksto S("Double Chiseled Polished Blackstone Slab"), nil) mcl_stairs.register_stair_and_slab("blackstone_brick_polished", "mcl_blackstone:blackstone_brick_polished", - {cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21}, + {cracky=3, pickaxey=1, material_stone=1}, {"mcl_blackstone_polished_bricks.png"}, S("Polished Blackstone Brick Stair Stairs"), S("Polished Blackstone Brick Stair Slab"), @@ -236,7 +236,7 @@ mcl_walls.register_wall( "mcl_blackstone_side.png" }, "", - { cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21 } + { cracky=3, pickaxey=1, material_stone=1 } ) --lavacooling diff --git a/mods/ITEMS/mcl_copper/nodes.lua b/mods/ITEMS/mcl_copper/nodes.lua index f131d9967..af5a49a1c 100644 --- a/mods/ITEMS/mcl_copper/nodes.lua +++ b/mods/ITEMS/mcl_copper/nodes.lua @@ -30,7 +30,7 @@ minetest.register_node("mcl_copper:block", { _doc_items_longdesc = S("A block of copper is mostly a decorative block."), tiles = {"mcl_copper_block.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=22}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 3, @@ -43,7 +43,7 @@ minetest.register_node("mcl_copper:waxed_block", { _doc_items_longdesc = S("A block of copper is mostly a decorative block."), tiles = {"mcl_copper_block.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=23}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 3, @@ -55,7 +55,7 @@ minetest.register_node("mcl_copper:block_exposed", { _doc_items_longdesc = S("Exposed copper is a decorative block."), tiles = {"mcl_copper_exposed.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=24}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -69,7 +69,7 @@ minetest.register_node("mcl_copper:waxed_block_exposed", { _doc_items_longdesc = S("Exposed copper is a decorative block."), tiles = {"mcl_copper_exposed.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=25}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -81,7 +81,7 @@ minetest.register_node("mcl_copper:block_weathered", { _doc_items_longdesc = S("Weathered copper is a decorative block."), tiles = {"mcl_copper_weathered.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=26}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -95,7 +95,7 @@ minetest.register_node("mcl_copper:waxed_block_weathered", { _doc_items_longdesc = S("Weathered copper is a decorative block."), tiles = {"mcl_copper_weathered.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=27}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -107,7 +107,7 @@ minetest.register_node("mcl_copper:block_oxidized", { _doc_items_longdesc = S("Oxidized copper is a decorative block."), tiles = {"mcl_copper_oxidized.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, stonecuttable=28}, + groups = {pickaxey = 2, building_block = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -120,7 +120,7 @@ minetest.register_node("mcl_copper:waxed_block_oxidized", { _doc_items_longdesc = S("Oxidized copper is a decorative block."), tiles = {"mcl_copper_oxidized.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=29}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -132,7 +132,7 @@ minetest.register_node("mcl_copper:block_cut", { _doc_items_longdesc = S("Cut copper is a decorative block."), tiles = {"mcl_copper_block_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=22, stonecutter_output=22}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -145,7 +145,7 @@ minetest.register_node("mcl_copper:waxed_block_cut", { _doc_items_longdesc = S("Cut copper is a decorative block."), tiles = {"mcl_copper_block_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=23, stonecutter_output=23}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -157,7 +157,7 @@ minetest.register_node("mcl_copper:block_exposed_cut", { _doc_items_longdesc = S("Exposed cut copper is a decorative block."), tiles = {"mcl_copper_exposed_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=24, stonecutter_output=24}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -171,7 +171,7 @@ minetest.register_node("mcl_copper:waxed_block_exposed_cut", { _doc_items_longdesc = S("Exposed cut copper is a decorative block."), tiles = {"mcl_copper_exposed_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=25, stonecutter_output=25}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -183,7 +183,7 @@ minetest.register_node("mcl_copper:block_weathered_cut", { _doc_items_longdesc = S("Weathered cut copper is a decorative block."), tiles = {"mcl_copper_weathered_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=26, stonecutter_output=26}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -197,7 +197,7 @@ minetest.register_node("mcl_copper:waxed_block_weathered_cut", { _doc_items_longdesc = S("Weathered cut copper is a decorative block."), tiles = {"mcl_copper_weathered_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=27, stonecutter_output=27}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -209,7 +209,7 @@ minetest.register_node("mcl_copper:block_oxidized_cut", { _doc_items_longdesc = S("Oxidized cut copper is a decorative block."), tiles = {"mcl_copper_oxidized_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, stonecuttable=28, stonecutter_output=28}, + groups = {pickaxey = 2, building_block = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -222,7 +222,7 @@ minetest.register_node("mcl_copper:waxed_block_oxidized_cut", { _doc_items_longdesc = S("Oxidized cut copper is a decorative block."), tiles = {"mcl_copper_oxidized_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=29, stonecutter_output=29}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -230,112 +230,112 @@ minetest.register_node("mcl_copper:waxed_block_oxidized_cut", { }) mcl_stairs.register_slab("copper_cut", "mcl_copper:block_cut", - {pickaxey = 2, oxidizable = 1, stonecutter_output = 22}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Slab of Cut Copper"), nil, nil, nil, S("Double Slab of Cut Copper")) mcl_stairs.register_slab("waxed_copper_cut", "mcl_copper:waxed_block_cut", - {pickaxey = 2, waxed = 1, stonecutter_output = 23}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Waxed Slab of Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Cut Copper")) mcl_stairs.register_slab("copper_exposed_cut", "mcl_copper:block_exposed_cut", - {pickaxey = 2, oxidizable = 1, stonecutter_output = 24}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Slab of Exposed Cut Copper"), nil, nil, nil, S("Double Slab of Exposed Cut Copper")) mcl_stairs.register_slab("waxed_copper_exposed_cut", "mcl_copper:waxed_block_exposed_cut", - {pickaxey = 2, waxed = 1, stonecutter_output = 25}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Waxed Slab of Exposed Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Exposed Cut Copper")) mcl_stairs.register_slab("copper_weathered_cut", "mcl_copper:block_weathered_cut", - {pickaxey = 2, oxidizable = 1, stonecutter_output = 26}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Slab of Weathered Cut Copper"), nil, nil, nil, S("Double Slab of Weathered Cut Copper")) mcl_stairs.register_slab("waxed_copper_weathered_cut", "mcl_copper:waxed_block_weathered_cut", - {pickaxey = 2, waxed = 1, stonecutter_output = 27}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Waxed Slab of Weathered Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Weathered Cut Copper")) mcl_stairs.register_slab("copper_oxidized_cut", "mcl_copper:block_oxidized_cut", - {pickaxey = 2, stonecutter_output = 28}, + {pickaxey = 2}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Slab of Oxidized Cut Copper"), nil, nil, nil, S("Double Slab of Oxidized Cut Copper")) mcl_stairs.register_slab("waxed_copper_oxidized_cut", "mcl_copper:waxed_block_oxidized_cut", - {pickaxey = 2, waxed = 1, stonecutter_output = 29}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Waxed Slab of Oxidized Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Oxidized Cut Copper")) mcl_stairs.register_stair("copper_cut", "mcl_copper:block_cut", - {pickaxey = 2, oxidizable = 1, stonecutter_output = 22}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Stairs of Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_cut", "mcl_copper:waxed_block_cut", - {pickaxey = 2, waxed = 1, stonecutter_output = 23}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Waxed Stairs of Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_exposed_cut", "mcl_copper:block_exposed_cut", - {pickaxey = 2, oxidizable = 1, stonecutter_output = 24}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Stairs of Exposed Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_exposed_cut", "mcl_copper:waxed_block_exposed_cut", - {pickaxey = 2, waxed = 1, stonecutter_output = 25}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Waxed Stairs of Exposed Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_weathered_cut", "mcl_copper:block_weathered_cut", - {pickaxey = 2, oxidizable = 1, stonecutter_output = 26}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Stairs of Weathered Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_weathered_cut", "mcl_copper:waxed_block_weathered_cut", - {pickaxey = 2, waxed = 1, stonecutter_output = 27}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Waxed Stairs of Weathered Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_oxidized_cut", "mcl_copper:block_oxidized_cut", - {pickaxey = 2, stonecutter_output = 28}, + {pickaxey = 2}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Stairs of Oxidized Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_oxidized_cut", "mcl_copper:waxed_block_oxidized_cut", - {pickaxey = 2, waxed = 1, stonecutter_output = 29}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Waxed Stairs of Oxidized Cut Copper"), nil, 6, nil, diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index dbf746d7c..db2561082 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -27,7 +27,7 @@ minetest.register_node("mcl_core:stone", { tiles = {"default_stone.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, drop = "mcl_core:cobble", sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, @@ -236,7 +236,7 @@ minetest.register_node("mcl_core:stonebrick", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"default_stone_brick.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=1, stonecutter_output=1, stonecutter_stage=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -248,7 +248,7 @@ minetest.register_node("mcl_core:stonebrickcarved", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_carved.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecutter_output=1, stonecutter_stage=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -272,7 +272,7 @@ minetest.register_node("mcl_core:stonebrickmossy", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_mossy.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=3}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -284,7 +284,7 @@ minetest.register_node("mcl_core:stone_smooth", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_stairs_stone_slab_top.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -297,7 +297,7 @@ minetest.register_node("mcl_core:granite", { tiles = {"mcl_core_granite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=4}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -309,7 +309,7 @@ minetest.register_node("mcl_core:granite_smooth", { tiles = {"mcl_core_granite_smooth.png"}, stack_max = 64, is_ground_content = false, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=4, stonecutter_output=4, stonecutter_stage=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -321,7 +321,7 @@ minetest.register_node("mcl_core:andesite", { tiles = {"mcl_core_andesite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=5,}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -333,7 +333,7 @@ minetest.register_node("mcl_core:andesite_smooth", { tiles = {"mcl_core_andesite_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=5, stonecutter_output=5, stonecutter_stage=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -345,7 +345,7 @@ minetest.register_node("mcl_core:diorite", { tiles = {"mcl_core_diorite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=6}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -357,7 +357,7 @@ minetest.register_node("mcl_core:diorite_smooth", { tiles = {"mcl_core_diorite_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=6, stonecutter_output=6, stonecutter_stage=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -586,7 +586,7 @@ minetest.register_node("mcl_core:sandstone", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=9}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -598,7 +598,7 @@ minetest.register_node("mcl_core:sandstonesmooth", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=9, stonecutter_output=9}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -610,7 +610,7 @@ minetest.register_node("mcl_core:sandstonecarved", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_carved.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecutter_output=9}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -623,7 +623,7 @@ minetest.register_node("mcl_core:sandstonesmooth2", { tiles = {"mcl_core_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=9, stonecutter_output=9, stonecutter_stage=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -649,7 +649,7 @@ minetest.register_node("mcl_core:redsandstone", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=10}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -661,7 +661,7 @@ minetest.register_node("mcl_core:redsandstonesmooth", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=10, stonecutter_output=10}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -673,7 +673,7 @@ minetest.register_node("mcl_core:redsandstonecarved", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_carved.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecutter_output=10}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -685,7 +685,7 @@ minetest.register_node("mcl_core:redsandstonesmooth2", { tiles = {"mcl_core_red_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=10, stonecutter_output=10, stonecutter_stage=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -715,7 +715,7 @@ minetest.register_node("mcl_core:brick_block", { tiles = {"default_brick.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=16}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -768,7 +768,7 @@ minetest.register_node("mcl_core:cobble", { tiles = {"default_cobble.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, cobble=1, stonecuttable=7}, + groups = {pickaxey=1, building_block=1, material_stone=1, cobble=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -780,7 +780,7 @@ minetest.register_node("mcl_core:mossycobble", { tiles = {"default_mossycobble.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=8}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua index fec0df475..7a3cdfd1d 100644 --- a/mods/ITEMS/mcl_end/building.lua +++ b/mods/ITEMS/mcl_end/building.lua @@ -13,7 +13,7 @@ minetest.register_node("mcl_end:end_stone", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_end_end_stone.png"}, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=20}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), after_dig_node = mcl_end.check_detach_chorus_plant, _mcl_blast_resistance = 9, @@ -26,7 +26,7 @@ minetest.register_node("mcl_end:end_bricks", { tiles = {"mcl_end_end_bricks.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=20, stonecutter_output=20}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 9, _mcl_hardness = 3, @@ -38,7 +38,7 @@ minetest.register_node("mcl_end:purpur_block", { tiles = {"mcl_end_purpur_block.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1, stonecuttable=15}, + groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -52,7 +52,7 @@ minetest.register_node("mcl_end:purpur_pillar", { is_ground_content = false, on_place = mcl_util.rotate_axis, tiles = {"mcl_end_purpur_pillar_top.png", "mcl_end_purpur_pillar_top.png", "mcl_end_purpur_pillar.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1, stonecutter_output=15}, + groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1}, sounds = mcl_sounds.node_sound_stone_defaults(), on_rotate = on_rotate, _mcl_blast_resistance = 6, diff --git a/mods/ITEMS/mcl_mud/init.lua b/mods/ITEMS/mcl_mud/init.lua index 5a99ff754..3c3e66a99 100644 --- a/mods/ITEMS/mcl_mud/init.lua +++ b/mods/ITEMS/mcl_mud/init.lua @@ -38,7 +38,7 @@ minetest.register_node("mcl_mud:mud_bricks", { _doc_items_longdesc = S("Decorative block crafted from packed mud."), _doc_items_hidden = false, tiles = {"mcl_mud_bricks.png"}, - groups = {handy=1, pickaxey=1, building_block=1, stonecuttable=30}, + groups = {handy=1, pickaxey=1, building_block=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 3, _mcl_hardness = 1.5, @@ -62,4 +62,4 @@ minetest.register_craft({ {"mcl_mud:packed_mud", "mcl_mud:packed_mud"}, {"mcl_mud:packed_mud", "mcl_mud:packed_mud"} } -}) \ No newline at end of file +}) diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index 10a7b4dc5..252768df5 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -176,7 +176,7 @@ minetest.register_node("mcl_nether:nether_brick", { stack_max = 64, tiles = {"mcl_nether_nether_brick.png"}, is_ground_content = false, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=17}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -189,7 +189,7 @@ minetest.register_node("mcl_nether:red_nether_brick", { stack_max = 64, tiles = {"mcl_nether_red_nether_brick.png"}, is_ground_content = false, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=18}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -219,7 +219,7 @@ minetest.register_node("mcl_nether:quartz_block", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=14}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -231,7 +231,7 @@ minetest.register_node("mcl_nether:quartz_chiseled", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_chiseled_top.png", "mcl_nether_quartz_chiseled_top.png", "mcl_nether_quartz_chiseled_side.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecutter_output=14}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -245,7 +245,7 @@ minetest.register_node("mcl_nether:quartz_pillar", { is_ground_content = false, on_place = mcl_util.rotate_axis, tiles = {"mcl_nether_quartz_pillar_top.png", "mcl_nether_quartz_pillar_top.png", "mcl_nether_quartz_pillar_side.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecutter_output=14}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), on_rotate = on_rotate, _mcl_blast_resistance = 0.8, @@ -257,7 +257,7 @@ minetest.register_node("mcl_nether:quartz_smooth", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_block_bottom.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=31, stonecutter_output=31}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, diff --git a/mods/ITEMS/mcl_ocean/prismarine.lua b/mods/ITEMS/mcl_ocean/prismarine.lua index e1a0a3a98..fff07cb7e 100644 --- a/mods/ITEMS/mcl_ocean/prismarine.lua +++ b/mods/ITEMS/mcl_ocean/prismarine.lua @@ -38,7 +38,7 @@ minetest.register_node("mcl_ocean:prismarine", { is_ground_content = false, -- Texture should have 22 frames for smooth transitions. tiles = {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=11}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -50,7 +50,7 @@ minetest.register_node("mcl_ocean:prismarine_brick", { stack_max = 64, is_ground_content = false, tiles = {"mcl_ocean_prismarine_bricks.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=12}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -62,7 +62,7 @@ minetest.register_node("mcl_ocean:prismarine_dark", { stack_max = 64, is_ground_content = false, tiles = {"mcl_ocean_prismarine_dark.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=13}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index 228af97af..546be8112 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -32,141 +32,141 @@ end mcl_stairs.register_slab("stone_rough", "mcl_core:stone", - {pickaxey=1, material_stone=1, stonecutter_output=1}, + {pickaxey=1, material_stone=1}, {"default_stone.png"}, S("Stone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Stone Slab")) mcl_stairs.register_stair("stone_rough", "mcl_core:stone", - {pickaxey=1, material_stone=1,stonecutter_output=1}, + {pickaxey=1, material_stone=1}, {"default_stone.png"}, S("Stone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("stone", "mcl_core:stone_smooth", - {pickaxey=1, material_stone=1, stonecutter_output=2}, + {pickaxey=1, material_stone=1}, {"mcl_stairs_stone_slab_top.png", "mcl_stairs_stone_slab_top.png", "mcl_stairs_stone_slab_side.png"}, S("Polished Stone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Polished Stone Slab")) mcl_stairs.register_stair("andesite", "mcl_core:andesite", - {pickaxey=1, material_stone=1,stonecutter_output=5}, + {pickaxey=1, material_stone=1}, {"mcl_core_andesite.png"}, S("Andesite Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("andesite", "mcl_core:andesite", - {pickaxey=1, material_stone=1, stonecutter_output=5}, + {pickaxey=1, material_stone=1}, {"mcl_core_andesite.png"}, S("Andesite Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Andesite Slab")) mcl_stairs.register_stair("granite", "mcl_core:granite", - {pickaxey=1, material_stone=1,stonecutter_output=4}, + {pickaxey=1, material_stone=1}, {"mcl_core_granite.png"}, S("Granite Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("granite", "mcl_core:granite", - {pickaxey=1, material_stone=1, stonecutter_output=4}, + {pickaxey=1, material_stone=1}, {"mcl_core_granite.png"}, S("Granite Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Granite Slab")) mcl_stairs.register_stair("diorite", "mcl_core:diorite", - {pickaxey=1, material_stone=1,stonecutter_output=6}, + {pickaxey=1, material_stone=1}, {"mcl_core_diorite.png"}, S("Granite Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("diorite", "mcl_core:diorite", - {pickaxey=1, material_stone=1, stonecutter_output=6}, + {pickaxey=1, material_stone=1}, {"mcl_core_diorite.png"}, S("Diorite Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Diorite Slab")) mcl_stairs.register_stair("cobble", "mcl_core:cobble", - {pickaxey=1, material_stone=1,stonecutter_output=7}, + {pickaxey=1, material_stone=1}, {"default_cobble.png"}, S("Cobblestone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("cobble", "mcl_core:cobble", - {pickaxey=1, material_stone=1, stonecutter_output=7}, + {pickaxey=1, material_stone=1}, {"default_cobble.png"}, S("Cobblestone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Cobblestone Slab")) mcl_stairs.register_stair("mossycobble", "mcl_core:mossycobble", - {pickaxey=1, material_stone=1,stonecutter_output=8}, + {pickaxey=1, material_stone=1}, {"default_mossycobble.png"}, S("Mossy Cobblestone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("mossycobble", "mcl_core:mossycobble", - {pickaxey=1, material_stone=1, stonecutter_output=8}, + {pickaxey=1, material_stone=1}, {"default_mossycobble.png"}, S("Mossy Cobblestone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Mossy Cobblestone Slab")) mcl_stairs.register_stair("brick_block", "mcl_core:brick_block", - {pickaxey=1, material_stone=1,stonecutter_output=16}, + {pickaxey=1, material_stone=1}, {"default_brick.png"}, S("Brick Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("brick_block", "mcl_core:brick_block", - {pickaxey=1, material_stone=1, stonecutter_output=16}, + {pickaxey=1, material_stone=1}, {"default_brick.png"}, S("Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Brick Slab")) mcl_stairs.register_stair("sandstone", "mcl_core:sandstone", - {pickaxey=1, material_stone=1, stonecutter_output=9}, + {pickaxey=1, material_stone=1}, {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, S("Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_core:sandstone") --fixme: extra parameter from previous release mcl_stairs.register_slab("sandstone", "mcl_core:sandstone", - {pickaxey=1, material_stone=1, stonecutter_output=9}, + {pickaxey=1, material_stone=1}, {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, S("Sandstone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Sandstone Slab"), "mcl_core:sandstone") --fixme: extra parameter from previous release mcl_stairs.register_stair("sandstonesmooth2", "mcl_core:sandstonesmooth2", - {pickaxey=1, material_stone=1, stonecutter_output=9, stonecutter_stage=1}, + {pickaxey=1, material_stone=1}, {"mcl_core_sandstone_top.png"}, S("Smooth Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("sandstonesmooth2", "mcl_core:sandstonesmooth2", - {pickaxey=1, material_stone=1, stonecutter_output=9, stonecutter_stage=1}, + {pickaxey=1, material_stone=1}, {"mcl_core_sandstone_top.png"}, S("Smooth Sandstone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Smooth Sandstone Slab")) mcl_stairs.register_stair("redsandstone", "mcl_core:redsandstone", - {pickaxey=1, material_stone=1, stonecutter_output=10}, + {pickaxey=1, material_stone=1}, {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, S("Red Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_core:redsandstone") --fixme: extra parameter from previous release mcl_stairs.register_slab("redsandstone", "mcl_core:redsandstone", - {pickaxey=1, material_stone=1, stonecutter_output=10}, + {pickaxey=1, material_stone=1}, {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, S("Red Sandstone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Red Sandstone Slab"), "mcl_core:redsandstone") --fixme: extra parameter from previous release mcl_stairs.register_stair("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", - {pickaxey=1, material_stone=1, stonecutter_output=10, stonecutter_stage=1}, + {pickaxey=1, material_stone=1}, {"mcl_core_red_sandstone_top.png"}, S("Smooth Red Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", - {pickaxey=1, material_stone=1, stonecutter_output=10, stonecutter_stage=1}, + {pickaxey=1, material_stone=1}, {"mcl_core_red_sandstone_top.png"}, S("Smooth Red Sandstone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, @@ -174,52 +174,52 @@ mcl_stairs.register_slab("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", -- Intentionally not group:stonebrick because of mclx_stairs mcl_stairs.register_stair("stonebrick", "mcl_core:stonebrick", - {pickaxey=1, material_stone=1, stonecutter_output=1, stonecutter_stage=1}, + {pickaxey=1, material_stone=1}, {"default_stone_brick.png"}, S("Stone Bricks Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil, "mcl_core:stonebrick") --fixme: extra parameter from previous release mcl_stairs.register_slab("stonebrick", "mcl_core:stonebrick", - {pickaxey=1, material_stone=1, stonecutter_output=1, stonecutter_stage=1}, + {pickaxey=1, material_stone=1}, {"default_stone_brick.png"}, S("Stone Bricks Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Stone Bricks Slab"), "mcl_core:stonebrick") --fixme: extra parameter from previous release mcl_stairs.register_stair("quartzblock", "mcl_nether:quartz_block", - {pickaxey=1, material_stone=1, stonecutter_output=14}, + {pickaxey=1, material_stone=1}, {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, S("Quartz Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_nether:quartz_block") --fixme: extra parameter from previous release mcl_stairs.register_slab("quartzblock", "mcl_nether:quartz_block", - {pickaxey=1, material_stone=1, stonecutter_output=14}, + {pickaxey=1, material_stone=1}, {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, S("Quartz Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Quartz Slab"), "mcl_nether:quartz_block") --fixme: extra parameter from previous release mcl_stairs.register_stair("quartz_smooth", "mcl_nether:quartz_smooth", - {pickaxey=1, material_stone=1, stonecutter_output=31}, + {pickaxey=1, material_stone=1}, {"mcl_nether_quartz_block_bottom.png"}, S("Smooth Quartz Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("quartz_smooth", "mcl_nether:quartz_smooth", - {pickaxey=1, material_stone=1, stonecutter_output=31}, + {pickaxey=1, material_stone=1}, {"mcl_nether_quartz_block_bottom.png"}, S("Smooth Quartz Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Smooth Quartz Slab")) mcl_stairs.register_stair_and_slab("nether_brick", "mcl_nether:nether_brick", - {pickaxey=1, material_stone=1, stonecutter_output=17}, + {pickaxey=1, material_stone=1}, {"mcl_nether_nether_brick.png"}, S("Nether Brick Stairs"), S("Nether Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Nether Brick Slab"), nil) mcl_stairs.register_stair_and_slab("red_nether_brick", "mcl_nether:red_nether_brick", - {pickaxey=1, material_stone=1, stonecutter_output=18}, + {pickaxey=1, material_stone=1}, {"mcl_nether_red_nether_brick.png"}, S("Red Nether Brick Stairs"), S("Red Nether Brick Slab"), @@ -227,7 +227,7 @@ mcl_stairs.register_stair_and_slab("red_nether_brick", "mcl_nether:red_nether_br S("Double Red Nether Brick Slab"), nil) mcl_stairs.register_stair_and_slab("end_bricks", "mcl_end:end_bricks", - {pickaxey=1, material_stone=1, stonecutter_output=20}, + {pickaxey=1, material_stone=1}, {"mcl_end_end_bricks.png"}, S("End Stone Brick Stairs"), S("End Stone Brick Slab"), @@ -235,59 +235,59 @@ mcl_stairs.register_stair_and_slab("end_bricks", "mcl_end:end_bricks", S("Double End Stone Brick Slab"), nil) mcl_stairs.register_stair("purpur_block", "mcl_end:purpur_block", - {pickaxey=1, material_stone=1, stonecutter_output=15}, + {pickaxey=1, material_stone=1}, {"mcl_end_purpur_block.png"}, S("Purpur Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil) mcl_stairs.register_slab("purpur_block", "mcl_end:purpur_block", - {pickaxey=1, material_stone=1, stonecutter_output=15}, + {pickaxey=1, material_stone=1}, {"mcl_end_purpur_block.png"}, S("Purpur Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Purpur Slab")) mcl_stairs.register_stair("prismarine", "mcl_ocean:prismarine", - {pickaxey=1, material_stone=1, stonecutter_output=11}, + {pickaxey=1, material_stone=1}, {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, S("Prismarine Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil) mcl_stairs.register_slab("prismarine", "mcl_ocean:prismarine", - {pickaxey=1, material_stone=1, stonecutter_output=11}, + {pickaxey=1, material_stone=1}, {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, S("Prismarine Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Prismarine Slab")) mcl_stairs.register_stair("prismarine_brick", "mcl_ocean:prismarine_brick", - {pickaxey=1, material_stone=1, stonecutter_output=12}, + {pickaxey=1, material_stone=1}, {"mcl_ocean_prismarine_bricks.png"}, S("prismarine Brick Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil) mcl_stairs.register_slab("prismarine_brick", "mcl_ocean:prismarine_brick", - {pickaxey=1, material_stone=1, stonecutter_output=12}, + {pickaxey=1, material_stone=1}, {"mcl_ocean_prismarine_bricks.png"}, S("prismarine Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double prismarine_brick Slab")) mcl_stairs.register_stair("prismarine_dark", "mcl_ocean:prismarine_dark", - {pickaxey=1, material_stone=1, stonecutter_output=13}, + {pickaxey=1, material_stone=1}, {"mcl_ocean_prismarine_dark.png"}, S("prismarine Brick Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil) mcl_stairs.register_slab("prismarine_dark", "mcl_ocean:prismarine_dark", - {pickaxey=1, material_stone=1, stonecutter_output=13}, + {pickaxey=1, material_stone=1}, {"mcl_ocean_prismarine_dark.png"}, S("Dark Prismarine Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Dark Prismarine Slab")) mcl_stairs.register_stair_and_slab("mud_brick", "mcl_mud:mud_bricks", - {pickaxey=1, material_stone=1, stonecutter_output=30}, + {pickaxey=1, material_stone=1}, {"mcl_mud_bricks.png"}, S("Mud Brick Stairs"), S("Mud Brick Slab"), @@ -295,53 +295,53 @@ mcl_stairs.register_stair_and_slab("mud_brick", "mcl_mud:mud_bricks", S("Double Mud Brick Slab"), nil) mcl_stairs.register_slab("andesite_smooth", "mcl_core:andesite_smooth", - {pickaxey=1, stonecutter_output=5, stonecutter_stage=1}, + {pickaxey=1}, {"mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, S("Polished Andesite Slab"), nil, 6, nil, S("Double Polished Andesite Slab")) mcl_stairs.register_stair("andesite_smooth", "mcl_core:andesite_smooth", - {pickaxey=1, stonecutter_output=5, stonecutter_stage=1}, + {pickaxey=1}, {"mcl_stairs_andesite_smooth_slab.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, S("Polished Andesite Stairs"), nil, 6, nil, "woodlike") mcl_stairs.register_slab("granite_smooth", "mcl_core:granite_smooth", - {pickaxey=1, stonecutter_output=4, stonecutter_stage=1}, + {pickaxey=1}, {"mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, S("Polished Granite Slab"), nil, 6, nil, S("Double Polished Granite Slab")) mcl_stairs.register_stair("granite_smooth", "mcl_core:granite_smooth", - {pickaxey=1, stonecutter_output=4, stonecutter_stage=1}, + {pickaxey=1}, {"mcl_stairs_granite_smooth_slab.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, S("Polished Granite Stairs"), nil, 6, nil, "woodlike") mcl_stairs.register_slab("diorite_smooth", "mcl_core:diorite_smooth", - {pickaxey=1, stonecutter_output=6, stonecutter_stage=1}, + {pickaxey=1}, {"mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, S("Polished Diorite Slab"), nil, 6, nil, S("Double Polished Diorite Slab")) mcl_stairs.register_stair("diorite_smooth", "mcl_core:diorite_smooth", - {pickaxey=1, stonecutter_output=6, stonecutter_stage=1}, + {pickaxey=1}, {"mcl_stairs_diorite_smooth_slab.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, S("Polished Diorite Stairs"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("stonebrickmossy", "mcl_core:stonebrickmossy", - {pickaxey=1, stonecutter_output=3}, + {pickaxey=1}, {"mcl_core_stonebrick_mossy.png"}, S("Mossy Stone Brick Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil) mcl_stairs.register_slab("stonebrickmossy", "mcl_core:stonebrickmossy", - {pickaxey=1, stonecutter_output=3}, + {pickaxey=1}, {"mcl_core_stonebrick_mossy.png"}, S("Mossy Stone Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, diff --git a/mods/ITEMS/mcl_walls/register.lua b/mods/ITEMS/mcl_walls/register.lua index 2307f2bfe..c2859935e 100644 --- a/mods/ITEMS/mcl_walls/register.lua +++ b/mods/ITEMS/mcl_walls/register.lua @@ -1,17 +1,17 @@ local S = minetest.get_translator(minetest.get_current_modname()) -mcl_walls.register_wall("mcl_walls:cobble", S("Cobblestone Wall"), "mcl_core:cobble", {"mcl_walls_cobble_wall_top.png", "default_cobble.png", "mcl_walls_cobble_wall_side.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=7}) -mcl_walls.register_wall("mcl_walls:mossycobble", S("Mossy Cobblestone Wall"), "mcl_core:mossycobble", {"mcl_walls_cobble_mossy_wall_top.png", "default_mossycobble.png", "mcl_walls_cobble_mossy_wall_side.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=8}) -mcl_walls.register_wall("mcl_walls:andesite", S("Andesite Wall"), "mcl_core:andesite", {"mcl_core_andesite.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=5}) -mcl_walls.register_wall("mcl_walls:granite", S("Granite Wall"), "mcl_core:granite", {"mcl_core_granite.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=4}) -mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorite", {"mcl_core_diorite.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=6}) -mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block", {"default_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=16}) -mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone", {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=9}) -mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone", {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_carved.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=10}) -mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick", {"default_stone_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=1, stonecutter_stage=1}) -mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy", {"mcl_core_stonebrick_mossy.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=3}) -mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine",{{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, "", {pickaxey=1, material_stone=1, stonecutter_output=11}) -mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks", {"mcl_end_end_bricks.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=20}) -mcl_walls.register_wall("mcl_walls:netherbrick", S("Nether Brick Wall"), "mcl_nether:nether_brick", {"mcl_nether_nether_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=17}) -mcl_walls.register_wall("mcl_walls:rednetherbrick", S("Red Nether Brick Wall"), "mcl_nether:red_nether_brick", {"mcl_nether_red_nether_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=18}) -mcl_walls.register_wall("mcl_walls:mudbrick", S("Mud Brick Wall"), "mcl_mud:mud_bricks", {"mcl_mud_bricks.png"}, "", {handy=1, pickaxey=1, material_stone=1, stonecutter_output=30}) \ No newline at end of file +mcl_walls.register_wall("mcl_walls:cobble", S("Cobblestone Wall"), "mcl_core:cobble", {"mcl_walls_cobble_wall_top.png", "default_cobble.png", "mcl_walls_cobble_wall_side.png"}) +mcl_walls.register_wall("mcl_walls:mossycobble", S("Mossy Cobblestone Wall"), "mcl_core:mossycobble", {"mcl_walls_cobble_mossy_wall_top.png", "default_mossycobble.png", "mcl_walls_cobble_mossy_wall_side.png"}) +mcl_walls.register_wall("mcl_walls:andesite", S("Andesite Wall"), "mcl_core:andesite") +mcl_walls.register_wall("mcl_walls:granite", S("Granite Wall"), "mcl_core:granite") +mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorite") +mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block") +mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone") +mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone") +mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick") +mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy") +mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine") +mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks") +mcl_walls.register_wall("mcl_walls:netherbrick", S("Nether Brick Wall"), "mcl_nether:nether_brick") +mcl_walls.register_wall("mcl_walls:rednetherbrick", S("Red Nether Brick Wall"), "mcl_nether:red_nether_brick") +mcl_walls.register_wall("mcl_walls:mudbrick", S("Mud Brick Wall"), "mcl_mud:mud_bricks") From c183da7714e207409d38f42a86a46bf8a5458930 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 21:49:57 +0100 Subject: [PATCH 066/345] Updated README --- mods/ITEMS/mcl_stonecutter/README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/README.md b/mods/ITEMS/mcl_stonecutter/README.md index e5888ea0b..cd6b5a95a 100644 --- a/mods/ITEMS/mcl_stonecutter/README.md +++ b/mods/ITEMS/mcl_stonecutter/README.md @@ -4,17 +4,18 @@ Adds the stonecutter block. Used to cut stone like materials into stairs, slabs, ### Adding recipes -* To add a new compatible input the item needs to be in the group "stonecuttable". -* It's output item needs to be in the group "stonecutter_output". -* "stonecuttable" and "stonecutter_output" need to have the same number. -* Items like polished granite should only be able to make it's polished variants -while normal granite can make both. These inputs and outputs need to be in the group - "stonecutter_stage". +* To add a new custom stonecutter recipe, use `mcl_stonecutter.register_recipe(input, output, count)` +* `input` must be a name of a registered item +* `output` must also be a name of a registered item +* `count` should be a number denoting output count, this defaults to 1 for `nil` and invalid values + * a number with a fraction passed as count will be rounded down +* Stairs, slabs and walls get their recipes registered automatically +* Recipe chains are followed automatically, so any recipes taking `output` of another recipe as input will also be taking `input` of that recipe as their input License of code --------------- See the main MineClone 2 README.md file. -Author: PrairieWind, ChrisPHP, cora +Author: PrairieWind, ChrisPHP, cora, Herowl License of media ---------------- From 2128dd4c15bcd6d94e0f14a60e2be06c10c5a1f6 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 19 Nov 2023 01:23:57 +0100 Subject: [PATCH 067/345] Add basic table ordered keys iterator --- mods/CORE/mcl_util/init.lua | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index e894eebd7..17c4bfc14 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -22,6 +22,30 @@ function table.update_nil(t, ...) return t end +---Works the same as `pairs`, but order returned by keys +--- +---Taken from https://www.lua.org/pil/19.3.html +---@generic T: table, K, V, C +---@param t T +---@param f? fun(a: C, b: C):boolean +---@return fun():K, V +function table.pairs_by_keys(t, f) + local a = {} + for n in pairs(t) do table.insert(a, n) end + table.sort(a, f) + + local i = 0 -- iterator variable + local function iter() -- iterator function + i = i + 1 + if a[i] == nil then + return nil + else + return a[i], t[a[i]] + end + end + return iter +end + local LOGGING_ON = minetest.settings:get_bool("mcl_logging_default", false) local LOG_MODULE = "[MCL2]" function mcl_util.mcl_log(message, module, bypass_default_logger) From a001f847861d913440604530d028dbf0a807f93b Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 19 Nov 2023 01:24:54 +0100 Subject: [PATCH 068/345] Add utility functions to clean inventory lists --- mods/CORE/mcl_util/init.lua | 50 +++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 17c4bfc14..ec50bc3fb 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -1137,3 +1137,53 @@ function mcl_util.get_colorwallmounted_rotation(pos) end end end + +---Move items from one inventory list to another, drop items that do not fit in provided pos and direction. +---@param src_inv mt.InvRef +---@param src_listname string +---@param out_inv mt.InvRef +---@param out_listname string +---@param pos mt.Vector Position to throw items at +---@param dir? mt.Vector Direction to throw items in +---@param insta_collect? boolean Enable instant collection, let players collect dropped items instantly. Default `false` +function mcl_util.move_list(src_inv, src_listname, out_inv, out_listname, pos, dir, insta_collect) + local src_list = src_inv:get_list(src_listname) + + if not src_list then return end + for i, stack in ipairs(src_list) do + if out_inv:room_for_item(out_listname, stack) then + out_inv:add_item(out_listname, stack) + else + local p = vector.copy(pos) + p.x = p.x + (math.random(1, 3) * 0.2) + p.z = p.z + (math.random(1, 3) * 0.2) + + local obj = minetest.add_item(p, stack) + if obj then + if dir then + local v = vector.copy(dir) + v.x = v.x * 4 + v.y = v.y * 4 + 2 + v.z = v.z * 4 + obj:set_velocity(v) + minetest.log("error", vector.to_string(v)) + end + if not insta_collect then + obj:get_luaentity()._insta_collect = false + end + end + end + + stack:clear() + src_inv:set_stack(src_listname, i, stack) + end +end + +---Move items from a player's inventory list to its main inventory list, drop items that do not fit in front of him. +---@param player mt.PlayerObjectRef +---@param src_listname string +function mcl_util.move_player_list(player, src_listname) + mcl_util.move_list(player:get_inventory(), src_listname, player:get_inventory(), "main", + vector.offset(player:get_pos(), 0, 1.2, 0), + player:get_look_dir(), false) +end From 4836418cf6d90b0b43d12a699703b8583414e017 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 19 Nov 2023 01:42:12 +0100 Subject: [PATCH 069/345] Rework Stonecutter --- mods/ITEMS/mcl_stonecutter/README.md | 6 +- mods/ITEMS/mcl_stonecutter/init.lua | 466 ++++++++++++++++----------- mods/ITEMS/mcl_stonecutter/mod.conf | 2 +- 3 files changed, 284 insertions(+), 190 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/README.md b/mods/ITEMS/mcl_stonecutter/README.md index cd6b5a95a..7fd31aa97 100644 --- a/mods/ITEMS/mcl_stonecutter/README.md +++ b/mods/ITEMS/mcl_stonecutter/README.md @@ -12,10 +12,14 @@ Adds the stonecutter block. Used to cut stone like materials into stairs, slabs, * Stairs, slabs and walls get their recipes registered automatically * Recipe chains are followed automatically, so any recipes taking `output` of another recipe as input will also be taking `input` of that recipe as their input +### Displaying the Stonecutter menu + +* To display the stonecutter formspec to a player use `mcl_stonecutter.show_stonecutter_form(player)` + License of code --------------- See the main MineClone 2 README.md file. -Author: PrairieWind, ChrisPHP, cora, Herowl +Author: PrairieWind, ChrisPHP, cora, Herowl, AFCMS License of media ---------------- diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index b32cf14fe..26ec0d419 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -2,35 +2,65 @@ --||||| STONECUTTER ||||| --||||||||||||||||||||||| +-- The stonecutter is implemented just like the crafting table, meaning the node doesn't have any state. +-- Instead it trigger the display of a per-player menu. The input and output slots, the wanted item are stored into the player meta. +-- +-- Player inventory lists: +-- * stonecutter_input (1) +-- * stonecutter_output (1) +-- Player meta: +-- * stonecutter_selected (string, wanted item name) + local S = minetest.get_translator("mcl_stonecutter") +local C = minetest.colorize +local show_formspec = minetest.show_formspec + +local formspec_name = "mcl_stonecutter:stonecutter" mcl_stonecutter = {} + + +---Table of registered recipes +--- +---```lua +---mcl_stonecutter.registered_recipes = { +--- ["mcl_core:input_item"] = { +--- ["mcl_core:output_item"] = 1, +--- ["mcl_core:output_item2"] = 2, +--- }, +---} +---``` +---@type table> mcl_stonecutter.registered_recipes = {} --- API --- input - string - name of a registered item --- output - string - name of a registered item --- count - int - number of the output - --- - defaults to 1 --- - non-int rounded down + +---Registers a recipe for the stonecutter +---@param input string Name of a registered item +---@param output string Name of a registered item +---@param count? integer Number of the output, defaults to `1` function mcl_stonecutter.register_recipe(input, output, count) - if mcl_stonecutter.registered_recipes[input] and mcl_stonecutter.registered_recipes[input][output] then return end + if mcl_stonecutter.registered_recipes[input] and mcl_stonecutter.registered_recipes[input][output] then + minetest.log("warning", + "[mcl_stonecutter] Recipe already registered: [" .. input .. "] -> [" .. output .. " " .. count .. "]") + return + end + if not minetest.registered_items[input] then - error("Input is not a registered item: ".. input) + error("Input is not a registered item: " .. input) end + if not minetest.registered_items[output] then - error("Output is not a registered item: ".. output) + error("Output is not a registered item: " .. output) end - local n = count - if type(count) ~= "number" then - n = 1 - end - n = math.floor(n) + + count = count or 1 + if not mcl_stonecutter.registered_recipes[input] then mcl_stonecutter.registered_recipes[input] = {} end - mcl_stonecutter.registered_recipes[input][output] = n + + mcl_stonecutter.registered_recipes[input][output] = count local fallthrough = mcl_stonecutter.registered_recipes[output] if fallthrough then @@ -42,88 +72,239 @@ function mcl_stonecutter.register_recipe(input, output, count) for i, recipes in pairs(mcl_stonecutter.registered_recipes) do for name, c in pairs(recipes) do if name == input then - mcl_stonecutter.register_recipe(i, output, c*n) + mcl_stonecutter.register_recipe(i, output, c * count) end end end end --- formspecs -local function show_stonecutter_formspec(items, input) - local cut_items = {} - local x_len = 0 - local y_len = 0.5 +---Minetest currently (5.7) doesn't prevent using `:` characters in field names +---But using them prevent the buttons from beeing styled with `style[]` elements +---https://github.com/minetest/minetest/issues/14013 - -- This loops through all the items that can be made and inserted into the formspec - if items ~= nil then - for name, count in pairs(items) do - x_len = x_len + 1 - if x_len > 5 then - y_len = y_len + 1 - x_len = 1 - end - table.insert(cut_items,string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",x_len+1,y_len,1,1, name, name, tostring(count))) - end +---@param itemname string +local function itenname_to_fieldname(itemname) + return string.gsub(itemname, ":", "__") +end + +---@param fieldname string +local function fieldname_to_itemname(fieldname) + return string.gsub(fieldname, "__", ":") +end + +---Build the formspec for the stonecutter with given output button +---@param player mt.PlayerObjectRef +---@param items? table +local function build_stonecutter_formspec(player, items) + local meta = player:get_meta() + local selected = meta:get_string("stonecutter_selected") + + items = items or {} + + -- Buttons are 3.5 / 4 = 0.875 wide + local c = 0 + local items_content = "style_type[item_image_button;noclip=false;content_offset=0]" .. + (selected ~= "" and "style[" .. itenname_to_fieldname(selected) .. ";border=false;bgimg=mcl_inventory_button9_pressed.png;bgimg_pressed=mcl_inventory_button9_pressed.png;bgimg_middle=2,2]" or "") + + for name, count in table.pairs_by_keys(items) do + c = c + 1 + local x = ((c - 1) % 4) * 0.875 + local y = (math.floor((c - 1) / 4)) * 0.875 + + items_content = items_content .. + string.format("item_image_button[%f,%f;0.875,0.875;%s;%s;]", x, y, + name, itenname_to_fieldname(name), tostring(count)) end - local formspec = "size[9,8.75]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "label[1,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Stone Cutter"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "list[context;input;0.5,1.7;1,1;]".. - mcl_formspec.get_itemslot_bg(0.5,1.7,1,1).. - "list[context;output;7.5,1.7;1,1;]".. - mcl_formspec.get_itemslot_bg(7.5,1.7,1,1).. - table.concat(cut_items).. - "listring[context;output]".. - "listring[current_player;main]".. - "listring[context;input]".. - "listring[current_player;main]" + local formspec = table.concat({ + "formspec_version[4]", + "size[11.75,10.425]", + "label[0.375,0.375;" .. C(mcl_formspec.label_color, S("Stone Cutter")) .. "]", + + -- Pattern input slot + mcl_formspec.get_itemslot_bg_v4(1.625, 2, 1, 1), + "list[current_player;stonecutter_input;1.625,2;1,1;]", + + -- Container background + "image[4.075,0.7;3.6,3.6;mcl_inventory_background9.png;2]", + + -- Style for item image buttons + "style_type[item_image_button;noclip=false;content_offset=0]", + + -- Scroll Container with buttons if needed + "scroll_container[4.125,0.75;3.5,3.5;scroll;vertical;0.875]", + items_content, + "scroll_container_end[]", + + -- Scrollbar + -- TODO: style the scrollbar correctly when possible + "scrollbaroptions[min=0;max=" .. + math.max(math.floor(#items / 4) + 1 - 4, 0) .. ";smallstep=1;largesteps=1]", + "scrollbar[7.625,0.7;0.75,3.6;vertical;scroll;0]", + + -- Output slot + mcl_formspec.get_itemslot_bg_v4(9.75, 2, 1, 1, 0.2), + "list[current_player;stonecutter_output;9.75,2;1,1;]", + + -- Player inventory + "label[0.375,4.7;" .. 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;stonecutter_output]", + "listring[current_player;main]", + "listring[current_player;stonecutter_input]", + "listring[current_player;main]", + }) return formspec end --- Updates the formspec -local function update_stonecutter_slots(pos, str) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local input = inv:get_stack("input", 1) - local name = input:get_name() - local recipes = mcl_stonecutter.registered_recipes[name] + +---Display stonecutter menu to a player +---@param player mt.PlayerObjectRef +function mcl_stonecutter.show_stonecutter_form(player) + show_formspec(player:get_player_name(), formspec_name, + build_stonecutter_formspec(player, + mcl_stonecutter.registered_recipes[player:get_inventory():get_stack("stonecutter_input", 1):get_name()])) +end + +---Change the selected output item. +---@param player mt.PlayerObjectRef +---@param item_name? string The item name of the output +function set_selected_item(player, item_name) + player:get_meta():set_string("stonecutter_selected", item_name and item_name or "") +end + +minetest.register_on_joinplayer(function(player) + local inv = player:get_inventory() + + inv:set_size("stonecutter_input", 1) + inv:set_size("stonecutter_output", 1) + + set_selected_item(player, nil) + + --The player might have items remaining in the slots from the previous join; this is likely + --when the server has been shutdown and the server didn't clean up the player inventories. + mcl_util.move_player_list(player, "stonecutter_input") + mcl_util.move_player_list(player, "stonecutter_output") +end) + +minetest.register_on_leaveplayer(function(player) + set_selected_item(player, nil) + + mcl_util.move_player_list(player, "stonecutter_input") + mcl_util.move_player_list(player, "stonecutter_output") +end) + +---Update content of the stonecutter output slot with the input slot and the selected item +---@param player mt.PlayerObjectRef +function update_stonecutter_slots(player) + local meta = player:get_meta() + local inv = player:get_inventory() + + local input = inv:get_stack("stonecutter_input", 1) + local recipes = mcl_stonecutter.registered_recipes[input:get_name()] + local output_item = meta:get_string("stonecutter_selected") if recipes then - meta:set_string("formspec", show_stonecutter_formspec(recipes)) - if str then - local recipe = recipes[str] - if not recipe then return end - local cut_item = ItemStack(str) - cut_item:set_count(recipe) - inv:set_stack("output", 1, cut_item) + if output_item then + local recipe = recipes[output_item] + if recipe then + local cut_item = ItemStack(output_item) + cut_item:set_count(recipe) + inv:set_stack("stonecutter_output", 1, cut_item) + else + inv:set_stack("stonecutter_output", 1, nil) + end else - inv:set_stack("output", 1, "") + inv:set_stack("stonecutter_output", 1, nil) end else - meta:set_string("formspec", show_stonecutter_formspec(nil)) - inv:set_stack("output", 1, "") + inv:set_stack("stonecutter_output", 1, nil) + end + + mcl_stonecutter.show_stonecutter_form(player) +end + +--Drop items in slots and reset selected item on closing +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= formspec_name then return end + + if fields.quit then + mcl_util.move_player_list(player, "stonecutter_input") + mcl_util.move_player_list(player, "stonecutter_output") + return + end + + for field_name, value in pairs(fields) do + if field_name ~= "scroll" then + local itemname = fieldname_to_itemname(field_name) + player:get_meta():set_string("stonecutter_selected", itemname) + set_selected_item(player, itemname) + update_stonecutter_slots(player) + mcl_stonecutter.show_stonecutter_form(player) + break + end + end +end) + + +minetest.register_allow_player_inventory_action(function(player, action, inventory, inventory_info) + if action == "move" then + if inventory_info.to_list == "stonecutter_output" then + return 0 + end + + if inventory_info.from_list == "stonecutter_output" and inventory_info.to_list == "stonecutter_input" then + if inventory:get_stack(inventory_info.to_list, inventory_info.to_index):is_empty() then + return inventory_info.count + else + return 0 + end + end + elseif action == "put" then + if inventory_info.to_list == "stonecutter_output" then + return 0 + end + end +end) + +function remove_from_input(player, inventory) + local meta = player:get_meta() + local selected = meta:get_string("stonecutter_selected") + local istack = inventory:get_stack("stonecutter_input", 1) + + -- selected should normally never be nil, but just in case + if selected then + istack:set_count(math.max(0, istack:get_count() - 1)) + inventory:set_stack("stonecutter_input", 1, istack) end end --- Only drop the items that were in the input slot -local function drop_stonecutter_items(pos, meta) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - for i=1, inv:get_size("input") do - local stack = inv:get_stack("input", i) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) --- inv:set_stack("input", i, ItemStack()) +minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) + if action == "move" then + if inventory_info.to_list == "stonecutter_input" or inventory_info.from_list == "stonecutter_input" then + update_stonecutter_slots(player) + return + elseif inventory_info.from_list == "stonecutter_output" then + remove_from_input(player, inventory) + update_stonecutter_slots(player) + end + elseif action == "put" then + if inventory_info.listname == "stonecutter_input" or inventory_info.listname == "stonecutter_input" then + update_stonecutter_slots(player) + end + elseif action == "take" then + if inventory_info.listname == "stonecutter_output" then + remove_from_input(player, inventory) + update_stonecutter_slots(player) end end -end +end) minetest.register_node("mcl_stonecutter:stonecutter", { description = S("Stone Cutter"), @@ -134,134 +315,43 @@ minetest.register_node("mcl_stonecutter:stonecutter", { "mcl_stonecutter_bottom.png", "mcl_stonecutter_side.png", "mcl_stonecutter_side.png", - {name="mcl_stonecutter_saw.png", - animation={ - type="vertical_frames", - aspect_w=16, - aspect_h=16, - length=1 - }}, - {name="mcl_stonecutter_saw.png", - animation={ - type="vertical_frames", - aspect_w=16, - aspect_h=16, - length=1 - }} + { + name = "mcl_stonecutter_saw.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1 + } + }, + { + name = "mcl_stonecutter_saw.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1 + } + } }, use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", - groups = { pickaxey=1, material_stone=1 }, + groups = { pickaxey = 1, material_stone = 1 }, node_box = { type = "fixed", fixed = { - {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, -- NodeBox1 - {-0.4375, 0.0625, 0, 0.4375, 0.5, 0}, -- NodeBox2 + { -0.5, -0.5, -0.5, 0.5, 0.0625, 0.5 }, -- NodeBox1 + { -0.4375, 0.0625, 0, 0.4375, 0.5, 0 }, -- NodeBox2 } }, _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, sounds = mcl_sounds.node_sound_stone_defaults(), - on_destruct = drop_stonecutter_items, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - else - return stack:get_count() - end - end, - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - elseif to_list == "output" then - return 0 - elseif from_list == "output" and to_list == "input" then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if inv:get_stack(to_list, to_index):is_empty() then - return count - else - return 0 - end - else - return count - end - end, - on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.get_meta(pos) - if from_list == "output" and to_list == "input" then - local inv = meta:get_inventory() - for i=1, inv:get_size("input") do - if i ~= to_index then - local istack = inv:get_stack("input", i) - istack:set_count(math.max(0, istack:get_count() - count)) - inv:set_stack("input", i, istack) - end - end - end - update_stonecutter_slots(pos) - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - elseif listname == "output" then - return 0 - else - return stack:get_count() - end - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) - update_stonecutter_slots(pos) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos) - if listname == "output" then - local inv = meta:get_inventory() - local input = inv:get_stack("input", 1) - input:take_item() - inv:set_stack("input", 1, input) - if input:get_count() == 0 then - meta:set_string("cut_stone", nil) - end - else - meta:set_string("cut_stone", nil) - end - update_stonecutter_slots(pos) - end, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("input", 1) - inv:set_size("output", 1) - local form = show_stonecutter_formspec() - meta:set_string("formspec", form) - end, on_rightclick = function(pos, node, player, itemstack) if not player:get_player_control().sneak then - update_stonecutter_slots(pos) - end - end, - on_receive_fields = function(pos, formname, fields, sender) - local sender_name = sender:get_player_name() - if minetest.is_protected(pos, sender_name) then - minetest.record_protection_violation(pos, sender_name) - return - end - if fields then - for field_name, value in pairs(fields) do - local item_name = tostring(field_name) - if item_name then - update_stonecutter_slots(pos, item_name) - end - end + mcl_stonecutter.show_stonecutter_form(player) end end, }) diff --git a/mods/ITEMS/mcl_stonecutter/mod.conf b/mods/ITEMS/mcl_stonecutter/mod.conf index d9781e474..cc36848e5 100644 --- a/mods/ITEMS/mcl_stonecutter/mod.conf +++ b/mods/ITEMS/mcl_stonecutter/mod.conf @@ -1,4 +1,4 @@ name = mcl_stonecutter author = PrairieWind description = This mod adds a stonecutter, which is used to cut stone like materials, and used as the jobsite for the Stone Mason Villager. -depends = mcl_sounds +depends = mcl_sounds, mcl_util From e324a1a74b30a771ffefdb13399629bd42450dc0 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 22 Nov 2023 09:11:50 +0100 Subject: [PATCH 070/345] Make inventory use the util functions --- mods/HUD/mcl_inventory/init.lua | 68 +++++---------------------------- 1 file changed, 9 insertions(+), 59 deletions(-) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index cf484101c..c2555581c 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -3,56 +3,6 @@ mcl_inventory = {} dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/creative.lua") dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/survival.lua") ---local mod_player = minetest.get_modpath("mcl_player") ---local mod_craftguide = minetest.get_modpath("mcl_craftguide") - ----Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left. ----@param itemstack mt.ItemStack ----@param dropper mt.ObjectRef ----@param pos mt.Vector ----@param inv mt.InvRef -local function return_item(itemstack, dropper, pos, inv) - if dropper:is_player() then - -- Return to main inventory - if inv:room_for_item("main", itemstack) then - inv:add_item("main", itemstack) - else - -- Drop item on the ground - local v = dropper:get_look_dir() - local p = vector.offset(pos, 0, 1.2, 0) - p.x = p.x + (math.random(1, 3) * 0.2) - p.z = p.z + (math.random(1, 3) * 0.2) - local obj = minetest.add_item(p, itemstack) - if obj then - v.x = v.x * 4 - v.y = v.y * 4 + 2 - v.z = v.z * 4 - obj:set_velocity(v) - obj:get_luaentity()._insta_collect = false - end - end - else - -- Fallback for unexpected cases - minetest.add_item(pos, itemstack) - end - return itemstack -end - ----Return items in the given inventory list (name) to the main inventory, or drop them if there is no space left. ----@param player mt.PlayerObjectRef ----@param name string -local function return_fields(player, name) - local inv = player:get_inventory() - - local list = inv:get_list(name) - if not list then return end - for i, stack in ipairs(list) do - return_item(stack, player, player:get_pos(), inv) - stack:clear() - inv:set_stack(name, i, stack) - end -end - ---@param player mt.PlayerObjectRef ---@param armor_change_only? boolean local function set_inventory(player, armor_change_only) @@ -72,9 +22,9 @@ end -- Drop items in craft grid and reset inventory on closing minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.quit then - return_fields(player, "craft") - return_fields(player, "enchanting_lapis") - return_fields(player, "enchanting_item") + mcl_util.move_player_list(player, "craft") + mcl_util.move_player_list(player, "enchanting_lapis") + mcl_util.move_player_list(player, "enchanting_item") if not minetest.is_creative_enabled(player:get_player_name()) and (formname == "" or formname == "main") then set_inventory(player) end @@ -88,9 +38,9 @@ end -- Drop crafting grid items on leaving minetest.register_on_leaveplayer(function(player) - return_fields(player, "craft") - return_fields(player, "enchanting_lapis") - return_fields(player, "enchanting_item") + mcl_util.move_player_list(player, "craft") + mcl_util.move_player_list(player, "enchanting_lapis") + mcl_util.move_player_list(player, "enchanting_item") end) minetest.register_on_joinplayer(function(player) @@ -116,9 +66,9 @@ minetest.register_on_joinplayer(function(player) items remaining in the crafting grid from the previous join; this is likely when the server has been shutdown and the server didn't clean up the player inventories. ]] - return_fields(player, "craft") - return_fields(player, "enchanting_item") - return_fields(player, "enchanting_lapis") + mcl_util.move_player_list(player, "craft") + mcl_util.move_player_list(player, "enchanting_lapis") + mcl_util.move_player_list(player, "enchanting_item") end) ---@param player mt.PlayerObjectRef From af2f58248f26aabeb7ae5afa3e6a5ea488822cc7 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Thu, 23 Nov 2023 03:14:22 +0100 Subject: [PATCH 071/345] Added the ability to stonecut up to full stack --- mods/ITEMS/mcl_stonecutter/init.lua | 44 +++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 26ec0d419..02dc02925 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -92,6 +92,20 @@ local function fieldname_to_itemname(fieldname) return string.gsub(fieldname, "__", ":") end +-- Get the player configured stack size when taking items from creative inventory +---@param player mt.PlayerObjectRef +---@return integer +local function get_stack_size(player) + return player:get_meta():get_int("mcl_stonecutter:switch_stack") +end + +-- Set the player configured stack size when taking items from creative inventory +---@param player mt.PlayerObjectRef +---@param n integer +local function set_stack_size(player, n) + player:get_meta():set_int("mcl_stonecutter:switch_stack", n) +end + ---Build the formspec for the stonecutter with given output button ---@param player mt.PlayerObjectRef ---@param items? table @@ -142,6 +156,11 @@ local function build_stonecutter_formspec(player, items) math.max(math.floor(#items / 4) + 1 - 4, 0) .. ";smallstep=1;largesteps=1]", "scrollbar[7.625,0.7;0.75,3.6;vertical;scroll;0]", + -- Switch stack size button + "image_button[9.75,0.75;1,1;mcl_stonecutter_saw.png^[verticalframe:3:1;__switch_stack;]", + "label[10.25,1.5;" .. C("#FFFFFF", tostring(get_stack_size(player))) .. "]", + "tooltip[__switch_stack;" .. S("Switch stack size") .. "]", + -- Output slot mcl_formspec.get_itemslot_bg_v4(9.75, 2, 1, 1, 0.2), "list[current_player;stonecutter_output;9.75,2;1,1;]", @@ -209,13 +228,16 @@ function update_stonecutter_slots(player) local input = inv:get_stack("stonecutter_input", 1) local recipes = mcl_stonecutter.registered_recipes[input:get_name()] local output_item = meta:get_string("stonecutter_selected") + local stack_size = meta:get_int("mcl_stonecutter:switch_stack") if recipes then if output_item then local recipe = recipes[output_item] if recipe then local cut_item = ItemStack(output_item) - cut_item:set_count(recipe) + local count = math.min(math.floor(stack_size/recipe), input:get_count()) * recipe + if count < recipe then count = recipe end + cut_item:set_count(count) inv:set_stack("stonecutter_output", 1, cut_item) else inv:set_stack("stonecutter_output", 1, nil) @@ -240,6 +262,17 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return end + if fields.__switch_stack then + local switch = 1 + if get_stack_size(player) == 1 then + switch = 64 + end + set_stack_size(player, switch) + update_stonecutter_slots(player) + mcl_stonecutter.show_stonecutter_form(player) + return + end + for field_name, value in pairs(fields) do if field_name ~= "scroll" then local itemname = fieldname_to_itemname(field_name) @@ -277,10 +310,15 @@ function remove_from_input(player, inventory) local meta = player:get_meta() local selected = meta:get_string("stonecutter_selected") local istack = inventory:get_stack("stonecutter_input", 1) + local recipes = mcl_stonecutter.registered_recipes[istack:get_name()] + local stack_size = meta:get_int("mcl_stonecutter:switch_stack") -- selected should normally never be nil, but just in case - if selected then - istack:set_count(math.max(0, istack:get_count() - 1)) + if selected and recipes then + local recipe = recipes[selected] + local count = math.floor(stack_size/recipe) + if count < 1 then count = 1 end + istack:set_count(math.max(0, istack:get_count() - count)) inventory:set_stack("stonecutter_input", 1, istack) end end From a6025b751a476e3a6b829d8eff394fddfee244a3 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Thu, 23 Nov 2023 03:42:49 +0100 Subject: [PATCH 072/345] Uneven crafts support -taking part of the resulting stack now produces well-defined results -stonecutter won't allow amount undivisible by recipe count anymore --- mods/ITEMS/mcl_stonecutter/init.lua | 31 +++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 02dc02925..8e33470de 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -299,14 +299,37 @@ minetest.register_allow_player_inventory_action(function(player, action, invento return 0 end end + + if inventory_info.from_list == "stonecutter_output" then + local selected = player:get_meta():get_string("stonecutter_selected") + local istack = inventory:get_stack("stonecutter_input", 1) + local recipes = mcl_stonecutter.registered_recipes[istack:get_name()] + if not selected or not recipes then return 0 end + local recipe = recipes[selected] + local remainder = inventory_info.count % recipe + if remainder ~= 0 then + return 0 + end + end elseif action == "put" then if inventory_info.to_list == "stonecutter_output" then return 0 end + if inventory_info.from_list == "stonecutter_output" then + local selected = player:get_meta():get_string("stonecutter_selected") + local istack = inventory:get_stack("stonecutter_input", 1) + local recipes = mcl_stonecutter.registered_recipes[istack:get_name()] + if not selected or not recipes then return 0 end + local recipe = recipes[selected] + local remainder = inventory_info.stack:get_count() % recipe + if remainder ~= 0 then + return 0 + end + end end end) -function remove_from_input(player, inventory) +function remove_from_input(player, inventory, crafted_count) local meta = player:get_meta() local selected = meta:get_string("stonecutter_selected") local istack = inventory:get_stack("stonecutter_input", 1) @@ -316,7 +339,7 @@ function remove_from_input(player, inventory) -- selected should normally never be nil, but just in case if selected and recipes then local recipe = recipes[selected] - local count = math.floor(stack_size/recipe) + local count = crafted_count/recipe if count < 1 then count = 1 end istack:set_count(math.max(0, istack:get_count() - count)) inventory:set_stack("stonecutter_input", 1, istack) @@ -329,7 +352,7 @@ minetest.register_on_player_inventory_action(function(player, action, inventory, update_stonecutter_slots(player) return elseif inventory_info.from_list == "stonecutter_output" then - remove_from_input(player, inventory) + remove_from_input(player, inventory, inventory_info.count) update_stonecutter_slots(player) end elseif action == "put" then @@ -338,7 +361,7 @@ minetest.register_on_player_inventory_action(function(player, action, inventory, end elseif action == "take" then if inventory_info.listname == "stonecutter_output" then - remove_from_input(player, inventory) + remove_from_input(player, inventory, inventory_info.stack:get_count()) update_stonecutter_slots(player) end end From bb48e474881c152d38e652eb19f04282a9329c12 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Fri, 24 Nov 2023 01:33:32 +0100 Subject: [PATCH 073/345] Made stonecutter player metadata consistent --- mods/ITEMS/mcl_stonecutter/init.lua | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 8e33470de..e715d8519 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -9,7 +9,8 @@ -- * stonecutter_input (1) -- * stonecutter_output (1) -- Player meta: --- * stonecutter_selected (string, wanted item name) +-- * mcl_stonecutter:selected (string, wanted item name) +-- * mcl_stonecutter:switch_stack (int, wanted craft count: 1 or 64 = once or until full stack) local S = minetest.get_translator("mcl_stonecutter") @@ -111,7 +112,7 @@ end ---@param items? table local function build_stonecutter_formspec(player, items) local meta = player:get_meta() - local selected = meta:get_string("stonecutter_selected") + local selected = meta:get_string("mcl_stonecutter:selected") items = items or {} @@ -195,7 +196,7 @@ end ---@param player mt.PlayerObjectRef ---@param item_name? string The item name of the output function set_selected_item(player, item_name) - player:get_meta():set_string("stonecutter_selected", item_name and item_name or "") + player:get_meta():set_string("mcl_stonecutter:selected", item_name and item_name or "") end minetest.register_on_joinplayer(function(player) @@ -227,7 +228,7 @@ function update_stonecutter_slots(player) local input = inv:get_stack("stonecutter_input", 1) local recipes = mcl_stonecutter.registered_recipes[input:get_name()] - local output_item = meta:get_string("stonecutter_selected") + local output_item = meta:get_string("mcl_stonecutter:selected") local stack_size = meta:get_int("mcl_stonecutter:switch_stack") if recipes then @@ -276,7 +277,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) for field_name, value in pairs(fields) do if field_name ~= "scroll" then local itemname = fieldname_to_itemname(field_name) - player:get_meta():set_string("stonecutter_selected", itemname) + player:get_meta():set_string("mcl_stonecutter:selected", itemname) set_selected_item(player, itemname) update_stonecutter_slots(player) mcl_stonecutter.show_stonecutter_form(player) @@ -301,7 +302,7 @@ minetest.register_allow_player_inventory_action(function(player, action, invento end if inventory_info.from_list == "stonecutter_output" then - local selected = player:get_meta():get_string("stonecutter_selected") + local selected = player:get_meta():get_string("mcl_stonecutter:selected") local istack = inventory:get_stack("stonecutter_input", 1) local recipes = mcl_stonecutter.registered_recipes[istack:get_name()] if not selected or not recipes then return 0 end @@ -316,7 +317,7 @@ minetest.register_allow_player_inventory_action(function(player, action, invento return 0 end if inventory_info.from_list == "stonecutter_output" then - local selected = player:get_meta():get_string("stonecutter_selected") + local selected = player:get_meta():get_string("mcl_stonecutter:selected") local istack = inventory:get_stack("stonecutter_input", 1) local recipes = mcl_stonecutter.registered_recipes[istack:get_name()] if not selected or not recipes then return 0 end @@ -331,7 +332,7 @@ end) function remove_from_input(player, inventory, crafted_count) local meta = player:get_meta() - local selected = meta:get_string("stonecutter_selected") + local selected = meta:get_string("mcl_stonecutter:selected") local istack = inventory:get_stack("stonecutter_input", 1) local recipes = mcl_stonecutter.registered_recipes[istack:get_name()] local stack_size = meta:get_int("mcl_stonecutter:switch_stack") From b4080b62753ae2cd07d3bee72a0a20721ccf6dd1 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sat, 25 Nov 2023 01:04:53 +0100 Subject: [PATCH 074/345] Credits update in mod.conf --- mods/ITEMS/mcl_stonecutter/mod.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_stonecutter/mod.conf b/mods/ITEMS/mcl_stonecutter/mod.conf index cc36848e5..01cf2a75f 100644 --- a/mods/ITEMS/mcl_stonecutter/mod.conf +++ b/mods/ITEMS/mcl_stonecutter/mod.conf @@ -1,4 +1,4 @@ name = mcl_stonecutter -author = PrairieWind +author = PrairieWind, ChrisPHP, cora, Herowl, AFCMS description = This mod adds a stonecutter, which is used to cut stone like materials, and used as the jobsite for the Stone Mason Villager. depends = mcl_sounds, mcl_util From f1c5f0ca1c6b2862acb394ad4672f37f1f7f1e75 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 26 Nov 2023 00:39:55 +0100 Subject: [PATCH 075/345] Fixed duplication bug --- mods/ITEMS/mcl_stonecutter/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index e715d8519..5605db659 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -210,14 +210,14 @@ minetest.register_on_joinplayer(function(player) --The player might have items remaining in the slots from the previous join; this is likely --when the server has been shutdown and the server didn't clean up the player inventories. mcl_util.move_player_list(player, "stonecutter_input") - mcl_util.move_player_list(player, "stonecutter_output") + player:get_inventory():set_list("stonecutter_output", {}) end) minetest.register_on_leaveplayer(function(player) set_selected_item(player, nil) mcl_util.move_player_list(player, "stonecutter_input") - mcl_util.move_player_list(player, "stonecutter_output") + player:get_inventory():set_list("stonecutter_output", {}) end) ---Update content of the stonecutter output slot with the input slot and the selected item @@ -259,7 +259,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.quit then mcl_util.move_player_list(player, "stonecutter_input") - mcl_util.move_player_list(player, "stonecutter_output") + player:get_inventory():set_list("stonecutter_output", {}) return end From 8fd988da113e1196e189d8cead805f8ff4faccc1 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 26 Nov 2023 00:47:02 +0100 Subject: [PATCH 076/345] Increased cut copper recipe output --- mods/ITEMS/mcl_copper/crafting.lua | 4 ++-- mods/ITEMS/mcl_stonecutter/init.lua | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_copper/crafting.lua b/mods/ITEMS/mcl_copper/crafting.lua index 6754534db..f4af0eee3 100644 --- a/mods/ITEMS/mcl_copper/crafting.lua +++ b/mods/ITEMS/mcl_copper/crafting.lua @@ -61,8 +61,8 @@ end local cuttable_blocks = { "block", "waxed_block", "block_exposed", "waxed_block_exposed", "block_weathered", "waxed_block_weathered", "block_oxidized", "waxed_block_oxidized" } -for _, w in ipairs(cuttable_blocks) do - mcl_stonecutter.register_recipe("mcl_copper:"..w, "mcl_copper:"..w.."_cut") +for _, c in ipairs(cuttable_blocks) do + mcl_stonecutter.register_recipe("mcl_copper:"..c, "mcl_copper:"..c.."_cut", 4) end minetest.register_craft({ diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 5605db659..5edf424da 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -66,7 +66,7 @@ function mcl_stonecutter.register_recipe(input, output, count) local fallthrough = mcl_stonecutter.registered_recipes[output] if fallthrough then for o, c in pairs(fallthrough) do - mcl_stonecutter.register_recipe(input, o, c) + mcl_stonecutter.register_recipe(input, o, c * count) end end From 570ea114ecebee92d5c4c341c87ea6d6e05dfeb6 Mon Sep 17 00:00:00 2001 From: ThePython10110 Date: Mon, 27 Nov 2023 02:21:48 +0000 Subject: [PATCH 077/345] Fix weathered cut copper crafting (#4033) Just fixing a typo. Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4033 Reviewed-by: the-real-herowl Co-authored-by: ThePython10110 Co-committed-by: ThePython10110 --- mods/ITEMS/mcl_copper/crafting.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_copper/crafting.lua b/mods/ITEMS/mcl_copper/crafting.lua index 41084afb3..b500a82b0 100644 --- a/mods/ITEMS/mcl_copper/crafting.lua +++ b/mods/ITEMS/mcl_copper/crafting.lua @@ -41,7 +41,7 @@ minetest.register_craft({ }) minetest.register_craft({ - output = "mcl_copper:mcl_copper:block_weathered_cut 4", + output = "mcl_copper:block_weathered_cut 4", recipe = { { "mcl_copper:block_weathered", "mcl_copper:block_weathered" }, { "mcl_copper:block_weathered", "mcl_copper:block_weathered" }, From 10441637176783f59d9a5411d6428d61f5353611 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 27 Nov 2023 02:22:39 +0000 Subject: [PATCH 078/345] Fixed the ambiguous /clear command being dangerous (#4026) Implements #3826 Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4026 Co-authored-by: the-real-herowl Co-committed-by: the-real-herowl --- mods/MISC/mcl_commands/alias.lua | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/mods/MISC/mcl_commands/alias.lua b/mods/MISC/mcl_commands/alias.lua index 5c9ee9f3c..2c700408b 100644 --- a/mods/MISC/mcl_commands/alias.lua +++ b/mods/MISC/mcl_commands/alias.lua @@ -18,7 +18,7 @@ if minetest.settings:get_bool("mcl_builtin_commands_overide", true) then register_chatcommand_alias("tell", "msg") register_chatcommand_alias("w", "msg") register_chatcommand_alias("tp", "teleport") - rename_chatcommand("clear", "clearinv") + register_chatcommand_alias("clearinventory", "clearinv") minetest.register_chatcommand("banlist", { description = S("List bans"), @@ -27,4 +27,14 @@ if minetest.settings:get_bool("mcl_builtin_commands_overide", true) then return true, S("Ban list: @1", minetest.get_ban_list()) end, }) -end \ No newline at end of file + + minetest.register_chatcommand("clear", { + description = S("List clear commands"), + func = function(name) + return true, S("To clear inventory use /clearinv or /clearinventory").."\n".. + S("To clear mobs use /clearmobs").."\n".. + S("To clear the weather use /weather clear").."\n".. + S("Clearing the chat is not possible, you can hide the chat using \"Toggle chat log\" key (default F2) on PC or the chat icon on the mobile version") + end, + }) +end From 1da7bb0bdcf438276faadae17ac1426ec8c68612 Mon Sep 17 00:00:00 2001 From: Kostinatyn Tsiupa Date: Fri, 27 Oct 2023 01:15:57 +0300 Subject: [PATCH 079/345] hopper reimplementation Reimplemented hoppers and all (blast_furnace, furnace, smoker, composters, double chaets, shulker_boxes, droppers, bookshelvs and brewing_stands) connected nodes --- GROUPS.md | 12 +- mods/CORE/mcl_util/init.lua | 229 +++++----------- mods/ITEMS/REDSTONE/mcl_droppers/init.lua | 37 ++- mods/ITEMS/mcl_blast_furnace/init.lua | 11 +- mods/ITEMS/mcl_books/init.lua | 8 +- mods/ITEMS/mcl_brewing/init.lua | 108 +++++++- mods/ITEMS/mcl_chests/init.lua | 79 +++++- mods/ITEMS/mcl_composters/init.lua | 147 ++++++++--- mods/ITEMS/mcl_composters/mod.conf | 2 +- mods/ITEMS/mcl_furnaces/init.lua | 38 ++- mods/ITEMS/mcl_hoppers/init.lua | 244 ++++-------------- mods/ITEMS/mcl_itemframes/item_frames_API.lua | 2 +- mods/ITEMS/mcl_jukebox/init.lua | 2 +- mods/ITEMS/mcl_potions/init.lua | 4 +- mods/ITEMS/mcl_potions/lingering.lua | 2 +- mods/ITEMS/mcl_potions/potions.lua | 10 +- mods/ITEMS/mcl_potions/splash.lua | 2 +- mods/ITEMS/mcl_smoker/init.lua | 11 +- 18 files changed, 504 insertions(+), 444 deletions(-) diff --git a/GROUPS.md b/GROUPS.md index e6d878990..0eb2d2d7c 100644 --- a/GROUPS.md +++ b/GROUPS.md @@ -170,16 +170,8 @@ These groups are used mostly for informational purposes * `ammo_bow=1`: Item is used as ammo for bows * `non_combat_armor=1`: Item can be equipped as armor, but is not made for combat (e.g. zombie head, pumpkin) * `container`: Node is a container which physically stores items within and has at least 1 inventory - * `container=2`: Has one inventory with list name `"main"`. Items can be placed and taken freely - * `container=3`: Same as `container=2`, but shulker boxes can not be inserted - * `container=4`: Furnace-like, has lists `"src"`, `"fuel"` and `"dst"`. - It is expected that this also reacts on `on_timer`; - the node timer must be started from other mods when they add into `"src"` or `"fuel"` - * `container=5`: Left part of a 2-part horizontal connected container. Both parts have a `"main"` inventory - list. Both inventories are considered to belong together. This is used for large chests. - * `container=6`: Same as above, but for the right part. - * `container=7`: Has inventory list "`main`", no movement allowed - * `container=1`: Other/unspecified container type + * `container=1`: Container type, which does not allow hoppers to transfer items + * `container=2`: Items can be placed and taken freely. Can have inventory with list name `"main"` or define `_mcl_hoppers_on_try_pull`, `_mcl_hoppers_on_try_push`, `_mcl_hoppers_on_after_pull`, `_mcl_hoppers_on_after_push` to play along hoppers nicely. * `spawn_egg=1`: Spawn egg * `pressure_plate=1`: Pressure plate (off) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index e894eebd7..5d44bb29f 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -241,34 +241,25 @@ function mcl_util.get_double_container_neighbor_pos(pos, param2, side) end end --- Iterates through all items in the given inventory and --- returns the slot of the first item which matches a condition. --- Returns nil if no item was found. ---- source_inventory: Inventory to take the item from ---- source_list: List name of the source inventory from which to take the item ---- destination_inventory: Put item into this inventory ---- destination_list: List name of the destination inventory to which to put the item into ---- condition: Function which takes an itemstack and returns true if it matches the desired item condition. ---- If set to nil, the slot of the first item stack will be taken unconditionally. --- dst_inventory and dst_list can also be nil if condition is nil. -function mcl_util.get_eligible_transfer_item_slot(src_inventory, src_list, dst_inventory, dst_list, condition) - local size = src_inventory:get_size(src_list) +--- Selects item stack to transfer from +---@param src_inventory InvRef Source innentory to pull from +---@param src_list string Name of source inventory list to pull from +---@param dst_inventory InvRef Destination inventory to push to +---@param dst_list string Name of destination inventory list to push to +---@param condition? fun(stack: ItemStack) Condition which items are allowed to be transfered. +---@return integer Item stack number to be transfered +function mcl_util.select_stack(src_inventory, src_list, dst_inventory, dst_list, condition) + local src_size = src_inventory:get_size(src_list) local stack - for i = 1, size do + for i = 1, src_size do stack = src_inventory:get_stack(src_list, i) - if not stack:is_empty() and (condition == nil or condition(stack, src_inventory, src_list, dst_inventory, dst_list)) then + if not stack:is_empty() and dst_inventory:room_for_item(dst_list, stack) and ((condition == nil or condition(stack))) then return i end end return nil end --- Returns true if itemstack is a shulker box -local function is_not_shulker_box(itemstack) - local g = minetest.get_item_group(itemstack:get_name(), "shulker_box") - return g == 0 or g == nil -end - -- Moves a single item from one inventory to another. --- source_inventory: Inventory to take the item from --- source_list: List name of the source inventory from which to take the item @@ -279,13 +270,6 @@ end -- Returns true on success and false on failure -- Possible failures: No item in source slot, destination inventory full function mcl_util.move_item(source_inventory, source_list, source_stack_id, destination_inventory, destination_list) - if source_stack_id == -1 then - source_stack_id = mcl_util.get_first_occupied_inventory_slot(source_inventory, source_list) - if source_stack_id == nil then - return false - end - end - if not source_inventory:is_empty(source_list) then local stack = source_inventory:get_stack(source_list, source_stack_id) if not stack:is_empty() then @@ -303,150 +287,75 @@ function mcl_util.move_item(source_inventory, source_list, source_stack_id, dest return false end --- Moves a single item from one container node into another. Performs a variety of high-level --- checks to prevent invalid transfers such as shulker boxes into shulker boxes ---- source_pos: Position ({x,y,z}) of the node to take the item from ---- destination_pos: Position ({x,y,z}) of the node to put the item into ---- source_list (optional): List name of the source inventory from which to take the item. Default is normally "main"; "dst" for furnace ---- source_stack_id (optional): The inventory position ID of the source inventory to take the item from (-1 for slot of the first valid item; -1 is default) ---- destination_list (optional): List name of the destination inventory. Default is normally "main"; "src" for furnace --- Returns true on success and false on failure. -function mcl_util.move_item_container(source_pos, destination_pos, source_list, source_stack_id, destination_list) - local dpos = table.copy(destination_pos) - local spos = table.copy(source_pos) - local snode = minetest.get_node(spos) - local dnode = minetest.get_node(dpos) +--- Try pushing item from hopper inventory to destination inventory +---@param pos Vector +---@param dst_pos Vector +function mcl_util.hopper_push(pos, dst_pos) + local hop_inv = minetest.get_meta(pos):get_inventory() + local hop_list = 'main' - local dctype = minetest.get_item_group(dnode.name, "container") - local sctype = minetest.get_item_group(snode.name, "container") + -- Get node pos' for item transfer + local dst = minetest.get_node(dst_pos) + if not minetest.registered_nodes[dst.name] then return end + local dst_type = minetest.get_item_group(dst.name, "container") + if dst_type ~= 2 then return end + local dst_def = minetest.registered_nodes[dst.name] - -- Container type 7 does not allow any movement - if sctype == 7 then - return false + local dst_list = 'main' + local dst_inv, stack_id + + if dst_def._mcl_hoppers_on_try_push then + dst_inv, dst_list, stack_id = dst_def._mcl_hoppers_on_try_push(dst_pos, pos, hop_inv, hop_list) + else + local dst_meta = minetest.get_meta(dst_pos) + dst_inv = dst_meta:get_inventory() + stack_id = mcl_util.select_stack(hop_inv, hop_list, dst_inv, dst_list) end - -- Normalize double container by forcing to always use the left segment first - local function normalize_double_container(pos, node, ctype) - if ctype == 6 then - pos = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") - if not pos then - return false - end - node = minetest.get_node(pos) - ctype = minetest.get_item_group(node.name, "container") - -- The left segment seems incorrect? We better bail out! - if ctype ~= 5 then - return false - end + if stack_id ~= nil then + local ok = mcl_util.move_item(hop_inv, hop_list, stack_id, dst_inv, dst_list) + if dst_def._mcl_hoppers_on_after_push then + dst_def._mcl_hoppers_on_after_push(dst_pos) end - return pos, node, ctype - end - - spos, snode, sctype = normalize_double_container(spos, snode, sctype) - dpos, dnode, dctype = normalize_double_container(dpos, dnode, dctype) - if not spos or not dpos then return false end - - local smeta = minetest.get_meta(spos) - local dmeta = minetest.get_meta(dpos) - - local sinv = smeta:get_inventory() - local dinv = dmeta:get_inventory() - - -- Default source lists - if not source_list then - -- Main inventory for most container types - if sctype == 2 or sctype == 3 or sctype == 5 or sctype == 6 or sctype == 7 then - source_list = "main" - -- Furnace: output - elseif sctype == 4 then - source_list = "dst" - -- Unknown source container type. Bail out - else - return false + if ok then + return true end end - -- Automatically select stack slot ID if set to automatic - if not source_stack_id then - source_stack_id = -1 - end - if source_stack_id == -1 then - local cond = nil - -- Prevent shulker box inception - if dctype == 3 then - cond = is_not_shulker_box - end - source_stack_id = mcl_util.get_eligible_transfer_item_slot(sinv, source_list, dinv, dpos, cond) - if not source_stack_id then - -- Try again if source is a double container - if sctype == 5 then - spos = mcl_util.get_double_container_neighbor_pos(spos, snode.param2, "left") - smeta = minetest.get_meta(spos) - sinv = smeta:get_inventory() - - source_stack_id = mcl_util.get_eligible_transfer_item_slot(sinv, source_list, dinv, dpos, cond) - if not source_stack_id then - return false - end - else - return false - end - end - end - - -- Abort transfer if shulker box wants to go into shulker box - if dctype == 3 then - local stack = sinv:get_stack(source_list, source_stack_id) - if stack and minetest.get_item_group(stack:get_name(), "shulker_box") == 1 then - return false - end - end - -- Container type 7 does not allow any placement - if dctype == 7 then - return false - end - - -- If it's a container, put it into the container - if dctype ~= 0 then - -- Automatically select a destination list if omitted - if not destination_list then - -- Main inventory for most container types - if dctype == 2 or dctype == 3 or dctype == 5 or dctype == 6 or dctype == 7 then - destination_list = "main" - -- Furnace source slot - elseif dctype == 4 then - destination_list = "src" - end - end - if destination_list then - -- Move item - local ok = mcl_util.move_item(sinv, source_list, source_stack_id, dinv, destination_list) - - -- Try transfer to neighbor node if transfer failed and double container - if not ok and dctype == 5 then - dpos = mcl_util.get_double_container_neighbor_pos(dpos, dnode.param2, "left") - dmeta = minetest.get_meta(dpos) - dinv = dmeta:get_inventory() - - ok = mcl_util.move_item(sinv, source_list, source_stack_id, dinv, destination_list) - end - - -- Update furnace - if ok and dctype == 4 then - -- Start furnace's timer function, it will sort out whether furnace can burn or not. - minetest.get_node_timer(dpos):start(1.0) - end - - return ok - end - end return false end --- Returns the ID of the first non-empty slot in the given inventory list --- or nil, if inventory is empty. -function mcl_util.get_first_occupied_inventory_slot(inventory, listname) - return mcl_util.get_eligible_transfer_item_slot(inventory, listname) +-- Try pulling from source inventory to hopper inventory +---@param pos Vector +---@param src_pos Vector +function mcl_util.hopper_pull(pos, src_pos) + local hop_inv = minetest.get_meta(pos):get_inventory() + local hop_list = 'main' + + -- Get node pos' for item transfer + local src = minetest.get_node(src_pos) + if not minetest.registered_nodes[src.name] then return end + local src_type = minetest.get_item_group(src.name, "container") + if src_type ~= 2 then return end + local src_def = minetest.registered_nodes[src.name] + + local src_list = 'main' + local src_inv, stack_id + + if src_def._mcl_hoppers_on_try_pull then + src_inv, src_list, stack_id = src_def._mcl_hoppers_on_try_pull(src_pos, pos, hop_inv, hop_list) + else + local src_meta = minetest.get_meta(src_pos) + src_inv = src_meta:get_inventory() + stack_id = mcl_util.select_stack(src_inv, src_list, hop_inv, hop_list) + end + + if stack_id ~= nil then + local ok = mcl_util.move_item(src_inv, src_list, stack_id, hop_inv, hop_list) + if src_def._mcl_hoppers_on_after_pull then + src_def._mcl_hoppers_on_after_pull(src_pos) + end + end end local function drop_item_stack(pos, stack) diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua index 09e221a4d..e47371bc9 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua @@ -125,7 +125,11 @@ local dropperdef = { local dropnode = minetest.get_node(droppos) -- Do not drop into solid nodes, unless they are containers local dropnodedef = minetest.registered_nodes[dropnode.name] - if dropnodedef.walkable and not dropnodedef.groups.container then + if dropnodedef.groups.container == 2 then + -- If they are containers - double down as hopper + mcl_util.hopper_push(pos, droppos) + end + if dropnodedef.walkable then return end local stacks = {} @@ -141,25 +145,18 @@ local dropperdef = { local dropitem = ItemStack(stack) dropitem:set_count(1) local stack_id = stacks[r].stackpos - - -- If it's a container, attempt to put it into the container - local dropped = mcl_util.move_item_container(pos, droppos, nil, stack_id) - -- No container? - if not dropped and not dropnodedef.groups.container then - -- Drop item normally - local pos_variation = 100 - droppos = vector.offset(droppos, - math.random(-pos_variation, pos_variation) / 1000, - math.random(-pos_variation, pos_variation) / 1000, - math.random(-pos_variation, pos_variation) / 1000 - ) - local item_entity = minetest.add_item(droppos, dropitem) - local drop_vel = vector.subtract(droppos, pos) - local speed = 3 - item_entity:set_velocity(vector.multiply(drop_vel, speed)) - stack:take_item() - inv:set_stack("main", stack_id, stack) - end + local pos_variation = 100 + droppos = vector.offset(droppos, + math.random(-pos_variation, pos_variation) / 1000, + math.random(-pos_variation, pos_variation) / 1000, + math.random(-pos_variation, pos_variation) / 1000 + ) + local item_entity = minetest.add_item(droppos, dropitem) + local drop_vel = vector.subtract(droppos, pos) + local speed = 3 + item_entity:set_velocity(vector.multiply(drop_vel, speed)) + stack:take_item() + inv:set_stack("main", stack_id, stack) end end, rules = mesecon.rules.alldirs, diff --git a/mods/ITEMS/mcl_blast_furnace/init.lua b/mods/ITEMS/mcl_blast_furnace/init.lua index 51a8f193a..7d0f091d9 100644 --- a/mods/ITEMS/mcl_blast_furnace/init.lua +++ b/mods/ITEMS/mcl_blast_furnace/init.lua @@ -453,7 +453,7 @@ minetest.register_node("mcl_blast_furnace:blast_furnace", { "blast_furnace_side.png", "blast_furnace_front.png" }, paramtype2 = "facedir", - groups = { pickaxey = 1, container = 4, deco_block = 1, material_stone = 1 }, + groups = { pickaxey = 1, container = 2, deco_block = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), @@ -514,6 +514,11 @@ minetest.register_node("mcl_blast_furnace:blast_furnace", { _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, on_rotate = on_rotate, + _mcl_hoppers_on_try_pull = mcl_furnaces.hoppers_on_try_pull, + _mcl_hoppers_on_try_push = mcl_furnaces.hoppers_on_try_push, + _mcl_hoppers_on_after_push = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, }) minetest.register_node("mcl_blast_furnace:blast_furnace_active", { @@ -531,7 +536,7 @@ minetest.register_node("mcl_blast_furnace:blast_furnace_active", { paramtype = "light", light_source = LIGHT_ACTIVE_FURNACE, drop = "mcl_blast_furnace:blast_furnace", - groups = { pickaxey = 1, container = 4, deco_block = 1, not_in_creative_inventory = 1, material_stone = 1 }, + groups = { pickaxey = 1, container = 2, deco_block = 1, not_in_creative_inventory = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), on_timer = blast_furnace_node_timer, @@ -574,6 +579,8 @@ minetest.register_node("mcl_blast_furnace:blast_furnace_active", { _mcl_hardness = 3.5, on_rotate = on_rotate, after_rotate = after_rotate_active, + _mcl_hoppers_on_try_pull = mcl_furnaces.hoppers_on_try_pull, + _mcl_hoppers_on_try_push = mcl_furnaces.hoppers_on_try_push, }) minetest.register_craft({ diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index e2f391b17..25d93b854 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -438,7 +438,7 @@ minetest.register_node("mcl_books:bookshelf", { flammable = 3, fire_encouragement = 30, fire_flammability = 20, - container = 1 + container = 2 }, drop = "mcl_books:book 3", sounds = wood_sound, @@ -472,6 +472,12 @@ minetest.register_node("mcl_books:bookshelf", { on_blast = on_blast, on_rightclick = bookshelf_gui, on_destruct = close_forms, + _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv, "main", mcl_util.select_stack(hop_inv, hop_list, inv, "main", + function(stack) return minetest.get_item_group(stack:get_name(), "book") == 1 or stack:get_name() == "mcl_enchanting:book_enchanted" end) + end, }) minetest.register_craft({ diff --git a/mods/ITEMS/mcl_brewing/init.lua b/mods/ITEMS/mcl_brewing/init.lua index 9c6879430..cb5374d81 100644 --- a/mods/ITEMS/mcl_brewing/init.lua +++ b/mods/ITEMS/mcl_brewing/init.lua @@ -376,13 +376,41 @@ local function allow_take(pos, listname, index, stack, player) end end +local function hoppers_on_try_push(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if math.abs(pos.y - hop_pos.y) > math.abs(pos.x - hop_pos.x) and math.abs(pos.y - hop_pos.y) > math.abs(pos.z - hop_pos.z) then + return inv, "input", mcl_util.select_stack(hop_inv, hop_list, inv, "input", + function(stack) return minetest.get_item_group(stack:get_name(), "brewitem") == 1 and minetest.get_item_group(stack:get_name(), "bottle") == 0 end) + else + local stack = mcl_util.select_stack(hop_inv, hop_list, inv, "fuel", function(stack) return stack:get_name() == "mcl_mobitems:blaze_powder" end) + if stack then + return inv, "fuel", stack + else + return inv, "stand", mcl_util.select_stack(hop_inv, hop_list, inv, "stand", + function(stack) return minetest.get_item_group(stack:get_name(), "bottle") == 1 end) + end + end +end + +local function hoppers_on_try_pull(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local stand_timer = meta:get_float("stand_timer") or 0 + if stand_timer > 0 then + return nil, nil, nil + end + + local inv = meta:get_inventory() + local stack = mcl_util.select_stack(inv, "stand", hop_inv, hop_list) + return inv, "stand", stack +end minetest.register_node("mcl_brewing:stand_000", { description = S("Brewing Stand"), _doc_items_longdesc = S("The stand allows you to brew potions!"), _doc_items_usagehelp = doc_string, _tt_help = S("Brew Potions"), - groups = {pickaxey=1, brewitem=1 }, + groups = {pickaxey=1, container = 2, brewitem=1 }, tiles = tiles, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, drop = "mcl_brewing:stand", @@ -444,12 +472,20 @@ minetest.register_node("mcl_brewing:stand_000", { on_timer = brewing_stand_timer, on_rotate = on_rotate, + _mcl_hoppers_on_try_push = hoppers_on_try_push, + _mcl_hoppers_on_try_pull = hoppers_on_try_pull, + _mcl_hoppers_on_after_push = function(pos) + on_put(pos, nil, nil, nil, nil) + end, + _mcl_hoppers_on_after_pull = function(pos) + on_put(pos, nil, nil, nil, nil) + end, }) minetest.register_node("mcl_brewing:stand_100", { description = S("Brewing Stand"), _doc_items_create_entry = false, _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + groups = { pickaxey=1, container = 2, not_in_creative_inventory = 1, not_in_craft_guide = 1 }, tiles = tiles, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, drop = "mcl_brewing:stand", @@ -514,13 +550,21 @@ minetest.register_node("mcl_brewing:stand_100", { end, on_timer = brewing_stand_timer, on_rotate = on_rotate, + _mcl_hoppers_on_try_push = hoppers_on_try_push, + _mcl_hoppers_on_try_pull = hoppers_on_try_pull, + _mcl_hoppers_on_after_push = function(pos) + on_put(pos, nil, nil, nil, nil) + end, + _mcl_hoppers_on_after_pull = function(pos) + on_put(pos, nil, nil, nil, nil) + end, }) minetest.register_node("mcl_brewing:stand_010", { description = S("Brewing Stand"), _doc_items_create_entry = false, _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + groups = {pickaxey=1, container = 2, not_in_creative_inventory = 1, not_in_craft_guide = 1}, tiles = tiles, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, drop = "mcl_brewing:stand", @@ -586,13 +630,21 @@ minetest.register_node("mcl_brewing:stand_010", { end, on_timer = brewing_stand_timer, on_rotate = on_rotate, + _mcl_hoppers_on_try_push = hoppers_on_try_push, + _mcl_hoppers_on_try_pull = hoppers_on_try_pull, + _mcl_hoppers_on_after_push = function(pos) + on_put(pos, nil, nil, nil, nil) + end, + _mcl_hoppers_on_after_pull = function(pos) + on_put(pos, nil, nil, nil, nil) + end, }) minetest.register_node("mcl_brewing:stand_001", { description = S("Brewing Stand"), _doc_items_create_entry = false, _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + groups = {pickaxey=1, container = 2, not_in_creative_inventory = 1, not_in_craft_guide = 1}, tiles = tiles, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, drop = "mcl_brewing:stand", @@ -653,13 +705,21 @@ minetest.register_node("mcl_brewing:stand_001", { end, on_timer = brewing_stand_timer, on_rotate = on_rotate, + _mcl_hoppers_on_try_push = hoppers_on_try_push, + _mcl_hoppers_on_try_pull = hoppers_on_try_pull, + _mcl_hoppers_on_after_push = function(pos) + on_put(pos, nil, nil, nil, nil) + end, + _mcl_hoppers_on_after_pull = function(pos) + on_put(pos, nil, nil, nil, nil) + end, }) minetest.register_node("mcl_brewing:stand_110", { description = S("Brewing Stand"), _doc_items_create_entry = false, _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + groups = {pickaxey=1, container = 2, not_in_creative_inventory = 1, not_in_craft_guide = 1}, tiles = tiles, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, drop = "mcl_brewing:stand", @@ -730,13 +790,21 @@ minetest.register_node("mcl_brewing:stand_110", { end, on_timer = brewing_stand_timer, on_rotate = on_rotate, + _mcl_hoppers_on_try_push = hoppers_on_try_push, + _mcl_hoppers_on_try_pull = hoppers_on_try_pull, + _mcl_hoppers_on_after_push = function(pos) + on_put(pos, nil, nil, nil, nil) + end, + _mcl_hoppers_on_after_pull = function(pos) + on_put(pos, nil, nil, nil, nil) + end, }) minetest.register_node("mcl_brewing:stand_101", { description = S("Brewing Stand"), _doc_items_create_entry = false, _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + groups = {pickaxey=1, container = 2, not_in_creative_inventory = 1, not_in_craft_guide = 1}, tiles = tiles, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, drop = "mcl_brewing:stand", @@ -803,13 +871,21 @@ minetest.register_node("mcl_brewing:stand_101", { end, on_timer = brewing_stand_timer, on_rotate = on_rotate, + _mcl_hoppers_on_try_push = hoppers_on_try_push, + _mcl_hoppers_on_try_pull = hoppers_on_try_pull, + _mcl_hoppers_on_after_push = function(pos) + on_put(pos, nil, nil, nil, nil) + end, + _mcl_hoppers_on_after_pull = function(pos) + on_put(pos, nil, nil, nil, nil) + end, }) minetest.register_node("mcl_brewing:stand_011", { description = S("Brewing Stand"), _doc_items_create_entry = false, _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + groups = {pickaxey=1, container = 2, not_in_creative_inventory = 1, not_in_craft_guide = 1}, tiles = tiles, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, drop = "mcl_brewing:stand", @@ -876,13 +952,21 @@ minetest.register_node("mcl_brewing:stand_011", { end, on_timer = brewing_stand_timer, on_rotate = on_rotate, + _mcl_hoppers_on_try_push = hoppers_on_try_push, + _mcl_hoppers_on_try_pull = hoppers_on_try_pull, + _mcl_hoppers_on_after_push = function(pos) + on_put(pos, nil, nil, nil, nil) + end, + _mcl_hoppers_on_after_pull = function(pos) + on_put(pos, nil, nil, nil, nil) + end, }) minetest.register_node("mcl_brewing:stand_111", { description = S("Brewing Stand"), _doc_items_create_entry = false, _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + groups = {pickaxey=1, container = 2, not_in_creative_inventory = 1, not_in_craft_guide = 1}, tiles = tiles, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, drop = "mcl_brewing:stand", @@ -956,6 +1040,14 @@ minetest.register_node("mcl_brewing:stand_111", { end, on_timer = brewing_stand_timer, on_rotate = on_rotate, + _mcl_hoppers_on_try_push = hoppers_on_try_push, + _mcl_hoppers_on_try_pull = hoppers_on_try_pull, + _mcl_hoppers_on_after_push = function(pos) + on_put(pos, nil, nil, nil, nil) + end, + _mcl_hoppers_on_after_pull = function(pos) + on_put(pos, nil, nil, nil, nil) + end, }) minetest.register_craft({ diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 6f3272149..38b1102a3 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -10,6 +10,8 @@ local sf = string.format local mod_doc = minetest.get_modpath("doc") +mcl_chests = {} + -- Christmas chest setup local it_is_christmas = false local date = os.date("*t") @@ -596,7 +598,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile groups = { handy = 1, axey = 1, - container = 5, + container = 2, not_in_creative_inventory = 1, material_wood = 1, flammable = -1, @@ -751,6 +753,34 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile end, mesecons = mesecons, on_rotate = no_rotate, + _mcl_hoppers_on_try_pull = function(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack_id = mcl_util.select_stack(inv, "main", hop_inv, hop_list) + if stack_id ~= nil then + return inv, "main", stack_id + end + local node = minetest.get_node(pos) + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") + local meta_other = minetest.get_meta(pos_other) + local inv_other = meta_other:get_inventory() + stack_id = mcl_util.select_stack(inv_other, "main", hop_inv, hop_list) + return inv_other, "main", stack_id + end, + _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack_id = mcl_util.select_stack(hop_inv, hop_list, inv, "main") + if stack_id ~= nil then + return inv, "main", stack_id + end + local node = minetest.get_node(pos) + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") + local meta_other = minetest.get_meta(pos_other) + local inv_other = meta_other:get_inventory() + stack_id = mcl_util.select_stack(hop_inv, hop_list, inv_other, "main") + return inv_other, "main", stack_id + end, }) minetest.register_node("mcl_chests:" .. basename .. "_right", { @@ -766,7 +796,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile groups = { handy = 1, axey = 1, - container = 6, + container = 2, not_in_creative_inventory = 1, material_wood = 1, flammable = -1, @@ -916,6 +946,34 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile end, mesecons = mesecons, on_rotate = no_rotate, + _mcl_hoppers_on_try_pull = function(pos, hop_pos, hop_inv, hop_list) + local node = minetest.get_node(pos) + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") + local meta_other = minetest.get_meta(pos_other) + local inv_other = meta_other:get_inventory() + local stack_id = mcl_util.select_stack(inv_other, "main", hop_inv, hop_list) + if stack_id ~= nil then + return inv_other, "main", stack_id + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + stack_id = mcl_util.select_stack(inv, "main", hop_inv, hop_list) + return inv, "main", stack_id + end, + _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) + local node = minetest.get_node(pos) + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") + local meta_other = minetest.get_meta(pos_other) + local inv_other = meta_other:get_inventory() + local stack_id = mcl_util.select_stack(hop_inv, hop_list, inv_other, "main") + if stack_id ~= nil then + return inv_other, "main", stack_id + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + stack_id = mcl_util.select_stack(hop_inv, hop_list, inv, "main") + return inv, "main", stack_id + end, }) if mod_doc then @@ -1305,7 +1363,7 @@ for color, desc in pairs(boxtypes) do groups = { handy = 1, pickaxey = 1, - container = 3, + container = 2, deco_block = 1, dig_by_piston = 1, shulker_box = 1, @@ -1378,7 +1436,7 @@ for color, desc in pairs(boxtypes) do groups = { handy = 1, pickaxey = 1, - container = 3, + container = 2, deco_block = 1, dig_by_piston = 1, shulker_box = 1, @@ -1471,6 +1529,11 @@ for color, desc in pairs(boxtypes) do end, _mcl_blast_resistance = 6, _mcl_hardness = 2, + _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv, "main", mcl_util.select_stack(hop_inv, hop_list, inv, "main", mcl_chests.is_not_shulker_box) + end, }) if mod_doc and not is_canonical then @@ -1487,6 +1550,14 @@ for color, desc in pairs(boxtypes) do }) end +--- Returns false if itemstack is a shulker box +---@param itemstack ItemStack +---@return boolean +function mcl_chests.is_not_shulker_box(stack) + local g = minetest.get_item_group(stack:get_name(), "shulker_box") + return g == 0 or g == nil +end + minetest.register_craft({ output = "mcl_chests:violet_shulker_box", recipe = { diff --git a/mods/ITEMS/mcl_composters/init.lua b/mods/ITEMS/mcl_composters/init.lua index d60422afd..5a67ef92b 100644 --- a/mods/ITEMS/mcl_composters/init.lua +++ b/mods/ITEMS/mcl_composters/init.lua @@ -81,34 +81,44 @@ local function composter_add_item(pos, node, player, itemstack, pointed_thing) max_hear_distance = 16, }, true) end - -- calculate leveling up chance - local rand = math.random(0,100) - if chance >= rand then - -- get current compost level - local level = registered_nodes[node.name]["_mcl_compost_level"] - -- spawn green particles above new layer - mcl_dye.add_bone_meal_particle(vector_offset(pos, 0, level/8, 0)) - -- update composter block - if level < 7 then - level = level + 1 - else - level = "ready" - end - swap_node(pos, {name = "mcl_composters:composter_" .. level}) - minetest.sound_play({name="default_grass_footstep", gain=0.4}, { - pos = pos, - gain= 0.4, - max_hear_distance = 16, - }, true) - -- a full composter becomes ready for harvest after one second - -- the block will get updated by the node timer callback set in node reg def - if level == 7 then - local timer = get_node_timer(pos) + composter_progress_chance(pos, node, chance) + end + return itemstack +end + +--- Math and node swap during compost progression +---@param pos Vector Position of the node +---@param node node +---@param chance integer Value of "compostability" group of inserted item +function composter_progress_chance(pos, node, chance) + -- calculate leveling up chance + local rand = math.random(0,100) + if chance >= rand then + -- get current compost level + local level = registered_nodes[node.name]["_mcl_compost_level"] + -- spawn green particles above new layer + mcl_dye.add_bone_meal_particle(vector_offset(pos, 0, level/8, 0)) + -- update composter block + if level < 7 then + level = level + 1 + else + level = "ready" + end + swap_node(pos, {name = "mcl_composters:composter_" .. level}) + minetest.sound_play({name="default_grass_footstep", gain=0.4}, { + pos = pos, + gain= 0.4, + max_hear_distance = 16, + }, true) + -- a full composter becomes ready for harvest after one second + -- the block will get updated by the node timer callback set in node reg def + if level == 7 then + local timer = get_node_timer(pos) + if not timer:is_started() then timer:start(1) end end end - return itemstack end --- Update a full composter block to ready for harvesting. @@ -147,6 +157,10 @@ local function composter_harvest(pos, node, player, itemstack, pointed_thing) record_protection_violation(pos, name) return itemstack end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + --remove bone meal from internal inventory + inv:set_stack("dst", 1, ItemStack()) -- reset ready type composter to empty type swap_node(pos, {name="mcl_composters:composter"}) -- spawn bone meal item @@ -175,6 +189,14 @@ local function composter_get_nodeboxes(level) } end +local function hopper_push_condition(stack) + local chance = get_item_group(stack:get_name(), "compostability") + if chance > 0 then + return true + end + return false +end + --- Register empty composter node. -- -- This is the craftable base model that can be placed in an inventory. @@ -197,12 +219,40 @@ minetest.register_node("mcl_composters:composter", { groups = { handy=1, material_wood=1, deco_block=1, dirtifier=1, flammable=2, fire_encouragement=3, fire_flammability=4, + container = 2 }, sounds = mcl_sounds.node_sound_wood_defaults(), _mcl_hardness = 0.6, _mcl_blast_resistance = 0.6, _mcl_compost_level = 0, - on_rightclick = composter_add_item + on_rightclick = composter_add_item, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("src", 1) + inv:set_size("dst", 1) + end, + _mcl_hoppers_on_try_pull = function(pos, hop_pos, hop_inv, hop_list) + return nil, nil, nil + end, + _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src", hopper_push_condition) + end, + _mcl_hoppers_on_after_push = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack("src", 1) + if not stack:is_empty() then + local chance = get_item_group(stack:get_name(), "compostability") + if chance > 0 then + local node = minetest.get_node(pos) + composter_progress_chance(pos, node, chance) + end + end + inv:remove_item("src", stack) + end, }) --- Template function for composters with compost. @@ -228,7 +278,7 @@ local function register_filled_composter(level) handy=1, material_wood=1, deco_block=1, dirtifier=1, not_in_creative_inventory=1, not_in_craft_guide=1, flammable=2, fire_encouragement=3, fire_flammability=4, - comparator_signal=level + comparator_signal=level, container = 2 }, sounds = mcl_sounds.node_sound_wood_defaults(), drop = "mcl_composters:composter", @@ -236,7 +286,28 @@ local function register_filled_composter(level) _mcl_blast_resistance = 0.6, _mcl_compost_level = level, on_rightclick = composter_add_item, - on_timer = composter_ready + on_timer = composter_ready, + _mcl_hoppers_on_try_pull = function(pos, hop_pos, hop_inv, hop_list) + return nil, nil, nil + end, + _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src", hopper_push_condition) + end, + _mcl_hoppers_on_after_push = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack("src", 1) + if not stack:is_empty() then + local chance = get_item_group(stack:get_name(), "compostability") + if chance > 0 then + local node = minetest.get_node(pos) + composter_progress_chance(pos, node, chance) + end + end + inv:remove_item("src", stack) + end, }) -- Add entry aliases for the Help @@ -270,14 +341,32 @@ minetest.register_node("mcl_composters:composter_ready", { handy=1, material_wood=1, deco_block=1, dirtifier=1, not_in_creative_inventory=1, not_in_craft_guide=1, flammable=2, fire_encouragement=3, fire_flammability=4, - comparator_signal=8 + comparator_signal=8, container = 2 }, sounds = mcl_sounds.node_sound_wood_defaults(), drop = "mcl_composters:composter", _mcl_hardness = 0.6, _mcl_blast_resistance = 0.6, _mcl_compost_level = 7, - on_rightclick = composter_harvest + on_rightclick = composter_harvest, + _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) + return nil, nil, nil + end, + _mcl_hoppers_on_try_pull = function(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + --remove bone meal from internal inventory + inv:set_stack("dst", 1, ItemStack()) + inv:add_item("dst", "mcl_bone_meal:bone_meal") + local stack = inv:get_stack("dst", 1) + if not stack:is_empty() and hop_inv:room_for_item(hop_list, stack) then + return inv, "dst", 1 + end + return nil, nil, nil + end, + _mcl_hoppers_on_after_pull = function(pos) + minetest.swap_node(pos, {name = "mcl_composters:composter"}) + end, }) -- Add entry aliases for the Help diff --git a/mods/ITEMS/mcl_composters/mod.conf b/mods/ITEMS/mcl_composters/mod.conf index 86d729887..ed6119d3a 100644 --- a/mods/ITEMS/mcl_composters/mod.conf +++ b/mods/ITEMS/mcl_composters/mod.conf @@ -1,5 +1,5 @@ name = mcl_composters author = kabou description = Composters can convert various organic items into bonemeal. -depends = mcl_core, mcl_sounds, mcl_dye +depends = mcl_core, mcl_sounds, mcl_dye, mcl_hoppers optional_depends = doc diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index 9cb8ffb16..74e2efecb 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -4,6 +4,8 @@ local F = minetest.formspec_escape local LIGHT_ACTIVE_FURNACE = 13 +mcl_furnaces = {} + -- -- Formspecs -- @@ -445,6 +447,31 @@ local function furnace_node_timer(pos, elapsed) return result end +function mcl_furnaces.hoppers_on_try_pull(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack("dst", 1) + if not stack:is_empty() and hop_inv:room_for_item(hop_list, stack) then + return inv, "dst", 1 + end + -- Allow empty bucket extraction + stack = inv:get_stack("fuel", 1) + if not stack:is_empty() and not mcl_util.is_fuel(stack) and hop_inv:room_for_item(hop_list, stack) then + return inv, "fuel", 1 + end + return nil, nil, nil +end + +function mcl_furnaces.hoppers_on_try_push(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if math.abs(pos.y - hop_pos.y) > math.abs(pos.x - hop_pos.x) and math.abs(pos.y - hop_pos.y) > math.abs(pos.z - hop_pos.z) then + return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src") + else + return inv, "fuel", mcl_util.select_stack(hop_inv, hop_list, inv, "fuel", mcl_util.is_fuel) + end +end + local on_rotate, after_rotate_active if minetest.get_modpath("screwdriver") then on_rotate = screwdriver.rotate_simple @@ -475,7 +502,7 @@ minetest.register_node("mcl_furnaces:furnace", { "default_furnace_side.png", "default_furnace_front.png" }, paramtype2 = "facedir", - groups = { pickaxey = 1, container = 4, deco_block = 1, material_stone = 1 }, + groups = { pickaxey = 1, container = 2, deco_block = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), @@ -538,6 +565,11 @@ minetest.register_node("mcl_furnaces:furnace", { _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, on_rotate = on_rotate, + _mcl_hoppers_on_try_pull = mcl_furnaces.hoppers_on_try_pull, + _mcl_hoppers_on_try_push = mcl_furnaces.hoppers_on_try_push, + _mcl_hoppers_on_after_push = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, }) minetest.register_node("mcl_furnaces:furnace_active", { @@ -552,7 +584,7 @@ minetest.register_node("mcl_furnaces:furnace_active", { paramtype = "light", light_source = LIGHT_ACTIVE_FURNACE, drop = "mcl_furnaces:furnace", - groups = { pickaxey = 1, container = 4, deco_block = 1, not_in_creative_inventory = 1, material_stone = 1 }, + groups = { pickaxey = 1, container = 2, deco_block = 1, not_in_creative_inventory = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), on_timer = furnace_node_timer, @@ -592,6 +624,8 @@ minetest.register_node("mcl_furnaces:furnace_active", { _mcl_hardness = 3.5, on_rotate = on_rotate, after_rotate = after_rotate_active, + _mcl_hoppers_on_try_pull = mcl_furnaces.hoppers_on_try_pull, + _mcl_hoppers_on_try_push = mcl_furnaces.hoppers_on_try_push, }) minetest.register_craft({ diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index b4378b21b..23a511ce5 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -470,31 +470,38 @@ minetest.register_abm({ if entity and entity.name then --mcl_log("Name of object near: " .. tostring(entity.name)) - if entity.name == "mcl_minecarts:hopper_minecart" or entity.name == "mcl_minecarts:chest_minecart" then + if entity.name == "mcl_minecarts:hopper_minecart" or entity.name == "mcl_minecarts:chest_minecart" or entity.name == "mcl_boats:chest_boat" then local hm_pos = entity.object:get_pos() mcl_log("We have a minecart with inventory close: " .. minetest.pos_to_string(hm_pos)) - --if hm_pos.y == pos.y + 1 then mcl_log("y is correct") end + local ent_pos_y + if entity.name == "mcl_minecarts:hopper_minecart" or entity.name == "mcl_minecarts:chest_minecart" then + ent_pos_y = hm_pos.y + elseif entity.name == "mcl_boats:chest_boat" then + ent_pos_y = math.floor(hm_pos.y + 0.8) + end + + local DIST_FROM_MC = 1.5 + --if ent_pos_y == pos.y - 1 then mcl_log("y is correct") end --if (hm_pos.x >= pos.x - DIST_FROM_MC and hm_pos.x <= pos.x + DIST_FROM_MC) then mcl_log("x is within range") end --if (hm_pos.z >= pos.z - DIST_FROM_MC and hm_pos.z <= pos.z + DIST_FROM_MC) then mcl_log("z is within range") end - local DIST_FROM_MC = 1.5 - if (hm_pos.y == pos.y + 1) + if (ent_pos_y == pos.y + 1) and (hm_pos.x >= pos.x - DIST_FROM_MC and hm_pos.x <= pos.x + DIST_FROM_MC) and (hm_pos.z >= pos.z - DIST_FROM_MC and hm_pos.z <= pos.z + DIST_FROM_MC) then mcl_log("Minecart close enough") if entity.name == "mcl_minecarts:hopper_minecart" then hopper_pull_from_mc(entity, pos, 5) - elseif entity.name == "mcl_minecarts:chest_minecart" then + elseif entity.name == "mcl_minecarts:chest_minecart" or entity.name == "mcl_boats:chest_boat" then hopper_pull_from_mc(entity, pos, 27) end - elseif (hm_pos.y == pos.y - 1) + elseif (ent_pos_y == pos.y - 1) and (hm_pos.x >= pos.x - DIST_FROM_MC and hm_pos.x <= pos.x + DIST_FROM_MC) and (hm_pos.z >= pos.z - DIST_FROM_MC and hm_pos.z <= pos.z + DIST_FROM_MC) then mcl_log("Minecart close enough") if entity.name == "mcl_minecarts:hopper_minecart" then hopper_push_to_mc(entity, pos, 5) - elseif entity.name == "mcl_minecarts:chest_minecart" then + elseif entity.name == "mcl_minecarts:chest_minecart" or entity.name == "mcl_boats:chest_boat" then hopper_push_to_mc(entity, pos, 27) end end @@ -545,25 +552,7 @@ minetest.register_abm({ end, }) ----Returns true if itemstack is fuel, but not for lava bucket if destination already has one ----@param itemstack ItemStack ----@param src_inventory InvRef ----@param src_list string ----@param dst_inventory InvRef ----@param dst_list string ----@return boolean -local function is_transferrable_fuel(itemstack, src_inventory, src_list, dst_inventory, dst_list) - if mcl_util.is_fuel(itemstack) then - if itemstack:get_name() == "mcl_buckets:bucket_lava" then - return dst_inventory:is_empty(dst_list) - else - return true - end - else - return false - end -end - +-- Register push/pull for "straight" hopper minetest.register_abm({ label = "Hopper/container item exchange", nodenames = { "mcl_hoppers:hopper" }, @@ -571,31 +560,26 @@ minetest.register_abm({ interval = 1.0, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) - -- Get node pos' for item transfer - local uppos = vector.offset(pos, 0, 1, 0) - local downpos = vector.offset(pos, 0, -1, 0) - - -- Suck an item from the container above into the hopper - local upnode = minetest.get_node(uppos) - if not minetest.registered_nodes[upnode.name] then return end - local g = minetest.get_item_group(upnode.name, "container") - local sucked = mcl_util.move_item_container(uppos, pos) - - -- Also suck in non-fuel items from furnace fuel slot - if not sucked and g == 4 then - local finv = minetest.get_inventory({type = "node", pos = uppos}) - if finv and not mcl_util.is_fuel(finv:get_stack("fuel", 1)) then - mcl_util.move_item_container(uppos, pos, "fuel") - end + if minetest.get_node_timer(pos):is_started() then + return end - -- Move an item from the hopper into container below - local downnode = minetest.get_node(downpos) - if not minetest.registered_nodes[downnode.name] then return end - mcl_util.move_item_container(pos, downpos) + -- Move from internal inventory to dst first + local dst_pos = vector.offset(pos, 0, -1, 0) + local pushed = mcl_util.hopper_push(pos, dst_pos) + + local src_pos = vector.offset(pos, 0, 1, 0) + mcl_util.hopper_pull(pos, src_pos) + + local dst_node = minetest.get_node(dst_pos) + if pushed and (dst_node.name == "mcl_hoppers:hopper" or dst_node.name == "mcl_hoppers:hopper_side") then + --Pause destination hopper + minetest.get_node_timer(dst_pos):start(1.0) + end end, }) +-- Register push/pull for "bent" hopper minetest.register_abm({ label = "Side-hopper/container item exchange", nodenames = { "mcl_hoppers:hopper_side" }, @@ -603,164 +587,36 @@ minetest.register_abm({ interval = 1.0, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) + if minetest.get_node_timer(pos):is_started() then + --Pause if already recived item this tick + return + end + -- Determine to which side the hopper is facing, get nodes local face = minetest.get_node(pos).param2 - local front = {} + local dst_pos = {} if face == 0 then - front = vector.offset(pos, -1, 0, 0) + dst_pos = vector.offset(pos, -1, 0, 0) elseif face == 1 then - front = vector.offset(pos, 0, 0, 1) + dst_pos = vector.offset(pos, 0, 0, 1) elseif face == 2 then - front = vector.offset(pos, 1, 0, 0) + dst_pos = vector.offset(pos, 1, 0, 0) elseif face == 3 then - front = vector.offset(pos, 0, 0, -1) + dst_pos = vector.offset(pos, 0, 0, -1) end - local above = vector.offset(pos, 0, 1, 0) - - local frontnode = minetest.get_node(front) - if not minetest.registered_nodes[frontnode.name] then return end - - -- Suck an item from the container above into the hopper - local abovenode = minetest.get_node(above) - if not minetest.registered_nodes[abovenode.name] then return end - local g = minetest.get_item_group(abovenode.name, "container") - local sucked = mcl_util.move_item_container(above, pos) - - -- Also suck in non-fuel items from furnace fuel slot - if not sucked and g == 4 then - local finv = minetest.get_inventory({type = "node", pos = above}) - if finv and not mcl_util.is_fuel(finv:get_stack("fuel", 1)) then - mcl_util.move_item_container(above, pos, "fuel") - end + local pushed = mcl_util.hopper_push(pos, dst_pos) + + local src_pos = vector.offset(pos, 0, 1, 0) + mcl_util.hopper_pull(pos, src_pos) + + local dst_node = minetest.get_node(dst_pos) + if pushed and (dst_node.name == "mcl_hoppers:hopper" or dst_node.name == "mcl_hoppers:hopper_side") then + --Pause destination hopper + minetest.get_node_timer(dst_pos):start(1.0) end - - -- Move an item from the hopper into the container to which the hopper points to - local g = minetest.get_item_group(frontnode.name, "container") - if g == 2 or g == 3 or g == 5 or g == 6 then - mcl_util.move_item_container(pos, front) - elseif g == 4 then - -- Put fuel into fuel slot - local sinv = minetest.get_inventory({type = "node", pos = pos}) - local dinv = minetest.get_inventory({type = "node", pos = front}) - local slot_id, _ = mcl_util.get_eligible_transfer_item_slot(sinv, "main", dinv, "fuel", is_transferrable_fuel) - if slot_id then - mcl_util.move_item_container(pos, front, nil, slot_id, "fuel") - end - end - end + end, }) -if minetest.get_modpath("mcl_composters") then - minetest.register_abm({ - label = "Bonemeal extraction from composter", - nodenames = {"mcl_hoppers:hopper", "mcl_hoppers:hopper_side"}, - neighbors = {"mcl_composters:composter_ready"}, - interval = 1.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local uppos = vector.offset(pos, 0, 1, 0) - --local downpos = vector.offset(pos, 0, -1, 0) - - -- Get bonemeal from composter above - local upnode = minetest.get_node(uppos) - if upnode.name == "mcl_composters:composter_ready" then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - - minetest.swap_node(uppos, {name = "mcl_composters:composter"}) - - inv:add_item("main", "mcl_bone_meal:bone_meal") - end - end, - }) - - ---@param node node - ---@return integer? - ---@nodiscard - local function composter_level(node) - local nn = node.name - if nn == "mcl_composters:composter" then - return 0 - elseif nn == "mcl_composters:composter_1" then - return 1 - elseif nn == "mcl_composters:composter_2" then - return 2 - elseif nn == "mcl_composters:composter_3" then - return 3 - elseif nn == "mcl_composters:composter_4" then - return 4 - elseif nn == "mcl_composters:composter_5" then - return 5 - elseif nn == "mcl_composters:composter_6" then - return 6 - elseif nn == "mcl_composters:composter_7" then - return 7 - else - return nil - end - end - - for i = 1, 7 do - assert(composter_level({name = "mcl_composters:composter_" .. i}) == i) - end - - assert(composter_level({name = "mcl_composters:composter"}) == 0) - assert(composter_level({name = "mcl_composters:some_other_node"}) == nil) - - minetest.register_abm({ - label = "Add compostable items on composter", - nodenames = {"mcl_hoppers:hopper"}, - neighbors = { - "mcl_composters:composter", - "mcl_composters:composter_1", - "mcl_composters:composter_2", - "mcl_composters:composter_3", - "mcl_composters:composter_4", - "mcl_composters:composter_5", - "mcl_composters:composter_6", - "mcl_composters:composter_7", - }, - interval = 1.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - --local uppos = vector.offset(pos, 0, 1, 0) - local downpos = vector.offset(pos, 0, -1, 0) - - local downnode = minetest.get_node(downpos) - - ---@type integer|string|nil - local level = composter_level(downnode) - - --Consume compostable items and update composter below - if level then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - - for i = 1, 5 do - local stack = inv:get_stack("main", i) - local compchance = minetest.get_item_group(stack:get_name(), "compostability") - - if compchance > 0 then - stack:take_item() - inv:set_stack("main", i, stack) - - if compchance >= math.random(0, 100) then - mcl_dye.add_bone_meal_particle(vector.offset(downpos, 0, level / 8, 0)) - if level < 7 then - level = level + 1 - else - level = "ready" - end - minetest.swap_node(downpos, {name = "mcl_composters:composter_" .. level}) - end - break - end - end - end - end, - }) -end - minetest.register_craft({ output = "mcl_hoppers:hopper", recipe = { diff --git a/mods/ITEMS/mcl_itemframes/item_frames_API.lua b/mods/ITEMS/mcl_itemframes/item_frames_API.lua index 999becf05..dbdaa313d 100644 --- a/mods/ITEMS/mcl_itemframes/item_frames_API.lua +++ b/mods/ITEMS/mcl_itemframes/item_frames_API.lua @@ -638,7 +638,7 @@ function mcl_itemframes.create_base_definitions() paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, - groups = { dig_immediate = 3, deco_block = 1, dig_by_piston = 1, container = 7, }, -- attached_node_facedir = 1 }, -- allows for more placement options. + groups = { dig_immediate = 3, deco_block = 1, dig_by_piston = 1, container = 1, }, -- attached_node_facedir = 1 }, -- allows for more placement options. sounds = mcl_sounds.node_sound_defaults(), node_placement_prediction = "", diff --git a/mods/ITEMS/mcl_jukebox/init.lua b/mods/ITEMS/mcl_jukebox/init.lua index d817bdac7..e64bc52c7 100644 --- a/mods/ITEMS/mcl_jukebox/init.lua +++ b/mods/ITEMS/mcl_jukebox/init.lua @@ -121,7 +121,7 @@ minetest.register_node("mcl_jukebox:jukebox", { _doc_items_usagehelp = S("Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players."), tiles = {"mcl_jukebox_top.png", "mcl_jukebox_side.png", "mcl_jukebox_side.png"}, sounds = mcl_sounds.node_sound_wood_defaults(), - groups = {handy=1,axey=1, container=7, deco_block=1, material_wood=1, flammable=-1}, + groups = {handy=1,axey=1, container=1, deco_block=1, material_wood=1, flammable=-1}, is_ground_content = false, on_construct = function(pos) local meta = minetest.get_meta(pos) diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua index 73fcdae16..8e4c53cad 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -256,7 +256,7 @@ minetest.register_craftitem("mcl_potions:water", { stack_max = 1, inventory_image = potion_image("#0022FF"), wield_image = potion_image("#0022FF"), - groups = {brewitem=1, food=3, can_eat_when_full=1, water_bottle=1}, + groups = {brewitem=1, food=3, can_eat_when_full=1, water_bottle=1, bottle=1}, on_place = water_bottle_on_place, _on_dispense = dispense_water_bottle, _dispense_into_walkable = true, @@ -273,7 +273,7 @@ minetest.register_craftitem("mcl_potions:river_water", { stack_max = 1, inventory_image = potion_image("#0044FF"), wield_image = potion_image("#0044FF"), - groups = {brewitem=1, food=3, can_eat_when_full=1, water_bottle=1}, + groups = {brewitem=1, food=3, can_eat_when_full=1, water_bottle=1, bottle=1}, on_place = water_bottle_on_place, _on_dispense = dispense_water_bottle, _dispense_into_walkable = true, diff --git a/mods/ITEMS/mcl_potions/lingering.lua b/mods/ITEMS/mcl_potions/lingering.lua index 17088ad13..46d94cad3 100644 --- a/mods/ITEMS/mcl_potions/lingering.lua +++ b/mods/ITEMS/mcl_potions/lingering.lua @@ -102,7 +102,7 @@ function mcl_potions.register_lingering(name, descr, color, def) _doc_items_longdesc = longdesc, _doc_items_usagehelp = S("Use the “Punch” key to throw it."), inventory_image = lingering_image(color), - groups = {brewitem=1, not_in_creative_inventory=0}, + groups = {brewitem=1, not_in_creative_inventory=0, bottle=1}, on_use = function(item, placer, pointed_thing) local velocity = 10 local dir = placer:get_look_dir(); diff --git a/mods/ITEMS/mcl_potions/potions.lua b/mods/ITEMS/mcl_potions/potions.lua index 57c06c29d..225fffed2 100644 --- a/mods/ITEMS/mcl_potions/potions.lua +++ b/mods/ITEMS/mcl_potions/potions.lua @@ -163,7 +163,7 @@ local function register_potion(def) stack_max = def.stack_max or 1, inventory_image = def.image or potion_image(def.color), wield_image = def.image or potion_image(def.color), - groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1 }, + groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1, bottle=1}, on_place = on_use, on_secondary_use = on_use, }) @@ -260,7 +260,7 @@ local function register_potion(def) stack_max = def.stack_max or 1, inventory_image = def.image or potion_image(def.color), wield_image = def.image or potion_image(def.color), - groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1}, + groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1, bottle=1}, on_place = on_use, on_secondary_use = on_use, }) @@ -343,7 +343,7 @@ local function register_potion(def) stack_max = 1, inventory_image = def.image or potion_image(def.color), wield_image = def.image or potion_image(def.color), - groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1}, + groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1, bottle=1}, on_place = on_use, on_secondary_use = on_use, }) @@ -411,7 +411,7 @@ local awkward_def = { _tt = S("No effect"), _longdesc = S("Has an awkward taste and is used for brewing potions."), color = "#0000FF", - groups = {brewitem=1, food=3, can_eat_when_full=1}, + groups = {brewitem=1, food=3, can_eat_when_full=1, bottle=1}, on_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), } @@ -450,7 +450,7 @@ local dragon_breath_def = { no_effect = true, _longdesc = S("This item is used in brewing and can be combined with splash potions to create lingering potions."), image = "mcl_potions_dragon_breath.png", - groups = { brewitem = 1 }, + groups = { brewitem = 1, bottle = 1 }, on_use = nil, stack_max = 64, } diff --git a/mods/ITEMS/mcl_potions/splash.lua b/mods/ITEMS/mcl_potions/splash.lua index 6b6238dbf..0b8aedeab 100644 --- a/mods/ITEMS/mcl_potions/splash.lua +++ b/mods/ITEMS/mcl_potions/splash.lua @@ -26,7 +26,7 @@ function mcl_potions.register_splash(name, descr, color, def) _doc_items_longdesc = longdesc, _doc_items_usagehelp = S("Use the “Punch” key to throw it."), inventory_image = splash_image(color), - groups = {brewitem=1, not_in_creative_inventory=0}, + groups = {brewitem=1, not_in_creative_inventory=0, bottle=1}, on_use = function(item, placer, pointed_thing) local velocity = 10 local dir = placer:get_look_dir(); diff --git a/mods/ITEMS/mcl_smoker/init.lua b/mods/ITEMS/mcl_smoker/init.lua index 757f13054..787d0c429 100644 --- a/mods/ITEMS/mcl_smoker/init.lua +++ b/mods/ITEMS/mcl_smoker/init.lua @@ -453,7 +453,7 @@ minetest.register_node("mcl_smoker:smoker", { "smoker_side.png", "smoker_front.png" }, paramtype2 = "facedir", - groups = { pickaxey = 1, container = 4, deco_block = 1, material_stone = 1 }, + groups = { pickaxey = 1, container = 2, deco_block = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), @@ -519,6 +519,11 @@ minetest.register_node("mcl_smoker:smoker", { _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, on_rotate = on_rotate, + _mcl_hoppers_on_try_pull = mcl_furnaces.hoppers_on_try_pull, + _mcl_hoppers_on_try_push = mcl_furnaces.hoppers_on_try_push, + _mcl_hoppers_on_after_push = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, }) minetest.register_node("mcl_smoker:smoker_active", { @@ -536,7 +541,7 @@ minetest.register_node("mcl_smoker:smoker_active", { paramtype = "light", light_source = LIGHT_ACTIVE_FURNACE, drop = "mcl_smoker:smoker", - groups = { pickaxey = 1, container = 4, deco_block = 1, not_in_creative_inventory = 1, material_stone = 1 }, + groups = { pickaxey = 1, container = 2, deco_block = 1, not_in_creative_inventory = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), on_timer = smoker_node_timer, @@ -579,6 +584,8 @@ minetest.register_node("mcl_smoker:smoker_active", { _mcl_hardness = 3.5, on_rotate = on_rotate, after_rotate = after_rotate_active, + _mcl_hoppers_on_try_pull = mcl_furnaces.hoppers_on_try_pull, + _mcl_hoppers_on_try_push = mcl_furnaces.hoppers_on_try_push, }) minetest.register_craft({ From b57f6be81d3a1ea1eac5a7208fb15f5217d5bd46 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Tue, 28 Nov 2023 01:37:45 +0000 Subject: [PATCH 080/345] Make showing advancement chat messages into a setting (#4032) Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4032 Reviewed-by: the-real-herowl Co-authored-by: Eliy21 Co-committed-by: Eliy21 --- mods/HUD/awards/api.lua | 4 +++- settingtypes.txt | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/HUD/awards/api.lua b/mods/HUD/awards/api.lua index 6333272bd..ca87a812c 100644 --- a/mods/HUD/awards/api.lua +++ b/mods/HUD/awards/api.lua @@ -217,7 +217,9 @@ function awards.unlock(name, award) -- Get award minetest.log("action", name.." has gotten award "..award) - minetest.chat_send_all(S("@1 has made the advancement @2", name, minetest.colorize(mcl_colors.GREEN, "[" .. (awdef.title or award) .. "]"))) + if minetest.settings:get_bool("mcl_showAdvancementMessages", true) then + minetest.chat_send_all(S("@1 has made the advancement @2", name, minetest.colorize(mcl_colors.GREEN, "[" .. (awdef.title or award) .. "]"))) + end data.unlocked[award] = award awards.save() diff --git a/settingtypes.txt b/settingtypes.txt index c2f97c817..a78b33e3b 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -73,6 +73,9 @@ mcl_elytra_rocket_speed (Elytra rocket speed cap) float 3.5 2.0 5.5 # If enabled, chat messages are shown to everyone when a player dies. mcl_showDeathMessages (Show death messages) bool true +# If enabled, chat messages are shown to everyone when a player makes an advancement. +mcl_showAdvancementMessages (Show advancement messages) bool true + # If enabled, the recipe book will progressively be filled with new recipes that can be crafted from all items you ever have had in your inventory. # Recommended for new players and for a spoiler-free gameplay experience. # If disabled, all recipes will be shown. From 4cf865a36c7110a28513f98c8d87db55c5efa9b2 Mon Sep 17 00:00:00 2001 From: codiac Date: Tue, 28 Nov 2023 02:45:18 +0000 Subject: [PATCH 081/345] Fix passive threshold in nether and end (#4030) Fix light check for passive mobs in other dimensions. It is apparently the same in all dimensions. If a mob has it's own spawn_check function then that should be used regardless of it's type. Fixes #4029 Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4030 Reviewed-by: the-real-herowl Co-authored-by: codiac Co-committed-by: codiac --- mods/ENTITIES/mcl_mobs/spawning.lua | 33 ++++++++++++++--------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/spawning.lua b/mods/ENTITIES/mcl_mobs/spawning.lua index 9c51c0f86..885391759 100644 --- a/mods/ENTITIES/mcl_mobs/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/spawning.lua @@ -732,27 +732,26 @@ local function spawn_check(pos, spawn_def) local sky_light = minetest.get_natural_light(pos) local art_light = minetest.get_artificial_light(my_node.param1) - if dimension == "nether" then - if art_light <= nether_threshold then - return true - end - elseif dimension == "end" then - if art_light <= end_threshold then - return true - end - elseif dimension == "overworld" then - if mob_type == "monster" then - if mob_def.spawn_check then - return mob_def.spawn_check(pos, gotten_light, art_light, sky_light) - elseif art_light <= overworld_threshold and sky_light <= overworld_sky_threshold then + if mob_def.spawn_check then + return mob_def.spawn_check(pos, gotten_light, art_light, sky_light) + elseif mob_type == "monster" then + if dimension == "nether" then + if art_light <= nether_threshold then return true end - else - if mob_def.spawn_check then - return mob_def.spawn_check(pos, gotten_light, art_light, sky_light) - elseif gotten_light > overworld_passive_threshold then + elseif dimension == "end" then + if art_light <= end_threshold then return true end + elseif dimension == "overworld" then + if art_light <= overworld_threshold and sky_light <= overworld_sky_threshold then + return true + end + end + else + -- passive threshold is apparently the same in all dimensions ... + if gotten_light > overworld_passive_threshold then + return true end end else From 43e7a952acedf3c8c793f200b66ceefe3044a7c8 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Thu, 30 Nov 2023 22:29:56 +0100 Subject: [PATCH 082/345] use math.ceil to get amount of needed players --- mods/ITEMS/mcl_beds/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 6c59fff04..394c748e7 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -385,7 +385,7 @@ function mcl_beds.on_rightclick(pos, player, is_top) mcl_title.set(player, "actionbar", {text=message, color="white", stay=60}) else -- someone just successfully entered a bed local connected_players = minetest.get_connected_players() - local sleep_hud_message = S("@1/@2 players currently in bed.", player_in_bed, players_in_bed_setting() * #connected_players / 100) + local sleep_hud_message = S("@1/@2 players currently in bed.", player_in_bed, math.ceil(players_in_bed_setting() * #connected_players / 100)) for _, player in pairs(connected_players) do if not mcl_beds.player[player:get_player_name()] then -- only send message to players not sleeping. if mcl_title.params_get(player) then mcl_title.clear(player) end -- clear, old message is still being displayed From 2ba73f832c7d21451be760f40fc4b25060d42a03 Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 4 Dec 2023 20:17:39 +0100 Subject: [PATCH 083/345] horse: drops: remove 2nd saddle, add armor --- mods/ENTITIES/mobs_mc/horse.lua | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 07aa58572..5bf241758 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -44,18 +44,6 @@ local function get_drops(self) max = 2, looting = "common", }) - if self._saddle then - table.insert(self.drops,{name = "mcl_mobitems:saddle", - chance = 1, - min = 1, - max = 1,}) - end - if self._chest then - table.insert(self.drops,{name = "mcl_chests:chest", - chance = 1, - min = 1, - max = 1,}) - end end -- Helper functions to determine equipment rules @@ -245,10 +233,18 @@ local horse = { on_die = function(self, pos) - -- drop saddle when horse is killed while riding + -- drop saddle when horse is killed if self._saddle then minetest.add_item(pos, "mcl_mobitems:saddle") end + -- drop chest when mule/donkey is killed + if self._chest then + minetest.add_item(pos, "mcl_chests:chest") + end + -- drop armor when horse is killed + if self._wearing_armor then + minetest.add_item(pos, self._horse_armor) + end -- also detach from horse properly if self.driver then mcl_mobs.detach(self.driver, {x = 1, y = 0, z = 1}) @@ -401,6 +397,7 @@ local horse = { -- Put on armor and take armor from player's inventory local armor = minetest.get_item_group(iname, "horse_armor") self._horse_armor = iname + self._wearing_armor = true local w = clicker:get_wielded_item() if not minetest.is_creative_enabled(clicker:get_player_name()) then w:take_item() From 027e0e8337ed2b6de1b313116f44ea9c4f405068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Mu=C3=B1oz?= Date: Tue, 5 Dec 2023 00:05:39 +0000 Subject: [PATCH 084/345] Fix a typo in the spanish translation (#4039) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4039 Reviewed-by: the-real-herowl Co-authored-by: José Muñoz Co-committed-by: José Muñoz --- mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr index 4ed4d8640..0375eb320 100644 --- a/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr +++ b/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr @@ -11,7 +11,7 @@ To use the bow, you first need to have at least one arrow anywhere in your inven Bow=Arco Ammunition=Munición Damage from bow: 1-10=Daño con arco: 1-10 -Damage from dispenser: 3=Daño por dispendsador: 3 +Damage from dispenser: 3=Daño por dispensador: 3 Launches arrows=Lanza flechas Crossbow=Ballesta Crossbows are ranged weapons to shoot arrows at your foes.=Las ballestas son armas a distancia para disparar flechas a tus enemigos. From e29654a0f697e1333f57612aa72d318699d1877e Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 27 Nov 2023 03:37:28 +0100 Subject: [PATCH 085/345] Revert healing interval default to the lower value --- mods/PLAYER/mcl_hunger/init.lua | 2 +- settingtypes.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index cc3965f57..a039169e3 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -146,7 +146,7 @@ minetest.register_globalstep(function(dtime) local food_level = mcl_hunger.get_hunger(player) local food_saturation_level = mcl_hunger.get_saturation(player) local player_health = player:get_hp() - local max_tick_timer = tonumber(minetest.settings:get("mcl_health_regen_delay")) or 4 + local max_tick_timer = tonumber(minetest.settings:get("mcl_health_regen_delay")) or 0.5 if food_tick_timer > max_tick_timer then food_tick_timer = 0 diff --git a/settingtypes.txt b/settingtypes.txt index a78b33e3b..f5743bc1d 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -99,8 +99,8 @@ mcl_creative_dig_speed (Creative mode dig speed) float 0.2 mcl_enable_hunger (Hunger mechanic) bool true # Health regeneration delay when hunger bar is full -# Default:4 -mcl_health_regen_delay (Health regen delay) float 4 0 +# Default: 0.5 s +mcl_health_regen_delay (Health regen delay) float 0.5 0 [Mobs] # If enabled, mobs will spawn naturally. This does not affect From 24ffd64cadb9dbce40fdabb9fc8a9b2ac9351200 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 28 Nov 2023 03:34:26 +0100 Subject: [PATCH 086/345] Knockback fixes --- mods/ENTITIES/mcl_mobs/combat.lua | 4 ++-- mods/HUD/mcl_death_messages/init.lua | 1 - mods/ITEMS/mcl_enchanting/enchantments.lua | 8 +++++++- mods/PLAYER/mcl_criticals/init.lua | 3 +-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index 6952f6581..ad7e202c6 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -719,12 +719,12 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) end if hitter and is_player then local wielditem = hitter:get_wielded_item() + kb = kb + 9 * mcl_enchanting.get_enchantment(wielditem, "knockback") + -- add player velocity to mob knockback local hv = hitter:get_velocity() local dir_dot = (hv.x * dir.x) + (hv.z * dir.z) local player_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) local mob_mag = math.sqrt((v.x * v.x) + (v.z * v.z)) - kb = kb + 9 * mcl_enchanting.get_enchantment(wielditem, "knockback") - -- add player velocity to mob knockback if dir_dot > 0 and mob_mag <= player_mag * 0.625 then kb = kb + ((math.abs(hv.x) + math.abs(hv.z)) * r) end diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index 6c2040545..82749ca94 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -156,7 +156,6 @@ mcl_death_messages = { plain = "@1 died a sweet death", assist = "@1 was poked to death by a sweet berry bush whilst trying to escape @2", }, - -- Missing snowballs: The Minecraft wiki mentions them but the MC source code does not. }, } diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index f137b4230..7e06ae43b 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -278,7 +278,13 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end if hitter and hitter:is_player() then local wielditem = hitter:get_wielded_item() - knockback = knockback + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") + knockback = knockback + 5 * mcl_enchanting.get_enchantment(wielditem, "knockback") + -- add player velocity to knockback + local hv = hitter:get_velocity() + local dir_dot = (hv.x * dir.x) + (hv.z * dir.z) + if dir_dot > 0 then + knockback = knockback + dir_dot * 2 + end elseif luaentity and luaentity._knockback then knockback = knockback + luaentity._knockback end diff --git a/mods/PLAYER/mcl_criticals/init.lua b/mods/PLAYER/mcl_criticals/init.lua index 27d09abb2..3e292d165 100644 --- a/mods/PLAYER/mcl_criticals/init.lua +++ b/mods/PLAYER/mcl_criticals/init.lua @@ -23,8 +23,7 @@ mcl_damage.register_modifier(function(obj, damage, reason) texture = "mcl_particles_crit.png^[colorize:#bc7a57:127", }) minetest.sound_play("mcl_criticals_hit", {object = obj}) - -- the minecraft wiki is actually wrong about a crit dealing 150% damage, see minecraft source code - return damage + math.random(0, math.floor(damage * 1.5 + 2)) + return damage * math.random(1.5, 2.5) end end end, -100) From cca664552483df860c0495f426b87d9e2b4287d2 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 28 Nov 2023 04:28:05 +0100 Subject: [PATCH 087/345] Added player damage invulnerability --- mods/PLAYER/mcl_playerplus/init.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 99da0a01a..61ca0e103 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -721,6 +721,20 @@ mcl_damage.register_modifier(function(obj, damage, reason) end end, -200) +-- damage invulnerability +mcl_damage.register_modifier(function(obj, damage, reason) + local invul = obj:get_meta():get_int("mcl_damage:invulnerable") + if invul > 0 then + return 0 + else + obj:get_meta():set_int("mcl_damage:invulnerable", 1) + minetest.after(0.5, function() + obj:get_meta():set_int("mcl_damage:invulnerable", 0) + end) + return damage + end +end, -1000) + minetest.register_on_respawnplayer(function(player) local pos = player:get_pos() minetest.add_particlespawner({ From 46d9c6600047bf39cb9bd597d328791c877d60cc Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 28 Nov 2023 04:35:19 +0100 Subject: [PATCH 088/345] Fixed mobs executing custom on_punch with punch fail --- mods/ENTITIES/mcl_mobs/combat.lua | 44 +++++++++++++++---------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index ad7e202c6..6b660c787 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -516,6 +516,28 @@ end -- deal damage and effects when mob punched function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) + local is_player = hitter:is_player() + local mob_pos = self.object:get_pos() + local player_pos = hitter:get_pos() + + if is_player then + -- is mob out of reach? + if vector.distance(mob_pos, player_pos) > 3 then + return + end + -- is mob protected? + if self.protected and minetest.is_protected(mob_pos, hitter:get_player_name()) then + return + end + end + + local time_now = minetest.get_us_time() + local time_diff = time_now - self.invul_timestamp + + -- check for invulnerability time in microseconds (0.5 second) + if time_diff <= 500000 and time_diff >= 0 then + return + end -- custom punch function if self.do_punch then @@ -534,29 +556,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) local time_now = minetest.get_us_time() - local is_player = hitter:is_player() - if is_player then - local time_diff = time_now - self.invul_timestamp - - -- check for invulnerability time in microseconds (0.5 second) - if time_diff <= 500000 and time_diff >= 0 then - return - end - - local mob_pos = self.object:get_pos() - local player_pos = hitter:get_pos() - - -- is mob out of reach? - if vector.distance(mob_pos, player_pos) > 3 then - return - end - - -- is mob protected? - if self.protected and minetest.is_protected(mob_pos, hitter:get_player_name()) then - return - end - if minetest.is_creative_enabled(hitter:get_player_name()) then self.health = 0 end From 1857341b59ab9ed7d2b084c2162b45431c32d291 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 28 Nov 2023 04:35:42 +0100 Subject: [PATCH 089/345] Fixed player knockback from arrows --- mods/ITEMS/mcl_enchanting/enchantments.lua | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 7e06ae43b..c6436339c 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -286,7 +286,13 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool knockback = knockback + dir_dot * 2 end elseif luaentity and luaentity._knockback then - knockback = knockback + luaentity._knockback + 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 From 589de76613c3966b82f3992d5289cb29c1b82bdf Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 5 Dec 2023 01:57:40 +0100 Subject: [PATCH 090/345] Fixed a code branch never being run --- mods/PLAYER/mcl_hunger/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index a039169e3..ff625a5f7 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -148,7 +148,7 @@ minetest.register_globalstep(function(dtime) local player_health = player:get_hp() local max_tick_timer = tonumber(minetest.settings:get("mcl_health_regen_delay")) or 0.5 - if food_tick_timer > max_tick_timer then + if food_tick_timer > 4 then food_tick_timer = 0 -- let hunger work always From 0673fcc25bc9907bc7d3909b17ebf82951f8da32 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Tue, 5 Dec 2023 01:08:50 +0000 Subject: [PATCH 091/345] Respawn dead players when they login so they don't get stuck without the death formspec (#4041) Hopefully will prevent the dead player not respawning when logging in bug from happening Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4041 Reviewed-by: the-real-herowl Co-authored-by: Eliy21 Co-committed-by: Eliy21 --- mods/PLAYER/mcl_playerplus/init.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 99da0a01a..0ad34cae8 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -657,6 +657,7 @@ end) -- set to blank on join (for 3rd party mods) minetest.register_on_joinplayer(function(player) local name = player:get_player_name() + local hp = player:get_hp() mcl_playerplus_internal[name] = { lastPos = nil, @@ -671,6 +672,10 @@ minetest.register_on_joinplayer(function(player) player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3, 5.785, 0)) player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3, 5.785, 0)) player:set_bone_position("Body_Control", vector.new(0, 6.75, 0)) + -- Respawn dead players on joining + if hp <= 0 then + player:respawn() + end end) -- clear when player leaves From f39fe17895b3807ec59e7b6fc7d8097546754eb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Mon, 4 Dec 2023 22:51:50 -0600 Subject: [PATCH 092/345] Update mesecons_lightsone spanish translation Fixed a syntaxis error at line 3 and added the missing translation for line 4 --- .../mesecons_lightstone/locale/mesecons_lightstone.es.tr | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.es.tr b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.es.tr index 713f0be5e..f2a47d3ac 100644 --- a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.es.tr +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.es.tr @@ -1,3 +1,4 @@ # textdomain: mesecons_lightstone Redstone Lamp=Lámpara de redstone -Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.=Las lámparas Redstone son componentes simples de redstone que brillan intensamente (nivel de luz @ 1) cuando reciben energía de redstone. +Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.=Las lámparas de redstone son componentes simples de redstone que brillan intensamente (nivel de luz @1) cuando reciben energía de redstone. +Glows when powered by redstone power=Brilla cuando recibe energía de redstone From 86dad4693ee040b53a81daa8811b48f1ebfdd036 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Tue, 5 Dec 2023 08:21:37 +0000 Subject: [PATCH 093/345] Add warning log if players with 0 hp joined (#4051) Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4051 Reviewed-by: the-real-herowl Co-authored-by: Eliy21 Co-committed-by: Eliy21 --- mods/PLAYER/mcl_playerplus/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 0ad34cae8..92e22b0e6 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -675,6 +675,7 @@ minetest.register_on_joinplayer(function(player) -- Respawn dead players on joining if hp <= 0 then player:respawn() + minetest.log("warning", name .. " joined the game with 0 hp and has been forced to respawn") end end) From 4127d120d25a7fa18dfd1d49feaf0ef2110489d6 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Tue, 5 Dec 2023 12:49:49 +0000 Subject: [PATCH 094/345] Add server privs restriction to mcl_villages build tool (#4043) Fixes #4022 ### Testing -Make a new world, check host server and go into creative mode -Since you're the server you have the server privs so get the mcl_villages build tool item in creative inventory and use it to see if it works -Have someone join your server and give them the same item to use and see if they are restricted from using it Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4043 Reviewed-by: chmodsayshello Co-authored-by: Eliy21 Co-committed-by: Eliy21 --- mods/MAPGEN/mcl_villages/init.lua | 4 ++++ mods/MAPGEN/mcl_villages/locale/mcl_villages.de.tr | 4 ++++ mods/MAPGEN/mcl_villages/locale/mcl_villages.fr.tr | 3 ++- mods/MAPGEN/mcl_villages/locale/mcl_villages.ja.tr | 3 ++- mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr | 3 ++- mods/MAPGEN/mcl_villages/locale/template.txt | 3 ++- 6 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 mods/MAPGEN/mcl_villages/locale/mcl_villages.de.tr diff --git a/mods/MAPGEN/mcl_villages/init.lua b/mods/MAPGEN/mcl_villages/init.lua index 0cb0712b5..6662f6bd1 100644 --- a/mods/MAPGEN/mcl_villages/init.lua +++ b/mods/MAPGEN/mcl_villages/init.lua @@ -128,6 +128,10 @@ if minetest.is_creative_enabled("") then -- build ssettlement on_place = function(itemstack, placer, pointed_thing) if not pointed_thing.under then return end + if not minetest.check_player_privs(placer, "server") then + minetest.chat_send_player(placer:get_player_name(), S("Placement denied. You need the “server” privilege to place villages.")) + return + end local minp = vector.subtract( pointed_thing.under, half_map_chunk_size) local maxp = vector.add( pointed_thing.under, half_map_chunk_size) build_a_settlement(minp, maxp, math.random(0,32767)) diff --git a/mods/MAPGEN/mcl_villages/locale/mcl_villages.de.tr b/mods/MAPGEN/mcl_villages/locale/mcl_villages.de.tr new file mode 100644 index 000000000..6a8f1f681 --- /dev/null +++ b/mods/MAPGEN/mcl_villages/locale/mcl_villages.de.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_villages +Chiseled Stone Village Bricks=Dorfziegel aus gemeißeltem Stein +mcl_villages build tool=mcl_villages Konstruktionswerkzeug +Placement denied. You need the “server” privilege to place villages.=Platzierung verweigert. Sie benötigen das "server" Privileg, um Dörfer zu platzieren. \ No newline at end of file diff --git a/mods/MAPGEN/mcl_villages/locale/mcl_villages.fr.tr b/mods/MAPGEN/mcl_villages/locale/mcl_villages.fr.tr index b648cd36c..af1d0ab49 100644 --- a/mods/MAPGEN/mcl_villages/locale/mcl_villages.fr.tr +++ b/mods/MAPGEN/mcl_villages/locale/mcl_villages.fr.tr @@ -1,3 +1,4 @@ # textdomain: mcl_villages Chiseled Stone Village Bricks=Pierre sculptée du village -mcl_villages build tool=outil de construction de mcl_villages \ No newline at end of file +mcl_villages build tool=outil de construction de mcl_villages +Placement denied. You need the “server” privilege to place villages.=Placement refusé. Vous devez disposer du privilège "server" pour placer des villages. \ No newline at end of file diff --git a/mods/MAPGEN/mcl_villages/locale/mcl_villages.ja.tr b/mods/MAPGEN/mcl_villages/locale/mcl_villages.ja.tr index 4d0e4794f..6a63a577d 100644 --- a/mods/MAPGEN/mcl_villages/locale/mcl_villages.ja.tr +++ b/mods/MAPGEN/mcl_villages/locale/mcl_villages.ja.tr @@ -1,3 +1,4 @@ # textdomain: mcl_villages Chiseled Stone Village Bricks=模様入り石村レンガ -mcl_villages build tool=mcl_villages 構築ツール \ No newline at end of file +mcl_villages build tool=mcl_villages 構築ツール +Placement denied. You need the “server” privilege to place villages.=配置が拒否されました。村の配置には「server」権限が必要です。 \ No newline at end of file diff --git a/mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr b/mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr index 525e5811b..021bd78f1 100644 --- a/mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr +++ b/mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr @@ -1,3 +1,4 @@ # textdomain: mcl_villages Chiseled Stone Village Bricks=Резные деревенские каменные кирпичи -mcl_villages build tool=Инструмент постройки деревни \ No newline at end of file +mcl_villages build tool=Инструмент постройки деревни +Placement denied. You need the “server” privilege to place villages.=Размещение запрещено. Для размещения деревень необходима привилегия "server". \ No newline at end of file diff --git a/mods/MAPGEN/mcl_villages/locale/template.txt b/mods/MAPGEN/mcl_villages/locale/template.txt index 464daea9b..c410f4837 100644 --- a/mods/MAPGEN/mcl_villages/locale/template.txt +++ b/mods/MAPGEN/mcl_villages/locale/template.txt @@ -1,3 +1,4 @@ # textdomain: mcl_villages Chiseled Stone Village Bricks= -mcl_villages build tool= \ No newline at end of file +mcl_villages build tool= +Placement denied. You need the “server” privilege to place villages.= \ No newline at end of file From bb1e572287204092d31514dfa0952de0b8051b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Tue, 5 Dec 2023 18:39:29 -0600 Subject: [PATCH 095/345] Update mcl_compass.es.tr and fix syntax errors --- .../mcl_compass/locale/mcl_compass.es.tr | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_compass/locale/mcl_compass.es.tr b/mods/ITEMS/mcl_compass/locale/mcl_compass.es.tr index 77b36cad9..ca6eb8dcd 100644 --- a/mods/ITEMS/mcl_compass/locale/mcl_compass.es.tr +++ b/mods/ITEMS/mcl_compass/locale/mcl_compass.es.tr @@ -1,9 +1,14 @@ # textdomain: mcl_compass Compass=Brújula -Points to the world origin= -Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Las brújulas son herramientas que apuntan al origen del mundo (X @ = 0, Z @ = 0) o al punto de generación en el mundo. -A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly.= -Lodestone Compass= -Points to a lodestone= -Lodestone compasses resemble regular compasses, but they point to a specific lodestone.= -A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone.= +Points to the world origin=Apunta hacia el punto de generación del mundo +Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Las brújulas son herramientas que apuntan al origen del mundo (X@=0, Z@=0) o al punto de generación en la superficie. +A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly.=Una brújula siempre apunta al punto de generación del mundo cuando el jugador está en la superficie. En otras dimensiones, gira aleatoriamente. +Lodestone Compass=Brújula magnetizada +Points to a lodestone=Apunta hacia una magnetita +Lodestone compasses resemble regular compasses, but they point to a specific lodestone.=Las brújulas magnetizadas se parecen a las brújulas normales, pero apuntan a una magnetita específica. +A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone.=Una brújula magnetizada puede fabricarse a partir de una brújula normal, siempre que estén en la misma dimensión. Si no están en la misma dimensión, la brújula magnetizada girará aleatoriamente, de forma similar a una brújula normal cuando está fuera de la superficie. Una brújula magnetizada puede volver a enlazarse con otra magnetita. +Lodestone=Magnetita +Recovery Compass=Brújula de recuperación +Points to your last death location=Apunta hacia la ubicación de tu última muerte +Recovery Compasses are compasses that point to your last death location=Las brújulas de recuperación son brújulas que apuntan hacia la ubicación de tu última muerte +Recovery Compasses always point to the location of your last death, in case you haven't died yet, it will just randomly spin around=Las brújulas de recuperación siempre apuntan hacia la ubicación de tu última muerte, en caso de que aún no hayas muerto, simplemente girará aleatoriamente From 47f920c9dfa4c2172e953578e64c8cdf3a8334e3 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 5 Dec 2023 03:05:20 +0100 Subject: [PATCH 096/345] Updated release credits and set version for 0.85 --- CREDITS.md | 28 +++++++++++++++++++++++++--- game.conf | 2 +- mods/HUD/mcl_credits/people.lua | 29 ++++++++++++++++++++++++++--- 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index 39eed70e1..3a651cc58 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -8,30 +8,32 @@ ## Maintainers * AncientMariner -* Nicu +* Herowl ## Previous Maintainers * Fleckenstein * cora +* Nicu ## Developers * AFCMS * epCode * chmodsayshello -* PrairieWind * MrRar * FossFanatic * SmokeyDope +* Faerraven / Michieal +* Codiac ## Past Developers * jordan4ibanez * iliekprogrammar * kabou * kay27 -* Faerraven / Michieal * MysticTempest * NO11 * SumianVoice +* PrairieWind ## Contributors * RandomLegoBrick @@ -112,6 +114,19 @@ * Niterux * appgurueu * seventeenthShulker +* DinoNuggies4665 +* basxto +* Morik666 +* Eliy21 +* mdk +* pepebotella +* Alessandra Lozoya +* VanicGame +* ThePython10110 +* Araca +* Montandalar +* mim +* Dark ## Music * Jordach for the jukebox music compilation from Big Freaking Dig @@ -155,6 +170,7 @@ * cora * Faerraven / Michieal * PrairieWind +* ChrisPHP ## 3D Models * 22i @@ -162,6 +178,7 @@ * epCode * Faerraven / Michieal * SumianVoice +* thunder1035 ## Textures * XSSheep @@ -181,6 +198,8 @@ * Aeonix_Aeon * Wbjitscool * SmokeyDope +* thunder1035 +* Herowl ## Translations * Wuzzy @@ -200,6 +219,9 @@ * Temak * megustanlosfrijoles * kbundg +* Isaac Dennis +* ADLON +* Sab Pyrope ## Funders * 40W diff --git a/game.conf b/game.conf index 3ad5a33a5..07f30eef5 100644 --- a/game.conf +++ b/game.conf @@ -1,4 +1,4 @@ title = MineClone 2 description = A survival sandbox game. Survive, gather, hunt, build, explore, and do much more. disallowed_mapgens = v6 -version=0.85.0-SNAPSHOT \ No newline at end of file +version=0.85.0 diff --git a/mods/HUD/mcl_credits/people.lua b/mods/HUD/mcl_credits/people.lua index 7421350d0..d9e08ca37 100644 --- a/mods/HUD/mcl_credits/people.lua +++ b/mods/HUD/mcl_credits/people.lua @@ -10,30 +10,32 @@ return { }}, {S("Maintainers"), 0xFF51D5, { "AncientMariner", - "Nicu", + "Herowl", }}, {S("Previous Maintainers"), 0xFFFFFF, { "Fleckenstein", "cora", + "Nicu", }}, {S("Developers"), 0xF84355, { "AFCMS", "epCode", "chmodsayshello", - "PrairieWind", "MrRar", "FossFanatic ", "SmokeyDope", + "Faerraven / Michieal", + "Codiac", }}, {S("Past Developers"), 0xF84355, { "jordan4ibanez", "iliekprogrammar", "kabou", "kay27", - "Faerraven / Michieal", "MysticTempest", "NO11", "SumianVoice", + "PrairieWind", }}, {S("Contributors"), 0x52FF00, { "RandomLegoBrick", @@ -114,6 +116,19 @@ return { "Niterux", "appgurueu", "seventeenthShulker", + "DinoNuggies4665", + "basxto", + "Morik666", + "Eliy21", + "mdk", + "pepebotella", + "Alessandra Lozoya", + "VanicGame", + "ThePython10110", + "Araca", + "Montandalar", + "mim", + "Dark", }}, {S("Music"), 0xA60014, { "Jordach for the jukebox music compilation from Big Freaking Dig", @@ -157,6 +172,7 @@ return { "cora", "Faerraven / Michieal", "PrairieWind", + "ChrisPHP", }}, {S("3D Models"), 0x0019FF, { "22i", @@ -164,6 +180,7 @@ return { "epCode", "Faerraven / Michieal", "SumianVoice", + "thunder1035", }}, {S("Textures"), 0xFF9705, { "XSSheep", @@ -180,8 +197,11 @@ return { "Faerraven / Michieal", "Nicu", "Exhale", + "Aeonix_Aeon", "Wbjitscool", "SmokeyDope", + "thunder1035", + "Herowl", }}, {S("Translations"), 0x00FF60, { "Wuzzy", @@ -201,6 +221,9 @@ return { "Temak", "megustanlosfrijoles", "kbundg", + "Isaac Dennis", + "ADLON", + "Sab Pyrope", }}, {S("Funders"), 0xF7FF00, { "40W", From 333db53e7b2dc30188d4668d3332e9f3d2196198 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 5 Dec 2023 03:18:43 +0100 Subject: [PATCH 097/345] Add release notes for 0.85 --- .../0_85-the_fire_and_stone_release.md | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 releasenotes/0_85-the_fire_and_stone_release.md diff --git a/releasenotes/0_85-the_fire_and_stone_release.md b/releasenotes/0_85-the_fire_and_stone_release.md new file mode 100644 index 000000000..856bc7853 --- /dev/null +++ b/releasenotes/0_85-the_fire_and_stone_release.md @@ -0,0 +1,102 @@ +## 0.85 – The Fire and Stone release + +### Contributors +#### New maintainer +* Herowl + +#### New contributors +* Codiac +* DinoNuggies4665 +* basxto +* Morik666 +* Eliy21 +* mdk +* pepebotella +* Alessandra Lozoya +* VanicGame +* ThePython10110 +* Araca +* Montandalar +* mim +* Dark +* ChrisPHP +* thunder1035 +* Isaac Dennis +* ADLON +* Sab Pyrope + +### Mobs improvements +Creeper received some adjustments, should be smarter, but easier to avoid if you're quick. Axolotl on the other hand won't eat your sheep anymore. + +Wither received a massive rework by Herowl, complete with custom attacks. Make sure to check him out, especially if you're up for a challenge. + +Iron Golem received some AI changes by our new contributor, Codiac, which should prevent him getting lost so much. + +Another rework done by Codiac was a change of how mob spawning takes light level into account. It should now be easier to prevent hostile spawns by lighting areas up, among other things. + +### Stonecutter functionality +Stonecutter finally received its functionality! Thanks to the work done by ChrisPHP, Herowl and AFCMS you can now cut every kind of stone into slabs, stairs, and decorated variants with unprecedented ease. + +### Campfire update +Another node that received a large update is the campfire, as well as the soul version. Thanks to the great work of PrairieWind, DinoNuggies4665, thunder1035, Wbjitscool, & AncientMariner, you can now cook items on them, and see it being done! + +### Combat rebalancing +Combat should feel better than ever before with changes by Eliy21 and Herowl! Knockback is stronger and more visible, every hit causes a short window of damage resistance, critical hits are more stable, hunger-based health regeneration works slightly differently... check it out! + +### Armor trims +You can now decorate your armor with colorful gems and metals on the smithing table thanks to the work of chmodsayshello. + +### Path undoing +Welcome our very own feature, path undoing! Brought to you by SmokeyDope and Herowl, you can now convert paths back to dirt by shift+right-clicking them with a shovel. + +### Formspec refactoring +Various GUI formspecs were updated in a massive rework by AFCMS to the newer version, as well as given new features. This includes survival and creative inventories (survival inventory got API allowing adding multiple tabs), as well as nodes like chests, furnaces, dispensers and hoppers. + +### Hopper reimplementation +Speaking of hoppers, our new contributor, Morik666, did an amazing job implementing a new API for hoppers, allowing to add various ways for other nodes to interact with the hoppers, including the nodes added by mods. + +### Pistons fixes +Pistons now work better thanks to seventeenthShulker, who fixed many bugs related to them. Sadly, even with these changes and the aforementioned hopper changes, not all mechanisms work as they should due to engine limitations that we are yet to make workarounds for. + +### Translations updated +* Brazilian Portuguese by Isaac Dennis +* Russian by ADLON & Sab Pyrope +* French by 3raven +* Spanish by megustanlosfrijoles + +### Other changes +* Texture names moving away from "`default_`" prefix – Liquid textures – by FossFanatic +* Cherry wood items fixes – by PrairieWind, 3raven, & MrRar +* Bamboo placing bug fixed – by seventeenthShulker +* Multishot enchantment fixed – by seventeenthShulker +* Missing textures added – by Wbjitscool +* Typo fixes – by pepebotella, Nicu, basxto, & mdk +* Villager trades update – by Alessandra Lozoya & Codiac +* Internal refactoring – by MrRar +* Banners' colors and texture adjustements – by VanicGame +* Copper crafting recipes fixes – by basxto & ThePython10110 +* Enchanting fixes – by Codiac & Araca +* Mob floating improvements – by Codiac +* Ruined portal spawn fix – by SmokeyDope +* Barrels sound fix – by SmokeyDope +* New settings added – by Eliy21 +* Trapdoors climbing update – by Dehydrate6684 +* Blast resistance fixes – by seventeenthShulker +* Documentation fixes – by Montandalar, mim, & the developer team +* Player eye height raising – by Dark +* Craft guide searching fix – by Araca +* Boat passenger fixes – by Eliy21 +* Duplication bug fixed – by Herowl +* Nodes now drop properly when tool breaks while digging – by Herowl +* Sleeping HUD – by chmodsayshello +* Pumpkin group – by rudzik8 +* Fixed /clear being unclear and dangerous – by Herowl +* Fixed players sometimes being stuck dead even on relog – by Eliy21 + +### Crashes fixed +* Unknown nodes and callbacks related crash – by MrRar +* Campfire and bamboo related crash – by Michieal +* Unknown nodes related crash – by pepebotella +* Minetest vector code related crash – by AncientMariner +* Waterlogged roots and kelp related crash – by Michieal + From 9a7e39654c67ff424861af535dc51c6a5464a5a8 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 5 Dec 2023 03:40:37 +0100 Subject: [PATCH 098/345] Minor credits update --- CREDITS.md | 1 - releasenotes/0_85-the_fire_and_stone_release.md | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CREDITS.md b/CREDITS.md index 3a651cc58..959cc36d7 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -119,7 +119,6 @@ * Morik666 * Eliy21 * mdk -* pepebotella * Alessandra Lozoya * VanicGame * ThePython10110 diff --git a/releasenotes/0_85-the_fire_and_stone_release.md b/releasenotes/0_85-the_fire_and_stone_release.md index 856bc7853..bd0fa4291 100644 --- a/releasenotes/0_85-the_fire_and_stone_release.md +++ b/releasenotes/0_85-the_fire_and_stone_release.md @@ -93,6 +93,9 @@ Pistons now work better thanks to seventeenthShulker, who fixed many bugs relate * Fixed /clear being unclear and dangerous – by Herowl * Fixed players sometimes being stuck dead even on relog – by Eliy21 +### Special thanks +* For extensive testing – to Michieal + ### Crashes fixed * Unknown nodes and callbacks related crash – by MrRar * Campfire and bamboo related crash – by Michieal From ca71e949a894c3f4e07d0d042dde5a6397513674 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Fri, 8 Dec 2023 23:20:52 +0100 Subject: [PATCH 099/345] Credits update --- CREDITS.md | 1 + mods/HUD/mcl_credits/people.lua | 2 +- releasenotes/0_85-the_fire_and_stone_release.md | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CREDITS.md b/CREDITS.md index 959cc36d7..27f52d249 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -126,6 +126,7 @@ * Montandalar * mim * Dark +* Bakawun ## Music * Jordach for the jukebox music compilation from Big Freaking Dig diff --git a/mods/HUD/mcl_credits/people.lua b/mods/HUD/mcl_credits/people.lua index d9e08ca37..448f99bda 100644 --- a/mods/HUD/mcl_credits/people.lua +++ b/mods/HUD/mcl_credits/people.lua @@ -121,7 +121,6 @@ return { "Morik666", "Eliy21", "mdk", - "pepebotella", "Alessandra Lozoya", "VanicGame", "ThePython10110", @@ -129,6 +128,7 @@ return { "Montandalar", "mim", "Dark", + "Bakawun", }}, {S("Music"), 0xA60014, { "Jordach for the jukebox music compilation from Big Freaking Dig", diff --git a/releasenotes/0_85-the_fire_and_stone_release.md b/releasenotes/0_85-the_fire_and_stone_release.md index bd0fa4291..3e45fee4e 100644 --- a/releasenotes/0_85-the_fire_and_stone_release.md +++ b/releasenotes/0_85-the_fire_and_stone_release.md @@ -24,6 +24,7 @@ * Isaac Dennis * ADLON * Sab Pyrope +* Bakawun ### Mobs improvements Creeper received some adjustments, should be smarter, but easier to avoid if you're quick. Axolotl on the other hand won't eat your sheep anymore. @@ -92,6 +93,8 @@ Pistons now work better thanks to seventeenthShulker, who fixed many bugs relate * Pumpkin group – by rudzik8 * Fixed /clear being unclear and dangerous – by Herowl * Fixed players sometimes being stuck dead even on relog – by Eliy21 +* Restricted access to the village builder tool to server privs - by Eliy21 +* Fixed horse equipment drops - by Bakawun ### Special thanks * For extensive testing – to Michieal From 3caa99a409714d0994c03abdb97fa73c822ec884 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sat, 9 Dec 2023 00:03:41 +0100 Subject: [PATCH 100/345] Post-release set version 0.86.0-SNAPSHOT --- game.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game.conf b/game.conf index 07f30eef5..2a48bbf15 100644 --- a/game.conf +++ b/game.conf @@ -1,4 +1,4 @@ title = MineClone 2 description = A survival sandbox game. Survive, gather, hunt, build, explore, and do much more. disallowed_mapgens = v6 -version=0.85.0 +version=0.86.0-SNAPSHOT From 02e7ff41d5d9720da223c32113c5acadf6bb1c55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Sat, 9 Dec 2023 23:42:32 -0600 Subject: [PATCH 101/345] Update mcl_fire.es.tr and fix syntax errors --- mods/ITEMS/mcl_fire/locale/mcl_fire.es.tr | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.es.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.es.tr index 6f36b293c..dfef491ab 100644 --- a/mods/ITEMS/mcl_fire/locale/mcl_fire.es.tr +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.es.tr @@ -1,17 +1,19 @@ # textdomain: mcl_fire Fire Charge=Carga de fuego -Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.=Las cargas de fuego son principalmente proyectiles que se pueden lanzar desde dispensadores, volarán en línea recta y estallarán en un incendio al impactar. Alternativamente, se pueden usar para encender incendios directamente. -Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.=Ponga la carga de fuego en un dispensador y suminístrele poder de redstone para lanzarlo. Para encender un fuego directamente, simplemente coloque la carga de fuego en el suelo, que la usa. +Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.=Las cargas de fuego son principalmente proyectiles que se pueden lanzar desde dispensadores, volarán en línea recta y estallarán en un incendio al impactar. Alternativamente, se pueden usar para encender fuegos directamente. +Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.=Ponga la carga de fuego en un dispensador y suminístrele poder de redstone para lanzarla. Para encender un fuego directamente, simplemente coloque la carga de fuego en el suelo, que la usa. Flint and Steel=Mechero -Flint and steel is a tool to start fires and ignite blocks.=El mechero es una herramienta para iniciar incendios y encender bloques. -Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.=Haga clic derecho en la superficie de un bloque para intentar encender un fuego frente a él o encender el bloque. Unos pocos bloques tienen una reacción única cuando se encienden. -Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=El fuego es un tipo de bloque dañino y destructivo pero de corta duración. Destruirá y se extenderá hacia bloques casi inflamables, pero el fuego desaparecerá cuando no quede nada para quemar. Se extinguirá por el agua y la lluvia cercanas. El fuego puede destruirse de manera segura golpeándolo, pero es doloroso si te paras directamente en él. Si se inicia un fuego por encima de la base o un bloque de magma, se convertirá inmediatamente en un fuego eterno. -Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=El fuego es un tipo de bloque dañino pero no destructivo de corta duración. Desaparecerá cuando no haya un bloque inflamable alrededor. El fuego no destruye bloques, al menos no en este mundo. Se extinguirá por el agua y la lluvia cercanas. El fuego puede destruirse de manera segura golpeándolo, pero es doloroso si te paras directamente en él. Si se inicia un fuego por encima de la base o un bloque de magma, se convertirá inmediatamente en un fuego eterno. +Flint and steel is a tool to start fires and ignite blocks.=El mechero es una herramienta para iniciar fuegos y encender bloques. +Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.=Haga clic derecho en la superficie de un bloque para intentar encender un fuego frente a él o encender el bloque. Algunos bloques tienen una reacción única cuando se encienden. +Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=El fuego es un tipo de bloque dañino y destructivo pero de corta duración. Destruirá y se extenderá hacia bloques inflamables cercanos, pero el fuego desaparecerá cuando no quede nada para quemar. Se extinguirá por agua cercana o lluvia. El fuego puede destruirse de manera segura golpeándolo, pero es doloroso si te paras directamente en él. Si se inicia un fuego por encima de un bloque de netherrack o magma, se convertirá inmediatamente en un fuego eterno. +Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=El fuego es un tipo de bloque dañino pero no destructivo de corta duración. Desaparecerá cuando no haya un bloque inflamable alrededor. El fuego no destruye bloques, al menos no en este mundo. Se extinguirá por el agua y la lluvia cercanas. El fuego puede destruirse de manera segura golpeándolo, pero es doloroso si te paras directamente en él. Si se inicia un fuego por encima de un bloque de netherrack o magma, se convertirá inmediatamente en un fuego eterno. Eternal fire is a damaging block that might create more fire. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=El fuego eterno es un bloque dañino que podría crear más fuego. Creará fuego alrededor cuando haya bloques inflamables cerca. El fuego eterno se puede extinguir con golpes y bloques de agua cercanos. Aparte del fuego (normal), el fuego eterno no se extingue por sí solo y también continúa ardiendo bajo la lluvia. Golpear el fuego eterno es seguro, pero duele si te paras dentro. Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=El fuego eterno es un bloque dañino. El fuego eterno se puede extinguir con golpes y bloques de agua cercanos. Aparte del fuego (normal), el fuego eterno no se extingue por sí solo y también continúa ardiendo bajo la lluvia. Golpear el fuego eterno es seguro, pero duele si te paras dentro. @1 has been cooked crisp.=@1 se ha cocinado crujientemente. @1 felt the burn.=@1 sintió la quemadura. @1 died in the flames.=@1 murió en las llamas. -@1 died in a fire.=@ 1 murió en un incendio. +@1 died in a fire.=@1 murió en un incendio. Fire=Fuego Eternal Fire=Fuego eterno +Dispenser projectile=Dispensador de proyectiles +Starts fires and ignites blocks=Provoca incendios y pone bloques en llamas From 1d2a7b35d89dc0c1a5b9f3111dccf7c9b06e55f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Sun, 10 Dec 2023 00:07:17 -0600 Subject: [PATCH 102/345] Update mcl_honey.es.tr --- mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr b/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr index 90382020a..fedf4ecc5 100644 --- a/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr +++ b/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr @@ -1,5 +1,6 @@ -Honeycomb=Bloque de panal -Used to craft beehives and protect copper blocks from further oxidation.=Se utiliza para fabricar apiarios de avejas y para proteger bloques de cobre +# textdomain: mcl_honey +Honeycomb=Panal +Used to craft beehives and protect copper blocks from further oxidation.=Se utiliza para fabricar apiarios de avejas y para proteger bloques de cobrede mayor oxidación. Use on copper blocks to prevent further oxidation.=Usa sobre bloques de cobre para evitar mayor oxidación. Honeycomb Block=Bloque de panal Honeycomb Block. Used as a decoration.=Bloque de panal. Se utiliza como decoración como decoración From 8dcb62aa56077408e5f9c2f7b6ac28106d74fe04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Sun, 10 Dec 2023 00:11:07 -0600 Subject: [PATCH 103/345] Fix a typo in mcl_honey.es.tr --- mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr b/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr index fedf4ecc5..bf87bf342 100644 --- a/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr +++ b/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr @@ -1,6 +1,6 @@ # textdomain: mcl_honey Honeycomb=Panal -Used to craft beehives and protect copper blocks from further oxidation.=Se utiliza para fabricar apiarios de avejas y para proteger bloques de cobrede mayor oxidación. +Used to craft beehives and protect copper blocks from further oxidation.=Se utiliza para fabricar apiarios de abejas y para proteger bloques de cobrede mayor oxidación. Use on copper blocks to prevent further oxidation.=Usa sobre bloques de cobre para evitar mayor oxidación. Honeycomb Block=Bloque de panal Honeycomb Block. Used as a decoration.=Bloque de panal. Se utiliza como decoración como decoración From 1ac65305d6c33f82a32da81a89d807691114a74e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Sun, 10 Dec 2023 00:13:40 -0600 Subject: [PATCH 104/345] Fix a typo in mcl_honey.es.tr --- mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr b/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr index bf87bf342..f22ae7702 100644 --- a/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr +++ b/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr @@ -1,6 +1,6 @@ # textdomain: mcl_honey Honeycomb=Panal -Used to craft beehives and protect copper blocks from further oxidation.=Se utiliza para fabricar apiarios de abejas y para proteger bloques de cobrede mayor oxidación. +Used to craft beehives and protect copper blocks from further oxidation.=Se utiliza para fabricar apiarios de abejas y para proteger bloques de cobre de mayor oxidación. Use on copper blocks to prevent further oxidation.=Usa sobre bloques de cobre para evitar mayor oxidación. Honeycomb Block=Bloque de panal Honeycomb Block. Used as a decoration.=Bloque de panal. Se utiliza como decoración como decoración From 19fd075a2f6e4a59e12671b6af8d2aa126a85505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Sun, 10 Dec 2023 01:16:43 -0600 Subject: [PATCH 105/345] Add the textdomain line in mcl_beehives.dk.tr This will remove the warning that is shown when running Wuzzy's Minetest_Translation_tools and will contribute to the issue 3540 --- mods/ITEMS/mcl_beehives/locale/mcl_beehives.dk.tr | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_beehives/locale/mcl_beehives.dk.tr b/mods/ITEMS/mcl_beehives/locale/mcl_beehives.dk.tr index 61510cbc1..a0596338a 100644 --- a/mods/ITEMS/mcl_beehives/locale/mcl_beehives.dk.tr +++ b/mods/ITEMS/mcl_beehives/locale/mcl_beehives.dk.tr @@ -1,4 +1,5 @@ +# textdomain: mcl_beehives Beehive=Bistade Artificial bee nest.=Kunstigt bibo. Bee Nest=Bibo -A naturally generating block that houses bees and a tasty treat...if you can get it.=En naturligt genereret blok som indeholde bier og velsmagende godter... hvis du kan få fat i dem. \ No newline at end of file +A naturally generating block that houses bees and a tasty treat...if you can get it.=En naturligt genereret blok som indeholde bier og velsmagende godter... hvis du kan få fat i dem. From a60540c17e079008fe675e5e2c5802be89592386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Sun, 10 Dec 2023 01:47:35 -0600 Subject: [PATCH 106/345] Remove a non empty translation in template file --- mods/ITEMS/mcl_armor/locale/template.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_armor/locale/template.txt b/mods/ITEMS/mcl_armor/locale/template.txt index 64318f41b..29d98f6b9 100644 --- a/mods/ITEMS/mcl_armor/locale/template.txt +++ b/mods/ITEMS/mcl_armor/locale/template.txt @@ -31,7 +31,7 @@ Elytra= Increases underwater mining speed.= Blast Protection= Reduces explosion damage and knockback.= -Curse of Binding=Malédiction du lien éternel +Curse of Binding= Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.= Feather Falling= Reduces fall damage.= @@ -48,4 +48,4 @@ Reflects some of the damage taken when hit, at the cost of reducing durability w Aqua Affinity= #Translations for armor trims -Smithing Template '@1'= \ No newline at end of file +Smithing Template '@1'= From 6dce3b4bc477a1deecac8af043426ad131ec97ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Sun, 10 Dec 2023 01:56:19 -0600 Subject: [PATCH 107/345] Remove whitespace-only translation in template file --- mods/PLAYER/mcl_skins/locale/template.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_skins/locale/template.txt b/mods/PLAYER/mcl_skins/locale/template.txt index c39d4066d..12ba740d5 100644 --- a/mods/PLAYER/mcl_skins/locale/template.txt +++ b/mods/PLAYER/mcl_skins/locale/template.txt @@ -10,5 +10,5 @@ Bottoms= Tops= Hairs= Headwears= -Open skin configuration screen.= -Select= \ No newline at end of file +Open skin configuration screen.= +Select= From cf70de0ecc944f4ca797a3d1091e2b5ed04aa366 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 10 Dec 2023 16:10:33 +0000 Subject: [PATCH 108/345] Add an on_attack callback for mobs (#4064) Added an on_attack callback that allows to execute additional custom logic after each attack. Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4064 Co-authored-by: the-real-herowl Co-committed-by: the-real-herowl --- mods/ENTITIES/mcl_mobs/combat.lua | 4 ++++ mods/ENTITIES/mcl_mobs/init.lua | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index 6b660c787..bb16eb71e 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -1252,5 +1252,9 @@ function mob_class:do_states_attack (dtime) self.attack_state(self, dtime) else + if self.on_attack then + self.on_attack(self, dtime) + end + end end diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 630548f12..b0fc73d6e 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -314,7 +314,8 @@ function mcl_mobs.register_mob(name, def) return self:mob_activate(staticdata, def, dtime) end, - attack_state = def.attack_state, + attack_state = def.attack_state, -- custom attack state + on_attack = def.on_attack, -- called after attack, useful with otherwise predefined attack states (not custom) harmed_by_heal = def.harmed_by_heal, is_boss = def.is_boss, dealt_effect = def.dealt_effect, From 8b00fff4cb7866ec9c780b670a9a88201bd70ffe Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 11 Dec 2023 00:37:18 +0100 Subject: [PATCH 109/345] Remove dangling else --- mods/ENTITIES/mcl_mobs/combat.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index bb16eb71e..4396f3265 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -1250,11 +1250,10 @@ function mob_class:do_states_attack (dtime) elseif self.attack_type == "custom" and self.attack_state then self.attack_state(self, dtime) - else + end if self.on_attack then self.on_attack(self, dtime) end - end end From 351e31a8893937946f7f4b756b20e1d69b9b6a43 Mon Sep 17 00:00:00 2001 From: Zasco Date: Tue, 12 Dec 2023 23:16:51 +0000 Subject: [PATCH 110/345] Move deepslate ore registration within generation check --- mods/MAPGEN/mcl_mapgen_core/ores.lua | 42 ++++++++++++++-------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/ores.lua b/mods/MAPGEN/mcl_mapgen_core/ores.lua index 403c0333d..3eeaefef8 100644 --- a/mods/MAPGEN/mcl_mapgen_core/ores.lua +++ b/mods/MAPGEN/mcl_mapgen_core/ores.lua @@ -128,27 +128,6 @@ minetest.register_ore({ }) -minetest.register_ore({ - ore_type = "blob", - ore = "mcl_deepslate:deepslate", - wherein = { "mcl_core:stone" }, - clust_scarcity = 200, - clust_num_ores = 100, - clust_size = 10, - y_min = deepslate_min, - y_max = deepslate_max, - noise_params = { - offset = 0, - scale = 1, - spread = { x = 250, y = 250, z = 250 }, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - } -}) - minetest.register_ore({ ore_type = "blob", ore = "mcl_deepslate:tuff", @@ -173,6 +152,27 @@ minetest.register_ore({ -- DEEPSLATE if minetest.settings:get_bool("mcl_generate_deepslate", true) then + minetest.register_ore({ + ore_type = "blob", + ore = "mcl_deepslate:deepslate", + wherein = { "mcl_core:stone" }, + clust_scarcity = 200, + clust_num_ores = 100, + clust_size = 10, + y_min = deepslate_min, + y_max = deepslate_max, + noise_params = { + offset = 0, + scale = 1, + spread = { x = 250, y = 250, z = 250 }, + seed = 12345, + octaves = 3, + persist = 0.6, + lacunarity = 2, + flags = "defaults", + } + }) + minetest.register_ore({ ore_type = "scatter", ore = "mcl_deepslate:infested_deepslate", From e6ddc03d3c87bd99571d1494b90f301b7ee7d51c Mon Sep 17 00:00:00 2001 From: Bakawun Date: Tue, 7 Nov 2023 17:18:21 +0000 Subject: [PATCH 111/345] Shulker: lower shoot interval to 1 second In this video we can see the shulkers are shooting at a rate of once per second. https://youtube.com/shorts/8tUFaSZ4b7I?si=sszp4cnyXR4dXg9B The wiki confirms this but mentions a range of 1 to 5.5 seconds. I think this range is caused by the shulker closing and stopping shots for a few seconds but no longer than the max interval of 5.5 https://minecraft.fandom.com/wiki/Shulker#:~:text=The%20shulker%20continues%20firing%20every,unaffected%20by%20Levitation%20when%20hit --- mods/ENTITIES/mobs_mc/shulker.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index ecf60debd..62be949f3 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -35,7 +35,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { type = "monster", spawn_class = "hostile", attack_type = "shoot", - shoot_interval = 0.5, + shoot_interval = 1.0, arrow = "mobs_mc:shulkerbullet", shoot_offset = 0.5, passive = false, From 8d34ff2a9a222338624c3f61f563786e9ee000d3 Mon Sep 17 00:00:00 2001 From: Bakawun Date: Mon, 13 Nov 2023 15:13:52 +0000 Subject: [PATCH 112/345] Shulker: Make shulker peek periodically Adjust walk and animation settings so the shulker peeks out randomly. --- mods/ENTITIES/mobs_mc/shulker.lua | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 62be949f3..b468be175 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -51,7 +51,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { -- TODO: sounds -- TODO: Make shulker dye-able visual_size = {x=3, y=3}, - walk_chance = 0, + walk_chance = 10, knock_back = false, jump = false, can_despawn = false, @@ -65,15 +65,17 @@ mcl_mobs.register_mob("mobs_mc:shulker", { looting_factor = 0.0625}, }, animation = { - stand_speed = 25, walk_speed = 0, run_speed = 50, punch_speed = 25, + stand_speed = 25, walk_speed = 25, run_speed = 50, punch_speed = 25, speed_normal = 25, speed_run = 50, stand_start = 0, stand_end = 25, - walk_start = 25, walk_end = 45, - run_start = 45, run_end = 85, + walk_start = 65, walk_end = 65, + run_start = 65, run_end = 85, punch_start = 80, punch_end = 100, }, view_range = 16, fear_height = 0, + walk_velocity = 0, + run_velocity = 0, noyaw = true, do_custom = function(self,dtime) local pos = self.object:get_pos() @@ -81,10 +83,6 @@ mcl_mobs.register_mob("mobs_mc:shulker", { self.object:set_yaw(0) mcl_mobs:yaw(self, 0, 0, dtime) end - if self.state == "walk" or self.state == "stand" then - self.state = "stand" - self:set_animation("stand") - end if self.state == "attack" then self:set_animation("punch") end From 26cfdf0b7cb2d1915bb11406883fabbf0c405951 Mon Sep 17 00:00:00 2001 From: Bakawun Date: Tue, 14 Nov 2023 10:52:09 +0000 Subject: [PATCH 113/345] Shulker: randomize shoot interval Randomize shoot interval to between 1 and 5.5 seconds and set default shoot interval to 5.5 --- mods/ENTITIES/mobs_mc/shulker.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index b468be175..f1c723d01 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -35,7 +35,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { type = "monster", spawn_class = "hostile", attack_type = "shoot", - shoot_interval = 1.0, + shoot_interval = 5.5, arrow = "mobs_mc:shulkerbullet", shoot_offset = 0.5, passive = false, @@ -79,6 +79,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { noyaw = true, do_custom = function(self,dtime) local pos = self.object:get_pos() + self.shoot_interval = math.random(1, 5.5) if math.floor(self.object:get_yaw()) ~=0 then self.object:set_yaw(0) mcl_mobs:yaw(self, 0, 0, dtime) From b02a3deec7b59b3f27581669820121a612b31ccf Mon Sep 17 00:00:00 2001 From: Bakawun Date: Tue, 14 Nov 2023 13:57:56 +0000 Subject: [PATCH 114/345] Shulker; fix attack open animation, improve peek --- mods/ENTITIES/mobs_mc/shulker.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index f1c723d01..d1137cfe3 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -68,8 +68,10 @@ mcl_mobs.register_mob("mobs_mc:shulker", { stand_speed = 25, walk_speed = 25, run_speed = 50, punch_speed = 25, speed_normal = 25, speed_run = 50, stand_start = 0, stand_end = 25, - walk_start = 65, walk_end = 65, + walk_start = 45, walk_end = 65, + walk_loop = false, run_start = 65, run_end = 85, + run_loop punch_start = 80, punch_end = 100, }, view_range = 16, @@ -85,7 +87,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { mcl_mobs:yaw(self, 0, 0, dtime) end if self.state == "attack" then - self:set_animation("punch") + self:set_animation("run") end self.path.way = false self.look_at_players = false From b4511fb8c70d4f8542c0bdc37b663abf383bee33 Mon Sep 17 00:00:00 2001 From: Bakawun Date: Tue, 14 Nov 2023 14:47:24 +0000 Subject: [PATCH 115/345] Shulker, add missing false statement --- mods/ENTITIES/mobs_mc/shulker.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index d1137cfe3..2b29fdcd6 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -71,7 +71,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { walk_start = 45, walk_end = 65, walk_loop = false, run_start = 65, run_end = 85, - run_loop + run_loop = false, punch_start = 80, punch_end = 100, }, view_range = 16, From f5079f15680583a824bca0d4a069af5321780343 Mon Sep 17 00:00:00 2001 From: cora Date: Wed, 15 Nov 2023 18:59:46 +0100 Subject: [PATCH 116/345] Add an option for mob arrows to be "homing" --- mods/ENTITIES/mcl_mobs/combat.lua | 3 +++ mods/ENTITIES/mcl_mobs/init.lua | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index 4396f3265..c7f8d3e84 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -1231,6 +1231,9 @@ function mob_class:do_states_attack (dtime) -- important for mcl_shields ent._shooter = self.object ent._saved_shooter_pos = self.object:get_pos() + if ent.homing then + ent._target = self.attack + end end local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5 diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index b0fc73d6e..69bd7ebf4 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -350,6 +350,7 @@ function mcl_mobs.register_arrow(name, def) hit_node = def.hit_node, hit_mob = def.hit_mob, hit_object = def.hit_object, + homing = def.homing, drop = def.drop or false, -- drops arrow as registered item when true collisionbox = {0, 0, 0, 0, 0, 0}, -- remove box around arrows timer = 0, @@ -422,6 +423,17 @@ function mcl_mobs.register_arrow(name, def) end end + if self.homing and self._target then + local p = self._target:get_pos() + if p then + if minetest.line_of_sight(self.object:get_pos(), p) then + self.object:set_velocity(vector.direction(self.object:get_pos(), p) * self.velocity) + end + else + self.target = nil + end + end + if self.hit_player or self.hit_mob or self.hit_object then for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do From 58bb26a7eff8d3055af6e5fbc735dbc610c82f8b Mon Sep 17 00:00:00 2001 From: cora Date: Wed, 15 Nov 2023 19:00:01 +0100 Subject: [PATCH 117/345] Make shulker bullets homing --- mods/ENTITIES/mobs_mc/shulker.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 2b29fdcd6..95ca7df1a 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -158,7 +158,7 @@ mcl_mobs.register_arrow("mobs_mc:shulkerbullet", { visual_size = {x = 0.25, y = 0.25}, textures = {"mobs_mc_shulkerbullet.png"}, velocity = 6, - + homing = true, hit_player = function(self, player) player:punch(self.object, 1.0, { full_punch_interval = 1.0, From 55fe71d73b4d29b2c3dd5808b47212e3d090178e Mon Sep 17 00:00:00 2001 From: cora Date: Thu, 26 Oct 2023 21:32:50 +0200 Subject: [PATCH 118/345] Add a get_arrow_hit_func function to mcl_mobs reason for this is that player:punch used by most mobs ignores armor worn by player --- mods/ENTITIES/mcl_mobs/init.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 69bd7ebf4..cd79fed6f 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -334,6 +334,13 @@ function mcl_mobs.register_mob(name, def) end -- END mcl_mobs.register_mob function +function mcl_mobs.get_arrow_damage_func(damage, typ) + local typ = mcl_damage.types[typ] and typ or "arrow" + return function(projectile, object) + return mcl_util.deal_damage(object, damage, {type = typ}) + end +end + -- register arrow for shoot attack function mcl_mobs.register_arrow(name, def) From cf51c60527acdf9a9583f4cd48698fe700326369 Mon Sep 17 00:00:00 2001 From: cora Date: Thu, 26 Oct 2023 21:35:13 +0200 Subject: [PATCH 119/345] Fix shulker bullets ignoring armor --- mods/ENTITIES/mobs_mc/shulker.lua | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 95ca7df1a..bbc7eb0dc 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -159,25 +159,10 @@ mcl_mobs.register_arrow("mobs_mc:shulkerbullet", { textures = {"mobs_mc_shulkerbullet.png"}, velocity = 6, homing = true, - hit_player = function(self, player) - player:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = 4}, - }, nil) - end, - - hit_mob = function(self, mob) - mob:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = 4}, - }, nil) - end, - - hit_node = function(self, pos, node) - end + hit_player = mcl_mobs.get_arrow_damage_func(4), + hit_mob = mcl_mobs.get_arrow_damage_func(4), }) - mcl_mobs.register_egg("mobs_mc:shulker", S("Shulker"), "#946694", "#4d3852", 0) mcl_mobs:non_spawn_specific("mobs_mc:shulker","overworld",0,minetest.LIGHT_MAX+1) --[[ From 789c9a9a6d2cc73274584ff60d1610d41c18deb2 Mon Sep 17 00:00:00 2001 From: bakawun Date: Thu, 16 Nov 2023 11:21:25 +0100 Subject: [PATCH 120/345] Shulker: make bullet speed match mc speed is 5 according to https://www.gmbinder.com/share/-MelLRYIg8yCfuAqQ82g#:~:text=After%20doing%20some%20experimentation%20I,~5%20blocks%2Fsecond). --- mods/ENTITIES/mobs_mc/shulker.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index bbc7eb0dc..ed0732001 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -157,7 +157,7 @@ mcl_mobs.register_arrow("mobs_mc:shulkerbullet", { visual = "sprite", visual_size = {x = 0.25, y = 0.25}, textures = {"mobs_mc_shulkerbullet.png"}, - velocity = 6, + velocity = 5, homing = true, hit_player = mcl_mobs.get_arrow_damage_func(4), hit_mob = mcl_mobs.get_arrow_damage_func(4), From 686646b86d1d37826957e7b6a2e8849b391f91df Mon Sep 17 00:00:00 2001 From: bakawun Date: Thu, 16 Nov 2023 18:27:54 +0100 Subject: [PATCH 121/345] Shulker: align armor value with mc and set it to 0 when opened --- mods/ENTITIES/mobs_mc/shulker.lua | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index ed0732001..1b25dd53b 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -43,7 +43,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { hp_max = 30, xp_min = 5, xp_max = 5, - armor = 150, + armor = 20, collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.99, 0.5}, visual = "mesh", mesh = "mobs_mc_shulker.b3d", @@ -77,7 +77,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { view_range = 16, fear_height = 0, walk_velocity = 0, - run_velocity = 0, + run_velocity = 0, noyaw = true, do_custom = function(self,dtime) local pos = self.object:get_pos() @@ -88,6 +88,11 @@ mcl_mobs.register_mob("mobs_mc:shulker", { end if self.state == "attack" then self:set_animation("run") + self:armor = 0 + if self.state == "stand" then + self.armor = 20 + if self.state == "walk" or self.state == "run" then + self.armor = 0 end self.path.way = false self.look_at_players = false From 69903aa4eccb1700fc9881e15680b115b3a2b607 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sat, 25 Nov 2023 02:55:06 +0100 Subject: [PATCH 122/345] Fixed crashes --- mods/ENTITIES/mobs_mc/shulker.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 1b25dd53b..136652548 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -88,10 +88,10 @@ mcl_mobs.register_mob("mobs_mc:shulker", { end if self.state == "attack" then self:set_animation("run") - self:armor = 0 - if self.state == "stand" then + self.armor = 0 + elseif self.state == "stand" then self.armor = 20 - if self.state == "walk" or self.state == "run" then + elseif self.state == "walk" or self.state == "run" then self.armor = 0 end self.path.way = false From bc101314df221c61334fe2990d78c1a8c83018c5 Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 11 Dec 2023 09:36:03 +0100 Subject: [PATCH 123/345] mobs:shulker:use on_attack to set shoot interval to between 1 and 6 seconds --- mods/ENTITIES/mobs_mc/shulker.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 136652548..78959b717 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -35,7 +35,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { type = "monster", spawn_class = "hostile", attack_type = "shoot", - shoot_interval = 5.5, + shoot_interval = 6, arrow = "mobs_mc:shulkerbullet", shoot_offset = 0.5, passive = false, @@ -81,7 +81,6 @@ mcl_mobs.register_mob("mobs_mc:shulker", { noyaw = true, do_custom = function(self,dtime) local pos = self.object:get_pos() - self.shoot_interval = math.random(1, 5.5) if math.floor(self.object:get_yaw()) ~=0 then self.object:set_yaw(0) mcl_mobs:yaw(self, 0, 0, dtime) @@ -155,6 +154,9 @@ mcl_mobs.register_mob("mobs_mc:shulker", { end end end, + on_attack = function(self, dtime) + self.shoot_interval = math.random(1, 6) + end, }) -- bullet arrow (weapon) From 07eb70e9be2201da20424265a543ddbf0826cfe3 Mon Sep 17 00:00:00 2001 From: Wbjitscool Date: Wed, 13 Dec 2023 02:39:25 +0000 Subject: [PATCH 124/345] Update mods/ITEMS/mcl_stonecutter/init.lua --- mods/ITEMS/mcl_stonecutter/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 5edf424da..9284d2a9c 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -392,7 +392,7 @@ minetest.register_node("mcl_stonecutter:stonecutter", { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 1 + length = 0.15 } } }, From ed205190e439c573a291d2f7acc9973d6ff0e84a Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Wed, 13 Dec 2023 04:10:01 +0100 Subject: [PATCH 125/345] Nerfed slime and magma cube attack range --- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 321a9c1ce..61e653781 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -197,7 +197,7 @@ local slime_big = { distance = 16, }, damage = 4, - reach = 3, + reach = 2.5, armor = 100, drops = {}, -- TODO: Fix animations @@ -238,7 +238,7 @@ slime_small.xp_max = 2 slime_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51} slime_small.visual_size = {x=6.25, y=6.25} slime_small.damage = 3 -slime_small.reach = 2.75 +slime_small.reach = 2.25 slime_small.walk_velocity = 1.8 slime_small.run_velocity = 1.8 slime_small.jump_height = 4.3 @@ -254,8 +254,8 @@ slime_tiny.xp_min = 1 slime_tiny.xp_max = 1 slime_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505} slime_tiny.visual_size = {x=3.125, y=3.125} -slime_tiny.damage = 0 -slime_tiny.reach = 2.5 +slime_tiny.damage = 1 +slime_tiny.reach = 2 slime_tiny.drops = { -- slimeball {name = "mcl_mobitems:slimeball", @@ -418,7 +418,7 @@ local magma_cube_big = { walk_velocity = 2.5, run_velocity = 2.5, damage = 6, - reach = 3, + reach = 2.35, armor = 53, drops = { {name = "mcl_mobitems:magma_cream", @@ -466,7 +466,7 @@ magma_cube_small.xp_max = 2 magma_cube_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51} magma_cube_small.visual_size = {x=6.25, y=6.25} magma_cube_small.damage = 3 -magma_cube_small.reach = 2.75 +magma_cube_small.reach = 2.1 magma_cube_small.walk_velocity = .8 magma_cube_small.run_velocity = 2.0 magma_cube_small.jump_height = 6 @@ -491,7 +491,7 @@ magma_cube_tiny.walk_velocity = 1.02 magma_cube_tiny.run_velocity = 1.02 magma_cube_tiny.jump_height = 4 magma_cube_tiny.damage = 3 -magma_cube_tiny.reach = 2.5 +magma_cube_tiny.reach = 2 magma_cube_tiny.armor = 50 magma_cube_tiny.drops = {} magma_cube_tiny.spawn_small_alternative = nil From a2c8d13f04391136b94c17abded46332065f96f0 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Wed, 13 Dec 2023 04:51:56 +0100 Subject: [PATCH 126/345] Nerfed vexes and evokers --- mods/ENTITIES/mobs_mc/vex.lua | 6 +++++- mods/ENTITIES/mobs_mc/villager_evoker.lua | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/vex.lua b/mods/ENTITIES/mobs_mc/vex.lua index fbb33804d..cedbc59ad 100644 --- a/mods/ENTITIES/mobs_mc/vex.lua +++ b/mods/ENTITIES/mobs_mc/vex.lua @@ -37,6 +37,7 @@ mcl_mobs.register_mob("mobs_mc:vex", { walk_velocity = 3.2, run_velocity = 5.9, attack_type = "dogfight", + attack_frequency = 2, sounds = { -- TODO: random death = "mobs_mc_vex_death", @@ -63,10 +64,13 @@ mcl_mobs.register_mob("mobs_mc:vex", { self.object:set_properties({textures=self.base_texture}) end else + if self.base_texture[2] == "mobs_mc_vex_charging.png" then + self.base_texture[2] = "mobs_mc_vex.png" + end if self.base_texture[1] ~= "default_tool_steelsword.png" then self.base_texture[1] = "default_tool_steelsword.png" - self.object:set_properties({textures=self.base_texture}) end + self.object:set_properties({textures=self.base_texture}) end -- Take constant damage if the vex' life clock ran out diff --git a/mods/ENTITIES/mobs_mc/villager_evoker.lua b/mods/ENTITIES/mobs_mc/villager_evoker.lua index a34f0ffe9..9d465c25d 100644 --- a/mods/ENTITIES/mobs_mc/villager_evoker.lua +++ b/mods/ENTITIES/mobs_mc/villager_evoker.lua @@ -42,6 +42,7 @@ mcl_mobs.register_mob("mobs_mc:evoker", { run_velocity = 1.4, group_attack = true, attack_type = "dogfight", + attack_frequency = 15, -- Summon vexes custom_attack = function(self, to_attack) if not spawned_vexes[self] then spawned_vexes[self] = {} end @@ -64,7 +65,6 @@ mcl_mobs.register_mob("mobs_mc:evoker", { table.insert(spawned_vexes[self],ent) end end, - shoot_interval = 15, passive = false, drops = { {name = "mcl_core:emerald", @@ -86,6 +86,11 @@ mcl_mobs.register_mob("mobs_mc:evoker", { }, view_range = 16, fear_height = 4, + + on_spawn = function(self) + self.timer = 15 + return true + end, }) -- spawn eggs From ebd733be829ca7b3b447158c018d30cad12c6735 Mon Sep 17 00:00:00 2001 From: Wbjitscool Date: Wed, 13 Dec 2023 05:22:41 +0000 Subject: [PATCH 127/345] update's the campfire's fire burning animation to make it look better (#4077) improve the look of the campfire's flame/burning animation Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4077 Reviewed-by: the-real-herowl Co-authored-by: Wbjitscool Co-committed-by: Wbjitscool --- mods/ITEMS/mcl_campfires/api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index cd23a964b..4c1ddc758 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -282,7 +282,7 @@ function mcl_campfires.register_campfire(name, def) type="vertical_frames", aspect_w=32, aspect_h=16, - length=2.0 + length=0.8 }} }, overlay_tiles = { From a8806fe04e580eabbdbe583fb27c786c07cf028e Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Wed, 13 Dec 2023 17:34:42 +0000 Subject: [PATCH 128/345] Add player invulnerability & fix not continuously damaging players when holding the attack key Player invulnerability is the same as Minecraft's Damage Immunity https://minecraft.wiki/w/Damage#Immunity The old code for some reason only allows a few damage by holding and does not continuously damage other players after a few hits --- mods/PLAYER/mcl_playerplus/init.lua | 42 ++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 6cfb15bad..ed72a43b4 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -663,6 +663,8 @@ minetest.register_on_joinplayer(function(player) lastPos = nil, swimDistance = 0, jump_cooldown = -1, -- Cooldown timer for jumping, we need this to prevent the jump exhaustion to increase rapidly + last_damage = 0, + invul_timestamp = 0, } mcl_playerplus.elytra[player] = {active = false, rocketing = 0, speed = 0} @@ -727,19 +729,35 @@ mcl_damage.register_modifier(function(obj, damage, reason) end end, -200) --- damage invulnerability -mcl_damage.register_modifier(function(obj, damage, reason) - local invul = obj:get_meta():get_int("mcl_damage:invulnerable") - if invul > 0 then - return 0 - else - obj:get_meta():set_int("mcl_damage:invulnerable", 1) - minetest.after(0.5, function() - obj:get_meta():set_int("mcl_damage:invulnerable", 0) - end) - return damage +minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage) + -- damage invulnerability + if hitter then + local name = player:get_player_name() + local time_now = minetest.get_us_time() + local invul_timestamp = mcl_playerplus_internal[name].invul_timestamp + local time_diff = time_now - invul_timestamp + -- check for invulnerability time in microseconds (0.5 second) + if time_diff <= 500000 and time_diff >= 0 then + damage = damage - mcl_playerplus_internal[name].last_damage + if damage < 0 then + damage = 0 + end + return damage + else + mcl_playerplus_internal[name].last_damage = damage + mcl_playerplus_internal[name].invul_timestamp = time_now + end end -end, -1000) + -- attack reach limit + if hitter and hitter:is_player() then + local player_pos = player:get_pos() + local hitter_pos = hitter:get_pos() + if vector.distance(player_pos, hitter_pos) > 3 then + damage = 0 + return damage + end + end +end) minetest.register_on_respawnplayer(function(player) local pos = player:get_pos() From a8c2d4534a6b52c5cbee876c1d02d6d8c164814c Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Wed, 13 Dec 2023 17:42:42 +0000 Subject: [PATCH 129/345] Nerf long pvp enchanted knockbacks especially when running --- mods/ITEMS/mcl_enchanting/enchantments.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index c6436339c..6070efda9 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -278,12 +278,15 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end if hitter and hitter:is_player() then local wielditem = hitter:get_wielded_item() - knockback = knockback + 5 * mcl_enchanting.get_enchantment(wielditem, "knockback") + knockback = knockback + 6 * mcl_enchanting.get_enchantment(wielditem, "knockback") -- add player velocity to knockback + local v = player:get_velocity() local hv = hitter:get_velocity() local dir_dot = (hv.x * dir.x) + (hv.z * dir.z) - if dir_dot > 0 then - knockback = knockback + dir_dot * 2 + local hitter_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) + local player_mag = math.sqrt((v.x * v.x) + (v.z * v.z)) + if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then + knockback = knockback + hitter_mag * 0.0625 end elseif luaentity and luaentity._knockback then local kb = knockback + luaentity._knockback / 4 From 96aaf89036b3994787f75642ca49c3f6a85b4b6d Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Wed, 13 Dec 2023 18:49:08 +0000 Subject: [PATCH 130/345] Readjust pvp enchant knockback to make the running knockback difference more pronounced --- mods/ITEMS/mcl_enchanting/enchantments.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 6070efda9..44db05fe3 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -278,7 +278,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end if hitter and hitter:is_player() then local wielditem = hitter:get_wielded_item() - knockback = knockback + 6 * mcl_enchanting.get_enchantment(wielditem, "knockback") + knockback = knockback + 5 * mcl_enchanting.get_enchantment(wielditem, "knockback") -- add player velocity to knockback local v = player:get_velocity() local hv = hitter:get_velocity() @@ -286,7 +286,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool local hitter_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) local player_mag = math.sqrt((v.x * v.x) + (v.z * v.z)) if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then - knockback = knockback + hitter_mag * 0.0625 + knockback = knockback + hitter_mag * 0.375 end elseif luaentity and luaentity._knockback then local kb = knockback + luaentity._knockback / 4 From b0e33793ec5b1e7a48cfc6713d6f10235f1e24d6 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Wed, 13 Dec 2023 20:04:15 +0000 Subject: [PATCH 131/345] Fix a potential bug that could bypass attack reach limit when a stronger attack breaches the invul --- mods/PLAYER/mcl_playerplus/init.lua | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index ed72a43b4..83ea1a1aa 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -730,6 +730,15 @@ mcl_damage.register_modifier(function(obj, damage, reason) end, -200) minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage) + -- attack reach limit + if hitter and hitter:is_player() then + local player_pos = player:get_pos() + local hitter_pos = hitter:get_pos() + if vector.distance(player_pos, hitter_pos) > 3 then + damage = 0 + return damage + end + end -- damage invulnerability if hitter then local name = player:get_player_name() @@ -748,15 +757,6 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, mcl_playerplus_internal[name].invul_timestamp = time_now end end - -- attack reach limit - if hitter and hitter:is_player() then - local player_pos = player:get_pos() - local hitter_pos = hitter:get_pos() - if vector.distance(player_pos, hitter_pos) > 3 then - damage = 0 - return damage - end - end end) minetest.register_on_respawnplayer(function(player) From 2b71462c1e3e983bb4f1a27c2a0afd2a4994ea7e Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Wed, 13 Dec 2023 20:36:54 +0000 Subject: [PATCH 132/345] Prevent knockback if player is beyond attack reach limit --- mods/ITEMS/mcl_enchanting/enchantments.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 44db05fe3..23145c176 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -276,7 +276,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if hitter then luaentity = hitter:get_luaentity() end - if hitter and hitter:is_player() then + if hitter and hitter:is_player() and distance <= 3 then local wielditem = hitter:get_wielded_item() knockback = knockback + 5 * mcl_enchanting.get_enchantment(wielditem, "knockback") -- add player velocity to knockback @@ -288,6 +288,8 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then knockback = knockback + hitter_mag * 0.375 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 From 85b1f5247a691f56201a452db31e0705d6d84e4a Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 14 Dec 2023 07:46:16 +0000 Subject: [PATCH 133/345] Add vertical lift & minimum pvp knockback --- mods/ITEMS/mcl_enchanting/enchantments.lua | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 23145c176..741621f22 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -279,8 +279,20 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if hitter and hitter:is_player() and distance <= 3 then local wielditem = hitter:get_wielded_item() knockback = knockback + 5 * mcl_enchanting.get_enchantment(wielditem, "knockback") - -- add player velocity to knockback + -- add vertical lift to knockback local v = player:get_velocity() + if v and v.y <= 0.1 and v.y >= -0.1 and dir.y <= 0.44 then + player:add_velocity({ + x = 0, + y = 4.5, + z = 0 + }) + -- add minimum knockback + if knockback <= 1.5 then + knockback = knockback + 6 + end + end + -- add player velocity to knockback 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)) From b2507c36407237f225d4bab47db34ab04da01c0c Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 14 Dec 2023 08:12:13 +0000 Subject: [PATCH 134/345] Make fire aspect enchant respect attack reach limit --- mods/ITEMS/mcl_enchanting/enchantments.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 741621f22..399081d00 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -133,7 +133,11 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, if wielditem then local fire_aspect_level = mcl_enchanting.get_enchantment(wielditem, "fire_aspect") if fire_aspect_level > 0 then - mcl_burning.set_on_fire(player, fire_aspect_level * 4) + 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 From ed507d8509caae7dcda9f01bde756ba3c9e10cb6 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 14 Dec 2023 08:15:55 +0000 Subject: [PATCH 135/345] Remove unnecessary space in the attack reach limit on mobs code --- mods/ENTITIES/mcl_mobs/combat.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index 4396f3265..5135aff7b 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -522,7 +522,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) if is_player then -- is mob out of reach? - if vector.distance(mob_pos, player_pos) > 3 then + if vector.distance(mob_pos, player_pos) > 3 then return end -- is mob protected? From 49af5d2013b1330649394d3f302b648df5d05073 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 14 Dec 2023 08:51:34 +0000 Subject: [PATCH 136/345] Rebalance minimum pvp knockback to account for added knockbacks when moving --- mods/ITEMS/mcl_enchanting/enchantments.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 399081d00..34d4c1930 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -293,7 +293,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool }) -- add minimum knockback if knockback <= 1.5 then - knockback = knockback + 6 + knockback = knockback + 4.5 end end -- add player velocity to knockback From bf9e487fa9fab03579bafc2b60442773d946f3e3 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 14 Dec 2023 09:27:28 +0000 Subject: [PATCH 137/345] Adjust minimum pvp knockback to be closer to MC --- mods/ITEMS/mcl_enchanting/enchantments.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 34d4c1930..12172ea3e 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -293,7 +293,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool }) -- add minimum knockback if knockback <= 1.5 then - knockback = knockback + 4.5 + knockback = knockback + 4.875 end end -- add player velocity to knockback From 6b439fd1dedba5ff4c62e880846dd407dcf1bf47 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 14 Dec 2023 11:57:55 +0000 Subject: [PATCH 138/345] Add maximum pvp knockback limit & approximate enchant knockback distance to be similar to MC --- mods/ITEMS/mcl_enchanting/enchantments.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 12172ea3e..a9fd40714 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -282,7 +282,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end if hitter and hitter:is_player() and distance <= 3 then local wielditem = hitter:get_wielded_item() - knockback = knockback + 5 * mcl_enchanting.get_enchantment(wielditem, "knockback") + knockback = knockback + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") -- add vertical lift to knockback local v = player:get_velocity() if v and v.y <= 0.1 and v.y >= -0.1 and dir.y <= 0.44 then @@ -304,6 +304,10 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then knockback = knockback + hitter_mag * 0.375 end + -- add maximum knockback limit + if knockback > 12.875 then + knockback = 12.875 + end elseif hitter and hitter:is_player() and distance > 3 then knockback = 0 elseif luaentity and luaentity._knockback then From cee5bbc206e507eca4cf36fab0240eb000fc469d Mon Sep 17 00:00:00 2001 From: bakawun Date: Thu, 14 Dec 2023 16:50:23 +0100 Subject: [PATCH 139/345] mobs:fix typo in homing function --- mods/ENTITIES/mcl_mobs/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index cd79fed6f..f4322bd31 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -437,7 +437,7 @@ function mcl_mobs.register_arrow(name, def) self.object:set_velocity(vector.direction(self.object:get_pos(), p) * self.velocity) end else - self.target = nil + self._target = nil end end From ae169b2814e1746ef81f5f6bb0d1abbd6b6598ed Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 03:09:48 +0000 Subject: [PATCH 140/345] Add fix to crash when moving bought villager trade item to empty sell slot bug by JoseDouglas26 (#4079) Add fix to #4062 by JoseDouglas26 https://git.minetest.land/MineClone2/MineClone2/issues/4062#issuecomment-74045 Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4079 Reviewed-by: the-real-herowl Co-authored-by: Eliy21 Co-committed-by: Eliy21 --- mods/ENTITIES/mobs_mc/villager.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index cb421b78b..9f1daf53d 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -1941,6 +1941,7 @@ local trade_inventory = { if not wanted2:is_empty() then inv:remove_item("input", inv:get_stack("wanted", 2)) end + local name = player:get_player_name() local trader = player_trading_with[name] minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name(),object=trader.object}, true) end From 60367cdbe043e5afeb1ee092e2a55bec1d497272 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 15:42:49 +0000 Subject: [PATCH 141/345] Revert unreliable bugfix There are times when the continuous damage when punching players does not happen so will not fix at the moment as using other weapons does still work. --- mods/PLAYER/mcl_playerplus/init.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 83ea1a1aa..99230bf9a 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -664,7 +664,6 @@ minetest.register_on_joinplayer(function(player) swimDistance = 0, jump_cooldown = -1, -- Cooldown timer for jumping, we need this to prevent the jump exhaustion to increase rapidly last_damage = 0, - invul_timestamp = 0, } mcl_playerplus.elytra[player] = {active = false, rocketing = 0, speed = 0} @@ -742,11 +741,9 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, -- damage invulnerability if hitter then local name = player:get_player_name() - local time_now = minetest.get_us_time() - local invul_timestamp = mcl_playerplus_internal[name].invul_timestamp - local time_diff = time_now - invul_timestamp - -- check for invulnerability time in microseconds (0.5 second) - if time_diff <= 500000 and time_diff >= 0 then + -- check for invulnerability time for 0.5 second + local invul = player:get_meta():get_int("mcl_damage:invulnerable") + if invul > 0 then damage = damage - mcl_playerplus_internal[name].last_damage if damage < 0 then damage = 0 @@ -754,7 +751,10 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, return damage else mcl_playerplus_internal[name].last_damage = damage - mcl_playerplus_internal[name].invul_timestamp = time_now + player:get_meta():set_int("mcl_damage:invulnerable", 1) + minetest.after(0.5, function() + player:get_meta():set_int("mcl_damage:invulnerable", 0) + end) end end end) From ca556c052ff46d3c4856c26ba57fcbf90bd1adff Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 15:52:26 +0000 Subject: [PATCH 142/345] Prevent pvp knockbacks when invulnerable --- mods/ITEMS/mcl_enchanting/enchantments.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index a9fd40714..5f3971f60 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -285,7 +285,8 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool knockback = knockback + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") -- add vertical lift to knockback local v = player:get_velocity() - if v and v.y <= 0.1 and v.y >= -0.1 and dir.y <= 0.44 then + local invul = player:get_meta():get_int("mcl_damage:invulnerable") + if v and v.y <= 0.1 and v.y >= -0.1 and dir.y <= 0.44 and invul == 0 then player:add_velocity({ x = 0, y = 4.5, @@ -308,6 +309,10 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if knockback > 12.875 then knockback = 12.875 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 From 8e2c5249f54d677a14eae674d8fd7682b1973ac6 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 15:59:08 +0000 Subject: [PATCH 143/345] Fix comment on player invul code --- mods/PLAYER/mcl_playerplus/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 99230bf9a..27eec4845 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -741,7 +741,7 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, -- damage invulnerability if hitter then local name = player:get_player_name() - -- check for invulnerability time for 0.5 second + -- check for invulnerability time (0.5 second) local invul = player:get_meta():get_int("mcl_damage:invulnerable") if invul > 0 then damage = damage - mcl_playerplus_internal[name].last_damage From d7b10d18d8872ff21fb4a5f1505afa799c6d5d83 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 16:27:09 +0000 Subject: [PATCH 144/345] Fix not being able to give minimum knockback to players when both near and lower than them --- mods/ITEMS/mcl_enchanting/enchantments.lua | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 5f3971f60..b157f3211 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -286,12 +286,14 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool -- add vertical lift to knockback local v = player:get_velocity() local invul = player:get_meta():get_int("mcl_damage:invulnerable") - if v and v.y <= 0.1 and v.y >= -0.1 and dir.y <= 0.44 and invul == 0 then - player:add_velocity({ - x = 0, - y = 4.5, - z = 0 - }) + if v and v.y <= 0.1 and v.y >= -0.1 and invul == 0 then + if dir.y <= 0.44 then + player:add_velocity({ + x = 0, + y = 4.5, + z = 0 + }) + end -- add minimum knockback if knockback <= 1.5 then knockback = knockback + 4.875 From cd83305f07572d68b2ea6ea8b5fc25356e59d499 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 18:17:15 +0000 Subject: [PATCH 145/345] Make the vertical lift on pvp knockback similar to MC --- mods/ITEMS/mcl_enchanting/enchantments.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index b157f3211..b4092fe93 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -288,11 +288,11 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool local invul = player:get_meta():get_int("mcl_damage:invulnerable") if v and v.y <= 0.1 and v.y >= -0.1 and invul == 0 then if dir.y <= 0.44 then - player:add_velocity({ - x = 0, - y = 4.5, - z = 0 - }) + if mcl_enchanting.get_enchantment(wielditem, "knockback") == 0 then + player:add_velocity({x = 0, y = 6.4, z = 0}) + else + player:add_velocity({x = 0, y = 7, z = 0}) + end end -- add minimum knockback if knockback <= 1.5 then From c9692c622481c45eac3213caeea8aa73ccf7cbd3 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 19:49:04 +0000 Subject: [PATCH 146/345] Fix player invulnerability not getting disabled permanently bug --- mods/PLAYER/mcl_playerplus/init.lua | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 27eec4845..9b819142e 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -664,6 +664,7 @@ minetest.register_on_joinplayer(function(player) swimDistance = 0, jump_cooldown = -1, -- Cooldown timer for jumping, we need this to prevent the jump exhaustion to increase rapidly last_damage = 0, + invul_timestamp = 0, } mcl_playerplus.elytra[player] = {active = false, rocketing = 0, speed = 0} @@ -741,9 +742,15 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, -- damage invulnerability if hitter then local name = player:get_player_name() - -- check for invulnerability time (0.5 second) - local invul = player:get_meta():get_int("mcl_damage:invulnerable") - if invul > 0 then + local time_now = minetest.get_us_time() + local invul_timestamp = mcl_playerplus_internal[name].invul_timestamp + local time_diff = time_now - invul_timestamp + -- check for invulnerability time in microseconds (0.5 second) + if time_diff <= 500000 and time_diff >= 0 then + player:get_meta():set_int("mcl_damage:invulnerable", 1) + minetest.after(0.5, function() + player:get_meta():set_int("mcl_damage:invulnerable", 0) + end) damage = damage - mcl_playerplus_internal[name].last_damage if damage < 0 then damage = 0 @@ -751,10 +758,11 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, return damage else mcl_playerplus_internal[name].last_damage = damage - player:get_meta():set_int("mcl_damage:invulnerable", 1) - minetest.after(0.5, function() + mcl_playerplus_internal[name].invul_timestamp = time_now + local invul = player:get_meta():get_int("mcl_damage:invulnerable") + if invul > 0 then player:get_meta():set_int("mcl_damage:invulnerable", 0) - end) + end end end end) From 9b9747b3d8e82f6df14b58350890a42963e84909 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 21:02:07 +0000 Subject: [PATCH 147/345] Prevent excessive vertical knockbacks if hit by a player from below --- mods/ITEMS/mcl_enchanting/enchantments.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index b4092fe93..4160da19f 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -286,7 +286,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool -- add vertical lift to knockback local v = player:get_velocity() local invul = player:get_meta():get_int("mcl_damage:invulnerable") - if v and v.y <= 0.1 and v.y >= -0.1 and invul == 0 then + if v and v.y <= 0.01 and v.y >= -0.01 and invul == 0 then if dir.y <= 0.44 then if mcl_enchanting.get_enchantment(wielditem, "knockback") == 0 then player:add_velocity({x = 0, y = 6.4, z = 0}) @@ -311,6 +311,9 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if knockback > 12.875 then knockback = 12.875 end + if knockback > 6.4375 and dir.y >= 0.3 then + knockback = 6.4375 + end -- remove knockback if invulnerable if invul > 0 then knockback = 0 From f799596db9d33f5aba90d7819120834efeeb9815 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 22:56:02 +0000 Subject: [PATCH 148/345] Make vertical pvp knockbacks respect attack reach limit & complete excess vertical kb prevention --- mods/ITEMS/mcl_enchanting/enchantments.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 4160da19f..f792014d7 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -287,7 +287,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool local v = player:get_velocity() 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 - if dir.y <= 0.44 then + if dir.y <= 0.44 and distance <= 3 then if mcl_enchanting.get_enchantment(wielditem, "knockback") == 0 then player:add_velocity({x = 0, y = 6.4, z = 0}) else @@ -313,6 +313,8 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end if knockback > 6.4375 and dir.y >= 0.3 then knockback = 6.4375 + elseif knockback <= 6.4375 and dir.y >= 0.3 then + knockback = 1 end -- remove knockback if invulnerable if invul > 0 then From 33e8337bbb57919f6419a0187ffd19a5cab05b15 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sat, 16 Dec 2023 07:58:26 +0000 Subject: [PATCH 149/345] Finish remaining excessive vertical pvp knockback prevention adjustments when hit from below --- mods/ITEMS/mcl_enchanting/enchantments.lua | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index f792014d7..3c03cc846 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -286,13 +286,16 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool -- add vertical lift to knockback local v = player:get_velocity() local invul = player:get_meta():get_int("mcl_damage:invulnerable") + local enchant = mcl_enchanting.get_enchantment(wielditem, "knockback") if v and v.y <= 0.01 and v.y >= -0.01 and invul == 0 then - if dir.y <= 0.44 and distance <= 3 then - if mcl_enchanting.get_enchantment(wielditem, "knockback") == 0 then + if dir.y <= 0.3 then + if enchant == 0 then player:add_velocity({x = 0, y = 6.4, z = 0}) else player:add_velocity({x = 0, y = 7, z = 0}) end + elseif dir.y <= 0.44 and dir.y > 0.3 and enchant > 0 then + knockback = knockback + 3 end -- add minimum knockback if knockback <= 1.5 then @@ -311,10 +314,8 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if knockback > 12.875 then knockback = 12.875 end - if knockback > 6.4375 and dir.y >= 0.3 then - knockback = 6.4375 - elseif knockback <= 6.4375 and dir.y >= 0.3 then - knockback = 1 + if knockback > 6.275 and dir.y >= 0.3 and v.y == 0 and enchant == 0 then + knockback = 6.275 end -- remove knockback if invulnerable if invul > 0 then From cfab59d68a2bfafb814b980d947b3b1b5e1848c6 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sat, 16 Dec 2023 09:20:29 +0000 Subject: [PATCH 150/345] Rebalanced moving pvp knockbacks --- mods/ITEMS/mcl_enchanting/enchantments.lua | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 3c03cc846..fdcb66388 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -282,7 +282,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool 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") + knockback = knockback + 3.22 * mcl_enchanting.get_enchantment(wielditem, "knockback") -- add vertical lift to knockback local v = player:get_velocity() local invul = player:get_meta():get_int("mcl_damage:invulnerable") @@ -308,12 +308,9 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool local hitter_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) local player_mag = math.sqrt((v.x * v.x) + (v.z * v.z)) if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then - knockback = knockback + hitter_mag * 0.375 - end - -- add maximum knockback limit - if knockback > 12.875 then - knockback = 12.875 + knockback = knockback + hitter_mag * 0.6875 end + -- add vertical knockback limit on angled hit if knockback > 6.275 and dir.y >= 0.3 and v.y == 0 and enchant == 0 then knockback = 6.275 end From 8fbd72c1422061a0b99bf3916e3af7f0bca449bc Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sat, 16 Dec 2023 09:46:18 +0000 Subject: [PATCH 151/345] Optimize code by calling get_enchantment function only once --- mods/ITEMS/mcl_enchanting/enchantments.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index fdcb66388..6194945a7 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -282,11 +282,12 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end if hitter and hitter:is_player() and distance <= 3 then local wielditem = hitter:get_wielded_item() - knockback = knockback + 3.22 * mcl_enchanting.get_enchantment(wielditem, "knockback") + --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 invul = player:get_meta():get_int("mcl_damage:invulnerable") - local enchant = mcl_enchanting.get_enchantment(wielditem, "knockback") if v and v.y <= 0.01 and v.y >= -0.01 and invul == 0 then if dir.y <= 0.3 then if enchant == 0 then From 32e91b45ae5d6f84844b0db927dfe650da274af1 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sat, 16 Dec 2023 11:48:16 +0000 Subject: [PATCH 152/345] Add vertical pvp knockbacks from downward hits & reduce pvp kb on half block angled upward hits --- mods/ITEMS/mcl_enchanting/enchantments.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 6194945a7..836a13a65 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -290,10 +290,16 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool 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 if dir.y <= 0.3 then + local regular_v = 6.4 + local enchant_v = 7 + if dir.y <= 0.27 then + regular_v = regular_v * math.abs(dir.y - 1) + enchant_v = enchant_v * math.abs(dir.y - 1) + end if enchant == 0 then - player:add_velocity({x = 0, y = 6.4, z = 0}) + player:add_velocity({x = 0, y = regular_v, z = 0}) else - player:add_velocity({x = 0, y = 7, z = 0}) + player:add_velocity({x = 0, y = enchant_v, z = 0}) end elseif dir.y <= 0.44 and dir.y > 0.3 and enchant > 0 then knockback = knockback + 3 From e8ee9c44635657862dcf54e59f829ddec1a0ed09 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sat, 16 Dec 2023 12:58:58 +0000 Subject: [PATCH 153/345] Remove obsolete work-around code --- mods/ITEMS/mcl_enchanting/enchantments.lua | 26 +++++++--------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 836a13a65..28cb1083c 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -289,20 +289,14 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool local v = player:get_velocity() 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 - if dir.y <= 0.3 then - local regular_v = 6.4 - local enchant_v = 7 - if dir.y <= 0.27 then - regular_v = regular_v * math.abs(dir.y - 1) - enchant_v = enchant_v * math.abs(dir.y - 1) - end - if enchant == 0 then - player:add_velocity({x = 0, y = regular_v, z = 0}) - else - player:add_velocity({x = 0, y = enchant_v, z = 0}) - end - elseif dir.y <= 0.44 and dir.y > 0.3 and enchant > 0 then - knockback = knockback + 3 + 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}) + else + player:add_velocity({x = 0, y = enchant_v, z = 0}) end -- add minimum knockback if knockback <= 1.5 then @@ -317,10 +311,6 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then knockback = knockback + hitter_mag * 0.6875 end - -- add vertical knockback limit on angled hit - if knockback > 6.275 and dir.y >= 0.3 and v.y == 0 and enchant == 0 then - knockback = 6.275 - end -- remove knockback if invulnerable if invul > 0 then knockback = 0 From 0a8874ecad38bf8e9738a2cba67a2f83d0e782cf Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sun, 17 Dec 2023 16:39:04 +0000 Subject: [PATCH 154/345] Make vertical pvp knockbacks less floaty --- mods/ITEMS/mcl_enchanting/enchantments.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 28cb1083c..1d065db3b 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -291,13 +291,19 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool 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 + local added_v = 0 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 + minetest.after(0.25, function() + player:add_velocity({x = 0, y = -added_v * 0.375 , z = 0}) + end) -- add minimum knockback if knockback <= 1.5 then knockback = knockback + 4.875 From 8612350fa786053d42eb51260f72b4cc4059835a Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sun, 17 Dec 2023 17:48:39 +0000 Subject: [PATCH 155/345] Make vertical pvp knockback floatiness reduction include moving hits --- mods/ITEMS/mcl_enchanting/enchantments.lua | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 1d065db3b..05a1e7531 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -287,11 +287,11 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool 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 - local added_v = 0 regular_v = regular_v * math.abs(dir.y - 1) enchant_v = enchant_v * math.abs(dir.y - 1) if enchant == 0 then @@ -301,9 +301,6 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool player:add_velocity({x = 0, y = enchant_v, z = 0}) added_v = enchant_v end - minetest.after(0.25, function() - player:add_velocity({x = 0, y = -added_v * 0.375 , z = 0}) - end) -- add minimum knockback if knockback <= 1.5 then knockback = knockback + 4.875 @@ -317,6 +314,10 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then knockback = knockback + hitter_mag * 0.6875 end + -- reduce floatiness + minetest.after(0.25, function() + player:add_velocity({x = 0, y = (v.y + added_v) * -0.375 , z = 0}) + end) -- remove knockback if invulnerable if invul > 0 then knockback = 0 From 6d7ae8ba2df7e4d2639f0e22cef3fb69e3423468 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sun, 17 Dec 2023 19:59:18 +0000 Subject: [PATCH 156/345] Add minimum unenchanted knockback to bow --- mods/ITEMS/mcl_bows/bow.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 174208c3c..188035b99 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -49,6 +49,8 @@ function mcl_bows.shoot_arrow(arrow_item, pos, dir, yaw, shooter, power, damage, end if enchantments.punch then knockback = enchantments.punch * 21 + else + knockback = 4.875 end if enchantments.flame then mcl_burning.set_on_fire(obj, math.huge) From c39e55e2d4e4ce878cc04947aecdcf7590fe7f0e Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sun, 17 Dec 2023 20:01:35 +0000 Subject: [PATCH 157/345] Add minimum knockback to crossbow --- mods/ITEMS/mcl_bows/crossbow.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_bows/crossbow.lua b/mods/ITEMS/mcl_bows/crossbow.lua index df7b5f560..fcc60c460 100644 --- a/mods/ITEMS/mcl_bows/crossbow.lua +++ b/mods/ITEMS/mcl_bows/crossbow.lua @@ -48,7 +48,7 @@ function mcl_bows_s.shoot_arrow_crossbow(arrow_item, pos, dir, yaw, shooter, pow if damage == nil then damage = 3 end - local knockback + local knockback = 4.875 if crossbow_stack then local enchantments = mcl_enchanting.get_enchantments(crossbow_stack) if enchantments.piercing then From 200f7451ebfaff94653bca4f9d89495f4e04c6a7 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sun, 17 Dec 2023 21:15:55 +0000 Subject: [PATCH 158/345] Remove unnecessary invul code & add damage animation code --- mods/PLAYER/mcl_playerplus/init.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 9b819142e..e3d323854 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -759,10 +759,10 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, else mcl_playerplus_internal[name].last_damage = damage mcl_playerplus_internal[name].invul_timestamp = time_now - local invul = player:get_meta():get_int("mcl_damage:invulnerable") - if invul > 0 then - player:get_meta():set_int("mcl_damage:invulnerable", 0) - end + player:get_meta():set_int("mcl_damage:damage_animation", 1) + minetest.after(0.5, function() + player:get_meta():set_int("mcl_damage:damage_animation", 0) + end) end end end) From 12109e7f44c49f5f4c8815717377a2a5410f12fc Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sun, 17 Dec 2023 21:18:57 +0000 Subject: [PATCH 159/345] Add player damage animation --- mods/PLAYER/mcl_player/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 288b697e1..8ebcedccf 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -228,6 +228,8 @@ minetest.register_globalstep(function(dtime) -- Apply animations based on what the player is doing if player:get_hp() == 0 then player_set_animation(player, "die") + elseif player:get_meta():get_int("mcl_damage:damage_animation") > 0 then + player_set_animation(player, "walk", animation_speed_mod) elseif mcl_playerplus.elytra[player] and mcl_playerplus.elytra[player].active then player_set_animation(player, "stand") elseif walking and velocity.x > 0.35 From 07147e9d5be3b237c351d349d2e42e580dcbe4b8 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 18 Dec 2023 02:56:43 +0100 Subject: [PATCH 160/345] Make slime+magmacube collision boxes rotate properly --- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 61e653781..242e2153d 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -183,7 +183,7 @@ local slime_big = { hp_max = 16, xp_min = 4, xp_max = 4, - collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02}, + collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02, rotate = true}, visual_size = {x=12.5, y=12.5}, textures = {{"mobs_mc_slime.png", "mobs_mc_slime.png"}}, visual = "mesh", @@ -235,7 +235,7 @@ slime_small.hp_min = 4 slime_small.hp_max = 4 slime_small.xp_min = 2 slime_small.xp_max = 2 -slime_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51} +slime_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51, rotate = true} slime_small.visual_size = {x=6.25, y=6.25} slime_small.damage = 3 slime_small.reach = 2.25 @@ -252,7 +252,7 @@ slime_tiny.hp_min = 1 slime_tiny.hp_max = 1 slime_tiny.xp_min = 1 slime_tiny.xp_max = 1 -slime_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505} +slime_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505, rotate = true} slime_tiny.visual_size = {x=3.125, y=3.125} slime_tiny.damage = 1 slime_tiny.reach = 2 @@ -403,7 +403,7 @@ local magma_cube_big = { hp_max = 16, xp_min = 4, xp_max = 4, - collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02}, + collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02, rotate = true}, visual_size = {x=12.5, y=12.5}, textures = {{ "mobs_mc_magmacube.png", "mobs_mc_magmacube.png" }}, visual = "mesh", @@ -463,7 +463,7 @@ magma_cube_small.hp_min = 4 magma_cube_small.hp_max = 4 magma_cube_small.xp_min = 2 magma_cube_small.xp_max = 2 -magma_cube_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51} +magma_cube_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51, rotate = true} magma_cube_small.visual_size = {x=6.25, y=6.25} magma_cube_small.damage = 3 magma_cube_small.reach = 2.1 @@ -485,7 +485,7 @@ magma_cube_tiny.hp_min = 1 magma_cube_tiny.hp_max = 1 magma_cube_tiny.xp_min = 1 magma_cube_tiny.xp_max = 1 -magma_cube_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505} +magma_cube_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505, rotate = true} magma_cube_tiny.visual_size = {x=3.125, y=3.125} magma_cube_tiny.walk_velocity = 1.02 magma_cube_tiny.run_velocity = 1.02 From 692b1012124747d7dd0ee98f2a0eb7d1077ba45f Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 18 Dec 2023 09:51:45 +0100 Subject: [PATCH 161/345] mobs:hoglin: add missing sounds these were made by epCode and lincenced under LGPL-3.0. downloaded from https://git.minetest.land/epCode/extra_mobs/commit/49a838e73374467d7d3163863a1f58e8b4c36830 --- .../mobs_mc/sounds/extra_mobs_hoglin.1.ogg | Bin 0 -> 6514 bytes .../mobs_mc/sounds/extra_mobs_hoglin.2.ogg | Bin 0 -> 10262 bytes .../mobs_mc/sounds/extra_mobs_hoglin_hurt.ogg | Bin 0 -> 5751 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.1.ogg create mode 100755 mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.2.ogg create mode 100755 mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.1.ogg b/mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.1.ogg new file mode 100755 index 0000000000000000000000000000000000000000..06bdc4b248f23aa576569030446b3e56a2cb6196 GIT binary patch literal 6514 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 literal 0 HcmV?d00001 From e202f208691bb484cdc57ce224ae6d9a9942f22d Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 18 Dec 2023 09:58:32 +0100 Subject: [PATCH 162/345] mobs:hoglin: use sound .1 for random and reuse hurt sound for death --- mods/ENTITIES/mobs_mc/hoglin+zoglin.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua index 8f8590933..cc7b99d54 100644 --- a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua +++ b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua @@ -31,8 +31,9 @@ local hoglin = { } }, visual_size = {x=3, y=3}, sounds = { - random = "extra_mobs_hoglin", + random = "extra_mobs_hoglin.1", damage = "extra_mobs_hoglin_hurt", + death = "extra_mobs_hoglin_hurt", distance = 16, }, jump = true, From f5ba0b79811d55bf53af011cfad2339aba05f97e Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 18 Dec 2023 10:31:08 +0100 Subject: [PATCH 163/345] mobs:zoglin: use hoglin sound .2 --- mods/ENTITIES/mobs_mc/hoglin+zoglin.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua index cc7b99d54..f170b5e80 100644 --- a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua +++ b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua @@ -93,6 +93,12 @@ local zoglin = table.copy(hoglin) zoglin.description = S("Zoglin") zoglin.fire_resistant = 1 zoglin.textures = {"extra_mobs_zoglin.png"} +sounds = { + random = "extra_mobs_hoglin.2", + damage = "extra_mobs_hoglin_hurt", + death = "extra_mobs_hoglin_hurt", + distance = 16, + }, zoglin.do_custom = function() return end From 7f823f0155ecbb4e4c63ef40224ec757355f264a Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 18 Dec 2023 10:38:23 +0100 Subject: [PATCH 164/345] mobs:hoglin:add licence information --- mods/ENTITIES/mobs_mc/LICENSE-media.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index c937097c9..278148b85 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -305,6 +305,9 @@ Origin of those models: * `mobs_mc_rabbit_random.*.ogg` (CC0) * Changes were made. * Source: +* [epCode] + * `extra_mobs_hoglin*.ogg` (LGPL 3.0) + * Source: Note: Many of these sounds have been more or less modified to fit the game. From ee51a500b2da77b3ea1f5622a957daf287fba827 Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 18 Dec 2023 10:57:39 +0100 Subject: [PATCH 165/345] mobs:piglin: use (alt) zombified piglin sounds --- mods/ENTITIES/mobs_mc/piglin.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/piglin.lua b/mods/ENTITIES/mobs_mc/piglin.lua index 27f5a72f4..ac1d8b845 100644 --- a/mods/ENTITIES/mobs_mc/piglin.lua +++ b/mods/ENTITIES/mobs_mc/piglin.lua @@ -61,8 +61,10 @@ local piglin = { } }, visual_size = {x=1, y=1}, sounds = { - random = "extra_mobs_piglin", - damage = "extra_mobs_piglin_hurt", + random = "mobs_mc_zombiepig_random", + war_cry = "mobs_mc_zombiepig_war_cry", death = "mobs_mc_zombiepig_death", + damage = "mobs_mc_zombiepig_hurt.2", + death = "mobs_mc_zombiepig_death.2" distance = 16, }, jump = true, From cc470b9d887327c49f3a3953fcc33b3be262b19b Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 18 Dec 2023 11:08:01 +0100 Subject: [PATCH 166/345] mobs:hoglin: fix conversion of tabs to spaces --- mods/ENTITIES/mobs_mc/hoglin+zoglin.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua index f170b5e80..d0518cad9 100644 --- a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua +++ b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua @@ -94,10 +94,10 @@ zoglin.description = S("Zoglin") zoglin.fire_resistant = 1 zoglin.textures = {"extra_mobs_zoglin.png"} sounds = { - random = "extra_mobs_hoglin.2", - damage = "extra_mobs_hoglin_hurt", - death = "extra_mobs_hoglin_hurt", - distance = 16, + random = "extra_mobs_hoglin.2", + damage = "extra_mobs_hoglin_hurt", + death = "extra_mobs_hoglin_hurt", + distance = 16, }, zoglin.do_custom = function() return From 14cec16c63445e8f021645b761c3ad3fd5972644 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Mon, 18 Dec 2023 21:31:38 +0000 Subject: [PATCH 167/345] Increase enchanted bow knockback --- mods/ITEMS/mcl_bows/bow.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 188035b99..e4e34610d 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -48,7 +48,7 @@ function mcl_bows.shoot_arrow(arrow_item, pos, dir, yaw, shooter, power, damage, damage = damage + (enchantments.power + 1) / 4 end if enchantments.punch then - knockback = enchantments.punch * 21 + knockback = enchantments.punch * 24 else knockback = 4.875 end From fe90424ee4797e54238d1ba1cf913a4389fc6b59 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Mon, 18 Dec 2023 21:42:26 +0000 Subject: [PATCH 168/345] Add pvp knockback reduction when moving towards player while attacking --- mods/ITEMS/mcl_enchanting/enchantments.lua | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 05a1e7531..db2aa9da6 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -316,8 +316,14 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end -- reduce floatiness minetest.after(0.25, function() - player:add_velocity({x = 0, y = (v.y + added_v) * -0.375 , z = 0}) + 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 From 44c656502f4858a5e779e590307a01e3444543fb Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Mon, 18 Dec 2023 22:04:12 +0000 Subject: [PATCH 169/345] Add a prevention in case players get stuck with the damage animation --- mods/PLAYER/mcl_player/init.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 8ebcedccf..9681fa86f 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -230,6 +230,9 @@ minetest.register_globalstep(function(dtime) player_set_animation(player, "die") elseif player:get_meta():get_int("mcl_damage:damage_animation") > 0 then player_set_animation(player, "walk", animation_speed_mod) + minetest.after(0.5, function() + player:get_meta():set_int("mcl_damage:damage_animation", 0) + end) elseif mcl_playerplus.elytra[player] and mcl_playerplus.elytra[player].active then player_set_animation(player, "stand") elseif walking and velocity.x > 0.35 From 11c5d36c558817df61542151076a21e0e0d130c4 Mon Sep 17 00:00:00 2001 From: Michieal Date: Sat, 2 Dec 2023 07:00:25 -0500 Subject: [PATCH 170/345] Initial Commit. --- mods/PLAYER/mcl_fovapi/api.md | 9 +++++ mods/PLAYER/mcl_fovapi/init.lua | 60 +++++++++++++++++++++++++++++++++ mods/PLAYER/mcl_fovapi/mod.conf | 4 +++ 3 files changed, 73 insertions(+) create mode 100644 mods/PLAYER/mcl_fovapi/api.md create mode 100644 mods/PLAYER/mcl_fovapi/init.lua create mode 100644 mods/PLAYER/mcl_fovapi/mod.conf diff --git a/mods/PLAYER/mcl_fovapi/api.md b/mods/PLAYER/mcl_fovapi/api.md new file mode 100644 index 000000000..39d6ee86d --- /dev/null +++ b/mods/PLAYER/mcl_fovapi/api.md @@ -0,0 +1,9 @@ + + + +mcl_fovapi = {} +mcl_fovapi.default_fov = {} +mcl_fovapi.registered_modifiers = {} +mcl_fovapi.applied_modifiers = {} +function mcl_fovapi.register_modifier(name, fov_factor, time, exclusive, on_start, on_end) +function mcl_fovapi.apply_modifier(player, modifier_name) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua new file mode 100644 index 000000000..17c0a9262 --- /dev/null +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -0,0 +1,60 @@ +--- +--- Copyright 2023, Michieal. +--- License: GPL3. (Default Mineclone2 License) +--- Created by michieal. +--- DateTime: 12/2/23 5:47 AM +--- + +mcl_fovapi = {} + +-- Handles default fov for players +mcl_fovapi.default_fov = {} +mcl_fovapi.registered_modifiers = {} +mcl_fovapi.applied_modifiers = {} + +-- set to blank on join (for 3rd party mods) +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + -- Assign default FOV + mcl_fovapi.default_fov[name] = player:get_fov() +end) + +-- clear when player leaves +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + -- Remove default FOV + mcl_fovapi.default_fov[name] = nil +end) + +function mcl_fovapi.register_modifier(name, fov_factor, time, exclusive, on_start, on_end) + local def = { + modifer_name = name, + fov = fov_factor, + time = time, + exclusive = exclusive, + on_start = on_start, + on_end = on_end, + } + + mcl_fovapi.registered_modifiers[name] = def + +end + +function mcl_fovapi.apply_modifier(player, modifier_name) + + if modifier_name == nil then return end + if mcl_fovapi.registered_modifiers[modifier_name] == nil then return end + + local modifier = mcl_fovapi.registered_modifiers[modifier_name] + if modifier.on_start ~= nil then + modifier.on_start(player) + end + + mcl_fovapi.applied_modifiers[player][modifier_name] = true -- set the applied to be true. + + -- do modiifier apply code. + + + +end + diff --git a/mods/PLAYER/mcl_fovapi/mod.conf b/mods/PLAYER/mcl_fovapi/mod.conf new file mode 100644 index 000000000..b78c78596 --- /dev/null +++ b/mods/PLAYER/mcl_fovapi/mod.conf @@ -0,0 +1,4 @@ +name = mcl_fovapi +author = Michieal +description = An API for handling FOV changes. +depends = mcl_player \ No newline at end of file From fc80d4fb9f836cd1bee05720e4d0cdc9775c3d97 Mon Sep 17 00:00:00 2001 From: Michieal Date: Sun, 3 Dec 2023 06:47:28 -0500 Subject: [PATCH 171/345] Initial API state. --- mods/PLAYER/mcl_fovapi/api.md | 14 +++- mods/PLAYER/mcl_fovapi/init.lua | 135 +++++++++++++++++++++++++++++--- 2 files changed, 139 insertions(+), 10 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/api.md b/mods/PLAYER/mcl_fovapi/api.md index 39d6ee86d..05b8be29b 100644 --- a/mods/PLAYER/mcl_fovapi/api.md +++ b/mods/PLAYER/mcl_fovapi/api.md @@ -1,9 +1,21 @@ +registered_modifiers has defs of modifiers +applied_modifiers is indexed by player name mcl_fovapi = {} + mcl_fovapi.default_fov = {} + mcl_fovapi.registered_modifiers = {} + mcl_fovapi.applied_modifiers = {} -function mcl_fovapi.register_modifier(name, fov_factor, time, exclusive, on_start, on_end) + +function mcl_fovapi.register_modifier(name, fov_factor, time, is_multiplier, exclusive, on_start, on_end) + function mcl_fovapi.apply_modifier(player, modifier_name) + +function mcl_fovapi.remove_modifier(player, modifier_name) + +function mcl_fovapi.remove_all_modifiers(player, time) + diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index 17c0a9262..649f582ab 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -5,18 +5,26 @@ --- DateTime: 12/2/23 5:47 AM --- +-- Locals (and cached) +local DEBUG = false -- debug constant for troubleshooting. +local pairs = pairs + +-- Globals mcl_fovapi = {} --- Handles default fov for players -mcl_fovapi.default_fov = {} +mcl_fovapi.default_fov = {} -- Handles default fov for players mcl_fovapi.registered_modifiers = {} mcl_fovapi.applied_modifiers = {} --- set to blank on join (for 3rd party mods) minetest.register_on_joinplayer(function(player) local name = player:get_player_name() -- Assign default FOV mcl_fovapi.default_fov[name] = player:get_fov() + + if DEBUG then + minetest.log("FOV::Player: " .. name .. "\nFOV: " .. player:get_fov()) + end + end) -- clear when player leaves @@ -26,24 +34,41 @@ minetest.register_on_leaveplayer(function(player) mcl_fovapi.default_fov[name] = nil end) -function mcl_fovapi.register_modifier(name, fov_factor, time, exclusive, on_start, on_end) +function mcl_fovapi.register_modifier(name, fov_factor, time, is_multiplier, exclusive, on_start, on_end) + if is_multiplier ~= true and is_multiplier ~= false then + is_multiplier = false + end + if exclusive ~= true and exclusive ~= false then + exclusive = false + end local def = { modifer_name = name, fov = fov_factor, time = time, + is_multiplier = is_multiplier, exclusive = exclusive, on_start = on_start, on_end = on_end, } + if DEBUG then + minetest.log("FOV::Modifier Definition Registered:\n" .. dump(def)) + end + mcl_fovapi.registered_modifiers[name] = def end function mcl_fovapi.apply_modifier(player, modifier_name) - - if modifier_name == nil then return end - if mcl_fovapi.registered_modifiers[modifier_name] == nil then return end + if player == nil then + return + end + if modifier_name == nil then + return + end + if mcl_fovapi.registered_modifiers[modifier_name] == nil then + return + end local modifier = mcl_fovapi.registered_modifiers[modifier_name] if modifier.on_start ~= nil then @@ -51,10 +76,102 @@ function mcl_fovapi.apply_modifier(player, modifier_name) end mcl_fovapi.applied_modifiers[player][modifier_name] = true -- set the applied to be true. + if DEBUG then + minetest.log("FOV::Player Applied Modifiers :" .. dump(mcl_fovapi.applied_modifiers[player])) + end + local pname = player:get_player_name() - -- do modiifier apply code. - + if DEBUG then + minetest.log("FOV::Modifier applied to player:" .. pname .. " modifier: " .. modifier_name) + end + -- modifier apply code. + if modifier.exclusive == true then + -- if exclusive, reset the player's fov, and apply the new fov. + if modifier.is_multiplier then + player:set_fov(0, false, 0) + end + player:set_fov(modifier.fov_factor, modifier.is_multiplier, modifier.time) + else + -- not exclusive? let's apply it in the mix. + -- assume is_multiplier is true. + player:set_fov(modifier.fov_factor, true, modifier.time) + end end +function mcl_fovapi.remove_modifier(player, modifier_name) + if player == nil then + return + end + + if DEBUG then + local name = player:get_player_name() + minetest.log("FOV::Player: " .. name .. " modifier: " .. modifier_name .. "removed.") + end + + mcl_fovapi.applied_modifiers[player][modifier_name] = nil + + -- check for other fov modifiers, and set them up, or reset to default. + + local applied = {} + for k, _ in pairs(mcl_fovapi.applied_modifiers[player]) do + applied[k] = mcl_fovapi.registered_modifiers[k] + end + + if #applied == 0 then + return + end + local exc = false + for k in applied do + if applied[k].exclusive == true then + exc = applied[k] + break + end + end + + -- handle exclusives. + if exc ~= false then + player:set_fov(exc.fov_factor, exc.is_multiplier, 0) -- we want this to be immediate. + else + -- handle normal fov modifiers. + player:set_fov(0, false, 0) -- we want this to be immediate. + for x in applied do + player:set_fov(x.fov_factor, true, 0) + end + end + + if mcl_fovapi.registered_modifiers[modifier_name].on_end ~= nil then + mcl_fovapi.registered_modifiers[modifier_name].on_end(player) + end +end + +function mcl_fovapi.remove_all_modifiers(player) + if player == nil then + return + end + + if DEBUG then + local name = player:get_player_name() + minetest.log("FOV::Player: " .. name .. " modifiers have been reset.") + end + + for x in mcl_fovapi.applied_modifiers[player] do + x = nil + end + + player:set_fov(0, false, 0) + +end + +--[[ +Notes: +set_fov(fov, is_multiplier, transition_time): Sets player's FOV + + fov: FOV value. + is_multiplier: Set to true if the FOV value is a multiplier. Defaults to false. + transition_time: If defined, enables smooth FOV transition. Interpreted as the time (in seconds) to reach target FOV. + If set to 0, FOV change is instantaneous. Defaults to 0. + Set fov to 0 to clear FOV override. + +--]] From bf41e116a1dbfd71be37a8e5f8aedc6686214884 Mon Sep 17 00:00:00 2001 From: Michieal Date: Sun, 3 Dec 2023 08:10:41 -0500 Subject: [PATCH 172/345] Fleshed out the API Documentation. Modified missing pieces of code. --- mods/PLAYER/mcl_fovapi/api.md | 78 ++++++++++++++++++++++++++++----- mods/PLAYER/mcl_fovapi/init.lua | 9 ++-- 2 files changed, 73 insertions(+), 14 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/api.md b/mods/PLAYER/mcl_fovapi/api.md index 05b8be29b..43a54de53 100644 --- a/mods/PLAYER/mcl_fovapi/api.md +++ b/mods/PLAYER/mcl_fovapi/api.md @@ -1,21 +1,79 @@ +### FOV API -registered_modifiers has defs of modifiers + + * [FOV API](#fov-api) + * [Description](#description) + * [Troubleshooting](#troubleshooting) + * [Modifier Definition](#modifier-definition-) + * [Global MCL_FOVAPI Tables](#global-mclfovapi-tables) + * [Namespaces](#namespaces) + * [Functions](#functions) + -applied_modifiers is indexed by player name +#### Description +This API defines and applies different Field Of View effects to players via MODIFIERS. -mcl_fovapi = {} +#### Troubleshooting +In the `init.lua` file for this module, there is a `DEBUG` variable at the top that will turn on logging. +Use it to see what is going on. -mcl_fovapi.default_fov = {} +#### Modifier Definition +```lua +def = { + modifer_name = name, + fov_factor = fov_factor, + time = time, + is_multiplier = is_multiplier, + exclusive = exclusive, + on_start = on_start, + on_end = on_end, +} +``` +* Modifier Name: The name of the Modifier, used to identify the specific modifier. Case sensitive. +* FOV Factor: A float value defining the FOV to apply. Can be an absolute or percentage, depending on Exclusive and + Is_Multiplier. +* Time: A float value defining the number of seconds to take when applying the FOV Factor. + Used to smoothly move between FOVs. Use 0 for an immediate FOV Shift. (Transition time.) +* Is Multiplier: A bool value used to specify if the FOV Factor is an absolute FOV value or if it should be a percentage + of the current FOV. Defaults to `true` if not defined. +* Exclusive: A bool value used to specify whether the modifier will override all other FOV modifiers. An example of this + is how the spy glass sets the FOV to be a specific value regardless of any other FOV effects applied. Defaults to + `false` if not defined. +* On Start: the `on_start` is a callback function `on_start(player)` that is called if defined. The parameter `player` + is a ref to the player that had the modifier applied. Called from `mcl_fovapi.apply_modifier` immediately after + the FOV Modifier has been applied. +* On End: the `on_end` is a callback function `on_end(player)` that is called if defined. The parameter `player` + is a ref to the player that had the modifier applied. Called from `mcl_fovapi.remove_modifier` immediately after + the FOV Modifier has been removed. -mcl_fovapi.registered_modifiers = {} +Note: passing incorrect values in the definition will have unintended consequences. -mcl_fovapi.applied_modifiers = {} +#### Global MCL_FOVAPI Tables +There are three tables that are accessible via the API. They are `registered_modifiers` and `applied_modifiers`. -function mcl_fovapi.register_modifier(name, fov_factor, time, is_multiplier, exclusive, on_start, on_end) +`mcl_fovapi.registered_modifiers` has the definitions of all the registered FOV Modifiers. Indexed by Modifier Name. +And, `mcl_fovapi.applied_modifiers` is indexed by the Player Name. It contains the names of all the modifiers applied to the +player. The `mcl_fovapi.default_fov` table is indexed by the Player Name, and contains the Default FOVs of the player from the +settings. (Expressed as a value usable in `player:set_fov`.) -function mcl_fovapi.apply_modifier(player, modifier_name) +#### Namespaces +`mcl_fovapi` is the default API Namespace. -function mcl_fovapi.remove_modifier(player, modifier_name) +#### Functions +`mcl_fovapi.register_modifier(name, fov_factor, time, is_multiplier, exclusive, on_start, on_end)` -function mcl_fovapi.remove_all_modifiers(player, time) +Used to register a new FOV Modifier for use. Must be called before applying said modifier to a player. +See Modifier Definition for what the parameters are. +`mcl_fovapi.apply_modifier(player, modifier_name)` + +Used to apply a registered FOV modifier to a player. Takes a reference to the player and the modifier's name (string). + +`mcl_fovapi.remove_modifier(player, modifier_name)` + +Used to remove a specific FOV modifier from a Player. Takes a reference to the player and the modifier's name (string). +Removed immediately. + +`mcl_fovapi.remove_all_modifiers(player)` + +Used to remove all FOV modifiers from a Player. Takes a reference to the Player. FOV change is instantaneous. diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index 649f582ab..ace5ca96f 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -27,23 +27,24 @@ minetest.register_on_joinplayer(function(player) end) --- clear when player leaves minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() - -- Remove default FOV + + -- handle clean up mcl_fovapi.default_fov[name] = nil + mcl_fovapi.applied_modifiers[name] = nil end) function mcl_fovapi.register_modifier(name, fov_factor, time, is_multiplier, exclusive, on_start, on_end) if is_multiplier ~= true and is_multiplier ~= false then - is_multiplier = false + is_multiplier = true end if exclusive ~= true and exclusive ~= false then exclusive = false end local def = { modifer_name = name, - fov = fov_factor, + fov_factor = fov_factor, time = time, is_multiplier = is_multiplier, exclusive = exclusive, From 6cfb55e853c31bf30136c313c447ed063f88ade2 Mon Sep 17 00:00:00 2001 From: Michieal Date: Sun, 3 Dec 2023 08:24:21 -0500 Subject: [PATCH 173/345] Added reset for player respawning to remove FOV modifiers. Fixed missing on_end call in remove_all_modifiers. Added mcl_fovapi to Bows, Sprint, and Spyglass. --- mods/ITEMS/mcl_bows/mod.conf | 2 +- mods/ITEMS/mcl_spyglass/mod.conf | 2 +- mods/PLAYER/mcl_fovapi/init.lua | 7 +++++++ mods/PLAYER/mcl_sprint/mod.conf | 5 +++-- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_bows/mod.conf b/mods/ITEMS/mcl_bows/mod.conf index 7b174826a..0fdd666a3 100644 --- a/mods/ITEMS/mcl_bows/mod.conf +++ b/mods/ITEMS/mcl_bows/mod.conf @@ -1,6 +1,6 @@ name = mcl_bows author = Arcelmi description = This mod adds bows and arrows for MineClone 2. -depends = controls, mcl_particles, mcl_enchanting, mcl_init, mcl_util, mcl_shields +depends = controls, mcl_particles, mcl_enchanting, mcl_init, mcl_util, mcl_shields, mcl_fovapi optional_depends = awards, mcl_achievements, mcl_core, mcl_mobitems, playerphysics, doc, doc_identifier, mesecons_button diff --git a/mods/ITEMS/mcl_spyglass/mod.conf b/mods/ITEMS/mcl_spyglass/mod.conf index c13b281e1..6a78e86a5 100644 --- a/mods/ITEMS/mcl_spyglass/mod.conf +++ b/mods/ITEMS/mcl_spyglass/mod.conf @@ -1,4 +1,4 @@ name = mcl_spyglass author = NO11 description = This mod adds a spyglass, which is an item that can be used for zooming in on specific locations. -depends = mcl_core, controls +depends = mcl_core, controls, mcl_fovapi diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index ace5ca96f..153cd47a9 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -60,6 +60,10 @@ function mcl_fovapi.register_modifier(name, fov_factor, time, is_multiplier, exc end +minetest.register_on_respawnplayer(function(player) + mcl_fovapi.remove_all_modifiers(player:get_player_name()) +end) + function mcl_fovapi.apply_modifier(player, modifier_name) if player == nil then return @@ -162,6 +166,9 @@ function mcl_fovapi.remove_all_modifiers(player) end player:set_fov(0, false, 0) + if mcl_fovapi.registered_modifiers[modifier_name].on_end ~= nil then + mcl_fovapi.registered_modifiers[modifier_name].on_end(player) + end end diff --git a/mods/PLAYER/mcl_sprint/mod.conf b/mods/PLAYER/mcl_sprint/mod.conf index 0d20f80a3..9b9a7366b 100644 --- a/mods/PLAYER/mcl_sprint/mod.conf +++ b/mods/PLAYER/mcl_sprint/mod.conf @@ -1,4 +1,5 @@ name = mcl_sprint author = GunshipPenguin -description = Allows the player to sprint by pressing the “Use” key (default: E). -depends = mcl_playerinfo, playerphysics, mcl_hunger +description = Allows the player to sprint by pressing the “AUX” key (default: E). +depends = mcl_playerinfo, playerphysics, mcl_hunger, mcl_fovapi +optional = mcl_bows \ No newline at end of file From 0a17bbe731766c38fca8e42253862556d61c1d28 Mon Sep 17 00:00:00 2001 From: Michieal Date: Sun, 3 Dec 2023 08:29:53 -0500 Subject: [PATCH 174/345] Added reset for player respawning to remove FOV modifiers. Fixed missing on_end call in remove_all_modifiers. Added mcl_fovapi to Bows, Sprint, and Spyglass. Set up the Spyglass to use the new FOV API. --- mods/ITEMS/mcl_spyglass/init.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_spyglass/init.lua b/mods/ITEMS/mcl_spyglass/init.lua index fa1a82339..ab557ebbf 100644 --- a/mods/ITEMS/mcl_spyglass/init.lua +++ b/mods/ITEMS/mcl_spyglass/init.lua @@ -17,6 +17,8 @@ minetest.register_craft({ } }) +mcl_fovapi.register_modifier("spyglass", 8, 0.1,false, true, nil, nil) + local spyglass_scope = {} local function add_scope(player) @@ -37,7 +39,8 @@ local function remove_scope(player) player:hud_remove(spyglass_scope[player]) spyglass_scope[player] = nil player:hud_set_flags({wielditem = true}) - player:set_fov(86.1) + mcl_fovapi.remove_modifier(player, "spyglass") -- use the api to remove the FOV effect. + -- old code: player:set_fov(86.1) end end @@ -55,7 +58,8 @@ controls.register_on_hold(function(player, key, time) if key ~= "RMB" then return end local wielditem = player:get_wielded_item() if wielditem:get_name() == "mcl_spyglass:spyglass" then - player:set_fov(8, false, 0.1) + mcl_fovapi.apply_modifier(player, "spyglass") -- apply the FOV effect. + -- old code: player:set_fov(8, false, 0.1) if spyglass_scope[player] == nil then add_scope(player) end From 36f661743e18a8f3c0c1ed540d22e6e9244b27f9 Mon Sep 17 00:00:00 2001 From: Michieal Date: Sun, 3 Dec 2023 08:57:13 -0500 Subject: [PATCH 175/345] Set up the Bows to use the new FOV API. Bows now zoom in and clear out the zoom. --- mods/ITEMS/mcl_bows/bow.lua | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 174208c3c..cfbdfb421 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -33,6 +33,9 @@ local bow_load = {} -- Another player table, this one stores the wield index of the bow being charged local bow_index = {} +-- define FOV modifier(s) +mcl_fovapi.register_modifier("bowcomplete", 0.8, 1, true, false, nil, nil) + function mcl_bows.shoot_arrow(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical, bow_stack, collectable) local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, arrow_item.."_entity") if power == nil then @@ -183,6 +186,9 @@ end -- Resets the bow charging state and player speed. To be used when the player is no longer charging the bow local function reset_bow_state(player, also_reset_bows) + -- clear the FOV change from the player. + mcl_fovapi.remove_modifier(player, "bowcomplete") -- for the complete zoom in FOV Modifier. + bow_load[player:get_player_name()] = nil bow_index[player:get_player_name()] = nil if minetest.get_modpath("playerphysics") then @@ -314,6 +320,9 @@ controls.register_on_hold(function(player, key, time) end bow_load[name] = minetest.get_us_time() bow_index[name] = player:get_wield_index() + + -- begin Bow Zoom. + mcl_fovapi.apply_modifier(player, "bowcomplete") else if player:get_wield_index() == bow_index[name] then if type(bow_load[name]) == "number" then From 4f3f59f4bce65b7c42a51891dce27a84be1e3fcf Mon Sep 17 00:00:00 2001 From: Michieal Date: Sun, 3 Dec 2023 09:03:01 -0500 Subject: [PATCH 176/345] Put in checks to prevent repeatedly applying the same FOV modifier. Added short circuit to remove_modifier if the modifier is not currently applied. --- mods/PLAYER/mcl_fovapi/init.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index 153cd47a9..b64a78d78 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -74,6 +74,9 @@ function mcl_fovapi.apply_modifier(player, modifier_name) if mcl_fovapi.registered_modifiers[modifier_name] == nil then return end + if mcl_fovapi.applied_modifiers[player][modifier_name] and mcl_fovapi.applied_modifiers[player][modifier_name] == true then + return + end local modifier = mcl_fovapi.registered_modifiers[modifier_name] if modifier.on_start ~= nil then @@ -110,6 +113,8 @@ function mcl_fovapi.remove_modifier(player, modifier_name) return end + if mcl_fovapi.applied_modifiers[player][modifier_name] == nil then return end + if DEBUG then local name = player:get_player_name() minetest.log("FOV::Player: " .. name .. " modifier: " .. modifier_name .. "removed.") From 2f8389d3f52c18304976987d018bf5d5304d5de9 Mon Sep 17 00:00:00 2001 From: Michieal Date: Fri, 8 Dec 2023 20:38:07 -0500 Subject: [PATCH 177/345] Put in check to prevent Trying to Reference a Nil error in Apply_Modifier. --- mods/PLAYER/mcl_fovapi/init.lua | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index b64a78d78..de3dfa01a 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -74,8 +74,10 @@ function mcl_fovapi.apply_modifier(player, modifier_name) if mcl_fovapi.registered_modifiers[modifier_name] == nil then return end - if mcl_fovapi.applied_modifiers[player][modifier_name] and mcl_fovapi.applied_modifiers[player][modifier_name] == true then - return + if mcl_fovapi.applied_modifiers ~= nil and mcl_fovapi.applied_modifiers[player] ~= nil and mcl_fovapi.applied_modifiers[player][modifier_name] ~= nil then + if mcl_fovapi.applied_modifiers[player][modifier_name] and mcl_fovapi.applied_modifiers[player][modifier_name] == true then + return + end end local modifier = mcl_fovapi.registered_modifiers[modifier_name] @@ -113,7 +115,9 @@ function mcl_fovapi.remove_modifier(player, modifier_name) return end - if mcl_fovapi.applied_modifiers[player][modifier_name] == nil then return end + if mcl_fovapi.applied_modifiers[player][modifier_name] == nil then + return + end if DEBUG then local name = player:get_player_name() From 580a1caa387b1e20cc9937f993fd67a2fcbdae62 Mon Sep 17 00:00:00 2001 From: Michieal Date: Fri, 8 Dec 2023 21:00:11 -0500 Subject: [PATCH 178/345] Reworked some of the Apply_Modifier code to help prevent errors. --- mods/PLAYER/mcl_fovapi/init.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index de3dfa01a..debe1142e 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -74,18 +74,23 @@ function mcl_fovapi.apply_modifier(player, modifier_name) if mcl_fovapi.registered_modifiers[modifier_name] == nil then return end - if mcl_fovapi.applied_modifiers ~= nil and mcl_fovapi.applied_modifiers[player] ~= nil and mcl_fovapi.applied_modifiers[player][modifier_name] ~= nil then + if mcl_fovapi.applied_modifiers and mcl_fovapi.applied_modifiers[player] and mcl_fovapi.applied_modifiers[player][modifier_name] then if mcl_fovapi.applied_modifiers[player][modifier_name] and mcl_fovapi.applied_modifiers[player][modifier_name] == true then return end end + if mcl_fovapi.applied_modifiers[player] == nil then + mcl_fovapi.applied_modifiers[player] = {} + end + local modifier = mcl_fovapi.registered_modifiers[modifier_name] if modifier.on_start ~= nil then modifier.on_start(player) end mcl_fovapi.applied_modifiers[player][modifier_name] = true -- set the applied to be true. + if DEBUG then minetest.log("FOV::Player Applied Modifiers :" .. dump(mcl_fovapi.applied_modifiers[player])) end From a650f8b3681a83dd37f4076f6f023dccc17917a3 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sat, 9 Dec 2023 23:22:36 +0100 Subject: [PATCH 179/345] Made fovapi registration more robust --- mods/PLAYER/mcl_fovapi/init.lua | 51 ++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index debe1142e..4eac2b03d 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -35,28 +35,42 @@ minetest.register_on_leaveplayer(function(player) mcl_fovapi.applied_modifiers[name] = nil end) -function mcl_fovapi.register_modifier(name, fov_factor, time, is_multiplier, exclusive, on_start, on_end) - if is_multiplier ~= true and is_multiplier ~= false then - is_multiplier = true +function mcl_fovapi.register_modifier(def) + if type(def.name) ~= "string" then + error("Modifier name must be a string") end - if exclusive ~= true and exclusive ~= false then - exclusive = false + if type(def.fov_factor) ~= "number" then + error("FOV factor must be a number") end - local def = { - modifer_name = name, - fov_factor = fov_factor, - time = time, - is_multiplier = is_multiplier, - exclusive = exclusive, - on_start = on_start, - on_end = on_end, - } + if type(def.time) ~= "number" then + error("Transition time must be a number") + end + + if def.on_start ~= nil and type(def.on_start) ~= "function" then + error("Callback on_start must be a function") + end + if def.on_end ~= nil and type(def.on_end) ~= "function" then + error("Callback on_end must be a function") + end + + local mdef = {} + + mdef.fov_factor = def.fov_factor + mdef.time = def.time + + if def.is_multiplier == false then mdef.is_multiplier = false + else mdef.is_multiplier = true end + if def.exclusive == true then mdef.exclusive = true + else mdef.exclusive = false end + + mdef.on_start = def.on_start + mdef.on_end = def.on_end if DEBUG then minetest.log("FOV::Modifier Definition Registered:\n" .. dump(def)) end - mcl_fovapi.registered_modifiers[name] = def + mcl_fovapi.registered_modifiers[def.name] = mdef end @@ -130,6 +144,7 @@ function mcl_fovapi.remove_modifier(player, modifier_name) end mcl_fovapi.applied_modifiers[player][modifier_name] = nil + local modifier = mcl_fovapi.registered_modifiers[modifier_name] -- check for other fov modifiers, and set them up, or reset to default. @@ -139,6 +154,7 @@ function mcl_fovapi.remove_modifier(player, modifier_name) end if #applied == 0 then + player:set_fov(0, false, modifier.time) return end local exc = false @@ -154,10 +170,11 @@ function mcl_fovapi.remove_modifier(player, modifier_name) player:set_fov(exc.fov_factor, exc.is_multiplier, 0) -- we want this to be immediate. else -- handle normal fov modifiers. - player:set_fov(0, false, 0) -- we want this to be immediate. + local fov_factor = 1 for x in applied do - player:set_fov(x.fov_factor, true, 0) + fov_factor = fov_factor * x.fov_factor end + player:set_fov(fov_factor, true, modifier.time) end if mcl_fovapi.registered_modifiers[modifier_name].on_end ~= nil then From 3a007e3bb1c1b4d1663a21c8784221beaa7af8e1 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 10 Dec 2023 00:14:16 +0100 Subject: [PATCH 180/345] Re-registered FOV mods using new API version --- mods/ITEMS/mcl_bows/bow.lua | 7 ++++++- mods/ITEMS/mcl_spyglass/init.lua | 8 +++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index cfbdfb421..aee5545ab 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -34,7 +34,12 @@ local bow_load = {} local bow_index = {} -- define FOV modifier(s) -mcl_fovapi.register_modifier("bowcomplete", 0.8, 1, true, false, nil, nil) +mcl_fovapi.register_modifier({ + name = "bowcomplete", + fov_factor = 0.8, + time = 1, + is_multiplier = true, +}) function mcl_bows.shoot_arrow(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical, bow_stack, collectable) local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, arrow_item.."_entity") diff --git a/mods/ITEMS/mcl_spyglass/init.lua b/mods/ITEMS/mcl_spyglass/init.lua index ab557ebbf..a4ea144e1 100644 --- a/mods/ITEMS/mcl_spyglass/init.lua +++ b/mods/ITEMS/mcl_spyglass/init.lua @@ -17,7 +17,13 @@ minetest.register_craft({ } }) -mcl_fovapi.register_modifier("spyglass", 8, 0.1,false, true, nil, nil) +mcl_fovapi.register_modifier({ + name = "spyglass", + fov_factor = 8, + time = 0.1, + is_multiplier = false, + exclusive = true, +}) local spyglass_scope = {} From 7f5ce4e033924f2cf4085c2674ad17595b287356 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 10 Dec 2023 00:15:09 +0100 Subject: [PATCH 181/345] Fixed modifier application and removal --- mods/PLAYER/mcl_fovapi/init.lua | 38 +++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index 4eac2b03d..61fc244b7 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -123,8 +123,21 @@ function mcl_fovapi.apply_modifier(player, modifier_name) player:set_fov(modifier.fov_factor, modifier.is_multiplier, modifier.time) else -- not exclusive? let's apply it in the mix. - -- assume is_multiplier is true. - player:set_fov(modifier.fov_factor, true, modifier.time) + local fov_factor, is_mult = player:get_fov() + if fov_factor == 0 then + fov_factor = 1 + is_mult = true + end + if modifier.is_multiplier or is_mult then + fov_factor = fov_factor * modifier.fov_factor + else + fov_factor = (fov_factor + modifier.fov_factor) / 2 + end + if modifier.is_multiplier and is_mult then + player:set_fov(fov_factor, true, modifier.time) + else + player:set_fov(fov_factor, false, modififer.time) + end end end @@ -153,12 +166,13 @@ function mcl_fovapi.remove_modifier(player, modifier_name) applied[k] = mcl_fovapi.registered_modifiers[k] end - if #applied == 0 then + local elem = next + if elem(applied) == nil then player:set_fov(0, false, modifier.time) return end local exc = false - for k in applied do + for k, _ in pairs(applied) do if applied[k].exclusive == true then exc = applied[k] break @@ -171,10 +185,20 @@ function mcl_fovapi.remove_modifier(player, modifier_name) else -- handle normal fov modifiers. local fov_factor = 1 - for x in applied do - fov_factor = fov_factor * x.fov_factor + local non_multiplier_added = false + for _, x in pairs(applied) do + if not x.is_multiplier then + if non_multiplier_added then + fov_factor = (fov_factor + x.fov_factor) / 2 + else + non_multiplier_added = true + fov_factor = fov_factor * x.fov_factor + end + else + fov_factor = fov_factor * x.fov_factor + end end - player:set_fov(fov_factor, true, modifier.time) + player:set_fov(fov_factor, not non_multiplier_added, modifier.time) end if mcl_fovapi.registered_modifiers[modifier_name].on_end ~= nil then From 42ec62562daee88d685cd5c6e06b6860c2a1a5dc Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 10 Dec 2023 00:15:33 +0100 Subject: [PATCH 182/345] Moved sprinting into the new FOV api --- mods/PLAYER/mcl_player/init.lua | 2 +- mods/PLAYER/mcl_sprint/init.lua | 42 ++++++++++----------------------- 2 files changed, 14 insertions(+), 30 deletions(-) diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 288b697e1..f3cc782d5 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -177,7 +177,7 @@ minetest.register_on_joinplayer(function(player) player_textures[name] = { "character.png", "blank.png", "blank.png" } --player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) - player:set_fov(86.1) -- see >>> +-- player:set_fov(86.1) -- see >>> end) minetest.register_on_leaveplayer(function(player) diff --git a/mods/PLAYER/mcl_sprint/init.lua b/mods/PLAYER/mcl_sprint/init.lua index 7449ad18c..3d9ef984c 100644 --- a/mods/PLAYER/mcl_sprint/init.lua +++ b/mods/PLAYER/mcl_sprint/init.lua @@ -64,40 +64,24 @@ local function cancelClientSprinting(name) players[name].clientSprint = false end +mcl_fovapi.register_modifier({ + name = "sprint", + fov_factor = 1.1, + time = 0.15, + is_multiplier = true, +}) + local function setSprinting(playerName, sprinting) --Sets the state of a player (0=stopped/moving, 1=sprinting) if not sprinting and not mcl_sprint.is_sprinting(playerName) then return end local player = minetest.get_player_by_name(playerName) - local controls = player:get_player_control() if players[playerName] then players[playerName].sprinting = sprinting - local fov_old = players[playerName].fov - local fov_new = fov_old - local fade_time = .15 - if sprinting == true - or controls.RMB - and string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") - and player:get_wielded_item():get_name() ~= "mcl_bows:bow" then - if sprinting == true then - fov_new = math.min(players[playerName].fov + 0.05, 1.2) - else - fov_new = .7 - players[playerName].fade_time = .3 - end - if sprinting == true then - playerphysics.add_physics_factor(player, "speed", "mcl_sprint:sprint", mcl_sprint.SPEED) - end - elseif sprinting == false - and player:get_wielded_item():get_name() ~= "mcl_bows:bow_0" - and player:get_wielded_item():get_name() ~= "mcl_bows:bow_1" - and player:get_wielded_item():get_name() ~= "mcl_bows:bow_2" then - fov_new = math.max(players[playerName].fov - 0.05, 1.0) - if sprinting == false then - playerphysics.remove_physics_factor(player, "speed", "mcl_sprint:sprint") - end - end - if fov_new ~= fov_old then - players[playerName].fov = fov_new - player:set_fov(fov_new, true, fade_time) + if sprinting then + playerphysics.add_physics_factor(player, "speed", "mcl_sprint:sprint", mcl_sprint.SPEED) + mcl_fovapi.apply_modifier(player, "sprint") + else + playerphysics.remove_physics_factor(player, "speed", "mcl_sprint:sprint") + mcl_fovapi.remove_modifier(player, "sprint") end return true end From 5bf6608483d97994f387f8893de9caf2de24188b Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 10 Dec 2023 00:20:43 +0100 Subject: [PATCH 183/345] Made bow unfocus faster --- mods/ITEMS/mcl_bows/bow.lua | 1 + mods/PLAYER/mcl_fovapi/init.lua | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index aee5545ab..6ae64a14e 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -38,6 +38,7 @@ mcl_fovapi.register_modifier({ name = "bowcomplete", fov_factor = 0.8, time = 1, + reset_time = 0.3, is_multiplier = true, }) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index 61fc244b7..84817e382 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -45,6 +45,9 @@ function mcl_fovapi.register_modifier(def) if type(def.time) ~= "number" then error("Transition time must be a number") end + if def.reset_time ~= nil and type(def.reset_time) ~= "number" then + error("Reset time, if provided, must be a number") + end if def.on_start ~= nil and type(def.on_start) ~= "function" then error("Callback on_start must be a function") @@ -57,6 +60,7 @@ function mcl_fovapi.register_modifier(def) mdef.fov_factor = def.fov_factor mdef.time = def.time + mdef.reset_time = def.reset_time or def.time if def.is_multiplier == false then mdef.is_multiplier = false else mdef.is_multiplier = true end @@ -168,7 +172,7 @@ function mcl_fovapi.remove_modifier(player, modifier_name) local elem = next if elem(applied) == nil then - player:set_fov(0, false, modifier.time) + player:set_fov(0, false, modifier.reset_time) return end local exc = false @@ -198,7 +202,7 @@ function mcl_fovapi.remove_modifier(player, modifier_name) fov_factor = fov_factor * x.fov_factor end end - player:set_fov(fov_factor, not non_multiplier_added, modifier.time) + player:set_fov(fov_factor, not non_multiplier_added, modifier.reset_time) end if mcl_fovapi.registered_modifiers[modifier_name].on_end ~= nil then From 08241f6ea3cf866068456ba7941669fa59d241ba Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 10 Dec 2023 00:26:21 +0100 Subject: [PATCH 184/345] Updated the api.md file --- mods/PLAYER/mcl_fovapi/api.md | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/api.md b/mods/PLAYER/mcl_fovapi/api.md index 43a54de53..5d49bc349 100644 --- a/mods/PLAYER/mcl_fovapi/api.md +++ b/mods/PLAYER/mcl_fovapi/api.md @@ -1,13 +1,13 @@ ### FOV API - * [FOV API](#fov-api) - * [Description](#description) - * [Troubleshooting](#troubleshooting) - * [Modifier Definition](#modifier-definition-) - * [Global MCL_FOVAPI Tables](#global-mclfovapi-tables) - * [Namespaces](#namespaces) - * [Functions](#functions) +* [FOV API](#fov-api) + * [Description](#description) + * [Troubleshooting](#troubleshooting) + * [Modifier Definition](#modifier-definition-) + * [Global MCL_FOVAPI Tables](#global-mclfovapi-tables) + * [Namespaces](#namespaces) + * [Functions](#functions) #### Description @@ -20,20 +20,24 @@ Use it to see what is going on. #### Modifier Definition ```lua def = { - modifer_name = name, + name = name, fov_factor = fov_factor, time = time, + reset_time = reset_time, is_multiplier = is_multiplier, exclusive = exclusive, on_start = on_start, on_end = on_end, } ``` -* Modifier Name: The name of the Modifier, used to identify the specific modifier. Case sensitive. +* Name: The name of the Modifier, used to identify the specific modifier. Case sensitive. * FOV Factor: A float value defining the FOV to apply. Can be an absolute or percentage, depending on Exclusive and Is_Multiplier. * Time: A float value defining the number of seconds to take when applying the FOV Factor. Used to smoothly move between FOVs. Use 0 for an immediate FOV Shift. (Transition time.) +* Reset Time: A float value defining the number of seconds to take when removing the FOV Factor. + Used to smoothly move between FOVs. Use 0 for an immediate FOV Shift. (Reset transition time.) + *If not provided, defaults to **Time*** * Is Multiplier: A bool value used to specify if the FOV Factor is an absolute FOV value or if it should be a percentage of the current FOV. Defaults to `true` if not defined. * Exclusive: A bool value used to specify whether the modifier will override all other FOV modifiers. An example of this @@ -60,7 +64,7 @@ settings. (Expressed as a value usable in `player:set_fov`.) `mcl_fovapi` is the default API Namespace. #### Functions -`mcl_fovapi.register_modifier(name, fov_factor, time, is_multiplier, exclusive, on_start, on_end)` +`mcl_fovapi.register_modifier(def)` Used to register a new FOV Modifier for use. Must be called before applying said modifier to a player. See Modifier Definition for what the parameters are. From f9b192e68f90a9b44f1b1b075a06906bdaca6cf3 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 10 Dec 2023 00:30:04 +0100 Subject: [PATCH 185/345] Updated credits --- mods/PLAYER/mcl_fovapi/mod.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/mod.conf b/mods/PLAYER/mcl_fovapi/mod.conf index b78c78596..86f174c41 100644 --- a/mods/PLAYER/mcl_fovapi/mod.conf +++ b/mods/PLAYER/mcl_fovapi/mod.conf @@ -1,4 +1,4 @@ name = mcl_fovapi -author = Michieal +author = Michieal, Herowl description = An API for handling FOV changes. -depends = mcl_player \ No newline at end of file +depends = mcl_player From 040ce8288ee0ad22fbb7bedcac44acea581f239f Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 10 Dec 2023 00:34:31 +0100 Subject: [PATCH 186/345] Script and documentation cleanup --- mods/PLAYER/mcl_fovapi/api.md | 5 ++--- mods/PLAYER/mcl_fovapi/init.lua | 6 ------ 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/api.md b/mods/PLAYER/mcl_fovapi/api.md index 5d49bc349..d4a9cb1fb 100644 --- a/mods/PLAYER/mcl_fovapi/api.md +++ b/mods/PLAYER/mcl_fovapi/api.md @@ -37,7 +37,7 @@ def = { Used to smoothly move between FOVs. Use 0 for an immediate FOV Shift. (Transition time.) * Reset Time: A float value defining the number of seconds to take when removing the FOV Factor. Used to smoothly move between FOVs. Use 0 for an immediate FOV Shift. (Reset transition time.) - *If not provided, defaults to **Time*** + Defaults to `time` if not defined. * Is Multiplier: A bool value used to specify if the FOV Factor is an absolute FOV value or if it should be a percentage of the current FOV. Defaults to `true` if not defined. * Exclusive: A bool value used to specify whether the modifier will override all other FOV modifiers. An example of this @@ -57,8 +57,7 @@ There are three tables that are accessible via the API. They are `registered_mod `mcl_fovapi.registered_modifiers` has the definitions of all the registered FOV Modifiers. Indexed by Modifier Name. And, `mcl_fovapi.applied_modifiers` is indexed by the Player Name. It contains the names of all the modifiers applied to the -player. The `mcl_fovapi.default_fov` table is indexed by the Player Name, and contains the Default FOVs of the player from the -settings. (Expressed as a value usable in `player:set_fov`.) +player. #### Namespaces `mcl_fovapi` is the default API Namespace. diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index 84817e382..19fa393c0 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -12,15 +12,10 @@ local pairs = pairs -- Globals mcl_fovapi = {} -mcl_fovapi.default_fov = {} -- Handles default fov for players mcl_fovapi.registered_modifiers = {} mcl_fovapi.applied_modifiers = {} minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() - -- Assign default FOV - mcl_fovapi.default_fov[name] = player:get_fov() - if DEBUG then minetest.log("FOV::Player: " .. name .. "\nFOV: " .. player:get_fov()) end @@ -31,7 +26,6 @@ minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() -- handle clean up - mcl_fovapi.default_fov[name] = nil mcl_fovapi.applied_modifiers[name] = nil end) From 98b6ead591ce8945e957b6d74a72adfff14ac0d7 Mon Sep 17 00:00:00 2001 From: Michieal Date: Mon, 11 Dec 2023 03:46:38 +0000 Subject: [PATCH 187/345] Fixed a couple of errors Removed a debug statement that was broken. Changed `modififer` to `modifier` in a code block. --- mods/PLAYER/mcl_fovapi/init.lua | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index 19fa393c0..70eb5b81e 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -15,13 +15,6 @@ mcl_fovapi = {} mcl_fovapi.registered_modifiers = {} mcl_fovapi.applied_modifiers = {} -minetest.register_on_joinplayer(function(player) - if DEBUG then - minetest.log("FOV::Player: " .. name .. "\nFOV: " .. player:get_fov()) - end - -end) - minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() @@ -134,7 +127,7 @@ function mcl_fovapi.apply_modifier(player, modifier_name) if modifier.is_multiplier and is_mult then player:set_fov(fov_factor, true, modifier.time) else - player:set_fov(fov_factor, false, modififer.time) + player:set_fov(fov_factor, false, modifier.time) end end From 5afd0aa255c43d471a803863ee1bb16cdb08e354 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 12 Dec 2023 01:45:07 +0100 Subject: [PATCH 188/345] Fixed the exclusive modifiers not being exclusive --- mods/PLAYER/mcl_fovapi/init.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index 70eb5b81e..c3d2dff4c 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -89,6 +89,10 @@ function mcl_fovapi.apply_modifier(player, modifier_name) mcl_fovapi.applied_modifiers[player] = {} end + for k, _ in pairs(mcl_fovapi.applied_modifiers[player]) do + if mcl_fovapi.registered_modifiers[k].exclusive == true then return end + end + local modifier = mcl_fovapi.registered_modifiers[modifier_name] if modifier.on_start ~= nil then modifier.on_start(player) From e312955a14df85dc090e33701fc936bef937c67b Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Wed, 13 Dec 2023 00:08:35 +0100 Subject: [PATCH 189/345] Made spyglass reset instant --- mods/ITEMS/mcl_spyglass/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ITEMS/mcl_spyglass/init.lua b/mods/ITEMS/mcl_spyglass/init.lua index a4ea144e1..56b71b961 100644 --- a/mods/ITEMS/mcl_spyglass/init.lua +++ b/mods/ITEMS/mcl_spyglass/init.lua @@ -21,6 +21,7 @@ mcl_fovapi.register_modifier({ name = "spyglass", fov_factor = 8, time = 0.1, + reset_time = 0, is_multiplier = false, exclusive = true, }) From 8a5058e0327c0096368f122daf64b4724a9b67e2 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Wed, 13 Dec 2023 00:29:22 +0100 Subject: [PATCH 190/345] Unified and refactored FOV API code --- mods/PLAYER/mcl_fovapi/init.lua | 71 ++++++++++++++++----------------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index c3d2dff4c..92815d833 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -15,11 +15,17 @@ mcl_fovapi = {} mcl_fovapi.registered_modifiers = {} mcl_fovapi.applied_modifiers = {} +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + + -- initialization + mcl_fovapi.applied_modifiers[player_name] = {} +end) minetest.register_on_leaveplayer(function(player) - local name = player:get_player_name() + local player_name = player:get_player_name() -- handle clean up - mcl_fovapi.applied_modifiers[name] = nil + mcl_fovapi.applied_modifiers[player_name] = nil end) function mcl_fovapi.register_modifier(def) @@ -66,47 +72,38 @@ function mcl_fovapi.register_modifier(def) end minetest.register_on_respawnplayer(function(player) - mcl_fovapi.remove_all_modifiers(player:get_player_name()) + mcl_fovapi.remove_all_modifiers(player) end) function mcl_fovapi.apply_modifier(player, modifier_name) - if player == nil then - return - end - if modifier_name == nil then + if not player or not modifier_name then return end if mcl_fovapi.registered_modifiers[modifier_name] == nil then return end - if mcl_fovapi.applied_modifiers and mcl_fovapi.applied_modifiers[player] and mcl_fovapi.applied_modifiers[player][modifier_name] then - if mcl_fovapi.applied_modifiers[player][modifier_name] and mcl_fovapi.applied_modifiers[player][modifier_name] == true then - return - end + local player_name = player:get_player_name() + if mcl_fovapi.applied_modifiers and mcl_fovapi.applied_modifiers[player_name] and mcl_fovapi.applied_modifiers[player_name][modifier_name] then + return end - if mcl_fovapi.applied_modifiers[player] == nil then - mcl_fovapi.applied_modifiers[player] = {} - end - - for k, _ in pairs(mcl_fovapi.applied_modifiers[player]) do + for k, _ in pairs(mcl_fovapi.applied_modifiers[player_name]) do if mcl_fovapi.registered_modifiers[k].exclusive == true then return end end local modifier = mcl_fovapi.registered_modifiers[modifier_name] - if modifier.on_start ~= nil then + if modifier.on_start then modifier.on_start(player) end - mcl_fovapi.applied_modifiers[player][modifier_name] = true -- set the applied to be true. + mcl_fovapi.applied_modifiers[player_name][modifier_name] = true -- set the applied to be true. if DEBUG then - minetest.log("FOV::Player Applied Modifiers :" .. dump(mcl_fovapi.applied_modifiers[player])) + minetest.log("FOV::Player Applied Modifiers :" .. dump(mcl_fovapi.applied_modifiers[player_name])) end - local pname = player:get_player_name() if DEBUG then - minetest.log("FOV::Modifier applied to player:" .. pname .. " modifier: " .. modifier_name) + minetest.log("FOV::Modifier applied to player:" .. player_name .. " modifier: " .. modifier_name) end -- modifier apply code. @@ -138,26 +135,27 @@ function mcl_fovapi.apply_modifier(player, modifier_name) end function mcl_fovapi.remove_modifier(player, modifier_name) - if player == nil then + if not player or not modifier_name then return end - if mcl_fovapi.applied_modifiers[player][modifier_name] == nil then - return + local player_name = player:get_player_name() + if not mcl_fovapi.applied_modifiers[player_name] + or not mcl_fovapi.applied_modifiers[player_name][modifier_name] then + return end if DEBUG then - local name = player:get_player_name() - minetest.log("FOV::Player: " .. name .. " modifier: " .. modifier_name .. "removed.") + minetest.log("FOV::Player: " .. player_name .. " modifier: " .. modifier_name .. "removed.") end - mcl_fovapi.applied_modifiers[player][modifier_name] = nil + mcl_fovapi.applied_modifiers[player_name][modifier_name] = nil local modifier = mcl_fovapi.registered_modifiers[modifier_name] -- check for other fov modifiers, and set them up, or reset to default. local applied = {} - for k, _ in pairs(mcl_fovapi.applied_modifiers[player]) do + for k, _ in pairs(mcl_fovapi.applied_modifiers[player_name]) do applied[k] = mcl_fovapi.registered_modifiers[k] end @@ -196,30 +194,29 @@ function mcl_fovapi.remove_modifier(player, modifier_name) player:set_fov(fov_factor, not non_multiplier_added, modifier.reset_time) end - if mcl_fovapi.registered_modifiers[modifier_name].on_end ~= nil then + if mcl_fovapi.registered_modifiers[modifier_name].on_end then mcl_fovapi.registered_modifiers[modifier_name].on_end(player) end end function mcl_fovapi.remove_all_modifiers(player) - if player == nil then + if not player then return end + local player_name = player:get_player_name() if DEBUG then - local name = player:get_player_name() - minetest.log("FOV::Player: " .. name .. " modifiers have been reset.") + minetest.log("FOV::Player: " .. player_name .. " modifiers have been reset.") end - for x in mcl_fovapi.applied_modifiers[player] do + for name, x in pairs(mcl_fovapi.applied_modifiers[player_name]) do x = nil + if mcl_fovapi.registered_modifiers[name].on_end then + mcl_fovapi.registered_modifiers[name].on_end(player) + end end player:set_fov(0, false, 0) - if mcl_fovapi.registered_modifiers[modifier_name].on_end ~= nil then - mcl_fovapi.registered_modifiers[modifier_name].on_end(player) - end - end --[[ From d7ed37ef25e14b0451a627809e34599dd96dc436 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Tue, 19 Dec 2023 15:31:29 +0000 Subject: [PATCH 191/345] Remove redundant knockback limiter --- mods/ITEMS/mcl_enchanting/enchantments.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index db2aa9da6..c26df61d9 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -311,7 +311,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool local dir_dot = (hv.x * dir.x) + (hv.z * dir.z) local hitter_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) local player_mag = math.sqrt((v.x * v.x) + (v.z * v.z)) - if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then + if dir_dot > 0 then knockback = knockback + hitter_mag * 0.6875 end -- reduce floatiness From ff882707def990b5e30eede831a7f4aa43626a1d Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Tue, 19 Dec 2023 16:15:41 +0000 Subject: [PATCH 192/345] Rework moving majority of the added velocity knockbacks into sprinting --- mods/ITEMS/mcl_enchanting/enchantments.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index c26df61d9..7744f2c7e 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -307,12 +307,15 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end 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)) local player_mag = math.sqrt((v.x * v.x) + (v.z * v.z)) - if dir_dot > 0 then + 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.34375 end -- reduce floatiness minetest.after(0.25, function() From 76bff2b540b55b644aa2f07b79ad5db17c1c5dca Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Tue, 19 Dec 2023 16:49:48 +0000 Subject: [PATCH 193/345] Add minimum pvp knockbacks to other meele weapons --- mods/ITEMS/mcl_enchanting/enchantments.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 7744f2c7e..60e8a6c99 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -304,6 +304,8 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool -- add minimum knockback if knockback <= 1.5 then knockback = knockback + 4.875 + elseif knockback <= 6.19 then + knockback = knockback + 0.609375 end end -- add player velocity to knockback From e19de859903e3b75a4378d560162f52b53619c71 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Tue, 19 Dec 2023 17:19:09 +0000 Subject: [PATCH 194/345] Adjust the difference between sprinting & walking knockbacks for a more seemless transition --- mods/ITEMS/mcl_enchanting/enchantments.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 60e8a6c99..29fdab6f6 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -317,7 +317,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool 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.34375 + knockback = knockback + hitter_mag * 0.515625 end -- reduce floatiness minetest.after(0.25, function() From 96fa6c251ef59acaed76b6e65e4a7af795cb62b6 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Wed, 20 Dec 2023 15:50:37 +0000 Subject: [PATCH 195/345] Counteract self forward velocity when hit by players in pvp --- mods/ITEMS/mcl_enchanting/enchantments.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 29fdab6f6..bd9b4047d 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -308,6 +308,11 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool 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() From 4cfd4ef6ce890c0435fd2056d92c0d896f058380 Mon Sep 17 00:00:00 2001 From: cora Date: Sun, 10 Dec 2023 22:47:28 +0100 Subject: [PATCH 196/345] Fix wrong argument when piston dig calls on_dignode callbacks --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 88ca9d30e..9fd381b76 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -284,7 +284,7 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, local counted_drops = {} minetest.remove_node(n.pos) for _, callback in pairs(minetest.registered_on_dignodes) do - callback(n.pos, n) + callback(n.pos, n.node) end for _, item in ipairs(drops) do if type(item) ~= "string" then From d5eda7352c6d2e602ccc698fb10c92e9a78c06db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 18:29:13 -0600 Subject: [PATCH 197/345] Remove whitespace-only translation in mcl_blast_furnace template file --- mods/ITEMS/mcl_blast_furnace/locale/template.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_blast_furnace/locale/template.txt b/mods/ITEMS/mcl_blast_furnace/locale/template.txt index 46841046d..7b2b35c21 100644 --- a/mods/ITEMS/mcl_blast_furnace/locale/template.txt +++ b/mods/ITEMS/mcl_blast_furnace/locale/template.txt @@ -6,6 +6,6 @@ Use the recipe book to see what ores you can smelt, what you can use as fuel and Use the blast furnace to open the furnace menu.= Place a furnace fuel in the lower slot and the source material in the upper slot.= The blast furnace will slowly use its fuel to smelt the item.= -The result will be placed into the output slot at the right side.= +The result will be placed into the output slot at the right side.= Blast Furnaces smelt several items, mainly ores and armor, using a furnace fuel, but twice as fast as a normal furnace.= Active Blast Furnace= From 5e28ff2d06f0cbd268351566eceade4b482da0bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 18:34:16 -0600 Subject: [PATCH 198/345] Delete non-empty translation in mcl_enchanting template file --- mods/ITEMS/mcl_enchanting/locale/template.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/locale/template.txt b/mods/ITEMS/mcl_enchanting/locale/template.txt index 59876dcf3..2a0890d91 100644 --- a/mods/ITEMS/mcl_enchanting/locale/template.txt +++ b/mods/ITEMS/mcl_enchanting/locale/template.txt @@ -130,7 +130,7 @@ Aqua Affinity= Increases underwater mining speed.= Blast Protection= Reduces explosion damage and knockback.= -Curse of Binding=Malédiction du lien éternel +Curse of Binding= Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.= Feather Falling= Reduces fall damage.= From 1f52b7051a858286a4a1a064835a8bea47fe3989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 18:58:15 -0600 Subject: [PATCH 199/345] Add missing placeholder(s) in translation: '@1' --- mods/HUD/awards/locale/awards.de.tr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/HUD/awards/locale/awards.de.tr b/mods/HUD/awards/locale/awards.de.tr index 190a76071..1decf81ec 100644 --- a/mods/HUD/awards/locale/awards.de.tr +++ b/mods/HUD/awards/locale/awards.de.tr @@ -1,7 +1,7 @@ # textdomain:awards @1: @2=@1: @2 @1 (got)=@1 (erhalten) -@1’s awards:=Auszeichnungen von @: +@1’s awards:=Auszeichnungen von @1: (Secret Advancement)=(Geheime Auszeichnung) Achievement gotten!=Auszeichnung erhalten! Achievement gotten:=Auszeichnung erhalten: @@ -61,4 +61,4 @@ Achievement “@1” does not exist.=Auszeichnung »@1« existiert nicht. Write something in chat.=Schreiben Sie etwas in den Chat. Write @1 chat messages.=Schreiben Sie @1 Chatnachrichten. @1/@2 chat messages=@1/@2 Chatnachrichten -Awards are disabled, enable them first by using /awards enable!=Ihre Auszeichnungen sind aktuell deaktiviert, bitte aktivieren Sie diese zuerst indem Sie /awards enable ausführen bevor Sie diesen Befehl erneut verwenden! \ No newline at end of file +Awards are disabled, enable them first by using /awards enable!=Ihre Auszeichnungen sind aktuell deaktiviert, bitte aktivieren Sie diese zuerst indem Sie /awards enable ausführen bevor Sie diesen Befehl erneut verwenden! From dc4c559ad930136e82dd09212f9467b3815e8723 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 19:04:46 -0600 Subject: [PATCH 200/345] Escape equals sign in translation --- mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr index 1547a36c0..775815885 100644 --- a/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr +++ b/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr @@ -1,7 +1,7 @@ # textdomain: mcl_potions []= [] -Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 @= 100%)=Ajoutez-vous un effet de statut. Arguments: : nom de l'effet de statut, par ex. poison. : durée en secondes. : multiplicateur de force d'effet (1 @ = 100%) +Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 @= 100%)=Ajoutez-vous un effet de statut. Arguments: : nom de l'effet de statut, par ex. poison. : durée en secondes. : multiplicateur de force d'effet (1 @= 100%) Missing effect parameter!=Paramètre d'effet manquant! Missing or invalid duration parameter!=Paramètre durée manquant ou invalide! From 325c6ab4cadfa27ae3271e9e12a7560afc4a4bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 19:13:30 -0600 Subject: [PATCH 201/345] Escape equals signs in translation file mcl_deepslate.pt_BR.tr --- mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.pt_BR.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.pt_BR.tr b/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.pt_BR.tr index 4f7c6ad24..e86bb42e9 100644 --- a/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.pt_BR.tr +++ b/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.pt_BR.tr @@ -50,4 +50,4 @@ Polished Deepslate Stairs=Escadas de Ardósia Polida Polished Deepslate Wall=Muro de Ardósia Polida Polished Deepslate=Ardósia Polida Tuff=Tufo -Tuff is an ornamental rock formed from volcanic ash, occurring in underground blobs below Y=16.=Tufo é uma rocha ornamental formada a partir de cinzas vulcânicas, ocorrendo em bolhas no subsolo abaixo de Y=16. +Tuff is an ornamental rock formed from volcanic ash, occurring in underground blobs below Y@=16.=Tufo é uma rocha ornamental formada a partir de cinzas vulcânicas, ocorrendo em bolhas no subsolo abaixo de Y@=16. From 0f82c623d57d31c358fb6a89e3bffd3d31998eb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 23:15:12 -0600 Subject: [PATCH 202/345] Add missing placeholder(s) in mcl_farming.fr.tr translation: '@1' --- mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr index 5b14b109b..2b4bedcff 100644 --- a/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr +++ b/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr @@ -101,5 +101,5 @@ Turns block into farmland=Transforme un bloc en terres agricoles Surface for crops=Surface pour les cultures Can become wet=Peut devenir humide Uses: @1=Utilisations : @1 -Sweet Berry Bush (Stage @1)=Buisson de baies sucrées (étape 1) +Sweet Berry Bush (Stage @1)=Buisson de baies sucrées (étape @1) Sweet Berry=Baie sucrée From 0d1a6d91e9b4f2c6572a87655c912c26588fba6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 23:24:03 -0600 Subject: [PATCH 203/345] Remove an unescaped equals sign in mcl_info.fr.tr translation --- mods/HUD/mcl_info/locale/mcl_info.fr.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/HUD/mcl_info/locale/mcl_info.fr.tr b/mods/HUD/mcl_info/locale/mcl_info.fr.tr index 96fb2622e..19ff9553d 100644 --- a/mods/HUD/mcl_info/locale/mcl_info.fr.tr +++ b/mods/HUD/mcl_info/locale/mcl_info.fr.tr @@ -1,4 +1,4 @@ # textdomain: mcl_info -Set debug bit mask: 0 @= disable, 1 @= biome name, 2 @= coordinates, 3 @= all=Régler le masque de bits pour débuguer : 0 @= pour désactiver, 1 @= nom du biome, 2 @= coordonnées, 3 @= tout= +Set debug bit mask: 0 @= disable, 1 @= biome name, 2 @= coordinates, 3 @= all=Régler le masque de bits pour débuguer : 0 @= pour désactiver, 1 @= nom du biome, 2 @= coordonnées, 3 @= tout Error! Possible values are integer numbers from @1 to @2=Erreur ! Les valeurs possibles sont des nombres entiers de @1 à @2 Debug bit mask set to @1=Masque de bits de débuguage réglé à @1 From c9d221976b897d43c21771beb6c5efd5b211b6b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 23:40:33 -0600 Subject: [PATCH 204/345] Escape equals signs in translation file mcl_doc_basics.it.tr --- mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.it.tr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.it.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.it.tr index 694735cac..afe82fd27 100644 --- a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.it.tr +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.it.tr @@ -25,7 +25,7 @@ Minetest is a free software game engine for games based on voxel gameplay, inspi The player is thrown into a huge world made out of cubes or blocks. These cubes usually make the landscape they blocks can be removed and placed almost entirely freely. Using the collected items, new tools and other items can be crafted. Games in Minetest (also called “subgames”) can, however, be much more complex than this.=L'utente è gettat* in un enorme mondo fatto di cubi o blocchi. Questi cubi normalmente compongono il panorama e possono essere tolti o messi quasi completamente liberamente. Usando gli oggetti raccolti, si possono assemblare nuovi strumenti e altri oggetti. I giochi in Minetest (chiamati anche "subgame") possono, comunque, essere molto più complessi. A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorational blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.=Una caratteristica centrale di Minetest è la capacità integrata di usare moduli. I moduli modificano l'esperienza di gioco esistente. Possono essere tanto semplici da aggiungere qualche blocco decorativo o essere molto complessi, per esempio introducendo concetti di gioco totalmente nuovi, generare un tipo di mondo completamente diverso, e molte altre cose. Minetest can be played alone or online together with multiple players. Online play will work out of the box with any mods, with no need for additional software as they are entirely provided by the server.=Minetest può essere giocato localmente o in rete assieme a più utenti. Il gioco in rete funzionerà immediatamente senza nessun modulo, senza bisogno di programmi aggiuntivi perché interamente forniti dal server. -Minetest is usually bundled with a simple default game, named “Minetest Game” (shown in images 1 and 2). You probably already have it. Other games for Minetest can be downloaded from the official Minetest forums .=Minetest generalmente include un gioco predefinito semplice, chiamato "Minetest Game" (mostrato nelle immagini 1 e 2). Probabilmente lo avete già. Altri giochi per Minetest possono essere scaricati dai forum ufficiali di Minetest . +Minetest is usually bundled with a simple default game, named “Minetest Game” (shown in images 1 and 2). You probably already have it. Other games for Minetest can be downloaded from the official Minetest forums .=Minetest generalmente include un gioco predefinito semplice, chiamato "Minetest Game" (mostrato nelle immagini 1 e 2). Probabilmente lo avete già. Altri giochi per Minetest possono essere scaricati dai forum ufficiali di Minetest . Sneaking=Strisciare Sneaking makes you walk slower and prevents you from falling off the edge of a block.=Strisciare vi fa camminare più lentamente e vi impedisce di cadere dal bordo di un blocco. To sneak, hold down the sneak key (default: [Shift]). When you release it, you stop sneaking. Careful: When you release the sneak key at a ledge, you might fall!=Per strisciare, tenete premuto il tasto per strisciare (predefinito [Maiusc]). Quando lo rilasciate, smettete di strisciare. Fate attenzione: quando rilasciate il tasto per strisciare vicino a un orlo, potreste cadere! @@ -396,7 +396,7 @@ Note that “transparency” here only means that the block is able to carry bri Coordinates=Coordinate The Minetest world is a large cube. And because of this, a position in the world can be easily expressed with Cartesian coordinates. That is, for each position in the world, there are 3 values X, Y and Z.=Il mondo di Minetest è un grande cubo. E per questo, una posizione nel mondo può essere facilmente espressa tramite coordinate Cartesiane. Cioè, per ogni posizione nel mondo, esistono tre valori: X, Y e Z. Like this: (5, 45, -12)=Come questi: (5, 45, -12) -This refers to the position where X=5, Y=45 and Z=-12. The 3 letters are called “axes”: Y is for the height. X and Z are for the horizontal position.=Ciò si riferisce alla posizione dove X=5 (si legga “X vale 5”, NdT), Y=45 e Z=-12. Le tre lettere sono chiamate “assi”: Y si riferisce all'altezza. X e Z si riferiscono alla posizione orizzontale. +This refers to the position where X@=5, Y@=45 and Z@=-12. The 3 letters are called “axes”: Y is for the height. X and Z are for the horizontal position.=Ciò si riferisce alla posizione dove X@=5 (si legga “X vale 5”, NdT), Y@=45 e Z@=-12. Le tre lettere sono chiamate “assi”: Y si riferisce all'altezza. X e Z si riferiscono alla posizione orizzontale. The values for X, Y and Z work like this:=I valori di X, Y e Z funzionano così: • If you go up, Y increases=• Se salite, Y aumenta • If you go down, Y decreases=• Se scendete, Y diminuisce From 9d62c4ca5e68922108052bf1080f657f1763fb8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 23:46:30 -0600 Subject: [PATCH 205/345] Fix missing placeholder(s) in mesecons_commandblock.es.tr translation: '@1' '@2' --- .../mesecons_commandblock/locale/mesecons_commandblock.es.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.es.tr b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.es.tr index 938c710b9..2933f4fc4 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.es.tr +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.es.tr @@ -1,7 +1,7 @@ # textdomain: mesecons_commandblock Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands.=Error: el comando "@1" no existe; su bloque de comando no ha sido cambiado. Utilice el comando de chat "help" para obtener una lista de los comandos disponibles. Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands. Hint: Try to remove the leading slash.=Error: el comando "@1" no existe; su bloque de comando no ha sido cambiado. Utilice el comando de chat "help" para obtener una lista de los comandos disponibles. Sugerencia: intente eliminar la barra diagonal inicial. -Error: You have insufficient privileges to use the command “@1” (missing privilege: @2)! The command block has not been changed.=Error: ¡No tiene suficientes privilegios para usar el comando “@ 1” (faltan privilegios: @ 2)! El bloque de comando no ha sido cambiado. +Error: You have insufficient privileges to use the command “@1” (missing privilege: @2)! The command block has not been changed.=Error: ¡No tiene suficientes privilegios para usar el comando “@1” (faltan privilegios: @2)! El bloque de comando no ha sido cambiado. Error: No commander! Block must be replaced.=Error: ¡Sin dueño! El bloque debe ser reemplazado. Commander: @1=Dueño: @1 Submit=Aceptar From 74ab3ffeee77922d530991df32bc0f872fd7dcf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 23:55:39 -0600 Subject: [PATCH 206/345] Add missing placeholder(s) in doc_items.pt.tr translation: '@1' --- mods/HELP/doc/doc_items/locale/doc_items.pt.tr | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/HELP/doc/doc_items/locale/doc_items.pt.tr b/mods/HELP/doc/doc_items/locale/doc_items.pt.tr index 648e14569..abcf11547 100644 --- a/mods/HELP/doc/doc_items/locale/doc_items.pt.tr +++ b/mods/HELP/doc/doc_items/locale/doc_items.pt.tr @@ -53,8 +53,8 @@ Range: 4=Range: 4 Rating @1=Classificação @1 # @1 is minimal rating, @2 is maximum rating Rating @1-@2=Classificação @1-@2 -The fall damage on this block is increased by @1%.=O dano por queda nesse bloco é aumentado em @ 1%. -The fall damage on this block is reduced by @1%.=O dano por queda nesse bloco é reduzido em @ 1%. +The fall damage on this block is increased by @1%.=O dano por queda nesse bloco é aumentado em @1%. +The fall damage on this block is reduced by @1%.=O dano por queda nesse bloco é reduzido em @1%. This block allows light to propagate with a small loss of brightness, and sunlight can even go through losslessly.=Esse bloco permite que a luz se propague com uma pequena perda de brilho, e a luz solar pode até passar sem perdas. This block allows light to propagate with a small loss of brightness.=Esse bloco permite que a luz se propague com uma pequena perda de brilho. This block allows sunlight to propagate without loss in brightness.=Esse bloco permite que a luz solar se propague sem perda de brilho. @@ -78,7 +78,7 @@ This block connects to this block: @1.=Esse bloco se conecta a esse bloco: @1. This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds.=Esse bloco diminui a sua respiração e causa um dano por afogamento de @1 ponto de vida a cada 2 segundos. This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds.=Esse bloco diminui a sua respiração e causa um dano por afogamento de @1 pontos de vida a cada 2 segundos. This block is a light source with a light level of @1.=Esse bloco é uma fonte de luz com um nível de luz de @1. -This block glows faintly with a light level of @1.=Esse bloco tem um brilho fraco com um nível de luz de @ 1. +This block glows faintly with a light level of @1.=Esse bloco tem um brilho fraco com um nível de luz de @1. This block is a building block for creating various buildings.=Esse bloco é um bloco de construção para criar vários edifícios. This block is a liquid with these properties:=Esse bloco é um líquido com as seguintes propriedades: This block is affected by gravity and can fall.=Esse bloco é afetado pela gravidade e pode cair. @@ -123,7 +123,7 @@ any level=qualquer nível level 0=nível 0 level 0-@1=nivel 0-@1 unknown=desconhecido -Unknown item (@1)=Item desconhecido +Unknown item (@1)=Item desconhecido (@1) • @1: @2= • @1: @2 HP= • @1: @2, @3= From ec8f3f5530ebe2b3db593841f9c07939f46173fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Thu, 21 Dec 2023 00:18:40 -0600 Subject: [PATCH 207/345] Start the beggining of the mcl_tt spanish translation --- mods/HELP/mcl_tt/locale/mcl_tt.es.tr | 48 ++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 mods/HELP/mcl_tt/locale/mcl_tt.es.tr diff --git a/mods/HELP/mcl_tt/locale/mcl_tt.es.tr b/mods/HELP/mcl_tt/locale/mcl_tt.es.tr new file mode 100644 index 000000000..b26e9140e --- /dev/null +++ b/mods/HELP/mcl_tt/locale/mcl_tt.es.tr @@ -0,0 +1,48 @@ +# textdomain: mcl_tt +Head armor= +Torso armor= +Legs armor= +Feet armor= +Armor points: @1=Puntos de armadura: @1 +Armor durability: @1=Durabilidad de armadura: @1 +Protection: @1%=Protección: @1% +Hunger points: +@1=Puntos de hambre: +@1 +Saturation points: +@1=Puntos de saturación: +@1 +Deals damage when falling= +Grows on grass blocks or dirt= +Grows on grass blocks, podzol, dirt or coarse dirt= +Flammable= +Zombie view range: -50%= +Skeleton view range: -50%= +Creeper view range: -50%= +Damage: @1=Daño: @1 +Damage (@1): @2= +Healing: @1= +Healing (@1): @2= +Full punch interval: @1s= +Contact damage: @1 per second= +Contact healing: @1 per second= +Drowning damage: @1= +Bouncy (@1%)= +Luminance: @1= +Slippery= +Climbable= +Climbable (only downwards)= +No jumping= +No swimming upwards= +No rising= +Fall damage: @1%= +Fall damage: +@1%= +No fall damage= +Mining speed: @1= +Very fast=Muy rápido +Extremely fast=Extremadamente rápido +Fast=Rápido +Slow=Lento +Very slow=Muy lento +Painfully slow= +Mining durability: @1= +Block breaking strength: @1= +@1 uses=@1 usos +Unlimited uses=Usos ilimitados +Durability: @1=Durabilidad: @1 From 10dcdb7d6b546171d5e4eb62881aed9b1d5ffd2c Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 21 Dec 2023 15:52:26 +0000 Subject: [PATCH 208/345] Remove unnecessary player vector magnitude calculation --- mods/ITEMS/mcl_enchanting/enchantments.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index bd9b4047d..591dfb679 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -318,7 +318,6 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool 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)) - local player_mag = math.sqrt((v.x * v.x) + (v.z * v.z)) if dir_dot > 0 and mcl_sprint.is_sprinting(h_name) then knockback = knockback + hitter_mag * 0.6875 elseif dir_dot > 0 then From 113f07581b203b5728b22ed5431f548fe44f8658 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 14 Dec 2023 12:42:44 -0300 Subject: [PATCH 209/345] new sunflower mesh --- mods/ITEMS/mcl_flowers/init.lua | 31 +++++++++- .../models/mcl_flowers_sunflower.mtl | 32 ++++++++++ .../models/mcl_flowers_sunflower.obj | 59 +++++++++++++++++++ 3 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.mtl create mode 100644 mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index 10189240b..148d9db53 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -383,9 +383,6 @@ add_large_plant("peony", S("Peony"), S("A peony is a large plant which occupies add_large_plant("rose_bush", S("Rose Bush"), S("A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production."), "mcl_flowers_double_plant_rose_bottom.png", "mcl_flowers_double_plant_rose_top.png", nil, 5/16, 1/16) add_large_plant("lilac", S("Lilac"), S("A lilac is a large plant which occupies two blocks. It is mainly used in dye production."), "mcl_flowers_double_plant_syringa_bottom.png", "mcl_flowers_double_plant_syringa_top.png", nil, 5/16, 6/16) --- TODO: Make the sunflower face East. Requires a mesh for the top node. -add_large_plant("sunflower", S("Sunflower"), S("A sunflower is a large plant which occupies two blocks. It is mainly used in dye production."), "mcl_flowers_double_plant_sunflower_bottom.png", "mcl_flowers_double_plant_sunflower_top.png^mcl_flowers_double_plant_sunflower_front.png", "mcl_flowers_double_plant_sunflower_front.png", 6/16, 6/16) - local longdesc_grass = S("Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.") local longdesc_fern = S("Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.") @@ -522,4 +519,32 @@ if mod_mcimport and mg_name == "singlenode" and fix_doubleplants == true then }) end +minetest.register_node("mcl_flowers:sunflower", { + description = S("Sunflower"), + _doc_items_longdesc = S("A sunflower is a large plant which occupies two blocks. It is mainly used in dye production."), + drawtype = "mesh", + groups = { + attached_node = 1, deco_block = 1, + dig_by_water = 1, destroy_by_lava_flow = 1, dig_by_piston = 1, + flammable = 2, fire_encouragement = 60, fire_flammability = 100, + plant = 1, double_plant = 1, non_mycelium_plant = 1, compostability = 65, grass_palette = nil + }, + inventory_image = "mcl_flowers_double_plant_sunflower_front.png", + mesh = "mcl_flowers_sunflower.obj", + paramtype = "light", + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 1.5, 0.25} + }, + sunlight_propagates = true, + tiles = { + "mcl_flowers_double_plant_sunflower_bottom.png", + "mcl_flowers_double_plant_sunflower_bottom.png", + "mcl_flowers_double_plant_sunflower_front.png", + "mcl_flowers_double_plant_sunflower_back.png" + }, + walkable = false, + wield_image = "mcl_flowers_double_plant_sunflower_front.png" +}) + dofile(modpath.."/register.lua") diff --git a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.mtl b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.mtl new file mode 100644 index 000000000..1a72d010b --- /dev/null +++ b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.mtl @@ -0,0 +1,32 @@ +# Blender 3.6.4 MTL File: 'sunflower.blend' +# www.blender.org + +newmtl Flower_1 +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd C:/Minetest-5.8/games/mineclone2/textures/mcl_flowers_double_plant_sunflower_front.png + +newmtl Flower_2 +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd C:/Minetest-5.8/games/mineclone2/textures/mcl_flowers_double_plant_sunflower_back.png + +newmtl Stem +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd C:/Minetest-5.8/games/mineclone2/textures/mcl_flowers_double_plant_sunflower_bottom.png diff --git a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj new file mode 100644 index 000000000..4bac1dbd7 --- /dev/null +++ b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj @@ -0,0 +1,59 @@ +# Blender 3.6.4 +# www.blender.org +mtllib sunflower.mtl +o Stem_1 +v 0.309359 1.500000 -0.309359 +v -0.309359 1.500000 0.309359 +v 0.309359 -0.500000 -0.309359 +v -0.309359 -0.500000 0.309359 +vn 0.7071 -0.0000 0.7071 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +s 0 +g Stem_1_Stem +usemtl Stem +f 1/1/1 2/2/1 4/3/1 3/4/1 +o Stem_2 +v 0.309359 1.500000 0.309359 +v -0.309359 1.500000 -0.309359 +v 0.309359 -0.500000 0.309359 +v -0.309359 -0.500000 -0.309359 +vn -0.7071 -0.0000 0.7071 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +s 0 +g Stem_2_Stem +usemtl Stem +f 5/5/2 6/6/2 8/7/2 7/8/2 +o Flower_1 +v -0.500000 1.933013 -0.125000 +v -0.500000 1.066987 0.375000 +v 0.500000 1.933013 -0.125000 +v 0.500000 1.066987 0.375000 +vn -0.0000 0.5000 0.8660 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +s 0 +g Flower_1_Flower_1 +usemtl Flower_1 +f 9/9/3 10/10/3 12/11/3 11/12/3 +o Flower_2 +v -0.500000 1.933013 -0.130000 +v -0.500000 1.066987 0.370000 +v 0.500000 1.933013 -0.130000 +v 0.500000 1.066987 0.370000 +vn -0.0000 0.5000 0.8660 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +s 0 +g Flower_2_Flower_2 +usemtl Flower_2 +f 13/13/4 14/14/4 16/15/4 15/16/4 From dd5a9178d9833804cddcaa462245ea42b7d506c0 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 14 Dec 2023 13:29:37 -0300 Subject: [PATCH 210/345] sunflower mapgen bug fix --- mods/MAPGEN/mcl_biomes/init.lua | 76 ++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 24 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index d42720d26..956a5dac8 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -4804,32 +4804,60 @@ local function register_decorations() b = {"FlowerForest"} end - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = {x = 1, y = 3, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "mcl_flowers:" .. name, param1 = 255, }, - {name = "mcl_flowers:" .. name .. "_top", param1 = 255, }, + if name ~= "sunflower" then + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = {x = 1, y = 3, z = 1}, + data = { + {name = "air", prob = 0}, + {name = "mcl_flowers:" .. name, param1 = 255, }, + {name = "mcl_flowers:" .. name .. "_top", param1 = 255, }, + }, }, - }, - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 16, - noise_params = { - offset = o, - scale = 0.01, - spread = {x = 300, y = 300, z = 300}, - seed = seed, - octaves = 5, - persist = 0.62, - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - flags = "", - biomes = b, - }) + sidelen = 16, + noise_params = { + offset = o, + scale = 0.01, + spread = {x = 300, y = 300, z = 300}, + seed = seed, + octaves = 5, + persist = 0.62, + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + flags = "", + biomes = b, + }) + else + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = {x = 1, y = 2, z = 1}, + data = { + {name = "air", prob = 0}, + {name = "mcl_flowers:" .. name, param1 = 255, }, + }, + }, + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + + sidelen = 16, + noise_params = { + offset = o, + scale = 0.01, + spread = {x = 300, y = 300, z = 300}, + seed = seed, + octaves = 5, + persist = 0.62, + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + flags = "", + biomes = b, + }) + end end end From e6a64cfc69c6ae6e7394863ace4ca66aa42d06c7 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 14 Dec 2023 22:35:59 -0300 Subject: [PATCH 211/345] Sound and mining sunflower bug fixes --- mods/ITEMS/mcl_flowers/init.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index 148d9db53..ef22da3a3 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -525,8 +525,8 @@ minetest.register_node("mcl_flowers:sunflower", { drawtype = "mesh", groups = { attached_node = 1, deco_block = 1, - dig_by_water = 1, destroy_by_lava_flow = 1, dig_by_piston = 1, - flammable = 2, fire_encouragement = 60, fire_flammability = 100, + dig_by_water = 1, destroy_by_lava_flow = 1, dig_by_piston = 1, dig_immediate = 3, + flammable = 2, flower = 1, fire_encouragement = 60, fire_flammability = 100, plant = 1, double_plant = 1, non_mycelium_plant = 1, compostability = 65, grass_palette = nil }, inventory_image = "mcl_flowers_double_plant_sunflower_front.png", @@ -536,6 +536,7 @@ minetest.register_node("mcl_flowers:sunflower", { type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 1.5, 0.25} }, + sounds = mcl_sounds.node_sound_leaves_defaults(), sunlight_propagates = true, tiles = { "mcl_flowers_double_plant_sunflower_bottom.png", From 85d21fa1e9dcd4abb3e62ad69c61a062ce7c0470 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 14 Dec 2023 23:18:38 -0300 Subject: [PATCH 212/345] new sunflower mesh --- .../models/mcl_flowers_sunflower.obj | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj index 4bac1dbd7..115670e11 100644 --- a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj +++ b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj @@ -1,12 +1,12 @@ # Blender 3.6.4 # www.blender.org -mtllib sunflower.mtl +mtllib mcl_flowers_sunflower.mtl o Stem_1 -v 0.309359 1.500000 -0.309359 -v -0.309359 1.500000 0.309359 -v 0.309359 -0.500000 -0.309359 -v -0.309359 -0.500000 0.309359 -vn 0.7071 -0.0000 0.7071 +v -0.309359 1.000000 -0.309359 +v 0.309359 1.000000 0.309359 +v -0.309359 -0.500000 -0.309359 +v 0.309359 -0.500000 0.309359 +vn 0.7071 -0.0000 -0.7071 vt 1.000000 1.000000 vt 0.000000 1.000000 vt 0.000000 0.000000 @@ -16,11 +16,11 @@ g Stem_1_Stem usemtl Stem f 1/1/1 2/2/1 4/3/1 3/4/1 o Stem_2 -v 0.309359 1.500000 0.309359 -v -0.309359 1.500000 -0.309359 -v 0.309359 -0.500000 0.309359 -v -0.309359 -0.500000 -0.309359 -vn -0.7071 -0.0000 0.7071 +v 0.309359 1.000000 -0.309359 +v -0.309359 1.000000 0.309359 +v 0.309359 -0.500000 -0.309359 +v -0.309359 -0.500000 0.309359 +vn 0.7071 -0.0000 0.7071 vt 1.000000 1.000000 vt 0.000000 1.000000 vt 0.000000 0.000000 @@ -30,11 +30,11 @@ g Stem_2_Stem usemtl Stem f 5/5/2 6/6/2 8/7/2 7/8/2 o Flower_1 -v -0.500000 1.933013 -0.125000 -v -0.500000 1.066987 0.375000 -v 0.500000 1.933013 -0.125000 -v 0.500000 1.066987 0.375000 -vn -0.0000 0.5000 0.8660 +v -0.145000 1.483012 0.500000 +v 0.355000 0.616987 0.500000 +v -0.145000 1.483012 -0.500000 +v 0.355000 0.616987 -0.500000 +vn 0.8660 0.5000 -0.0000 vt 0.000000 0.000000 vt 1.000000 0.000000 vt 1.000000 1.000000 @@ -44,11 +44,11 @@ g Flower_1_Flower_1 usemtl Flower_1 f 9/9/3 10/10/3 12/11/3 11/12/3 o Flower_2 -v -0.500000 1.933013 -0.130000 -v -0.500000 1.066987 0.370000 -v 0.500000 1.933013 -0.130000 -v 0.500000 1.066987 0.370000 -vn -0.0000 0.5000 0.8660 +v -0.150000 1.482013 0.500000 +v 0.350000 0.615987 0.500000 +v -0.150000 1.482013 -0.500000 +v 0.350000 0.615987 -0.500000 +vn 0.8660 0.5000 -0.0000 vt 0.000000 0.000000 vt 1.000000 0.000000 vt 1.000000 1.000000 From f9972aef015cc992b41ab2c004a1a3c5101c3310 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 14 Dec 2023 23:35:42 -0300 Subject: [PATCH 213/345] new lower mesh and selection box --- mods/ITEMS/mcl_flowers/init.lua | 2 +- .../models/mcl_flowers_sunflower.obj | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index ef22da3a3..ce8391c29 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -534,7 +534,7 @@ minetest.register_node("mcl_flowers:sunflower", { paramtype = "light", selection_box = { type = "fixed", - fixed = {-0.25, -0.5, -0.25, 0.25, 1.5, 0.25} + fixed = {-1/4, -1/2, -1/4, 1/4, 8/7, 1/4} }, sounds = mcl_sounds.node_sound_leaves_defaults(), sunlight_propagates = true, diff --git a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj index 115670e11..43fc4301d 100644 --- a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj +++ b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj @@ -2,8 +2,8 @@ # www.blender.org mtllib mcl_flowers_sunflower.mtl o Stem_1 -v -0.309359 1.000000 -0.309359 -v 0.309359 1.000000 0.309359 +v -0.309359 0.750000 -0.309359 +v 0.309359 0.750000 0.309359 v -0.309359 -0.500000 -0.309359 v 0.309359 -0.500000 0.309359 vn 0.7071 -0.0000 -0.7071 @@ -16,8 +16,8 @@ g Stem_1_Stem usemtl Stem f 1/1/1 2/2/1 4/3/1 3/4/1 o Stem_2 -v 0.309359 1.000000 -0.309359 -v -0.309359 1.000000 0.309359 +v 0.309359 0.750000 -0.309359 +v -0.309359 0.750000 0.309359 v 0.309359 -0.500000 -0.309359 v -0.309359 -0.500000 0.309359 vn 0.7071 -0.0000 0.7071 @@ -30,10 +30,10 @@ g Stem_2_Stem usemtl Stem f 5/5/2 6/6/2 8/7/2 7/8/2 o Flower_1 -v -0.145000 1.483012 0.500000 -v 0.355000 0.616987 0.500000 -v -0.145000 1.483012 -0.500000 -v 0.355000 0.616987 -0.500000 +v -0.175000 1.233013 0.500000 +v 0.325000 0.366987 0.500000 +v -0.175000 1.233013 -0.500000 +v 0.325000 0.366987 -0.500000 vn 0.8660 0.5000 -0.0000 vt 0.000000 0.000000 vt 1.000000 0.000000 @@ -44,10 +44,10 @@ g Flower_1_Flower_1 usemtl Flower_1 f 9/9/3 10/10/3 12/11/3 11/12/3 o Flower_2 -v -0.150000 1.482013 0.500000 -v 0.350000 0.615987 0.500000 -v -0.150000 1.482013 -0.500000 -v 0.350000 0.615987 -0.500000 +v -0.180000 1.232013 0.500000 +v 0.320000 0.365988 0.500000 +v -0.180000 1.232013 -0.500000 +v 0.320000 0.365988 -0.500000 vn 0.8660 0.5000 -0.0000 vt 0.000000 0.000000 vt 1.000000 0.000000 From 4d5d5953107cca7339fac49377b6b125efc32499 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 15 Dec 2023 08:54:44 -0300 Subject: [PATCH 214/345] changes requested in sunflower definitions --- mods/ITEMS/mcl_flowers/init.lua | 23 ++++++++-- mods/MAPGEN/mcl_biomes/init.lua | 76 +++++++++++---------------------- 2 files changed, 43 insertions(+), 56 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index ce8391c29..5277cd35c 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -192,7 +192,7 @@ if has_mcl_flowerpots then }) end -local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_img, selbox_radius, selbox_top_height, drop, shears_drop, is_flower, grass_color, fortune_drop) +local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_img, selbox_radius, selbox_top_height, drop, shears_drop, is_flower, grass_color, fortune_drop, mesh) if not inv_img then inv_img = top_img end @@ -236,13 +236,26 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im drop_top = drop drop_bottom = drop end + -- Sunflower mesh and tiles + local top_drawtype, bottom_drawtype + local bottom_tiles = {} + if not mesh then + top_drawtype = "plantlike" + bottom_drawtype = "plantlike" + table.insert(bottom_tiles, bottom_img) + else + top_drawtype = "airlike" + bottom_drawtype = "mesh" + bottom_tiles = bottom_img + end + -- Bottom minetest.register_node("mcl_flowers:"..name, { description = desc, _doc_items_create_entry = create_entry, _doc_items_longdesc = longdesc, _doc_items_usagehelp = plant_usage_help, - drawtype = "plantlike", - tiles = { bottom_img }, + drawtype = bottom_drawtype, + tiles = bottom_tiles, inventory_image = inv_img, wield_image = inv_img, sunlight_propagates = true, @@ -334,6 +347,7 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im end, groups = bottom_groups, sounds = mcl_sounds.node_sound_leaves_defaults(), + mesh = mesh }) local top_groups = table.copy(bottom_groups) @@ -345,7 +359,7 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im minetest.register_node("mcl_flowers:"..name.."_top", { description = desc.." " .. S("(Top Part)"), _doc_items_create_entry = false, - drawtype = "plantlike", + drawtype = top_drawtype, tiles = { top_img }, sunlight_propagates = true, paramtype = "light", @@ -382,6 +396,7 @@ end add_large_plant("peony", S("Peony"), S("A peony is a large plant which occupies two blocks. It is mainly used in dye production."), "mcl_flowers_double_plant_paeonia_bottom.png", "mcl_flowers_double_plant_paeonia_top.png", nil, 5/16, 6/16) add_large_plant("rose_bush", S("Rose Bush"), S("A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production."), "mcl_flowers_double_plant_rose_bottom.png", "mcl_flowers_double_plant_rose_top.png", nil, 5/16, 1/16) add_large_plant("lilac", S("Lilac"), S("A lilac is a large plant which occupies two blocks. It is mainly used in dye production."), "mcl_flowers_double_plant_syringa_bottom.png", "mcl_flowers_double_plant_syringa_top.png", nil, 5/16, 6/16) +add_large_plant("sunflower", S("Sunflower"), S("A sunflower is a large plant which occupies two blocks. It is mainly used in dye production."), {"mcl_flowers_double_plant_sunflower_bottom.png", "mcl_flowers_double_plant_sunflower_bottom.png", "mcl_flowers_double_plant_sunflower_front.png", "mcl_flowers_double_plant_sunflower_back.png"}, nil, "mcl_flowers_double_plant_sunflower_front.png", 6/16, 6/16, "mcl_flowers:sunflower", nil, true, nil, nil, "mcl_flowers_sunflower.obj") local longdesc_grass = S("Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.") local longdesc_fern = S("Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.") diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 956a5dac8..d42720d26 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -4804,60 +4804,32 @@ local function register_decorations() b = {"FlowerForest"} end - if name ~= "sunflower" then - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = {x = 1, y = 3, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "mcl_flowers:" .. name, param1 = 255, }, - {name = "mcl_flowers:" .. name .. "_top", param1 = 255, }, - }, + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = {x = 1, y = 3, z = 1}, + data = { + {name = "air", prob = 0}, + {name = "mcl_flowers:" .. name, param1 = 255, }, + {name = "mcl_flowers:" .. name .. "_top", param1 = 255, }, }, - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + }, + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 16, - noise_params = { - offset = o, - scale = 0.01, - spread = {x = 300, y = 300, z = 300}, - seed = seed, - octaves = 5, - persist = 0.62, - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - flags = "", - biomes = b, - }) - else - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = {x = 1, y = 2, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "mcl_flowers:" .. name, param1 = 255, }, - }, - }, - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - - sidelen = 16, - noise_params = { - offset = o, - scale = 0.01, - spread = {x = 300, y = 300, z = 300}, - seed = seed, - octaves = 5, - persist = 0.62, - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - flags = "", - biomes = b, - }) - end + sidelen = 16, + noise_params = { + offset = o, + scale = 0.01, + spread = {x = 300, y = 300, z = 300}, + seed = seed, + octaves = 5, + persist = 0.62, + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + flags = "", + biomes = b, + }) end end From f63e5d3c1978c766dd09fb9dcfed656e06061210 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 22 Dec 2023 14:35:47 -0300 Subject: [PATCH 215/345] fix facing west --- .../models/mcl_flowers_sunflower.obj | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj index 43fc4301d..9866fa4f2 100644 --- a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj +++ b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj @@ -2,11 +2,11 @@ # www.blender.org mtllib mcl_flowers_sunflower.mtl o Stem_1 -v -0.309359 0.750000 -0.309359 -v 0.309359 0.750000 0.309359 -v -0.309359 -0.500000 -0.309359 -v 0.309359 -0.500000 0.309359 -vn 0.7071 -0.0000 -0.7071 +v 0.381859 0.750000 0.309359 +v -0.236859 0.750000 -0.309359 +v 0.381859 -0.500000 0.309359 +v -0.236859 -0.500000 -0.309359 +vn -0.7071 -0.0000 0.7071 vt 1.000000 1.000000 vt 0.000000 1.000000 vt 0.000000 0.000000 @@ -16,11 +16,11 @@ g Stem_1_Stem usemtl Stem f 1/1/1 2/2/1 4/3/1 3/4/1 o Stem_2 -v 0.309359 0.750000 -0.309359 -v -0.309359 0.750000 0.309359 -v 0.309359 -0.500000 -0.309359 -v -0.309359 -0.500000 0.309359 -vn 0.7071 -0.0000 0.7071 +v -0.236859 0.750000 0.309359 +v 0.381859 0.750000 -0.309359 +v -0.236859 -0.500000 0.309359 +v 0.381859 -0.500000 -0.309359 +vn -0.7071 -0.0000 -0.7071 vt 1.000000 1.000000 vt 0.000000 1.000000 vt 0.000000 0.000000 @@ -30,11 +30,11 @@ g Stem_2_Stem usemtl Stem f 5/5/2 6/6/2 8/7/2 7/8/2 o Flower_1 -v -0.175000 1.233013 0.500000 -v 0.325000 0.366987 0.500000 -v -0.175000 1.233013 -0.500000 -v 0.325000 0.366987 -0.500000 -vn 0.8660 0.5000 -0.0000 +v 0.247500 1.233013 -0.500000 +v -0.252500 0.366987 -0.500000 +v 0.247500 1.233013 0.500000 +v -0.252500 0.366987 0.500000 +vn -0.8660 0.5000 -0.0000 vt 0.000000 0.000000 vt 1.000000 0.000000 vt 1.000000 1.000000 @@ -44,11 +44,11 @@ g Flower_1_Flower_1 usemtl Flower_1 f 9/9/3 10/10/3 12/11/3 11/12/3 o Flower_2 -v -0.180000 1.232013 0.500000 -v 0.320000 0.365988 0.500000 -v -0.180000 1.232013 -0.500000 -v 0.320000 0.365988 -0.500000 -vn 0.8660 0.5000 -0.0000 +v 0.252500 1.232013 -0.500000 +v -0.247500 0.365988 -0.500000 +v 0.252500 1.232013 0.500000 +v -0.247500 0.365988 0.500000 +vn -0.8660 0.5000 -0.0000 vt 0.000000 0.000000 vt 1.000000 0.000000 vt 1.000000 1.000000 From 92ee9c0557a88ce07c044de278c21c1414da51b0 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 18 Dec 2023 02:14:01 +0100 Subject: [PATCH 216/345] Remove the wrong separate sunflower definition --- mods/ITEMS/mcl_flowers/init.lua | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index 5277cd35c..75e133322 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -534,33 +534,4 @@ if mod_mcimport and mg_name == "singlenode" and fix_doubleplants == true then }) end -minetest.register_node("mcl_flowers:sunflower", { - description = S("Sunflower"), - _doc_items_longdesc = S("A sunflower is a large plant which occupies two blocks. It is mainly used in dye production."), - drawtype = "mesh", - groups = { - attached_node = 1, deco_block = 1, - dig_by_water = 1, destroy_by_lava_flow = 1, dig_by_piston = 1, dig_immediate = 3, - flammable = 2, flower = 1, fire_encouragement = 60, fire_flammability = 100, - plant = 1, double_plant = 1, non_mycelium_plant = 1, compostability = 65, grass_palette = nil - }, - inventory_image = "mcl_flowers_double_plant_sunflower_front.png", - mesh = "mcl_flowers_sunflower.obj", - paramtype = "light", - selection_box = { - type = "fixed", - fixed = {-1/4, -1/2, -1/4, 1/4, 8/7, 1/4} - }, - sounds = mcl_sounds.node_sound_leaves_defaults(), - sunlight_propagates = true, - tiles = { - "mcl_flowers_double_plant_sunflower_bottom.png", - "mcl_flowers_double_plant_sunflower_bottom.png", - "mcl_flowers_double_plant_sunflower_front.png", - "mcl_flowers_double_plant_sunflower_back.png" - }, - walkable = false, - wield_image = "mcl_flowers_double_plant_sunflower_front.png" -}) - dofile(modpath.."/register.lua") From 569dd691885d529efaebbfc9c2e3f1400a37578a Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Fri, 22 Dec 2023 23:36:49 +0100 Subject: [PATCH 217/345] Increase sunflower height --- .../models/mcl_flowers_sunflower.obj | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj index 9866fa4f2..fb9dfc7cf 100644 --- a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj +++ b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj @@ -2,8 +2,8 @@ # www.blender.org mtllib mcl_flowers_sunflower.mtl o Stem_1 -v 0.381859 0.750000 0.309359 -v -0.236859 0.750000 -0.309359 +v 0.381859 1.050000 0.309359 +v -0.236859 1.050000 -0.309359 v 0.381859 -0.500000 0.309359 v -0.236859 -0.500000 -0.309359 vn -0.7071 -0.0000 0.7071 @@ -16,8 +16,8 @@ g Stem_1_Stem usemtl Stem f 1/1/1 2/2/1 4/3/1 3/4/1 o Stem_2 -v -0.236859 0.750000 0.309359 -v 0.381859 0.750000 -0.309359 +v -0.236859 1.050000 0.309359 +v 0.381859 1.050000 -0.309359 v -0.236859 -0.500000 0.309359 v 0.381859 -0.500000 -0.309359 vn -0.7071 -0.0000 -0.7071 @@ -30,10 +30,10 @@ g Stem_2_Stem usemtl Stem f 5/5/2 6/6/2 8/7/2 7/8/2 o Flower_1 -v 0.247500 1.233013 -0.500000 -v -0.252500 0.366987 -0.500000 -v 0.247500 1.233013 0.500000 -v -0.252500 0.366987 0.500000 +v 0.247500 1.433013 -0.500000 +v -0.252500 0.766987 -0.500000 +v 0.247500 1.433013 0.500000 +v -0.252500 0.766987 0.500000 vn -0.8660 0.5000 -0.0000 vt 0.000000 0.000000 vt 1.000000 0.000000 @@ -44,10 +44,10 @@ g Flower_1_Flower_1 usemtl Flower_1 f 9/9/3 10/10/3 12/11/3 11/12/3 o Flower_2 -v 0.252500 1.232013 -0.500000 -v -0.247500 0.365988 -0.500000 -v 0.252500 1.232013 0.500000 -v -0.247500 0.365988 0.500000 +v 0.252500 1.432013 -0.500000 +v -0.247500 0.765988 -0.500000 +v 0.252500 1.432013 0.500000 +v -0.247500 0.765988 0.500000 vn -0.8660 0.5000 -0.0000 vt 0.000000 0.000000 vt 1.000000 0.000000 From beb06315ac6506b45bbd154f5b74143a2aea7f77 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 07:51:36 -0300 Subject: [PATCH 218/345] mcl_explosions pt_BR translation --- mods/CORE/mcl_explosions/locale/mcl_explosions.pt_BR.tr | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mods/CORE/mcl_explosions/locale/mcl_explosions.pt_BR.tr diff --git a/mods/CORE/mcl_explosions/locale/mcl_explosions.pt_BR.tr b/mods/CORE/mcl_explosions/locale/mcl_explosions.pt_BR.tr new file mode 100644 index 000000000..d67ea4637 --- /dev/null +++ b/mods/CORE/mcl_explosions/locale/mcl_explosions.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain:mcl_explosions +@1 was caught in an explosion.=@1 foi pego(a) em uma explosão. From ad3ec48ec9fbb50a5073f9cfb20165feb457c9e6 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 08:18:10 -0300 Subject: [PATCH 219/345] mcl_boats pt_BR translation --- .../mcl_boats/locale/mcl_boats.pt_BR.tr | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 mods/ENTITIES/mcl_boats/locale/mcl_boats.pt_BR.tr diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.pt_BR.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.pt_BR.tr new file mode 100644 index 000000000..65a5c3a54 --- /dev/null +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.pt_BR.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_boats +Acacia Boat=Barco de Acácia +Birch Boat=Barco de Bétula +Boat=Barco +Boats are used to travel on the surface of water.=Barcos são usados para viajar na superfície da água +Dark Oak Boat=Barco de Carvalho Escuro +Jungle Boat=Barco de Selva +Oak Boat=Barco de Carvalho +Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Use [Sneak] to leave the boat, punch the boat to make it drop as an item.=Clique com o botão direito em uma fonte de água para posicionar o barco. Clique com o botão direito no barco para entrar nele. Use [Esquerda] e [Direita] para fazer curva, [Frente] para acelerar e [Trás] para frear e ir para trás. Use [Agachar] para deixar o barco, soque-o para fazê-lo dropar como um item. +Spruce Boat=Barco de Pinheiro +Water vehicle=Veículo aquático +Sneak to dismount=Agache para desmontar +Obsidian Boat=Barco de Obsidiana +Mangrove Boat=Barco de Mangue +Cherry Boat=Barco de Cerejeira +Oak Chest Boat=Barco de Carvalho com Baú +Spruce Chest Boat=Barco de Pinheiro com Baú +Birch Chest Boat=Barco de Bétula com Baú +Jungle Chest Boat=Barco de Selva com Baú +Acacia Chest Boat=Barco de Acácia com Baú +Dark Oak Chest Boat=Barco de Carvalho Escuro com Baú +Mangrove Chest Boat=Barco de Mangue com Baú +Cherry Chest Boat=Barco de Cerejeira com Baú From 2370d155c9e5f5f9cab37676201bf80a799febac Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 08:23:34 -0300 Subject: [PATCH 220/345] mcl_falling_nodes pt_BR translation --- .../mcl_falling_nodes/locale/mcl_falling_nodes.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.pt_BR.tr diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.pt_BR.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.pt_BR.tr new file mode 100644 index 000000000..aaa378ba3 --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +@1 was smashed by a falling anvil.=@1 foi esmagado(a) por uma bigorna em queda. +@1 was smashed by a falling block.=@1 foi esmagado(a) por um bloco em queda. From 51dc10c9ea75f1f9bb5afec9f36c4bfa9f6d3f76 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 08:25:32 -0300 Subject: [PATCH 221/345] mcl_paintings pt_BR translation --- mods/ENTITIES/mcl_paintings/locale/mcl_paintings.pt_BR.tr | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mods/ENTITIES/mcl_paintings/locale/mcl_paintings.pt_BR.tr diff --git a/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.pt_BR.tr b/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.pt_BR.tr new file mode 100644 index 000000000..3c0a840cf --- /dev/null +++ b/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain:mcl_paintings +Painting=Pintura From df027704705e88aa986304deb3ad7e680850d1ce Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 09:14:20 -0300 Subject: [PATCH 222/345] mcl_minecarts pt_BR translation --- .../locale/mcl_minecarts.pt_BR.tr | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.pt_BR.tr diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.pt_BR.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.pt_BR.tr new file mode 100644 index 000000000..dda35e93f --- /dev/null +++ b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.pt_BR.tr @@ -0,0 +1,36 @@ +# textdomain: mcl_minecarts +Minecart=Carrinho +Minecarts can be used for a quick transportion on rails.=Carrinhos podem ser usados para transporte rápido em trilhos. +Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.=Carrinhos viajam somente em trilhos e sempre seguem os traçados. Em uma junção em T sem linha reta à frente, eles viram à esquerda. A velocidade é afetada pelo tipo do trilho. +You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Você pode posicionar o carrinho em trilhos. Clique com o botão direito para entrar nele. Soque-o para fazê-lo mover. +To obtain the minecart, punch it while holding down the sneak key.=Para obter o carrinho, soque-o enquanto segura pressionada a tecla de agachar. +A minecart with TNT is an explosive vehicle that travels on rail.=Um carrinho com TNT é um veículo explosivo que viaja nos trilhos. +Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.=Posicione-o nos trilhos. Soque-o para movê-lo. A TNT é acesa com um isqueiro ou quando o carrinho está sobre um trilho ativador energizado. +To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.=Para obter o carrinho e a TNT, soque-os enquanto segura pressionada a tecla de agachar. Você não consegue fazer isso se a TNT foi acesa. +A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.=Um carrinho com fornalha é um veículo que viaja nos trilhos. Se move por conta própria com combustível. +Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.=Posicione-o nos trilhos. Se você o der um pouco de carvão, a fornalha vai começar a queimar por um longo tempo e o carrinho será capaz de se mover por conta própria. Soque-o para fazê-lo mover. +To obtain the minecart and furnace, punch them while holding down the sneak key.=Para obter o carrinho e a fornalha, soque-os enquanto segura pressionada a tecla de agachar. +Minecart with Chest=Carrinho com Baú +Minecart with Furnace=Carrinho com Fornalha +Minecart with Command Block=Carrinho com Bloco de Comandos +Minecart with Hopper=Carrinho com Funil +Minecart with TNT=Carrinho com TNT +Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=Posicione-os no chão para construir suas linhas férreas, os trilhos vão conectar-se automaticamente uns nos outros e vão se transformar em curvas, junções em T, cruzamentos e rampas quando necessário. +Rail=Trilho +Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=Trilhos podem ser usados para construir traçados de transporte para carrinhos. Trilhos normais freiam carrinhos gradativamente devido ao atrito. +Powered Rail=Trilho Energizador +Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Trilhos podem ser usados para construir traçados de transporte para carrinhos. Trilhos energizados são capazes de acelerar e frear carrinhos. +Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Sem carga de redstone, o trilho vai frear os carrinhos. Para fazer o trilho acelerar os carrinhos, energize-o com uma carga de redstone. +Activator Rail=Trilho Ativador +Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Trilhos podem ser usados para construir traçados de transporte para carrinhos. Trilhos ativadores são usados para ativar carrinhos especiais. +To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Para fazer esse trilho ativar os carrinhos, energize-o com uma carga de redstone e envie um carrinho sobre esse pedaço de trilho. +Detector Rail=Trilho Detector +Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=Trilhos podem ser usados para construir traçados de transporte para carrinhos. Um trilho detector é capaz de detectar um carrinho sobre ele e energizar mecanismos de redstone. +To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Para detectar um carrinho e providenciar carga de redstone, conecte-o em trilhas de redstone ou mecanismos de redstone e envie qualquer carrinho sobre esse trilho. +Track for minecarts=Traçado para carrinhos +Speed up when powered, slow down when not powered=Acelera quando energizado, desacelera quando não energizado +Activates minecarts when powered=Ativa carrinhos quando energizado +Emits redstone power when a minecart is detected=Emite carga de redstone quando um carrinho é detectado +Vehicle for fast travel on rails=Veículo para viajar rápido em trilhos +Can be ignited by tools or powered activator rail=Pode ser aceso por ferramentas ou trilho ativador energizado +Sneak to dismount=Agache para desmontar From 5c06c28b0f858f958f29853bce8e728761b52f7e Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 09:25:59 -0300 Subject: [PATCH 223/345] mobs_mc pt_BR translation --- mods/ENTITIES/mobs_mc/locale/mobs_mc.pt_BR.tr | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 mods/ENTITIES/mobs_mc/locale/mobs_mc.pt_BR.tr diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.pt_BR.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.pt_BR.tr new file mode 100644 index 000000000..a20d703a8 --- /dev/null +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.pt_BR.tr @@ -0,0 +1,83 @@ +# textdomain: mobs_mc +Agent=Agente +Axolotl=Axolote +Bat=Morcego +Blaze=Blaze +Chicken=Galinha +Cow=Vaca +Mooshroom=Coguvaca +Creeper=Creeper +Ender Dragon=Dragão do Fim +Enderman=Enderman +Endermite=Endermite +Ghast=Ghast +Elder Guardian=Guardião Ancião +Guardian=Guardião +Horse=Cavalo +Skeleton Horse=Cavalo Esqueleto +Zombie Horse=Cavalo Zumbi +Donkey=Burro +Mule=Mula +Iron Golem=Golem de Ferro +Llama=Lhama +Ocelot=Jaguatirica +Cat=Gato +Parrot=Papagaio +Pig=Porco +Polar Bear=Urso Polar +Rabbit=Coelho +Killer Bunny=Coelho Assassino +Sheep=Ovelha +Shulker=Shulker +Silverfish=Traça +Skeleton=Esqueleto +Stray=Esqueleto Errante +Wither Skeleton=Esqueleto Wither +Magma Cube=Cubo de Magma +Slime=Slime +Snow Golem=Golem de Neve +Spider=Aranha +Cave Spider=Aranha de Caverna +Squid=Lula +Vex=Vex +Evoker=Invocador +Illusioner=Ilusionista +Villager=Aldeão +Vindicator=Vingador +Zombie Villager=Aldeão Zumbi +Witch=Bruxa +Wither=Wither +Wolf=Lobo +Husk=Zumbi-Múmia +Baby Husk=Zumbi-Múmia Bebê +Zombie=Zumbi +Baby Zombie=Zumbi Bebê +Piglin=Piglin +Baby Piglin=Piglin Bebê +Zombie Piglin=Piglin Zumbi +Baby Zombie Piglin=Piglin Zumbi Bebê +Sword Piglin=Piglin Espadachim +Piglin Brute=Piglin Barbáro +Farmer=Fazendeiro +Fisherman=Pescador +Fletcher=Flecheiro +Shepherd=Pastor +Librarian=Bibliotecário +Cartographer=Cartógrafo +Armorer=Armoreiro +Leatherworker=Coureiro +Butcher=Açougueiro +Weapon Smith=Armeiro +Tool Smith=Ferramenteiro +Cleric=Clérigo +Nitwit=Palerma +Cod=Bacalhau +Salmon=Salmão +Dolphin=Golfinho +Pillager=Saqueador +Tropical fish=Peixe Tropical +Hoglin=Hoglin +Baby hoglin=Hoglin Bebê +Zoglin=Zoglin +Strider=Lavagante +Glow Squid=Lula Brilhante From 947d20ae9665e68601809c07c7197c637ad53a73 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 09:44:20 -0300 Subject: [PATCH 224/345] mcl_mobs pt_BR translation --- mods/ENTITIES/mcl_mobs/locale/mcl_mobs.pt_BR.tr | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 mods/ENTITIES/mcl_mobs/locale/mcl_mobs.pt_BR.tr diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.pt_BR.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.pt_BR.tr new file mode 100644 index 000000000..20babe453 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.pt_BR.tr @@ -0,0 +1,13 @@ +# textdomain: mcl_mobs +Peaceful mode active! No monsters will spawn.=Modo pacífico ativado! Nenhum monstro será gerado. +This allows you to place a single mob.=Isso permite você posicionar um único mob. +Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Posicione-o onde você deseja que o mob apareça. Animais serão gerados domesticados, a menos que você segure pressionada a tecla de agachar enquanto posiciona. Se você posicionar em um gerador de mobs, você muda o mob que será gerado. +You need the “maphack” privilege to change the mob spawner.=Você precisa do privilégio "maphack" para mudar o gerador de mobs. +Name Tag=Etiqueta +A name tag is an item to name a mob.=Uma etiqueta é um item para nomear um mob. +Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Antes de você usar a etiqueta, você precisa determinar um nome em uma bigorna. Assim você pode usar a etiqueta para nomear um mob. Isso consumirá a etiqueta. +Only peaceful mobs allowed!=Apenas mobs pacíficos permitidos! +Give names to mobs=Dá nome aos mobs +Set name at anvil=Determine um nome em uma bigorna +Removes specified mobs except nametagged and tamed ones. For the second parameter, use nametagged/tamed to select only nametagged/tamed mobs, or a range to specify a maximum distance from the player.=Remove mobs especifícos exceto os mobs nomeados ou domesticados. Como segundo parâmetro, use nametagged/tamed para selecionar apenas mobs nomeados/domesticados, ou um alcançe para especificar uma distância máxima em relação ao jogador. +Default usage. Clearing hostile mobs. For more options please type: /help clearmobs=Uso padrão. Eliminando mobs hostis. Para mais opções por favor digite: /help clearmobs From f379a069989df00a3cc23e8bdd9c76c4ee893a58 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 09:47:20 -0300 Subject: [PATCH 225/345] mcl_raids pt_BR translation --- mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.pt_BR.tr | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.pt_BR.tr diff --git a/mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.pt_BR.tr b/mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.pt_BR.tr new file mode 100644 index 000000000..cd59abb96 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_raids +Ominous Banner=Estandarte Ameaçador From 72a144f0b2f4a73b1fd33078eff0a5caa79f0b13 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 09:49:41 -0300 Subject: [PATCH 226/345] mcl_void_damage pt_BR translation --- .../mcl_void_damage/locale/mcl_void_damage.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.pt_BR.tr diff --git a/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.pt_BR.tr b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.pt_BR.tr new file mode 100644 index 000000000..c4e2152ba --- /dev/null +++ b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_void_damage +The void is off-limits to you!=O vazio está fora dos limites para você! +@1 fell into the endless void.=@1 caiu em um vazio sem fim. From 419456b83505c13a39456d2e745f254bfe4dc704 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 09:54:41 -0300 Subject: [PATCH 227/345] mcl_weather pt_BR translation --- mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.pt_BR.tr | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.pt_BR.tr diff --git a/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.pt_BR.tr b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.pt_BR.tr new file mode 100644 index 000000000..3d91979ae --- /dev/null +++ b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_weather +Gives ability to control weather=Dá a habilidade de controlar o clima +Changes the weather to the specified parameter.=Muda o clima para o parâmetro especificado. +Error: No weather specified.=Erro: Nenhum clima especificado. +Error: Invalid parameters.=Erro: Parâmetros inválidos. +Error: Duration can't be less than 1 second.=Erro: Duração não pode ser menor que 1 segundo. +Error: Invalid weather specified. Use “clear”, “rain”, “snow” or “thunder”.=Erro: Clima especificado é inválido. Use "clear", "rain", "snow" ou "thunder". +Toggles between clear weather and weather with downfall (randomly rain, thunderstorm or snow)=Alterna entre clima limpo e clima com quedas (aleatoriamente chuva, tempestade ou neve) From a3ccd4d0328a8f73ca34601df75150932bf61b52 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 10:00:30 -0300 Subject: [PATCH 228/345] lightning pt_BR translation --- mods/ENVIRONMENT/lightning/locale/lightning.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/ENVIRONMENT/lightning/locale/lightning.pt_BR.tr diff --git a/mods/ENVIRONMENT/lightning/locale/lightning.pt_BR.tr b/mods/ENVIRONMENT/lightning/locale/lightning.pt_BR.tr new file mode 100644 index 000000000..f896e3ac1 --- /dev/null +++ b/mods/ENVIRONMENT/lightning/locale/lightning.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: lightning +Let lightning strike at the specified position or player. No parameter will strike yourself.=Deixa o relâmpago acertar a posição ou jogador especificado. Nenhum parâmetro irá acertar você mesmo. +No position specified and unknown player=Nenhuma posição especificada e jogador desconhecido From f824f109e2e3767ce0499c5d903eb49a948330ea Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 11:11:07 -0300 Subject: [PATCH 229/345] mcl_structures pt_BR translation --- mods/MAPGEN/mcl_structures/locale/mcl_structures.pt_BR.tr | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 mods/MAPGEN/mcl_structures/locale/mcl_structures.pt_BR.tr diff --git a/mods/MAPGEN/mcl_structures/locale/mcl_structures.pt_BR.tr b/mods/MAPGEN/mcl_structures/locale/mcl_structures.pt_BR.tr new file mode 100644 index 000000000..557cf4c21 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/locale/mcl_structures.pt_BR.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_structures +Generate a pre-defined structure near your position.=Gera uma estrutura pré-definida próximo a sua posição. +Structure placed.=Estrutura posicionada. +Village built. WARNING: Villages are experimental and might have bugs.=Aldeia construída. AVISO: Aldeias são experimentais e podem conter bugs. +Error: No structure type given. Please use “/spawnstruct ”.=Erro: Nenhum tipo de estrutura fornecido. Por favor use “/spawnstruct ”. +Error: Unknown structure type. Please use “/spawnstruct ”.=Erro: Tipo desconhecido de estrutura. Por favor use “/spawnstruct ”. +Use /help spawnstruct to see a list of avaiable types.= Use /help spawnstruct para ver uma lista dos tipos disponíveis. From aef093ef4ecef726409f940310b8f12abbecf6f0 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 11:14:33 -0300 Subject: [PATCH 230/345] doc_items pt_BR translation correction --- mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr b/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr index abcf11547..504d4e264 100644 --- a/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr +++ b/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr @@ -10,12 +10,12 @@ # Itemname (ca. 25%) @1 (ca. @2%)= # List separator (e.g. “one, two, three”) -, =, +, =, # Final list separator (e.g. “One, two and three”) - and = e + and = e 1 second=1 segundo A transparent block, basically empty space. It is usually left behind after digging something.=Um bloco transparente, basicamente um vazio. Isso geralmente fica no lugar de um bloco removido. -Air=Ár +Air=Ar Blocks=Blocos Building another block at this block will place it inside and replace it.=Construir outro bloco nesse bloco vai subistitui-lo. Building this block is completely silent.=Construir esse bloco é completamente silencioso. From 76e941cbb6a9c18d4e917a98d72cdaf9e1cb5743 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 11:17:06 -0300 Subject: [PATCH 231/345] doc_items pt_BR translation missing translation --- mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr b/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr index 504d4e264..eec43dba7 100644 --- a/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr +++ b/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr @@ -129,12 +129,12 @@ Unknown item (@1)=Item desconhecido (@1) • @1: @2, @3= • Flowing range: @1= • No flowing= -• Not renewable= -• Renewable= -• Viscosity: @1= +• Not renewable=• Não renovável +• Renewable=• Renovável +• Viscosity: @1=• Viscosidade: @1 Itemstring: "@1"= -Durability: @1 uses= -Durability: @1= +Durability: @1 uses=Durabilidade: @1 usos +Durability: @1=Durabilidade: @1 Mining durability:= • @1, level @2: @3 uses= • @1, level @2: Unlimited= From 6f9b70a98d2b36673435060d6d380b5ce5eab7cf Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 14:54:36 -0300 Subject: [PATCH 232/345] mcl_fireworks pt_BR translation --- mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.pt_BR.tr diff --git a/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.pt_BR.tr b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.pt_BR.tr new file mode 100644 index 000000000..6b42dd610 --- /dev/null +++ b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_fireworks +Firework Rocket=Foguete +Flight Duration:=Duração de Voo: From 6cbd98597481c4b15c3a27ee34f82299d16b7c52 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 15:26:32 -0300 Subject: [PATCH 233/345] mcl_honey pt_BR translation --- mods/ITEMS/mcl_honey/locale/mcl_honey.pt_BR.tr | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 mods/ITEMS/mcl_honey/locale/mcl_honey.pt_BR.tr diff --git a/mods/ITEMS/mcl_honey/locale/mcl_honey.pt_BR.tr b/mods/ITEMS/mcl_honey/locale/mcl_honey.pt_BR.tr new file mode 100644 index 000000000..cb6ae1d53 --- /dev/null +++ b/mods/ITEMS/mcl_honey/locale/mcl_honey.pt_BR.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_honey +Honeycomb=Favo de Mel +Used to craft beehives and protect copper blocks from further oxidation.=Usado para fabricar colméias artificiais e protejer blocos de cobre da oxidação adicional. +Use on copper blocks to prevent further oxidation.=Use em blocos de cobre para previnir oxidação adicional. +Honeycomb Block=Bloco de Favo de Mel +Honeycomb Block. Used as a decoration.=Bloco de Favo de Mel. Usado como decoração +Honey Bottle=Garrafa de Mel +Honey Bottle is used to craft honey blocks and to restore hunger points.=Garrafa de Mel é usada para fabricar blocos de mel e para restaurar pontos de fome. +Drinking will restore 6 hunger points. Can also be used to craft honey blocks.=Beber irá restaurar 6 pontos de fome. Também pode ser usada para fabricar blocos de mel. +Honey Block=Bloco de Mel +Honey Block. Used as a decoration and in redstone. Is sticky on some sides.=Bloco de Mel. Usado como decoração e em redstone. É pegajoso em alguns lados. From 86d5e748bb69a3d590817a20f92930d4bf1b1030 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 15:33:58 -0300 Subject: [PATCH 234/345] mcl_craftguide pt_BR translation --- .../locale/mcl_craftguide.pt_BR.tr | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 mods/HELP/mcl_craftguide/locale/mcl_craftguide.pt_BR.tr diff --git a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.pt_BR.tr b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.pt_BR.tr new file mode 100644 index 000000000..d5bf41235 --- /dev/null +++ b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.pt_BR.tr @@ -0,0 +1,37 @@ +# textdomain: craftguide +Any shulker box=Qualquer caixa shulker +Any wool=Qualquer lã +Any wood planks=Quaisquer tábuas de madeira +Any wood=Qualquer madeira +Any sand=Qualquer areia +Any normal sandstone=Qualquer arenito normal +Any red sandstone=Qualquer arenito vermelho +Any carpet=Qualquer carpete +Any dye=Qualquer tintura +Any water bucket=Qualquer balde de água +Any flower=Qualquer flor +Any mushroom=Qualquer cogumelo +Any wooden slab=Qualquer laje de madeira +Any wooden stairs=Quaisquer escadas de madeira +Any coal=Qualquer carvão +Any kind of quartz block=Qualquer tipo de bloco de quartzo +Any kind of purpur block=Qualquer tipo de bloco de purpúra +Any stone bricks=Quaisquer tijolos de pedra +Any stick=Qualquer graveto +Any item belonging to the @1 group=Qualquer item pertencente ao grupo @1 +Any item belonging to the groups: @1=Qualquer item pertencente aos grupos: @1 +Search=Pesquisar +Reset=Resetar +Previous page=Página anterior +Next page=Página posterior +Usage @1 of @2=Uso @1 de @2 +Recipe @1 of @2=Receita @1 de @2 +Burning time: @1=Tempo de queima: @1 +Cooking time: @1=Tempo de cozimento: @1 +Recipe is too big to be displayed (@1×@2)=Receita é muito grande para ser mostrada (@1x@2) +Shapeless=Sem forma +Cooking=Cozimento +Increase window size=Aumentar tamanho da janela +Decrease window size=Diminuir tamanho da janela +No item to show=Nenhum item para mostrar +Collect items to reveal more recipes=Colete itens para revelar mais receitas From 527577cbcc05dbe5a78509d0ce25881a6d49052b Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 16:07:06 -0300 Subject: [PATCH 235/345] mcl_raw_ores pt_BR translation --- mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.pt_BR.tr | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.pt_BR.tr diff --git a/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.pt_BR.tr b/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.pt_BR.tr new file mode 100644 index 000000000..810557d4a --- /dev/null +++ b/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.pt_BR.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_raw_ores +Raw Iron=Ferro Cru +Raw Gold=Ouro Cru +Raw iron. Mine an iron ore to get it.=Ferro cru. Minere um minério de ferro para obtê-lo. +Raw gold. Mine a gold ore to get it.=Ouro cru. Minere um minério de ouro para obtê-lo. +Block of Raw Iron=Bloco de Ferro Cru +Block of Raw Gold=Bloco de Ouro Cru +A block of raw iron is mostly a decorative block but also useful as a compact storage of raw iron.=Um bloco de ferro cru é majoritariamente um bloco decorativo mas também útil como um armazenamento compacto de ferro cru. +A block of raw gold is mostly a decorative block but also useful as a compact storage of raw gold.=Um bloco de ouro cru é majoritariamente um bloco decorativo mas também útil como um armazenamento compacto de ouro cru. From 9371ed5c4838edb74bc78ad14b805e3363fb8c93 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 16:12:22 -0300 Subject: [PATCH 236/345] mcl_spyglass pt_BR translation --- mods/ITEMS/mcl_spyglass/locale/mcl_spyglass.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/ITEMS/mcl_spyglass/locale/mcl_spyglass.pt_BR.tr diff --git a/mods/ITEMS/mcl_spyglass/locale/mcl_spyglass.pt_BR.tr b/mods/ITEMS/mcl_spyglass/locale/mcl_spyglass.pt_BR.tr new file mode 100644 index 000000000..60d730206 --- /dev/null +++ b/mods/ITEMS/mcl_spyglass/locale/mcl_spyglass.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_spyglass +Spyglass=Luneta +A spyglass is an item that can be used for zooming in on specific locations.=Uma luneta é um item que pode ser usado para dar zoom em uma localidade especifica. From 01641b5a8c6e2206aec1223c00e966b59d7296f1 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 16:19:16 -0300 Subject: [PATCH 237/345] mcl_flowerpots pt_BR translation --- .../locale/mcl_flowerpots.pt_BR.tr | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.pt_BR.tr diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.pt_BR.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.pt_BR.tr new file mode 100644 index 000000000..563e252c3 --- /dev/null +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.pt_BR.tr @@ -0,0 +1,27 @@ +# textdomain: mcl_flowerpots +Dandelion Flower Pot=Vaso com Dente-de-Leão +Poppy Flower Pot=Vaso com Papoula +Blue Orchid Flower Pot=Vaso com Orquídea Azul +Allium Flower Pot=Vaso com Alho Silvestre +Azure Bluet Flower Pot=Vaso com Flor Silvestre Azul +Red Tulip Flower Pot=Vaso com Tulipa Vermelha +Pink Tulip Flower Pot=Vaso com Tulipa Rose +White Tulip Flower Pot=Vaso com Tulipa Branca +Orange Tulip Flower Pot=Vaso com Tulipa Laranja +Oxeye Daisy Flower Pot=Vaso com Margarida +Brown Mushroom Flower Pot=Vaso com Cogumelo Marrom +Red Mushroom Flower Pot=Vaso com Cogumelo Vermelho +Oak Sapling Flower Pot=Vaso com Muda de Carvalho +Acacia Sapling Flower Pot=Vaso com Muda de Acácia +Jungle Sapling Flower Pot=Vaso com Muda da Selva +Dark Oak Sapling Flower Pot=Vaso com Muda de Carvalho Escuro +Spruce Sapling Flower Pot=Vaso com Muda de Pinheiro +Birch Sapling Flower Pot=Vaso com Muda de Bétula +Dead Bush Flower Pot=Vaso com Arbusto Morto +Fern Flower Pot=Vaso com Samambaia +Cactus Flower Pot=Vaso com Cacto +Flower Pot=Vaso +Flower pots are decorative blocks in which flowers and other small plants can be placed.=Vasos são blocos decorativos aos quais flores e plantas pequenas podem ser posicionadas. +Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Apenas posicione uma planta no vaso. Vasos podem segurar flores pequenas (não mais altas que 1 bloco), mudas, samambaias, arbustos mortos, cogumelos e cactos. Clique com o botão direito em uma planta envasada para recolher a planta. +Can hold a small flower or plant=Pode segurar uma flor ou planta pequenas +Cherry Sapling Flower Pot=Vaso com Muda de Cerejeira From 2da67765a0b4a3e4fdac06b0c5fee33ebbedb3e2 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 16:53:00 -0300 Subject: [PATCH 238/345] mcl_flowers pt_BR translation --- .../mcl_flowers/locale/mcl_flowers.pt_BR.tr | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 mods/ITEMS/mcl_flowers/locale/mcl_flowers.pt_BR.tr diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.pt_BR.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.pt_BR.tr new file mode 100644 index 000000000..dcd5b5a14 --- /dev/null +++ b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.pt_BR.tr @@ -0,0 +1,35 @@ +# textdomain: mcl_flowers +This is a small flower. Small flowers are mainly used for dye production and can also be potted.=Isso é uma flor pequena. Flores pequenas são majoritariamente usadas para a produção de corantes e também podem ser envasadas. +It can only be placed on a block on which it would also survive.=Apenas pode ser posicionada em um bloco ao qual vai sobreviver. +Poppy=Papoula +Dandelion=Dente-de-Leão +Oxeye Daisy=Margarida +Orange Tulip=Tulipa Laranja +Pink Tulip=Tulipa Rosa +Red Tulip=Tulipa Vermelha +White Tulip=Tulipa Branca +Allium=Alho Silvestre +Azure Bluet=Flor Silvestre Azul +Blue Orchid=Orquídea Azul +Wither Rose=Flor do Wither +Lily of the Valley=Lírio do Vale +Cornflower=Centáurea +Tall Grass=Grama Alta +Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=Grama alta é uma planta pequena que muitas vezes ocorre na superfície de gramados. Pode ser colhida para obter sementes de trigo. Usando farinha de osso, a grama alta pode ser transformada em grama alta dupla a qual têm dois blocos de altura. +Fern=Samambaia +Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.=Samambaias são plantas pequenas que ocorrem naturalmente em selvas e taigas. Podem ser colhidas para obter sementes de trigo. Usando farinha de osso, uma samambaia pode ser transformada em uma samambaia grande a qual têm dois blocos de altura. +(Top Part)=(Parte de Cima) +Peony=Peônia +A peony is a large plant which occupies two blocks. It is mainly used in dye production.=Uma peônia é uma planta alta que ocupa dois blocos. É majoritariamente usada para a produção de corante. +Rose Bush=Roseira +A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production.=Uma roseira é uma planta alta que ocupa dois blocos. É seguro tocá-la. Roseiras são majoritariamente usadas para a produção de corante. +Lilac=Lilás +A lilac is a large plant which occupies two blocks. It is mainly used in dye production.=Uma lilás é uma planta alta que ocupa dois blocos. É majoritariamente usada para a produção de corante. +Sunflower=Girassol +A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.=Um girassol é uma planta alta que ocupa dois blocos. É majoritariamente usada para a produção de corante. +Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.=Grama alta dupla é uma variante da grama alta e ocupa dois blocos. Pode ser colhida para obter sementes de trigo. +Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=Samambaia grande é uma variante da samambaia e ocupa dois blocos. Pode ser colhida para obter sementes de trigo. +Double Tallgrass=Grama Alta Dupla +Large Fern=Samambaia Grande +Lily Pad=Vitória-Régia +A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Uma vitória-régia é um bloco de planta plano que pode ser pisado. Podem ser posicionadas em fontes de água, gelo e gelo fosco. From 9be815956cb456dadf7bb0feb41cfa84b0371c20 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 18:48:37 -0300 Subject: [PATCH 239/345] mcl_signs pt_BR translation --- .../ITEMS/mcl_signs/locale/mcl_signs.pt_BR.tr | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 mods/ITEMS/mcl_signs/locale/mcl_signs.pt_BR.tr diff --git a/mods/ITEMS/mcl_signs/locale/mcl_signs.pt_BR.tr b/mods/ITEMS/mcl_signs/locale/mcl_signs.pt_BR.tr new file mode 100644 index 000000000..08d67d573 --- /dev/null +++ b/mods/ITEMS/mcl_signs/locale/mcl_signs.pt_BR.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_signs +Sign=Placa +Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them.=Placas podem ser escritas e vêm em duas variantes: Placa de parede e placa de poste. Placas podem ser posicionadas na parte superior e nas laterais de outros blocos, mas não abaixo deles. +After placing the sign, you can write something on it. You have 4 lines of text with up to 15 characters for each line; anything beyond these limits is lost. Not all characters are supported. The text can not be changed once it has been written; you have to break and place the sign again. Can be colored and made to glow.=Depois de posicionar a placa, você pode escrever qualquer coisa nela. Você tem 4 linhas de texto com 15 caracteres em cada linha; qualquer coisa além desses limites será perdido. Nem todos os caracteres são suportados. O texto não pode ser alterado uma vez que esse foi escrito; você terá que quebrar e posicionar a placa novamente. Pode ser colorida e pode brilhar. +Enter sign text:=Insira o texto da placa: +Maximum line length: 15=Comprimento máximo da linha: 15 +Maximum lines: 4=Máximo de linhas: 4 +Done=Feito +Can be written=Pode ser escrito +Oak Sign=Placa de Carvalho +Birch Sign=Placa de Bétula +Spruce Sign=Placa de Pinheiro +Dark Oak Sign=Placa de Carvalho Escuro +Jungle Sign=Placa da Selva +Acacia Sign=Placa de Acácia +Mangrove Sign=Placa de Mangue +Warped Hyphae Sign=Placa de Hifas Distorcidas +Crimson Hyphae Sign=Placa de Hifas Carmesim +Bamboo Sign=Placa de Bambu From 34c23bd578f734ddba6b67acfd3ae2b7cfb41b4a Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 18:58:49 -0300 Subject: [PATCH 240/345] mcl_tnt pt_BR translation --- mods/ITEMS/mcl_tnt/locale/mcl_tnt.pt_BR.tr | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 mods/ITEMS/mcl_tnt/locale/mcl_tnt.pt_BR.tr diff --git a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.pt_BR.tr b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.pt_BR.tr new file mode 100644 index 000000000..739d1414b --- /dev/null +++ b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_tnt +@1 was caught in an explosion.=@1 foi pego(a) em uma explosão. +TNT=TNT +An explosive device. When it explodes, it will hurt living beings and destroy blocks around it. TNT has an explosion radius of @1. With a small chance, blocks may drop as an item (as if being mined) rather than being destroyed. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Um artefato explosivo. Quando explode, machuca seres vivos e destrói blocos a sua volta. A TNT tem um raio de explosão de @1. Com pouca chance, blocos talvez dropem como um item (como se fosse minerado) ao invés de ser destruido. A TNT pode ser acesa por ferramentas explosões, fogo, lava e sinais de redstone. +An explosive device. When it explodes, it will hurt living beings. TNT has an explosion radius of @1. TNT can be ignited by tools, explosions, fire, lava and redstone signals.= +Place the TNT and ignite it with one of the methods above. Quickly get in safe distance. The TNT will start to be affected by gravity and explodes in 4 seconds.= Posicione a TNT e acenda-a com um dos métodos acima. Rapidamente mantenha uma distância segura. A TNT começará a ser afetada pela gravidade e explodirá em 4 segundos. +Ignited by tools, explosions, fire, lava, redstone power=Acesa por ferramentas, explosões, fogo, lava, carga de redstone +Explosion radius: @1=Raio de explosão: @1 From b0b120dd28dfa19bff11a87fc6990874c2afb0c9 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 19:17:53 -0300 Subject: [PATCH 241/345] mcl_walls pt_BR translation --- mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr new file mode 100644 index 000000000..a344d88c0 --- /dev/null +++ b/mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr @@ -0,0 +1,17 @@ +# textdomain: mcl_walls +A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.=Um pedaço de muro. Não pode ser pulado com um pulo simples. Quando muitos desses são posicionados próximos uns aos outros, vão construir automaticamente uma bela estrutura de muro. +Cobblestone Wall=Muro de Pedregulho +Mossy Cobblestone Wall=Muro de Pedregulho Musgoso +Andesite Wall=Muro de Andesito +Granite Wall=Muro de Granito +Diorite Wall=Muro de Diorito +Brick Wall=Muro de Tijolos +Sandstone Wall=Muro de Arenito +Red Sandstone Wall=Muro de Arenito Vermelho +Stone Brick Wall=Muro de Tijolos de Pedra +Mossy Stone Brick Wall=Muro de Tijolos de Pedra Musgosos +Prismarine Wall=Muro de Prismarinho +End Stone Brick Wall=Muro de Tijolos de Pedra do Fim +Nether Brick Wall=Muro de Tijolos do Nether +Red Nether Brick Wall=Muro de Tijolos Vermelhos do Nether +Mud Brick Wall=Muro de Tijolos de Barro From 60377c56cdda4ceec777178b51ec3877fbcd6247 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 19:25:20 -0300 Subject: [PATCH 242/345] mcl_tt pt_BR translation --- mods/HELP/mcl_tt/locale/mcl_tt.pt_BR.tr | 48 +++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 mods/HELP/mcl_tt/locale/mcl_tt.pt_BR.tr diff --git a/mods/HELP/mcl_tt/locale/mcl_tt.pt_BR.tr b/mods/HELP/mcl_tt/locale/mcl_tt.pt_BR.tr new file mode 100644 index 000000000..9d00a06d4 --- /dev/null +++ b/mods/HELP/mcl_tt/locale/mcl_tt.pt_BR.tr @@ -0,0 +1,48 @@ +# textdomain: mcl_tt +Head armor=Armadura de cabeça +Torso armor=Armadura de torso +Legs armor=Armadura de pernas +Feet armor=Armadura de pés +Armor points: @1=Pontos de armadura: @1 +Armor durability: @1=Durabilidade da armadura: @1 +Protection: @1%=Proteção: @1% +Hunger points: +@1=Pontos de fome: +@1 +Saturation points: +@1=Pontos de saturação: +@1 +Deals damage when falling=Dá dano enquanto cai +Grows on grass blocks or dirt=Cresce em blocos de grama ou terra +Grows on grass blocks, podzol, dirt or coarse dirt=Cresce em blocos de grama, podzol, terra ou terra infértil +Flammable=Inflamável +Zombie view range: -50%=Alcançe de visão do zumbi: -50% +Skeleton view range: -50%=Alcançe de visão do esqueleto: -50% +Creeper view range: -50%=Alcançe de visão do creeper: -50% +Damage: @1= Dano: @1 +Damage (@1): @2=Dano (@1): @2 +Healing: @1=Cura: @1 +Healing (@1): @2=Cura (@1): @2 +Full punch interval: @1s=Intervalo completo de batida: @1s +Contact damage: @1 per second=Dano por contaro: @1 por segundo +Contact healing: @1 per second=Cura por contato: @1 por segundo +Drowning damage: @1=Dano de afogamento: @1 +Bouncy (@1%)=Saltitante (@1%) +Luminance: @1=Bliho: @1 +Slippery=Escorregadio +Climbable=Escalável +Climbable (only downwards)=Escalável (apenas em descida) +No jumping=Sem pulo +No swimming upwards=Sem natação em subida +No rising=Sem levantamento +Fall damage: @1%=Dano de queda: @1% +Fall damage: +@1%=Dano de queda: +@1% +No fall damage=Sem dano de queda +Mining speed: @1=Velocidade de mineração: @1 +Very fast=Muito rápido +Extremely fast=Extremamente rápido +Fast=Rápido +Slow=Lento +Very slow=Muito lento +Painfully slow=Dolorosamente lento +Mining durability: @1=Durabilidade de mineração: @1 +Block breaking strength: @1=Força de quebra do bloco: @1 +@1 uses=@1 usos +Unlimited uses=Usos ilimitados +Durability: @1=Durabilidade: @1 From 1524f63a6d8c00da1edd0702fa93147c88e92ee0 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 19:56:41 -0300 Subject: [PATCH 243/345] mcl_hbarmor pt_BR translation --- mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.pt_BR.tr | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.pt_BR.tr diff --git a/mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.pt_BR.tr b/mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.pt_BR.tr new file mode 100644 index 000000000..f9529b482 --- /dev/null +++ b/mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain:hbarmor +Armor=Armadura From 6f7ac46f0532263e4271451891454b6077ade261 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 20:39:07 -0300 Subject: [PATCH 244/345] mcl_jukebox pt_BR translation --- mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.pt_BR.tr | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.pt_BR.tr diff --git a/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.pt_BR.tr b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.pt_BR.tr new file mode 100644 index 000000000..6b46f67b9 --- /dev/null +++ b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.pt_BR.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_jukebox +Music Disc=Disco de Música +A music disc holds a single music track which can be used in a jukebox to play music.=Um disco de música contém uma única faixa de música ao qual pode ser usado em uma jukebox para tocar música. +Place a music disc into an empty jukebox to play the music. Use the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players.=Posicione um disco de música em uma jukebox vazia para tocar a música. Use novamente a jukebox para pegar o disco de música de volta. A música pode ser ouvida apenas por você, não por outros jogadores. +Music Disc=Disco de Música +@1—@2=@1-@2 +Jukebox=Jukebox +Jukeboxes play music when they're supplied with a music disc.=Jukeboxes tocam música quando são abastecidas com um disco de música. +Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players.=Posicione um disco de música em uma jukebox vazia para inserir o disco de música e tocar a música. Se a jukebox já tiver um disco de música, você pegará esse disco de música de volta antes. A música pode ser ouvida apenas por você, não por outros jogadores. +Now playing: @1—@2=Tocando: @1-@2 +Uses music discs to play music=Use discos de música para tocar música From 232740b5e6911469d457e4f6c6de1417f22bea7b Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 20:45:11 -0300 Subject: [PATCH 245/345] mcl_totems pt_BR translation --- mods/ITEMS/mcl_totems/locale/mcl_totems.pt_BR.tr | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 mods/ITEMS/mcl_totems/locale/mcl_totems.pt_BR.tr diff --git a/mods/ITEMS/mcl_totems/locale/mcl_totems.pt_BR.tr b/mods/ITEMS/mcl_totems/locale/mcl_totems.pt_BR.tr new file mode 100644 index 000000000..c7ab1f3eb --- /dev/null +++ b/mods/ITEMS/mcl_totems/locale/mcl_totems.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_totems +Totem of Undying=Totem da Imortalidade +A totem of undying is a rare artifact which may safe you from certain death.=Um totem da imortalidade é um artefato raro ao qual pode segurar você contra certas mortes. +The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=O totem apenas funciona enquanto você o segura em sua mão. Se você receber um dano fatal, você será salvo da morte e receberá uma segunda chance com 1 HP. Porém, o totem é destruído no processo. +Protects you from death while wielding it=Proteje você da morte enquanto você segura-o From 5489bf20ead66a144eaecf392d22f3abcace7efb Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 20:48:21 -0300 Subject: [PATCH 246/345] mcl_beehives pt_BR translation --- mods/ITEMS/mcl_beehives/locale/mcl_beehives.pt_BR.tr | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 mods/ITEMS/mcl_beehives/locale/mcl_beehives.pt_BR.tr diff --git a/mods/ITEMS/mcl_beehives/locale/mcl_beehives.pt_BR.tr b/mods/ITEMS/mcl_beehives/locale/mcl_beehives.pt_BR.tr new file mode 100644 index 000000000..cf4923a83 --- /dev/null +++ b/mods/ITEMS/mcl_beehives/locale/mcl_beehives.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_beehives +Beehive=Colméia Artificial +Artificial bee nest.=Colméia artificial. +Bee Nest=Colméia +A naturally generating block that houses bees and a tasty treat...if you can get it.=Um bloco naturalmente gerado que abriga abelhas e um regalo saboroso...se você conseguir pegá-lo. From 0626c3329b722fab08de82457707b7f8a2afd07a Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 21:05:24 -0300 Subject: [PATCH 247/345] mcl_sculk pt_BR translation --- mods/ITEMS/mcl_sculk/locale/mcl_sculk.pt_BR.tr | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 mods/ITEMS/mcl_sculk/locale/mcl_sculk.pt_BR.tr diff --git a/mods/ITEMS/mcl_sculk/locale/mcl_sculk.pt_BR.tr b/mods/ITEMS/mcl_sculk/locale/mcl_sculk.pt_BR.tr new file mode 100644 index 000000000..bbafc5c76 --- /dev/null +++ b/mods/ITEMS/mcl_sculk/locale/mcl_sculk.pt_BR.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_sculk +Sculk=Sculk +Sculk Vein=Veio Sculk +Sculk vein.=Veio sculk. +Sculk Catalyst=Catalizador Sculk +Sculk Sensor=Sensor Sculk +Sculk Shrieker=Emissor Sculk From 3684cb8d2a7b1371002fa3bdc0a5367cd5104bc1 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 21:16:35 -0300 Subject: [PATCH 248/345] mcl_cherry_blossom pt_BR translation --- .../locale/mcl_cherry_blossom.pt_BR.tr | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.pt_BR.tr diff --git a/mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.pt_BR.tr b/mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.pt_BR.tr new file mode 100644 index 000000000..e3dc6d2fd --- /dev/null +++ b/mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.pt_BR.tr @@ -0,0 +1,24 @@ +# textdomain: mcl_cherry_blossom +Cherry Log=Tronco de Cerejeira +The trunk of a cherry blossom tree.=O tronco de uma árvore de cerejeira. +Stripped Cherry Log=Tronco de Cerejeira Descascado +The stripped trunk of a cherry blossom tree.=O tronco descascado de uma árvore de cerejeira. +Cherry Bark=Casca de Cerejeira +This is a decorative block surrounded by the bark of a tree trunk.=Esse é um bloco decorativo rodeado pela casca do tronco de uma árvore. +Stripped Cherry Wood=Madeira de Cerejeira Descascada +The stripped wood of a cherry blossom tree.=A madeira descascada da árvore de cerejeira. +Cherry Wood Planks=Tábuas de Cerejeira +Cherry Leaves=Folhas de Cerejeira +Cherry blossom leaves are grown from cherry blossom trees.=Folhas de cerejeira crescem em árvores de cerejeira. +Cherry Sapling=Muda de Cerejeira +Cherry blossom sapling can be planted to grow cherry trees.=Muda de cerejeira pode ser plantada para crescer árvores de cerejeira. +Cherry Door=Porta de Cerejeira +Cherry Trapdoor=Alçapão de Cerejeira +Cherry Stairs=Escadas de Cerejeira +Cherry Slab=Laje de Cerejeira +Double Cherry Slab=Laje Dupla de Cerejeira +Cherry Sign=Placa de Cerejeira +Cherry Fence=Cerca de Cerejeira +Cherry Gate=Portão de Cerejeira +Cherry Pressure Plate=Placa de Pressão de Cerejeira +Cherry Button=Botão de Cerejeira From a93ce7af1f3700c7c81beea09d236c83a4c74975 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 21:18:15 -0300 Subject: [PATCH 249/345] mcl_inventory pt_BR translation --- .../locale/mcl_inventory.pt_BR.tr | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 mods/HUD/mcl_inventory/locale/mcl_inventory.pt_BR.tr diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.pt_BR.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.pt_BR.tr new file mode 100644 index 000000000..a24e6afed --- /dev/null +++ b/mods/HUD/mcl_inventory/locale/mcl_inventory.pt_BR.tr @@ -0,0 +1,22 @@ +# textdomain: mcl_inventory +Recipe book=Livro de receitas +Help=Ajuda +Select player skin=Selecionar skin do jogador +Advancements=Progressos +Building Blocks=Blocos de construção +Decoration Blocks=Blocos de decoração +Redstone=Redstone +Transportation=Transporte +Brewing=Fermentação +Miscellaneous=Diversos +Search Items=Pesquisar Itens +Foodstuffs=Comida +Tools=Ferramentas +Combat=Combate +Mobs=Mobs +Materials=Materiais +Survival Inventory=Inventário do Sobrevivência +Crafting=Fabricação +Inventory=Inventário +@1/@2=@1/@2 +Switch stack size=Trocar tamanho da pilha From e2746adea8792239fae2bc31a0c970d37059b4e1 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 21:29:46 -0300 Subject: [PATCH 250/345] mcl_furnaces pt_BR translation --- mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.pt_BR.tr | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.pt_BR.tr diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.pt_BR.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.pt_BR.tr new file mode 100644 index 000000000..e7e02f52b --- /dev/null +++ b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.pt_BR.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_furnaces +Furnace=Fornalha +Furnaces cook or smelt several items, using a furnace fuel, into something else.=Fornalhas cozinham ou derretem vários itens, usando um combustível de fornalha,para transformá=los em outras coisas. +Use the furnace to open the furnace menu.=Use a fornalha para abrir o menu da fornalha. +Place a furnace fuel in the lower slot and the source material in the upper slot.=Posicione um combustível de fornalha no slot mais baixo e o material fonte no slot acima. +The furnace will slowly use its fuel to smelt the item.=A fornalha irá usar lentamente seu combustível para derreter o item. +The result will be placed into the output slot at the right side.=O resultado será posicionado no slot de saída no lado direito. +Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Use o livro de receitas para ver o que você pode derreter, o que você pode usar como combustível e por quanto tempo irá queimar. +Burning Furnace=Fornalha Queimando +Recipe book=Livro de receitas +Inventory=Inventário +Uses fuel to smelt or cook items=Usa combustível para derreter ou cozinhar itens From 9701526d162f9b491f9b60e056fcc51066a335fa Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 22:24:13 -0300 Subject: [PATCH 251/345] mcl_skins pt_BR translation --- mods/PLAYER/mcl_skins/locale/mcl_skins.pt_BR.tr | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 mods/PLAYER/mcl_skins/locale/mcl_skins.pt_BR.tr diff --git a/mods/PLAYER/mcl_skins/locale/mcl_skins.pt_BR.tr b/mods/PLAYER/mcl_skins/locale/mcl_skins.pt_BR.tr new file mode 100644 index 000000000..db1de34d1 --- /dev/null +++ b/mods/PLAYER/mcl_skins/locale/mcl_skins.pt_BR.tr @@ -0,0 +1,14 @@ +# textdomain: mcl_skins +Skins=Skins +Templates=Modelos +Arm size=Tamanho do Braço +Bases=Bases +Footwears=Calçados +Eyes=Olhos +Mouths=Bocas +Bottoms=Inferiores +Tops=Superiores +Hairs=Cabelos +Headwears=Acessórios +Open skin configuration screen.=Abrir tela de configuração de skin. +Select=Selecionar From 09a063256b5479b1db91d076a2142dbfebe83a14 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 22:36:16 -0300 Subject: [PATCH 252/345] mcl_wip pt_BR translation --- mods/MISC/mcl_wip/locale/mcl_wip.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/MISC/mcl_wip/locale/mcl_wip.pt_BR.tr diff --git a/mods/MISC/mcl_wip/locale/mcl_wip.pt_BR.tr b/mods/MISC/mcl_wip/locale/mcl_wip.pt_BR.tr new file mode 100644 index 000000000..9a30f5466 --- /dev/null +++ b/mods/MISC/mcl_wip/locale/mcl_wip.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_wip +# WIP means “Work in Progress” +(WIP)=(Trabalho em progresso) +(Temporary)=(Temporário) From 21a10751d1c1d52d3344e899e57575fe006e1a36 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 22:42:01 -0300 Subject: [PATCH 253/345] mcl_lanterns pt_BR translation --- mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.pt_BR.tr | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.pt_BR.tr diff --git a/mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.pt_BR.tr b/mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.pt_BR.tr new file mode 100644 index 000000000..de683f688 --- /dev/null +++ b/mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.pt_BR.tr @@ -0,0 +1,6 @@ +# textdomain: mcl_lanterns +Lantern=Lanterna +Soul Lantern=Lanterna das Almas +Lanterns are light sources which can be placed on the top or the bottom of most blocks.=Lanternas são fontes de luz as quais podem ser posicionadas na parte superior ou inferior da maioria blocos. +Chain=Corrente +Chains are metallic decoration blocks.=Correntes são blocos de decoração metálicos. From 840381f73fffcf61e6eb1c19698692f96e1d3373 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 22:44:14 -0300 Subject: [PATCH 254/345] mcl_fletching_table pt_BR translation --- .../mcl_fletching_table/locale/mcl_fletching_table.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/ITEMS/mcl_fletching_table/locale/mcl_fletching_table.pt_BR.tr diff --git a/mods/ITEMS/mcl_fletching_table/locale/mcl_fletching_table.pt_BR.tr b/mods/ITEMS/mcl_fletching_table/locale/mcl_fletching_table.pt_BR.tr new file mode 100644 index 000000000..a2b7e38b5 --- /dev/null +++ b/mods/ITEMS/mcl_fletching_table/locale/mcl_fletching_table.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_fletching_table +Fletching Table=Bancada de Arco e Flecha +A fletching table=Uma bancada de arco e flecha +This is the fletcher villager's work station. It currently has no use beyond decoration.=Essa é a estação de trabalho do aldeão flecheiro. Atualmente não possui usos além de decoração. From 334ac81f589a32f8dd4331696a5ae3f3bc9e1ca6 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 05:43:22 -0300 Subject: [PATCH 255/345] mcl_fences pt_BR translation --- .../mcl_fences/locale/mcl_fences.pt_BR.tr | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr diff --git a/mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr b/mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr new file mode 100644 index 000000000..7c55be53d --- /dev/null +++ b/mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr @@ -0,0 +1,18 @@ +# textdomain: mcl_fences +Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump.=Cercas são estruturas as quais bloqueiam o caminho. Cercas vão conectar umas nas outras e em blocos sólidos. Não podem ser puladas com um simples pulo. +Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.=Portões podem ser abertos ou fechados e não podem ser pulados. As cercas irão se conectar aos portões. +Right-click the fence gate to open or close it.=Clique com o botão direito no portão para abri-lo ou fecha-lo. +Oak Fence=Cerca de Carvalho +Oak Fence Gate=Portão de Carvalho +Spruce Fence=Cerca de Pinheiro +Spruce Fence Gate=Portão de Pinheiro +Birch Fence=Cerca de Bétula +Birch Fence Gate=Portão de Bétula +Jungle Fence=Cerca da Selva +Jungle Fence Gate=Portão da Selva +Dark Oak Fence=Cerca de Carvalho Escuro +Dark Oak Fence Gate=Portão de Carvalho Escuro +Acacia Fence=Cerca de Acácia +Acacia Fence Gate=Portão de Acácia +Nether Brick Fence=Cerca de Tijolos do Nether +Openable by players and redstone power=Abrível por jogadores e carga de redstone From 799462c4b447b0ac2e4f611d207aaf961bda00a3 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 05:55:17 -0300 Subject: [PATCH 256/345] mcl_credits pt_BR translation --- .../mcl_credits/locale/mcl_credits.pt_BR.tr | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 mods/HUD/mcl_credits/locale/mcl_credits.pt_BR.tr diff --git a/mods/HUD/mcl_credits/locale/mcl_credits.pt_BR.tr b/mods/HUD/mcl_credits/locale/mcl_credits.pt_BR.tr new file mode 100644 index 000000000..e693b0357 --- /dev/null +++ b/mods/HUD/mcl_credits/locale/mcl_credits.pt_BR.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_credits +3D Models=Modelos 3D +A faithful Open Source clone of Minecraft=Um clone fiel Open Source do Minecraft +Contributors=Colaboradores +Creator of MineClone=Criador do MineClone +Creator of MineClone2=Criador do MineClone2 +Developers=Desenvolvedores +Past Developers=Desenvolvedores Passados +Jump to speed up (additionally sprint)=Pule para acelerar (arrancada adicional) +Maintainers=Mantedores +Previous Maintainers=Mantedores Anteriores +MineClone5=MineClone5 +Original Mod Authors=Autores Originais do Mod +Sneak to skip=Agache para pular +Textures=Texturas +Translations=Traduções +Music=Músicas +Funders=Financiadores +Special thanks=Agradecimentos especiais From 427724ced290ca0da5b01db36083a3bcf71b4d99 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 06:46:45 -0300 Subject: [PATCH 257/345] mcl_ver_info pt_BR translation --- mods/HUD/mcl_ver_info/locale/mcl_ver_info.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/HUD/mcl_ver_info/locale/mcl_ver_info.pt_BR.tr diff --git a/mods/HUD/mcl_ver_info/locale/mcl_ver_info.pt_BR.tr b/mods/HUD/mcl_ver_info/locale/mcl_ver_info.pt_BR.tr new file mode 100644 index 000000000..ef465f8a0 --- /dev/null +++ b/mods/HUD/mcl_ver_info/locale/mcl_ver_info.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_ver_info +Sorry, but your version of Minetest doesn't support the latest API. Please upgrade your minetest.=Desculpe, mas sua versão do Minetest não suporta a última API. Por favor atualize seu minetest. +Display Mineclone 2 game version.=Mostrar a versão do jogo Mineclone 2. From cb0c67b05fc4ab2d254464bf9d90330de5463fa9 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 07:32:08 -0300 Subject: [PATCH 258/345] mcl_fishing pt_BR translation --- .../mcl_fishing/locale/mcl_fishing.pt_BR.tr | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 mods/ITEMS/mcl_fishing/locale/mcl_fishing.pt_BR.tr diff --git a/mods/ITEMS/mcl_fishing/locale/mcl_fishing.pt_BR.tr b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.pt_BR.tr new file mode 100644 index 000000000..638858432 --- /dev/null +++ b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.pt_BR.tr @@ -0,0 +1,18 @@ +# textdomain: mcl_fishing +Fishing Rod=Vara de Pesca +Fishing rods can be used to catch fish.=Varas de pesca podem ser usadas para coletar peixes. +Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?=Clique com o botão direito para lançar a boia de pesca. Quando esta afundar clique com o botão direito novamente para enrola-la como um item. Quem sabe o que você está prestes a coletar? +Raw Fish=Peixe Cru +Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Peixe cru é obtido através da pesca e é um item de comida ao qual pode ser comido em segurança. Cozinha-lo aumenta seu valor nutricional. +Cooked Fish=Peixe Cozido +Mmh, fish! This is a healthy food item.=Mmh, peixe! Esse é um item de comida saudável. +Raw Salmon=Salmão Cru +Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Salmão cru é obtido através da pesca e é um item de comida ao qual pode ser comido em segurança. Cozinha-lo aumenta seu valor nutricional. +Cooked Salmon=Salmão Cozido +This is a healthy food item which can be eaten.=Esse é um item de comida saudável ao qual pode ser comido. +Clownfish=Peixe-Palhaço +Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely.=Peixes-Palhaço podem ser obtidos com pesca (e sorte) e são um item de comida ao qual pode ser comido em segurança. +Pufferfish=Baiacu +Pufferfish are a common species of fish and can be obtained by fishing. They can technically be eaten, but they are very bad for humans. Eating a pufferfish only restores 1 hunger point and will poison you very badly (which drains your health non-fatally) and causes serious food poisoning (which increases your hunger).=Baiacus são uma espécie comum de peixe e podem ser obtidos através da pesca. Tecnicamente eles podem ser comidos, mas eles são muito ruins para humanos. Comer um baiacu restaura apenas 1 ponto de fome e irá lhe envenenar muito (o que drenará sua saúde de forma não-fatal) e causará uma séria intoxicação alimentar (o que aumentará sua fome). +Catches fish in water=Coleta peixes na água. +Very poisonous=Muito venenoso From c6fc911c12603d253528e700980161ad4121d277 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 07:45:11 -0300 Subject: [PATCH 259/345] mcl_heads pt_BR translation --- mods/ITEMS/mcl_heads/locale/mcl_heads.pt_BR.tr | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 mods/ITEMS/mcl_heads/locale/mcl_heads.pt_BR.tr diff --git a/mods/ITEMS/mcl_heads/locale/mcl_heads.pt_BR.tr b/mods/ITEMS/mcl_heads/locale/mcl_heads.pt_BR.tr new file mode 100644 index 000000000..fb256997a --- /dev/null +++ b/mods/ITEMS/mcl_heads/locale/mcl_heads.pt_BR.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_heads +Zombie Head=Cabeça de Zumbi +A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Uma cabeça de zumbi é um pequeno bloco decorativo ao qual remete a cabeça de um zumbi. Também pode ser usado como um capacete, o que reduz o alcançe de detecção dos zumbis em 50%. +Creeper Head=Cabeça de Creeper +A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%.=Uma cabeça de creeper é um pequeno bloco decorativo ao qual remete a cabeça de um creeper. Também pode ser usado como um capacete, o que reduz o alcançe de detecção dos creepers em 50%. +Human Head=Cabeça Humana +A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Uma cabeça de humano é um pequeno bloco decorativo ao qual remete a cabeça de um humano (ou seja, o personagem do jogador). Também pode ser usado como um capacete por diversão, mas não oferece nenhuma proteção. +Skeleton Skull=Cabeça de Esqueleto +A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet, which reduces the detection range of skeletons by 50%.=Uma cabeça de esqueleto é um pequeno bloco decorativo ao qual remete a cabeça de um esqueleto. Também pode ser usado como um capacete, o que reduz o alcançe de detecção dos esqueletos em 50%. +Wither Skeleton Skull=Cabeça de Esqueleto Wither +A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.=Uma cabeça de esqueleto wither é um pequeno bloco decorativo ao qual remete a cabeça de um esqueleto wither. Também pode ser usado como um capacete por diversão, mas não oferece nenhuma proteção. From e536822b4d1f095d8bd70257f7b7f3926b945675 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 08:09:15 -0300 Subject: [PATCH 260/345] mcl_tools pt_BR translation --- .../ITEMS/mcl_tools/locale/mcl_tools.pt_BR.tr | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 mods/ITEMS/mcl_tools/locale/mcl_tools.pt_BR.tr diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.pt_BR.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.pt_BR.tr new file mode 100644 index 000000000..a16b7868d --- /dev/null +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.pt_BR.tr @@ -0,0 +1,36 @@ +# textdomain: mcl_tools +You use your bare hand whenever you are not wielding any item. With your hand you can mine most blocks, but this is the slowest method and only the weakest blocks will yield their useful drop. The hand also deals minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are much better.=Você usa sua mão nua sempre que não estiver segurando qualquer item. Com sua mão você pode minerar a maioria dos blocos, porém esse é o método mais lento e apenas os blocos mais fracos vão render seus drops úteis. A mão também dá o mínimo de dano quando soca. Usar a mão é muitas vezes o último recurso, uma vez que ferramentas de mineração apropriadas e armas são muito melhores. +When you are wielding an item which is not a mining tool or a weapon, it will behave as if it were the hand when you start mining or punching.=Quando você estiver segurando um item o qual não é uma ferramenta de mineração ou uma arma, este se comportará como se fosse a mão quando você começa a minerar ou socar. +In Creative Mode, the hand is able to break all blocks instantly.=No Modo Criativo, a mão é capaz de quebrar todos os blocos instantaneamente. +Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.=Picaretas são ferramentas de mineração para minerar blocos duros, como rochas. Uma picareta também pode ser usada como arma, mas é bastante ineficiente. +An axe is your tool of choice to cut down trees, wood-based blocks and other blocks. Axes deal a lot of damage as well, but they are rather slow.=Um machado é sua ferramenta preferida para cortar árvores, blocos de madeira e outros blocos. Machados também dão muito dano, mas são bastante lentos. +Swords are great in melee combat, as they are fast, deal high damage and can endure countless battles. Swords can also be used to cut down a few particular blocks, such as cobwebs.=Espadas são excelentes no combate corpo a corpo, já que são rápidas, dão muito dano e podem suportar inúmeras batalhas. Espadas também podem ser usadas para cortar alguns blocos específicos, como as teias. +Shovels are tools for digging coarse blocks, such as dirt, sand and gravel. They can also be used to turn grass blocks to grass paths. Shovels can be used as weapons, but they are very weak.=Pás são ferramentas para cavar blocos grossos, como as terras, areias e cascalho. Também podem ser usadas para transformar blocos de grama em caminhos de grama. Pás podem ser usadas como armas, mas são muito fracas. +To turn a grass block into a grass path, hold the shovel in your hand, then use (rightclick) the top or side of a grass block. This only works when there's air above the grass block.=Para transformar um bloco de grama em um caminho de grama, segure a pá na sua mão, então use (clique com o botão direito) no topo ou lados de um bloco de grama. Isso só funcionará quando houver ar sobre o bloco de grama. +Shears are tools to shear sheep and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from grass, leaves and similar blocks that require cutting.=Tesouras são ferramentas para tosquear ovelhas e para minerar alguns tipos de blocos específicos. Tesouras são uma ferramenta de mineração especial e podem ser usadas para obter o item original da grama, folhas e blocos semelhantes que requerem corte. +To shear sheep or carve faceless pumpkins, use the “place” key on them. Faces can only be carved at the side of faceless pumpkins. Mining works as usual, but the drops are different for a few blocks.=Para tosquear ovelhas ou escavar abóboras, use a tecla "posicionar" neles. Rostos podem ser escavados na lateral das abóboras. Minerar funciona como de costume, porém os drops são diferentes para alguns blocos específicos. +Wooden Pickaxe=Picareta de Madeira +Stone Pickaxe=Picareta de Pedra +Iron Pickaxe=Picareta de Ferro +Golden Pickaxe=Picareta de Ouro +Diamond Pickaxe=Picareta de Diamante +Netherite Pickaxe=Picareta de Netherite +Wooden Shovel=Pá de Madeira +Stone Shovel=Pá de Pedra +Iron Shovel=Pá de Ferro +Golden Shovel=Pá de Ouro +Diamond Shovel=Pá de Diamante +Netherite Shovel=Pá de Netherite +Wooden Axe=Machado de Madeira +Stone Axe=Machado de Pedra +Iron Axe=Machado de Ferro +Golden Axe=Machado de Ouro +Diamond Axe=Machado de Diamante +Netherite Axe=Machado de Netherite +Wooden Sword=Espada de Madeira +Stone Sword=Espada de Pedra +Iron Sword=Espada de Ferro +Golden Sword=Espada de Ouro +Diamond Sword=Espada de Diamante +Netherite Sword=Espada de Netherite +Shears=Tesoura From 188f1cdaa6d3591a9d92de2236abc0a54fbe7457 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 08:59:52 -0300 Subject: [PATCH 261/345] mcl_itemframes pt_BR translation --- .../mcl_itemframes/locale/mcl_itemframes.pt_BR.tr | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.pt_BR.tr diff --git a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.pt_BR.tr b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.pt_BR.tr new file mode 100644 index 000000000..4c55b470f --- /dev/null +++ b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.pt_BR.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_itemframes +Item Frame=Moldura +Item frames are decorative blocks in which items can be placed.=Molduras são blocos decorativos aos quais itens podem ser posicionadas. +Just place any item on the item frame. Use the item frame again to retrieve the item.=Apenas posicione qualquer item na moldura. Use a moldura de novo para pegar o item de volta. +Can hold an item.=Pode segurar um item. +Glowing Item Frame=Moldura Brilhante +Glowing item frames are decorative blocks in which items can be placed.=Molduras brilhantes são blocos decorativos aos quais itens podem ser posicionados. +Can hold an item and glows.=Pode segurar um item e brilha. +Glow and Behold!=Brilhe e Veja! +Craft a glow item frame.=Fabrique uma moldura brilhante. From 1c3003c85b1cf186d49866cfe0b0d899e965120d Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:02:42 -0300 Subject: [PATCH 262/345] mcl_spawn pt_BR translation --- mods/PLAYER/mcl_spawn/locale/mcl_spawn.pt_BR.tr | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 mods/PLAYER/mcl_spawn/locale/mcl_spawn.pt_BR.tr diff --git a/mods/PLAYER/mcl_spawn/locale/mcl_spawn.pt_BR.tr b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.pt_BR.tr new file mode 100644 index 000000000..414f10b9f --- /dev/null +++ b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_spawn +New respawn position set!=Nova posição de renascimento definida! +Respawn position cleared!=Posição de renascimento limpa! +Couldn't get level of your respawn anchor!=Não foi possível nivelar sua âncora de renascimento! +Your spawn bed was missing or blocked, and you had no charged respawn anchor!=Sua cama está faltando ou foi bloqueada, e você não carregou sua âncora de renascimento. From d57fbb047d45735fa24c079f3a45654bc1612180 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:17:30 -0300 Subject: [PATCH 263/345] mcl_sponges pt_BR translation --- mods/ITEMS/mcl_sponges/locale/mcl_sponges.pt_BR.tr | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 mods/ITEMS/mcl_sponges/locale/mcl_sponges.pt_BR.tr diff --git a/mods/ITEMS/mcl_sponges/locale/mcl_sponges.pt_BR.tr b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.pt_BR.tr new file mode 100644 index 000000000..e6a857347 --- /dev/null +++ b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.pt_BR.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_sponges +Sponge=Esponja +Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.=Esponjas são blocos aos quais removem água ao seu redor quando elas são posicionadas ou entram em contato com a água, se transfomando em uma esponja molhada. +Waterlogged Sponge=Esponja Alagada +A waterlogged sponge can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of a furnace, the water will pour into the bucket.=Uma esponja alagada pode ser seca na fornalha para se tornar uma esponja (seca). Quando tem um balde vazio no slot de combustível da fornalha, a água irá se depositar dentro do balde. +Riverwaterlogged Sponge=Esponja Alagada em Rio +This is a sponge soaking wet with river water. It can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of the furnace, the river water will pour into the bucket.=Esta é uma esponja encharcada com água do rio. Uma esponja alagada em rio pode ser seca na fornalha para se tornar uma esponja (seca). Quando tem um balde vazio no slot de combustível da fornalha, a água de rio irá se depositar dentro do balde. +A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.=A esponja se torna alagada em rio (em vez de alagada) se esta sugar mais água de rio do que água (normal). +Removes water on contact=Remove água por contato +Can be dried in furnace=Pode ser secada na fornalha From 184a098964400531880b0aef236520de1cc3f65a Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:19:47 -0300 Subject: [PATCH 264/345] mcl_torches pt_BR translation --- mods/ITEMS/mcl_torches/locale/mcl_torches.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/ITEMS/mcl_torches/locale/mcl_torches.pt_BR.tr diff --git a/mods/ITEMS/mcl_torches/locale/mcl_torches.pt_BR.tr b/mods/ITEMS/mcl_torches/locale/mcl_torches.pt_BR.tr new file mode 100644 index 000000000..fc49b3a0f --- /dev/null +++ b/mods/ITEMS/mcl_torches/locale/mcl_torches.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_torches +Torch=Tocha +Torches are light sources which can be placed at the side or on the top of most blocks.=Tochas são fontes de luz as quais podem ser posicionadas nas laterais ou na parte superior de muitos blocos. From 8b02d7b0b297511d7ee4db1114c3f66336b25a97 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:21:19 -0300 Subject: [PATCH 265/345] mcl_walls pt_BR translation fix --- mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr index a344d88c0..8d06a55d1 100644 --- a/mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr +++ b/mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr @@ -11,7 +11,7 @@ Red Sandstone Wall=Muro de Arenito Vermelho Stone Brick Wall=Muro de Tijolos de Pedra Mossy Stone Brick Wall=Muro de Tijolos de Pedra Musgosos Prismarine Wall=Muro de Prismarinho -End Stone Brick Wall=Muro de Tijolos de Pedra do Fim +End Stone Brick Wall=Muro de Tijolos de Pedra do End Nether Brick Wall=Muro de Tijolos do Nether Red Nether Brick Wall=Muro de Tijolos Vermelhos do Nether Mud Brick Wall=Muro de Tijolos de Barro From 4a3369205e052ecb95187c50fc2823f63e30050b Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:32:43 -0300 Subject: [PATCH 266/345] mcl_wool pt_BR translation --- mods/ITEMS/mcl_wool/locale/mcl_wool.pt_BR.tr | 37 ++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 mods/ITEMS/mcl_wool/locale/mcl_wool.pt_BR.tr diff --git a/mods/ITEMS/mcl_wool/locale/mcl_wool.pt_BR.tr b/mods/ITEMS/mcl_wool/locale/mcl_wool.pt_BR.tr new file mode 100644 index 000000000..3ae9a6ce3 --- /dev/null +++ b/mods/ITEMS/mcl_wool/locale/mcl_wool.pt_BR.tr @@ -0,0 +1,37 @@ +# textdomain: mcl_wool +Wool=Lã +Carpet=Carpete +White Wool=Lã Branco +White Carpet=Carpete Branco +Grey Wool=Lã Cinza +Grey Carpet=Carpete Cinza +Light Grey Wool=Lã Cinza Claro +Light Grey Carpet=Carpete Cinza Claro +Black Wool=Lã Preto +Black Carpet=Carpete Preto +Red Wool=Lã Vermelho +Red Carpet=Carpete Vermelho +Yellow Wool=Lã Amarelo +Yellow Carpet=Carpete Amarelo +Green Wool=Lã Verde +Green Carpet=Carpete Verde +Cyan Wool=Lã Ciano +Cyan Carpet=Carpete Ciano +Blue Wool=Lã Azul +Blue Carpet=Carpete Azul +Magenta Wool=Lã Magenta +Magenta Carpet=Carpete Magenta +Orange Wool=Lã Laranja +Orange Carpet=Carpete Laranja +Purple Wool=Lã Roxo +Purple Carpet=Carpete Roxo +Brown Wool=Lã Marrom +Brown Carpet=Carpete Marrom +Pink Wool=Lã Rosa +Pink Carpet=Carpete Rosa +Lime Wool=Lã Lima +Lime Carpet=Carpete Lima +Light Blue Wool=Lã Azul Claro +Light Blue Carpet=Carpete Azul Claro +Wool is a decorative block which comes in many different colors.=Lã é um bloco decorativo ao qual vêm em várias cores diferentes. +Carpets are thin floor covers which come in many different colors.=Carpetes são coberturas finas para o piso aos quais vêm em diferentes cores. From 6dac6522410672b48f59bc593635a7a6d8be9986 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:35:52 -0300 Subject: [PATCH 267/345] mclx_core pt_BR translation --- mods/ITEMS/mclx_core/locale/mclx_core.pt_BR.tr | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 mods/ITEMS/mclx_core/locale/mclx_core.pt_BR.tr diff --git a/mods/ITEMS/mclx_core/locale/mclx_core.pt_BR.tr b/mods/ITEMS/mclx_core/locale/mclx_core.pt_BR.tr new file mode 100644 index 000000000..a6a8552c0 --- /dev/null +++ b/mods/ITEMS/mclx_core/locale/mclx_core.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: mclx_core +River Water Source=Fonte de Água de Rio +River water has the same properties as water, but has a reduced flowing distance and is not renewable.=Água de rio têm as mesmas propriedades da água, mas tem uma distância de escoamento reduzido e não é renovável. +River Water=Água de Rio +Flowing River Water=Água Corrente de Rio From 3a89d367b06276858eb64b665d7b5db75bcef049 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:38:05 -0300 Subject: [PATCH 268/345] mclx_fences pt_BR translation --- mods/ITEMS/mclx_fences/locale/mclx_fences.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/ITEMS/mclx_fences/locale/mclx_fences.pt_BR.tr diff --git a/mods/ITEMS/mclx_fences/locale/mclx_fences.pt_BR.tr b/mods/ITEMS/mclx_fences/locale/mclx_fences.pt_BR.tr new file mode 100644 index 000000000..6de63f21d --- /dev/null +++ b/mods/ITEMS/mclx_fences/locale/mclx_fences.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mclx_fences +Red Nether Brick Fence=Cerca de Tijolos Vermelhos do Nether +Red Nether Brick Fence Gate=Portão de Tijolos Vermelhos do Nether +Nether Brick Fence Gate=Portão de Tijolos do Nether From 90a758c0023ff3becc168ff1b574bd8e936d45f3 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:50:00 -0300 Subject: [PATCH 269/345] mcl_lightning_rods pt_BR translation --- .../mcl_lightning_rods/locale/mcl_lightning_rods.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/ITEMS/mcl_lightning_rods/locale/mcl_lightning_rods.pt_BR.tr diff --git a/mods/ITEMS/mcl_lightning_rods/locale/mcl_lightning_rods.pt_BR.tr b/mods/ITEMS/mcl_lightning_rods/locale/mcl_lightning_rods.pt_BR.tr new file mode 100644 index 000000000..4a57a6dbf --- /dev/null +++ b/mods/ITEMS/mcl_lightning_rods/locale/mcl_lightning_rods.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_lightning_rods +Lightning Rod=Para-Raios +A block that attracts lightning=Um bloco que atrai raios From 908c46ce348183290138bb273888917332b4ff03 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:52:00 -0300 Subject: [PATCH 270/345] mcl_loom pt_BR translation --- mods/ITEMS/mcl_loom/locale/mcl_loom.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/ITEMS/mcl_loom/locale/mcl_loom.pt_BR.tr diff --git a/mods/ITEMS/mcl_loom/locale/mcl_loom.pt_BR.tr b/mods/ITEMS/mcl_loom/locale/mcl_loom.pt_BR.tr new file mode 100644 index 000000000..eef49ba0f --- /dev/null +++ b/mods/ITEMS/mcl_loom/locale/mcl_loom.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_loom +Loom=Tear +Used to create banner designs=Usado para criar designs nos estandartes +This is the shepherd villager's work station. It is used to create banner designs.=Essa é a estação de trabalho do aldeão pastor. É usado para criar designs nos estandartes. From 487f78d66320c73c1817789c8370a69a6ea065f5 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:05:46 -0300 Subject: [PATCH 271/345] mcl_hunger pt_BR translation --- mods/PLAYER/mcl_hunger/locale/mcl_hunger.pt_BR.tr | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 mods/PLAYER/mcl_hunger/locale/mcl_hunger.pt_BR.tr diff --git a/mods/PLAYER/mcl_hunger/locale/mcl_hunger.pt_BR.tr b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.pt_BR.tr new file mode 100644 index 000000000..c48a93090 --- /dev/null +++ b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_hunger +@1 succumbed to the poison.=@1 sucumbiu ao veneno. +Food=Comida +Saturation=Saturação +%s: %.1f/%d=%s: %.1f/%d +Exhaust.=Cansado. +%s: %d/%d=%s: %d/%d +@1 starved to death.=@1 morreu de fome. From 6480c6923acc6cb415b2da0167eefb343586be70 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:11:45 -0300 Subject: [PATCH 272/345] mcl_music pt_BR translation --- mods/PLAYER/mcl_music/locale/mcl_music.pt_BR.tr | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 mods/PLAYER/mcl_music/locale/mcl_music.pt_BR.tr diff --git a/mods/PLAYER/mcl_music/locale/mcl_music.pt_BR.tr b/mods/PLAYER/mcl_music/locale/mcl_music.pt_BR.tr new file mode 100644 index 000000000..8e6f062b1 --- /dev/null +++ b/mods/PLAYER/mcl_music/locale/mcl_music.pt_BR.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_music +You need the debug privilege in order to turn ingame music on or off for somebody else!=Você precisa do privilégio debug para poder ligar ou desligar a música para alguém! +Couldn't find player @1!=O jogador @1 não pôde ser localizado! +Set music for @1 to: @2=Definida música @1 para: @2 +Turns music for yourself or another player on or off.=Liga ou desliga a música para você ou outro jogador. +on=ligado +off=desligado From cb6b4253d28ee5c7be0e4d7c8b8754eb4a4253ba Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:25:52 -0300 Subject: [PATCH 273/345] findbiome pt_BR translation --- mods/MISC/findbiome/locale/findbiome.pt_BR.tr | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 mods/MISC/findbiome/locale/findbiome.pt_BR.tr diff --git a/mods/MISC/findbiome/locale/findbiome.pt_BR.tr b/mods/MISC/findbiome/locale/findbiome.pt_BR.tr new file mode 100644 index 000000000..5e9e3a6cb --- /dev/null +++ b/mods/MISC/findbiome/locale/findbiome.pt_BR.tr @@ -0,0 +1,10 @@ +# textdomain: findbiome +Find and teleport to biome=Encontra e teleporta para um bioma += +No player.=Nenhum jogador. +Biome does not exist!=Bioma não existe! +Biome found at @1.=Bioma encontrado em @1. +No biome found!=Nenhum bioma encontrado! +List all biomes=Lista de todos os biomas +No biomes.=Nenhum bioma. +Not supported. The “biomeinfo” mod is required for v6 mapgen support!=Não suportado. O mod "biomeinfo" é necessário para o suporte da mapgen v6! From cde4bc797e47b7db189c669b1e96899ba23a1f69 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:34:19 -0300 Subject: [PATCH 274/345] mcl_commands pt_BR translation --- .../mcl_commands/locale/mcl_commands.pt_BR.tr | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr b/mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr new file mode 100644 index 000000000..df12b27fe --- /dev/null +++ b/mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_commands +Players can't be killed right now, damage has been disabled.= +Player @1 does not exist.=Jogador @1 não existe. +You are already dead=Você já está morto +@1 is already dead=@1 já está morto +@1 committed suicide.=@1 cometeu suícidio. +@1 was killed by @2.=@1 foi morto(a) por @2. +[]=[] +Kill player or yourself=Mata jogadores ou você mesmo +Can use /say=Pode usar /say += +Send a message to every player=Envia uma mensagem para todos os jogadores +Invalid usage, see /help say.=Uso inválido, veja /help say. +,, = ,, +Set node at given position=Define um node na posição dada +Invalid node=Node inválido +@1 spawned.=@1 nasceu. +Invalid parameters (see /help setblock)=Parâmetros inválidos (veja /help setblock) +List bans=Lista banimentos +Ban list: @1=Lista de banimento: @1 +Show who is logged on=Mostra quem está logado +Displays the world seed=Mostra a semente do mundo +Only peaceful mobs allowed!=Apenas mobs pacíficos permitidos! From fcd4a610e596d21f60229b6de10dc5a1cb44d203 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:35:23 -0300 Subject: [PATCH 275/345] mcl_commands pt_BR translation missing --- mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr b/mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr index df12b27fe..5a2688d67 100644 --- a/mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr +++ b/mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr @@ -1,5 +1,5 @@ # textdomain: mcl_commands -Players can't be killed right now, damage has been disabled.= +Players can't be killed right now, damage has been disabled.=Jogadores não podem ser mortos agora, dano foi desabilitado. Player @1 does not exist.=Jogador @1 não existe. You are already dead=Você já está morto @1 is already dead=@1 já está morto From d7c8c7a54ad8966149fff8e2e88592db73d5d138 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:37:35 -0300 Subject: [PATCH 276/345] mcl_privs pt_BR translation --- mods/MISC/mcl_privs/locale/mcl_privs.pt_BR.tr | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mods/MISC/mcl_privs/locale/mcl_privs.pt_BR.tr diff --git a/mods/MISC/mcl_privs/locale/mcl_privs.pt_BR.tr b/mods/MISC/mcl_privs/locale/mcl_privs.pt_BR.tr new file mode 100644 index 000000000..fe57673f4 --- /dev/null +++ b/mods/MISC/mcl_privs/locale/mcl_privs.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_privs +Can place and use advanced blocks like mob spawners, command blocks and barriers.=Pode posicionar e usar blocos avançados como geradores de mobs, blocos de comandos e barreiras. From 3e131a213f9eff8e7fe4ea98fd5acbd76241c575 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:41:41 -0300 Subject: [PATCH 277/345] mcl_villages pt_BR translation --- mods/MAPGEN/mcl_villages/locale/mcl_villages.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/MAPGEN/mcl_villages/locale/mcl_villages.pt_BR.tr diff --git a/mods/MAPGEN/mcl_villages/locale/mcl_villages.pt_BR.tr b/mods/MAPGEN/mcl_villages/locale/mcl_villages.pt_BR.tr new file mode 100644 index 000000000..bded6250d --- /dev/null +++ b/mods/MAPGEN/mcl_villages/locale/mcl_villages.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_villages +Chiseled Stone Village Bricks=Tijolos de Aldeia de Pedra Cinzelada +mcl_villages build tool=ferramenta de construção mcl_villages From 3f0e77b97158d71a61d1004f9a51eab65d31892f Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:52:32 -0300 Subject: [PATCH 278/345] mcl_bamboo pt_BR translation --- .../mcl_bamboo/locale/mcl_bamboo.pt_BR.tr | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.pt_BR.tr diff --git a/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.pt_BR.tr b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.pt_BR.tr new file mode 100644 index 000000000..8517b0cbe --- /dev/null +++ b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.pt_BR.tr @@ -0,0 +1,46 @@ +# textdomain: mcl_bamboo + +### bamboo_base.lua ### + +Bamboo=Bambu +Bamboo Mosaic Plank=Mosaico de Tábuas de Bambu +Bamboo Plank=Tábuas de Bambu +Stripped Bamboo Block=Bloco de Bambu Descascado +Bamboo Block=Bloco de Bambu + +### bamboo_items.lua ### + +A bamboo button is a redstone component made out of bamboo which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Um botão de bambu é um componente de redstone feito de bambu ao qual pode ser empurrado para providenciar carga de redstone. Quando empurrado, energiza componentes de redstone adjacentes por 1 segundo. + +A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=Uma placa de pressão de madeira é um componente de redstone ao qual alimenta os blocos ao seu redor com uma carga de redstone enquanto qualquer objeto móvel (incluindo itens largados, jogadores e mobs) parar em cima dela. + +Bamboo=Bambu +Bamboo Button=Botão de Bambu +Bamboo Door=Porta de Bambu +Bamboo Fence=Cerca de Bambu +Bamboo Fence Gate=Portão de Bambu +Bamboo Mosaic Slab=Laje de Mosaico de Bambu +Bamboo Mosaic Stair=Escada de Mosaico de Bambu +Bamboo Plank Slab=Laje de Tábuas de Bambu +Bamboo Plank Stair=Escada de Tábuas de Bambu +Bamboo Pressure Plate=Placa de Pressão de Bambu +Bamboo Sign=Placa de Bambu +Bamboo Slab=Laje de Bambu +Bamboo Stair=Escada de Bambu +Bamboo Trapdoor=Alçapão de Bambu +Double Bamboo Mosaic Slab=Laje Dupla de Mosaico de Bambu +Double Bamboo Plank Slab=Laje Dupla de Tábuas de Bambu +Double Bamboo Slab=Laje Dupla de Bambu +Double Stripped Bamboo Slab=Laje Dupla de Bambu Descascado +Scaffolding=Andaime +Scaffolding (horizontal)=Andaime (horizontal) +Scaffolding block used to climb up or out across areas.=Bloco de andaime é usado para escalar ou cruzar áreas. +Stripped Bamboo Slab=Laje de Bambu Descascado +Stripped Bamboo Stair=Escada de Bambu Descascado + +To open or close the trapdoor, rightclick it or send a redstone signal to it.=Para abrir ou fechar o alçapão, clique com o botão direito ou mande-o um sinal de redstone. + +Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Alçapões de madeira são barreiras horizontais as quais podem ser abertas ou fechadas com a mão ou um sinal de redstone. Eles ocupam a parte superior ou inferior de um bloco, dependendo de como eles são posicionados. Quando abertos, eles são escaláveis como uma escada. + +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Portas de madeira são barreiras de 2 blocos de altura as quais podem ser abertas ou fechadas com a mão ou um sinal de redstone. +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Para abrir ou fechar uma porta de madeira, clique com o botão direito nela ou alimente sua metade inferior com um sinal de redstone. From 0638c67cf702a85242fce65ad599ccdf4a2e11ed Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:57:01 -0300 Subject: [PATCH 279/345] mcl_shields pt_BR translation --- .../mcl_shields/locale/mcl_shields.pt_BR.tr | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 mods/ITEMS/mcl_shields/locale/mcl_shields.pt_BR.tr diff --git a/mods/ITEMS/mcl_shields/locale/mcl_shields.pt_BR.tr b/mods/ITEMS/mcl_shields/locale/mcl_shields.pt_BR.tr new file mode 100644 index 000000000..1f3c3f09e --- /dev/null +++ b/mods/ITEMS/mcl_shields/locale/mcl_shields.pt_BR.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_shields +Shield=Escudo +A shield is a tool used for protecting the player against attacks.=Um escudo é uma ferramenta usada para a proteção do jogador contra ataques. +White Shield=Escudo Branco +Grey Shield=Escudo Cinza +Light Grey Shield=Escudo Cinza Claro +Black Shield=Escudo Preto +Red Shield=Escudo Vermelho +Yellow Shield=Escudo Amarelo +Green Shield=Escudo Verde +Cyan Shield=Escudo Ciano +Blue Shield=Escudo Azul +Magenta Shield=Escudo Magenta +Orange Shield=Escudo Laranja +Purple Shield=Escudo Roxo +Brown Shield=Escudo Marrom +Pink Shield=Escudo Rosa +Lime Shield=Escudo Lima +Light Blue Shield=Escudo Azul Claro From 8b1ad1c217af9adfc48d18173bde209e81e7e7cd Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 19:01:20 -0300 Subject: [PATCH 280/345] mcl_smithing_table pt_BR translation --- .../mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr diff --git a/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr b/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr new file mode 100644 index 000000000..065d5faba --- /dev/null +++ b/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_smithing_table +Inventory=Inventário +Upgrade Gear=Atualizar Equipamento +Smithing table=Mesa de ferraria From ae470f8809caa2b93b09b52e329f3c62a7dc51c4 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 19:18:19 -0300 Subject: [PATCH 281/345] mcl_armor pt_BR translation missing --- mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr b/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr index b12f07026..6ce4997db 100644 --- a/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr +++ b/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr @@ -46,3 +46,6 @@ Reduces most types of damage by 4% for each level.=Reduz a maioria dos tipos de Thorns=Espinhos Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.=Reflete parte do dano tomado aos custos de reduzir a durabilidade com cada uso. Aqua Affinity=Afinidade Aqua + +#Translations for armor trims +Smithing Template '@1'=Molde de Ferraria From bc186560b4f07fdfa27641976adfb506e8100e69 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 21:06:52 -0300 Subject: [PATCH 282/345] mcl_hamburger pt_BR translation --- mods/ITEMS/mcl_hamburger/locale/mcl_hamburger.pt_BR.tr | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 mods/ITEMS/mcl_hamburger/locale/mcl_hamburger.pt_BR.tr diff --git a/mods/ITEMS/mcl_hamburger/locale/mcl_hamburger.pt_BR.tr b/mods/ITEMS/mcl_hamburger/locale/mcl_hamburger.pt_BR.tr new file mode 100644 index 000000000..63f37d579 --- /dev/null +++ b/mods/ITEMS/mcl_hamburger/locale/mcl_hamburger.pt_BR.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_hamburger +A Hamburger=Hambúrguer + +A tasty hamburger that is sure to lure villagers around like a lead. Can be eaten.=Um hambúrguer saboroso certamente atrairá os aldeões como um laço. Pode ser comido. + +A tasty hamburger that is sure to lure villagers. 'I'll gladly pay you Tuesday, for a hamburger today.' - Wimpy.=Um hambúrguer saboroso certamente atrairá os aldeões.'Pagarei com prazer na terça-feira, por um hambúrguer hoje.' - Wimpy. + +Burger Time!=Hora do Hambúrguer! +Craft a Hamburger.=Fabrique um hambúrguer. +Wield this item to pull villagers to you.=Segure esse item para atrair aldeões até você. From 8afa57b914d155d8634b2844f78e0ba238912a06 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 21:39:44 -0300 Subject: [PATCH 283/345] mcl_sus_stew pt_BR translation --- mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.pt_BR.tr | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.pt_BR.tr diff --git a/mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.pt_BR.tr b/mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.pt_BR.tr new file mode 100644 index 000000000..ece9c8301 --- /dev/null +++ b/mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_sus_stew +Suspicious Stew=Ensopado Suspeito From 7f36116146b83f6e14c18bcd7e8b07c0dba46103 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 21:42:50 -0300 Subject: [PATCH 284/345] screwdriver pt_BR translation --- mods/ITEMS/screwdriver/locale/screwdriver.pt_BR.tr | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mods/ITEMS/screwdriver/locale/screwdriver.pt_BR.tr diff --git a/mods/ITEMS/screwdriver/locale/screwdriver.pt_BR.tr b/mods/ITEMS/screwdriver/locale/screwdriver.pt_BR.tr new file mode 100644 index 000000000..feb7ac77b --- /dev/null +++ b/mods/ITEMS/screwdriver/locale/screwdriver.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain: screwdriver +Screwdriver=Chave de Fenda From bd19c8fe679191dd6818a79aa59293d9d6ec2db4 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 21:54:56 -0300 Subject: [PATCH 285/345] mcl_mud pt_BR translation --- mods/ITEMS/mcl_mud/locale/mcl_mud.pt_BR.tr | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 mods/ITEMS/mcl_mud/locale/mcl_mud.pt_BR.tr diff --git a/mods/ITEMS/mcl_mud/locale/mcl_mud.pt_BR.tr b/mods/ITEMS/mcl_mud/locale/mcl_mud.pt_BR.tr new file mode 100644 index 000000000..c3b5edf0e --- /dev/null +++ b/mods/ITEMS/mcl_mud/locale/mcl_mud.pt_BR.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_mud +Mud=Barro +Mud is a decorative block that generates in mangrove swamps. Mud can also be obtained by using water bottles on dirt or coarse dirt.=Barro é um bloco decorativo gerado em manguezais. Barro também pode ser obtido usando garrafas de água em blocos de terra ou terra infértil. +Packed Mud=Barro Seco +Packed mud is a decorative block used to craft mud bricks.=Barro seco é um bloco decorativo usado para fabricar tijolos de barro. +Mud Bricks=Tijolos de Barro +Decorative block crafted from packed mud.=Bloco decorativo fabricado a partir de barro seco. From e291d9918e8f61a62841dbdf5af5018bcd89f7f7 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 22:15:05 -0300 Subject: [PATCH 286/345] mcl_stonecutter pt_BR translation --- mods/ITEMS/mcl_stonecutter/locale/mcl_stonecutter.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/ITEMS/mcl_stonecutter/locale/mcl_stonecutter.pt_BR.tr diff --git a/mods/ITEMS/mcl_stonecutter/locale/mcl_stonecutter.pt_BR.tr b/mods/ITEMS/mcl_stonecutter/locale/mcl_stonecutter.pt_BR.tr new file mode 100644 index 000000000..7b52a2507 --- /dev/null +++ b/mods/ITEMS/mcl_stonecutter/locale/mcl_stonecutter.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_stonecutter +Stone Cutter=Cortador de Pedras +Used to cut stone like materials.=Usado para cortar materiais rochosos. +Stonecutters are used to create stairs and slabs from stone like materials. It is also the jobsite for the Stone Mason Villager.=Cortadores de pedras são usados para criar certas escadas e lajes a partir de materiais rochosos. Também é a estação de trabalho do aldeão pedreiro. From 8816e9fc61d18657341bb35f49d59f248449a554 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sat, 2 Dec 2023 10:15:46 -0300 Subject: [PATCH 287/345] mcl_throwing pt_BR translation --- mods/ITEMS/mcl_throwing/locale/mcl_throwing.pt_BR.tr | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 mods/ITEMS/mcl_throwing/locale/mcl_throwing.pt_BR.tr diff --git a/mods/ITEMS/mcl_throwing/locale/mcl_throwing.pt_BR.tr b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.pt_BR.tr new file mode 100644 index 000000000..8cdaff4d5 --- /dev/null +++ b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.pt_BR.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_throwing +@1 used the ender pearl too often.=@1 usou a pérola do ender muitas vezes. +Use the punch key to throw.=Use o botão de soco para arremessar. +Snowball=Bola de Neve +Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.=Bolas de neve podem ser arremessadas ou lançadas a partir de um ejetor por diversão. Atingir coisas com bolas de neve não fará coisa alguma. +Egg=Ovo +Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chicks will pop out of the egg.=Ovos podem ser arremessados ou lançados a partir de um ejetor e quebra no impacto. Existe uma pequena chance de 1 ou até 4 pintinhos aparecerem desse ovo. +Ender Pearl=Pérola do Ender +An ender pearl is an item which can be used for teleportation at the cost of health. It can be thrown and teleport the thrower to its impact location when it hits a solid block or a plant. Each teleportation hurts the user by 5 hit points.=Uma pérola do ender é um item ao qual pode ser usado para teleporte ao custo de saúde. Pode ser arremessada e teleporta o arremessador para seu local de impacto quando acerta um bloco sólido ou uma planta. Cada teleporte machuca o usuário em 5 pontos de dano. +Throwable=Arremesaável +Chance to hatch chicks when broken=Chance de eclodir pintinhos quando quebrado +Teleports you on impact for cost of 5 HP=Teleporta você no impacto ao custo de 5 HP From 8f3936792fbd5e7b3cae7fe9a8c1f0b2152d283d Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sat, 2 Dec 2023 10:28:44 -0300 Subject: [PATCH 288/345] mcl_cocoas pt_BR translation missing --- mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.pt_BR.tr b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.pt_BR.tr index 4501fc1be..41336b19f 100644 --- a/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.pt_BR.tr +++ b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.pt_BR.tr @@ -1,4 +1,8 @@ # textdomain: mcl_cocoas +Cocoa Beans=Sementes de Cacau +Grows at the side of jungle trees=Cresce nas laterais de árvores da selva. +Cocoa beans can be used to plant cocoa, bake cookies or craft brown dye.=Sementes de cacau podem ser usadas para plantar cacau, cozinhar biscoitos e fabricar corante marrom. +Right click on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Clique com o botão direito na lateral de um tronco de árvore da selva (Madeira da Selva) para plantar um cacau jovem. Premature Cocoa Pod=Vagem de Cacau Prematuro Cocoa pods grow on the side of jungle trees in 3 stages.=Vagens de cacau crescem ao lado de árvores de selva em 3 estágios. Medium Cocoa Pod=Vagem de Cacau Média From b476c703f103b809f8709f50601bbb62c1fc3dd3 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sat, 2 Dec 2023 10:37:42 -0300 Subject: [PATCH 289/345] mcl_lectern pt_BR translation --- mods/ITEMS/mcl_lectern/locale/mcl_lectern.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/ITEMS/mcl_lectern/locale/mcl_lectern.pt_BR.tr diff --git a/mods/ITEMS/mcl_lectern/locale/mcl_lectern.pt_BR.tr b/mods/ITEMS/mcl_lectern/locale/mcl_lectern.pt_BR.tr new file mode 100644 index 000000000..58b0e693d --- /dev/null +++ b/mods/ITEMS/mcl_lectern/locale/mcl_lectern.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_lectern +Lectern=Atril +Lecterns not only look good, but are job site blocks for Librarians.=Atris não apenas são bonitos, mas são a estação de trabalho dos Bibliotecários. +Place the Lectern on a solid node for best results. May attract villagers, so it's best to place outside of where you call 'home'.=Posicione o atril em um bloco sólido para melhores resultados. Talvez atraia aldeões, então é melhor posicioná-lo do lado de fora do que você chama de 'lar'. From 2d5b57c60df737d40f4bbc581eb7b910f3cbb573 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sat, 2 Dec 2023 10:42:25 -0300 Subject: [PATCH 290/345] mcl_experience pt_BR translation --- mods/HUD/mcl_experience/locale/mcl_experience.pt_BR.tr | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 mods/HUD/mcl_experience/locale/mcl_experience.pt_BR.tr diff --git a/mods/HUD/mcl_experience/locale/mcl_experience.pt_BR.tr b/mods/HUD/mcl_experience/locale/mcl_experience.pt_BR.tr new file mode 100644 index 000000000..0a7cef5dd --- /dev/null +++ b/mods/HUD/mcl_experience/locale/mcl_experience.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_experience +[[] ]=[[] ] +Gives a player some XP=Dá algum XP a um jogador +Error: Too many parameters!=Erro: Muitos parâmetros +Error: Incorrect value of XP=Erro: Valor incorreto de XP +Error: Player not found=Erro: Jogador não encontrado +Added @1 XP to @2, total: @3, experience level: @4=Adicionado @1 XP para @2, total: @3, nível de experiência: @4 +Bottle o' Enchanting=Frasco de Experiência From 00bf5f0331b70ac5cd62d8bfeb0ff997cfdc723d Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sat, 2 Dec 2023 10:49:53 -0300 Subject: [PATCH 291/345] mcl_smoker pt_BR translation --- mods/ITEMS/mcl_smoker/locale/mcl_smoker.pt_BR.tr | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 mods/ITEMS/mcl_smoker/locale/mcl_smoker.pt_BR.tr diff --git a/mods/ITEMS/mcl_smoker/locale/mcl_smoker.pt_BR.tr b/mods/ITEMS/mcl_smoker/locale/mcl_smoker.pt_BR.tr new file mode 100644 index 000000000..4820d01bf --- /dev/null +++ b/mods/ITEMS/mcl_smoker/locale/mcl_smoker.pt_BR.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_smoker +Inventory=Inventário +Smoker=Defumador +Cooks food faster than furnace=Cozinha comida mais rápido que a fornalha +Use the smoker to open the furnace menu.=Use o defumador para abrir o menu de fornalha. +Place a furnace fuel in the lower slot and the source material in the upper slot.=Posicione um combustível de fornalha no slot mais abaixo e o material fonte no slot mais acima. +The smoker will slowly use its fuel to smelt the item.=O defumador usará seu combustível lentamente para cozinhar o item. +The result will be placed into the output slot at the right side.=O resultado será posicionado no slot de saída no lado direito. +Use the recipe book to see what foods you can smelt, what you can use as fuel and how long it will burn.=Use o livro de receitas para ver quais comidas você pode cozinhar, quais combustíveis você pode usar e por quanto tempo irá queimar. +Smokers cook several items, mainly raw foods, into cooked foods, but twice as fast as a normal furnace.=Defumadores cozinham muitos itens, principalmente comidas cruas, em comida cozida, mas duas vezes mais rápido que uma fornalha normal. +Burning Smoker=Defumador Ativo From 2a8da574f02c2b3574c6142de16fdacd9ae42cfe Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sat, 2 Dec 2023 23:18:34 -0300 Subject: [PATCH 292/345] mcl_ocean pt_BR translation --- .../ITEMS/mcl_ocean/locale/mcl_ocean.pt_BR.tr | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 mods/ITEMS/mcl_ocean/locale/mcl_ocean.pt_BR.tr diff --git a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.pt_BR.tr b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.pt_BR.tr new file mode 100644 index 000000000..2e522e1b5 --- /dev/null +++ b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.pt_BR.tr @@ -0,0 +1,60 @@ +# textdomain: mcl_ocean +Sea Lantern=Lanterna do Mar +Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Lanternas do mar são fontes de luz decorativas as quais ficam bonitas em baixo d'água mas podem ser posicionadas em qualquer lugar. +Prismarine=Prismarinho +Prismarine is used as a building block. It slowly changes its color.=Prismarinho é usado como um bloco de costrução. Muda de cor lentamente. +Prismarine Bricks=Tijolos de Prismarinho +Dark Prismarine=Prismarinho Escuro +Prismarine Crystals=Cristais de Prismarinho +Prismarine Shard=Fragmentos de Prismarinho +Dried Kelp=Alga Seca +Dried Kelp Block=Bloco de Alga Seca +Brain Coral Block=Bloco de Coral-de-Cérebro +Brain Coral Fan=Gorgônia-de-Cérebro +Brain Coral=Coral-de-Cérebro +Bubble Coral Block=Bloco de Coral-de-Bolha +Bubble Coral Fan=Gorgônia-de-Bolha +Bubble Coral=Coral-de-Bolha +Fire Coral Block=Bloco de Coral-de-Fogo +Fire Coral Fan=Gorgônia-de-Fogo +Fire Coral=Coral-de-Fogo +Horn Coral Block=Bloco de Coral-de-Chifre +Horn Coral Fan=Gorgônia-de-Chifre +Horn Coral=Coral-de-Chifre +Tube Coral Block=Bloco de Coral-de-Tubo +Tube Coral Fan=Gorgônia-de-Tubo +Tube Coral=Coral-de-Tubo +Dead Brain Coral Block=Bloco de Coral-de-Cérebro Morto +Dead Brain Coral Fan=Gorgônia-de-Cérebro Morta +Dead Brain Coral=Coral-de-Cérebro Morto +Dead Bubble Coral Block=Bloco de Coral-de-Bolha Morto +Dead Bubble Coral Fan=Gorgônia-de-Bolha Morta +Dead Bubble Coral=Coral-de-Bolha Morto +Dead Fire Coral Block=Bloco de Coral-de-Fogo Morto +Dead Fire Coral Fan=Gorgônia-de-Fogo Morta +Dead Fire Coral=Coral-de-Fogo Morto +Dead Horn Coral Block=Bloco de Coral-de-Chifre Morto +Dead Horn Coral Fan=Gorgônia-de-Chifre Morta +Dead Horn Coral=Coral-de-Chifre Morto +Dead Tube Coral Block=Bloco de Coral-de-Tubo Morto +Dead Tube Coral Fan=Gorgônia-de-Tubo Morta +Dead Tube Coral=Coral-de-Tubo Morto +Seagrass=Grama Marinha +Kelp=Alga +Kelp grows inside water on top of dirt, sand or gravel.=Alga cresce dentro da água sobre terra, areia ou cascalho. +Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.=Blocos de corais vivem em oceanos e precisam de uma fonte de água próxima para sobreviver. Sem água, eles morrem. +Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Corais crescem sobre blocos de corais e precisam estar dentro de uma fonte de água para sobreviver. Sem água, eles morrem, assim como o bloco de coral abaixo. +Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Gorgônias crescem sobre blocos de corais e precisam estar dentro de uma fonte de água para sobreviver. Sem água, elas morrem, assim como o bloco de coral abaixo. +Seagrass grows inside water on top of dirt, sand or gravel.=Grama marinha cresce dento da água sobre terra, areia ou cascalho. +A decorative block that serves as a great furnace fuel.=Um bloco decorativo que serve como uma ótimo combustível de fornalha. +Dried kelp is a food item.=Alga seca é um item de comida. +Grows on coral block of same species=Cresce em blocos de corais da mesma espécie +Needs water to live=Precisa de água para viver +Grows in water on dirt, sand, gravel=Cresce na água sobre a terra, areia, cascalho +Glows in the water=Brilha na água +4 possible sizes=4 tamanhos possíveis +Grows on dead brain coral block=Cresce no bloco de coral-de-cérebro morto +Sea Pickle=Pepino-do-Mar +Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.=Pepino-do-mar cresce em blocos de coral-de-cérebro mortos e fornecem luz quando estão em baixo d'água. Eles vêm em 4 tamanhos que variam em luminosidade. +It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.=Podem ser posicionados apenas sobre blocos de coral-de-cérebro mortos. Posicionar um pepino-do-mar em outro pepino-do-mar o fará crescer e brilhar. + From 3047568ed497f54579d0243947ec85316f186211 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sat, 2 Dec 2023 23:47:22 -0300 Subject: [PATCH 293/345] mcl_maps pt_BR translation --- mods/ITEMS/mcl_maps/locale/mcl_maps.pt_BR.tr | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 mods/ITEMS/mcl_maps/locale/mcl_maps.pt_BR.tr diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.pt_BR.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.pt_BR.tr new file mode 100644 index 000000000..a28d211b0 --- /dev/null +++ b/mods/ITEMS/mcl_maps/locale/mcl_maps.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_maps +Empty Map=Mapa Vazio +Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Mapas vazios não são úteis como mapas, mas eles podem ser empilhados e transfomados em mapas aos quais podem ser usados. +Rightclick to create a filled map (which can't be stacked anymore).=Clique com o botão direito para criar um mapa preenchido (ao qual não pode mais ser empilhado). +Map=Mapa +Shows a map image.=Mostra uma imagem do mapa. +When created, the map saves the nearby area as an image that can be viewed any time by holding the map.=Quando criado, o mapa salva a área próxima como uma imagem que pode ser visualizada sempre que você segurar o mapa. +Hold the map in your hand. This will display a map on your screen.=Segure o mapa em suas mãos. Isso mostrará um mapa em sua tela. From 9a8a6764d1df1849823039b671df97e574d7fcd8 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sun, 3 Dec 2023 20:55:16 -0300 Subject: [PATCH 294/345] mcl_doors and mcl_fences pt_BR translation fixes --- mods/ITEMS/mcl_doors/locale/mcl_doors.pt_BR.tr | 2 +- mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.pt_BR.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.pt_BR.tr index 321c99e33..fe6245f56 100644 --- a/mods/ITEMS/mcl_doors/locale/mcl_doors.pt_BR.tr +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.pt_BR.tr @@ -20,5 +20,5 @@ Wooden trapdoors are horizontal barriers whch can be opened and closed by hand o To open or close the trapdoor, rightclick it or send a redstone signal to it.=Para abrir ou fechar um alçapão, aperte com o botão direito nela ou acione-o com um sinal de redstone. Iron Trapdoor=Alçapão de Ferro Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Alçapões de ferro são barreiras horizontais que podem ser abertas ou fechadas por sinais de redstone, mas não manualmente. Eles ocupam a parte inferior ou superior de um bloco, dependendo de como foram colocados. Quando abertos, podem ser escaladas como escadas. -Openable by players and redstone power=Aberto por jogadores ou sinal de redstone +Openable by players and redstone power=Aberto por jogadores e sinal de redstone Openable by redstone power=Aberto por sinal de redstone diff --git a/mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr b/mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr index 7c55be53d..69349e48b 100644 --- a/mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr +++ b/mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr @@ -15,4 +15,4 @@ Dark Oak Fence Gate=Portão de Carvalho Escuro Acacia Fence=Cerca de Acácia Acacia Fence Gate=Portão de Acácia Nether Brick Fence=Cerca de Tijolos do Nether -Openable by players and redstone power=Abrível por jogadores e carga de redstone +Openable by players and redstone power=Aberto por jogadores e sinal de redstone From aeeb5acc2596e8daf84196465ce14f520bf49dbc Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sun, 3 Dec 2023 20:56:09 -0300 Subject: [PATCH 295/345] mcl_armor pt_BR translation correction --- mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr b/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr index 6ce4997db..7c11b26c1 100644 --- a/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr +++ b/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr @@ -48,4 +48,4 @@ Reflects some of the damage taken when hit, at the cost of reducing durability w Aqua Affinity=Afinidade Aqua #Translations for armor trims -Smithing Template '@1'=Molde de Ferraria +Smithing Template '@1'=Molde de Ferraria '@1' From 04b77db7fa1486891077fcd3712a3eac809e5271 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sun, 3 Dec 2023 21:01:02 -0300 Subject: [PATCH 296/345] mcl_books and mcl_bows pt_BR translation fixes --- mods/ITEMS/mcl_books/locale/mcl_books.pt_BR.tr | 2 +- mods/ITEMS/mcl_bows/locale/mcl_bows.pt_BR.tr | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.pt_BR.tr b/mods/ITEMS/mcl_books/locale/mcl_books.pt_BR.tr index fbbb543fd..ed84cf067 100644 --- a/mods/ITEMS/mcl_books/locale/mcl_books.pt_BR.tr +++ b/mods/ITEMS/mcl_books/locale/mcl_books.pt_BR.tr @@ -2,7 +2,7 @@ Book=Livro Books are used to make bookshelves and book and quills.=Livros são utilizados para fazer prateleiras de livros e livro e pena. “@1”= -Copy of “@1”=Copia de "@1" +Copy of “@1”=Cópia de "@1" Copy of Copy of “@1”=Cópia da Cópia de "@1" Tattered Book=Livro Esfarrapado by @1=por @1 diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.pt_BR.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.pt_BR.tr index 66044f8a0..ebb9e407c 100644 --- a/mods/ITEMS/mcl_bows/locale/mcl_bows.pt_BR.tr +++ b/mods/ITEMS/mcl_bows/locale/mcl_bows.pt_BR.tr @@ -9,7 +9,7 @@ Bows are ranged weapons to shoot arrows at your foes.=Arcos são armas de longo The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=A velocidade e o dano da flecha aumenta quanto mais você puxar o arco. O dano regular de uma flecha varia entre 1 e 9. Quando puxado no máximo, há também uma chance de 20% de causar acerto crítico, efetuando 10 de dano. To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Para usar o arco, você primeiro precisa possuir pelo menos uma flecha em qualquer lugar do seu inventário (a não ser no Modo Criativo). Segure o botão direito do mouse para puxar o arco, solte-o para disparar. Bow=Arco -Ammunition=munição +Ammunition=Munição Damage from bow: 1-10=Dano provocado pelo arco: 1-10 Damage from dispenser: 3=Dano provocado pelo dispensor: 3 Launches arrows=Dispara flechas From 6bffaf56d2eccf47fb447aaad38242a4600aaf57 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sun, 3 Dec 2023 21:08:59 -0300 Subject: [PATCH 297/345] mcl_dye and mcl_smithing_table translation fixes --- mods/ITEMS/mcl_dye/locale/mcl_dye.pt_BR.tr | 30 +++++++++---------- .../locale/mcl_smithing_table.pt_BR.tr | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.pt_BR.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.pt_BR.tr index 2b6aef9f0..14ff0b091 100644 --- a/mods/ITEMS/mcl_dye/locale/mcl_dye.pt_BR.tr +++ b/mods/ITEMS/mcl_dye/locale/mcl_dye.pt_BR.tr @@ -1,26 +1,26 @@ # textdomain: mcl_dye Bone Meal=Farinha de Osso -Light Grey Dye=Tintura Cinza Claro -Grey Dye=Tintura Cinza +Light Grey Dye=Corante Cinza Claro +Grey Dye=Corante Cinza Ink Sac=Saco de Tinta -Purple Dye=Tintura Roxa +Purple Dye=Corante Roxo Lapis Lazuli=Lápis-lazuli -Light Blue Dye=Tintura Azul Claro -Cyan Dye=Tintura Ciano -Green Dye=Tintura Verde -Lime Dye=Tintura Lima -Yellow Dye=Tintura Amarela +Light Blue Dye=Corante Azul Claro +Cyan Dye=Corante Ciano +Green Dye=Corante Verde +Lime Dye=Corante Lima +Yellow Dye=Corante Amarelo Cocoa Beans=Sementes de Cacau -Orange Dye=Tintura Laranja -Red Dye=Tintura Vermelha -Magenta Dye=Tintura Magenta -Pink Dye=Tintura Rosa -This item is a dye which is used for dyeing and crafting.=Este item é uma tintura e pode ser usado para tingir ou fabricar. +Orange Dye=Corante Laranja +Red Dye=Corante Vermelho +Magenta Dye=Corante Magenta +Pink Dye=Corante Rosa +This item is a dye which is used for dyeing and crafting.=Este item é uma corante e pode ser usado para tingir ou fabricar. Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Clique com o botão direito em uma ovelha para tingir sua lã. Outras coisas são tingidas ao fabricá-las. Bone Meal=Farinha de Osso -Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=Farinha de osso é uma tintura branca e também é útil como fertilizante ao acelerar o crescimento de diversas plantas. +Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=Farinha de osso é um corante branco e também é útil como fertilizante ao acelerar o crescimento de diversas plantas. Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.=Clique com o botão direito em uma ovelha para tornar sua lã branca. Clique com o botão direito em uma planta para acelerar seu crescimento. Note que nem todas as plantas podem ser fertilizadas assim. Quando você clica com o botão direito em um bloco de grama, grama alta e flores crescerão ao redor. -Cocoa beans are a brown dye and can be used to plant cocoas.=Sementes de cacau são um pigmento marrom e podem ser usadas para plantar cacau. +Cocoa beans are a brown dye and can be used to plant cocoas.=Sementes de cacau são um corante marrom e podem ser usadas para plantar cacau. Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Clique com o botão direito em uma ovelha para tornar sua lã marrom. Clique com o botão direito na lateral de um tronco de árvore da selva para plantar um cacau jovem. Cocoa Beans=Sementes de Cacau Grows at the side of jungle trees=Cresce na lateral de árvores da selva diff --git a/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr b/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr index 065d5faba..5c42b2488 100644 --- a/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr +++ b/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr @@ -1,4 +1,4 @@ # textdomain: mcl_smithing_table Inventory=Inventário Upgrade Gear=Atualizar Equipamento -Smithing table=Mesa de ferraria +Smithing table=Mesa de Ferraria From 1f370bf1f2d83a325fd4504f5799a9a0e946b3b9 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Mon, 4 Dec 2023 21:00:47 -0300 Subject: [PATCH 298/345] hudbars pt_BR translation --- mods/HUD/hudbars/locale/hudbars.pt_BR.tr | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 mods/HUD/hudbars/locale/hudbars.pt_BR.tr diff --git a/mods/HUD/hudbars/locale/hudbars.pt_BR.tr b/mods/HUD/hudbars/locale/hudbars.pt_BR.tr new file mode 100644 index 000000000..566906452 --- /dev/null +++ b/mods/HUD/hudbars/locale/hudbars.pt_BR.tr @@ -0,0 +1,6 @@ +# textdomain: hudbars +Health=Saúde +Breath=Respiração + +# Default format string for progress bar-style HUD bars, e.g. “Health 5/20” +@1: @2/@3=@1: @2/@3 From 8c0d9cc450197c18e1003511073b133cb33e4e39 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Mon, 4 Dec 2023 21:03:52 -0300 Subject: [PATCH 299/345] mcl_info pt_BR translation --- mods/HUD/mcl_info/locale/mcl_info.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/HUD/mcl_info/locale/mcl_info.pt_BR.tr diff --git a/mods/HUD/mcl_info/locale/mcl_info.pt_BR.tr b/mods/HUD/mcl_info/locale/mcl_info.pt_BR.tr new file mode 100644 index 000000000..89ea171e0 --- /dev/null +++ b/mods/HUD/mcl_info/locale/mcl_info.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_info +Set debug bit mask: 0 @= disable, 1 @= biome name, 2 @= coordinates, 3 @= all=Defina a máscara de bits de debug: 0 @= desabilitado, 1 @= nome do bioma, 2 @= coordenadas, 3 @= todos +Error! Possible values are integer numbers from @1 to @2=Erro! Valores possíveis são números inteiros de @1 até @2 +Debug bit mask set to @1=Máscara de bits de debug definida como @1 From 6c4101dc125947df4c135851c969d31f0c6fa39c Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Mon, 4 Dec 2023 21:48:07 -0300 Subject: [PATCH 300/345] mcl_hoppers pt_BR translation --- .../mcl_hoppers/locale/mcl_hoppers.pt_BR.tr | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.pt_BR.tr diff --git a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.pt_BR.tr b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.pt_BR.tr new file mode 100644 index 000000000..3ed5bcfad --- /dev/null +++ b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.pt_BR.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_hoppers +Hopper=Funil +Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempt to put its items it into an adjacent container. Hoppers can go either downwards or sideways. Hoppers interact with chests, droppers, dispensers, shulker boxes, furnaces and hoppers.=Funis são recipientes com 5 slots de inventário. Eles coletam itens largados acima, pegam itens de um recipiente acima e tentam colocar seus itens em um recipiente adjacente. Funis podem ir tanto para baixo quanto para os lados. Funis interagem com baús, liberadores, ejetores, caixas shulker, fornalhas e funis. +Hoppers interact with containers the following way:=Funis interagem com recipientes da seguinte maneira: +• Furnaces: Hoppers from above will put items into the source slot. Hoppers from below take items from the output slot. They also take items from the fuel slot when they can't be used as a fuel. Sideway hoppers that point to the furnace put items into the fuel slot=• Fornalhas: Funis acima irão colocar itens no slot da fonte. Funis abaixo pegam itens do slot de saída. Eles também pegam itens do slot de combustível quando estes não podem ser usados como combustível. Funis laterais que apontem para a fornalha colocam itens no slot de combustível. +• Ender chests: No interaction.=• Baús do ender: Sem interações. +• Other containers: Normal interaction.=• Outros recipientes: Interação normal. +Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.= Funis pode ser desativados quando alimentados com carga de redstone. Funis desativados não movem itens. +To place a hopper vertically, place it on the floor or a ceiling. To place it sideways, place it at the side of a block. Use the hopper to access its inventory.=Para posicionar um funil verticalmente, posicione-o no chão ou no teto. Para posiciona-lo lateralmente, posicione-o na lateral de um bloco. Use o funil para acessar seu inventário. +Disabled Hopper=Funil Desativado +Side Hopper=Funil Lateral +Disabled Side Hopper=Funil Lateral Desativado +Inventory=Inventário +5 inventory slots=5 slots de inventário +Collects items from above, moves items to container below=Coleta itens vindos de cima, move itens para recipientes abaixo. +Can be disabled with redstone power=Pode ser desativado com carga de redstone From f8ef5a15c5723b8c54d5048814e7ce215cc86937 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Mon, 4 Dec 2023 23:13:25 -0300 Subject: [PATCH 301/345] mcl_death_messages pt_BR translation --- .../locale/mcl_death_messages.pt_BR.tr | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 mods/HUD/mcl_death_messages/locale/mcl_death_messages.pt_BR.tr diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.pt_BR.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.pt_BR.tr new file mode 100644 index 000000000..f1f64fa5c --- /dev/null +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.pt_BR.tr @@ -0,0 +1,55 @@ +# textdomain: mcl_death_messages +@1 went up in flames=@1 pegou fogo +@1 walked into fire whilst fighting @2=@1 caminhou no fogo enquanto lutava contra @2 +@1 was struck by lightning=@1 foi atingido(a) por um raio +@1 was struck by lightning whilst fighting @2=@1 foi atingido(a) por um raio enquanto lutava contra @2 +@1 burned to death=@1 queimou até a morte +@1 was burnt to a crisp whilst fighting @2=@1 foi queimado até a crocância enquanto lutava contra @2 +@1 tried to swim in lava=@1 tentou nadar em lava +@1 tried to swim in lava to escape @2=@1 tentou nadar em lava para escapar de @2 +@1 discovered the floor was lava=@1 descobriu que o chão era lava +@1 walked into danger zone due to @2=@1 caminhou numa zona perigosa por conta de @2 +@1 suffocated in a wall=@1 sufocou em uma parede +@1 suffocated in a wall whilst fighting @2=@1 sufocou em uma parede enquanto lutava contra @2 +@1 drowned=@1 se afogou +@1 drowned whilst trying to escape @2=@1 se afogou enquanto tentava escapar de @2 +@1 starved to death=@1 morreu de fome +@1 starved to death whilst fighting @2=@1 morreu de fome enquanto lutava contra @2 +@1 was pricked to death=@1 foi espetado até a morte +@1 walked into a cactus whilst trying to escape @2=@1 caminhou até um cacto enquanto tentava escapar de @2 +@1 hit the ground too hard=@1 bateu muito forte no chão +@1 hit the ground too hard whilst trying to escape @2=@1 bateu muito forte no chão enquanto tentava escapar de @2 +@1 experienced kinetic energy=@1 experienciou a energia cinética +@1 experienced kinetic energy whilst trying to escape @2=@1 experienciou a energia cinética enquanto tentava escapar de @2 +@1 fell out of the world=@1 caiu do mundo +@1 didn't want to live in the same world as @2=@1 não queria viver no mesmo mundo que @2 +@1 died=@1 morreu +@1 died because of @2=@1 morreu por conta de @2 +@1 was killed by magic=@1 foi morto(a) por magia +@1 was killed by magic whilst trying to escape @2=@1 foi morto(a) por magia enquanto tentava escapar de @2 +@1 was killed by @2 using magic=@1 foi morto(a) por @2 usando magia +@1 was killed by @2 using @3=@1 foi morto(a) por @2 usando @3 +@1 was roasted in dragon breath=@1 foi assado(a) no bafo do dragão +@1 was roasted in dragon breath by @2=@1 foi assado(a) no bafo do dragão por @2 +@1 withered away=@1 apodreceu +@1 withered away whilst fighting @2=@1 apodreceu enquanto lutava contra @2 +@1 was shot by a skull from @2=@1 foi acertado(a) por um crânio vindo de @2 +@1 was squashed by a falling anvil=@1 foi esmagado(a) por uma bigorna em queda +@1 was squashed by a falling anvil whilst fighting @2=@1 foi esmagado(a) por uma bigorna enquanto lutava contra @2 +@1 was squashed by a falling block=@1 foi esmagado(a) por um bloco em queda +@1 was squashed by a falling block whilst fighting @2=@1 foi esmagado(a) por um bloco em queda enquanto lutava contra @2 +@1 was slain by @2=@1 foi assassinado por @2 +@1 was slain by @2 using @3=@1 foi assassinado por @2 usando @3 +@1 was shot by @2=@1 foi acertado(a) por @2 +@1 was shot by @2 using @3=@1 foi acertado(a) por @2 usando @3 +@1 was fireballed by @2=@1 foi atingido(a) por uma bola de fogo de @2 +@1 was fireballed by @2 using @3=@1 foi atingido(a) por uma bola de fogo de @2 usando @3 +@1 was killed trying to hurt @2=@1 foi morto(a) tentando machucar @2 +@1 tried to hurt @2 and died by @3=@1 tentou machucar @2 e morreu por conta de @3 +@1 blew up=@1 explodiu +@1 was blown up by @2=@1 foi explodido por @2 +@1 was blown up by @2 using @3=@1 foi explodido por @2 usando @3 +@1 was squished too much=@1 foi esmagado(a) demais +@1 was squashed by @2=@1 foi esmagado(a) por @2 +@1 went off with a bang=@1 saiu com um estrondo +@1 went off with a bang due to a firework fired by @2 from @3=@1 saiu com um estrondo por conta de um fogo de artifício disparado por @2 vindo de @3 From a2b754945666c96ff474f3ddf8866ebe67f13698 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Tue, 5 Dec 2023 21:24:32 -0300 Subject: [PATCH 302/345] mcl_mangrove pt_BR translation --- .../mcl_mangrove/locale/mcl_mangrove.pt_BR.tr | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.pt_BR.tr diff --git a/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.pt_BR.tr b/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.pt_BR.tr new file mode 100644 index 000000000..fc26a7531 --- /dev/null +++ b/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.pt_BR.tr @@ -0,0 +1,36 @@ +# textdomain: mcl_mangrove +Mangrove Wood=Madeira de Mangue +The trunk of a Mangrove tree.=O tronco de uma árvore de mangue. +Mangrove Bark=Casca de Mangue +The bark of a Mangrove tree.=A casca de uma árvore de mangue. +Mangrove Wood Planks=Tábuas de Mangue +Mangrove Leaves=Folhas de Mangue +Mangrove leaves are grown from mangrove trees.=Folhas de mangue crescem em árvores de mangue. +Stripped Mangrove Log=Tronco de Mangue Descascado +The stripped wood of a Mangrove tree=A madeira descascada de uma árvore de mangue. +Stripped Mangrove Wood=Madeira de Mangue Descascada +The stripped bark of a Mangrove tree=A casca descascada de uma árvore de mangue. +Mangrove Roots=Raízes de Mangue +Mangrove roots are decorative blocks that form as part of mangrove trees.=Raízes de mangue são blocos decorativos que se formam como parte das árvores de mangue. +Mangrove Propagule=Propágulo de Mangue +Needs soil and light to grow=Precisa de solo e luz para crescer +When placed on soil (such as dirt) and exposed to light, an propagule will grow into an mangrove after some time.=Quando posicionado em solo (como em terra) e exposto à luz, um propágulo irá crescer uma árvore de mangue depois de algum tempo. +Hanging Propagule=Propágulo Pendurado +Grows on Mangrove leaves=Cresce em folhas de mangue +water logged mangrove roots=Raízes de Mangue Alagadas +Mangrove roots, despite being a full block, can be waterlogged and do not flow water out=Raízes de mangue, mesmo sendo um bloco inteiro, podem ser alagadas e não escorre água delas. +These cannot be crafted yet only occure when get in contact of water.=Essas não podem ser fabricadas ainda ocorrendo apenas quando tem contato com a água. +Muddy Mangrove Roots=Raízes Barrentas de Mangue +crafted with Mud and Mangrove roots=Fabricadas com barro e raízes de mangue +Muddy Mangrove Roots is a block from mangrove swamp.It drowns player a bit inside it.=Raízes barrentas de mangue é um bloco dos pântanos de mangue. Afunda o jogador um pouco para dentro de si. +Mangrove Door=Porta de Mangue +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Portas de madeira são barreiras de 2 blocos de altura as quais podem ser abertas ou fechadas pela mão e por um sinal de redstone. +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Para abrir ou fechar uma porta de madeira, clique com o botão direito nela ou alimente-a em sua metade inferior com um sinal de redstone. +Mangrove Trapdoor=Alçapão de Mangue +Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Alçapões de madeira são barreiras horizontais as quais podem ser abertas ou fechadas com a mão ou um sinal de redstone. Eles ocupam a parte superior ou inferior de um bloco, dependendo de como eles foram posicionados. Quando abertos, eles podem ser escalados como uma escada. +To open or close the trapdoor, rightclick it or send a redstone signal to it.=Para abrir e fechar o alçapão, clique com o botão direito nele ou envie um sinal de redstone para ele. +Mangrove Wood Fence=Cerca de Mangue +Mangrove Wood Fence Gate=Portão de Mangue +Mangrove Wood Stairs=Escadas de Mangue +Mangrove Wood Slab=Laje de Mangue +Double Mangrove Wood Slab=Laje Dupla de Mangue From ad099ed7c21564bd39e14d058ea52a0155ab50bc Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Wed, 6 Dec 2023 12:29:21 -0300 Subject: [PATCH 303/345] mcl_grindstone pt_BR translation --- .../mcl_grindstone/locale/mcl_grindstone.pt_BR.tr | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 mods/ITEMS/mcl_grindstone/locale/mcl_grindstone.pt_BR.tr diff --git a/mods/ITEMS/mcl_grindstone/locale/mcl_grindstone.pt_BR.tr b/mods/ITEMS/mcl_grindstone/locale/mcl_grindstone.pt_BR.tr new file mode 100644 index 000000000..03a5ca41e --- /dev/null +++ b/mods/ITEMS/mcl_grindstone/locale/mcl_grindstone.pt_BR.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_grindstone +Inventory=Inventário +Repair & Disenchant=Reparar & Desencantar +Grindstone=Rebolo +Used to disenchant/fix tools=Usado para desencantar/consertar ferramentas +Grindstone disenchants tools and armour except for curses, and repairs two items of the same type it is also the weapon smith's work station.=Rebolos desencantam ferramentas e armaduras exceto as maldições, e consertam dois itens do mesmo tipo e ainda é a estação de trabalho do armeiro. +To use the grindstone, rightclick it, Two input slots (on the left) and a single output slot.=Para usar o rebolo, clique com o botão direito nele. +To disenchant an item place enchanted item in one of the input slots and take the disenchanted item from the output.=Para desencantar um item posicione o item encantado em um dos slots de entrada e pegue o item desencantado na saída. +To repair a tool you need a tool of the same type and material, put both items in the input slot and the output slot will combine two items durabilities with 5% bonus.=Para consertar uma ferramenta você precisará de uma ferramenta do mesmo tipo e material, ponha ambos os itens nos slots de entrada e o slot de saída irá combinar a durabilidade dos dois itens com um bônus de 5%. +If both items have enchantments the player will get xp from both items from the disenchant.=Se ambos itens possuem encantamentos o jogador receberá XP de ambos os itens no desencanto. +Curses cannot be removed and will be transfered to the new repaired item, if both items have a different curse the curses will be combined.=Maldições não podem ser removidas e serão transferidas para o novo item reparado, se ambos os itens tiverem maldições diferentes, as maldições serão combinadas. From bef3253d5c173b5615721ea7f439486454d9095c Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Wed, 6 Dec 2023 13:05:56 -0300 Subject: [PATCH 304/345] mcl_enchanting pt_BR translation --- .../locale/mcl_enchanting.pt_BR.tr | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.pt_BR.tr diff --git a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.pt_BR.tr b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.pt_BR.tr new file mode 100644 index 000000000..f17678f3f --- /dev/null +++ b/mods/ITEMS/mcl_enchanting/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. From d0697c70ccc5d9ad122cabf3bebcb62ce6783be0 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Wed, 6 Dec 2023 13:15:50 -0300 Subject: [PATCH 305/345] mcl_fire pt_BR translation --- mods/ITEMS/mcl_fire/locale/mcl_fire.pt_BR.tr | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 mods/ITEMS/mcl_fire/locale/mcl_fire.pt_BR.tr diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.pt_BR.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.pt_BR.tr new file mode 100644 index 000000000..f14b142a1 --- /dev/null +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.pt_BR.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_fire +Fire Charge=Bola de Fogo +Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.=Bolas de fogo são primariamente Projéteis aos quais podem ser lançados por ejetores, eles voarão em linha reta e explodirão em chamas no impacto. Alternativamente, elas podem ser usadas para acender fogos diretamente. +Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.=Ponha a bola de fogo em um ejetor e forneça-o uma carga de redstone para lança-la. Para acender um fogo diretamente, simplesmente posicione a bola de fogo no chão, o que a consumirá. +Flint and Steel=Isqueiro +Flint and steel is a tool to start fires and ignite blocks.=Isqueiro é uma ferramenta que põe fogo e acende blocos. +Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.=Clique com o botão direito na superfície de um bloco para tentar acender um fogo em frente ou acender um bloco. Poucos blocos têm uma reação única quando acesos. +Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Fogo é um tipo de bloco danoso e destrutivo de vida curta. Destruirá e se espalhará para blocos inflamáveis próximos, mas o fogo vai desaparecer quando não restar mais nada para queimar. Será extinguido por água próxima ou pela chuva. O fogo pode ser destruído em segurança socando-o, mas é doloroso se você ficar em pé diretamente nele. Se um fogo for iniciado sobre netherrack ou bloco de magma, será transformado imediatamente em fogo eterno. +Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Fogo é um tipo de bloco danoso mas não destrutivo de vida curta. Irá desaparecer quando não houver mais blocos inflamáveis por perto. O fogo não destrói blocos, pelo menos não nesse mundo. Será extinguido por água próxima ou chuva. O fogo pode ser destruído em segurança socando-o, mas é doloroso se você ficar em pé diretamente nele. Se um fogo for iniciado sobre netherrack ou bloco de magma, será transformado imediatamente em fogo eterno. +Eternal fire is a damaging block that might create more fire. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Fogo eterno é um bloco danoso que pode criar mais fogo. Irá criar fogo em volta quando blocos inflamáveis estão por perto. O fogo eterno pode ser extinguido por socos ou blocos de água próximos. Diferente do fogo (normal), o fogo eterno não se extingue sozinho e também continua queimando sob chuvas. Socar o fogo eterno é seguro, mas machuca se você ficar em pé dentro. +Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Fogo eterno é um bloco danoso. O fogo eterno pode ser extinguido por socos ou blocos de água próximos. Diferente do fogo (normal), o fogo eterno não se extingue sozinho e também continua queimando sob chuvas. Socar o fogo eterno é seguro, mas machuca se você ficar em pé dentro. +@1 has been cooked crisp.=@1 foi cozido crocante. +@1 felt the burn.=@1 sentiu a queimadura. +@1 died in the flames.=@1 morreu em chamas. +@1 died in a fire.=@1 morreu em um fogo. +Fire=Fogo +Eternal Fire=Fogo Eterno +Dispenser projectile=Projétil do Ejetor +Starts fires and ignites blocks=Põe fogo e acende blocos From c1e3c698006f26d113b529cfa1f9d1fcae5e6970 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Wed, 6 Dec 2023 13:29:38 -0300 Subject: [PATCH 306/345] mcl_monster_eggs pt_BR translation --- .../mcl_monster_eggs/locale/mcl_monster_eggs.pt_BR.tr | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.pt_BR.tr diff --git a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.pt_BR.tr b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.pt_BR.tr new file mode 100644 index 000000000..ae5e247b1 --- /dev/null +++ b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.pt_BR.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_monster_eggs +An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Um bloco infestado é um bloco ao qual uma traça irá sair quando quebrá-lo. Parece idêntico a sua contraparte normal. +Infested Stone=Pedra Infestada +Infested Cobblestone=Pedregulho Infestado +Infested Stone Bricks=Tijolos de Pedra Infestados +Infested Cracked Stone Bricks=Tijolos de Pedra Rachados Infestados +Infested Mossy Stone Bricks=Tijolos de Pedra Musgosos Infestados +Infested Chiseled Stone Bricks=Tijolos de Pedra Talhados Infestados +Hides a silverfish=Escondem uma traça From f904512e61a0966ce40ef19b639fc2bdfc32cce7 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 7 Dec 2023 21:08:28 -0300 Subject: [PATCH 307/345] mcl_comparators pt_BR translation --- .../mcl_comparators/locale/mcl_comparators.pt_BR.tr | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.pt_BR.tr b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.pt_BR.tr new file mode 100644 index 000000000..2139b73b1 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.pt_BR.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_comparators +Redstone comparators are multi-purpose redstone components.=Comparadores de redstone são componentes de redstone multi propósito. +They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.=Eles podem transmitir um sinal de redstone, detectar se um bloco contém alguns itens e compara multíplos sinais. +A redstone comparator has 1 main input, 2 side inputs and 1 output. The output is in arrow direction, the main input is in the opposite direction. The other 2 sides are the side inputs.=Um comparador de redstone tem 1 entrada principal, 2 entradas laterais e 1 saída. A saída é na direção da seta, a entrada principal é na direção oposta. Os outros 2 lados são as entradas laterais. +The main input can powered in 2 ways: First, it can be powered directly by redstone power like any other component. Second, it is powered if, and only if a container (like a chest) is placed in front of it and the container contains at least one item.=A entrada principal pode ser energizada de 2 maneiras: Primeiro, ela pode ser energizada diretamente por carga de redstone como qualquer outro componente. Segundo, é energizada se, e somente se um recipiente (como um baú) é posicionado em frente dele e o recipiente conter pelo menos um item. +The side inputs are only powered by normal redstone power. The redstone comparator can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by using the block.=As entradas laterais são energizadas apenas por cargas normais de redstone. O comparador de redstone pode operar em dois modos: Modo de transmissão e modo de subtração. Iniciará em modo de transmissão e o modo pode ser alterado usando o bloco. +Transmission mode:@nThe front torch is unlit and lowered. The output is powered if, and only if the main input is powered. The two side inputs are ignored.=Modo de transmissão:@nA tocha frontal é apagada e baixada. A saída é energizada se, e somente se a entrada principal é energizada. As entradas laterais são ignoradas. +Subtraction mode:@nThe front torch is lit. The output is powered if, and only if the main input is powered and none of the side inputs is powered.=Modo de subtração:@nA tocha frontal é acesa. A saída é energizada se, e somente se a entrada principal é energizada e nenhuma das entradas laterais estiverem energizadas. +Redstone Comparator=Comparador de Redstone +Redstone Comparator (Subtract)=Comparador de Redstone (Subtração) +Redstone Comparator (Powered)=Comparador de Redstone (Energizado) +Redstone Comparator (Subtract, Powered)=Comparador de Redstone (Subtração, Energizado) From a5370bc63d9851925b4d2281c2e7366718d21235 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 7 Dec 2023 21:13:21 -0300 Subject: [PATCH 308/345] mcl_target pt_BR translation --- mods/ITEMS/REDSTONE/mcl_target/locale/mcl_target.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mcl_target/locale/mcl_target.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mcl_target/locale/mcl_target.pt_BR.tr b/mods/ITEMS/REDSTONE/mcl_target/locale/mcl_target.pt_BR.tr new file mode 100644 index 000000000..877e89c82 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_target/locale/mcl_target.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_target +Target=Alvo +A target is a block that provides a temporary redstone charge when hit by a projectile.=Um alvo é um bloco que fornece uma carga temporária de redstone quando atingido por um projétil. +Throw a projectile on the target to activate it.=Arremesse um projétil no alvo para ativá-lo. From e28207f44e7e4e900f9def7c3552f04c6717508f Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 7 Dec 2023 21:30:42 -0300 Subject: [PATCH 309/345] mesecons_walllever pt_BR translation --- .../mesecons_walllever/locale/mesecons_walllever.pt_BR.tr | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.pt_BR.tr b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.pt_BR.tr new file mode 100644 index 000000000..e2f6b7d45 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: mesecons_walllever +Lever=Alavanca +A lever is a redstone component which can be flipped on and off. It supplies redstone power to adjacent blocks while it is in the “on” state.=Uma alavanca é um componente de redstone ao qual pode ser comutado em ligado ou desligado. Fornecerá carga de redstone para blocos adjacentes enquanto estiver no estado "ligado". +Use the lever to flip it on or off.=Use a alavanca para comutá-la em ligado ou desligado. +Provides redstone power while it's turned on=Fornece carga de redstone enquanto estiver ligada From 01abafe50ff87faafff4f986fe5ec73e11776f85 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 7 Dec 2023 21:46:22 -0300 Subject: [PATCH 310/345] mesecons_button pt_BR translation --- .../locale/mesecons_button.pt_BR.tr | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.pt_BR.tr b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.pt_BR.tr new file mode 100644 index 000000000..f7ec2dd59 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.pt_BR.tr @@ -0,0 +1,20 @@ +# textdomain: mesecons_button +Use the button to push it.=Use o botão para pressioná-lo. +Stone Button=Botão de Pedra +A stone button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Um botão de pedra é um componente de redstone feito de pedra ao qual pode ser pressionado para fornecer carga de redstone. Quando pressionado, irá energizar componentes de redstone adjacentes por 1 segundo. +Polished Blackstone Button=Botão de Rocha Negra Polida +A polished blackstone button is a redstone component made out of polished blackstone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Um botão de rocha negra polida é um componente de redstone feito de pedra negra polida ao qual pode ser pressionado para fornecer carga de redstone. Quando pressionado, irá energizar componentes de redstone adjacentes por 1 segundo. +Oak Button=Botão de Carvalho +Acacia Button=Botão de Acácia +Birch Button=Botão de Bétula +Dark Oak Button=Botão de Carvalho Escuro +Spruce Button=Botão de Pinheiro +Jungle Button=Botão da Selva +Mangrove Button=Botão de Mangue +Crimson Button=Botão de Hifas Carmesim +Warped Button=Botão de Hifas Distorcidas +A wooden button is a redstone component made out of wood which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1.5 seconds. Wooden buttons may also be pushed by arrows.=Um botão de madeira é um componente de redstone feito de madeira ao qual pode ser pressionado para fornecer carga de redstone. Quando pressionado, irá energizar componentes de redstone adjacentes por 1.5 segundo. Botões de madeira também podem ser pressionados por flechas. +Provides redstone power when pushed=Fornece carga de redstone quando é pressionado +Push duration: @1s=Duração de pressão: @1s +Pushable by arrow=Pressionável por flecha +A button is a redstone component which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.=Um botão é um componente de redstone ao qual pode ser pressionado para fornecer carga de redstone. Quando pressionado, irá energizar componentes de redstone adjacentes por @1 segundos. From 73bcb0026f063b56e171c103b24ca947728e284b Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 7 Dec 2023 21:53:29 -0300 Subject: [PATCH 311/345] mcl_observers pt_BR translation --- .../REDSTONE/mcl_observers/locale/mcl_observers.pt_BR.tr | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.pt_BR.tr b/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.pt_BR.tr new file mode 100644 index 000000000..18e82eb11 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_observers +Observer=Observador +An observer is a redstone component which observes the block in front of it and sends a very short redstone pulse whenever this block changes.=Um observador é um componente de redstone o qual observa o bloco a sua frente e envia um pulso de redstone muito curto sempre que esse bloco mudar. +Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow points to the side of the output, which is at the opposite side of the “face”. You can place your redstone dust or any other component here.=Posicione o observador diretamente em frente ao bloco que você deseja observar com a "face" olhando para o bloco. A seta aponta para o lado da saída, a qual está no lado oposto da "face". Você pode posicionar seu pó de redstone ou outros componentes aqui. +Emits redstone pulse when block in front changes=Emite um pulso de redstone quando um bloco muda em sua frente From 7b93c65c450934ec97e3592202f851ca559ce5e3 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 7 Dec 2023 21:59:49 -0300 Subject: [PATCH 312/345] mcl_droppers pt_BR translation --- .../REDSTONE/mcl_droppers/locale/mcl_droppers.pt_BR.tr | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.pt_BR.tr b/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.pt_BR.tr new file mode 100644 index 000000000..56917c8f2 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.pt_BR.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_droppers +Dropper=Liberador +A dropper is a redstone component and a container with 9 inventory slots which, when supplied with redstone power, drops an item or puts it into a container in front of it.=Um liberador é um componente de redstone e um recipiente com 9 slots de inventário ao qual, quando alimentado com carga de redstone, libera um item ou coloca-o em um recipiente em sua frente. +Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Use the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.=Liberadores podem ser posicionados em 6 direções possíveis, os itens serão liberados pelo buraco. Use o liberador para acessar seu inventário. Alimente-o com carga de redstone uma vez para fazer o liberador liberar ou transferir um item aleatório. +Downwards-Facing Dropper=Liberador Virado Para Baixo +Upwards-Facing Dropper=Liberador Virado Para Cima +Inventory=Inventário +9 inventory slots=Inventário de 9 slots +Drops item when powered by redstone power=Libera itens quando energizados por carga de redstone From 907e037430ad73ecf7f649488b535ad478bcf640 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 7 Dec 2023 22:14:32 -0300 Subject: [PATCH 313/345] mcl_dispensers pt_BR translation --- .../locale/mcl_dispensers.pt_BR.tr | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.pt_BR.tr b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.pt_BR.tr new file mode 100644 index 000000000..b21f401ed --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.pt_BR.tr @@ -0,0 +1,25 @@ +# textdomain: mcl_dispensers +Dispenser=Ejetor +A dispenser is a block which acts as a redstone component which, when powered with redstone power, dispenses an item. It has a container with 9 inventory slots.=Um ejetor é um bloco ao qual age como um componente de redstone ao qual, quando energizado com carga de redstone, ejeta um item. Tem um recipiente com 9 slots de inventário. +Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Use the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a random item.=Posicione o ejetor em uma das 6 direções possíveis. O "buraco" é por onde os itens irão voar para fora do ejetor. Use o ejetor para acessar seu inventário. Insira os itens que você deseja ejetar. Alimente o ejetor com carga de redstone uma vez para ejetar um item aleatório. +The dispenser will do different things, depending on the dispensed item:=O ejetor irá fazer coisas diferentes, dependendo do item ejetado: +• Arrows: Are launched=• Flechas: Serão lançadas +• Eggs and snowballs: Are thrown=• Ovos e bolas de neve: São arremessadas +• Fire charges: Are fired in a straight line=• Bolas de fogo: São atiradas em uma linha reta +• Armor: Will be equipped to players and armor stands=• Armadura: Será equipada em jogadores e suportes de armaduras +• Boats: Are placed on water or are dropped=• Barcos: São posicionados em água ou são liberados +• Minecart: Are placed on rails or are dropped=• Carrinhos: São posicionados em trilhos ou são liberados +• Bone meal: Is applied on the block it is facing=• Farinha de osso: É aplicada no bloco ao qual está encarando +• Empty buckets: Are used to collect a liquid source=• Baldes vazios: São usados para coletar uma fonte de líquido +• Filled buckets: Are used to place a liquid source=• Baldes preenchidos: São usados para posicionar uma fonte de líquido +• Heads, pumpkins: Equipped to players and armor stands, or placed as a block=• Cabeças, abóboras: São equipadas em jogadores e suportes de armaduras, ou posicionadas como um bloco +• Shulker boxes: Are placed as a block=• Caixas shulker: São posicionadas como um bloco +• TNT: Is placed and ignited=• TNT: É posicionada e acesa +• Flint and steel: Is used to ignite a fire in air and to ignite TNT=• Isqueiro: É usado para acender um fogo no ar e para acender uma TNT +• Spawn eggs: Will summon the mob they contain=• Ovos de geração: Vão invocar o mob que eles contém +• Other items: Are simply dropped=• Outros itens: São simplesmente liberados +Downwards-Facing Dispenser=Ejetor Virado Para Baixo +Upwards-Facing Dispenser=Ejetor Virado Para Cima +Inventory=Inventário +9 inventory slots=Inventário de 9 slots +Launches item when powered by redstone power=Lança itens quando energizados por carga de redstone From 85bc643442d0bd9ab77344b7cd838ce13f4497a1 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 7 Dec 2023 22:19:13 -0300 Subject: [PATCH 314/345] mesecons_lightstone pt_BR translation --- .../mesecons_lightstone/locale/mesecons_lightstone.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.pt_BR.tr b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.pt_BR.tr new file mode 100644 index 000000000..8d3c8a0fd --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_lightstone +Redstone Lamp=Lâmpada de Redstone +Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.=Lâmpadas de redstone são componentes de redstone simples ao qual brilha intensamente (nível de brilho @1) quando recebe carga de redstone. +Glows when powered by redstone power=Bliha quando energizada com carga de redstone From c20a37486e4b55e3a9ade123b751d5758d8a9d54 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 8 Dec 2023 06:25:57 -0300 Subject: [PATCH 315/345] mesecons_pressureplates pt_BR translation --- .../locale/mesecons_pressureplates.pt_BR.tr | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.pt_BR.tr b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.pt_BR.tr new file mode 100644 index 000000000..b0abc529c --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.pt_BR.tr @@ -0,0 +1,21 @@ +# textdomain: mesecons_pressureplates +A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it.=Uma placa de pressão é um componente de redstone ao qual alimenta os blocos ao seu redor com carga de redstone enquanto alguém ou alguma coisa descansa em cima dela. +Oak Pressure Plate=Placa de Pressão de Carvalho +Acacia Pressure Plate=Placa de Pressão de Acácia +Birch Pressure Plate=Placa de Pressão de Bétula +Dark Oak Pressure Plate=Placa de Pressão de Carvalho Escuro +Spruce Pressure Plate=Placa de Pressão de Pinheiro +Jungle Pressure Plate=Placa de Pressão da Selva +Mangrove Pressure Plate=Placa de Pressão de Mangue +Crimson Pressure Plate=Placa de Pressão de Hifas Carmesim +Warped Pressure Plate=Placa de Pressão de Hifas Distorcidas +A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=Uma placa de pressão de madeira é um componente de redstone ao qual alimenta os blocos ao seu redor com carga de redstone enquanto qualquer objeto móvel (incluindo itens largados, jogadores e mobs) descansarem em cima dela. +Polished Blackstone Pressure Plate=Placa de Pressão de Rocha Negra Polida +A polished blackstone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.=Uma placa de pressão de pedra negra polida é um componente de redstone ao qual alimenta os blocos ao seu redor com carga de redstone enquanto um jogador ou mob estiver em pé em cima dela. Não é acionada por outras coisas. +Stone Pressure Plate=Placa de Pressão de Pedra +A stone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.=Uma placa de pressão de pedra é um componente de redstone ao qual alimenta os blocos ao seu redor com carga de redstone enquanto um jogador ou mob estiver em pé em cima dela. Não é acionada por outras coisas. +Provides redstone power when pushed=Fornece carga de redstone quando pressionada +Pushable by players, mobs and objects=Pressionável por jogadores, mobs e objetos +Pushable by players and mobs=Pressionável por jogadores e mobs +Pushable by players=Pressionável por jogadores +Pushable by mobs=Pressionável por mobs From d59a6c6a009ef7c1de4a16471eb6caabcadd4c1e Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 8 Dec 2023 06:39:40 -0300 Subject: [PATCH 316/345] mesecons_delayer pt_BR translation --- .../locale/mesecons_delayer.pt_BR.tr | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.pt_BR.tr b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.pt_BR.tr new file mode 100644 index 000000000..75af2b8b1 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.pt_BR.tr @@ -0,0 +1,13 @@ +# textdomain: mesecons_delayer +Redstone repeaters are versatile redstone components with multiple purposes: 1. They only allow signals to travel in one direction. 2. They delay the signal. 3. Optionally, they can lock their output in one state.=Repetidores de redstone são componentes de redstone versáteis com multíplos propósitos: 1. Eles apenas permitem que sinais viajem em uma direção. 2. Eles atrasam o sinal. 3. Opcionalmente, eles podem travar suas saídas em um estado. +To power a redstone repeater, send a signal in “arrow” direction (the input). The signal goes out on the opposite side (the output) with a delay. To change the delay, use the redstone repeater. The delay is between 0.1 and 0.4 seconds long and can be changed in steps of 0.1 seconds. It is indicated by the position of the moving redstone torch.=Para energizar um repetidor de redstone, envie um sinal na direção da "seta" (a entrada). O sinal sairá no lado oposto (a saída) com um atraso. Para mudar o atraso, use o repetidor de redstone. O atraso é entre 0.1 e 0.4 segundos de duração e podem ser mudados em passos de 0.1 segundo. É indicado pela posição da tocha tocha de redstone móvel. +To lock a repeater, send a signal from an adjacent repeater into one of its sides. While locked, the moving redstone torch disappears, the output doesn't change and the input signal is ignored.=Para travar um repetidor, envie um sinal de um repetidor adjacente para uma de suas laterais. Enquanto travado, a tocha de redstone móvel desaparece, a saída não muda e o sinal de entrada é ignorado. +Redstone Repeater=Repetidor de Redstone +Redstone Repeater (Powered)=Repetidor de Redstone (Energizado) +Redstone Repeater (Locked)=Repetidor de Redstone (Travado) +Redstone Repeater (Locked, Powered)=Repetidor de Redstone (Travado, Energizado) +Redstone Repeater (Delay @1)=Repetidor de Redstone (Atraso @1) +Redstone Repeater (Delay @1, Powered)=Repetidor de Redstone (Atraso @1, Energizado) +Transmits redstone power only in one direction=Transmite carga de redstone em apenas uma direção +Delays signal=Atrasa o sinal +Output locks when getting active redstone repeater signal from the side=A saída é travada quando estiver recebendo um sinal de um repetidor de redstone ativo pelas laterais From 29d40ef55375b7cc1d31b442038c75613d6db32d Mon Sep 17 00:00:00 2001 From: cora Date: Mon, 18 Dec 2023 12:02:46 +0100 Subject: [PATCH 317/345] Mix down new mob sounds to mono --- .../mobs_mc/sounds/extra_mobs_hoglin.1.ogg | Bin 6514 -> 4948 bytes .../mobs_mc/sounds/extra_mobs_hoglin.2.ogg | Bin 10262 -> 7163 bytes .../mobs_mc/sounds/extra_mobs_hoglin_hurt.ogg | Bin 5751 -> 4363 bytes 3 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.1.ogg mode change 100755 => 100644 mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.2.ogg mode change 100755 => 100644 mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.1.ogg b/mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.1.ogg old mode 100755 new mode 100644 index 06bdc4b248f23aa576569030446b3e56a2cb6196..5bc9a18ee96d50606bd4f24ba243925fb6c7ec9c GIT binary patch literal 4948 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 literal 6514 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 literal 5751 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 From e1d5899aa53337dcaf0354614910ea6b2070635b Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 24 Dec 2023 01:27:29 +0100 Subject: [PATCH 318/345] Remove unneeded dependencies This patches a heisenbug to be investigated later --- mods/PLAYER/mcl_fovapi/mod.conf | 1 - mods/PLAYER/mcl_sprint/mod.conf | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/mod.conf b/mods/PLAYER/mcl_fovapi/mod.conf index 86f174c41..3aff902a1 100644 --- a/mods/PLAYER/mcl_fovapi/mod.conf +++ b/mods/PLAYER/mcl_fovapi/mod.conf @@ -1,4 +1,3 @@ name = mcl_fovapi author = Michieal, Herowl description = An API for handling FOV changes. -depends = mcl_player diff --git a/mods/PLAYER/mcl_sprint/mod.conf b/mods/PLAYER/mcl_sprint/mod.conf index 9b9a7366b..b8bc02698 100644 --- a/mods/PLAYER/mcl_sprint/mod.conf +++ b/mods/PLAYER/mcl_sprint/mod.conf @@ -2,4 +2,4 @@ name = mcl_sprint author = GunshipPenguin description = Allows the player to sprint by pressing the “AUX” key (default: E). depends = mcl_playerinfo, playerphysics, mcl_hunger, mcl_fovapi -optional = mcl_bows \ No newline at end of file +optional = mcl_bows From a2a4da5aed0aaf94c941cb457e760cf8cfaec60d Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 24 Dec 2023 05:48:41 +0100 Subject: [PATCH 319/345] Added shepherd functionality --- mods/CORE/mcl_util/init.lua | 13 ++- mods/ENTITIES/mcl_mobs/breeding.lua | 3 + mods/ENTITIES/mobs_mc/sheep.lua | 2 +- mods/ENVIRONMENT/mcl_weather/skycolor.lua | 3 +- mods/ITEMS/mcl_chests/init.lua | 12 +-- mods/ITEMS/mcl_shepherd/init.lua | 91 ++++++++++++++++++ mods/ITEMS/mcl_shepherd/mod.conf | 4 + .../mcl_shepherd/sounds/shepherd-midnight.ogg | Bin 0 -> 488662 bytes mods/ITEMS/mcl_spyglass/init.lua | 6 ++ textures/mcl_moon_special.png | Bin 0 -> 2316 bytes textures/mcl_tool_shepherd_staff.png | Bin 0 -> 176 bytes 11 files changed, 119 insertions(+), 15 deletions(-) create mode 100644 mods/ITEMS/mcl_shepherd/init.lua create mode 100644 mods/ITEMS/mcl_shepherd/mod.conf create mode 100644 mods/ITEMS/mcl_shepherd/sounds/shepherd-midnight.ogg create mode 100644 textures/mcl_moon_special.png create mode 100644 textures/mcl_tool_shepherd_staff.png diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index af0f92698..17ac6c9d6 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -327,7 +327,7 @@ function mcl_util.hopper_push(pos, dst_pos) local dst_list = 'main' local dst_inv, stack_id - + if dst_def._mcl_hoppers_on_try_push then dst_inv, dst_list, stack_id = dst_def._mcl_hoppers_on_try_push(dst_pos, pos, hop_inv, hop_list) else @@ -365,7 +365,7 @@ function mcl_util.hopper_pull(pos, src_pos) local src_list = 'main' local src_inv, stack_id - + if src_def._mcl_hoppers_on_try_pull then src_inv, src_list, stack_id = src_def._mcl_hoppers_on_try_pull(src_pos, pos, hop_inv, hop_list) else @@ -1096,3 +1096,12 @@ function mcl_util.move_player_list(player, src_listname) vector.offset(player:get_pos(), 0, 1.2, 0), player:get_look_dir(), false) end + +function mcl_util.is_it_christmas() + local date = os.date("*t") + if date.month == 12 and date.day >= 24 or date.month == 1 and date.day <= 7 then + return true + else + return false + end +end diff --git a/mods/ENTITIES/mcl_mobs/breeding.lua b/mods/ENTITIES/mcl_mobs/breeding.lua index c6d8f92cd..8d3e03ec6 100644 --- a/mods/ENTITIES/mcl_mobs/breeding.lua +++ b/mods/ENTITIES/mcl_mobs/breeding.lua @@ -32,6 +32,9 @@ function mob_class:feed_tame(clicker, feed_count, breed, tame, notake) if not self.follow then return false end + if clicker:get_wielded_item():get_definition()._mcl_not_consumable then + return false + end -- can eat/tame with item in hand if self.nofollow or self:follow_holding(clicker) then local consume_food = false diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index 4a5e924d8..b67b672c5 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -111,7 +111,7 @@ mcl_mobs.register_mob("mobs_mc:sheep", { run_start = 81, run_end = 121, run_speed = 60, eat_start = 121, eat_start = 161, eat_loop = false, }, - follow = { "mcl_farming:wheat_item" }, + follow = { "mcl_farming:wheat_item", "mcl_shepherd:shepherd_staff" }, view_range = 12, -- Eat grass diff --git a/mods/ENVIRONMENT/mcl_weather/skycolor.lua b/mods/ENVIRONMENT/mcl_weather/skycolor.lua index aea469760..6d9efd47a 100644 --- a/mods/ENVIRONMENT/mcl_weather/skycolor.lua +++ b/mods/ENVIRONMENT/mcl_weather/skycolor.lua @@ -120,12 +120,13 @@ mcl_weather.skycolor = { override_day_night_ratio = function(player, ratio) local meta = player:get_meta() local has_night_vision = meta:get_int("night_vision") == 1 + local is_visited_shepherd = meta:get_int("mcl_shepherd:special") == 1 local arg -- Apply night vision only for dark sky local is_dark = minetest.get_timeofday() > 0.8 or minetest.get_timeofday() < 0.2 or mcl_weather.state ~= "none" local pos = player:get_pos() local dim = mcl_worlds.pos_to_dimension(pos) - if has_night_vision and is_dark and dim ~= "nether" and dim ~= "end" then + if (has_night_vision or is_visited_shepherd) and is_dark and dim ~= "nether" and dim ~= "end" then if ratio == nil then arg = NIGHT_VISION_RATIO else diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 38b1102a3..629f48fbc 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -13,17 +13,7 @@ local mod_doc = minetest.get_modpath("doc") mcl_chests = {} -- Christmas chest setup -local it_is_christmas = false -local date = os.date("*t") -if ( - date.month == 12 and ( - date.day == 24 or - date.day == 25 or - date.day == 26 - ) - ) then - it_is_christmas = true -end +local it_is_christmas = mcl_util.is_it_christmas() local tiles_chest_normal_small = { "mcl_chests_normal.png" } local tiles_chest_normal_double = { "mcl_chests_normal_double.png" } diff --git a/mods/ITEMS/mcl_shepherd/init.lua b/mods/ITEMS/mcl_shepherd/init.lua new file mode 100644 index 000000000..d06b02f93 --- /dev/null +++ b/mods/ITEMS/mcl_shepherd/init.lua @@ -0,0 +1,91 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) +local S = minetest.get_translator(modname) + + +minetest.register_tool("mcl_shepherd:shepherd_staff", { + description = S("Shepherd Staff"), + _doc_items_longdesc = S(""), + _doc_items_usagehelp = S(""), + inventory_image = "mcl_tool_shepherd_staff.png", + wield_scale = 1.3*mcl_vars.tool_wield_scale, + stack_max = 1, + groups = { weapon=1, tool=1, staff=1, enchantability=-1 }, + tool_capabilities = { + full_punch_interval = 1, + max_drop_level=1, + damage_groups = {fleshy=2}, + punch_attack_uses = 45, + }, + sound = { breaks = "default_tool_breaks" }, + _mcl_toollike_wield = true, + _mcl_diggroups = { + swordy = { speed = 1, level = 1, uses = 60 }, + swordy_cobweb = { speed = 1, level = 1, uses = 60 } + }, + _mcl_not_consumable = true, +}) + +if mcl_util.is_it_christmas() then + minetest.register_globalstep(function(dtime) + local time = minetest.get_timeofday() + if time < 0.005 or time > 0.995 then + for _, player in pairs(minetest.get_connected_players()) do + local meta = player:get_meta() + local sp = meta:get_int("mcl_shepherd:special") + if sp == 0 and player:get_wielded_item():get_definition().groups.staff then + local has_sheep = false + for _, obj in pairs(minetest.get_objects_inside_radius(player:get_pos(), 3)) do + local ent = obj:get_luaentity() + if ent and ent.name == "mobs_mc:sheep" then + has_sheep = true + break + end + end + if has_sheep then + minetest.sound_play( + {name="shepherd-midnight", gain=3, pitch=1.0}, + {to_player=player:get_player_name(), gain=1.0, fade=0.0, pitch=1.0}, + false + ) + meta:set_int("mcl_shepherd:special", 1) + mcl_weather.skycolor.update_sky_color({player}) + minetest.after(45, function(name) + local player = minetest.get_player_by_name(name) + if not player then return end + local meta = player:get_meta() + meta:set_int("mcl_shepherd:special", 0) + mcl_weather.skycolor.update_sky_color({player}) + end, player:get_player_name()) + end + end + end + end + end) + minetest.register_on_joinplayer(function(player) + local meta = player:get_meta() + meta:set_int("mcl_shepherd:special", 0) + end) +end + +minetest.register_craft({ + output = "mcl_shepherd:shepherd_staff", + recipe = { + {"","","mcl_core:stick"}, + {"","mcl_core:stick",""}, + {"mcl_core:stick","",""}, + } +}) +minetest.register_craft({ + output = "mcl_shepherd:shepherd_staff", + recipe = { + {"mcl_core:stick", "", ""}, + {"", "mcl_core:stick", ""}, + {"","","mcl_core:stick"}, + } +}) +minetest.register_craft({ + type = "fuel", + recipe = "mcl_shepherd:shepherd_staff", + burntime = 15, +}) diff --git a/mods/ITEMS/mcl_shepherd/mod.conf b/mods/ITEMS/mcl_shepherd/mod.conf new file mode 100644 index 000000000..972e324d0 --- /dev/null +++ b/mods/ITEMS/mcl_shepherd/mod.conf @@ -0,0 +1,4 @@ +name = mcl_shepherd +author = Herowl +depends = mcl_core, mobs_mc, mcl_util +optional_depends = doc diff --git a/mods/ITEMS/mcl_shepherd/sounds/shepherd-midnight.ogg b/mods/ITEMS/mcl_shepherd/sounds/shepherd-midnight.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ddd6a4e90fe4fc07f87322a3930e0374211b4e43 GIT binary patch literal 488662 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�{zZ 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