diff --git a/CREDITS.md b/CREDITS.md index 39eed70e1..548ff94f6 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,21 @@ * Niterux * appgurueu * seventeenthShulker +* DinoNuggies4665 +* basxto +* Morik666 +* Eliy21 +* mdk +* Alessandra Lozoya +* VanicGame +* ThePython10110 +* Araca +* Montandalar +* mim +* Dark +* Bakawun +* JoseDouglas26 +* Zasco ## Music * Jordach for the jukebox music compilation from Big Freaking Dig @@ -155,6 +172,7 @@ * cora * Faerraven / Michieal * PrairieWind +* ChrisPHP ## 3D Models * 22i @@ -162,6 +180,7 @@ * epCode * Faerraven / Michieal * SumianVoice +* thunder1035 ## Textures * XSSheep @@ -181,6 +200,8 @@ * Aeonix_Aeon * Wbjitscool * SmokeyDope +* thunder1035 +* Herowl ## Translations * Wuzzy @@ -200,6 +221,10 @@ * Temak * megustanlosfrijoles * kbundg +* Isaac Dennis +* ADLON +* Sab Pyrope +* JoseDouglas26 ## Funders * 40W 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/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) * Другие пасхалки diff --git a/game.conf b/game.conf index 3ad5a33a5..d238ce93c 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.87.0-SNAPSHOT diff --git a/mods/CORE/controls/init.lua b/mods/CORE/controls/init.lua index ef57281a4..7f308d8e0 100644 --- a/mods/CORE/controls/init.lua +++ b/mods/CORE/controls/init.lua @@ -31,6 +31,7 @@ local known_controls = { aux1 = true, down = true, up = true, + zoom = true, } minetest.register_on_joinplayer(function(player) 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. diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index e894eebd7..4541c603e 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) @@ -136,7 +160,7 @@ function mcl_util.rotate_axis_and_place(itemstack, placer, pointed_thing, infini return end local undef = minetest.registered_nodes[unode.name] - if undef and undef.on_rightclick then + if undef and undef.on_rightclick and not invert_wall then undef.on_rightclick(pointed_thing.under, unode, placer, itemstack, pointed_thing) return @@ -174,25 +198,11 @@ function mcl_util.rotate_axis_and_place(itemstack, placer, pointed_thing, infini local p2 if is_y then - if invert_wall then - if fdir == 3 or fdir == 1 then - p2 = 12 - else - p2 = 6 - end - end + p2 = 0 elseif is_x then - if invert_wall then - p2 = 0 - else - p2 = 12 - end + p2 = 12 elseif is_z then - if invert_wall then - p2 = 0 - else - p2 = 6 - end + p2 = 6 end minetest.set_node(pos, {name = wield_name, param2 = p2}) @@ -241,34 +251,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 +280,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 +297,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) @@ -1113,3 +1032,62 @@ 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) + mcl_util.mcl_log("item velocity calculated "..vector.to_string(v), "[mcl_util]") + 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 + +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_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/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ú 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. diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 149b5ed93..c12bd045e 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -362,6 +362,121 @@ 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) + 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 +-- end of code pulled from Minetest + -- Drop single items by default function minetest.item_drop(itemstack, dropper, pos) if dropper and dropper:is_player() then 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 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/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index 7775c1b8e..b701b48fe 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 @@ -532,20 +554,15 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) return end - local is_player = hitter:is_player() + local time_now = minetest.get_us_time() if is_player then - -- is mob protected? - if self.protected and minetest.is_protected(self.object:get_pos(), hitter:get_player_name()) then - return - end - if minetest.is_creative_enabled(hitter:get_player_name()) then self.health = 0 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 + 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)) + 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 @@ -1201,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 @@ -1220,7 +1253,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 diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 843315039..f4322bd31 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, @@ -313,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, @@ -332,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) @@ -348,6 +357,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, @@ -420,6 +430,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 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 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 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 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. diff --git a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua index 8f8590933..2b9e66ae7 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, @@ -92,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 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() diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mobs_mc/iron_golem.lua index 6b428c6f8..b79971b9b 100644 --- a/mods/ENTITIES/mobs_mc/iron_golem.lua +++ b/mods/ENTITIES/mobs_mc/iron_golem.lua @@ -4,12 +4,14 @@ --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 --################### -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 +87,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 and self.state ~= "attack" then + local dist = vector.distance(self._home,self.object:get_pos()) + if allow_nav_hacks and 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, 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/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 diff --git a/mods/ENTITIES/mobs_mc/piglin.lua b/mods/ENTITIES/mobs_mc/piglin.lua index 27f5a72f4..3fa9aedd6 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, 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/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index ecf60debd..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 = 0.5, + shoot_interval = 6, arrow = "mobs_mc:shulkerbullet", shoot_offset = 0.5, passive = false, @@ -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", @@ -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,19 @@ 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 = 45, walk_end = 65, + walk_loop = false, + run_start = 65, run_end = 85, + run_loop = false, 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,12 +85,13 @@ 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") + self:set_animation("run") + self.armor = 0 + elseif self.state == "stand" then + self.armor = 20 + elseif self.state == "walk" or self.state == "run" then + self.armor = 0 end self.path.way = false self.look_at_players = false @@ -149,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) @@ -156,27 +164,12 @@ mcl_mobs.register_arrow("mobs_mc:shulkerbullet", { visual = "sprite", visual_size = {x = 0.25, y = 0.25}, textures = {"mobs_mc_shulkerbullet.png"}, - velocity = 6, - - 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 + velocity = 5, + homing = true, + 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) --[[ diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 321a9c1ce..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", @@ -197,7 +197,7 @@ local slime_big = { distance = 16, }, damage = 4, - reach = 3, + reach = 2.5, armor = 100, drops = {}, -- TODO: Fix animations @@ -235,10 +235,10 @@ 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.75 +slime_small.reach = 2.25 slime_small.walk_velocity = 1.8 slime_small.run_velocity = 1.8 slime_small.jump_height = 4.3 @@ -252,10 +252,10 @@ 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 = 0 -slime_tiny.reach = 2.5 +slime_tiny.damage = 1 +slime_tiny.reach = 2 slime_tiny.drops = { -- slimeball {name = "mcl_mobitems:slimeball", @@ -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", @@ -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", @@ -463,10 +463,10 @@ 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.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 @@ -485,13 +485,13 @@ 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 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 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 100644 index 000000000..5bc9a18ee Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.1.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.2.ogg b/mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.2.ogg new file mode 100644 index 000000000..552d27c5f Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.2.ogg differ diff --git a/mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin_hurt.ogg new file mode 100644 index 000000000..7c74f8fb3 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin_hurt.ogg differ 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.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 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 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/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 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/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 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. 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) 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/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= 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..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 @@ -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. @@ -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= 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 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/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 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..bc962eef8 --- /dev/null +++ b/mods/HELP/mcl_tt/locale/mcl_tt.es.tr @@ -0,0 +1,48 @@ +# textdomain: mcl_tt +Head armor=Armadura para la cabeza +Torso armor=Armadura para el torso +Legs armor=Armadura para las piernas +Feet armor=Armadura para los pies +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=Causa daño al caer +Grows on grass blocks or dirt=Crece sobre bloques de pasto o tierra +Grows on grass blocks, podzol, dirt or coarse dirt=Crece sobre bloques de pasto, podsol, tierra o tierra estéril +Flammable=Inflamable +Zombie view range: -50%=Rango de visión zombie: -50% +Skeleton view range: -50%=Rango de visión de esqueleto: -50% +Creeper view range: -50%=Rango de visión de creeper: -50% +Damage: @1=Daño: @1 +Damage (@1): @2=Daño (@1): @2 +Healing: @1=Curación: @1 +Healing (@1): @2=Curación (@1): @2 +Full punch interval: @1s=Intervalo de golpe completo: @1s +Contact damage: @1 per second=Daño por contacto: @1 por segundo +Contact healing: @1 per second=Curación por contacto: @1 por segundo +Drowning damage: @1=Dañor por ahogamiento: @1 +Bouncy (@1%)=Rebota (@1%) +Luminance: @1=Luminancia: @1 +Slippery=Resbaladizo +Climbable=Escalable +Climbable (only downwards)=Escalable (solo hacia abajo) +No jumping=No saltar +No swimming upwards=No nadar hacia arriba +No rising=No levantar +Fall damage: @1%=Daño por caída: @1% +Fall damage: +@1%=Daño por caída: @1% +No fall damage=Sin daño por caída +Mining speed: @1=Velocidad de minado: @1 +Very fast=Muy rápido +Extremely fast=Extremadamente rápido +Fast=Rápido +Slow=Lento +Very slow=Muy lento +Painfully slow=Dolorosamente lento +Mining durability: @1=Durabilidad de minería: @1 +Block breaking strength: @1=Fuerza para romper bloques: @1 +@1 uses=@1 usos +Unlimited uses=Usos ilimitados +Durability: @1=Durabilidad: @1 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 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/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! 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/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 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/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/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_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/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_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 diff --git a/mods/HUD/mcl_credits/people.lua b/mods/HUD/mcl_credits/people.lua index 7421350d0..d562f2e53 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,21 @@ return { "Niterux", "appgurueu", "seventeenthShulker", + "DinoNuggies4665", + "basxto", + "Morik666", + "Eliy21", + "mdk", + "Alessandra Lozoya", + "VanicGame", + "ThePython10110", + "Araca", + "Montandalar", + "mim", + "Dark", + "Bakawun", + "JoseDouglas26", + "Zasco", }}, {S("Music"), 0xA60014, { "Jordach for the jukebox music compilation from Big Freaking Dig", @@ -157,6 +174,7 @@ return { "cora", "Faerraven / Michieal", "PrairieWind", + "ChrisPHP", }}, {S("3D Models"), 0x0019FF, { "22i", @@ -164,6 +182,7 @@ return { "epCode", "Faerraven / Michieal", "SumianVoice", + "thunder1035", }}, {S("Textures"), 0xFF9705, { "XSSheep", @@ -180,8 +199,11 @@ return { "Faerraven / Michieal", "Nicu", "Exhale", + "Aeonix_Aeon", "Wbjitscool", "SmokeyDope", + "thunder1035", + "Herowl", }}, {S("Translations"), 0x00FF60, { "Wuzzy", @@ -201,6 +223,10 @@ return { "Temak", "megustanlosfrijoles", "kbundg", + "Isaac Dennis", + "ADLON", + "Sab Pyrope", + "JoseDouglas26", }}, {S("Funders"), 0xF7FF00, { "40W", 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/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 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 diff --git a/mods/HUD/mcl_experience/orb.lua b/mods/HUD/mcl_experience/orb.lua index 9aecce00d..462456aad 100644 --- a/mods/HUD/mcl_experience/orb.lua +++ b/mods/HUD/mcl_experience/orb.lua @@ -155,7 +155,7 @@ minetest.register_entity("mcl_experience:orb", { collisionbox = {-0.2, -0.2, -0.2, 0.2, 0.2, 0.2}, visual = "sprite", visual_size = {x = 0.4, y = 0.4}, - textures = {name="mcl_experience_orb.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}}, + textures = {"mcl_experience_orb.png"}, spritediv = {x = 1, y = 14}, initial_sprite_basepos = {x = 0, y = 0}, is_visible = true, 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 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 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 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 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 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 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/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. 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) 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 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 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/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 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 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. 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_button/init.lua b/mods/ITEMS/REDSTONE/mesecons_button/init.lua index 275cac2e2..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 @@ -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_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.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. 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/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 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 diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua b/mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua index 0e517e4dc..0e0235642 100644 --- a/mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua @@ -2,7 +2,24 @@ local S = minetest.get_translator(minetest.get_current_modname()) local light = minetest.LIGHT_MAX -minetest.register_node("mesecons_lightstone:lightstone_off", { +local function generate_action_on(color) + local n = "mesecons_lightstone:lightstone_on" + if color then n = n .. "_" .. color end + return function(pos, node) + minetest.swap_node(pos, {name=n, param2 = node.param2}) + end +end + +local function generate_action_off(color) + local n = "mesecons_lightstone:lightstone_off" + if color then n = n .. "_" .. color end + return function(pos, node) + minetest.swap_node(pos, {name=n, param2 = node.param2}) + end +end + +local ls_off_name = "mesecons_lightstone:lightstone_off" +local ls_off_def = { tiles = {"jeija_lightstone_gray_off.png"}, groups = {handy=1, mesecon_effector_off = 1, mesecon = 2}, is_ground_content = false, @@ -11,16 +28,16 @@ minetest.register_node("mesecons_lightstone:lightstone_off", { _doc_items_longdesc = S("Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.", light), sounds = mcl_sounds.node_sound_glass_defaults(), mesecons = {effector = { - action_on = function(pos, node) - minetest.swap_node(pos, {name="mesecons_lightstone:lightstone_on", param2 = node.param2}) - end, + action_on = generate_action_on(), rules = mesecon.rules.alldirs, }}, _mcl_blast_resistance = 0.3, _mcl_hardness = 0.3, -}) +} +minetest.register_node(ls_off_name, ls_off_def) -minetest.register_node("mesecons_lightstone:lightstone_on", { +local ls_on_name = "mesecons_lightstone:lightstone_on" +local ls_on_def = { tiles = {"jeija_lightstone_gray_on.png"}, groups = {handy=1, not_in_creative_inventory=1, mesecon = 2, opaque = 1}, drop = "node mesecons_lightstone:lightstone_off", @@ -29,14 +46,59 @@ minetest.register_node("mesecons_lightstone:lightstone_on", { light_source = light, sounds = mcl_sounds.node_sound_glass_defaults(), mesecons = {effector = { - action_off = function(pos, node) - minetest.swap_node(pos, {name="mesecons_lightstone:lightstone_off", param2 = node.param2}) - end, + action_off = generate_action_off(), rules = mesecon.rules.alldirs, }}, _mcl_blast_resistance = 0.3, _mcl_hardness = 0.3, -}) +} +minetest.register_node(ls_on_name, ls_on_def) + +local colored_lamps = { + {"white", S("White Redstone Lamp"), "white"}, + {"grey", S("Grey Redstone Lamp"), "dark_grey"}, + {"silver", S("Light Grey Redstone Lamp"), "grey"}, + {"black", S("Black Redstone Lamp"), "black"}, + {"red", S("Red Redstone Lamp"), "red"}, + {"yellow", S("Yellow Redstone Lamp"), "yellow"}, + {"green", S("Green Redstone Lamp"), "dark_green"}, + {"cyan", S("Cyan Redstone Lamp"), "cyan"}, + {"blue", S("Blue Redstone Lamp"), "blue"}, + {"magenta", S("Magenta Redstone Lamp"), "magenta"}, + {"orange", S("Orange Redstone Lamp"), "orange"}, + {"purple", S("Purple Redstone Lamp"), "violet"}, + {"brown", S("Brown Redstone Lamp"), "brown"}, + {"pink", S("Pink Redstone Lamp"), "pink"}, + {"lime", S("Lime Redstone Lamp"), "green"}, + {"lightblue", S("Light Blue Redstone Lamp"), "lightblue"}, +} +for _, row in ipairs(colored_lamps) do + local name = row[1] + local desc = row[2] + local dye = row[3] + local mask = "^[hsl:0:-100^(mcl_lightstone_mask.png^[multiply:" .. name .. "^[opacity:100)" + if name == "lightblue" then + mask = "^[hsl:0:-100^(mcl_lightstone_mask.png^[multiply:" .. name .. "^[hsl:0:200^[opacity:100)" + end + local name_off = ls_off_name .. "_" .. name + local def_off = table.copy(ls_off_def) + def_off.description = desc + def_off._doc_items_longdesc = nil + def_off._doc_items_create_entry = false + def_off.mesecons.effector.action_on = generate_action_on(name) + def_off.tiles[1] = def_off.tiles[1] .. mask + local def_on = table.copy(ls_on_def) + def_on.drop = name_off + def_on.tiles[1] = def_on.tiles[1] .. mask + def_on.mesecons.effector.action_off = generate_action_off(name) + minetest.register_node(name_off, def_off) + minetest.register_node(ls_on_name.."_"..name, def_on) + minetest.register_craft({ + type = "shapeless", + output = name_off, + recipe = {ls_off_name, "mcl_dye:" .. dye} + }) +end minetest.register_craft({ output = "mesecons_lightstone:lightstone_off", diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.de.tr b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.de.tr index a0cfc2213..1b0407d1a 100644 --- a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.de.tr +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.de.tr @@ -2,3 +2,19 @@ Redstone Lamp=Redstonelampe Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.=Redstonelampen sind einfache Redstonekomponenten, die hell aufleuchten (Helligkeitspegel von @1), wenn sie Redstoneenergie erhalten. Glows when powered by redstone power=Leuchtet, wenn mit Redstoneenergie versorgt +White Redstone Lamp=Weiße Redstonelampe +Grey Redstone Lamp=Graue Redstonelampe +Light Grey Redstone Lamp=Hellgraue Redstonelampe +Black Redstone Lamp=Schwartze Redstonelampe +Red Redstone Lamp=Rote Redstonelampe +Yellow Redstone Lamp=Gelbe Redstonelampe +Green Redstone Lamp=Grüne Redstonelampe +Cyan Redstone Lamp=Türkise Redstonelampe +Blue Redstone Lamp=Blaue Redstonelampe +Magenta Redstone Lamp=Magenta Redstonelampe +Orange Redstone Lamp=Orange Redstonelampe +Purple Redstone Lamp=Violette Redstonelampe +Brown Redstone Lamp=Braune Redstonelampe +Pink Redstone Lamp=Rosa Redstonelampe +Lime Redstone Lamp=Lindgrüne Redstonelampe +Light Blue Redstone Lamp=Hellblaue Redstonelampe 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 diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.pl.tr b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.pl.tr index cd2f755c9..99d01bb07 100644 --- a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.pl.tr +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.pl.tr @@ -2,3 +2,19 @@ Redstone Lamp=Lampa czerwienitowa Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.=Lampy czerwienitowe to mechanizmy czerwienitowe, które jasno świecą (poziom światła @1), gdy są zasilone energią czerwienitową. Glows when powered by redstone power=Świeci gdy zasilana czerwienitem +White Redstone Lamp=Biała lampa czerwienitowa +Grey Redstone Lamp=Szara lampa czerwienitowa +Light Grey Redstone Lamp=Jasnoszara lampa czerwienitowa +Black Redstone Lamp=Czarna lampa czerwienitowa +Red Redstone Lamp=Czerwona lampa czerwienitowa +Yellow Redstone Lamp=Żółta lampa czerwienitowa +Green Redstone Lamp=Zielona lampa czerwienitowa +Cyan Redstone Lamp=Błękitna lampa czerwienitowa +Blue Redstone Lamp=Niebieska lampa czerwienitowa +Magenta Redstone Lamp=Karmazynowa lampa czerwienitowa +Orange Redstone Lamp=Pomarańczowa lampa czerwienitowa +Purple Redstone Lamp=Fioletowa lampa czerwienitowa +Brown Redstone Lamp=Brązowa lampa czerwienitowa +Pink Redstone Lamp=Różowa lampa czerwienitowa +Lime Redstone Lamp=Jasnozielona lampa czerwienitowa +Light Blue Redstone Lamp=Jasnoniebieska lampa czerwienitowa 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 diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/template.txt index 2d2cc419f..0d743daa4 100644 --- a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/template.txt @@ -2,3 +2,19 @@ Redstone Lamp= Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.= Glows when powered by redstone power= +White Redstone Lamp= +Grey Redstone Lamp= +Light Grey Redstone Lamp= +Black Redstone Lamp= +Red Redstone Lamp= +Yellow Redstone Lamp= +Green Redstone Lamp= +Cyan Redstone Lamp= +Blue Redstone Lamp= +Magenta Redstone Lamp= +Orange Redstone Lamp= +Purple Redstone Lamp= +Brown Redstone Lamp= +Pink Redstone Lamp= +Lime Redstone Lamp= +Light Blue Redstone Lamp= diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 58e5afd92..9fd381b76 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 @@ -140,47 +141,50 @@ function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos) return 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}}) - - -- 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 - 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 + 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 + + -- 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)) then - table.insert(frontiers, cp) end end end table.remove(frontiers, 1) end - return nodes, false + return nodes, dig_nodes, false, false end function mesecon.mvps_set_owner(pos, placer) @@ -203,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 @@ -222,9 +231,9 @@ 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 @@ -237,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 @@ -253,18 +265,35 @@ 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.join_table(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) + -- 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.node) + end + for _, item in ipairs(drops) do + if type(item) ~= "string" then + item = item:get_name() .. item:get_count() + end + table.insert(counted_drops, item) + end + minetest.handle_node_drops(n.pos, counted_drops) + end else minetest.remove_node(n.pos) local node_timer = minetest.get_node_timer(n.pos) @@ -273,13 +302,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 +316,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 @@ -394,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") @@ -411,10 +441,9 @@ 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") +mesecon.register_mvps_stopper("mcl_compass:lodestone") -- Unmovable by technical restrictions. -- Open formspec would screw up if node is destroyed (minor problem) @@ -445,13 +474,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 @@ -495,8 +525,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 @@ -532,21 +560,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") @@ -559,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 -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") @@ -907,16 +903,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 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/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 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 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 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/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_armor/locale/mcl_armor.pt_BR.tr b/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr index b12f07026..7c11b26c1 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 '@1' 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'= 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_bamboo/bamboo_base.lua b/mods/ITEMS/mcl_bamboo/bamboo_base.lua index 1c7e99a61..33e0cebaa 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" @@ -280,31 +280,7 @@ local bamboo_block_def = { _mcl_blast_resistance = 3, _mcl_hardness = 2, _mcl_stripped_variant = "mcl_bamboo:bamboo_block_stripped", -- this allows us to use the built in Axe's strip block. - on_place = function(itemstack, placer, pointed_thing) - if not pointed_thing then - return itemstack - end - - if pointed_thing.type ~= "node" then -- make sure that pointed_thing is not null and is pointing at a node. - return itemstack - end - - local pos = pointed_thing.under - - if mcl_bamboo.is_protected(pos, placer) then - return - end - - -- Use pointed node's on_rightclick function first, if present - local node = minetest.get_node(pointed_thing.under) - if placer and not placer:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack - end - end - - return minetest.item_place(itemstack, placer, pointed_thing, minetest.dir_to_facedir(vector.direction(pointed_thing.above, pointed_thing.under))) - end, + on_place = mcl_util.rotate_axis, } minetest.register_node("mcl_bamboo:bamboo_block", bamboo_block_def) @@ -361,7 +337,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 +361,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 +384,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)) 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_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. 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/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index fdb4f8f41..394c748e7 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, 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 + 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/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_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 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. 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. 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_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua index 138e02191..e42554f59 100644 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ b/mods/ITEMS/mcl_blackstone/init.lua @@ -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}, + {"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}, + {"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}, + {"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}, + {"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 } ) --lavacooling @@ -366,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_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_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= 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_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/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 23b6b4310..37c38a085 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -33,6 +33,15 @@ 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({ + name = "bowcomplete", + fov_factor = 0.8, + time = 1, + reset_time = 0.3, + 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") if power == nil then @@ -48,7 +57,9 @@ 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 * 24 + else + knockback = 4.875 end if enchantments.flame then mcl_burning.set_on_fire(obj, math.huge) @@ -131,7 +142,7 @@ minetest.register_tool("mcl_bows:bow", { _tt_help = S("Launches arrows"), _doc_items_longdesc = S("Bows are ranged weapons to shoot arrows at your foes.").."\n".. S("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."), - _doc_items_usagehelp = S("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."), + _doc_items_usagehelp = S("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 (or the zoom key) to charge, release to shoot."), _doc_items_durability = BOW_DURABILITY, inventory_image = "mcl_bows_bow.png", wield_scale = mcl_vars.tool_wield_scale, @@ -183,6 +194,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 @@ -227,7 +241,7 @@ end controls.register_on_release(function(player, key, time) - if key~="RMB" then return end + if key~="RMB" and key~="zoom" then return end --local inv = minetest.get_inventory({type="player", name=player:get_player_name()}) local wielditem = player:get_wielded_item() if (wielditem:get_name()=="mcl_bows:bow_0" or wielditem:get_name()=="mcl_bows:bow_1" or wielditem:get_name()=="mcl_bows:bow_2" or @@ -295,25 +309,30 @@ end) controls.register_on_hold(function(player, key, time) local name = player:get_player_name() local creative = minetest.is_creative_enabled(name) - if key ~= "RMB" or not (creative or get_arrow(player)) then + if (key ~= "RMB" and key ~= "zoom") or not (creative or get_arrow(player)) then return end --local inv = minetest.get_inventory({type="player", name=name}) local wielditem = player:get_wielded_item() - if bow_load[name] == nil and (wielditem:get_name()=="mcl_bows:bow" or wielditem:get_name()=="mcl_bows:bow_enchanted") and wielditem:get_meta():get("active") and (creative or get_arrow(player)) then - local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) - if enchanted then - wielditem:set_name("mcl_bows:bow_0_enchanted") - else - wielditem:set_name("mcl_bows:bow_0") - end - player:set_wielded_item(wielditem) - if minetest.get_modpath("playerphysics") then - -- Slow player down when using bow - playerphysics.add_physics_factor(player, "speed", "mcl_bows:use_bow", PLAYER_USE_BOW_SPEED) - end - bow_load[name] = minetest.get_us_time() - bow_index[name] = player:get_wield_index() + if bow_load[name] == nil + and (wielditem:get_name()=="mcl_bows:bow" or wielditem:get_name()=="mcl_bows:bow_enchanted") + and (wielditem:get_meta():get("active") or key == "zoom") and (creative or get_arrow(player)) then + local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) + if enchanted then + wielditem:set_name("mcl_bows:bow_0_enchanted") + else + wielditem:set_name("mcl_bows:bow_0") + end + player:set_wielded_item(wielditem) + if minetest.get_modpath("playerphysics") then + -- Slow player down when using bow + playerphysics.add_physics_factor(player, "speed", "mcl_bows:use_bow", PLAYER_USE_BOW_SPEED) + 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 diff --git a/mods/ITEMS/mcl_bows/crossbow.lua b/mods/ITEMS/mcl_bows/crossbow.lua index df7b5f560..b6a1a3ad6 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 @@ -132,7 +132,7 @@ minetest.register_tool("mcl_bows:crossbow", { _tt_help = S("Launches arrows"), _doc_items_longdesc = S("Crossbows are ranged weapons to shoot arrows at your foes.").."\n".. S("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."), - _doc_items_usagehelp = S("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."), + _doc_items_usagehelp = S("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 (or zoom key) to charge, release to load an arrow into the chamber, then to shoot press left mouse."), _doc_items_durability = BOW_DURABILITY, inventory_image = "mcl_bows_crossbow.png", wield_scale = mcl_vars.tool_wield_scale, @@ -263,7 +263,7 @@ end controls.register_on_release(function(player, key, time) - if key~="RMB" then return end + if key~="RMB" and key~="zoom" then return end --local inv = minetest.get_inventory({type="player", name=player:get_player_name()}) local wielditem = player:get_wielded_item() if wielditem:get_name()=="mcl_bows:crossbow_2" and get_arrow(player) or wielditem:get_name()=="mcl_bows:crossbow_2" and minetest.is_creative_enabled(player:get_player_name()) or wielditem:get_name()=="mcl_bows:crossbow_2_enchanted" and get_arrow(player) or wielditem:get_name()=="mcl_bows:crossbow_2_enchanted" and minetest.is_creative_enabled(player:get_player_name()) then @@ -359,7 +359,7 @@ end) controls.register_on_hold(function(player, key, time) local name = player:get_player_name() local creative = minetest.is_creative_enabled(name) - if key ~= "RMB" then + if key ~= "RMB" and key ~= "zoom" then return end --local inv = minetest.get_inventory({type="player", name=name}) @@ -373,22 +373,24 @@ controls.register_on_hold(function(player, key, time) BOW_CHARGE_TIME_FULL = _BOW_CHARGE_TIME_FULL end - if bow_load[name] == nil and (wielditem:get_name()=="mcl_bows:crossbow" or wielditem:get_name()=="mcl_bows:crossbow_enchanted") and wielditem:get_meta():get("active") and (creative or get_arrow(player)) then - local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) - if enchanted then - wielditem:set_name("mcl_bows:crossbow_0_enchanted") - play_load_sound(0, player:get_pos()) - else - wielditem:set_name("mcl_bows:crossbow_0") - play_load_sound(0, player:get_pos()) - end - player:set_wielded_item(wielditem) - if minetest.get_modpath("playerphysics") then - -- Slow player down when using bow - playerphysics.add_physics_factor(player, "speed", "mcl_bows:use_crossbow", PLAYER_USE_CROSSBOW_SPEED) - end - bow_load[name] = minetest.get_us_time() - bow_index[name] = player:get_wield_index() + if bow_load[name] == nil + and (wielditem:get_name()=="mcl_bows:crossbow" or wielditem:get_name()=="mcl_bows:crossbow_enchanted") + and (wielditem:get_meta():get("active") or key=="zoom") and (creative or get_arrow(player)) then + local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) + if enchanted then + wielditem:set_name("mcl_bows:crossbow_0_enchanted") + play_load_sound(0, player:get_pos()) + else + wielditem:set_name("mcl_bows:crossbow_0") + play_load_sound(0, player:get_pos()) + end + player:set_wielded_item(wielditem) + if minetest.get_modpath("playerphysics") then + -- Slow player down when using bow + playerphysics.add_physics_factor(player, "speed", "mcl_bows:use_crossbow", PLAYER_USE_CROSSBOW_SPEED) + end + bow_load[name] = minetest.get_us_time() + bow_index[name] = player:get_wield_index() else if player:get_wield_index() == bow_index[name] then if type(bow_load[name]) == "number" then 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. 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_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 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_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_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 = { 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_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 diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 6f3272149..629f48fbc 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -10,18 +10,10 @@ 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") -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" } @@ -596,7 +588,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 +743,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 +786,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 +936,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 +1353,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 +1426,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 +1519,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 +1540,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_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 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 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_compressed_blocks/init.lua b/mods/ITEMS/mcl_compressed_blocks/init.lua new file mode 100644 index 000000000..e81c7f4a0 --- /dev/null +++ b/mods/ITEMS/mcl_compressed_blocks/init.lua @@ -0,0 +1,5 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +dofile(modpath.."/nodes.lua") +dofile(modpath.."/recipes.lua") diff --git a/mods/ITEMS/mcl_compressed_blocks/mod.conf b/mods/ITEMS/mcl_compressed_blocks/mod.conf new file mode 100644 index 000000000..6e1128c1d --- /dev/null +++ b/mods/ITEMS/mcl_compressed_blocks/mod.conf @@ -0,0 +1,5 @@ +name = mcl_compressed_blocks +depends = mcl_core +description = adds compressed blocks to mineclone2 + + diff --git a/mods/ITEMS/mcl_compressed_blocks/nodes.lua b/mods/ITEMS/mcl_compressed_blocks/nodes.lua new file mode 100644 index 000000000..32c47bfd4 --- /dev/null +++ b/mods/ITEMS/mcl_compressed_blocks/nodes.lua @@ -0,0 +1,121 @@ +--Compressed Cobblestone +minetest.register_node("mcl_compressed_blocks:compressed_cobblestone", { + description = "Compressed Cobblestone", + _doc_items_longdesc = ("Compressed Cobblestone is a decorative block made from 9 Cobblestone. It is useful for saving space in your inventories."), + _doc_items_hidden = false, + tiles = {"mcl_compressed_blocks_compressed_cobblestone.png"}, + is_ground_content = true, + stack_max = 64, + groups = {pickaxey=1, stone=1, building_block=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 11, + _mcl_hardness = 3, +}) + +--Double Compressed Cobble +minetest.register_node("mcl_compressed_blocks:double_compressed_cobblestone", { + description = "Double Compressed Cobblestone", + _doc_items_longdesc = ("Double Compressed Cobblestone is a decorative block made from 9 Compressed Cobblestone. It is useful for saving space in your inventories."), + _doc_items_hidden = false, + tiles = {"mcl_compressed_blocks_double_compressed_cobblestone.png"}, + is_ground_content = true, + stack_max = 64, + groups = {pickaxey=1, stone=1, building_block=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 19, + _mcl_hardness = 4, +}) + +--Triple Compressed Cobble +minetest.register_node("mcl_compressed_blocks:triple_compressed_cobblestone", { + description = "Triple Compressed Cobblestone", + _doc_items_longdesc = ("Triple Compressed Cobblestone is a decorative block made from 9 Double Compressed Cobblestone. It is useful for saving space in your inventories."), + _doc_items_hidden = false, + tiles = {"mcl_compressed_blocks_triple_compressed_cobblestone.png"}, + is_ground_content = true, + stack_max = 64, + groups = {pickaxey=1, stone=1, building_block=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 33, + _mcl_hardness = 5, +}) + +--Quadruple Compressed Cobble +minetest.register_node("mcl_compressed_blocks:quadruple_compressed_cobblestone", { + description = "Quadruple Compressed Cobblestone", + _doc_items_longdesc = ("Quadruple Compressed Cobblestone is a decorative block made from 9 Triple Compressed Cobblestone. It is useful for saving space in your inventories."), + _doc_items_hidden = false, + tiles = {"mcl_compressed_blocks_quadruple_compressed_cobblestone.png"}, + is_ground_content = true, + stack_max = 64, + groups = {pickaxey=1, stone=1, building_block=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 58, + _mcl_hardness = 7, +}) + +--Quintuple Compressed Cobble +minetest.register_node("mcl_compressed_blocks:quintuple_compressed_cobblestone", { + description = "Quintuple Compressed Cobblestone", + _doc_items_longdesc = ("Quintuple Compressed Cobblestone is a decorative block made from 9 Quadruple Compressed Cobblestone. It is useful for saving space in your inventories."), + _doc_items_hidden = false, + tiles = {"mcl_compressed_blocks_quintuple_compressed_cobblestone.png"}, + is_ground_content = true, + stack_max = 64, + groups = {pickaxey=1, stone=1, building_block=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 102, + _mcl_hardness = 9, +}) + +--Sextuple Compressed Cobble +minetest.register_node("mcl_compressed_blocks:sextuple_compressed_cobblestone", { + description = "Sextuple Compressed Cobblestone", + _doc_items_longdesc = ("Sextuple Compressed Cobblestone is a decorative block made from 9 Quintuple Compressed Cobblestone. It is useful for saving space in your inventories."), + _doc_items_hidden = false, + tiles = {"mcl_compressed_blocks_sextuple_compressed_cobblestone.png"}, + is_ground_content = true, + stack_max = 64, + groups = {pickaxey=1, stone=1, building_block=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 179, + _mcl_hardness = 12, +}) + +--Septuple Compressed Cobble +minetest.register_node("mcl_compressed_blocks:septuple_compressed_cobblestone", { + description = "Septuple Compressed Cobblestone", + _doc_items_longdesc = ("Septuple Compressed Cobblestone is a decorative block made from 9 Sextuple Compressed Cobblestone. It is useful for saving space in your inventories."), + _doc_items_hidden = false, + tiles = {"mcl_compressed_blocks_septuple_compressed_cobblestone.png"}, + is_ground_content = true, + stack_max = 64, + groups = {pickaxey=1, stone=1, building_block=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 313, + _mcl_hardness = 16, +}) + +--Ocutple Compressed Cobble +minetest.register_node("mcl_compressed_blocks:octuple_compressed_cobblestone", { + description = "Octuple Compressed Cobblestone", + _doc_items_longdesc = ("Octuple Compressed Cobblestone is a decorative block made from 9 Septuple Compressed Cobblestone. It is useful for saving space in your inventories."), + _doc_items_hidden = false, + tiles = {"mcl_compressed_blocks_octuple_compressed_cobblestone.png"}, + is_ground_content = true, + stack_max = 64, + groups = {pickaxey=1, stone=1, building_block=1}, + drop = { + + max_items = 2, + items = { + {items = {"mcl_core:diamond 9"}}, + {items = {"mcl_nether:netherite_scrap 18"}}, + }, + }, + + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 548, + _mcl_hardness = 21, + _mcl_silk_touch_drop = true, +}) diff --git a/mods/ITEMS/mcl_compressed_blocks/recipes.lua b/mods/ITEMS/mcl_compressed_blocks/recipes.lua new file mode 100644 index 000000000..a02e8c612 --- /dev/null +++ b/mods/ITEMS/mcl_compressed_blocks/recipes.lua @@ -0,0 +1,127 @@ +minetest.register_craft({ + output = "mcl_compressed_blocks:compressed_cobblestone", + recipe = { + { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, + { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, + { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, + }, +}) + +minetest.register_craft({ + output = "mcl_core:cobble 9", + recipe = { + { "mcl_compressed_blocks:compressed_cobblestone" }, + }, +}) + +minetest.register_craft({ + output = "mcl_compressed_blocks:double_compressed_cobblestone", + recipe = { + { "mcl_compressed_blocks:compressed_cobblestone", "mcl_compressed_blocks:compressed_cobblestone", "mcl_compressed_blocks:compressed_cobblestone" }, + { "mcl_compressed_blocks:compressed_cobblestone", "mcl_compressed_blocks:compressed_cobblestone", "mcl_compressed_blocks:compressed_cobblestone" }, + { "mcl_compressed_blocks:compressed_cobblestone", "mcl_compressed_blocks:compressed_cobblestone", "mcl_compressed_blocks:compressed_cobblestone" }, + }, +}) + +minetest.register_craft({ + output = "mcl_compressed_blocks:compressed_cobblestone 9", + recipe = { + { "mcl_compressed_blocks:double_compressed_cobblestone" }, + }, +}) + +minetest.register_craft({ + output = "mcl_compressed_blocks:triple_compressed_cobblestone", + recipe = { + { "mcl_compressed_blocks:double_compressed_cobblestone", "mcl_compressed_blocks:double_compressed_cobblestone", "mcl_compressed_blocks:double_compressed_cobblestone" }, + { "mcl_compressed_blocks:double_compressed_cobblestone", "mcl_compressed_blocks:double_compressed_cobblestone", "mcl_compressed_blocks:double_compressed_cobblestone" }, + { "mcl_compressed_blocks:double_compressed_cobblestone", "mcl_compressed_blocks:double_compressed_cobblestone", "mcl_compressed_blocks:double_compressed_cobblestone" }, + }, +}) + +minetest.register_craft({ + output = "mcl_compressed_blocks:double_compressed_cobblestone 9", + recipe = { + { "mcl_compressed_blocks:triple_compressed_cobblestone" }, + }, +}) + +minetest.register_craft({ + output = "mcl_compressed_blocks:quadruple_compressed_cobblestone", + recipe = { + { "mcl_compressed_blocks:triple_compressed_cobblestone", "mcl_compressed_blocks:triple_compressed_cobblestone", "mcl_compressed_blocks:triple_compressed_cobblestone" }, + { "mcl_compressed_blocks:triple_compressed_cobblestone", "mcl_compressed_blocks:triple_compressed_cobblestone", "mcl_compressed_blocks:triple_compressed_cobblestone" }, + { "mcl_compressed_blocks:triple_compressed_cobblestone", "mcl_compressed_blocks:triple_compressed_cobblestone", "mcl_compressed_blocks:triple_compressed_cobblestone" }, + }, +}) + +minetest.register_craft({ + output = "mcl_compressed_blocks:triple_compressed_cobblestone 9", + recipe = { + { "mcl_compressed_blocks:quadruple_compressed_cobblestone" }, + }, +}) + +minetest.register_craft({ + output = "mcl_compressed_blocks:quintuple_compressed_cobblestone", + recipe = { + { "mcl_compressed_blocks:quadruple_compressed_cobblestone", "mcl_compressed_blocks:quadruple_compressed_cobblestone", "mcl_compressed_blocks:quadruple_compressed_cobblestone" }, + { "mcl_compressed_blocks:quadruple_compressed_cobblestone", "mcl_compressed_blocks:quadruple_compressed_cobblestone", "mcl_compressed_blocks:quadruple_compressed_cobblestone" }, + { "mcl_compressed_blocks:quadruple_compressed_cobblestone", "mcl_compressed_blocks:quadruple_compressed_cobblestone", "mcl_compressed_blocks:quadruple_compressed_cobblestone" }, + }, +}) + +minetest.register_craft({ + output = "mcl_compressed_blocks:quadruple_compressed_cobblestone 9", + recipe = { + { "mcl_compressed_blocks:quintuple_compressed_cobblestone" }, + }, +}) + +minetest.register_craft({ + output = "mcl_compressed_blocks:sextuple_compressed_cobblestone", + recipe = { + { "mcl_compressed_blocks:quintuple_compressed_cobblestone", "mcl_compressed_blocks:quintuple_compressed_cobblestone", "mcl_compressed_blocks:quintuple_compressed_cobblestone" }, + { "mcl_compressed_blocks:quintuple_compressed_cobblestone", "mcl_compressed_blocks:quintuple_compressed_cobblestone", "mcl_compressed_blocks:quintuple_compressed_cobblestone" }, + { "mcl_compressed_blocks:quintuple_compressed_cobblestone", "mcl_compressed_blocks:quintuple_compressed_cobblestone", "mcl_compressed_blocks:quintuple_compressed_cobblestone" }, + }, +}) + +minetest.register_craft({ + output = "mcl_compressed_blocks:quintuple_compressed_cobblestone 9", + recipe = { + { "mcl_compressed_blocks:sextuple_compressed_cobblestone" }, + }, +}) + +minetest.register_craft({ + output = "mcl_compressed_blocks:septuple_compressed_cobblestone", + recipe = { + { "mcl_compressed_blocks:sextuple_compressed_cobblestone", "mcl_compressed_blocks:sextuple_compressed_cobblestone", "mcl_compressed_blocks:sextuple_compressed_cobblestone" }, + { "mcl_compressed_blocks:sextuple_compressed_cobblestone", "mcl_compressed_blocks:sextuple_compressed_cobblestone", "mcl_compressed_blocks:sextuple_compressed_cobblestone" }, + { "mcl_compressed_blocks:sextuple_compressed_cobblestone", "mcl_compressed_blocks:sextuple_compressed_cobblestone", "mcl_compressed_blocks:sextuple_compressed_cobblestone" }, + }, +}) + +minetest.register_craft({ + output = "mcl_compressed_blocks:sextuple_compressed_cobblestone 9", + recipe = { + { "mcl_compressed_blocks:septuple_compressed_cobblestone" }, + }, +}) + +minetest.register_craft({ + output = "mcl_compressed_blocks:octuple_compressed_cobblestone", + recipe = { + { "mcl_compressed_blocks:septuple_compressed_cobblestone", "mcl_compressed_blocks:septuple_compressed_cobblestone", "mcl_compressed_blocks:septuple_compressed_cobblestone" }, + { "mcl_compressed_blocks:septuple_compressed_cobblestone", "mcl_compressed_blocks:septuple_compressed_cobblestone", "mcl_compressed_blocks:septuple_compressed_cobblestone" }, + { "mcl_compressed_blocks:septuple_compressed_cobblestone", "mcl_compressed_blocks:septuple_compressed_cobblestone", "mcl_compressed_blocks:septuple_compressed_cobblestone" }, + }, +}) + +minetest.register_craft({ + output = "mcl_compressed_blocks:septuple_compressed_cobblestone 9", + recipe = { + { "mcl_compressed_blocks:octuple_compressed_cobblestone" }, + }, +}) diff --git a/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_compressed_cobblestone.png b/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_compressed_cobblestone.png new file mode 100644 index 000000000..30ba3c4a1 Binary files /dev/null and b/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_compressed_cobblestone.png differ diff --git a/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_double_compressed_cobblestone.png b/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_double_compressed_cobblestone.png new file mode 100644 index 000000000..593422c03 Binary files /dev/null and b/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_double_compressed_cobblestone.png differ diff --git a/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_octuple_compressed_cobblestone.png b/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_octuple_compressed_cobblestone.png new file mode 100644 index 000000000..b8d302487 Binary files /dev/null and b/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_octuple_compressed_cobblestone.png differ diff --git a/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_quadruple_compressed_cobblestone.png b/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_quadruple_compressed_cobblestone.png new file mode 100644 index 000000000..ac897b8c0 Binary files /dev/null and b/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_quadruple_compressed_cobblestone.png differ diff --git a/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_quintuple_compressed_cobblestone.png b/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_quintuple_compressed_cobblestone.png new file mode 100644 index 000000000..d82c648b4 Binary files /dev/null and b/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_quintuple_compressed_cobblestone.png differ diff --git a/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_septuple_compressed_cobblestone.png b/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_septuple_compressed_cobblestone.png new file mode 100644 index 000000000..75bfd2d49 Binary files /dev/null and b/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_septuple_compressed_cobblestone.png differ diff --git a/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_sextuple_compressed_cobblestone.png b/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_sextuple_compressed_cobblestone.png new file mode 100644 index 000000000..4ffce6d77 Binary files /dev/null and b/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_sextuple_compressed_cobblestone.png differ diff --git a/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_triple_compressed_cobblestone.png b/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_triple_compressed_cobblestone.png new file mode 100644 index 000000000..d42c7bf29 Binary files /dev/null and b/mods/ITEMS/mcl_compressed_blocks/textures/mcl_compressed_blocks_triple_compressed_cobblestone.png differ diff --git a/mods/ITEMS/mcl_copper/crafting.lua b/mods/ITEMS/mcl_copper/crafting.lua index 41084afb3..9b0976d3a 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" }, @@ -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 _, c in ipairs(cuttable_blocks) do + mcl_stonecutter.register_recipe("mcl_copper:"..c, "mcl_copper:"..c.."_cut", 4) +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. 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 f36d5cabd..db2561082 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_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 33a34f899..0de0e9abd 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -11,12 +11,39 @@ local function rotate_climbable(pos, node, user, mode) return false end +---Updates the trapdoor above (if any). +--- +---@param pos mt.Vector The position of the ladder. +---@param event "place" | "destruct" The place or destruct 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) + + 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") + elseif event == "destruct" then + new_name = string.gsub(new_name, "ladder$", "open") + end + + -- If node above is an opened trapdoor + 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", @@ -26,14 +53,21 @@ 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 = {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 @@ -53,7 +87,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 @@ -75,12 +109,17 @@ 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 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.4, _mcl_hardness = 0.4, on_rotate = rotate_climbable, @@ -89,9 +128,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", @@ -107,9 +147,19 @@ 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, + ladder = 1 }, sounds = mcl_sounds.node_sound_leaves_defaults(), drop = "", @@ -151,7 +201,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 @@ -174,13 +224,19 @@ 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 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_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_crimson/init.lua b/mods/ITEMS/mcl_crimson/init.lua index cd9c9354c..87f1b63bf 100644 --- a/mods/ITEMS/mcl_crimson/init.lua +++ b/mods/ITEMS/mcl_crimson/init.lua @@ -663,6 +663,22 @@ mcl_dye.register_on_bone_meal_apply(function(pt,user) end end) +minetest.register_abm({ + label = "Turn Crimson Nylium and Warped Nylium below solid block into Netherrack", + nodenames = {"mcl_crimson:crimson_nylium","mcl_crimson:warped_nylium"}, + neighbors = {"group:solid"}, + interval = 8, + chance = 50, + action = function(pos, node) + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local name = minetest.get_node(above).name + local nodedef = minetest.registered_nodes[name] + if name ~= "ignore" and nodedef and (nodedef.groups and nodedef.groups.solid) then + minetest.set_node(pos, {name = "mcl_nether:netherrack"}) + end + end +}) + mcl_doors:register_door("mcl_crimson:crimson_door", { description = S("Crimson Door"), _doc_items_longdesc = S("Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal."), @@ -808,4 +824,4 @@ minetest.register_craft({ } }) -dofile(modpath.."/alias.lua") \ No newline at end of file +dofile(modpath.."/alias.lua") 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/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. 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 diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index 5b7a0e5d0..8bbefdda3 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -67,12 +67,23 @@ 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) - tmp_node = {name=name.."_open", param1=me.param1, param2=me.param2} + 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.offset(pos, 0, -1, 0)) + local name_end = "_open" + + -- Checking if there is something underneath the trapdoor + if bottom_node then + local is_ladder = minetest.get_item_group(bottom_node.name, "ladder") + if is_ladder > 0 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 @@ -89,20 +100,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 @@ -128,7 +141,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, @@ -143,13 +156,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 @@ -164,7 +179,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 @@ -193,16 +208,44 @@ function mcl_doors:register_trapdoor(name, def) groups_open.trapdoor = 2 groups_open.not_in_creative_inventory = 1 - minetest.register_node(name.."_open", { + -- Non-climbable opened + 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", + 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, + }) + + -- Climbable opened + minetest.register_node(name .. "_ladder", { + drawtype = "nodebox", + tiles = tiles_open, + use_texture_alpha = "clip", is_ground_content = false, paramtype = "light", paramtype2 = "facedir", - -- TODO: Implement Minecraft behaviour: Climbable if directly above - -- ladder w/ matching orientation. - -- Current behavour: Always climbable climbable = true, sunlight_propagates = true, pointable = true, @@ -213,19 +256,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 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_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_dye/locale/mcl_dye.pl.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.pl.tr index 921983ec0..85e5b9605 100644 --- a/mods/ITEMS/mcl_dye/locale/mcl_dye.pl.tr +++ b/mods/ITEMS/mcl_dye/locale/mcl_dye.pl.tr @@ -1,5 +1,5 @@ # textdomain: mcl_dye -White Dye=Biały farba +White Dye=Biała farba Light Grey Dye=Jasnoszara farba Grey Dye=Szara farba Black Dye=Czarny farba 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_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index f137b4230..591dfb679 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 @@ -276,11 +280,73 @@ 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 + 3 * 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 added_v = 0 + local invul = player:get_meta():get_int("mcl_damage:invulnerable") + if v and v.y <= 0.01 and v.y >= -0.01 and invul == 0 then + local regular_v = 6.4 + local enchant_v = 7 + regular_v = regular_v * math.abs(dir.y - 1) + enchant_v = enchant_v * math.abs(dir.y - 1) + if enchant == 0 then + player:add_velocity({x = 0, y = regular_v, z = 0}) + added_v = regular_v + else + player:add_velocity({x = 0, y = enchant_v, z = 0}) + added_v = enchant_v + end + -- add minimum knockback + if knockback <= 1.5 then + knockback = knockback + 4.875 + elseif knockback <= 6.19 then + knockback = knockback + 0.609375 + end + end + -- counteract forward velocity when hit + local self_dir_dot = (v.x * dir.x) + (v.z * dir.z) + if self_dir_dot < 0 then + player:add_velocity({x = v.x * -1, y = 0, z = v.z * -1}) + end + -- add player velocity to knockback + local h_name = hitter:get_player_name() + local hv = hitter:get_velocity() + local dir_dot = (hv.x * dir.x) + (hv.z * dir.z) + local hitter_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) + if dir_dot > 0 and mcl_sprint.is_sprinting(h_name) then + knockback = knockback + hitter_mag * 0.6875 + elseif dir_dot > 0 then + knockback = knockback + hitter_mag * 0.515625 + end + -- reduce floatiness + minetest.after(0.25, function() + player:add_velocity({x = 0, y = (v.y + added_v) * -0.375, z = 0}) + end) + -- reduce knockback when moving towards hitter while attacking + local self_dir_dot = (v.x * dir.x) + (v.z * dir.z) + local control = player:get_player_control() + if self_dir_dot < -4.3 and control.up and control.LMB then + knockback = knockback * 0.6 + end + -- remove knockback if invulnerable + if invul > 0 then + knockback = 0 + end + elseif hitter and hitter:is_player() and distance > 3 then + knockback = 0 elseif luaentity and luaentity._knockback then - 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 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) 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. 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.= diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua index 82f6e76e4..7baa22c0f 100644 --- a/mods/ITEMS/mcl_end/building.lua +++ b/mods/ITEMS/mcl_end/building.lua @@ -59,16 +59,18 @@ minetest.register_node("mcl_end:purpur_pillar", { _mcl_hardness = 1.5, }) -minetest.register_node("mcl_end:end_rod", { +local end_rod_name = "mcl_end:end_rod" +local end_rod_side_tex = "mcl_end_end_rod_side.png" +local end_rod_def = { description = S("End Rod"), _doc_items_longdesc = S("End rods are decorative light sources."), tiles = { "mcl_end_end_rod_top.png", "mcl_end_end_rod_bottom.png", - "mcl_end_end_rod_side.png", - "mcl_end_end_rod_side.png", - "mcl_end_end_rod_side.png", - "mcl_end_end_rod_side.png", + end_rod_side_tex, + end_rod_side_tex, + end_rod_side_tex, + end_rod_side_tex, }, drawtype = "nodebox", is_ground_content = false, @@ -76,7 +78,7 @@ minetest.register_node("mcl_end:end_rod", { paramtype2 = "facedir", light_source = minetest.LIGHT_MAX, sunlight_propagates = true, - groups = { dig_immediate=3, deco_block=1, destroy_by_lava_flow=1, }, + groups = { dig_immediate=3, deco_block=1, destroy_by_lava_flow=1, end_rod=1 }, node_box = { type = "fixed", fixed = { @@ -132,7 +134,58 @@ minetest.register_node("mcl_end:end_rod", { sounds = mcl_sounds.node_sound_glass_defaults(), _mcl_blast_resistance = 0, -}) +} +minetest.register_node(end_rod_name, end_rod_def) + +-- register colored end_rods +local colored_end_rods = { + {"white", S("White End Rod"), "white"}, + {"grey", S("Grey End Rod"), "dark_grey"}, + {"silver", S("Light Grey End Rod"), "grey"}, + {"black", S("Black End Rod"), "black"}, + {"red", S("Red End Rod"), "red"}, + {"yellow", S("Yellow End Rod"), "yellow"}, + {"green", S("Green End Rod"), "dark_green"}, + {"cyan", S("Cyan End Rod"), "cyan"}, + {"blue", S("Blue End Rod"), "blue"}, + {"magenta", S("Magenta End Rod"), "magenta"}, + {"orange", S("Orange End Rod"), "orange"}, + {"purple", S("Purple End Rod"), "violet"}, + {"brown", S("Brown End Rod"), "brown"}, + {"pink", S("Pink End Rod"), "pink"}, + {"lime", S("Lime End Rod"), "green"}, + {"lightblue", S("Light Blue End Rod"), "lightblue"}, +} +local top_mask = "^[mask:mobs_mc_empty.png\\^[fill\\:2x2\\:7,7\\:white" +local side_mask = "^[mask:mobs_mc_empty.png\\^[fill\\:16x15\\:0,0\\:white" +for num, row in ipairs(colored_end_rods) do + local name = row[1] + local desc = row[2] + local dye = row[3] + local def = table.copy(end_rod_def) + def.description = desc + def._doc_items_longdesc = nil + def._doc_items_create_entry = false + local side_tex + if name == "pink" then + def.tiles[1] = def.tiles[1] .. "^(" .. def.tiles[1] .. top_mask .. "^[multiply:" .. name .. "^[hsl:0:300)" + side_tex = end_rod_side_tex .. "^(" .. end_rod_side_tex .. side_mask .. "^[multiply:" .. name .. "^[hsl:0:300)" + elseif num > 4 then + def.tiles[1] = def.tiles[1] .. "^(" .. def.tiles[1] .. top_mask .. "^[multiply:" .. name .. "^[hsl:0:300^[opacity:120)" + side_tex = end_rod_side_tex .. "^(" .. end_rod_side_tex .. side_mask .. "^[multiply:" .. name .. "^[hsl:0:300^[opacity:120)" + else + def.tiles[1] = def.tiles[1] .. "^(" .. def.tiles[1] .. top_mask .. "^[multiply:" .. name .. "^[hsl:0:-100^[opacity:170)" + side_tex = end_rod_side_tex .. "^(" .. end_rod_side_tex .. side_mask .. "^[multiply:" .. name .. "^[hsl:0:-100^[opacity:170)" + end + for i=3, 6 do def.tiles[i] = side_tex end + minetest.register_node(end_rod_name.."_"..name, def) + minetest.register_craft({ + type = "shapeless", + output = end_rod_name.."_"..name, + recipe = {"group:end_rod", "mcl_dye:"..dye} + }) +end + minetest.register_node("mcl_end:dragon_egg", { description = S("Dragon Egg"), @@ -211,3 +264,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/locale/mcl_end.de.tr b/mods/ITEMS/mcl_end/locale/mcl_end.de.tr index 69a3408bb..9fb4c6b88 100644 --- a/mods/ITEMS/mcl_end/locale/mcl_end.de.tr +++ b/mods/ITEMS/mcl_end/locale/mcl_end.de.tr @@ -5,6 +5,22 @@ Purpur Block=Purpurblock Purpur Pillar=Purpursäule End Rod=Endstab End rods are decorative light sources.=Endstäbe sind dekorative Lichtquellen. +White End Rod=Weißer Endstab +Grey End Rod=Grauer Endstab +Light Grey End Rod=Hellgrauer Endstab +Black End Rod=Schwarzer Endstab +Red End Rod=Roter Endstab +Yellow End Rod=Gelber Endstab +Green End Rod=Grüner Endstab +Cyan End Rod=Türkiser Endstab +Blue End Rod=Blauer Endstab +Magenta End Rod=Magenta Endstab +Orange End Rod=Orange Endstab +Purple End Rod=Violetter Endstab +Brown End Rod=Brauner Endstab +Pink End Rod=Rosa Endstab +Lime End Rod=Lindgrüner Endstab +Light Blue End Rod=Hellblauer Endstab Dragon Egg=Drachenei A dragon egg is a decorative item which can be placed.=Ein Drahenei ist ein dekorativer, platzierbarer Gegenstand. Chorus Flower=Chorusblume diff --git a/mods/ITEMS/mcl_end/locale/mcl_end.pl.tr b/mods/ITEMS/mcl_end/locale/mcl_end.pl.tr index e6526b265..e159f738b 100644 --- a/mods/ITEMS/mcl_end/locale/mcl_end.pl.tr +++ b/mods/ITEMS/mcl_end/locale/mcl_end.pl.tr @@ -5,6 +5,22 @@ Purpur Block=Blok purpury Purpur Pillar=Filar purpury End Rod=Różdżka Kresu End rods are decorative light sources.=Różdżki Kresu są dekoracyjnymi źródłami światła. +White End Rod=Biała Różdżka Kresu +Grey End Rod=Szara Różdżka Kresu +Light Grey End Rod=Jasnoszara Różdżka Kresu +Black End Rod=Czarna Różdżka Kresu +Red End Rod=Czerwona Różdżka Kresu +Yellow End Rod=Żółta Różdżka Kresu +Green End Rod=Zielona Różdżka Kresu +Cyan End Rod=Błękitna Różdżka Kresu +Blue End Rod=Niebieska Różdżka Kresu +Magenta End Rod=Karmazynowa Różdżka Kresu +Orange End Rod=Pomarańczowa Różdżka Kresu +Purple End Rod=Fioletowa Różdżka Kresu +Brown End Rod=Brązowa Różdżka Kresu +Pink End Rod=Różowa Różdżka Kresu +Lime End Rod=Jasnozielona Różdżka Kresu +Light Blue End Rod=Jasnoniebieska Różdżka Kresu Dragon Egg=Jajo smoka A dragon egg is a decorative item which can be placed.=Jajo smoka jest przedmiotem dekoracyjnym, który można postawić. Chorus Flower=Kwiat refrenusu diff --git a/mods/ITEMS/mcl_end/locale/template.txt b/mods/ITEMS/mcl_end/locale/template.txt index 08c7de07b..4040b3756 100644 --- a/mods/ITEMS/mcl_end/locale/template.txt +++ b/mods/ITEMS/mcl_end/locale/template.txt @@ -5,6 +5,22 @@ Purpur Block= Purpur Pillar= End Rod= End rods are decorative light sources.= +White End Rod= +Grey End Rod= +Light Grey End Rod= +Black End Rod= +Red End Rod= +Yellow End Rod= +Green End Rod= +Cyan End Rod= +Blue End Rod= +Magenta End Rod= +Orange End Rod= +Purple End Rod= +Brown End Rod= +Pink End Rod= +Lime End Rod= +Light Blue End Rod= Dragon Egg= A dragon egg is a decorative item which can be placed.= Chorus Flower= 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_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 diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua index 7387a78c9..47c2a0ddf 100644 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ b/mods/ITEMS/mcl_farming/pumpkin.lua @@ -38,7 +38,7 @@ local stem_drop = { { items = {"mcl_farming:pumpkin_seeds 2"}, rarity = 31 }, -- 3 seeds: 1/125 chance - { items = {"mcl_farming:pumkin_seeds 3"}, rarity = 125 }, + { items = {"mcl_farming:pumpkin_seeds 3"}, rarity = 125 }, }, } @@ -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 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..69349e48b --- /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=Aberto por jogadores e sinal de redstone 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 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 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: 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 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. 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_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 diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index e89d01b65..75e133322 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(), @@ -194,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 @@ -238,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, @@ -252,7 +263,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, @@ -336,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) @@ -347,14 +359,14 @@ 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", 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 }, @@ -384,9 +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) - --- 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) +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/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. 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..fb9dfc7cf --- /dev/null +++ b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj @@ -0,0 +1,59 @@ +# Blender 3.6.4 +# www.blender.org +mtllib mcl_flowers_sunflower.mtl +o Stem_1 +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 +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.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 +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.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 +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.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 +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 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_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 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. 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ê. 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. diff --git a/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr b/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr index 90382020a..f22ae7702 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 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 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. 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_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 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_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. 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_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 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 = { 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. 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'. 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 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. 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 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. 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 diff --git a/mods/ITEMS/mcl_mud/init.lua b/mods/ITEMS/mcl_mud/init.lua index 64ff36c09..3c3e66a99 100644 --- a/mods/ITEMS/mcl_mud/init.lua +++ b/mods/ITEMS/mcl_mud/init.lua @@ -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_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. diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index 548bd90d5..252768df5 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 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. + 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_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/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! 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_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. 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, 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 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 000000000..ddd6a4e90 Binary files /dev/null and b/mods/ITEMS/mcl_shepherd/sounds/shepherd-midnight.ogg differ 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 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 diff --git a/mods/ITEMS/mcl_signs/signs_api.lua b/mods/ITEMS/mcl_signs/signs_api.lua index 7ada6a646..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", @@ -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. 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..996dcf8a9 --- 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 @@ -156,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 @@ -181,27 +195,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/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..5c42b2488 --- /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 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({ 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 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 diff --git a/mods/ITEMS/mcl_spyglass/init.lua b/mods/ITEMS/mcl_spyglass/init.lua index fa1a82339..afa7adaf4 100644 --- a/mods/ITEMS/mcl_spyglass/init.lua +++ b/mods/ITEMS/mcl_spyglass/init.lua @@ -17,6 +17,15 @@ minetest.register_craft({ } }) +mcl_fovapi.register_modifier({ + name = "spyglass", + fov_factor = 8, + time = 0.1, + reset_time = 0, + is_multiplier = false, + exclusive = true, +}) + local spyglass_scope = {} local function add_scope(player) @@ -29,6 +38,12 @@ local function add_scope(player) text = "mcl_spyglass_scope.png", }) player:hud_set_flags({wielditem = false}) + if mcl_util.is_it_christmas() then + local time = minetest.get_timeofday() + if (time < 0.01 or time > 0.99) and player:get_look_vertical() < -1.335 then + player:set_moon({texture = "mcl_moon_special.png"}) + end + end end end @@ -37,25 +52,31 @@ 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 controls.register_on_press(function(player, key) - if key ~= "RMB" then return end - add_scope(player) + if key ~= "RMB" and key ~= "zoom" then return end + if spyglass_scope[player] == nil then + add_scope(player) + end end) controls.register_on_release(function(player, key, time) - if key ~= "RMB" then return end + if key ~= "RMB" and key ~= "zoom" then return end + local ctrl = player:get_player_control() + if key == "RMB" and ctrl.zoom or key == "zoom" and ctrl.place then return end remove_scope(player) end) controls.register_on_hold(function(player, key, time) - if key ~= "RMB" then return end + if key ~= "RMB" and key ~= "zoom" 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 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. 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/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 eee4c5dc2..546be8112 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -30,7 +30,18 @@ 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}, + {"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}, + {"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}, @@ -39,43 +50,127 @@ mcl_stairs.register_slab("stone", "mcl_core:stone_smooth", 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}, + {"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}, + {"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}, + {"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}, + {"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}, + {"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}, + {"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}, + {"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}, + {"default_cobble.png"}, + S("Cobblestone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Cobblestone Slab")) -mcl_stairs.register_stair("sandstone", "group:normal_sandstone", +mcl_stairs.register_stair("mossycobble", "mcl_core:mossycobble", + {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}, + {"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}, + {"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}, + {"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}, {"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}, {"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("redsandstone", "group:red_sandstone", +mcl_stairs.register_stair("sandstonesmooth2", "mcl_core:sandstonesmooth2", + {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}, + {"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}, {"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}, {"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}, + {"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}, + {"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", @@ -91,20 +186,30 @@ 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}, {"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}, {"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}, + {"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}, + {"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}, @@ -121,27 +226,73 @@ mcl_stairs.register_stair_and_slab("red_nether_brick", "mcl_nether:red_nether_br 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}, + {"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", +mcl_stairs.register_stair("purpur_block", "mcl_end:purpur_block", {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", "group:purpur_block", +mcl_stairs.register_slab("purpur_block", "mcl_end:purpur_block", {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_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}, + {{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}, + {{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}, + {"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}, + {"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}, + {"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}, + {"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}, + {"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}, diff --git a/mods/ITEMS/mcl_stonecutter/README.md b/mods/ITEMS/mcl_stonecutter/README.md index c6316a5a2..7fd31aa97 100644 --- a/mods/ITEMS/mcl_stonecutter/README.md +++ b/mods/ITEMS/mcl_stonecutter/README.md @@ -2,10 +2,24 @@ 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 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 + +### 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 +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 e75884990..9284d2a9c 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -2,10 +2,371 @@ --||||| STONECUTTER ||||| --||||||||||||||||||||||| --- TO-DO: --- * Add GUI +-- 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: +-- * 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(minetest.get_current_modname()) + +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 = {} + + +---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 + 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) + end + + if not minetest.registered_items[output] then + error("Output is not a registered item: " .. output) + end + + count = count or 1 + + if not mcl_stonecutter.registered_recipes[input] then + mcl_stonecutter.registered_recipes[input] = {} + end + + mcl_stonecutter.registered_recipes[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 * count) + 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 * count) + end + end + end +end + +---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 + +---@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 + +-- 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 +local function build_stonecutter_formspec(player, items) + local meta = player:get_meta() + local selected = meta:get_string("mcl_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 = 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]", + + -- 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;]", + + -- 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 + + +---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("mcl_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") + 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") + player:get_inventory():set_list("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("mcl_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) + 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) + end + else + inv:set_stack("stonecutter_output", 1, nil) + end + else + 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") + player:get_inventory():set_list("stonecutter_output", {}) + 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) + player:get_meta():set_string("mcl_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 + + if inventory_info.from_list == "stonecutter_output" then + 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 + 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("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 + 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, crafted_count) + local meta = player:get_meta() + 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") + + -- selected should normally never be nil, but just in case + if selected and recipes then + local recipe = recipes[selected] + 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) + end +end + +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, inventory_info.count) + 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, inventory_info.stack:get_count()) + update_stonecutter_slots(player) + end + end +end) minetest.register_node("mcl_stonecutter:stonecutter", { description = S("Stone Cutter"), @@ -16,36 +377,45 @@ 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 = 0.15 + } + } }, 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_rightclick = function(pos, node, player, itemstack) + if not player:get_player_control().sneak then + mcl_stonecutter.show_stonecutter_form(player) + end + end, }) minetest.register_craft({ 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. diff --git a/mods/ITEMS/mcl_stonecutter/mod.conf b/mods/ITEMS/mcl_stonecutter/mod.conf index d9781e474..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 +depends = mcl_sounds, mcl_util 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/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 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 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 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 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. 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 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/locale/mcl_walls.pt_BR.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr new file mode 100644 index 000000000..8d06a55d1 --- /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 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 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 diff --git a/mods/ITEMS/mcl_walls/register.lua b/mods/ITEMS/mcl_walls/register.lua index 96a1b9b9f..c2859935e 100644 --- a/mods/ITEMS/mcl_walls/register.lua +++ b/mods/ITEMS/mcl_walls/register.lua @@ -14,4 +14,4 @@ mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean 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:mudbrick", S("Mud Brick Wall"), "mcl_mud:mud_bricks") 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. 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 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 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 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", 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. 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.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 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 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! 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 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..5a2688d67 --- /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.=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 +@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! 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. 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) 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) diff --git a/mods/PLAYER/mcl_fovapi/api.md b/mods/PLAYER/mcl_fovapi/api.md new file mode 100644 index 000000000..d4a9cb1fb --- /dev/null +++ b/mods/PLAYER/mcl_fovapi/api.md @@ -0,0 +1,82 @@ +### 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) + + +#### Description +This API defines and applies different Field Of View effects to players via MODIFIERS. + +#### 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. + +#### Modifier Definition +```lua +def = { + 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, +} +``` +* 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.) + 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 + 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. + +Note: passing incorrect values in the definition will have unintended consequences. + +#### Global MCL_FOVAPI Tables +There are three tables that are accessible via the API. They are `registered_modifiers` and `applied_modifiers`. + +`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. + +#### Namespaces +`mcl_fovapi` is the default API Namespace. + +#### Functions +`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. + +`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 new file mode 100644 index 000000000..92815d833 --- /dev/null +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -0,0 +1,232 @@ +--- +--- Copyright 2023, Michieal. +--- License: GPL3. (Default Mineclone2 License) +--- Created by michieal. +--- DateTime: 12/2/23 5:47 AM +--- + +-- Locals (and cached) +local DEBUG = false -- debug constant for troubleshooting. +local pairs = pairs + +-- Globals +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 player_name = player:get_player_name() + + -- handle clean up + mcl_fovapi.applied_modifiers[player_name] = nil +end) + +function mcl_fovapi.register_modifier(def) + if type(def.name) ~= "string" then + error("Modifier name must be a string") + end + if type(def.fov_factor) ~= "number" then + error("FOV factor must be a number") + end + 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") + 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 + 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 + 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[def.name] = mdef + +end + +minetest.register_on_respawnplayer(function(player) + mcl_fovapi.remove_all_modifiers(player) +end) + +function mcl_fovapi.apply_modifier(player, modifier_name) + if not player or not modifier_name then + return + end + if mcl_fovapi.registered_modifiers[modifier_name] == nil 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 + + 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 then + modifier.on_start(player) + end + + 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_name])) + end + + if DEBUG then + minetest.log("FOV::Modifier applied to player:" .. player_name .. " 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. + 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, modifier.time) + end + end + +end + +function mcl_fovapi.remove_modifier(player, modifier_name) + if not player or not modifier_name then + return + end + + 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 + minetest.log("FOV::Player: " .. player_name .. " modifier: " .. modifier_name .. "removed.") + end + + 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_name]) do + applied[k] = mcl_fovapi.registered_modifiers[k] + end + + local elem = next + if elem(applied) == nil then + player:set_fov(0, false, modifier.reset_time) + return + end + local exc = false + for k, _ in pairs(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. + local fov_factor = 1 + 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, not non_multiplier_added, modifier.reset_time) + end + + 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 not player then + return + end + + local player_name = player:get_player_name() + if DEBUG then + minetest.log("FOV::Player: " .. player_name .. " modifiers have been reset.") + end + + 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) +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. + +--]] diff --git a/mods/PLAYER/mcl_fovapi/mod.conf b/mods/PLAYER/mcl_fovapi/mod.conf new file mode 100644 index 000000000..3aff902a1 --- /dev/null +++ b/mods/PLAYER/mcl_fovapi/mod.conf @@ -0,0 +1,3 @@ +name = mcl_fovapi +author = Michieal, Herowl +description = An API for handling FOV changes. diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index 321139c5f..ff625a5f7 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 0.5 - if food_tick_timer > 4.0 then + if food_tick_timer > 4 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/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. 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 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 diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 288b697e1..0e666aa5b 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) @@ -228,6 +228,11 @@ 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) + 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 diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 99da0a01a..e3d323854 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -657,11 +657,14 @@ 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, 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} @@ -671,6 +674,11 @@ 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() + minetest.log("warning", name .. " joined the game with 0 hp and has been forced to respawn") + end end) -- clear when player leaves @@ -721,6 +729,44 @@ mcl_damage.register_modifier(function(obj, damage, reason) end 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() + 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 + end + 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:damage_animation", 1) + minetest.after(0.5, function() + player:get_meta():set_int("mcl_damage:damage_animation", 0) + end) + end + end +end) + minetest.register_on_respawnplayer(function(player) local pos = player:get_pos() minetest.add_particlespawner({ 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 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= 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. 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 diff --git a/mods/PLAYER/mcl_sprint/mod.conf b/mods/PLAYER/mcl_sprint/mod.conf index 0d20f80a3..b8bc02698 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 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..3e45fee4e --- /dev/null +++ b/releasenotes/0_85-the_fire_and_stone_release.md @@ -0,0 +1,108 @@ +## 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 +* 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. + +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 +* 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 + +### 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 + diff --git a/releasenotes/0_86-the_another_look_release.md b/releasenotes/0_86-the_another_look_release.md new file mode 100644 index 000000000..330fbf97c --- /dev/null +++ b/releasenotes/0_86-the_another_look_release.md @@ -0,0 +1,50 @@ +## 0.86 – The Another Look release + +### Contributors +#### New contributors +* JoseDouglas26 +* Zasco + +### FOV API +Field of Vision control now goes through a new API using a modifier system, made by Michieal and Herowl. With these changes, sprint, bow drawing and spyglass should alter the FOV properly, as well as take into account the FOV set in Minetest settings. This also paves the way to more mechanics changing FOV in future updates. + +### Mob improvements +Shulker received an update by Bakawun (pulling some of the Mineclonia changes by cora). Animation usage got some fixes, and bullets are now slower but homing. Also it's fire rate is now variable. + +With the shulker update, other mobs (including those from mods) can now have homing bullets added with ease, as well as do custom things after each attack (like change the fire rate, which shulker now does). + +Slimes and Magma Cubes got rebalanced by Herowl, to make them work better with the player attack reach changes from the previous update (0.85 – Fire and Stone). + +Vexes and Evokers got some changes and fixes by Herowl to make them more manageable to fight while still being formidable enemies. + +### Shepherd functionality +A shepherd staff was added by Herowl, which allows you to lead your sheep without the risk of them eating the item you're luring them with. It can also serve as a weak weapon (to defend your sheep, of course). You can now collect sheep easier while travelling. Remember to take care of your sheep, also at night, and especially during the Christmastide. Speaking of Christmas, I've heard something changed about the moon. If you have trouble noticing that, maybe use the dedicated tools to take a closer look up. + +### Sunflower update +Sunflower now has a custom mesh by JoseDouglas26 (with minor tweaks from Herowl), which means it looks better and is oriented towards East properly. Thanks to the changes, it is also easier to make more mesh-based tall flowers in the future. + +### Animation updates +Animations of Stonecutter and Campfires were made more dynamic by Wbjitscool. + +### Mapgen settings +The setting disabling deepslate generation now works properly thanks to Zasco. + +### Translation updates +* Spanish by megustanlosfrijoles +* Brazilian Portuguese by JoseDouglas26 +* Syntax fixes in various translation-related files by megustanlosfrijoles + +### Crash fixes +* Villager trading UI crash by JoseDouglas26 +* Piston related crash by cora + +## 0.86.1 hotfix +* Implemented a fix to a graphical glitch regression introduced in release 0.86, which had been fixed but wasn't loaded into the tag. +* Added a workaround to enable mobile players to use bows, crossbows and spyglasses by using zoom key (they can't *hold* `place`). +(both fixes by Herowl) + +## 0.86.2 hotfix +* Implemented refactorization of player-related combat code by Eliy21. This fixes a critical bug which can cause players to become invulnerable indefinitely. +* Optimized some textures for size. +* Fixed XP orbs breaking randomly (by Herowl). +* Fixed a cryptic error message (by Herowl). diff --git a/settingtypes.txt b/settingtypes.txt index 82086de14..f5743bc1d 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. @@ -95,6 +98,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: 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 # affect mob spawners. @@ -290,6 +297,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 diff --git a/textures/awards_ui_icon.png b/textures/awards_ui_icon.png index c8163008f..dbc532121 100644 Binary files a/textures/awards_ui_icon.png and b/textures/awards_ui_icon.png differ diff --git a/textures/crafting_formspec_arrow.png b/textures/crafting_formspec_arrow.png index 12b9c1970..2663c091d 100644 Binary files a/textures/crafting_formspec_arrow.png and b/textures/crafting_formspec_arrow.png differ diff --git a/textures/credits_bg.png b/textures/credits_bg.png index 280f29def..9ca12390b 100644 Binary files a/textures/credits_bg.png and b/textures/credits_bg.png differ diff --git a/textures/doc_basics_craft_groups_1.png b/textures/doc_basics_craft_groups_1.png index 4093c50b1..d7fe37d0d 100644 Binary files a/textures/doc_basics_craft_groups_1.png and b/textures/doc_basics_craft_groups_1.png differ diff --git a/textures/doc_basics_craft_groups_2.png b/textures/doc_basics_craft_groups_2.png index a70bdde42..292eb8259 100644 Binary files a/textures/doc_basics_craft_groups_2.png and b/textures/doc_basics_craft_groups_2.png differ diff --git a/textures/doc_basics_craft_groups_3.png b/textures/doc_basics_craft_groups_3.png index 60a568be0..d912a344e 100644 Binary files a/textures/doc_basics_craft_groups_3.png and b/textures/doc_basics_craft_groups_3.png differ diff --git a/textures/doc_basics_gameplay_moontest.png b/textures/doc_basics_gameplay_moontest.png index 82350d8cc..bbface652 100644 Binary files a/textures/doc_basics_gameplay_moontest.png and b/textures/doc_basics_gameplay_moontest.png differ diff --git a/textures/doc_basics_gameplay_mtg_2.png b/textures/doc_basics_gameplay_mtg_2.png index 68c8a5063..803e66af3 100644 Binary files a/textures/doc_basics_gameplay_mtg_2.png and b/textures/doc_basics_gameplay_mtg_2.png differ diff --git a/textures/doc_basics_hotbar.png b/textures/doc_basics_hotbar.png index 6a8f82ffc..810b841f7 100644 Binary files a/textures/doc_basics_hotbar.png and b/textures/doc_basics_hotbar.png differ diff --git a/textures/doc_basics_hotbar_relations.png b/textures/doc_basics_hotbar_relations.png index b63943880..a5f0fb71a 100644 Binary files a/textures/doc_basics_hotbar_relations.png and b/textures/doc_basics_hotbar_relations.png differ diff --git a/textures/doc_basics_items_dropped.png b/textures/doc_basics_items_dropped.png index 2d4b92450..488f7c279 100644 Binary files a/textures/doc_basics_items_dropped.png and b/textures/doc_basics_items_dropped.png differ diff --git a/textures/doc_basics_light_test.png b/textures/doc_basics_light_test.png index 9b4a24f5a..8a8dd14a0 100644 Binary files a/textures/doc_basics_light_test.png and b/textures/doc_basics_light_test.png differ diff --git a/textures/doc_basics_light_torch.png b/textures/doc_basics_light_torch.png index 0fc840595..4296d97a9 100644 Binary files a/textures/doc_basics_light_torch.png and b/textures/doc_basics_light_torch.png differ diff --git a/textures/doc_basics_liquids_nonrenewable.png b/textures/doc_basics_liquids_nonrenewable.png index f38bbb316..c345b05b1 100644 Binary files a/textures/doc_basics_liquids_nonrenewable.png and b/textures/doc_basics_liquids_nonrenewable.png differ diff --git a/textures/doc_basics_liquids_renewable_1.png b/textures/doc_basics_liquids_renewable_1.png index 67691081e..99f99f914 100644 Binary files a/textures/doc_basics_liquids_renewable_1.png and b/textures/doc_basics_liquids_renewable_1.png differ diff --git a/textures/doc_basics_liquids_renewable_2.png b/textures/doc_basics_liquids_renewable_2.png index 63a5cea1b..d8c252bba 100644 Binary files a/textures/doc_basics_liquids_renewable_2.png and b/textures/doc_basics_liquids_renewable_2.png differ diff --git a/textures/doc_basics_minimap_map.png b/textures/doc_basics_minimap_map.png index 63f4a9bac..779211a06 100644 Binary files a/textures/doc_basics_minimap_map.png and b/textures/doc_basics_minimap_map.png differ diff --git a/textures/doc_basics_minimap_round.png b/textures/doc_basics_minimap_round.png index 4f6753dac..0e09ba1fb 100644 Binary files a/textures/doc_basics_minimap_round.png and b/textures/doc_basics_minimap_round.png differ diff --git a/textures/doc_basics_players_lott.png b/textures/doc_basics_players_lott.png index 13419b8e8..509c3f3ff 100644 Binary files a/textures/doc_basics_players_lott.png and b/textures/doc_basics_players_lott.png differ diff --git a/textures/doc_basics_players_sam.png b/textures/doc_basics_players_sam.png index 4281ca588..4a1350bcf 100644 Binary files a/textures/doc_basics_players_sam.png and b/textures/doc_basics_players_sam.png differ diff --git a/textures/doc_basics_pointing.png b/textures/doc_basics_pointing.png index dda1580f1..da30c11ff 100644 Binary files a/textures/doc_basics_pointing.png and b/textures/doc_basics_pointing.png differ diff --git a/textures/doc_basics_sneak.png b/textures/doc_basics_sneak.png index bcde6ce52..8f32a8297 100644 Binary files a/textures/doc_basics_sneak.png and b/textures/doc_basics_sneak.png differ diff --git a/textures/mcl_boats_cherry_boat.png b/textures/mcl_boats_cherry_boat.png index 0929c1455..bbece2201 100644 Binary files a/textures/mcl_boats_cherry_boat.png and b/textures/mcl_boats_cherry_boat.png differ diff --git a/textures/mcl_boats_cherry_chest_boat.png b/textures/mcl_boats_cherry_chest_boat.png index e45c2ac38..b38bb0af0 100644 Binary files a/textures/mcl_boats_cherry_chest_boat.png and b/textures/mcl_boats_cherry_chest_boat.png differ diff --git a/textures/mcl_inventory_background9.png b/textures/mcl_inventory_background9.png index d774fd319..171b78575 100644 Binary files a/textures/mcl_inventory_background9.png and b/textures/mcl_inventory_background9.png differ diff --git a/textures/mcl_lightstone_mask.png b/textures/mcl_lightstone_mask.png new file mode 100644 index 000000000..caf35b44d Binary files /dev/null and b/textures/mcl_lightstone_mask.png differ diff --git a/textures/mcl_moon_special.png b/textures/mcl_moon_special.png new file mode 100644 index 000000000..2f742e966 Binary files /dev/null and b/textures/mcl_moon_special.png differ diff --git a/textures/mcl_smithing_table_inventory_trim_bg.png b/textures/mcl_smithing_table_inventory_trim_bg.png index 1b01c9a09..da1e8178e 100644 Binary files a/textures/mcl_smithing_table_inventory_trim_bg.png and b/textures/mcl_smithing_table_inventory_trim_bg.png differ diff --git a/textures/mcl_tool_shepherd_staff.png b/textures/mcl_tool_shepherd_staff.png new file mode 100644 index 000000000..1345a4c49 Binary files /dev/null and b/textures/mcl_tool_shepherd_staff.png differ diff --git a/textures/mobs_mc_llama_gray.png b/textures/mobs_mc_llama_gray.png index a4d2a7685..f590198f1 100644 Binary files a/textures/mobs_mc_llama_gray.png and b/textures/mobs_mc_llama_gray.png differ diff --git a/textures/mobs_mc_llama_white.png b/textures/mobs_mc_llama_white.png index 6eae4b41d..bab3a8cef 100644 Binary files a/textures/mobs_mc_llama_white.png and b/textures/mobs_mc_llama_white.png differ diff --git a/textures/silence_armor_trim_smithing_template.png b/textures/silence_armor_trim_smithing_template.png new file mode 100644 index 000000000..f2e26bd5d Binary files /dev/null and b/textures/silence_armor_trim_smithing_template.png differ diff --git a/textures/silence_boots.png b/textures/silence_boots.png new file mode 100644 index 000000000..ce751e8db Binary files /dev/null and b/textures/silence_boots.png differ diff --git a/textures/silence_chestplate.png b/textures/silence_chestplate.png new file mode 100644 index 000000000..b10986e68 Binary files /dev/null and b/textures/silence_chestplate.png differ diff --git a/textures/silence_helmet.png b/textures/silence_helmet.png new file mode 100644 index 000000000..1adfb6aff Binary files /dev/null and b/textures/silence_helmet.png differ diff --git a/textures/silence_leggings.png b/textures/silence_leggings.png new file mode 100644 index 000000000..83b18c856 Binary files /dev/null and b/textures/silence_leggings.png differ diff --git a/textures/wayfinder_armor_trim_smithing_template.png b/textures/wayfinder_armor_trim_smithing_template.png new file mode 100644 index 000000000..40cc6781e Binary files /dev/null and b/textures/wayfinder_armor_trim_smithing_template.png differ diff --git a/textures/wayfinder_boots.png b/textures/wayfinder_boots.png new file mode 100644 index 000000000..219b88541 Binary files /dev/null and b/textures/wayfinder_boots.png differ diff --git a/textures/wayfinder_chestplate.png b/textures/wayfinder_chestplate.png new file mode 100644 index 000000000..edc41ceb2 Binary files /dev/null and b/textures/wayfinder_chestplate.png differ diff --git a/textures/wayfinder_helmet.png b/textures/wayfinder_helmet.png new file mode 100644 index 000000000..273becbb2 Binary files /dev/null and b/textures/wayfinder_helmet.png differ diff --git a/textures/wayfinder_leggings.png b/textures/wayfinder_leggings.png new file mode 100644 index 000000000..17ef46484 Binary files /dev/null and b/textures/wayfinder_leggings.png differ