From 6e8be2a2c386b79b984927217e120fc50fcf4dae Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 22 Feb 2019 06:08:48 +0100 Subject: [PATCH 001/379] Fix vine not dropping all vines when dug w/ shears --- mods/ITEMS/mcl_core/nodes_climb.lua | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 528186951..25f8cdb51 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -141,13 +141,14 @@ minetest.register_node("mcl_core:vine", { return itemstack end, - -- If destroyed, also a “dependant” vine below it. + -- If dug, also dig a “dependant” vine below it. -- A vine is dependant if it hangs from this node and has no supporting block. - after_destruct = function(pos, oldnode) + on_dig = function(pos, node, digger) local below = {x=pos.x, y=pos.y-1, z=pos.z} local belownode = minetest.get_node(below) - if belownode.name == oldnode.name and (not mcl_core.check_vines_supported(below, belownode)) then - minetest.remove_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, From 1556e6cb3e046a28ac3f29cf54418cf4e6943042 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 22 Feb 2019 06:13:31 +0100 Subject: [PATCH 002/379] Ice: Use after_dig_node instead of after_destruct --- mods/ITEMS/mcl_core/nodes_base.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 237eff39f..813950104 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -786,7 +786,7 @@ minetest.register_node("mcl_core:ice", { groups = {handy=1,pickaxey=1, slippery=3, building_block=1}, drop = "", sounds = mcl_sounds.node_sound_glass_defaults(), - after_destruct = function(pos, oldnode) + after_dig_node = function(pos, oldnode) -- Create a water source if ice is destroyed and there was something below it local below = {x=pos.x, y=pos.y-1, z=pos.z} local belownode = minetest.get_node(below) From 1044e9690954ac5c45b0878303d8d0eb639e6f4e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 25 Feb 2019 17:46:13 +0100 Subject: [PATCH 003/379] Add tool groups (pickaxe, shovel, ...) --- GROUPS.md | 7 +++++++ mods/ITEMS/mcl_farming/hoes.lua | 10 +++++----- mods/ITEMS/mcl_tools/init.lua | 32 ++++++++++++++++---------------- 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/GROUPS.md b/GROUPS.md index 57c90eb43..70f612470 100644 --- a/GROUPS.md +++ b/GROUPS.md @@ -166,6 +166,13 @@ These groups are used mostly for informational purposes * `plant=1`: Plant or part of a plant * `double_plant`: Part of a double-sized plant. 1 = lower part, 2 = upper part +* `pickaxe=1`: Pickaxe +* `shovel=1`: Shovel +* `axe=1`: Axe +* `sword=1`: Sword +* `hoe=1`: Hoe (farming tool) +* `shears=1`: Shears + * `weapon=1`: Item is primarily (!) a weapon * `tool=1`: Item is primarily (!) a tool * `craftitem=1`: Item is primarily (!) used for crafting diff --git a/mods/ITEMS/mcl_farming/hoes.lua b/mods/ITEMS/mcl_farming/hoes.lua index bc048f57d..1d8e9411e 100644 --- a/mods/ITEMS/mcl_farming/hoes.lua +++ b/mods/ITEMS/mcl_farming/hoes.lua @@ -48,7 +48,7 @@ minetest.register_tool("mcl_farming:hoe_wood", { return itemstack end end, - groups = { tool=1 }, + groups = { tool=1, hoe=1 }, tool_capabilities = { full_punch_interval = 1, damage_groups = { fleshy = 1, } @@ -99,7 +99,7 @@ minetest.register_tool("mcl_farming:hoe_stone", { return itemstack end end, - groups = { tool=1 }, + groups = { tool=1, hoe=1 }, tool_capabilities = { full_punch_interval = 0.5, damage_groups = { fleshy = 1, } @@ -145,7 +145,7 @@ minetest.register_tool("mcl_farming:hoe_iron", { return itemstack end end, - groups = { tool=1 }, + groups = { tool=1, hoe=1 }, tool_capabilities = { -- 1/3 full_punch_interval = 0.33333333, @@ -199,7 +199,7 @@ minetest.register_tool("mcl_farming:hoe_gold", { return itemstack end end, - groups = { tool=1 }, + groups = { tool=1, hoe=1 }, tool_capabilities = { full_punch_interval = 1, damage_groups = { fleshy = 1, } @@ -254,7 +254,7 @@ minetest.register_tool("mcl_farming:hoe_diamond", { return itemstack end end, - groups = { tool=1 }, + groups = { tool=1, hoe=1 }, tool_capabilities = { full_punch_interval = 0.25, damage_groups = { fleshy = 1, } diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index c60aafe1c..b5f8b3036 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -64,7 +64,7 @@ minetest.register_tool("mcl_tools:pick_wood", { _doc_items_longdesc = pickaxe_longdesc, _doc_items_hidden = false, inventory_image = "default_tool_woodpick.png", - groups = { tool=1 }, + groups = { tool=1, pickaxe=1 }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -81,7 +81,7 @@ minetest.register_tool("mcl_tools:pick_stone", { description = "Stone Pickaxe", _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_stonepick.png", - groups = { tool=1 }, + groups = { tool=1, pickaxe=1 }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -98,7 +98,7 @@ minetest.register_tool("mcl_tools:pick_iron", { description = "Iron Pickaxe", _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_steelpick.png", - groups = { tool=1 }, + groups = { tool=1, pickaxe=1 }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -115,7 +115,7 @@ minetest.register_tool("mcl_tools:pick_gold", { description = "Golden Pickaxe", _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_goldpick.png", - groups = { tool=1 }, + groups = { tool=1, pickaxe=1 }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -132,7 +132,7 @@ minetest.register_tool("mcl_tools:pick_diamond", { description = "Diamond Pickaxe", _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_diamondpick.png", - groups = { tool=1 }, + groups = { tool=1, pickaxe=1 }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -244,7 +244,7 @@ minetest.register_tool("mcl_tools:shovel_wood", { _doc_items_hidden = false, inventory_image = "default_tool_woodshovel.png", wield_image = "default_tool_woodshovel.png^[transformR90", - groups = { tool=1 }, + groups = { tool=1, shovel=1 }, tool_capabilities = { full_punch_interval = 1, max_drop_level=1, @@ -263,7 +263,7 @@ minetest.register_tool("mcl_tools:shovel_stone", { _doc_items_usagehelp = shovel_use, inventory_image = "default_tool_stoneshovel.png", wield_image = "default_tool_stoneshovel.png^[transformR90", - groups = { tool=1 }, + groups = { tool=1, shovel=1 }, tool_capabilities = { full_punch_interval = 1, max_drop_level=3, @@ -282,7 +282,7 @@ minetest.register_tool("mcl_tools:shovel_iron", { _doc_items_usagehelp = shovel_use, inventory_image = "default_tool_steelshovel.png", wield_image = "default_tool_steelshovel.png^[transformR90", - groups = { tool=1 }, + groups = { tool=1, shovel=1 }, tool_capabilities = { full_punch_interval = 1, max_drop_level=4, @@ -301,7 +301,7 @@ minetest.register_tool("mcl_tools:shovel_gold", { _doc_items_usagehelp = shovel_use, inventory_image = "default_tool_goldshovel.png", wield_image = "default_tool_goldshovel.png^[transformR90", - groups = { tool=1 }, + groups = { tool=1, shovel=1 }, tool_capabilities = { full_punch_interval = 1, max_drop_level=2, @@ -320,7 +320,7 @@ minetest.register_tool("mcl_tools:shovel_diamond", { _doc_items_usagehelp = shovel_use, inventory_image = "default_tool_diamondshovel.png", wield_image = "default_tool_diamondshovel.png^[transformR90", - groups = { tool=1 }, + groups = { tool=1, shovel=1 }, tool_capabilities = { full_punch_interval = 1, max_drop_level=5, @@ -340,7 +340,7 @@ minetest.register_tool("mcl_tools:axe_wood", { _doc_items_longdesc = axe_longdesc, _doc_items_hidden = false, inventory_image = "default_tool_woodaxe.png", - groups = { tool=1 }, + groups = { tool=1, axe=1 }, tool_capabilities = { full_punch_interval = 1.25, max_drop_level=1, @@ -356,7 +356,7 @@ minetest.register_tool("mcl_tools:axe_stone", { description = "Stone Axe", _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_stoneaxe.png", - groups = { tool=1 }, + groups = { tool=1, axe=1 }, tool_capabilities = { full_punch_interval = 1.25, max_drop_level=3, @@ -372,7 +372,7 @@ minetest.register_tool("mcl_tools:axe_iron", { description = "Iron Axe", _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_steelaxe.png", - groups = { tool=1 }, + groups = { tool=1, axe=1 }, tool_capabilities = { -- 1/0.9 full_punch_interval = 1.11111111, @@ -389,7 +389,7 @@ minetest.register_tool("mcl_tools:axe_gold", { description = "Golden Axe", _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_goldaxe.png", - groups = { tool=1 }, + groups = { tool=1, axe=1 }, tool_capabilities = { full_punch_interval = 1.0, max_drop_level=2, @@ -405,7 +405,7 @@ minetest.register_tool("mcl_tools:axe_diamond", { description = "Diamond Axe", _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_diamondaxe.png", - groups = { tool=1 }, + groups = { tool=1, axe=1 }, tool_capabilities = { full_punch_interval = 1.0, max_drop_level=5, @@ -514,7 +514,7 @@ minetest.register_tool("mcl_tools:shears", { inventory_image = "default_tool_shears.png", wield_image = "default_tool_shears.png", stack_max = 1, - groups = { tool=1 }, + groups = { tool=1, shears=1 }, tool_capabilities = { full_punch_interval = 0.5, max_drop_level=1, From 6497916adec46519df18230acaca52b196980ed0 Mon Sep 17 00:00:00 2001 From: nickolas360 Date: Thu, 28 Feb 2019 15:35:18 +0100 Subject: [PATCH 004/379] Fix spawning at bed when chunk is unloaded --- mods/PLAYER/mcl_spawn/init.lua | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index 5c8a797eb..bf8c1344d 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -60,15 +60,24 @@ mcl_spawn.set_spawn_pos = function(player, pos, message) return spawn_changed end +local function get_far_node(pos) + local node = minetest.get_node(pos) + if node.name ~= "ignore" then + return node + end + minetest.get_voxel_manip():read_from_map(pos, pos) + return minetest.get_node(pos) +end + -- Respawn player at specified respawn position minetest.register_on_respawnplayer(function(player) local pos, custom_spawn = mcl_spawn.get_spawn_pos(player) if pos and custom_spawn then -- Check if bed is still there -- and the spawning position is free of solid or damaging blocks. - local node_bed = minetest.get_node(pos) - local node_up1 = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) - local node_up2 = minetest.get_node({x=pos.x,y=pos.y+2,z=pos.z}) + local node_bed = get_far_node(pos) + local node_up1 = get_far_node({x=pos.x,y=pos.y+1,z=pos.z}) + local node_up2 = get_far_node({x=pos.x,y=pos.y+2,z=pos.z}) local bgroup = minetest.get_item_group(node_bed.name, "bed") local def1 = minetest.registered_nodes[node_up1.name] local def2 = minetest.registered_nodes[node_up2.name] From 7851cee45e639294b5dc35beb731b28a0310d3a7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 28 Feb 2019 16:43:52 +0100 Subject: [PATCH 005/379] Fix exhauston for attacking and taking dmg --- mods/ENTITIES/mcl_falling_nodes/init.lua | 4 ---- mods/ENTITIES/mcl_mobs/api.lua | 8 +++++++- mods/ENTITIES/mcl_mobs/depends.txt | 1 + mods/ITEMS/mcl_bows/arrow.lua | 4 ---- mods/ITEMS/mcl_bows/depends.txt | 1 - mods/ITEMS/mcl_tnt/depends.txt | 1 - mods/ITEMS/mcl_tnt/init.lua | 4 ---- mods/PLAYER/mcl_hunger/init.lua | 13 ++++++++++--- mods/PLAYER/mcl_playerplus/init.lua | 1 - 9 files changed, 18 insertions(+), 19 deletions(-) diff --git a/mods/ENTITIES/mcl_falling_nodes/init.lua b/mods/ENTITIES/mcl_falling_nodes/init.lua index 92cca7031..5f54f58d3 100644 --- a/mods/ENTITIES/mcl_falling_nodes/init.lua +++ b/mods/ENTITIES/mcl_falling_nodes/init.lua @@ -1,5 +1,4 @@ local dmes = minetest.get_modpath("mcl_death_messages") ~= nil -local hung = minetest.get_modpath("mcl_hunger") ~= nil local get_falling_depth = function(self) if not self._startpos then @@ -56,9 +55,6 @@ local deal_falling_damage = function(self, dtime) if dmes then mcl_death_messages.player_damage(v, string.format(msg, v:get_player_name())) end - if hung then - mcl_hunger.exhaust(v:get_player_name(), mcl_hunger.EXHAUST_DAMAGE) - end end v:set_hp(hp) end diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 30b8a582f..337deeb07 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -96,6 +96,7 @@ mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dir local mod_weather = minetest.get_modpath("mcl_weather") ~= nil local mod_tnt = minetest.get_modpath("mcl_tnt") ~= nil local mod_mobspawners = minetest.get_modpath("mcl_mobspawners") ~= nil +local mod_hunger = minetest.get_modpath("mcl_hunger") ~= nil -- play sound local mob_sound = function(self, sound, is_opinion) @@ -2342,10 +2343,15 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) end - -- weapon wear + -- punch interval local weapon = hitter:get_wielded_item() local punch_interval = 1.4 + -- exhaust attacker + if mod_hunger and hitter:is_player() then + mcl_hunger.exhaust(hitter:get_player_name(), mcl_hunger.EXHAUST_ATTACK) + end + -- calculate mob damage local damage = 0 local armor = self.object:get_armor_groups() or {} diff --git a/mods/ENTITIES/mcl_mobs/depends.txt b/mods/ENTITIES/mcl_mobs/depends.txt index a1d9c9aa2..eb3eb2aa0 100644 --- a/mods/ENTITIES/mcl_mobs/depends.txt +++ b/mods/ENTITIES/mcl_mobs/depends.txt @@ -1,6 +1,7 @@ mcl_core mcl_weather? mcl_tnt? +mcl_hunger? invisibility? intllib? lucky_block? diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 52a857a0e..a3c8fb4a1 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -7,7 +7,6 @@ local GRAVITY = 9.81 local YAW_OFFSET = -math.pi/2 -local mod_mcl_hunger = minetest.get_modpath("mcl_hunger") local mod_awards = minetest.get_modpath("awards") and minetest.get_modpath("mcl_achievements") local mod_button = minetest.get_modpath("mesecons_button") @@ -193,9 +192,6 @@ ARROW_ENTITY.on_step = function(self, dtime) -- “Ding” sound for hitting another player minetest.sound_play({name="mcl_bows_hit_player", gain=0.1}, {to_player=self._shooter}) end - if mod_mcl_hunger then - mcl_hunger.exhaust(obj:get_player_name(), mcl_hunger.EXHAUST_DAMAGE) - end end if lua then diff --git a/mods/ITEMS/mcl_bows/depends.txt b/mods/ITEMS/mcl_bows/depends.txt index 736cd117a..08132ddbf 100644 --- a/mods/ITEMS/mcl_bows/depends.txt +++ b/mods/ITEMS/mcl_bows/depends.txt @@ -1,7 +1,6 @@ controls awards? mcl_achievements? -mcl_hunger? mcl_core? mcl_mobitems? playerphysics? diff --git a/mods/ITEMS/mcl_tnt/depends.txt b/mods/ITEMS/mcl_tnt/depends.txt index 0f49dddde..f02d2b054 100644 --- a/mods/ITEMS/mcl_tnt/depends.txt +++ b/mods/ITEMS/mcl_tnt/depends.txt @@ -1,5 +1,4 @@ mcl_sounds? mcl_mobitems? -mcl_hunger? mcl_death_messages? doc_identifier? diff --git a/mods/ITEMS/mcl_tnt/init.lua b/mods/ITEMS/mcl_tnt/init.lua index dd6ebc66a..fbe82c1c1 100644 --- a/mods/ITEMS/mcl_tnt/init.lua +++ b/mods/ITEMS/mcl_tnt/init.lua @@ -1,5 +1,4 @@ local mod_death_messages = minetest.get_modpath("mcl_death_messages") -local mod_hunger = minetest.get_modpath("mcl_hunger") local function spawn_tnt(pos, entname) minetest.sound_play("tnt_ignite", {pos = pos,gain = 1.0,max_hear_distance = 15,}) @@ -33,9 +32,6 @@ local function do_tnt_physics(tnt_np,tntr) if mod_death_messages then mcl_death_messages.player_damage(obj, string.format("%s was caught in an explosion.", obj:get_player_name())) end - if mod_hunger then - mcl_hunger.exhaust(obj:get_player_name(), mcl_hunger.EXHAUST_DAMAGE) - end end obj:set_hp(obj:get_hp() - damage) end diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index f71dc1216..5df787e7d 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -29,7 +29,7 @@ mcl_hunger.EXHAUST_SPRINT_JUMP = 200 -- jump while sprinting mcl_hunger.EXHAUST_ATTACK = 100 -- hit an enemy mcl_hunger.EXHAUST_SWIM = 10 -- player movement in water mcl_hunger.EXHAUST_SPRINT = 100 -- sprint (per node) -mcl_hunger.EXHAUST_DAMAGE = 100 -- TODO (mostly done): taking damage (protected by armor) +mcl_hunger.EXHAUST_DAMAGE = 100 -- taking damage (protected by armor) mcl_hunger.EXHAUST_REGEN = 6000 -- Regenerate 1 HP mcl_hunger.EXHAUST_LVL = 4000 -- at what exhaustion player saturation gets lowered @@ -134,12 +134,19 @@ end) -- PvP combat exhaustion minetest.register_on_punchplayer(function(victim, puncher, time_from_last_punch, tool_capabilities, dir, damage) - if victim:is_player() and puncher:is_player() then - mcl_hunger.exhaust(victim:get_player_name(), mcl_hunger.EXHAUST_DAMAGE) + if puncher:is_player() then mcl_hunger.exhaust(puncher:get_player_name(), mcl_hunger.EXHAUST_ATTACK) end end) +-- Exhaust on taking damage +minetest.register_on_player_hpchange(function(player, hp_change) + if hp_change < 0 then + local name = player:get_player_name() + mcl_hunger.exhaust(name, mcl_hunger.EXHAUST_DAMAGE) + end +end) + local main_timer = 0 local timer = 0 -- Half second timer local timerMult = 1 -- Cycles from 0 to 7, each time when timer hits half a second diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index f9022a3b7..17074ea98 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -135,7 +135,6 @@ minetest.register_globalstep(function(dtime) if dist < 1.1 or dist_feet < 1.1 then if player:get_hp() > 0 then mcl_death_messages.player_damage(player, string.format("%s was prickled by a cactus.", name)) - mcl_hunger.exhaust(name, mcl_hunger.EXHAUST_DAMAGE) player:set_hp(player:get_hp() - 1) end end From 1daf9b7a590c905f932eef020924152178278015 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 28 Feb 2019 18:00:17 +0100 Subject: [PATCH 006/379] Put treasure loot into random inventory slots --- mods/CORE/mcl_loot/init.lua | 54 ++++++++++++++++++++++++++ mods/MAPGEN/mcl_dungeons/init.lua | 4 +- mods/MAPGEN/mcl_structures/init.lua | 8 +--- mods/MAPGEN/tsm_railcorridors/init.lua | 4 +- 4 files changed, 58 insertions(+), 12 deletions(-) diff --git a/mods/CORE/mcl_loot/init.lua b/mods/CORE/mcl_loot/init.lua index f7eff3f64..3b52e3655 100644 --- a/mods/CORE/mcl_loot/init.lua +++ b/mods/CORE/mcl_loot/init.lua @@ -98,3 +98,57 @@ function mcl_loot.get_multi_loot(multi_loot_definitions, pr) end return items end + +--[[ +Returns a table of length `max_slot` and all natural numbers between 1 and `max_slot` +in a random order. +]] +local function get_random_slots(max_slot) + local slots = {} + for s=1, max_slot do + slots[s] = s + end + local slots_out = {} + while #slots > 0 do + local r = math.random(1, #slots) + table.insert(slots_out, slots[r]) + table.remove(slots, r) + end + for s=1, #slots_out do + print(slots_out[s]) + end + return slots_out +end + +--[[ +Puts items in an inventory list into random slots. +* inv: InvRef +* listname: Inventory list name +* items: table of items to add + +Items will be added from start of the table to end. +If the inventory already has occupied slots, or is +too small, placement of some items might fail. +]] +function mcl_loot.fill_inventory(inv, listname, items) + local size = inv:get_size(listname) + local slots = get_random_slots(size) + local leftovers = {} + -- 1st pass: Add items into random slots + for i=1, math.min(#items, size) do + local item = items[i] + local slot = slots[i] + local old_item = inv:get_stack(listname, slot) + local leftover = old_item:add_item(item) + inv:set_stack(listname, slot, old_item) + if not leftover:is_empty() then + table.insert(leftovers, item) + end + end + -- 2nd pass: If some items couldn't be added in first pass, + -- try again in a non-random fashion + for l=1, math.min(#leftovers, size) do + inv:add_item(listname, leftovers[l]) + end + -- If there are still items left, tough luck! +end diff --git a/mods/MAPGEN/mcl_dungeons/init.lua b/mods/MAPGEN/mcl_dungeons/init.lua index f23c33bfb..dc19a6e19 100644 --- a/mods/MAPGEN/mcl_dungeons/init.lua +++ b/mods/MAPGEN/mcl_dungeons/init.lua @@ -366,9 +366,7 @@ minetest.register_on_generated(function(minp, maxp) local meta = minetest.get_meta(cpos) local inv = meta:get_inventory() local items = get_loot() - for i=1, math.min(#items, inv:get_size("main")) do - inv:set_stack("main", i, ItemStack(items[i])) - end + mcl_loot.fill_inventory(inv, "main", items) end -- Mob spawners are placed seperately, too diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index 552691bf4..e98deddae 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -188,9 +188,7 @@ mcl_structures.generate_igloo_basement = function(pos, orientation) local meta = minetest.get_meta(chest_pos) local inv = meta:get_inventory() inv:set_size("main", 9*3) - for i=1, #lootitems do - inv:add_item("main", lootitems[i]) - end + mcl_loot.fill_inventory(inv, "main", lootitems) end return success end @@ -401,9 +399,7 @@ mcl_structures.generate_desert_temple = function(pos) local meta = minetest.get_meta(chests[c]) local inv = meta:get_inventory() inv:set_size("main", 9*3) - for i=1, #lootitems do - inv:add_item("main", lootitems[i]) - end + mcl_loot.fill_inventory(inv, "main", lootitems) end -- Initialize pressure plates and randomly remove up to 5 plates diff --git a/mods/MAPGEN/tsm_railcorridors/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua index d6de8198a..6812125eb 100644 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ b/mods/MAPGEN/tsm_railcorridors/init.lua @@ -377,9 +377,7 @@ local function PlaceChest(pos, param2) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local items = tsm_railcorridors.get_treasures(pr) - for i=1, math.min(#items, inv:get_size("main")) do - inv:set_stack("main", i, ItemStack(items[i])) - end + mcl_loot.fill_inventory(inv, "main", items) end end From 19b1cf5986916d4e2c75a9acd88f1a2ba3cfd322 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 28 Feb 2019 18:19:57 +0100 Subject: [PATCH 007/379] More robust initialization of chests of structs --- mods/MAPGEN/mcl_structures/init.lua | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index e98deddae..fa233682a 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -15,6 +15,18 @@ mcl_structures.get_struct = function(file) return allnode end +-- Call on_construct on pos. +-- Useful to init chests from formspec. +local init_node_construct = function(pos) + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + if def and def.on_construct then + def.on_construct(pos) + return true + end + return false +end + -- The call of Struct mcl_structures.call_struct = function(pos, struct_style, rotation) if not rotation then @@ -185,9 +197,9 @@ mcl_structures.generate_igloo_basement = function(pos, orientation) }}, pr) local chest_pos = vector.add(pos, chest_offset) + init_node_construct(chest_pos) local meta = minetest.get_meta(chest_pos) local inv = meta:get_inventory() - inv:set_size("main", 9*3) mcl_loot.fill_inventory(inv, "main", lootitems) end return success @@ -396,9 +408,10 @@ mcl_structures.generate_desert_temple = function(pos) } }}, pr) + local meta = minetest.get_meta(chests[c]) + init_node_construct(chests[c]) local meta = minetest.get_meta(chests[c]) local inv = meta:get_inventory() - inv:set_size("main", 9*3) mcl_loot.fill_inventory(inv, "main", lootitems) end From a711c7bdb7b8ac006d5d71b5a64f753a132745fb Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Mar 2019 17:30:21 +0100 Subject: [PATCH 008/379] handle_node_drops no longer destroys metadata --- mods/ENTITIES/mcl_item_entity/init.lua | 10 +++++----- mods/HUD/mcl_inventory/creative.lua | 3 +-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index d1c502fce..4b10cdac7 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -245,16 +245,16 @@ function minetest.handle_node_drops(pos, drops, digger) end for _,item in ipairs(drops) do - local count, name + local count if type(item) == "string" then - count = 1 - name = item + count = ItemStack(item):get_count() else count = item:get_count() - name = item:get_name() end + local drop_item = ItemStack(item) + drop_item:set_count(1) for i=1,count do - local obj = core.add_item(pos, name) + local obj = core.add_item(pos, drop_item) if obj ~= nil then local x = math.random(1, 5) if math.random(1,2) == 1 then diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 7125dcb65..dd5d0bd87 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -555,8 +555,7 @@ if minetest.settings:get_bool("creative_mode") then local inv = digger:get_inventory() if inv then for _,item in ipairs(drops) do - item = ItemStack(item):get_name() - if not inv:contains_item("main", item) then + if not inv:contains_item("main", item, true) then inv:add_item("main", item) end end From c6111039ab18f17537d037594fd1f5f62860a491 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Mar 2019 17:31:31 +0100 Subject: [PATCH 009/379] Fix annoying drops when digging banner in creative --- mods/ITEMS/mcl_banners/init.lua | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index 5bab2ed76..541a69c9f 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -47,6 +47,25 @@ local layer_ratio = 255 local standing_banner_entity_offset = { x=0, y=-0.499, z=0 } local hanging_banner_entity_offset = { x=0, y=-1.7, z=0 } +local on_dig_banner = function(pos, node, digger) + -- Check protection + local name = digger:get_player_name() + if minetest.is_protected(pos, name) then + minetest.register_protection_violation(pos, name) + return + end + -- Drop item + local meta = minetest.get_meta(pos) + local item = meta:get_inventory():get_stack("banner", 1) + if not item:is_empty() then + minetest.handle_node_drops(pos, {item:to_string()}, digger) + else + minetest.handle_node_drops(pos, {"mcl_bannes:banner_item_white"}, digger) + end + -- Remove node + minetest.remove_node(pos) +end + local on_destruct_banner = function(pos, hanging) local offset, nodename if hanging then @@ -56,7 +75,7 @@ local on_destruct_banner = function(pos, hanging) offset = standing_banner_entity_offset nodename = "mcl_banners:standing_banner" end - -- Find this node's banner entity and make it drop as an item + -- Find this node's banner entity and remove it local checkpos = vector.add(pos, offset) local objects = minetest.get_objects_inside_radius(checkpos, 0.5) for _, v in ipairs(objects) do @@ -65,14 +84,6 @@ local on_destruct_banner = function(pos, hanging) v:remove() end end - -- Drop item - local meta = minetest.get_meta(pos) - local item = meta:get_inventory():get_stack("banner", 1) - if not item:is_empty() then - minetest.add_item(pos, item) - else - minetest.add_item(pos, "mcl_banners:banner_item_white") - end end local on_destruct_standing_banner = function(pos) @@ -207,6 +218,7 @@ minetest.register_node("mcl_banners:standing_banner", { sounds = node_sounds, drop = "", -- Item drops are handled in entity code + on_dig = on_dig_banner, on_destruct = on_destruct_standing_banner, on_punch = function(pos, node) respawn_banner_entity(pos, node) @@ -238,6 +250,7 @@ minetest.register_node("mcl_banners:hanging_banner", { sounds = node_sounds, drop = "", -- Item drops are handled in entity code + on_dig = on_dig_banner, on_destruct = on_destruct_hanging_banner, on_punch = function(pos, node) respawn_banner_entity(pos, node) From dca095171c573bd8b4ecae91b09fd32f3310a610 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Mar 2019 17:48:00 +0100 Subject: [PATCH 010/379] Restrict banner layers to 3 if has a gradient --- mods/ITEMS/mcl_banners/init.lua | 3 ++- mods/ITEMS/mcl_banners/patterncraft.lua | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index 541a69c9f..49af2de63 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -193,7 +193,8 @@ minetest.register_node("mcl_banners:standing_banner", { _doc_items_entry_name = "Banner", _doc_items_image = "mcl_banners_item_base.png^mcl_banners_item_overlay.png", _doc_items_longdesc = "Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.", - _doc_items_usagehelp = "Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 6 layers on a banner that way. You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.", + _doc_items_usagehelp = [[Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 6 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible. +You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.]], walkable = false, is_ground_content = false, paramtype = "light", diff --git a/mods/ITEMS/mcl_banners/patterncraft.lua b/mods/ITEMS/mcl_banners/patterncraft.lua index 8d202c78c..2858b3d23 100644 --- a/mods/ITEMS/mcl_banners/patterncraft.lua +++ b/mods/ITEMS/mcl_banners/patterncraft.lua @@ -5,6 +5,9 @@ -- Maximum number of layers which can be put on a banner by crafting. local max_layers_crafting = 6 +-- Maximum number of layers when banner includes a gradient (workaround, see below). +local max_layers_gradient = 3 + -- Max. number lines in the descriptions for the banner layers. -- This is done to avoid huge tooltips. local max_layer_lines = 6 @@ -386,6 +389,16 @@ local banner_pattern_craft = function(itemstack, player, old_craft_grid, craft_i if #layers >= max_layers_crafting then return ItemStack("") end + -- Lower layer limit when banner includes any gradient. + -- Workaround to circumvent bug #340 (gradients are likely to cause transparent pixels). + -- FIXME: Remove this restriction when bug #340 is fixed. + if #layers >= max_layers_gradient then + for l=1, #layers do + if layers[l].pattern == "gradient" or layers[l].pattern == "gradient_up" then + return ItemStack("") + end + end + end local matching_pattern local max_i = player:get_inventory():get_size("craft") From ab919713985fddf90e502bdec4f958cdb3606417 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Mar 2019 17:53:21 +0100 Subject: [PATCH 011/379] Increase pattern layer limit to 12 --- mods/ITEMS/mcl_banners/init.lua | 2 +- mods/ITEMS/mcl_banners/patterncraft.lua | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index 49af2de63..bfe7832a7 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -193,7 +193,7 @@ minetest.register_node("mcl_banners:standing_banner", { _doc_items_entry_name = "Banner", _doc_items_image = "mcl_banners_item_base.png^mcl_banners_item_overlay.png", _doc_items_longdesc = "Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.", - _doc_items_usagehelp = [[Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 6 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible. + _doc_items_usagehelp = [[Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible. You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.]], walkable = false, is_ground_content = false, diff --git a/mods/ITEMS/mcl_banners/patterncraft.lua b/mods/ITEMS/mcl_banners/patterncraft.lua index 2858b3d23..4639b7a90 100644 --- a/mods/ITEMS/mcl_banners/patterncraft.lua +++ b/mods/ITEMS/mcl_banners/patterncraft.lua @@ -1,9 +1,9 @@ -- Pattern crafting. This file contains the code for crafting all the -- emblazonings you can put on the banners. It's quite complicated; --- normal 08/15 crafting won't work here. +-- run-of-the-mill crafting won't work here. -- Maximum number of layers which can be put on a banner by crafting. -local max_layers_crafting = 6 +local max_layers_crafting = 12 -- Maximum number of layers when banner includes a gradient (workaround, see below). local max_layers_gradient = 3 From 03c6beb9718bceb7be1cebb58293c251f72faaf2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Mar 2019 18:01:29 +0100 Subject: [PATCH 012/379] Remove mcl_imitation_mode --- .../mcl_core_jungle_bush_jungle_leaves.mts | Bin 129 -> 0 bytes mods/MAPGEN/mcl_biomes/init.lua | 8 +------- settingtypes.txt | 14 -------------- 3 files changed, 1 insertion(+), 21 deletions(-) delete mode 100644 mods/ITEMS/mcl_core/schematics/mcl_core_jungle_bush_jungle_leaves.mts diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_jungle_bush_jungle_leaves.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_jungle_bush_jungle_leaves.mts deleted file mode 100644 index d2df30e888e54a2658c9c97456acb35442e8eaa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmeYb3HD`RVPFN}dgl6i24)84#LOZF(cI*m_~iVeRI9Agy!4#ZoYcg!)M5r z)YOVO$q5IzBo0mxNN929;Afk0AwogaC!q9)&#_dw%y+BTuRpHDBE-_&-1%Q&<9`Rk TkfSGFeVFNP&A_l Date: Fri, 1 Mar 2019 18:08:28 +0100 Subject: [PATCH 013/379] Add experimental setting: fallen logs --- mods/MAPGEN/mcl_biomes/init.lua | 3 +-- settingtypes.txt | 4 ++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index a046c1749..26efcee65 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1,10 +1,9 @@ local mg_name = minetest.get_mapgen_setting("mg_name") -- Some mapgen settings -local imitate = minetest.settings:get("mcl_imitation_mode") local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" -local generate_fallen_logs = false +local generate_fallen_logs = minetest.settings:get_bool("mcl_generate_fallen_logs") or false -- Jungle bush schematic. In PC/Java Edition it's Jungle Wood + Oak Leaves local jungle_bush_schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_jungle_bush_oak_leaves.mts" diff --git a/settingtypes.txt b/settingtypes.txt index 3d65971e3..ba0db568e 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -87,6 +87,10 @@ craftguide_progressive_mode (Enable recipe book progressive mode) bool false # This feature is not finished yet! mob_difficulty (Mob difficulty factor) float 1.0 0.0 +# Whether to generate fallen logs in some biomes. +# They might not always look pretty and have strange overhangs. +mcl_generate_fallen_logs (Generate fallen logs) bool false + # If enabled, the “flat” map generator generates a Classic Superflat world: # Completely flat, 1 layer of grass blocks on top of 2 layers of dirt on # top of a final layer of bedrock. No caves, trees or plants. From d367a8dbad79befe9e0e3d5d01ee5b14a839a40a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Mar 2019 18:32:10 +0100 Subject: [PATCH 014/379] Update banner comment --- mods/ITEMS/mcl_banners/patterncraft.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_banners/patterncraft.lua b/mods/ITEMS/mcl_banners/patterncraft.lua index 4639b7a90..f60d5678c 100644 --- a/mods/ITEMS/mcl_banners/patterncraft.lua +++ b/mods/ITEMS/mcl_banners/patterncraft.lua @@ -390,8 +390,8 @@ local banner_pattern_craft = function(itemstack, player, old_craft_grid, craft_i return ItemStack("") end -- Lower layer limit when banner includes any gradient. - -- Workaround to circumvent bug #340 (gradients are likely to cause transparent pixels). - -- FIXME: Remove this restriction when bug #340 is fixed. + -- Workaround to circumvent Minetest bug (https://github.com/minetest/minetest/issues/6210) + -- TODO: Remove this restriction when bug #6210 is fixed. if #layers >= max_layers_gradient then for l=1, #layers do if layers[l].pattern == "gradient" or layers[l].pattern == "gradient_up" then From 47389902bc76cd798a9d29b10ac191bdff2dbb88 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Mar 2019 18:33:56 +0100 Subject: [PATCH 015/379] Version 0.47.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9654821f3..ed7be27b4 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.46.0 +Version: 0.47.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 94591c8b527eb60b46ae13c9c891f34da9eac96b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Mar 2019 06:07:44 +0100 Subject: [PATCH 016/379] Fix crash when dig banner in protected area --- mods/ITEMS/mcl_banners/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index bfe7832a7..a04d88ed5 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -51,7 +51,7 @@ local on_dig_banner = function(pos, node, digger) -- Check protection local name = digger:get_player_name() if minetest.is_protected(pos, name) then - minetest.register_protection_violation(pos, name) + minetest.record_protection_violation(pos, name) return end -- Drop item From c19e3f455cd4c1e29e37d3e4d031953e8f107baa Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Mar 2019 06:08:44 +0100 Subject: [PATCH 017/379] Version 0.47.1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ed7be27b4..9a35de3ed 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.47.0 +Version: 0.47.1 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 62e3a8b9ff665a46ec2160d9b0cf72f7d4f2fdfa Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 00:11:43 +0100 Subject: [PATCH 018/379] Add player skin support, add female skin --- mods/PLAYER/simple_skins/depends.txt | 3 + mods/PLAYER/simple_skins/description.txt | 1 + mods/PLAYER/simple_skins/init.lua | 148 ++++++++++++++++++ mods/PLAYER/simple_skins/intllib.lua | 45 ++++++ mods/PLAYER/simple_skins/license.txt | 21 +++ mods/PLAYER/simple_skins/locale/fr.po | 51 ++++++ mods/PLAYER/simple_skins/locale/it.po | 52 ++++++ mods/PLAYER/simple_skins/locale/ms.po | 51 ++++++ mods/PLAYER/simple_skins/locale/template.pot | 50 ++++++ mods/PLAYER/simple_skins/meta/character.txt | 3 + mods/PLAYER/simple_skins/meta/character_1.txt | 3 + mods/PLAYER/simple_skins/mod.conf | 1 + mods/PLAYER/simple_skins/readme.md | 7 + .../simple_skins/textures/character_1.png | Bin 0 -> 5505 bytes .../textures/inventory_plus_skins.png | Bin 0 -> 2182 bytes 15 files changed, 436 insertions(+) create mode 100644 mods/PLAYER/simple_skins/depends.txt create mode 100644 mods/PLAYER/simple_skins/description.txt create mode 100644 mods/PLAYER/simple_skins/init.lua create mode 100644 mods/PLAYER/simple_skins/intllib.lua create mode 100644 mods/PLAYER/simple_skins/license.txt create mode 100644 mods/PLAYER/simple_skins/locale/fr.po create mode 100644 mods/PLAYER/simple_skins/locale/it.po create mode 100644 mods/PLAYER/simple_skins/locale/ms.po create mode 100644 mods/PLAYER/simple_skins/locale/template.pot create mode 100644 mods/PLAYER/simple_skins/meta/character.txt create mode 100644 mods/PLAYER/simple_skins/meta/character_1.txt create mode 100644 mods/PLAYER/simple_skins/mod.conf create mode 100644 mods/PLAYER/simple_skins/readme.md create mode 100644 mods/PLAYER/simple_skins/textures/character_1.png create mode 100644 mods/PLAYER/simple_skins/textures/inventory_plus_skins.png diff --git a/mods/PLAYER/simple_skins/depends.txt b/mods/PLAYER/simple_skins/depends.txt new file mode 100644 index 000000000..1927ce890 --- /dev/null +++ b/mods/PLAYER/simple_skins/depends.txt @@ -0,0 +1,3 @@ +mcl_player +intllib? +3d_armor? diff --git a/mods/PLAYER/simple_skins/description.txt b/mods/PLAYER/simple_skins/description.txt new file mode 100644 index 000000000..61c7bff64 --- /dev/null +++ b/mods/PLAYER/simple_skins/description.txt @@ -0,0 +1 @@ +Mod that allows players to set their individual skins. \ No newline at end of file diff --git a/mods/PLAYER/simple_skins/init.lua b/mods/PLAYER/simple_skins/init.lua new file mode 100644 index 000000000..3a41490f4 --- /dev/null +++ b/mods/PLAYER/simple_skins/init.lua @@ -0,0 +1,148 @@ +-- Simple Skins mod for Minetest (MineClone 2 Edition) + +-- Released by TenPlus1 and based on Zeg9's code under MIT license + +skins = { + skins = {}, meta = {}, + modpath = minetest.get_modpath("simple_skins"), + skin_count = 0, -- counter of _custom_ skins (all skins except character.png) +} + + +-- Load support for intllib. +local S, NS = dofile(skins.modpath .. "/intllib.lua") + + +-- load skin list and metadata +local id, f, data, skin = 1 + +while true do + + skin = "character_" .. id + + -- does skin file exist ? + f = io.open(skins.modpath .. "/textures/" .. skin .. ".png") + + -- escape loop if not found and remove last entry + if not f then + id = id - 1 + break + end + + f:close() + + -- does metadata exist for that skin file ? + f = io.open(skins.modpath .. "/meta/" .. skin .. ".txt") + + if f then + data = minetest.deserialize("return {" .. f:read('*all') .. "}") + f:close() + end + + -- add metadata to list + skins.meta[skin] = { + name = data and data.name or "", + author = data and data.author or "", + } + + id = id + 1 + skins.skin_count = skins.skin_count + 1 +end + +skins.set_player_skin = function(player, skin) + if not player then + return + end + local playername = player:get_player_name() + skins.skins[playername] = skin + player:set_attribute("simple_skins:skin", skins.skins[playername]) + skins.update_player_skin(player) + if minetest.get_modpath("3d_armor") then + armor.textures[playername].skin = skin .. ".png" + armor:update_player_visuals(player) + end +end + +skins.update_player_skin = function(player) + if not player then + return + end + local playername = player:get_player_name() + mcl_player.player_set_textures(player, { skins.skins[playername] .. ".png" }) +end + +-- load player skin on join +minetest.register_on_joinplayer(function(player) + + local name = player:get_player_name() + local skin = player:get_attribute("simple_skins:skin") + local set_skin + -- do we already have a skin in player attributes? + if skin then + set_skin = skin + + -- otherwise use random skin if not set + else + local r = math.random(0, skins.skin_count) + if r == 0 then + set_skin = "character" + else + set_skin = "character_" .. r + end + end + if set_skin then + skins.set_player_skin(player, set_skin) + end +end) + +-- command to set player skin (usually for custom skins) +minetest.register_chatcommand("setskin", { + params = "[] ", + description = S("Select player skin of yourself or another player"), + privs = {}, + func = function(name, param) + + local playername, skin_id = string.match(param, "([^ ]+) (%d+)") + if not playername or not skin_id then + skin_id = string.match(param, "(%d+)") + if not skin_id then + return false, S("Insufficient or wrong parameters") + end + playername = name + end + skin_id = tonumber(skin_id) + + local player = minetest.get_player_by_name(playername) + + if not player then + return false, S("Player @1 not online!", playername) + end + if name ~= playername then + local privs = minetest.get_player_privs(name) + if not privs.server then + return false, S("You need the “server” privilege to change the skin of other players!") + end + end + + local skin + if skin_id == nil or skin_id > skins.skin_count or skin_id < 0 then + return false, S("Invalid skin number! Valid numbers: 0 to @1", skins.skin_count) + elseif skin_id == 0 then + skin = "character" + else + skin = "character_" .. tostring(skin_id) + end + + skins.set_player_skin(player, skin) + local skinfile = skin..".png" + + local your_msg = S("Your skin has been set to: @1", skinfile) + if name == playername then + return true, your_msg + else + minetest.chat_send_player(playername, your_msg) + return true, S("Skin of @1 set to: @2", playername, skinfile) + end + + end, +}) diff --git a/mods/PLAYER/simple_skins/intllib.lua b/mods/PLAYER/simple_skins/intllib.lua new file mode 100644 index 000000000..6669d7202 --- /dev/null +++ b/mods/PLAYER/simple_skins/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/mods/PLAYER/simple_skins/license.txt b/mods/PLAYER/simple_skins/license.txt new file mode 100644 index 000000000..fec6f6aa5 --- /dev/null +++ b/mods/PLAYER/simple_skins/license.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 TenPlus1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/mods/PLAYER/simple_skins/locale/fr.po b/mods/PLAYER/simple_skins/locale/fr.po new file mode 100644 index 000000000..30d8e36e7 --- /dev/null +++ b/mods/PLAYER/simple_skins/locale/fr.po @@ -0,0 +1,51 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-29 07:11+0200\n" +"PO-Revision-Date: 2017-07-29 07:17+0200\n" +"Last-Translator: fat115 \n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: init.lua +msgid "Select Player Skin:" +msgstr "Sélectionner l'apparence du joueur :" + +#: init.lua +msgid "Name: " +msgstr "Nom : " + +#: init.lua +msgid "Author: " +msgstr "Auteur : " + +#: init.lua +msgid "Admin command to set player skin" +msgstr "Commande admin pour définir l'apparence du joueur" + +#: init.lua +msgid "'s skin set to" +msgstr ", apparence définie pour" + +#: init.lua +msgid "Set player skin" +msgstr "Définir l'apparence du joueur" + +#: init.lua +msgid "Close" +msgstr "Fermer" + +#: init.lua +msgid "[MOD] Simple Skins loaded" +msgstr "[MOD] Simple Skins chargé" diff --git a/mods/PLAYER/simple_skins/locale/it.po b/mods/PLAYER/simple_skins/locale/it.po new file mode 100644 index 000000000..d4701316d --- /dev/null +++ b/mods/PLAYER/simple_skins/locale/it.po @@ -0,0 +1,52 @@ +# simple_skin . +# Copyright (C) 2018 +# This file is distributed under the same license as the PACKAGE package. +# Stefano Peris , 2018. +# Github: +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-21 07:29+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Stefano Peris \n" +"Language-Team: \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: init.lua +msgid "Select Player Skin:" +msgstr "Seleziona la skin del giocatore" + +#: init.lua +msgid "Name: " +msgstr "Nome" + +#: init.lua +msgid "Author: " +msgstr "Autore" + +#: init.lua +msgid "Admin command to set player skin" +msgstr "Comando di admin per impostare la skin del giocatore" + +#: init.lua +msgid "'s skin set to" +msgstr ", la skin è impostata su" + +#: init.lua +msgid "Set player skin" +msgstr "Imposta la skin del giocatore" + +#: init.lua +msgid "Close" +msgstr "Chiudi" + +#: init.lua +msgid "[MOD] Simple Skins loaded" +msgstr "[MOD] Skins semplici caricate" diff --git a/mods/PLAYER/simple_skins/locale/ms.po b/mods/PLAYER/simple_skins/locale/ms.po new file mode 100644 index 000000000..bba5982d4 --- /dev/null +++ b/mods/PLAYER/simple_skins/locale/ms.po @@ -0,0 +1,51 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-29 07:11+0200\n" +"PO-Revision-Date: 2018-02-14 01:23+0800\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.6\n" +"Last-Translator: MuhdNurHidayat (MNH48) \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Language: ms\n" + +#: init.lua +msgid "Select Player Skin:" +msgstr "Pilih Kulit Pemain:" + +#: init.lua +msgid "Name: " +msgstr "Nama: " + +#: init.lua +msgid "Author: " +msgstr "Pencipta: " + +#: init.lua +msgid "Admin command to set player skin" +msgstr "Perintah pentadbir untuk menetapkan kulit pemain" + +#: init.lua +msgid "'s skin set to" +msgstr " telah ditukarkan kulitnya kepada" + +#: init.lua +msgid "Set player skin" +msgstr "Tetapkan kulit pemain" + +#: init.lua +msgid "Close" +msgstr "Tutup" + +#: init.lua +msgid "[MOD] Simple Skins loaded" +msgstr "[MODS] Simple Skins telah dimuatkan" diff --git a/mods/PLAYER/simple_skins/locale/template.pot b/mods/PLAYER/simple_skins/locale/template.pot new file mode 100644 index 000000000..36282e43c --- /dev/null +++ b/mods/PLAYER/simple_skins/locale/template.pot @@ -0,0 +1,50 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-29 07:11+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: init.lua +msgid "Select Player Skin:" +msgstr "" + +#: init.lua +msgid "Name: " +msgstr "" + +#: init.lua +msgid "Author: " +msgstr "" + +#: init.lua +msgid "Admin command to set player skin" +msgstr "" + +#: init.lua +msgid "'s skin set to" +msgstr "" + +#: init.lua +msgid "Set player skin" +msgstr "" + +#: init.lua +msgid "Close" +msgstr "" + +#: init.lua +msgid "[MOD] Simple Skins loaded" +msgstr "" diff --git a/mods/PLAYER/simple_skins/meta/character.txt b/mods/PLAYER/simple_skins/meta/character.txt new file mode 100644 index 000000000..5a07db19e --- /dev/null +++ b/mods/PLAYER/simple_skins/meta/character.txt @@ -0,0 +1,3 @@ +name = "Steve", +author = "(Texture pack author)", +description = "The default male skin.", diff --git a/mods/PLAYER/simple_skins/meta/character_1.txt b/mods/PLAYER/simple_skins/meta/character_1.txt new file mode 100644 index 000000000..ec4389550 --- /dev/null +++ b/mods/PLAYER/simple_skins/meta/character_1.txt @@ -0,0 +1,3 @@ +name = "Alex", +author = "(Texture pack author)", +description = "The default female skin.", diff --git a/mods/PLAYER/simple_skins/mod.conf b/mods/PLAYER/simple_skins/mod.conf new file mode 100644 index 000000000..aff90aabe --- /dev/null +++ b/mods/PLAYER/simple_skins/mod.conf @@ -0,0 +1 @@ +name = simple_skins diff --git a/mods/PLAYER/simple_skins/readme.md b/mods/PLAYER/simple_skins/readme.md new file mode 100644 index 000000000..0c6980bbb --- /dev/null +++ b/mods/PLAYER/simple_skins/readme.md @@ -0,0 +1,7 @@ +Simple Skins, MineClone 2 Edition + +Simple Skins mod to allow players to select a skin. +Use the chat command /setskin to change skin. + +Original mod: +https://forum.minetest.net/viewtopic.php?id=9100 diff --git a/mods/PLAYER/simple_skins/textures/character_1.png b/mods/PLAYER/simple_skins/textures/character_1.png new file mode 100644 index 0000000000000000000000000000000000000000..71f02471dc622249681a511a66087b803e97dbdf GIT binary patch literal 5505 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 DKOkQJ literal 0 HcmV?d00001 diff --git a/mods/PLAYER/simple_skins/textures/inventory_plus_skins.png b/mods/PLAYER/simple_skins/textures/inventory_plus_skins.png new file mode 100644 index 0000000000000000000000000000000000000000..7cc97759cd8c906632a0ff2712b647c23abc2278 GIT binary patch literal 2182 zcmV;12zmF3P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvvI8d!{O1%o0%F&3SgUe_96t@xjF)G>N>cHZ z&5Qj?pTL1##Z9sDk(O*YzxrUWn-{yeUpSaNS}%`j zYX1s*d<@7z?d{cWa#ue^9ntOheEgny-)q03j=U2)>9b)SSHshC^y|91Rp;-|Ap?vN z;mS{Oy(rM2N{i-cJ9UH@+;kbObKUu4D?U4R{g4v&MayN-GmI}_qk}cS zdAVbuGcTX{Iu*=32t6Ia8DYea%X~8am+N-4)=pg_TW+inm)kjwFgA1h7rj6TEyXk* ze9vW`^2R<9>%m|=Fc&Pa+9obqq(^S~!?Q=fXoIn`H7E~t0EjSmL@?yRfKB8hC9>JM zOavSY_^F88A?+I&pcvgCv%rn_3FH*F=f;>!r>~1n%#aok5qc zn*k)W+nm`#A-K)l=FIYztLVTQ#ZAtj%@`OAlU!VMbN68GSKdqv|B5&FjXATa`#+d7 zn>uCgCvP8E8}(Eae+b&UaARuyg0L;`sw>qs?vo)mWk2v#%5zDOcM(|LNym{*YP&^IxcJR|h?wTg6D7!K?@Pd#hK1L&1i%Qu6q2&}a}r*wVfnsG#M#3E zrPvu+K$WF5hq2*;6R7L~Iu>bAW>U;LR=H4|R1JDxhE$@){;M#8OtQH8F&>yV8L?1N zQ56OYu9#$m#r}*jkiKD2#AGJ?=_pq+^`ZMVV5y2y&o$jB@enwMLy0vHQMdwdT`Y}V z9^Pwt!XaWhg|~)4Q(*__Jg2?Eo>`PV4~HW=&k^O3YvhH~hHCw&j}q`xMqV=FmOuOh zPw(hXIgqDPRcAr$N#*RRbx z7xB1c0{}kG71`<`s^EX6sto=dUm=F1wKC_ZMLNyLStO`aw}VwpYlu~KG??#js_2G- z1GOacj?(J>O2G1#EY@-qsg$o+>W<)cn--3wZ2kt)1t<@#h~&fo000JJOGiWi{{a60 z|De66lK=n!32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0|XW-2Yq6wLI3~($Vo&& zR4C7Fl0irmQ5eU6GYk~EJM7M^>ngKUDy#@)As!Y%C@2b1FJW}ZONSPc4xW-dWQV{G zdP>M30y}l|AW0oIyqLirioi>jQsB@IZ)kK@yLI^TvBVlqSL`UMNi@-Bi*| zJ-$666d0YEADx*OtH#F7%NOroA6{Hr-`??o?z6ec;=uAo_0#sBH!E+SExn%|X#r+e z>r?lx-WtDQ0gG$vO6^Zy8wOr|tS)a Date: Tue, 5 Mar 2019 00:15:20 +0100 Subject: [PATCH 019/379] Replace damage sound to something gender-neutral --- mods/CORE/mcl_sounds/README.txt | 5 ++++- mods/CORE/mcl_sounds/sounds/player_damage.ogg | Bin 5775 -> 6176 bytes 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/mods/CORE/mcl_sounds/README.txt b/mods/CORE/mcl_sounds/README.txt index 54eeab60e..43e6cf30c 100644 --- a/mods/CORE/mcl_sounds/README.txt +++ b/mods/CORE/mcl_sounds/README.txt @@ -67,10 +67,13 @@ blukotek (CC0 1.0) https://www.freesound.org/people/blukotek/sounds/251660/ default_dig_snappy.ogg +sonictechtonic (CC BY 3.0) +https://www.freesound.org/people/sonictechtonic/sounds/241872/ + player_damage.ogg + Voxelands project (CC BY-SA 3.0) mcl_sounds_place_node_water.ogg mcl_sounds_dug_water.ogg - player_damage.ogg (Note: Artists from the Voxelands project include: sdzen, darkrose, sapier, Tom Peter, Telaron, juskiddink) diff --git a/mods/CORE/mcl_sounds/sounds/player_damage.ogg b/mods/CORE/mcl_sounds/sounds/player_damage.ogg index 063e6c08c4da5cd7600b06c9f19edf7592537da3..788808710c1923c9ae797b7534b66a97dd18dd6d 100644 GIT binary patch literal 6176 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 literal 5775 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 a1vyXcfSl;~U7s(N8H&B&y1v~M>i+<8SCM1@ From 2c5038ad058cff4219b09ce5b6c7c113e7d43fe7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 01:50:51 +0100 Subject: [PATCH 020/379] Player skins: Adjust inventory preview image, too --- mods/HUD/mcl_inventory/creative.lua | 14 ++++-- mods/HUD/mcl_inventory/depends.txt | 1 + mods/HUD/mcl_inventory/init.lua | 15 ++++-- mods/PLAYER/mcl_player/init.lua | 14 +++++- mods/PLAYER/simple_skins/init.lua | 47 +++++++++--------- .../PLAYER/simple_skins/textures/player_1.png | Bin 0 -> 2625 bytes 6 files changed, 59 insertions(+), 32 deletions(-) create mode 100644 mods/PLAYER/simple_skins/textures/player_1.png diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index dd5d0bd87..f2afb9640 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -4,6 +4,9 @@ local players = {} -- Containing all the items for each Creative Mode tab local inventory_lists = {} +local show_armor = minetest.get_modpath("3d_armor") ~= nil +local mod_player = minetest.get_modpath("mcl_player") ~= nil + -- TODO: Brewing is disabled. Add brewing (uncommented code) when it is implemented properly -- Create tables @@ -271,15 +274,20 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz inv_bg = "crafting_inventory_creative_survival.png" -- Show armor and player image - local show_armor = minetest.get_modpath("3d_armor") - local img = "player.png" + local img, img_player + if mod_player then + img_player = mcl_player.player_get_preview(player) + else + img_player = "player.png" + end + img = img_player local player_preview = "image[3.9,1.4;1.2333,2.4666;"..img.."]" if show_armor and armor.textures[playername] and armor.textures[playername].preview then img = armor.textures[playername].preview local s1 = img:find("character_preview") if s1 ~= nil then s1 = img:sub(s1+21) - img = "player.png"..s1 + img = img_player..s1 end player_preview = "image[3.9,1.4;1.2333,2.4666;"..img.."]" end diff --git a/mods/HUD/mcl_inventory/depends.txt b/mods/HUD/mcl_inventory/depends.txt index a174c0eee..46d93c42a 100644 --- a/mods/HUD/mcl_inventory/depends.txt +++ b/mods/HUD/mcl_inventory/depends.txt @@ -1,3 +1,4 @@ mcl_init +mcl_player? _mcl_autogroup? 3d_armor? diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 4bd2ef806..3989af19d 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -1,8 +1,7 @@ mcl_inventory = {} -local show_armor = false -if minetest.get_modpath("3d_armor") ~= nil then show_armor = true end - +local show_armor = minetest.get_modpath("3d_armor") ~= nil +local mod_player = minetest.get_modpath("mcl_player") ~= nil -- Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left local function return_item(itemstack, dropper, pos, inv) @@ -59,14 +58,20 @@ local function set_inventory(player, armor_change_only) local player_name = player:get_player_name() -- Show armor and player image - local img = "player.png" + local img, img_player + if mod_player then + img_player = mcl_player.player_get_preview(player) + else + img_player = "player.png" + end + img = img_player local player_preview = "image[0.6,0.2;2,4;"..img.."]" if show_armor and armor.textures[player_name] and armor.textures[player_name].preview then img = armor.textures[player_name].preview local s1 = img:find("character_preview") if s1 ~= nil then s1 = img:sub(s1+21) - img = "player.png"..s1 + img = img_player..s1 end player_preview = "image[1.1,0.2;2,4;"..img.."]" end diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 599acd65a..b01c0b4d5 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -70,10 +70,22 @@ function mcl_player.player_set_model(player, model_name) player_model[name] = model_name end -function mcl_player.player_set_textures(player, textures) +function mcl_player.player_set_textures(player, textures, preview) local name = player:get_player_name() player_textures[name] = textures player:set_properties({textures = textures,}) + if preview then + player:set_attribute("mcl_player:preview", preview) + end +end + +function mcl_player.player_get_preview(player) + local preview = player:get_attribute("mcl_player:preview") + if not preview then + return "player.png" + else + return preview + end end function mcl_player.player_set_animation(player, anim_name, speed) diff --git a/mods/PLAYER/simple_skins/init.lua b/mods/PLAYER/simple_skins/init.lua index 3a41490f4..077278b75 100644 --- a/mods/PLAYER/simple_skins/init.lua +++ b/mods/PLAYER/simple_skins/init.lua @@ -3,7 +3,7 @@ -- Released by TenPlus1 and based on Zeg9's code under MIT license skins = { - skins = {}, meta = {}, + skins = {}, previews = {}, meta = {}, modpath = minetest.get_modpath("simple_skins"), skin_count = 0, -- counter of _custom_ skins (all skins except character.png) } @@ -49,18 +49,30 @@ while true do skins.skin_count = skins.skin_count + 1 end -skins.set_player_skin = function(player, skin) +skins.set_player_skin = function(player, skin_id) if not player then - return + return false end local playername = player:get_player_name() + local skin, preview + if skin_id == nil or type(skin_id) ~= "number" or skin_id < 0 or skin_id > skins.skin_count then + return false + elseif skin_id == 0 then + skin = "character" + preview = "player" + else + skin = "character_" .. tostring(skin_id) + preview = "player_" .. tostring(skin_id) + end skins.skins[playername] = skin - player:set_attribute("simple_skins:skin", skins.skins[playername]) + skins.previews[playername] = preview + player:set_attribute("simple_skins:skin_id", skin_id) skins.update_player_skin(player) if minetest.get_modpath("3d_armor") then armor.textures[playername].skin = skin .. ".png" armor:update_player_visuals(player) end + return true end skins.update_player_skin = function(player) @@ -68,27 +80,21 @@ skins.update_player_skin = function(player) return end local playername = player:get_player_name() - mcl_player.player_set_textures(player, { skins.skins[playername] .. ".png" }) + mcl_player.player_set_textures(player, { skins.skins[playername] .. ".png" }, skins.previews[playername] .. ".png" ) end -- load player skin on join minetest.register_on_joinplayer(function(player) local name = player:get_player_name() - local skin = player:get_attribute("simple_skins:skin") + local skin_id = player:get_attribute("simple_skins:skin_id") local set_skin -- do we already have a skin in player attributes? - if skin then - set_skin = skin - + if skin_id then + set_skin = tonumber(skin_id) -- otherwise use random skin if not set else - local r = math.random(0, skins.skin_count) - if r == 0 then - set_skin = "character" - else - set_skin = "character_" .. r - end + set_skin = math.random(0, skins.skin_count) end if set_skin then skins.set_player_skin(player, set_skin) @@ -125,16 +131,11 @@ minetest.register_chatcommand("setskin", { end local skin - if skin_id == nil or skin_id > skins.skin_count or skin_id < 0 then + local ok = skins.set_player_skin(player, skin_id) + if not ok then return false, S("Invalid skin number! Valid numbers: 0 to @1", skins.skin_count) - elseif skin_id == 0 then - skin = "character" - else - skin = "character_" .. tostring(skin_id) end - - skins.set_player_skin(player, skin) - local skinfile = skin..".png" + local skinfile = "Skin #"..skin_id local your_msg = S("Your skin has been set to: @1", skinfile) if name == playername then diff --git a/mods/PLAYER/simple_skins/textures/player_1.png b/mods/PLAYER/simple_skins/textures/player_1.png new file mode 100644 index 0000000000000000000000000000000000000000..3d7af2a980c2412be1f72e39fd6d7ffeda8f7fb3 GIT binary patch literal 2625 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 Date: Tue, 5 Mar 2019 10:29:49 +0100 Subject: [PATCH 021/379] Player skins: Update inventory preview (part 2) --- mods/HUD/mcl_inventory/creative.lua | 32 ++++++++++++++++++++++++++++ mods/HUD/mcl_inventory/init.lua | 6 ++++++ mods/PLAYER/simple_skins/depends.txt | 1 + mods/PLAYER/simple_skins/init.lua | 3 +++ 4 files changed, 42 insertions(+) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index f2afb9640..d9ad2e94e 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -570,6 +570,38 @@ if minetest.settings:get_bool("creative_mode") then end end + mcl_inventory.update_inventory_formspec = function(player) + local page = nil + + local name = player:get_player_name() + + if players[name].page then + page = players[name].page + else + page = "nix" + end + + -- Figure out current scroll bar from formspec + local formspec = player:get_inventory_formspec() + local start_i = players[name].start_i + + local inv_size + if page == "nix" then + local inv = minetest.get_inventory({type="detached", name="creative_"..name}) + inv_size = inv:get_size("main") + elseif page ~= nil and page ~= "inv" then + inv_size = #(inventory_lists[page]) + else + inv_size = 0 + end + + local filter = players[name].filter + if filter == nil then + filter = "" + end + + mcl_inventory.set_creative_formspec(player, start_i, start_i / (9*5) + 1, inv_size, false, page, filter) + end end minetest.register_on_joinplayer(function(player) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 3989af19d..415c30757 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -127,6 +127,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end) +if not minetest.settings:get_bool("creative_mode") then + mcl_inventory.update_inventory_formspec = function(player) + set_inventory(player) + end +end + -- Drop crafting grid items on leaving minetest.register_on_leaveplayer(function(player) return_fields(player, "craft") diff --git a/mods/PLAYER/simple_skins/depends.txt b/mods/PLAYER/simple_skins/depends.txt index 1927ce890..e0804a6f9 100644 --- a/mods/PLAYER/simple_skins/depends.txt +++ b/mods/PLAYER/simple_skins/depends.txt @@ -1,3 +1,4 @@ mcl_player +mcl_inventory? intllib? 3d_armor? diff --git a/mods/PLAYER/simple_skins/init.lua b/mods/PLAYER/simple_skins/init.lua index 077278b75..98d3e7e85 100644 --- a/mods/PLAYER/simple_skins/init.lua +++ b/mods/PLAYER/simple_skins/init.lua @@ -72,6 +72,9 @@ skins.set_player_skin = function(player, skin_id) armor.textures[playername].skin = skin .. ".png" armor:update_player_visuals(player) end + if minetest.get_modpath("mcl_inventory") then + mcl_inventory.update_inventory_formspec(player) + end return true end From aae30bba3964437830a0793aac64df5eda4743a7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 10:36:53 +0100 Subject: [PATCH 022/379] Rename simple_skins to mcl_skins --- .../minetest-3d_armor/3d_armor/armor.lua | 15 ++++++-- .../{simple_skins => mcl_skins}/depends.txt | 0 .../description.txt | 0 .../{simple_skins => mcl_skins}/init.lua | 36 +++++++++--------- .../{simple_skins => mcl_skins}/intllib.lua | 0 .../{simple_skins => mcl_skins}/license.txt | 0 .../{simple_skins => mcl_skins}/locale/fr.po | 0 .../{simple_skins => mcl_skins}/locale/it.po | 0 .../{simple_skins => mcl_skins}/locale/ms.po | 0 .../locale/template.pot | 0 .../meta/character.txt | 0 .../meta/character_1.txt | 0 mods/PLAYER/mcl_skins/mod.conf | 1 + .../{simple_skins => mcl_skins}/readme.md | 0 .../textures/character_1.png | Bin .../textures/inventory_plus_skins.png | Bin .../textures/player_1.png | Bin mods/PLAYER/simple_skins/mod.conf | 1 - 18 files changed, 31 insertions(+), 22 deletions(-) rename mods/PLAYER/{simple_skins => mcl_skins}/depends.txt (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/description.txt (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/init.lua (78%) rename mods/PLAYER/{simple_skins => mcl_skins}/intllib.lua (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/license.txt (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/locale/fr.po (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/locale/it.po (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/locale/ms.po (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/locale/template.pot (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/meta/character.txt (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/meta/character_1.txt (100%) create mode 100644 mods/PLAYER/mcl_skins/mod.conf rename mods/PLAYER/{simple_skins => mcl_skins}/readme.md (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/textures/character_1.png (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/textures/inventory_plus_skins.png (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/textures/player_1.png (100%) delete mode 100644 mods/PLAYER/simple_skins/mod.conf diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua b/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua index 0b07fb14c..ae9799f9a 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua @@ -66,7 +66,9 @@ armor = { version = "0.4.6", } -if minetest.get_modpath("skins") then +if minetest.get_modpath("mcl_skins") then + skin_mod = "mcl_skins" +elseif minetest.get_modpath("skins") then skin_mod = "skins" elseif minetest.get_modpath("simple_skins") then skin_mod = "simple_skins" @@ -197,7 +199,9 @@ end armor.get_player_skin = function(self, name) local skin = nil - if skin_mod == "skins" or skin_mod == "simple_skins" then + if skin_mod == "mcl_skins" then + skin = mcl_skins.skins[name] + elseif skin_mod == "skins" or skin_mod == "simple_skins" then skin = skins.skins[name] elseif skin_mod == "u_skins" then skin = u_skins.u_skins[name] @@ -380,7 +384,12 @@ minetest.register_on_joinplayer(function(player) wielditem = "3d_armor_trans.png", preview = armor.default_skin.."_preview.png", } - if skin_mod == "skins" then + if skin_mod == "mcl_skins" then + local skin = mcl_skins.skins[name] + if skin then + armor.textures[name].skin = skin..".png" + end + elseif skin_mod == "skins" then local skin = skins.skins[name] if skin and skins.get_type(skin) == skins.type.MODEL then armor.textures[name].skin = skin..".png" diff --git a/mods/PLAYER/simple_skins/depends.txt b/mods/PLAYER/mcl_skins/depends.txt similarity index 100% rename from mods/PLAYER/simple_skins/depends.txt rename to mods/PLAYER/mcl_skins/depends.txt diff --git a/mods/PLAYER/simple_skins/description.txt b/mods/PLAYER/mcl_skins/description.txt similarity index 100% rename from mods/PLAYER/simple_skins/description.txt rename to mods/PLAYER/mcl_skins/description.txt diff --git a/mods/PLAYER/simple_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua similarity index 78% rename from mods/PLAYER/simple_skins/init.lua rename to mods/PLAYER/mcl_skins/init.lua index 98d3e7e85..fc892471b 100644 --- a/mods/PLAYER/simple_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -2,15 +2,15 @@ -- Released by TenPlus1 and based on Zeg9's code under MIT license -skins = { +mcl_skins = { skins = {}, previews = {}, meta = {}, - modpath = minetest.get_modpath("simple_skins"), + modpath = minetest.get_modpath("mcl_skins"), skin_count = 0, -- counter of _custom_ skins (all skins except character.png) } -- Load support for intllib. -local S, NS = dofile(skins.modpath .. "/intllib.lua") +local S, NS = dofile(mcl_skins.modpath .. "/intllib.lua") -- load skin list and metadata @@ -21,7 +21,7 @@ while true do skin = "character_" .. id -- does skin file exist ? - f = io.open(skins.modpath .. "/textures/" .. skin .. ".png") + f = io.open(mcl_skins.modpath .. "/textures/" .. skin .. ".png") -- escape loop if not found and remove last entry if not f then @@ -32,7 +32,7 @@ while true do f:close() -- does metadata exist for that skin file ? - f = io.open(skins.modpath .. "/meta/" .. skin .. ".txt") + f = io.open(mcl_skins.modpath .. "/meta/" .. skin .. ".txt") if f then data = minetest.deserialize("return {" .. f:read('*all') .. "}") @@ -40,22 +40,22 @@ while true do end -- add metadata to list - skins.meta[skin] = { + mcl_skins.meta[skin] = { name = data and data.name or "", author = data and data.author or "", } id = id + 1 - skins.skin_count = skins.skin_count + 1 + mcl_skins.skin_count = mcl_skins.skin_count + 1 end -skins.set_player_skin = function(player, skin_id) +mcl_skins.set_player_skin = function(player, skin_id) if not player then return false end local playername = player:get_player_name() local skin, preview - if skin_id == nil or type(skin_id) ~= "number" or skin_id < 0 or skin_id > skins.skin_count then + if skin_id == nil or type(skin_id) ~= "number" or skin_id < 0 or skin_id > mcl_skins.skin_count then return false elseif skin_id == 0 then skin = "character" @@ -64,10 +64,10 @@ skins.set_player_skin = function(player, skin_id) skin = "character_" .. tostring(skin_id) preview = "player_" .. tostring(skin_id) end - skins.skins[playername] = skin - skins.previews[playername] = preview + mcl_skins.skins[playername] = skin + mcl_skins.previews[playername] = preview player:set_attribute("simple_skins:skin_id", skin_id) - skins.update_player_skin(player) + mcl_skins.update_player_skin(player) if minetest.get_modpath("3d_armor") then armor.textures[playername].skin = skin .. ".png" armor:update_player_visuals(player) @@ -78,12 +78,12 @@ skins.set_player_skin = function(player, skin_id) return true end -skins.update_player_skin = function(player) +mcl_skins.update_player_skin = function(player) if not player then return end local playername = player:get_player_name() - mcl_player.player_set_textures(player, { skins.skins[playername] .. ".png" }, skins.previews[playername] .. ".png" ) + mcl_player.player_set_textures(player, { mcl_skins.skins[playername] .. ".png" }, mcl_skins.previews[playername] .. ".png" ) end -- load player skin on join @@ -97,10 +97,10 @@ minetest.register_on_joinplayer(function(player) set_skin = tonumber(skin_id) -- otherwise use random skin if not set else - set_skin = math.random(0, skins.skin_count) + set_skin = math.random(0, mcl_skins.skin_count) end if set_skin then - skins.set_player_skin(player, set_skin) + mcl_skins.set_player_skin(player, set_skin) end end) @@ -134,9 +134,9 @@ minetest.register_chatcommand("setskin", { end local skin - local ok = skins.set_player_skin(player, skin_id) + local ok = mcl_skins.set_player_skin(player, skin_id) if not ok then - return false, S("Invalid skin number! Valid numbers: 0 to @1", skins.skin_count) + return false, S("Invalid skin number! Valid numbers: 0 to @1", mcl_skins.skin_count) end local skinfile = "Skin #"..skin_id diff --git a/mods/PLAYER/simple_skins/intllib.lua b/mods/PLAYER/mcl_skins/intllib.lua similarity index 100% rename from mods/PLAYER/simple_skins/intllib.lua rename to mods/PLAYER/mcl_skins/intllib.lua diff --git a/mods/PLAYER/simple_skins/license.txt b/mods/PLAYER/mcl_skins/license.txt similarity index 100% rename from mods/PLAYER/simple_skins/license.txt rename to mods/PLAYER/mcl_skins/license.txt diff --git a/mods/PLAYER/simple_skins/locale/fr.po b/mods/PLAYER/mcl_skins/locale/fr.po similarity index 100% rename from mods/PLAYER/simple_skins/locale/fr.po rename to mods/PLAYER/mcl_skins/locale/fr.po diff --git a/mods/PLAYER/simple_skins/locale/it.po b/mods/PLAYER/mcl_skins/locale/it.po similarity index 100% rename from mods/PLAYER/simple_skins/locale/it.po rename to mods/PLAYER/mcl_skins/locale/it.po diff --git a/mods/PLAYER/simple_skins/locale/ms.po b/mods/PLAYER/mcl_skins/locale/ms.po similarity index 100% rename from mods/PLAYER/simple_skins/locale/ms.po rename to mods/PLAYER/mcl_skins/locale/ms.po diff --git a/mods/PLAYER/simple_skins/locale/template.pot b/mods/PLAYER/mcl_skins/locale/template.pot similarity index 100% rename from mods/PLAYER/simple_skins/locale/template.pot rename to mods/PLAYER/mcl_skins/locale/template.pot diff --git a/mods/PLAYER/simple_skins/meta/character.txt b/mods/PLAYER/mcl_skins/meta/character.txt similarity index 100% rename from mods/PLAYER/simple_skins/meta/character.txt rename to mods/PLAYER/mcl_skins/meta/character.txt diff --git a/mods/PLAYER/simple_skins/meta/character_1.txt b/mods/PLAYER/mcl_skins/meta/character_1.txt similarity index 100% rename from mods/PLAYER/simple_skins/meta/character_1.txt rename to mods/PLAYER/mcl_skins/meta/character_1.txt diff --git a/mods/PLAYER/mcl_skins/mod.conf b/mods/PLAYER/mcl_skins/mod.conf new file mode 100644 index 000000000..96f827646 --- /dev/null +++ b/mods/PLAYER/mcl_skins/mod.conf @@ -0,0 +1 @@ +name = mcl_skins diff --git a/mods/PLAYER/simple_skins/readme.md b/mods/PLAYER/mcl_skins/readme.md similarity index 100% rename from mods/PLAYER/simple_skins/readme.md rename to mods/PLAYER/mcl_skins/readme.md diff --git a/mods/PLAYER/simple_skins/textures/character_1.png b/mods/PLAYER/mcl_skins/textures/character_1.png similarity index 100% rename from mods/PLAYER/simple_skins/textures/character_1.png rename to mods/PLAYER/mcl_skins/textures/character_1.png diff --git a/mods/PLAYER/simple_skins/textures/inventory_plus_skins.png b/mods/PLAYER/mcl_skins/textures/inventory_plus_skins.png similarity index 100% rename from mods/PLAYER/simple_skins/textures/inventory_plus_skins.png rename to mods/PLAYER/mcl_skins/textures/inventory_plus_skins.png diff --git a/mods/PLAYER/simple_skins/textures/player_1.png b/mods/PLAYER/mcl_skins/textures/player_1.png similarity index 100% rename from mods/PLAYER/simple_skins/textures/player_1.png rename to mods/PLAYER/mcl_skins/textures/player_1.png diff --git a/mods/PLAYER/simple_skins/mod.conf b/mods/PLAYER/simple_skins/mod.conf deleted file mode 100644 index aff90aabe..000000000 --- a/mods/PLAYER/simple_skins/mod.conf +++ /dev/null @@ -1 +0,0 @@ -name = simple_skins From 788ecbf178fc471ae310c9086f07750205224800 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 10:40:37 +0100 Subject: [PATCH 023/379] Update mcl_skins readme --- mods/PLAYER/mcl_skins/init.lua | 4 +--- mods/PLAYER/mcl_skins/readme.md | 12 +++++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index fc892471b..99228f585 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -1,6 +1,4 @@ --- Simple Skins mod for Minetest (MineClone 2 Edition) - --- Released by TenPlus1 and based on Zeg9's code under MIT license +-- Skins for MineClone 2 mcl_skins = { skins = {}, previews = {}, meta = {}, diff --git a/mods/PLAYER/mcl_skins/readme.md b/mods/PLAYER/mcl_skins/readme.md index 0c6980bbb..bbe5309ab 100644 --- a/mods/PLAYER/mcl_skins/readme.md +++ b/mods/PLAYER/mcl_skins/readme.md @@ -1,7 +1,13 @@ -Simple Skins, MineClone 2 Edition += Skins for MineClone 2 = -Simple Skins mod to allow players to select a skin. +Simple mod to allow players to select a skin. Use the chat command /setskin to change skin. -Original mod: +Forked from Simple Skins by TenPlus1. https://forum.minetest.net/viewtopic.php?id=9100 + +== License == +Code under MIT license +Origial authors: +- TenPlus1 +- Zeg9 From b2c19d9ec60ee1e9c88b89685922b3decdf2e326 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 10:41:57 +0100 Subject: [PATCH 024/379] mcl_skins: Fix attribute name --- mods/PLAYER/mcl_skins/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index 99228f585..b584130c2 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -64,7 +64,7 @@ mcl_skins.set_player_skin = function(player, skin_id) end mcl_skins.skins[playername] = skin mcl_skins.previews[playername] = preview - player:set_attribute("simple_skins:skin_id", skin_id) + player:set_attribute("mcl_skins:skin_id", tostring(skin_id)) mcl_skins.update_player_skin(player) if minetest.get_modpath("3d_armor") then armor.textures[playername].skin = skin .. ".png" @@ -88,7 +88,7 @@ end minetest.register_on_joinplayer(function(player) local name = player:get_player_name() - local skin_id = player:get_attribute("simple_skins:skin_id") + local skin_id = player:get_attribute("mcl_skins:skin_id") local set_skin -- do we already have a skin in player attributes? if skin_id then From 5601f8e0b79fab373b871bde2f5413b2cfd11fad Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 10:45:14 +0100 Subject: [PATCH 025/379] Rename some files --- mods/PLAYER/mcl_skins/{license.txt => LICENSE.txt} | 0 mods/PLAYER/mcl_skins/{readme.md => README.md} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename mods/PLAYER/mcl_skins/{license.txt => LICENSE.txt} (100%) rename mods/PLAYER/mcl_skins/{readme.md => README.md} (100%) diff --git a/mods/PLAYER/mcl_skins/license.txt b/mods/PLAYER/mcl_skins/LICENSE.txt similarity index 100% rename from mods/PLAYER/mcl_skins/license.txt rename to mods/PLAYER/mcl_skins/LICENSE.txt diff --git a/mods/PLAYER/mcl_skins/readme.md b/mods/PLAYER/mcl_skins/README.md similarity index 100% rename from mods/PLAYER/mcl_skins/readme.md rename to mods/PLAYER/mcl_skins/README.md From 62eaf60938e4b1f7c28db6b76143498911b82ea0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 10:57:57 +0100 Subject: [PATCH 026/379] mcl_skins: Add fallback code if skin was missing --- mods/PLAYER/mcl_skins/init.lua | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index b584130c2..a822218d2 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -73,6 +73,7 @@ mcl_skins.set_player_skin = function(player, skin_id) if minetest.get_modpath("mcl_inventory") then mcl_inventory.update_inventory_formspec(player) end + minetest.log("action", "[mcl_skins] Player skin for "..playername.." set to skin #"..skin_id) return true end @@ -98,7 +99,12 @@ minetest.register_on_joinplayer(function(player) set_skin = math.random(0, mcl_skins.skin_count) end if set_skin then - mcl_skins.set_player_skin(player, set_skin) + local ok = mcl_skins.set_player_skin(player, set_skin) + if not ok then + set_skin = math.random(0, mcl_skins.skin_count) + minetest.log("warning", "[mcl_skins] Player skin for "..name.." not found, falling back to skin #"..set_skin) + mcl_skins.set_player_skin(player, set_skin) + end end end) @@ -148,3 +154,5 @@ minetest.register_chatcommand("setskin", { end, }) + +minetest.log("action", "[mcl_skins] Mod initialized with "..mcl_skins.skin_count.." custom skin(s)") From 9a54383a23e50580d2cca242b27e8d8864067b6f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 11:43:09 +0100 Subject: [PATCH 027/379] Add mesh hand --- mods/PLAYER/mcl_meshhand/README.md | 9 ++++ mods/PLAYER/mcl_meshhand/depends.txt | 1 + mods/PLAYER/mcl_meshhand/description.txt | 1 + mods/PLAYER/mcl_meshhand/init.lua | 47 ++++++++++++++++++ mods/PLAYER/mcl_meshhand/mod.conf | 1 + .../mcl_meshhand/models/mcl_meshhand.b3d | Bin 0 -> 1023 bytes .../mcl_meshhand/models/mcl_meshhand.blend | Bin 0 -> 554856 bytes mods/PLAYER/mcl_skins/init.lua | 20 ++++++-- 8 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 mods/PLAYER/mcl_meshhand/README.md create mode 100644 mods/PLAYER/mcl_meshhand/depends.txt create mode 100644 mods/PLAYER/mcl_meshhand/description.txt create mode 100644 mods/PLAYER/mcl_meshhand/init.lua create mode 100644 mods/PLAYER/mcl_meshhand/mod.conf create mode 100644 mods/PLAYER/mcl_meshhand/models/mcl_meshhand.b3d create mode 100644 mods/PLAYER/mcl_meshhand/models/mcl_meshhand.blend diff --git a/mods/PLAYER/mcl_meshhand/README.md b/mods/PLAYER/mcl_meshhand/README.md new file mode 100644 index 000000000..2c796ff32 --- /dev/null +++ b/mods/PLAYER/mcl_meshhand/README.md @@ -0,0 +1,9 @@ +Mesh hand mod for MineClone 2. + +This mod uses a better-looking mesh for the wieldhand and applies the player skin texture to it. + +== Credits == +Based on 3D Hand [newhand] mod by jordan4ibanez. +https://forum.minetest.net/viewtopic.php?t=16435 + +License: CC0 diff --git a/mods/PLAYER/mcl_meshhand/depends.txt b/mods/PLAYER/mcl_meshhand/depends.txt new file mode 100644 index 000000000..f8be59ba7 --- /dev/null +++ b/mods/PLAYER/mcl_meshhand/depends.txt @@ -0,0 +1 @@ +mcl_skins? diff --git a/mods/PLAYER/mcl_meshhand/description.txt b/mods/PLAYER/mcl_meshhand/description.txt new file mode 100644 index 000000000..7a4daae59 --- /dev/null +++ b/mods/PLAYER/mcl_meshhand/description.txt @@ -0,0 +1 @@ +Applies the player skin texture to the hand. diff --git a/mods/PLAYER/mcl_meshhand/init.lua b/mods/PLAYER/mcl_meshhand/init.lua new file mode 100644 index 000000000..1e318a5b5 --- /dev/null +++ b/mods/PLAYER/mcl_meshhand/init.lua @@ -0,0 +1,47 @@ +local has_mcl_skins = minetest.get_modpath("mcl_skins") ~= nil + +-- mcl_skins is enabled +if has_mcl_skins == true then + --generate a node for every skin + for _,texture in pairs(mcl_skins.list) do + minetest.register_node("mcl_meshhand:"..texture, { + description = "", + tiles = {texture..".png"}, + inventory_image = "blank.png", + visual_scale = 1, + wield_scale = {x=1,y=1,z=1}, + paramtype = "light", + drawtype = "mesh", + mesh = "mcl_meshhand.b3d", + node_placement_prediction = "", + }) + end + --change the player's hand to their skin + minetest.register_on_joinplayer(function(player) + local skin = mcl_skins.skins[player:get_player_name()] + player:get_inventory():set_stack("hand", 1, "mcl_meshhand:"..skin) + end) + + mcl_skins.register_on_set_skin(function(player, skin) + local name = player:get_player_name() + player:get_inventory():set_stack("hand", 1, "mcl_meshhand:"..skin) + end) + +--do default skin if no skin mod installed +else + minetest.register_node("mcl_meshhand:hand", { + description = "", + tiles = {"character.png"}, + inventory_image = "blank.png", + visual_scale = 1, + wield_scale = {x=1,y=1,z=1}, + paramtype = "light", + drawtype = "mesh", + mesh = "mcl_meshhand.b3d", + node_placement_prediction = "", + }) + + minetest.register_on_joinplayer(function(player) + player:get_inventory():set_stack("hand", 1, "mcl_meshhand:hand") + end) +end diff --git a/mods/PLAYER/mcl_meshhand/mod.conf b/mods/PLAYER/mcl_meshhand/mod.conf new file mode 100644 index 000000000..6b57f4a49 --- /dev/null +++ b/mods/PLAYER/mcl_meshhand/mod.conf @@ -0,0 +1 @@ +name = mcl_meshhand diff --git a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.b3d b/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.b3d new file mode 100644 index 0000000000000000000000000000000000000000..a38124c60799c4b19b9260a94c712be38bfd7628 GIT binary patch literal 1023 zcmaizO(;ZR6ox;8@iz?PZ)~`W!9pUWSlpv&)KJEBM>aO3*)S+OE3?9aji05WYzU=n z(A@8?EJ$V}?ChmTQc}F<&J~;Me)Tlx%scbmbG~y=FxVb?&lVy}2oV_!^*$nwCdTIC zv-slgNsJGON3&vs^|Z>N?%7fxvF>RJut`DpsG6Mj8F zp5dN>N;iP_L>^@2B1YveQNbpHjG!${(M@EPqs-*R8r4kI-Jt4RrPwbQfNd!Ltry`Lvs$>(C{1Rfty8zxDn+b>Xi!Mqc{~ z{seysf9RR|9-0nPOK!iBUQ~6|N2pInee%cOb+{n2cN-05a$ZM&I{K674?6n`vey;! z`S$&>p8V&2*gxsm-~acYB&YtJ?$3UHnfjdko$9lnZ`ADHem<-#x-@9Md1D5ec-*|gEbN6e&Ev$azPHrvvQ6LK>^4IMOMyn2`C00;I(p&eV`1K Sf^sY8xC&H)3Q%q39Df5lv^ReM literal 0 HcmV?d00001 diff --git a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.blend b/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.blend new file mode 100644 index 0000000000000000000000000000000000000000..495e74eb589d0278a611a6ace59b53364627e7c1 GIT binary patch literal 554856 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 mcl_skins.skin_count then return false elseif skin_id == 0 then @@ -62,17 +66,21 @@ mcl_skins.set_player_skin = function(player, skin_id) skin = "character_" .. tostring(skin_id) preview = "player_" .. tostring(skin_id) end + skin_file = skin .. ".png" mcl_skins.skins[playername] = skin mcl_skins.previews[playername] = preview player:set_attribute("mcl_skins:skin_id", tostring(skin_id)) mcl_skins.update_player_skin(player) if minetest.get_modpath("3d_armor") then - armor.textures[playername].skin = skin .. ".png" + armor.textures[playername].skin = skin_file armor:update_player_visuals(player) end if minetest.get_modpath("mcl_inventory") then mcl_inventory.update_inventory_formspec(player) end + for i=1, #mcl_skins.registered_on_set_skins do + mcl_skins.registered_on_set_skins[i](player, skin) + end minetest.log("action", "[mcl_skins] Player skin for "..playername.." set to skin #"..skin_id) return true end @@ -108,6 +116,12 @@ minetest.register_on_joinplayer(function(player) end end) +mcl_skins.registered_on_set_skins = {} + +mcl_skins.register_on_set_skin = function(func) + table.insert(mcl_skins.registered_on_set_skins, func) +end + -- command to set player skin (usually for custom skins) minetest.register_chatcommand("setskin", { params = "[] ", From c84656f85a672e5ed77cc51d7603f3815c545714 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 13:50:35 +0100 Subject: [PATCH 028/379] Add fancy GUI to select skin --- mods/HUD/mcl_inventory/creative.lua | 5 +- mods/HUD/mcl_inventory/init.lua | 3 + mods/PLAYER/mcl_skins/init.lua | 109 +++++++++++++++--- mods/PLAYER/mcl_skins/meta/character.txt | 3 +- mods/PLAYER/mcl_skins/meta/character_1.txt | 3 +- .../textures/inventory_plus_skins.png | Bin 2182 -> 0 bytes .../mcl_skins/textures/mcl_skins_button.png | Bin 0 -> 2010 bytes 7 files changed, 100 insertions(+), 23 deletions(-) delete mode 100644 mods/PLAYER/mcl_skins/textures/inventory_plus_skins.png create mode 100644 mods/PLAYER/mcl_skins/textures/mcl_skins_button.png diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index d9ad2e94e..fcc8efddb 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -324,8 +324,11 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz -- help button "image_button[9,2;1,1;doc_button_icon_lores.png;__mcl_doc;]".. "tooltip[__mcl_doc;Help]".. + -- skins button + "image_button[9,3;1,1;mcl_skins_button.png;__mcl_skins;]".. + "tooltip[__mcl_skins;Select player skin]".. -- achievements button - "image_button[9,3;1,1;mcl_achievements_button.png;__mcl_achievements;]".. + "image_button[9,4;1,1;mcl_achievements_button.png;__mcl_achievements;]".. "tooltip[__mcl_achievements;Achievements]" -- For shortcuts diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 415c30757..05f61aac0 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -105,6 +105,9 @@ local function set_inventory(player, armor_change_only) -- help button "image_button[8,3;1,1;doc_button_icon_lores.png;__mcl_doc;]".. "tooltip[__mcl_doc;Help]".. + -- skins button + "image_button[3,3;1,1;mcl_skins_button.png;__mcl_skins;]".. + "tooltip[__mcl_skins;Select player skin]".. -- achievements button "image_button[7,3;1,1;mcl_achievements_button.png;__mcl_achievements;]".. "tooltip[__mcl_achievements;Achievements]".. diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index c24ce4a4c..8fe76db3e 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -12,26 +12,26 @@ local S, NS = dofile(mcl_skins.modpath .. "/intllib.lua") -- load skin list and metadata -local id, f, data, skin = 1 - -mcl_skins.list[0] = "character" +local id, f, data, skin = 0 while true do - skin = "character_" .. id + if id == 0 then + skin = "character" + else + skin = "character_" .. id - -- does skin file exist ? - f = io.open(mcl_skins.modpath .. "/textures/" .. skin .. ".png") + -- does skin file exist ? + f = io.open(mcl_skins.modpath .. "/textures/" .. skin .. ".png") - -- escape loop if not found and remove last entry - if not f then - mcl_skins.list[id] = nil - id = id - 1 - break + -- escape loop if not found + if not f then + break + end + f:close() end - f:close() - table.insert(mcl_skins.list, skin) + mcl_skins.list[id] = skin -- does metadata exist for that skin file ? f = io.open(mcl_skins.modpath .. "/meta/" .. skin .. ".txt") @@ -47,8 +47,10 @@ while true do author = data and data.author or "", } + if id > 0 then + mcl_skins.skin_count = mcl_skins.skin_count + 1 + end id = id + 1 - mcl_skins.skin_count = mcl_skins.skin_count + 1 end mcl_skins.set_player_skin = function(player, skin_id) @@ -124,11 +126,15 @@ end -- command to set player skin (usually for custom skins) minetest.register_chatcommand("setskin", { - params = "[] ", + params = "[] []", description = S("Select player skin of yourself or another player"), privs = {}, func = function(name, param) + if param == "" and name ~= "" then + mcl_skins.show_formspec(name) + return true + end local playername, skin_id = string.match(param, "([^ ]+) (%d+)") if not playername or not skin_id then skin_id = string.match(param, "(%d+)") @@ -156,17 +162,84 @@ minetest.register_chatcommand("setskin", { if not ok then return false, S("Invalid skin number! Valid numbers: 0 to @1", mcl_skins.skin_count) end - local skinfile = "Skin #"..skin_id + local skinfile = "#"..skin_id - local your_msg = S("Your skin has been set to: @1", skinfile) + local meta = mcl_skins.meta[mcl_skins.skins[playername]] + local your_msg = S("Your skin has been set to: @1 (@2)", meta.name, skinfile) if name == playername then return true, your_msg else minetest.chat_send_player(playername, your_msg) - return true, S("Skin of @1 set to: @2", playername, skinfile) + return true, S("Skin of @1 set to: @2 (@3)", playername, meta.name, skinfile) end end, }) +minetest.register_on_player_receive_fields(function(player, formname, fields) + if fields.__mcl_skins then + mcl_skins.show_formspec(player:get_player_name()) + end +end) + +mcl_skins.show_formspec = function(playername) + local formspec = "size[7,8.5]" + + formspec = formspec .. "label[2,2;" .. minetest.formspec_escape(S("Select player skin:")) .. "]" + .. "textlist[0,2.5;6.8,6;skins_set;" + + local meta + local selected = 1 + + for i = 0, mcl_skins.skin_count do + + local label = S("@1 (@2)", mcl_skins.meta[mcl_skins.list[i] ].name, "#"..i) + + formspec = formspec .. minetest.formspec_escape(label) + + if mcl_skins.skins[playername] == mcl_skins.list[i] then + selected = i + 1 + meta = mcl_skins.meta[mcl_skins.list[i]] + end + + if i < #mcl_skins.list then + formspec = formspec .."," + end + end + + formspec = formspec .. ";" .. selected .. ";false]" + + formspec = formspec .. "image[0,0;1.35,2.7;" .. mcl_skins.previews[playername] .. ".png]" + + if meta then + if meta.name then + formspec = formspec .. "label[2,0.5;" .. minetest.formspec_escape(S("Name: @1", meta.name)) .. "]" + end + end + + minetest.show_formspec(playername, "mcl_skins:skin_select", formspec) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + + if formname == "mcl_skins:skin_select" then + + local name = player:get_player_name() + + local event = minetest.explode_textlist_event(fields["skins_set"]) + + if event.type == "CHG" or event.type == "DCL" then + + local skin_id = math.min(event.index - 1, mcl_skins.skin_count) + if not mcl_skins.list[skin_id] then + return -- Do not update wrong skin number + end + + mcl_skins.set_player_skin(player, skin_id) + mcl_skins.show_formspec(name) + end + end +end) + minetest.log("action", "[mcl_skins] Mod initialized with "..mcl_skins.skin_count.." custom skin(s)") + diff --git a/mods/PLAYER/mcl_skins/meta/character.txt b/mods/PLAYER/mcl_skins/meta/character.txt index 5a07db19e..00061a654 100644 --- a/mods/PLAYER/mcl_skins/meta/character.txt +++ b/mods/PLAYER/mcl_skins/meta/character.txt @@ -1,3 +1,2 @@ name = "Steve", -author = "(Texture pack author)", -description = "The default male skin.", +author = "%TEXTURE_PACK_AUTHOR%", diff --git a/mods/PLAYER/mcl_skins/meta/character_1.txt b/mods/PLAYER/mcl_skins/meta/character_1.txt index ec4389550..f96b13f68 100644 --- a/mods/PLAYER/mcl_skins/meta/character_1.txt +++ b/mods/PLAYER/mcl_skins/meta/character_1.txt @@ -1,3 +1,2 @@ name = "Alex", -author = "(Texture pack author)", -description = "The default female skin.", +author = "%TEXTURE_PACK_AUTHOR%", diff --git a/mods/PLAYER/mcl_skins/textures/inventory_plus_skins.png b/mods/PLAYER/mcl_skins/textures/inventory_plus_skins.png deleted file mode 100644 index 7cc97759cd8c906632a0ff2712b647c23abc2278..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2182 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 literal 0 HcmV?d00001 From 35bafb2aeb166ee204329ac685b1af384e0ef9f2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 13:59:00 +0100 Subject: [PATCH 029/379] Skin button cycle skins if low skin count --- mods/PLAYER/mcl_skins/init.lua | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index 8fe76db3e..d8d4ebba5 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -53,6 +53,18 @@ while true do id = id + 1 end +mcl_skins.cycle_skin = function(player) + local skin_id = tonumber(player:get_attribute("mcl_skins:skin_id")) + if not skin_id then + skin_id = 0 + end + skin_id = skin_id + 1 + if skin_id > mcl_skins.skin_count then + skin_id = 0 + end + mcl_skins.set_player_skin(player, skin_id) +end + mcl_skins.set_player_skin = function(player, skin_id) if not player then return false @@ -178,7 +190,13 @@ minetest.register_chatcommand("setskin", { minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.__mcl_skins then - mcl_skins.show_formspec(player:get_player_name()) + if mcl_skins.skin_count <= 6 then + -- Change skin immediately if there are not many skins + mcl_skins.cycle_skin(player) + else + -- Show skin selection formspec otherwise + mcl_skins.show_formspec(player:get_player_name()) + end end end) From 9e84763478218430c52ee925bf1099ef4e0276f7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 14:19:57 +0100 Subject: [PATCH 030/379] mcl_skins: USe fallback if no preview img --- mods/PLAYER/mcl_skins/init.lua | 23 +++++++++++++++--- .../mcl_skins/textures/player_dummy.png | Bin 0 -> 982 bytes 2 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 mods/PLAYER/mcl_skins/textures/player_dummy.png diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index d8d4ebba5..53e73f975 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -1,7 +1,7 @@ -- Skins for MineClone 2 mcl_skins = { - skins = {}, list = {}, previews = {}, meta = {}, + skins = {}, list = {}, previews = {}, meta = {}, has_preview = {}, modpath = minetest.get_modpath("mcl_skins"), skin_count = 0, -- counter of _custom_ skins (all skins except character.png) } @@ -18,10 +18,12 @@ while true do if id == 0 then skin = "character" + mcl_skins.has_preview[id] = true else skin = "character_" .. id + local preview = "player_" .. id - -- does skin file exist ? + -- Does skin file exist? f = io.open(mcl_skins.modpath .. "/textures/" .. skin .. ".png") -- escape loop if not found @@ -29,6 +31,16 @@ while true do break end f:close() + + -- Does skin preview file exist? + local file_preview = io.open(mcl_skins.modpath .. "/textures/" .. preview .. ".png") + if file_preview == nil then + minetest.log("warning", "[mcl_skins] Player skin #"..id.." does not have preview image (player_"..id..".png)") + mcl_skins.has_preview[id] = false + else + mcl_skins.has_preview[id] = true + file_preview:close() + end end mcl_skins.list[id] = skin @@ -78,7 +90,12 @@ mcl_skins.set_player_skin = function(player, skin_id) preview = "player" else skin = "character_" .. tostring(skin_id) - preview = "player_" .. tostring(skin_id) + if mcl_skins.has_preview[skin_id] then + preview = "player_" .. tostring(skin_id) + else + -- Fallback preview image if preview image is missing + preview = "player_dummy" + end end skin_file = skin .. ".png" mcl_skins.skins[playername] = skin diff --git a/mods/PLAYER/mcl_skins/textures/player_dummy.png b/mods/PLAYER/mcl_skins/textures/player_dummy.png new file mode 100644 index 0000000000000000000000000000000000000000..d1f7dc20aa3dd99924ce8f2f65a2d010c90a9246 GIT binary patch literal 982 zcmV;{11bE8P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=EHmLn$&h2L34mQa!q63d||I43)p<>x}-fA=Kq z^y7eCP_npyK7m8~^>+_{p-}V~qME0i(uNXq%v{j%?JQ?YTb$4JvRyh4_Q01P7$!k0 z=WA-qzre1y0T!2if3ydyOUIWGU4>_nG4tpzKVL$^r=8Y&$ZK4QciUNCu1j`_Kfgyq zFb;*DaNs5+8=gL95v)M66tps*%EJ<8f7n^#``88lB6!!{Q|z{~?D80ju%+dYo?^7@ zq)&FaPQwo?qT9?5KkR9X+kLreylhu>&-B)EX!gBifxJ9aN}On{B0vB}Q&+XqhX^w7D2(u5uzkrOpNnM-T^z3Tgr~ zU)Mr&-aO~4UQ(7{F|0gm&S8)J;7FDsvBTrB{hlEi=p2L-TVROFB0BFeF-Xbh^F z)YLU=Ns?mHl#-=!M->x`rk2diEn9K%=<3PM-Lsd>S#X7EPT4~CoO3Cdv_QIGbb&`H zJMXf`UH7!x?t9)#Mf%iOwWey-Yp&(sLk=AOBOMkFKk`u;HKbCDOs2Ws?0?)TJaQ5(eK^s^f^n9VK{G_DgJ%s`AIfw&Cal%s3Rvphi0295jf5U~I(N>B{a#?zh~6#&2=sugHag?kC8Ffo_p|<@Sc!QRY92 zOhDrlj+k!Jaj~_+K0ckjYd!n0>auF=xRI9ixoxGbvEhF3i`zHE!t+W#6$|anwmuOH z_xt>QjBaiCH;4b){t@~*5ifwkCt3V1Rl=u7;#n+wdL*93!v8s6FERQFvG5Zo|K%FN zwUxs^GVa87H8c1700006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6 z000McNliru;{yc^2^i)K`62)S06$4YK~zY`V>~mjjsY2Ly#N0{10LY7$jFGyXJVib zj2bW)3}7J?@8|$s{b(SL8Zcb)0(u!YS|*MfFhUIg0F7=Dy0Zh%7ytkO07*qoM6N<$ Eg6UDq0RR91 literal 0 HcmV?d00001 From 918c408e4dc8fa77155753a1e2802140321e9420 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 14:26:44 +0100 Subject: [PATCH 031/379] mcl_skins now obeys file name conventions --- mods/PLAYER/mcl_skins/init.lua | 17 +++++++++++------ .../{character.txt => mcl_skins_character.txt} | 0 ...aracter_1.txt => mcl_skins_character_1.txt} | 0 ...aracter_1.png => mcl_skins_character_1.png} | Bin .../{player_1.png => mcl_skins_player_1.png} | Bin ...er_dummy.png => mcl_skins_player_dummy.png} | Bin 6 files changed, 11 insertions(+), 6 deletions(-) rename mods/PLAYER/mcl_skins/meta/{character.txt => mcl_skins_character.txt} (100%) rename mods/PLAYER/mcl_skins/meta/{character_1.txt => mcl_skins_character_1.txt} (100%) rename mods/PLAYER/mcl_skins/textures/{character_1.png => mcl_skins_character_1.png} (100%) rename mods/PLAYER/mcl_skins/textures/{player_1.png => mcl_skins_player_1.png} (100%) rename mods/PLAYER/mcl_skins/textures/{player_dummy.png => mcl_skins_player_dummy.png} (100%) diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index 53e73f975..f8bd82645 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -20,8 +20,8 @@ while true do skin = "character" mcl_skins.has_preview[id] = true else - skin = "character_" .. id - local preview = "player_" .. id + skin = "mcl_skins_character_" .. id + local preview = "mcl_skins_player_" .. id -- Does skin file exist? f = io.open(mcl_skins.modpath .. "/textures/" .. skin .. ".png") @@ -46,7 +46,12 @@ while true do mcl_skins.list[id] = skin -- does metadata exist for that skin file ? - f = io.open(mcl_skins.modpath .. "/meta/" .. skin .. ".txt") + if id == 0 then + metafile = "mcl_skins_character.txt" + else + metafile = "mcl_skins_character_"..id..".txt" + end + f = io.open(mcl_skins.modpath .. "/meta/" .. metafile) if f then data = minetest.deserialize("return {" .. f:read('*all') .. "}") @@ -89,12 +94,12 @@ mcl_skins.set_player_skin = function(player, skin_id) skin = "character" preview = "player" else - skin = "character_" .. tostring(skin_id) + skin = "mcl_skins_character_" .. tostring(skin_id) if mcl_skins.has_preview[skin_id] then - preview = "player_" .. tostring(skin_id) + preview = "mcl_skins_player_" .. tostring(skin_id) else -- Fallback preview image if preview image is missing - preview = "player_dummy" + preview = "mcl_skins_player_dummy" end end skin_file = skin .. ".png" diff --git a/mods/PLAYER/mcl_skins/meta/character.txt b/mods/PLAYER/mcl_skins/meta/mcl_skins_character.txt similarity index 100% rename from mods/PLAYER/mcl_skins/meta/character.txt rename to mods/PLAYER/mcl_skins/meta/mcl_skins_character.txt diff --git a/mods/PLAYER/mcl_skins/meta/character_1.txt b/mods/PLAYER/mcl_skins/meta/mcl_skins_character_1.txt similarity index 100% rename from mods/PLAYER/mcl_skins/meta/character_1.txt rename to mods/PLAYER/mcl_skins/meta/mcl_skins_character_1.txt diff --git a/mods/PLAYER/mcl_skins/textures/character_1.png b/mods/PLAYER/mcl_skins/textures/mcl_skins_character_1.png similarity index 100% rename from mods/PLAYER/mcl_skins/textures/character_1.png rename to mods/PLAYER/mcl_skins/textures/mcl_skins_character_1.png diff --git a/mods/PLAYER/mcl_skins/textures/player_1.png b/mods/PLAYER/mcl_skins/textures/mcl_skins_player_1.png similarity index 100% rename from mods/PLAYER/mcl_skins/textures/player_1.png rename to mods/PLAYER/mcl_skins/textures/mcl_skins_player_1.png diff --git a/mods/PLAYER/mcl_skins/textures/player_dummy.png b/mods/PLAYER/mcl_skins/textures/mcl_skins_player_dummy.png similarity index 100% rename from mods/PLAYER/mcl_skins/textures/player_dummy.png rename to mods/PLAYER/mcl_skins/textures/mcl_skins_player_dummy.png From a1c0a1f82f95bfa7991c64f1ef3c143c562b83ea Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 14:33:16 +0100 Subject: [PATCH 032/379] Harden mcl_skins against missing metadata --- mods/PLAYER/mcl_skins/init.lua | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index f8bd82645..cfb0ff831 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -53,6 +53,7 @@ while true do end f = io.open(mcl_skins.modpath .. "/meta/" .. metafile) + data = nil if f then data = minetest.deserialize("return {" .. f:read('*all') .. "}") f:close() @@ -199,7 +200,12 @@ minetest.register_chatcommand("setskin", { local skinfile = "#"..skin_id local meta = mcl_skins.meta[mcl_skins.skins[playername]] - local your_msg = S("Your skin has been set to: @1 (@2)", meta.name, skinfile) + local your_msg + if not meta.name or meta.name == "" then + your_msg = S("Your skin has been set to: @1", skinfile) + else + your_msg = S("Your skin has been set to: @1 (@2)", meta.name, skinfile) + end if name == playername then return true, your_msg else @@ -233,7 +239,7 @@ mcl_skins.show_formspec = function(playername) for i = 0, mcl_skins.skin_count do - local label = S("@1 (@2)", mcl_skins.meta[mcl_skins.list[i] ].name, "#"..i) + local label = S("@1 (@2)", mcl_skins.meta[mcl_skins.list[i]].name, "#"..i) formspec = formspec .. minetest.formspec_escape(label) @@ -252,7 +258,7 @@ mcl_skins.show_formspec = function(playername) formspec = formspec .. "image[0,0;1.35,2.7;" .. mcl_skins.previews[playername] .. ".png]" if meta then - if meta.name then + if meta.name and meta.name ~= "" then formspec = formspec .. "label[2,0.5;" .. minetest.formspec_escape(S("Name: @1", meta.name)) .. "]" end end From 08d3df10d43a562f40654adb50d284c08a4bc382 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 03:41:03 +0100 Subject: [PATCH 033/379] Version 0.48.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9a35de3ed..2a70ceef4 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.47.1 +Version: 0.48.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From b31a71741023a8c14fe7d80164f0c493a6a6cf97 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 04:10:40 +0100 Subject: [PATCH 034/379] Fix player model for MT 5.0.0 --- .../3d_armor/models/3d_armor_character.b3d | Bin 141046 -> 151606 bytes .../3d_armor/models/3d_armor_character.blend | Bin 711484 -> 775480 bytes mods/PLAYER/mcl_player/models/character.b3d | Bin 84526 -> 73433 bytes mods/PLAYER/mcl_player/models/character.blend | Bin 634876 -> 698016 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/models/3d_armor_character.b3d b/mods/ITEMS/minetest-3d_armor/3d_armor/models/3d_armor_character.b3d index 7c27caeb5e1fc862897adcfadb5f07f5dcc4471c..c4d45b50e371fd8030dec685c001809526ea1b87 100644 GIT binary patch literal 151606 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

gUX+W!Wzx@0XtlH6GQ}=^ zTjlv+gCRIxoRiRrmzeb?s%E|AE_TDxwW5Ab(7qW-bBlpyy_q!YMJskgQD<8?4}xOW zyRXbcmT@%eId41~(&sF?O{e%E@*(D|>ojK-rCHB|X1$dzcEy{F{X+RVV}D!a)GGJo z$`q)cetnklZ!)y2KR_Gv0a_|BI^NHRH6Nf|`vKZ@Dy{QNotUkZ7v>V5t%m^p%pme5 z;w4BwBu-x&LbsI;u}pgsZQP*IX2dnL_9?nP6WYn+2U~p?M3^?Z(H@{55*ONB6&_hP z%_(f&+HpTC z+TUkYl%Ct$o8vTEu^xn7!917f*{Nq}x!kjIN&9R1n`t44BUI0aG}`CIXQv(~SUU~4 zW1__<-lktisqL)zkfj}wx}-?;5=v?30|!JM;lCGV^0AD`$(%klkfR>fqBZ~P87T2*5Xn zznQd-9e!T)irot>e9-Na<$cz9`S`4h-RG*MvSWKpL+DJ~eXlUv{n-6ZZTkIcUG3Yq zZ@u2UeH(kg)h@kbdrU*d#KHBNR{1xE(5(~)dc_`s zR*8e_Jto!;r1;V+=4Yo?e+{u#kr)hz-$Tp&_lU*^ZT}567`9NIS*DGQHXel*=jPn! zISyREqW_vxBTdJk#WkYy`i!+=T}0;%HRY!Md*XNzbE;FDes0xRCn(n2{Z9??qW`Y- zYh?Zfc2PSnTGcw1zO4JT`M8T+<#_rMb~^97O-U?Q4ub=jww?jyb-f|5AM8&pWm0=ayOCk|}TT7hLR$H@qe@>ft)| zU#f@ri?Hji&L&X*?Qz^Q{t~oYzv^1&`pq$MaFSQ*;<(Gu^4e5uMgI+^b+M=%_1}@v zTdp{@>GezRGW=D(7N02x{}P9KUk~hUC@`l3Eu!cVAWde@qXJkF^aU${mBA{YALtL#gy1~r&XV&mg8?8_zVo1}b{^Hi zK(GcF1l9y=ffmpTN}vsN76N@8jQ4fGx?nx9KG*aqu&+1XvO*1(pWOfMvmQpcm*3mIr;n3SdRh7pw$U z2CIO6pg(8?O`sX1yTi_-Dp(Dy4hDiXz#yHK8ur62+tPeH- z8-k6%#$Xe$DcB5b4t@@{09%5sz}8?Jur1gQY!7w-JA$3SFTgLs&R`d?E7%SE3hWMk z4fX(gg1x}rU?1=surK&6_#M~}{2u%P><ZC^!rp4vqjvf}_CE;23Z$ zI1UT}?O-VQBRC$M08Ruafs?^0;8buLI31h;&ID(Hv%xuF7&sRU2j_wF!3E$#a1po| zi~u9SCE!vp3S0&*2cy9i;7V{6xEhQBW5G4xT5uh>9^3$K1UG@3!7X4M7!Pg*9pE-F z0o)EIf;+&S;4W}Cm;@$+dq5dX0r!IY!2RF>@F(yfcnJI%JPaNIkAla*RPYz@ICug) z37!H^gJ;0AU>bN1JP%#~FM^lA%itC8DtHaN4&DH7g1>^dz}w&*@Gf`{ybnGAAA*m- z$KY?^@8A>gDfkTh1N;;G3;Y}W2mBX&4!!_ig0H~W;2ZEQXvm`M10R7|Ko2l0m<`Mh z<^Xeoxxn0D9`Iu@FPIPf1k4W>06oEiU?H$DSOhEz76U&8i-VtmCBTwkDX=tH1}qDf z1HC|RusldVZR0#DfE7Vsuo74qtOELh{-6;wfo3oOtO`~GtAl}H4KN6-3DyEFpcRxr z8%W>5;XH!DI$&L}9#|i205$|0fsMf?U{kOe*c|*EYyq|eTY;^?Heg$@9oQc10CogB zfnR`Mf}O!GU{|mk_!Zb4{2J^5_5^!@y}>@~KLGTdx zGk6$00v-jAfvMmx;BoK-coIAXo(9i=XTdb^9C#kQ0A2(yftSH6;8pM%cpba}-UNRI zZ-KYLJK$aL9(W&o06qjCfseu8z~8|q;8XA!_y_nW_!sy$_z(Cm_#Auzz64)^ufaFq zTkyYM;-Kt<|NRmNB@X}n5(gy?|6jkv;eR~8bKbV4=XcKSAwNCq6Avl1&-w-g=cq*w zo8^GE=PQff&hJ5|8E4A676%R_;2Y#q|yF@$d_!oBh)LdVG zU()7qV>f@-Mb?vl+T~6C2KkpKZBA&_=f-x6S2$`t|IjWMv##_nN!na0yAhh_qdyeN zB0ZzOvRpLuxW6Z9bCZ^Hu~?%`{HBbwJJl|S$Z!2UNSjB;2aa#?4Yj2jJM41v{l$z= z=`WLf46R-qPCe)*U0-IG?bFQ0i=@p9t;od^_`vZ^3>YVE9B-HNO>AO3K-zrpSJ>5_ z+t!marQ5yia+adqjcZB!328;`h`jN+iEmC2uM)c=q*9ISa)ALujk8Ic-;Lek9x>AI zmF)7AN)wEuNLv6}bv#cdAg| zDMeZ@m0k9iW9CEs>;(0*6X<8&(CYPvJSE#%Cs3b!N`102*)8wJ?p*4>Nz{M)Jh|W} zv_7QGtgr7tUpIAC`g#S}RrgfR+a~N6ho&m~MMctPwht|+t?WZhn<)E`FMQC8FMULZ z@>hezK2(X`WoEYx_P6z|6uXs4tF2%5Hy-{rnyC0&g|wN)VI$(uy^9hDKiF0G2hLjr z_O~?@U$MXWL#vm!Y?L>#zdfY9RU)lXWtVG*?RsH~fv4b|mVz64kHxYxDu6ecyFa)r}8c*xz`)RfAS94i~YGCu1E~hgQA6ao&>A9|}@` z*iY*?5dI3gd~O`GY}9w|Qr}5I->E@b?y1`SP4qLdzZItaZ7$gjQrYDm#W7RwZzD-t z6I#9c{hRi;G}_;c*xzcYe9-1t+t)3y`#$@dRpkT6f&JC)ZxU(WcYm|Nu81$kjO~VZ z-y=!1zs(3=WUNJTs13V%Ieyu9x0I9iw*fJWj5SFc>_*#r>2~R_7a{VB^AX0Xq^$$3 zI=-CaCdJ~Urg`o1%7Ep@GNi3bT2a5^hxR$X?C+>oYoy9vcDZT8wZ@M~TMt@wd|BJ0 z|1v4cVwXog-)20u+v2FN@|WYwHQ6Czp0uz%?Ewh~jPpp_0Ct7H+S=K%b&B+QfL-3v zJk8jEv<+2uwc7HJhDisf+2uDy?iru#vN#&Su6oV04@H}GmONJ4<=M~wF|HtOW7rj1 z_LpPknJ-v+m`K;kk3TYfMcO8?t6p!c9hU4Zy*Of*uOwwP)h2CI*wu^gy^Fb|>lf{E zlaU^#mZWV4tzJFYH(j&Ny=#}tZGT~$OWNitf3~C%89rs_Y4;$ZRqwynD z_VM%x6?#ja}`m_l+C7+F7qJwCY^& zx)8Iede-}vwAyQ0j+u7m{Z3_9TMyb&_k)gI_E$UW_1Ce> zHL0ET20*Kh8Ru9#>kU+CwQZhR2e z;1}o~leh*K_n3yNw44i$nKx#=R9xE+)6udIZ*WiS4(^E!*U_@w7|bFvW|0x36}?Yy z&BtNJxrbSABzDoAp_%o@k(T42^>-WM&=<2_2<)o;<@hc`e77LJb{#GIEAl30bdfhP z>xJrQ*=`xkdWTRCKk8`Nt{>{G0_to$wCa6`wIfi!6;ZzvNXvVnc3p^jAmU!8xCfGr z{GF)sK^rsedYh!uYV)RD$CGvZ<-BS8!xWXjY?ouEp7q4N%&Da1Ya`Zj|5eX=VWgd= zW0zy5?UU10T8;zzumtxq>qbsD_9VMA;DdU-u~ysHXTq-f8l3&jhI^T#=w4=hvO5b} z_1a{AwX@!A((f13k;MXhV=;mqwl(&n2Xa@I{z#tP&^n9454f$e&9O_u81 z4UwnK+HAZ}*AH{yudu7tu9A02&wmS%gQ_1fjv;NhO3VIo%(~@Bl=eLjk#}W(Vmw6G zT=U?AUK}CrWgvCIC}?XXb_D{7ZZ=d5gMwZr0Apwepn-7q3X zO7W$8+l!i*`fay37DB7%L$&QuQZLCa|5NxoQ@(8$$0E{lO>%ts+?oa~kgm42%dvAN znVQF29E(ZId1D_~d(3mDG`$baIExpU8gI5ZBB0e<^RLH^m(oVlY+7fvsm2D2BNG0q zbHR1C%6E{|YPMaj9TjK#cCE#+1X{iNEpfSvv^LrWIzOI3C`Z*2E`na0xY zc)RSia*yf7YKtRE6uq&-XRFKcrTEg|`xu**+O ziKa8;!*bYFYuSf{;#sBpSM2h@ooh@()>|CWq|L1NwO@1G`s{&SE|oIV^k$32v4XUm zH};o%RHujO2WKX%SCR=qCR-?R?lwjynY$uUtK0@mHD>e#Gfmvd|@JK>m%gMI>PlwAFJsJkoDOTMPr(>6EGAVB(+s%?=PTc7l$i> z$EEl!A#zUhVsq+GwH&n2oHePw$HeDWI`V?`#yz`yZhN%p74;Gaw0d?aZ#$4T=kw!j zZtPlN_Yv8BNp=%-{N>&^oBWLp9ga>+W0^450qa#OX97DqC)>X@;=+V!@_ zjSs8jg>>l@DhJXxmy5M2lUDRaqNXw@7#vWDk_yZZI@s4oNad8s^!?{MmsEjYiYrHyS#PNe)BZ1T8{ms z%|+qE1ARa&;oad6C8YRyG)DA>r;>^sroI0UU;9Fl@oTZ|On^}Rkd)u;IW z41e`#AjI{O0KUD7gv2Q@+ z!$8L`Dj#^gaeTwRT5Ef{Z;%{OEhylEA<%K$joqZ!Xj?naA@YM;H3DvC3v`^&(Q-Y! zm^a;aWzcZB@y);h-y(sIlhCTqjeTfRv$JhR{?T%kX4M0h7y})r+-UnX@w2727%Tgo zt{QN&VW8tQX*0`3&9fzJ$6kz;z3WsBxYjbzamJ0^?_jqI?4DI=wKb{rHw{|7I(tiT zxJq$oL2;-=aX9Bjn~eBAM10Same1{fkBJAqrBH`m+ zwzA=)1$PhbBm@g2sWk2o+#$HTYZ`Y5?wjDw1`;en79l}{ySuyVhIh{D zQN5}woU`kE_WTGv-S}9;aBO#lkVIZJhB@zuLMu`mo9vk56r@#V8lY)IR8+v@u(B zG1o(w6UA)YH*IQ+#$wgQv~}i~nor1n{iq$sY`U1gE~d5Rn2qFEzepOBE~d@bN-*5sSf7i`dn+HW51fbhM>5TFk=Z2T z+j5M3{v;cf-AS$-*TvZ96pQ>rTZ(a83yU^w?RibrwiNr*I%_eTwtiOGmSb95ZT%c; zYPJupUmn*V`k<&|ZrWHlW@EndO$I4ERKCiF?IbS$)}B3^C70?)7l2<#-gn~ z$JF^!TgP#4vFFtGhkDJSm<8kGw)}5AH!Y@}TO6}-T*xtVOzlI9(fAx~si^HYo|~Fa zi&1~td~MKa7a+i}}J_3@wDYGYR0aa*h09~@KT z6#J7e&RDdz)J{7W{?k~rF*}ZXnwu80QhN(ai&2?l+E`Q{)g66Uv#}`R{ zin+2+IJb3*k&p9PNRItWF>dP=qq-xXRj#u>W*m!+d|J$(^RskqIp#{TXg)4$>qkXx zzS?n5AxA#P`C*kY`B>mtynLNOs@>R8lR&CZSCRxF;^|0HWtL3^6C4~`M3{tELu#^zT$b%rYH&+RdPs%tSnA!9c7QCls>buH#kasG_SbytT^##En>$C|&^mSS34j;U?c znCw@LQT{k%R%5b{!rZUg)*j=0YV1F>{nI?O^KG;?K3yLi)5fQ@5)W+f*vya8mRvoiF zmWIY-AB$|uF?+s0^lO!|AZ;wVd>pg!+|;qie*b&SzJ3~rIotC~;tE9W77 zu1-EBIZ|TzMDfZ1;s&sn6^QV}?v9qyttsah;MfGv44E-C9TSwcn zj+ok(*5I4f9Kgp#eqFf_p06RFJto(W$MPTh_+wi+W^QX=XPM9Dl+V6?vX4Ktl`(E>@$K66aU@;q zMCYy>sBR^>I%3_sZlHhTn8kPL(rJQy_85PTkTH8(`)3RGxtAVfB_Da*Nv>*Jj*%}? zd+ymu{n=WEaRpW4c~ z+1EwOC)dyBSZ8}ap07P-Z0o!R{!a6?=i`{nXXwM%n2*Lne*L~w=Vp~Ldp_#dD%;xo z<+dENuf0_ri*wfK?hlU1w)T10 z``~+R_pa4N7xjFz;NDaBpp4l+kJDG}YOIHP4%$DDYi;c@Zfl`?O5KCYmgYIs!G1k( z+{%+y$u|8@(=eG8k75VJrLm$+Idf(EwrI>nuQ)Bjid3^TRzs$oiUpW>V#biD? z7MagJ79O9g`gue4!Sk@koaf7J_3NUI??11zeSc_u=-YBk=9BAZkMUUK{!qt4*IeWN zbx~u|XW{WFvaPm%?J@gUIL7((F~|6HZM8M1tH?Fwm^wZ+CXWq{*~ely{?vTNe&w2K z>*pe5O!lFhhqga-^VP;|Z|l5&^<%bS%uZ{i9e=tt)z(En7U%I{AK^H)_aWE7zNT`m zczhOhU1W^sCS&%t9OJgJN}1C64t@U}N$2=o_R+Ixtl~kj#1;{Wm}S}0tU|^F`_!0h ztHx;mWEB?6MUhZ#Yg6-Sv7c%mL5`Sg%dwqmTiFM<-Kma6=Ckm1$k4}KM?Tq>WA?T( z#%=9=a6bE3gxZ$pD`P>9*q_EHW87Ab&z_I_wXdHXv+P5TMYfgsxb2_Er>&oTP1St# zd~P4JJr>0MI%4{DCf`9hH||3n-$7%)?EAy`)V8{QdF`z-pE?#bCi8JjT^C&+JU)9& zw&j?8EOM>v``39aj{QcT_w~o5x>o8~?Blzu=F`S!kJ%hC*_LDWwsOoo7Mahue$prV zkTLOxKGYcR58axoZTXyuvwqI|C`iqx#q|4EYpdHImiX`Ih+`hn;%t+oV#4>KN>a;b z3f#^ltq)l4G>amfo#f3Co37%98=Jt>>Dj@#ffuJ?Vt?(;?C3_5?M?ZRg*g zBW}7yi_`68zUW2iM3eW2#I38+H{F}^#ec1I?=ABU+!HKBkrPUf0kYpyZh^w4M2qu< zWxj3kLxk1$xH2Mv^!>WrO4u^LQXWo``8-Rd7hf$=qUA@~ZyVP@5$HwpEiLmkOqX7` z{5mAAzm~r2`zc@bS4!vcGN0E6T9>}Zm7!T>zYF>V3eVcn;_A;Nj`bUC4H1@!$CSxi zA34@C4ik!3`*cwSfL zTUdUNuq=vEHrJ89bJn(W>^@Vjf0Fr9EYC>iLX@c2QTAJ<>0D8KXta3RT;|I^I-^+U z86{4)k-pb?DBsFwN~^arU;e^-ge^Ko+0a4uJ7­u*~c;_nfwHrdd>(R>I4-Xvs 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%0D{S+A#VydD*&I(ZWsp7na^@=nd2 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

`q2~aH9H9lIDDM6|Fz&juX|L%A~CUEuX(~ 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 diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/models/3d_armor_character.blend b/mods/ITEMS/minetest-3d_armor/3d_armor/models/3d_armor_character.blend index f61e222cc6d9825bebcb0d55fc5d42f5fb1ee255..44f7e27de38148ebed07926c3a58270ffc2c7bd3 100644 GIT binary patch literal 775480 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�Qa&VerrgK5&FAKkT^lpGY72zy~EBcHuX@9|a!z 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�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 B8EOCk literal 711484 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

dI>|@x^aDd?;!y$&l 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 AlmGw# diff --git a/mods/PLAYER/mcl_player/models/character.b3d b/mods/PLAYER/mcl_player/models/character.b3d index 9ab454366bee8fb6c9e45e64ac0d77808d5ea66f..b3b772a4108a04c96491d1e86599bd3e977abbdc 100644 GIT binary patch literal 73433 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 literal 84526 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 diff --git a/mods/PLAYER/mcl_player/models/character.blend b/mods/PLAYER/mcl_player/models/character.blend index fca9f6597fe998d1aebcac4abe126b13099a5788..652579c152ab3ce8c535ca3cfc507cf6537550ed 100644 GIT binary patch literal 698016 zcmeEv4PYHbwg2X$=~4?tL@fm|K!qZd0_CIf(IibuZ?UDNEl{+Yrpav+NOJRXlT!Ti zkpk*fkuO0CB2+%Ke*2_ARZLUb_uhR1iULwmv_26l`UIb-2uT0u?3~}-*}1znckhOp zTXx%<*|RghGc&()W_EUVcXrmi*=IG)UNm*}@h8t%M7s&gvIZ9aYVftoX@|B76Jx0QLsGz#T>*w5c@#v1F;XpJ`npr>;th6 z#6A%FK;th6#6A%FK;th6#6A%FK;th6#6B?Ue1J@1?czVQ#o?QShvigF{9toc^F8G6d){++-I-_3zr2*+d){+I{T@Pt zUp3g?%e9|hnzBE}cE9PS&+RJZ_x|^vHBj~h6t2K>ipFn`Z2z(S105i4|HJePar+PS zowA9D+kc>`;`Sf6|K;Qz_{Hac!yoqW{y%R2hP};eggxB;d}2V`=P+*nhCl4#_K(}Y zVeh#8Q!lWGZSnX&(4cYqkK6xp@(%ps^S|K_@%cZn??{HXig#rTR9T_w|aEdwTjd2kGVGqm_>kGz2m%07p_8+(Z9a>NEmggo z$A4_O<=QW9|8e_gpD4R+B-?ZtT|`ve{zrkggt6I3rY&>($K(Hy{k`csWp00Nxy!X* zeEtvV55!$L_y2MG4{7hX{gcO!!p*eH?vja$xc!d;f7o62HuEWS`?KYiYrpvXAM$)a z+{NvmNcdN8X1m;7GS$1B?ayXguKnWnAGd$@iL%>vS9>?}A)?~;KMK6Xw9D?2%iR8Z z{Pq9!H{8DK>TB0W`dvplg8Zq>?awWDx%MmD^FP&r`{BGFKcgLFyJC;a8X$SPB|i$v zcH3jxe~<-6(EdSLl>71JQ~~_Tx&8avA-2CSEjSpr|01sU_V6{J(Dpfu+rN)L?7{Yr z+rN*!&2ix#Y=1rvaJ$DZZvQ_1um{^eZvQ^^j@v)=2z$sDkN*oAGH(BI`(I8Tf?s_8 z_wk4L{9mvS8P$<-|39pG(Dpfu+kf2thjo~8N)WgIVXd{CQs5W2|G51R>oDb%Aa4J| zS_^HT!#%G3^Y^=X{2t|Z_~Co(H^AB6y8TIvw>KFB%c;Kj?Q!k@O=iom)s5SKSjP6e z^vkJA_{Hsi&$Dl#8u_(<_&^*g=Js?R(Dvid?FVBnVlHAIhsN!XU2a*`^raL2*hy_|?Xi}%Pel#w^JZV!bj$0PQE07oLTg{E za=;>>Z2jFAcBd}thG+0xE_9fGO)4Eb^>6|o`q-1A$T5Eet zZ%b=mvUgf)<;rxjulcxRPCj;OYfDekjXGvUXR^C3r#{|^8HgDe#SEM`pZXN)NHW&c zjofd%ApOd4MLuu-c^%#JTilLhIDk+5RdkH|FnzOU^r-$TAgq$a_V^AbUE-}O)OGNF zcK@TD`mDJ)?WC)vW0mrwpyVz4)$e_ic}jd;g^)8}^B!Ni^%M7TIx|GZO$|#LYN_(5 z?~4Jv*AERk`JrD2KHb`zOh#b;NIEfWs#)jISz(Q_{!}%FRJ+!|Ugpzloq8Z&GlV@7 zhbq1i+J9L68RtBNa9+D(hwPauY=6fEj@`SXSs&UEUv zX8BCVA2&!iqeaQtgO&dxG;_(F$8!-l)8`KO?l}HMG06Wl+Gn1&OL=@jbPzbC11^E` z=izU31{c5~9dM{O^da9%$9i!{2OQEtALL8Nsy)tc3hjc=f6~5FKPe~DBVSVw@Y^Ll z@V3|mdchyc2fe@}J@BwA^a77^n0TZI9`VqNa{J}Ko)W`vDyi~%JAfWD{~&#w9^A5J zDk?4;dlL^bX(YJ|tE-TdJ#w{b#}e9yDA}H(Le^7gW8MZxEpSy*?(CsH_@T}wrR%W< zC#-$ZD;LU$;s(T54sg;jHcNUC4%AT!`tf<8s;b%=Z;i9oj-BNE9Kf)Dz?Wab3db51 zq?;<}Y?J(wjhbVy3+w>9WG0J!#m-KF2fp2C4YY4_3qMc~xtb2XT_V09Cx>f9eyfBy zXCPhvyly40y5jdzlT?gS7ihY3{=<4sgy-9$wkV^xV=)?3GW69h*usDSN8o3H+H*vz{w@ z`_t`aq5^VM{H&1q`4#2+ukYG*Ekzt<@WkU?bAvyD7w}}CF8&?hSHAUhe9O$iUyh1r zNAlNP{LwRor_%+(zQr3tC8@vQ3A})(#7xB#_|q}G?_bY!UvKKdqFP>5{Nkc>GE45t z_Xtlo0)F@k!Q8+TcmYqDI>i(CGjaa)Z0+w|T@+0LJQt5|EIKE%&w zfTwJ|^iSefu6DKO&r?fJPm<>1x?6`OD=NOB=$y=wyK;X3PkXsZa(mzjynrWrmh?~J zS2=*}nDtzp?Cndg>1pZc?lY76%2DwPdipw2-6fyuoHE@+=R5AlZ!k(Y-jG=YPv8YS zB^srF62CH`W<8zrT{BVD*WWv=Gm)~W_$5W>WR~2OKNR3ke#1lX1YW>Xrb+rI@hexm z+H>ofZtd^v>1$4fGjLS=Nchv+19+0lB2SgU6L zQ8{CH?!RFUaM8!vRC8rvnmv;9&Dkb4t44FmdX@IYTW!?t!IElm6JPzh}94OD@ zSRdF5HFXVZ>n9zoWbOkokMooy2%5)1JoHHDJCC!SuC}%t2}=>x{9285sB>3`H58{c zd#3b15|)y8DH!-K@;CiANT=(6oh@k|g(Q1h`cl0?$@7j!#h*oYL>8-iO)WiE(bGqs za%|tF=5hA*9Q7CAzwlT1FXorw*ACj5hy3a`S5tkxwfuIH|L-9_MeQ#U7t0C#PLVMW ziTM%4yLy~G<-gRH+Zezbun@B*H) z3lvY_&rqd}dsfrU+Uaf0J-yr~_H`tSyY_Z@DiKe)nq>+r?@i+#_9ydvj{Zp32cEzS zc(Tt{Jb^zQ!~1#lq^YrVN#_mWDI}imrqdK#m>kU-Sk_H6?qQym8&Q1B+`tof0Z)lV ziYM@A;_`UvZs{s!9t3)#;^+1yqjXJ9G0qpBCZkXi`kki06LlU*&H_KM2R%-)fo5T01zF%$9UsU|8T&}fqIoIOO9$E!x_rU<33eB&97w`m);14oFx1QudY9!N~ z>g`B&_q7x?;T#p88$Z=92$3sFufn@Ep7;p-DQJF;uU|3V$M_!_aa{m;G>3)8|NL}K ze%XzVDL=t(KVm25I?wxXf0&^YFXSIkNmOaCcAlZp3-;vm&*mMwrex09pf4EElS4`Cy=gd2+tUnze9Ri*HMC>+1%7Hea+X0(vLk^&-ibD{(AIBjSAH>YTje{61UF{q!Z8QJxocAEb>8; zX8QE$d3EPHc>%Qzk3KSQCazIfH_waMSHJI8e$Lms0gKQZJCYJ#3vgLfSY_E0ZzO5_ zEH3|}k32$;dVHiQIKO@AnZL38klt?FDkU@G^7LD8IbbHPWpd9g%X7-P=a$#X`#kbI zvsuu^iyFFV*u-N2>zHGYJ*V19+kLQ8cNqO=Ss_eia9dKE}L7$7Sah`4k4(WhKH%2K#Sm~v2i*40s`^2ni}U7(bii#89Q3)kA;&3@AJPH0MsUyv+;ufx9MS=o z5FGRYNBx51>&Or3fSV{d=mT!em;q-OIHUt^r?eC318yn3ea9PcNC(^|!9kysnEouS z^zw;xz-0sneZW~(pL1$Ken49$-JoKWS1m%zPz|Rmo z^a77^nE4|;@V4Ng7wxUx=m$}Lqz8WcXQZ8q9^lRX1$d+feuLnl7ws1HFw2khz^@TJ z^lq1Sg>sm9qz67Bc<4nt4k|y=13yvl&*LKhguA5j^w)AH*Nh1HV-8&Gtc$CA; zAL)V53LbiQO8>J?&RZrP>49G-c<2Q_h<~I9zFqLp3q0y!=8yEi&k#KHqQ4E|AL)U& z1rNO$see%ZNDut>>!kgQ9^g?9v;0U8{06~8FZ%E8;s+)k>49G(c<2Q_h<~I9J|TGM zog(!Q>VJ?P`0X-Ig;$I*)Y6j=jF-Kxf3{eGe>imwK-@ z7apaaFG)=Gd5?>g8XK2;fJPh{!C{`y7r*>#O$v_pz<%PD4c(^5_2Esu2gX=_4-6q+ zqpIsv_dT%dYbIIzD{cc{V~8(vQ(AWGC8k+~P%`WSJHReb0(&{~&xBeGR?{ngDU1831>=({-ef-haL%e{<3}?rE#C%nppA0 zim~)FQu>In3r8V;JsE4#yw<*5c#B)9K#BzULY61YW?C{XxYO_%l>lZawMYkz{Y^ z+wM{E^GeFqTZ@$NgrhXXa5le@1b6~3;3=_8@dW;$3!z)jwvMi3cRK9LWl`}>CFP3J ztMF=i9+2A|-;2_>DqWC$@C07KQ|3d8C-7%N-Fmik_jR;%cC@66c*@4r5*6P-xlU~e zovm8{+B-#f;+uqcW|FHa3zPgx~ku@bz@e51JRVx7P{vSPu z%l#8J@Z@*R1fIYPc*-tTJb^#xLa5a#ncmE%q*2Bxt?& zkR!1_@o~&=VZJLX^Iez+!+k#7uSv*#1I&ZzsxOiO$mMi!!UTR&Krye+ci98-9FK&V z<7K}5gmCj+z+qk`;fLRGZIdb==DWUW$a?AX_fa2bzH7%f2ut%_2z}?f){L2C@vpee zqu+oiEoC@gE_Q%jP%YSt?lBC}n=CT#n3#3pPHW4WJjXlbu{Y^l#|T(7$C4RrC4i_b`u-`I7pTX1McSwH;1OVV!8zm2~6{C$Wk=F8m5c0OP10K1@Gu$Lnb ze46ZX(pD9>p6-#5Jn(r(#(X~aU-P6PV*Vce8_Rk;@=&3=AGjY)vhjUddd8R5g`8M1 zpXT#V6@A|HUP<@ky$Nk@tjRn!nq_Y13#r6tZ;w%7i>ZK5)kkwR1Iw2AWxsR(Ffc)c z2%Sgfnb$2qev>JZPQOUP^^<~x@ z<@uP3=kuq77a91SS9N>x&;Io?N9MIW_4NBVGSy%3`#7<>tVaB9yjscCmDP$0t~`b` z==d5#9&5<9A@60#;|%#NhCJSo_x8v<7vR)a?8n!}hIL*`iWAJJD$ zy`xuVe)M?eN0*r&T^4?F`h=gHEd1nT;U^~xKRH?W$;rY`P8NPd=1VCq5Bx)wPM1~v z+;~+#S620NWu?KDRsCF9)z6hx{ajhq&y`jETv^r6l~w&*S=A3RRZsE#6>od8HyG{d zZf|_%9wUC8H{QO>h~KH6&%$^R<3EfC6NjnsAjXLk<@y%Sm*F`*T=#Ohc{`uZzkHpr zmiC_~=d7rBchvstvk?^AN7KHPW^IE*_Ir~2T{b;5_{&^0S>7#}Jr z=3rSllU!-huXl^l>Z52k9dgcdd~Opvz%KUb zVqdYdD$ayPtNx5_ZqX(*?z&vbyw2r%`tf-0DB<5+Uy5Zto&@gTQ#Kd z=&Eb2Nup0rZ0@sN`1d)AU_Umu3Tq)9b=L_u<42neyTA^xOLnHR3+$!Jy>Fvs{qP~w z;dd)tS+@%oItj81;-N=E(=IelUvI6kuCblyEyl$B!Apjus=|^9PWAw<-ML2 z`%{?ptiTI+N_rg#E>!910?9#!r;4<+J9Xgw?D z>3O4abb8I((C)wsc*=fA@dW-%pzBYitw$9VKT_*iF;B~l%2gRMi{J^ofG4|I@dW-% zXkIp)j;chF;CdQ4_%(+ zZQu#KfTv80^iSefCNQs_Ww@Tzks41t-v*v)%*v7sp1=!u%F6fz{FzXfr}ACT>a77h z6?z^DynrY00{$Q)ba^V@^{oCu>wEjPI~$eMLiVQt8gpa3kMTc};JN_vXbt(gY%4XK zpz;5Ol|23*{hK{+t~2k#lxieKSw|@RGqZtUnI^x@Yd@>91|c zahW)K?^8+d0R8SecKT-=zm!J;a@px~!MTIZj$awPDOlq6$?I8R9{G)4&x$**(X^fw zkKyROSIf4qqdk2+t5+K7K)@#JSrKo$YYSS>itV?a3W56!xbI-gdQrF^f#>V+emvfD z$NdPs9_P_HXe}K`Q~fF{msbA8>9M`{9qcw4&mwG+`OmpN_YHLAvXAq%EjXO7v$K8h z_2)M!816H?!;pP4&<=5ZcysPM485JObl(A??|p}*m6K>?pknV3fG@xM4oZuD-$9jS zwEl%%UDc{c0qArFUzW>cCwP%$NC}q)vNfAki0J)uWewN+XdPK zhnI=p;yBBQPwjW*Dg1MuOI_GFhw;31sDS@g(-Wo@?B&I5oUV{viq}+3Zf|@Vwu?=C z;XL(Y%2Mbon7N!P3Z@y2k@l4fbI<*F%SScxnSfz_`0XFyK1Ad&Kl<}fUOgitnKs~Z ztmk}Xyn^vdR%DE8FmA#6I(U8p;~2ek?8p6-5#MhfKYnTDYF0{{K32|Dspn`B+V7X~ z%R-;=hpt@q(e8mmyU)(^!4G}d7_W@J@eA{HjcFXJYuS!p#161a<}4Y%h@F)gPp1CY zdPq!40gYb<_S@#l-aU*v%<;`ezB<+R^yjS8oy+%WtCa$OyBh0yjbG=t`$Ev zV_8#Kj$gzMuuDSPn{T@@D_u5n8IE7X4zLTTM!Qktmv-vMW^LuT2j9AK%X2@!AlF_l zCqKQ8emp)wd(g)(jKTN?@qEk~ztkUe#<-^rJB?={&U6k^ld&qRt4Sk!c`+MbZ*adK z)Lx3$R7`Gfd>TH#EG0g1e)=%&)Bj;Nzi${13mQcU-stfMKVzF$j-CDk>&cJR}zMj6=>*=cSB<_97)`7yFDOP#7)D zjY9;7_Un&dX^cbe;qza8vCnVL6$gAL=Ra^aVfpz@34P~L&a9Yd@o)G|=ZiTrH+5ae z^C)Nq#m>%{ns$#2yTA^x3v!2@A&=Hjw+s8Rxv^K5!)7lu?njA?`%$Ot+PmJY$G84G zFYnl`4c_}viHiAy3OBI%f#a-z#FdgW`Dq*zcd}#J7EN`ANUo zbveb=5`oTGaq}^RVI4?+^!HEA;WnDGDNBt*$ddJXN4}Nd@jmOVv zTs>v|Q2&(m^-gg-f5P!`*9&)^RH^1d96rL<=b51sPX7J1&uu|{JVkj^3CiERRWAP6 z?ESWU`)}3v-TPAYiFN!V-)MlY1+OjQ`%&8VVnaoxCep4tw|Vp9`#s8cy=nai}v2l6akIH>tMZTxNCt+GzHgi~%;a^^ki{hY*+D%7#OpFbY;nM^Z5B(opaQi%NV zorZ~09*XkafI~XqUY7OPq0a@YuO0)3bihqnr|JoPz+F1li$gl#mI@B~T%6iNen&&8=dloRQILptb#e6%zd#!aDvGo<}t{q=T{ksf|(`W^5{5Bxf#T?23W5%5S4 zd{*$#i+oLg0v_pse_8O*i+qFdNDus!&nZ8I-YMeGrhg%Sqz8Vf;Gq}(9E3-D;4^}U zUX**H_z&!Y{E;5`O@fDB)ISK1^uX^FJoKXcL3pGGe&TJ?j-h85{*WH{gy5kUW}omuMs@-qTFi&_(OW&HwYejk#7(l>4D!ac<2S*Y`-W!(gSaQUhxOL$TtX&^uW&$ zJoMuHv^}8yNDq9w;Gq{d+vpciexwI}o#3Gt?I#G2^uT8Y554feAUx6o|FYnr7rdb! zX8S>U;4uz?Uhp53Khgsa{m={k;RlFk{??O#@eby<5{G-oJ@9|@qe1;4>*epRex%y6 zcqB1)>}6xs_bYG>z$xh25BYut!o+!UALjgU^IO1S9>w;>8{e!)iqA z#i)5lJ{CrsSI6#@xSiKihG=g;q- zFGJ;28W*CyrRm^=31?UIIVG*|+^4s%kn2VXvma3XMrK*K{sTDpsV{z@Tl`Y`i-8R^ z$IV-D{RgiT#GBK9Sd69qBNr+^<#@OMIGes*!N1`*oiC-|i&0w2um6A@U>DR1_M+Pp zLv-g*?2wps{PZ)o-1_4yb28HFA?$$r^eppz$@85=Y=`02^ETj`>+e!kp0-) ziq~W!|1~nV^Bt5m+T9bhUrhhO>k*aX#wT>HANn`+XXxLu(!ZhKL%%jr#<#d$LO%x% z;1~ULU=5vHs;kegsCH&RyyK%ppL&iu7k*gvYuR6`gi{s^bvJG{;;oIiqVp!gP1%d9M1j;P<)iHaYo@AI&)OfG^t@C07KQ+Ac&3H+I=-1WT6`};i1 z)9FU#*iXz2Jb@SRWOpc@z@Le8c`EPk^PunH`k{O9yHWyA-~~J-E>JvyzhIuq`};i1 z6W`0!H^1%|Jb@SRl(|sx1pahAyzlx`d4HdWc{+vav%gkB_?33ZT|Yp00Z-XZ>7T@} zbPVsiJeBwNdC=~dC-75fJqqvwp6qVvpM<|)p33|CJm87z2cBr^A#X#w125nyk&^yN z{K^En{#4%I=kepoZ%zn2ffw+U>5=|P{Hg#?^rf8g{XUN$PeJQZ@Hi8^fT!%gN&h5% z70gp<-`8>du{8WheV+$B>HSlo@AH5c@MOz%0r(5%sl30>!#sV=sN6V1W)bZUynrVp z1%Hqcy8ck!-{*lpalO!w^BT_P2A(jV@*_$>6c4*W=dcM!X#)4TXm0_B`#ulmw=mz8 znWEvr*LU+O+>8Ln3>c7R>b52D>DyU_Z?L!H~yKL6$QiZ^ZLy}RhQk$!xCYpwX} zowUyz=7(9<}i7b@7eX6%}_`JwE>L!qgu3`TPrRFRY~e-iL%8U>DRI z?FRB_4RL-6vddvr+>ed^&0aFsyN;a5cyH%J$>-RAJ=@xq;Bmo|WGKF$zwf?B*WArYY4cnU{zb;2654-~>xDn7P}k?T zkLy9;aK6sI;DaAp=Dq$K_z$n_mw|Q+*SF5~+H%Iy^&mpu>%pUICRzL|ZUbL`QZ#u$ zN=x}&55f+xOGfMpdwD8ZwnF(`55f+x3#f;^EN8tki+r5dEwh?#yXO~Mf4Hc-Y2j@@ z+VaawYMKtDw$1PM@O8x}GW|=z0LWq5Pj{G zVb!ehla&Y7tns^n%qfhG+sg~mzZg-DCiB>6mbo8WM|DX^KlocJtWP(PR|RuDi@XGH z-~qPZNU0~|TP=TWF~&dxb@oj!&gwhtqm9GmgSSUhy=SG`l1qA%$>9**_+q%$5p1vZ zbO7f^oG+0E=TY;049ufqUKQy%94q4ho_DIL;WzbEsr2)uz3@`!dMFqERnC_$`<(A| z<+7hUUkVQGKl?Wy{D4jEpEt~x&N5^b8}t|Tan6@R4TPohB|_ixrA>3E{3~wr=rfy^Ly(S}|zeLCw>Z;e3$T0d@iL-gYw}{S=2+(ELF~y=8rO&>HxL z(XRpR4Q*-vZ`8~Tx0fKh*kv*w1je`@TX-Zrr!M{B4vHwI4_8B!dZ_V)ZJOl0pJtwA zUu@u{x88D#GbhA2-q-P(s(3eMAZ8$DAZ8$DAZ8$DAZ8$DAZ8$DAZ8$DAZ8$DAZ8$D zAZFlA#sJS%#`A@5GNZ@UjTwj;h#80(h#80(h#80(h#80(h#80(h#80(h#80(h#82$ zK)Crt^SwU*rzdmYbCT~j<-X_iQCXK;zVl=jd-0;Cow8eW1pRLptCl-XY&f$-}9fkss0lmk=EE zx#hf+ABA?mb0z73TO%^`0rx#6U*Kr<24^={KO;Y+gFeXjk8yGQeI>L9 zd>_RAvG=_W_#ylXdN^OkBR%jl1P{Fv1MCAl(gWWvc<6<{n|1;o>49G-c<6;62H}w& z_^jZe7k*{h8~GzW@GlD_p%?g|@*_R)I|UED@L%|WnLpA4Kk;$JAM|dJb^$w>c%%nDA$aIT z{?KFMkskOpf`?w4D!Mc<4pG@B=e{qz8Vx;Gq}!2H}w&c$^oZ7wsQ<%>0oa zc*H|5`VBw-TTh8`{>A%nSvem=5A3!b{fOAp^v4INzkfiztYKY2Ju$7FUvZ`L{L?`oRO=ba4N5i4$_W9iS5#aCpDR z_Qh{$RC?rnxB(5s27fNXA2`g`y*Y4=coTb8I@vsZ*0J{JWdpYs| ze-9+H4RK$7^vcGGoku$Ii*!(4qqN$Em#iejd&)0}jCkmgkl)>^zk>YHT|d8~qNDOf zi@DC8{cXpOswq*G0b~(&;e9{-tVzeQ%xSUNu*=t5KEr-%U#{$v=@&o$mGXb2M>yq@ zZe_=-RJfr{zAKSb;gki+9`@Pc?c%I!D*3-o8M04hS9{x={qi;Uae1*tUH?8Rex%mV zA4`>;j7nLD=l0AU_Fv`+ynrWrjp7ORGjZ;Eo#nlLKJ#?CQMndFW)VDr7x0w0Sn&k@ zOsLCKd9R=UbFE_Bhw!#S1)jg)3A})(%txdj5Wn((NN{;7-}UqFetp+2_9t`w{8qEF zB!egL0-mz}Pw@o)OsLCK`L3V8NO(GhD#z2;R zD--JaQ~9o+KQ4f$Rc2*1p1=!u$__~XBz|Q=HJ-|L{rvy?r|QR1H~3RK4rn3#3A}(O z`wHow#IH1nv+MFy+WPlV@guQ*{?i&ydjHg6R+eP&1YW>X;!5eC#IH=KThH=cKYxnw zbgNOh3k;b>@C07KQ|2n^pTw_BsLNCNuAjfJ=1*Kdw7Uz<%90G8zzcZFepLD=@hcO$ zxN-Jbvzr$#X->B$yZuh2Ccuy*<4eodQ;P0gs((7ybJVhy8ZwLE3A}(O`{U9-iC>w} zTs`}{J4(4X78QREW$X8yQnQ?eUm-E;*RcB z&FN&gVn@Zl-^sRiamZ{v)i^+SI@NR3vOZ|YEP^NS0-iFTkp4;h%7o_X+0%Y;x}!C; zX`|xj^tP<-=)2e~Rw(%y>7OPOO22Md=A#8Xffw+U{iO6y;#Vd#SI=}uS5Ifh%CIGl zj4v%)Pc_~rJS{YM`miUJ62KF90Z;bT(m#n`nb2H4Tl>>}sV@FdQ%@MDii&S^vaMZ6 z*(Q7YI+9`XMqPgUs_MttpLoOhZn-0Q|9~g(0-h3|mi|fn%8RnBC9{_fl?C4(E*`MrgEz*;erl|P2 zrDSSUV*Ed3{6uqg`eu%&I1W647w}|XFa4AFm9B^P7tA_ycHbUAlceiOScnB$XqJ3iQ3&(;t2f{>Ub7*v=BUj7x0w0LHZ~0D-Gi8GEP`>I;XB= z+V3*kgyrO@_?)5$JIvE0AD(9W=mbyT1w3UwBmI;3l?g>XyHmYgEuG=dHc|0sm6)$y zkCnm`&-?1z8M+|*;0e5dr|gZ=KZ#$NP}EaSa?Rve)RSh%dy>s`kr%S*Ma3`Xd~4|{FJ!)YJ(`3k zbG$THPbB-`3A})(%sT0x#IH;!>e;_K-1riDqT*q_Yn;4@K3 zEd)>C1w3VMk^V{iN`pANsHe2M)>LPzH%zIc;-%d+hRs*6$L#?;yF*t~dABpR`Zs7@aLq9$r2ec48ffw+UxJ~*e@hc7D?4q7sskV-l z9m!C>#0sL~=a-nTUXLm{-~CKK$YnER7QqvE0Z*CFOaCN(WkOL;dcC8Qnj1YW>X_IBx?;8(Y1o#(HB^;~y2Bl47U zC4u zjHvMMavuRl!P99tpoQ=!@B*Ifk4n1}zsghv@zk5_Z0YNu`3+6$@VhQgrQsKql&iN~ zmkLkr^K+`*na?3I3Os=q@RazNv^)6Km>`})U)ni^b$KccAL+tQ=xPw2CW}m8n{oDL z=45vVJb@SRl=-;g3H;e(gLrD|NcYe)ny$*C_FSGy!#9ve z#_9K^T0&mmMa7%tDMik|4pv%@^-%_%zzcZFTrd5T_>~DoJ<}H^JCl8>ZZm#3IVyf} ziTUc~+DoqQZq^Ud{&9xPB6tEX;3<29^iSefCKUB7ZIr0;Wq&LgKLX>-jPy_D^S#HL zmDP9xFW||(QTiwGD-#NyR;0R<;qOYhJe7){Mfpa%D`i=45uVHkBc_{`)p!Cg;3;vF z^iSefCKNpNq|(Xe&W;tmExn;GU83R_QognG!sn~k<1aEE$1%)jo`3^d$mQkt6u}F4 z%6wM(C-Ex{;_RZHtJ>*x1T(S-IVyfmiTUb9%Lq@4^@Fs3q9L;gp1=!u%HAyfllYYh zMLjz%Os6{O=2UY>UrXBW#WfQsa#Z}>ZpxHg>ir$v$u7FM4F80vW%UI3(@8#M22bDx zJlVHM|0I58LQ&7st~%WQsZ{((T({sl7bnnQ02iQSpUz7aJG! zoY)i}1>gz1fT!$j(m#n`nNZX-H@j^n7)FkY&&`hylTV@OdKzc)^K{FNMD%&sybU~o z7w}}?F8!1El?g;WbF)Wgf??#S_}u){F!>aU{w$53n5P?zL`NAii{J^ofTzSA(m#n` znNZZTEgAaOoueu$o>rX;d&|(Qf_0hj#1Z^H0{Zb|@>04yffw+USug#Q_>~DoJ@tOv zOjAgXiXVx7e5J+{mlZrs^C>v|3A})(>=&ee62CH`sAs9yXHoGZaUbCibiVrqRm{Bq zd$d_ulED*r0Z;Z_(m#n`nb7$SOJ*;c+b~a`TcPn@vbUq9(@g6pN5%W;40~*LzexnMn%DQSl2)$kQy)J#rnKF(Te&$Si^<@B*GP z_elRFeq}=SdeRe6EBn)-hEG;hd{YT|nsqo!crx$T9c(7lcmglrDf>m~pTw_Bs9w)> zPqMYYv!&NeQ%H`AUtB_-W_f-Sa2@<^GavePd(dP+QPmF6cta; z`-aZbti%5kp7{MceXG?4*#}SH1w19bEd7)Cl?m1B>5R#H%oK&?sCZ{Q-qS*hPql`c z_tHy+_sw};g~w0W4#AEVf+z3-o-$vN{z?2wgE+f-J-a%3dsCrWo#pADO2U_rr&))W zaleHk^l|2)WJxPb>G zVP65Xa9?UOl}YF6Ftf5GgD3C;p6stn|0I58LOu25hSz4MC@e?CFD@ZZvqV$GpVmtR z#^aOCgd~F}@B*F^-;n-E{K|yt^-T4Ie@-kaenAO&nswMA_st(OBHm-jEP^NS0-iG8 zl>SNl%7p6mq<37}QsIV~p8ly6JfH8v=4sX;D?H&i{ONEU&_eJ8UcgiKThc#?Uuh6$ zSLdmeYvHK)k+=^2Rsc^&n3W|NJb@SRWPe-wC-Ey2itAWsOu$ndp`K#3tf+WrT)_E8 zc#ic|8jtgJFgEzpdvQPu!4r4^PlZ< zH}EtS2ec48ffw+U*(m*!_>~56b{VJ76|}Z=C3{=URKapoe6Z%?V|ad?*UvQ1Z}0F? z0iM7Mc*@=<{ge2W2}M0SlOZ377DZ9<^GeKDug9Un(`EWW+JC1Zvk0ER3wW|0kp4;h z%7mhxVf_etqT(Av`Y-a;!;REGu|JvX6-?9<$v$`jFW@P$N%|-8D--IiXLDO>rJ16z z92uYN>1(e|t*kwxBiY$jIIp1CX5q7T@}OsHAUu#ee9#)r+& ztN_UmQ$NoBbcqo+$>DPv8YSWxp%^llYYh&DB#|uBSOfBaDh4iSg6D!V~I-^WA|s zpoQQGynrYBLFu2wuQZ6WtF4bx%CxV(-cL#Rk(l>ALFO~RYgEphkK$X;``D+ ziC-D2^m>MVhnjV1JeP!bo?{I^P2s7=RWeU!KJRxUA@Pc*Xsc!2 zBkN@SyHpPS_!6_S8c*N_JS85I{z?4GglhFHWx7D;xg`8ZobO(GS-l5@x`C(ja6k*; zPv8YSWwuKHBz~nqoL$E0*LR)N0?agp`V*2(rU66h71YW>XCM*4u_>~FG)w9HT>ZtgUm>>UxjGrbOmDBHe zA__c#7x0w*Z|R@JuaF)g>ZzZsnnN_gsQ8gM-#xC~=j3|feD`)#QVYQocmYrL!_q&A zUuh6$_q+v*<~8Xjyo*x3VdgiY;?44uA_txC)Z4FKjo=BqfTzSG(m#n`c~O>?t7nNP zyr}p$@_eV>e)ZNEJb@SRlzCM8C-EyUO5-V{A3;x!r&96Z+!xt;!kguMcY)_9eM8QW zSp-ku1w3VcDE*W8l?lz&v!!cA2fgmvoN8_D>`&7>;ATpHIV!$EWm~%-T(+LVd{B7e zeq8Un_wuAt0(b&1;3@HA>7T@}OlYp2$?nx1y{T?~HJIKnTh-oI+_i92{A@Q{dcCaZ zY(3R@cK}c0JgK}qffw+U`HA#T;#Vd#SI>^_wvJv}YBvl?q%10au4G#>NmPa($oPrp z$8~>ti&^95uAcPSq|l2Ul8&f&`fgGw*?Ou`Nj&|x9MO5&$CFA4;0e5dr_57|C-7%NbM@2* zH*Xvy5hd7cj>&|{_a0%~Vb z-*kwIH_KCsd^63f@bfCO4e%I4W)VDr7w}|1E&Y@Dl?ipfFSW8anN0Ux+!^jxLR9=2 zCFSa^MbLAselMPYC-4HE5GNHcp>}g4-i|U>H{joU&eqr%hnMKdZe4mqfdLnm3?Vvx` z4}&N00-o$&N&h5%rDJ$Mw=Pj{$EuFD<`t>7i<`q-(niHE;%sYYQMR?`m3m411v%gG z^_{+bNEc)uJb@SRgrwjPGQx$4^B2!;T+Dq_OIsU`79U2%7oSsb$~n?Mx$7OOv_>;@ z4l++!+QWC|dCe$JXJ4wmH?NTH-*e_RpEHlH<QD%Z`k_9kUuHnnFIR6-qMz@` zhV*_{Te4S;qC&eVbrZXGmw%!@s9*b9Rli)l^X*sS7b9J^xqd7mbYn(t5B5WSP`|_# zs(!h8OP2FzFHUd|x>_w89NK0mIopk|U-+Ja-*pVqMGa9u)CcvOa;2(YuHKRn>PPRo z$oF7MuHqYNH}Hb`p+2aeeU++TuHHud`d8C~IqBxr^l)6dSqV^CbjW_WyV@V>gZiP6 zxq26>pHoX9iVxB55EhRtJ|)|4DJ9>~w%S=QzJds4PVJwQ@7f4)qdBay_@8A}I<<7~;kBn!eRt8zLF;`gz;gN$F4<~j z7uZYX-$Q*5Z;4qdG-Y)(=_scD}L=o zX{pZjW5sD5KHoPg1?&Plz%IxS_EK^~qcya@){l{0hTiVT-yqJ1=*Q1uwo5+(JK#B1 zmi2h#p+a?j;b&WLeyJgi9hE~>=ZQXVdane#@KNNir(jKmWIb*)?6X~X?1}NvcG}mw zp@fW^aGrtva7}1i7Zn^w4PQq!dgpTNPY=>S-&0bKS<{>7OBy|?-oDzYwW%;q>J6VW zriT%!e)XH* zWZVV`aSZ?*t^pE$_<>uSls=hb8oJ*ro0%Ch>f_8Y4c$W6p#}?K-nH3ynq#_u%p~V$ zC<+ig`i(TKiLcCXA;7Y}WnVu^@p(hbXB=K7)YFu*zv1k5$3B_GDlAq9>;gN$F2KWH zG%q(~S<4&M@x-i)=D)i67CV`fkzNnM6Ryoz=4&&xoC#lx(Y5y_HzYWG^pQvCQRvzR z5_qeura2~?Y_dwpMg3*{%=Um!YSx777LGPGXaB0~;scFzXvz|0j}7OBx62O78SRaq z-_ftlf(kVuC}NZ!zg+5v{tf*Z`nSZ2YM@hkd0>PhD>z%J~^D+q0FtVw^jjb(jH zyd>wH3&buG>S;>Z&x$=Zd@#IS77|~!w7177bD^_fF?_0CF#TwW-1LCD=Z`S^%YLVQ zSoGbc#k3-LPv6Lv^yTAJe%zn#ORACIWFnb)K3{&1NjW&(b<|fvK8zA^8nso>XmqVp zUVguuTR&ueheDU%?nq=;NzZtW&wORJsxKcP*}ma@xAOQ$Z6x1s$lvnH*^L7^yp!M6 zZoHD!_>|ul*2|;b&vWxr@1eOe=g)lDT7E3+`BiawKj!Agi0of4bIPN}6t1k^w{g?+ zGc=AqNsqo0_!{aByz!hH<)2Hh=J{QDj1kWo_4H#6nXe=C_`M97&JLdVw;1wxL*CmX zb7}Y=$~VTTk1lh4beZd;%SwZb_ts|&^=f+g#yHnSZhgkkm6A8!Tc0tOw?1PmZ+*sC z-uf__^}#>+eLOw_`>X!P^&c9is(A5dRXaVNdV9v_;uRmRtPrlO_;6*#hbt>STv^%I zl@%YZtoU$c#fK{^K3rMx0U7T_q5k_gwIzO}J?ta?>&nW1U0M0BD=YtXWvO3IpVTiW zOZ{@P)GsGX{c^I@FDFa=a)0Co~p*j7&qg(f1)u?#ykL*8yjCYT|okm z_bMvxAM+|JrFO=?ZJ(mX$BB2Saj?Bm^?RAUm7Lk%e|$Xg2M;*c{}W}L%;g>+wZLH< zmYCp!uf3{Cm2LE1|1)2oQ-$>WRPea`j2gdQa&2s@Xl z@mF@=w%mEL7&Wj9>;SviZx#EBot3T=8m)ncwnFc_5+^ind}zOIEMH5%^}IuyEtS7R zi5AAkkP$D@26hA(iT5$orAkViawL}GWqv97h`PDAr%nM{wFzT)J zZr6HB@f25B+YZw9u?wES3wW}h75^3cAw5E~o-2C$)9r{XB8-Zk6*51+BJnrt*HgrM z4W7{6bPRX`FW@QhTk-Dzzw)hTGy9gVJ$OGVo*gMzdvP&m5>MPe@mdSK@p+B6f@@U? zFW@QjoZ<=mDGlyl|9YnTdQ%q`)$*d^>DwSh=H!;y-20;V6OMx?zQ!{*_!D>mPubro zp5Rv|&cB|m{k^M;qREPiZ!9_|v*fOPO#n{?*Qyd;z?1!Z>7T@}TE6{yfo_tm)meo|ca8;wDr~p2Ffs z;#)H}(YvSIKiyzduF%@n-~~Ko{viF6@MowBXg5SvUw=^x0Gd2G=SzOguSk4pZ$@}) z@geEQaTNU%&$*ggu746yD=K~@{ORohJQe!p1$Y5Z z_MfDG68?teDSdHQSF*47Vl!cYoX1m0{Nixg`Ih3J((Vume=79N3-AJ-5-&*qBz~2d z`jY4R%dMvxk9Q^0?a8)|;yNcPSXBIc$}h@joX`CqCZ0Y`;d90~6LUl0k3+OO@B*GP zFG~L;ex+l0Kd7F?w!f%&ho=aQk9p#EF2w!`173nqIi_@r}bPh!=KdsOmB_B6LUxrnHh7wpOX2Q-C-4HE5-&;rBz~2hQ@DR>>7|tkXh=|OA7%0s7T+NG zmFiL4?rxWH<_}#uoV`M8#DN#^l=-XlPvTdGs=WS5uV*n1QHZBv@Hw7JbS&m+oAghU zjmoKeR^Ef~C-4HEvVW8QN&L!-%5Qf)sdTdV*{A6Eg_K{ZzQlE5o~|W-x|+fUqumu+ z!xFrJC;MgTpTw_Nx4xPF0G^8R1=bT4@9Lv^($uo-(gU|0I5uIHYhtp8EzQ z6b}=cJcY&QzWq2%K0(p!PghF+!WtZ*LQtJF_l+&55k|o3wX-xlKx5jDlx4vPt1-QlY8|CNhVKW@lmf^*q_dj z>tK`-{Ww1(U~b?Eynv^yrS2nwKl_ZrJbA{MIp;8Qb7hmKu=tVir`x0-pXV0K*&AcX zEP^NS0-o$jdCoxm%7o_Cv#rf(am__uxJ1P_w6)dpoI#OGL7K&P#!oxZKN;gp_>~R< zPv8YSC8`up;7`Z!zFW_hZu)3gXV{x*QSl9wYeVQ<-CA(FyG?ldf_vE6^LrK)Jb@SR zl&Mxcfj>i)#*><-bJ*ff*P96gWS6JX@XS+7i2TfAFi+=5yZek0>3PsW;=mJl0Z(|& z0sI-N@_6F!&KLJ}0;S31DJ-79$rC0&v;54{yM-sL18%0#W$*-Ez!TDdKgbBpdiJjl z_c%mU{5j`_%May7$UJ>X+TC&-l+fs|oTJRsLfXUgF}rA=(`Dp&87C3_DfuEw6d)hy zMLs(vALQTIo20d>kZbr5`9Lr7Nyu|Q$Y1=ic3N#|j3XcDMLu}G2>D02RCg+me4rQk zfEnZ;wIAYq2FUPuehkl(W%rZoGSBmVhcwbtV-KMWpSu2##&;b20q6NL{dqE84}!Nl zRFL;P8R8`xK^^VnJx{jXT5q}6O-Sk=a(=hbFYV*-tYsX%33I4GO|6+qd7kX^@;n*B zv2q@g&_CzkqdVm}vh3T#Kj+8Kli8B5*^eQ|#LjD+=Mo{i{ZMBMt;?J0N%pqTg&?Ab z4Wr_xG$oHrCp+mGwpwQxL7&8-FPR)^Q89+i8wtKe{rwk6n1KV<5xG5c2mT9xh5zC? zSNOHUt)%B6Z`uYORo2SJ=QhoAo;PCMwS z#UB|@E+V-%{3#70`MF;9U%%%eS<_qSNhpjpS=Ke!cpma@c~A9b<;MwI{P#c=>X>5o z+utG2LryHse~~}@H?vpaa=88%cBV$vCMrJa^%R%l5;_mxMPaAW4|xoxikrKh0x#ex zJ5KQg{v>%WaO=6MC)wTFQTla4Y4|yGzNVS`g{9<;N=zW0eoMkR^yBdhwnEnl-~~L{ z;}uWfFKY)~pRevnUNpU}xu=)=#J-LqF9cnlOT<&Is8^}sc$&v}j=;~0f@(UC@kZT6 z-p2i*bKVeMz*Ayx#S{3;j2nh0dc-eX(s@I83W=wsqv%n;FgfN`-MUP8TAqtiJQbW5 z6JEemW*@~9{3Xl?Rbmc#7i@e~r@6fQg8(i}_o^Pi)bS8}n6r-JkL!V7q^-zxo+ z@RxYoFg$gocvhjArVd*#EaJjBkEf9M`A&AVblNK_yBrhx&Q-4}p7J--HsWklJ3+ZB#@~ovDDnJoEqL(9X;+@hziC<-&3%c%BUvtPWMd2eZPbK1==jdzIZL?v$*S{xaQOk zW1IQd1U!Kk z@C1F}FZ0$Qp2QzQ-pFxzDh(g?J`mUMHtEMNL1pDSIOzEhp4Y}aAm#-D#e5;;(HgF& zf;~wcaL~NqN!7ou)Y}uw`h(gDOU-MKbp19QuI2-635U~fFP-Z=uf+bFp$Q(yKOi9c z`8_W+;dRfPsz=9Nmv=0+U)A>{!2pHw8>p)sbK>UjtU7h(-+p$?W{!Wo`ozsYTXpK- zi$6Pt=Vh&f&p3YiU(dLx?wKpEn#uAl_ir2g_-FUp@|oKA4w0I=XDR*f>37i2cWmVN z4C(p=;eSmSmVZNfcapBZ3;qZFRhy4!dFjEnof8@u|9I0|zCZBnqSNZf-+KzDe~je2 zpI!9eDdX?`F3WpQ+3UFT5B=2X8JO|hrZJI@X%MbKGR;|+;4f5^8fYnmmX}D{8@+kacWw# zDk2|I>!V8XX8g-`Ft_55{qEmBH~7m>ch7wOl?j{I+;!^a_rH9fV}I88@LmU>PIj+* zZ23#4k>72hdvQ+OS}i;El{1UWu-X0b2yUS6_<48EoI<~!s9WDb<)FvVU@ zv1|D|OT5XqPE1)v2L9bpt)h-|0@g*}I4L@3+w>9AV1j4kq2fsS@kDuL!8BSsXx(?Zzj&aOh10N`8m}zE!Y9~ zk6G5^b9$6=r@ippGTKWGY5ZN~m#d!?ectq533lP5$X`#vnhME!+-TTmyYx^&aNgl( zK)9`AJu94_(9gks(j{5;xM<%xsgN&DayguDorpeuc7@BaxMg*+wjr%1IY}Prt?`s) z=cJRp>1Ai8dfQrB+m|&Z(--!odX`!8v6HFC9&^GmCr@olu0H<6V`m(H>~YhV@#jy{ z%kVXnW)_$6S5KD7S5H`=ubwO$>9WT9Vg_OcMjr#|mabO%^6oJ`-K#9CyKVFpFfLKd zK+M3XW`G{W+@%+AfCT#12`#N&VI6Bc2!XM5;$7ZrPy5|I*Piu#O-k?XSTmHrOUo;J znyY*2HS_Lcjn$wvLwOX40d?_Oy?N{|33h=UaE+6#Rd#{Bc2{{y&4+DL=owix8^F)V zVpgEkoOTZmc7YvWm&~CuC*ap^c2Cht$|dL?g|Z8OFSxwy0z1GiAO-ePGQLAQw&~dE zR}LO}=$&=nn}6KkCo=1N=0c&t4eyr=R`1i?ZhX|eLha@LG2UEFIcnY`jpz2V@JM$K zUTYViWxuG_fyZPu( zPr66>Im`7V+EY86H9IOPnVvFnv^qZVjwhV>%sg{%*a{;iOKRD^x;1550LUT|NVgTZhTfkJWmZA zp4+wk@bzDAQstBP53HvQSucJ5KG%mg^$kqC^N!Gb$9g=yf53I-UvZnxmx*94dlP?n z{{UwdTu|Bg3x+JwOfwJHRd|2khm@JMK_+s9&eT9Z#rm zXlc`zi1SUt`wDsYJSB^k;vMTR8u7?Og~~3>8?EtBMWJJt)~YYnwEDcu?!~&&I`L!o zh}v^kBT$yvL|XNBliBBuS&PRkN3k-umwHN!cE{_Rb9vGJXxDf1TPIdeh<2DgLbY4i zJ9DH@J08OG^CQp>cl?xmh1Rk_==68y8WiE%A^V2kn(V4IyH;1S&cx{2hh1O?*d=k4 zvJ32`O5H(vVWX-W$0 zvi^2Ti+(^)sO6%tTP#y9T)zL3 z_kf%=TXt+BU9@HkLf?KYJLY(cf5UIwR(U+Z>*)Bk7p290Ypyu0!{_@(rGQ;v2iOJq z!Cp#!rqLQYV;kZuw#(2QM}B}f&(e?AWI2|&;SF}cc!Fg;UZuicHJv5xDpY75^1;O|MYqp?l7-!%-1N({VTlW6Z)@uU)pr>I?fttBCpTA#fW0yqm{ByrD`1w1YKUa17z%v(&Y`{m~|8 zF85W6;7dLGV@kHKR3XwMT)b!wEiYF)FSV+p)jH3udMd{4T${9~w;*?{< zPgS^G!gWt8IV*G0i9^-;`DRwOwbsGA$7Mp$J>a{?W5!yFLH@7NK9{Xs%0s)p8*oSm z+&aNQp9}t0HSYt5biic=2YtW|jP>G>4!D;E2YoJ1?IAy;18&Nb!fReVZ>r|{1BZ0L zEfpN}x%qik`hc5Uz}mG2C|=0{(|)IQ`7I5SH>ef@G}Gty}+A(1U%9M-!6FQMZQzS&L|h~NDurv z!9y?d4ZUf6AC0Dnji{KTIr{-7891>un% z_=Mo07yJd`kskOpf`{IT(!TQAue2Ye2Y!R#p?8YZI|z^Tz;72k^rGA-hiN~g2i}(R zF!aLiYos0~9_fLfA$aITzCn1T2fkhK(2Mqm{>{uE>4C>M0(!w)5FY7)hkocqx&83# zDKW+?xQCuOM%_Dy9+V&b;5unfuq)DWI6ybvK1-tq9tn&cyLRk>GJ0}HdUQ`*?x7>h z94m9x$E#4+=eN)O#sGEnz+rAR;fw!TlhPsg?rLB3%6=JW$GAScse9;*<#p&0=G{Z5 zHTKtzo#gx!Zn(eT>zl-vxv?fbqv0O989&-&*adcgT~JQg%aLE~noZs^gt%S1{#Wc` z)%OtRYlU}bz(tA7d+3l64?QaMyNAAZY^Bvhzv4IcVKt)lV%)o_VYGR5>`sa8QcoG8 zz2P4EaAgn^1SVs>>nRrf1^SP~G}V8gU%`1ZBj*A1=Qyt+gZI#75Zc?1$gtJb%V>nC zEUfn*nMc%h6+-(2)o)}^4A*}E2S4@4-`J?ihkO6uFl3b8Km4FLsMCK8e4Vh=e;~}e zXEvVtk7X5;oS(lw{V4dlpYmY7%#Ag1|KSs5CLI+r`VZIvc0u7_FGn8uHgS3SHpIPt z`8|#Q-1YQUmfuemUM7{kPr|b##67b!jdun_#XD3S149b*mP`{eW}FAAK!D!ysL0IW}UNS$%3;MH!ob$ z+?wj{ORnh)mvdBnV=0*$Mf?TLQL(Q~Hjev=;0e5dr|iLEH?g0IT{QcwrrC>_rru=&roH#^`wt<(|0G#_~GQJ_|m?d z=q*)Bc*0Q{VmO=MNCG^87x0vMNbv;zpbMc}&$f=PWOtgr)g6kfsQ9Lmaz*J?cr|@* zlG`1B+e_c7bV2sP6L2=)zzcY?|3liH_?3>~eYc+S;r11s{b4$(sQAS#T|J%2wp#fP{H$=f ztJ)kYJh8+)fge2Ap;D>8;0e5dr^J6syA!|CF}&~AGvtR$MNw4zNPNF^oW>Iu3q1MV zp#V?d1w3W`OYsE$q(%qWO#SXs{6~C~gT)pM`zkjO!2}i+`-!&6> z0x#exo0a}a{0h1dYV}N|`e_v03$kBLo{DP8l_10pt@boe7VY+V4-{4Q+1w0`o_=Akl^@kNL7l!GWL_t*i ztdep?=~Xyh^Cv!n{^>2=WR3)$FrV@xI!f*}>;|2~CLE;+yld&Zh1|6_y@}?Exjp8I zk7Ird^Ih3m>7QiY9QTWG-vRSpmOCAmNPcnU?KFK@0v_+it(?w&7O*bWM^(E*7z!LAG5SN~Yo0fPRL@&5 zXKo`;luiV4eoZvhY{Ua#m{<|+ZTMcQvzvAREcNgKm+;+HM3G!doL`lkKW4k1%v^ZZpNBhN809@x+beHF{ z2IoPX_i!G}93s~n<+wy&%A5$T3tfuDx_d2a|8!M$vKM&eR z$-BZ5W=~V+ugpxp^BAWy~yYbuJ5yX6(o@0!(2G(!%Imyq>V)2|r)0*Ql|fr1R+JcaWT&Qo|U8|N?c`6!&P zaQ;Fjv&lId>0E{LR7J(ED&Os2--idVosOvS7<$BGkA&o~@U29DeeQwhH zJ+=$~g3ePF7N70P?^~F#1MHHSt?UAODJJ%9w5%UK1Xg~x(v@|)TqFsC?1FgckzkCD~*JHqHY(qjk&2Od3bGtA_gNS_+KDnybU|RF6akgFIBV?$Sz%4dpS(W z1J`f8ixO;<@?R%azf)wi7s!a0XaveG#Hl;KvC+D|@-F%zNpQ%0KL3K-3mdEazUd1) zz%F0__JTZGL!4iN?6Rw>m{I$`zIOJqxz77w++H$OG~O1O=j_nai6+zGgzY-mGh}$CMqt_R#$z)v>^659`T4sMFTASLwykWiwB% zoAKQpga7;Rje}Kxe14GIm%oo_K-qP!hY5gjJgoSljUEBlBkB zl*BkbU)fi`?^a%W(7S;Pgx=VZl&DK`>Z!si%eJqhBjaZ=Z;w9m2=T7wO#JiQm+sAu zmFX1!6eE4KQpQKb<>|NHa==V3H*dHe#PuJp2URRR$1d}ixNnE|Uhv)wt`m`-!$vX^ zt_Q2CnkxLR2QxKOowXwoX3tdP(#$-c>p5My>|-1S9M0Fi_<@%i6%6y1cN(%!2HGL6 z4{z#v@C$_H>p=;9uLqmxDRcf6w}CIe>p`WZ{H_OK2iOHnz+R3#@M+@mrH2q_4ctQV z;m&w>I&t1aKfd0>yyWp>2aIo7*5h+}lyd4@2I}^sdl;3pW+b&uy6$MI_)6vUigoBr zynsB3?GiMOVoiB~QG9^g%R;IT+S_APR-v%pca@Ep#WS;3>n}z%) zQzXalBfov69Gq?k9fN!rCHnvDeF?lBMU{SMfm}2ZWN-|~$RmJx2!R-g1W59>EEgg0 zNC=6DlZ50!GGuvX(cs2IwyPo_ZV7|>2wMg>K-7ScghhQua2Xwq$|y!h<1!-xDt|@t zudl1VI@Nu>T^z=I#pe#tGenmaC8_H&>zA-sSM0sC*XSJ_NlhMA^vq@FT?bgW9d7h>At&rBJ@VEFao_BLVk`t)@kj3;#CSUOdI*E z-wNZW!uqYK7{3+9pM}dG@T{3;r|VhD{nmxKwj^6tmnkSJxf;pMxzq{&t`-g zx82Z@AL*0^!=any5s!2w)6dC|bUnkObi^Ya?-TMP-J&5;I^vOzc;v_Qq9M|L@H@f# z?;i@ry}HiGNqqLx=2&~8o}ec_>HA{$HRkN@k!tOGjm@W zJ}lQqPkhqPHT2}m@gjczuzcc^zGCRfm-O*|Mtb6tev_dmUzQv1Z=@$a>314>@@2U` zdg7CQ9hYxs~p-fvkx@kw7c^yEwZ`{;>J`n86heA#aC{?GD>Px_69o_twvA3gC& zzunN2FXi^p6QA^DW5>vs^zr+U@)Mu*YYjd5vRofM@kzhY(33CqKOuHsvwY%{o_3gg zsed0m@k!77lYA+65`C{iroHDpxX;*s@}c}3N1DwzM7fBE82fjs{XXE^34%597X9r6 z#^uxX{I{>|V*C6h*wqm9)}sbW(s90(O#fo?`;c{ZU9Gd{BZuw6c3``(Y_?aJ-ulNW zI$y0TsG$8mJl?8i2W^Gl2d$Y#{YSef#Rk0JzOCT+oFJ*J$Y#F;1n})u`5Z4eepC*R z&LiUXm-c{m)n$$G0|7f`_ucmr^(3ezb;pm=m1f>#;!1}eH_B7Mj`_s#P$ zz6Evp#e%-L|0YzH`M0NzZ)^v)OXW?vUD#e>^>EIo_2`GCzSu{m)7+ngYj=273w7ID+4o)`@Bchh3&w0DW9g> zh3yqeAD+K@;z6m2YL`H#-FETp3$y*$b3L(Lux~7@Z*{Z_WLObHUN?Kt5Wq)P=EuF6WFZ*@KC+xp(ii|6}T6Eg&zs+iFND3TR zJl7NZ?~!Uh>X9CPZW+H&>(j80kOTHH9(qGA*k6|~l)tO{Z{>SB&PQE8Hv2EjXa7x; zgZ=M?-(ULaE4vn~>T2q&uXL@iou>a%d$rn(dZJ#aC(=@XOfzOZmn~R% zVb{ueiI4xdM1r+8oUKJPn2-{-vl zH7h(XEO+knrjB6i5+@xk5OxEB^CP4&KhkeFaK#OnFZHyPRF>XnFgVtwHMtwggRk zwT9U#|Js!8LP)Z6$>#~%_C9h5ewwb<|6X9c+R^=#W?4EzySvjea!TL$U4XZW7kYvnr)tE=joXId@;vm(((T9 zJ3EQ~2OXM^SqJI4bV?-cE5zi#M%4o$T!)Ioan*iFtb-gp^q}yk>1zFV_4S_# zjRj7)gJ3cDgur%TJFs0Ub9KA0y~4VL^Odt=^KG5Rc-U(ye7uR{5$7wO>*_fsvJMhH z$Bb7a?f5vOgf!X(zwfIb`f)ty(P1x@oiswlv0wN!+lB4Gb}65u+lB2FO8We+gM{sp zbsZ#IyTD-QYnQ(NH0!=5e!f}^?Sgd>mLH!V`Q+gI<|VfdV)`rlZ|Pj!f7!34|BiV` zbcc03op#5S&k8~W;<)0uo;a?2PK_&{i*QL!Wb3~eaPsxv(htl!o{5u7Z+tHMFU!x{ ze_u-LAU&!{*;) z=a(N;*7lA>{Aecn?@&eSvx~g}%(>zmB^$6Q+C{bl+ofWjL)l&d=Jh>qnev(2FEh_8 zI?Z;uP*wQd>W6g|>iyr064)+CyVpadnEAb)N0!^)q%}2oKlN&QsN(269M#m}UaC#- z-0f=@%?b1SJtMGP*bZzLO3(IUTH>BvN)s2WpNZv)4?1SBzLGS4C(Q5F^ZhY{KNtRd z9JA-kEHmGDpS^^}VxnEb`MsI9?YZ;&+7?#N?*~Wxtv6Pajp1g77%wxlSFgIt`8?13J?voCUHv@QnpRHZ;&+p6srRPVCS>`%4F74@*5bADg>q3*woSF zc+TGu^SP1vNb|aye<}?1^S{4WgTSK9^LxcCEYH_2n$sRQzc=l`c0oN6*j_s2{^z`& zv3o5UzSeZr?DP9;2YoKUum53>o!^^z+lzaCKWLAi-&_9^#@~eXKk`C@i1*}K zGu1BECEcsxdE$a&#*TeM93eycGKCYj0;N0kbIRH;>Ug7x*L_8&`?#;*^*S9droa9t zSU%6`PcZVt%V8SNH%%%*Jkl*TbmT{Tel41G#3S80Lq~q3i~FA-9_jiF9r+2JhFBi) zNcW7PBR|rq6E4cW=yNVjDkdK3n(s30Vd#O2&@(JbM?BKaHFV^ssg&2Fy`pr)BVEPN zk)P0Mi1i~L={6ZU@*`ak+#G&Ihjhdv-A+SCex!R^eJuigmUP4;-AL14$&Yl;4vx|h zk91{2M}DMxdauRd>JrN%9_e_WkRR!KhDGU!M>^t>AJfkcmUe*u2;P4@Kfc|_N&E?( zeg}C$Pkhps?vCEqq-Vb*U(yqw^b-s{`Le&q`xEJjPx{4%o_txZkDmCXUuWpamvqgh zzr^JyKI!`mJ^8LP`iu8Z%1?aKKV#_0w`Az!{gm{?Cw=pm%zbP4u>L-J;*)-^p(kI~ zJKo<}KJiIkG4$lidi&^!Px?)Uo_s0yPLKYHPx_sPo_txZkDmCXANggiKk}vgBV+dk z>rZ^rmkmAnQhz>r;*)-@p(kJVzxaL3@`+FSjfS3l+5dd>#3%iBLr=bx+ec4)(wB@K zCtvozwI2NupY#(9J^509K6>JlezBn^U$(oCp7^Baa|roXOuu74s=EJ8d8Frc^5y-@ ze#Gl&zh0H#^A6v;R7UImM?C6pLTnsnzaSoByx*OwtU5ek4I6gJu%+hd%iUMG*!bUI zTzZ>X|6QqLmtPVLxiMcR9p`0ziSz^C|HdbbzT$P|`BHg)9oTbcwhP;V?ZSGoy>$AC zDLOv5UB~}t(l@ue{x{Av#4AkIv5tYjG_UJi{@43Q2CF3?cpvCA!D!AiE->(gS6IWK7^~<;C8$U?Lep*hX|7b@j0KY>Sd_9)d zSAG9KXcQg3x9$0wqE+v08CSix9j^9mT%~;2;+Gz%uhW&Tps#q)Tx4}8etn>&IexGm z*e;Zl?G>h>!`4|3^V)M4-{0|%i*@>4O6OM@z0WXud9O)x{CH>VI{BEmMa8l6=~oRp zeaO4iFNT?rWV_%J%XiVh$xUa4`+lVRedT|m_Bktky?AJsaR09Ot)L)EMAoWzoY`az_xweUu zMAH4GKdr7(BO(MVjGmaw#|ylziU;b6dZC{B9@BcF{^E2}&qYg?buC}DWX1Aay6P|e zl)6fd*5az?^nHhK8@M59;G~|Y7wW0>Gp#4;&*cMH>bYR~>Lm-7E?KZDmy_fE(zmHn z$F$`xHd2j~jGj(Xx$ZeX_A3{edZJ#ar}EFu_+ zvlcAtUfQ*&$#|n~&sVyx%_yTMq@XA22dAUrfqJ4|sHe)~W_&XJDo!W$T(x+?qFh}m zWYu5#S#^~ft;Ne6J>d%VWR4d{kf|r?g?j4yg&Chrzlsp4gw#{{Mmc}Q%4G|dFYJmV z)kyc3zO$}UqXIqo4?R9HmwHN?Gf_{}3-wg`r5T@0zalTjPCZvBPcrIj-V3`{*YQt0dV=qUc%YuB7wW0}D>FWseif&adahcnhKl&*)O3I8XVq0| zRICRbJ-Opk(l>0WC+dZI;=F+RiiW!g?R=h!=S(P?RAw(>2*BZ=}*Yv`1JB9T9~4qxUTXYm20NQ z3D}ZFo|3a?L4!TD+%-bZb-Oi!o_bXV*SEOdRXWm)<7VAFzTVIG2l4g$f2fE4r_=+; zElSxPN|}QO{dMrC!BmCFdRLEGA2)GntxlIN&bQu0I7i?zp8J|eVGrYMTj()J@A}@X$Q7Tva*cYAxTcJ3E^$M>KxeUn1CTmAM|zl+RxwLueE|6@qI*Ue={ zdVN@>^r_Dy-kU(hk>imem1axB?$1-;TJ!;={`VH{`kGg$KCnp=1reE zGo+dJjwLPEylL9x!;ZdZGp=tq>&^GwdT3Y6>nHtcGSUn`{Qimu6u*|KiXJp~C_G#n zuXtUp=s|<@J&G@Q9cAcmoSIOS7w zu6*c`@7>z*iRY%bgO?lntB?NH$Cc%!1RrzunAUiGv*w{6#lOLezCnH${_c^MjD|HIRJ9Tfg_DQW*B{A0-A1dF#v z7;Pmf+lB4Gc44*HUST@aA)vOfeRj>e&$P?eI)178(9@r}z56 zpkJzA61VC+v?e`P?d1=iHmC$ zmEb+S)5Dv*7-Mdd6kd^(sq!d04?h;s>^&EVORov|}Yp!>TT9QlrEpM9Q9e8*He=FIThr;N)V)OM!yp?vm+ zbR5?b>01YzXI0K2T4HI|HaSLp5VS9>$%A%|)DO=L?^ZvifroSv3JuiKfc5EMd^lL24j(W+9gMGsIFDH~XP@0Pb~|sJ$f(3S`*Lxs!o@WGJD95)^WTjJ}*eVn*3FjB3B9FK5kM8md~^A z&6|?TiPI5}baM?I`4L}zHxIX_^$9>c(p3x{`H}A0y`yx*Bi$xLM}9)5A=Zz0q}yre z$d7bE@OzjTD<|uw(G%&3Px|e#en|Rwy-81e(wFYl{fB(nKJogKp7^AnVCc!0<@)G}Px{4% zo_t9^GNu=nPkhp^GxX%k{>=8FUP(`U()Ss9@+Cdxh|?3F^v@W2@}=Cq@`+FSW;1S( zFZD(~@$!jJdX78fTQU8|S3dDcPyXafddk7;&|j}gaD3x@p%feEsJG@=KaTSQ-)q&- z_Xl-pl0-j0eun!$r$ElE?;ubg zgmAtPfL6^HY^>Koa9!R(e0cAJ0{pTC>I?qO<3V%T^X3a|2eu3A#r6u*Pb{0N-gR!} zwIJXb?x58@!%bVwGuvFBVw%^54L$PRs2Tfi`B|H-M?Jlrh# z^A6xXZ&ju8erxm@ZjKimKl;r0!Eq%%{&F0Qk7rQKEMr@LhcRStTIf>beR*kqk6v%M zyfci;*XePi?_>GK57M!pmOh$5-+F9pyqFzJLu!9uee`<6S&A0x4JJ-pZ#YZ&-Nr9l zi13e*XfE#fp+~V8+JH%-pZ2I5n(e@LVY{-uLV-gcxvL+h@XzgfQ^#{HI*q*$kC_YK zHT?C9FwN`ws{M~W7_l?lj|JZw@-6kVI5mNvs;g*2^y7E{C%s26ex-K0v{OIV zmHxN({Gc|M{8!N~IK$2Ic^0Dl+uCxRGNWz!RGi?h(@AcB=^ODa;E$*?x9BUgGpLPv zqF$({%I{3Onf8mbvh`fDY{3OxIIE@3wyj>$mG$6lzv)qIT&SGs)#~gY^fWAHkdrJV z^+df;Pkq1FdZPZ~BG`IfuwYpoY6|*GKV21zGi~`=Ct8bp)!7>8X+tzS@q0ql6ZJwp z@&2d&VyvW|Z(q{&j{M!J-}L?ZsI;lf*+x&N#VR*6mPV3#qF$&cqEdfMGq(L<&D)uk zEAB77TFp9J-RNEY`QGb=W_;Q&CVA{O46i~@u&=bIw67$k-PP%yc9Y-!w}Xb>f6pf_ zZJD&_qg(d=yS4YnQ6JwE%ocJS^fH7-Tt(rA~?Bb9wM&$W*$ z)@Z+ydA{|Pq^G8>$}X=8pMzbzMJ540(X(p%#crV|+JJif`t_3$gAOq1kynI51BC_( z4HOzEG*D=u&_JPqLIZ^c3Jnw*C^S%LpwK{}fkFd?241=vz#3z*Uii{&|DxuF1_})n z8YnbSXrRzQp@BjJg$4=@6dEWrP-vjgK%s#`1BC|iY9PycV%ux?+5Ep#kJ$462EQuY z!zg87MY1|@|7+zF`kW8I9*e+}bwoB>Xb-S>=LOGl6HtkZ@`;+78l*;rf-+~Bl2>*lE6vc;e{5&VV{d(hG zMG82ep6->~z(Ip18gEunfB%(R%pA(ZeK+WI-%SZ~UNU!L z&do^2IY8x83G~tLzfA~&Gp1-(^wsGwP5@6fPvP2E#_5U{zA{Xl=qqEQ@{@sIdT{lX zaeZZE;hJ9V?!sWZupQVg3s813@3`dz0`lGZZ7Nq_&%&m-wd`Tw*pfxahd`>05w z?N1)s1->#^KF^|8{#aX%vrm~i=eQ|wma%%pilwXOtvK)Bx)!cpwqj9NHfj1xe@0kd z(^)7yTZz?Jzg1`U(Vup?lTnp6N5LZm)D!hWJ+Zy0zX*{^#Ot}NYt`Z|WTHE{+MR$tLMBG-S`Z9Y8&^LKGf40*~+5K@%Z`2j(_p-kk`q_ z#EIkK+TfZXi=PLMhp;{$jxk2EH{^ovF6IlRC-wNlI3IQW*zCV7H{O4JoTdLQU7)^S z4xcLvR)7+dI(BW*>6;V+zfU=QsK(x4%4h#Y8f&e*ZZ0#@{a2;j?^BK#dQ46&mS+!lQcDZ2>@tIOu6#G7qtiBPqMln!Z1{xl9!wtDM)JNi_PCFbm0JbHo=OJnc)*?&@tR zf9%mVB?EW`JBKy3s2{GcHzobYhFAQXs!z`sk6tq9p|}0@kS`zpm#?(G?XRESy6o*i z$M=Udz47m*Ot$DjDDXOf#M}^Xw&yx>oedP5)(zSzHAb<5PRx{bpWo;t9Vn z&-Y_=er0U(JUiJ(Kc)7^=*La!GRvoL_)SJ0A0_FCN4lMcj{JoFj_?K~9q~vv@;+TJ z@*`c(uqYkzNLMy=k90l5qIAR~-F8Dq zenK~KFkqHPJkpg+KOjHS1p(fW3mx%DH^I=6AL-5-5|xv9q+4w0$d7bE5S5d7q+`D& zKhm8wBuYm-(h-mRnC=-S^$Wi*Y2>00_-9O-`0O|FegM6Kp7^A1-W4{JJvY{tmmOCNVuB0bE>DL;1@+DooACaE;q~B=h$(M5b=!sAI?S`Iw zsrPjr`H4^Z^5c43C*P4~eDKi|pY&@DJ^509K6>Jlexso$U$#Hx;C)5?5ufzi4L$j; zHS$xBaeCsDzGUng`BHyA{S%+`w2S1+{>Oe0FQ53N=XLUB`APJ>3b|tJFW+mGkBQo0 zmd|m-Hy)te9`)&|k1J~k%QkG-CBu@wAyK+j`@CdazD@U+(tqd}d};->TaPkiq~p9k znLhpvi6^FL-r3%3p*{%uy%T8h4GG40Ce_cS@(qbgh8+~(mn~3VUr_pr2hGKOuNB7_ zSZTHk+kx#uDcN2+&2~6gJzpdIAKFFfwyABPd_w|#SU;hK0@{Cj>Ng~KzcuY;|IqTj=%A7JU$*n!MxvAD0ts}FHuiQcw&vtX-gk8-x@P<-|c1|@!5Ri2kF>P zD@pW^UxR+B0{4=$-wvGd1JWhE7vEFI54Ho_1@%K0J=bq)QwfB@Y8V)*=AgsQ*6B?D!5=mN z{Wu=-af(wv|7nctkE>#N-~B+r`mU@k%f7WQ57?_%d_(ip=KKdK*jLVE{N<`Kas1 z#{ClR`!VHbea}5>>Y1~rp58HaW}V;3=`VewzLA6el=T}qJ*t1Ozq0>wTw=dg>vs>U zpBh(&sd$)*35pvB+RuCqG^mDcrL=Yff#y1U_R2k9;msRy40edn}T-zt?$0} zB_T!lPdzu?vUip-g(Tqb8&~piBF7glM!U4)elhm^zmzB{nHox|7y}!Db=)r$vj-|@ zXn;mCEP&MyPndv8HOI#?W|xe(>g^sMNoX;<%($Pbco?l8Y*Xv3){*-xsxhdiKgUp?n<8jH*@xJf- zbQ1la)qRd&o?m({k3G-mtG@q78T%EkYtIL*dhfK8)Xs%}%l%*e+#rzp=g4`{akzPu(w9 zs`$!|iw^to!|FHXtP7SrtbXRcsjX$+FMRF{vHj~M>h3yv=;Xop)#i(Iu)X38LDtXSqJT*&?nAI_BVb}7mU^PB5 zzF^7nT!k9s%bc=Ge_tH&UBvy~mD{IA@)vVo@DBanYn@4_mA~!DQ{LwM{-ogWH$)La zr-+k6f??(ZZh{+BYx%Jk-<6VG`f|NBztM*ZB^Bt z@>$(xS_Ar7FHIZl(~rdv7pXLUy4Q!i@czpQJ%b+~G%;vWIpBfc-od!wLn_Ae$OL6A zOX?42K-H}jj0|U|=Y)7?s`Nhxhlc%2fk6-cDcsj8uYfvGc3*7JR8)S0dH-c%kr%Z3 zr|THywU;U#V|}E5Ys8TGv8$IAKDI>71ypF@C8dEw)PbhqFR2aAw0AuNs4 z^Qk@)lb#Ml6?fmm^MY>JBA8*sIEVs6@ z?>+j+!74upn!?{8wYIQV@Dl}3RPiA7Goe+*t$3~>9akQhCL-g9{(SHQN%z1$Jwskc z95+6Fg<1scN0`!e{(?12GrM{7l*Ic}F0Yz7y#EH?(f-f-igFQ;a>el>*TRbyF73+iE-O*u^0Ruqck!<1x-aWbxrj%( zb{aY|MPGgUilu9ob{8zrC1pD<#|ML8%}%_^7gg>F_bbQ6Csgz=8L?g?6h(iJCO4|`8~ z;*-A5yjLP$&~nTS>932@6QA_Y7<%#rJs)7d9y}V9ZjaIvpY+YW(;QpYrE=o^)(pL;U`GTHfb5HQ=p!BIIJ@H8oIT6Sg^x-Z5 zRf)%sQFhSybAtXCE5-0V+d~QuxRqZ0eD{orOILJ8-UH(K1^fNR^c%A(LvbZ#WOK(~mk+*z%bRU$O()6I7 z`1!)%pc9==it!;P%|yq|$Lu z3(kn>%Kj~UHb&d(XW*?$zfZK4fALP^YYY0;zYet-8gIBH$j%1I3kGF9H-WtwhpFEq zU%Lox+M-$@XgTqKRzykdtn$O~1_BL>d)vWk$~Vt!|NO!qb}%M;eKeG{f-WT7zTgI= z!`mJ63S5CMp``~m-8Bh$Ki&76>UT;j?!WmepZD8+3I<;3ebH|Tm2Sz`f3dHnRzSJ9 z0m%283P!p3F$m21RmZx&_~+k!6Qj?UUDlIu;z^q3!2< zb&2D&?LW=Y{?m7BwEy(=)gJ$<%XG^(&*4fo^4(qiXJ^rW9K|Q~9o~}~js1su%hG?a z@0#}gUIpX6FTEmaKPwxf{b$#rMHoIJzVRkkL0W+s~gmt<$09lu-raVF6Ft=l-r-)>^@hpzAT63@;w#h*`UfjZNWti zuP@7CxvH2jP@daV3gz~vzJ_HOp}w0G#C@r^E7;Wsac6cdSL>6iWVJ}yh-J!MyJS<$ zu8U<&jpfDTw0Q*aQJ-Fw;CtcEC>ZsLzaL)Ob$-8IR?Rz2F>PR=+?11Yvk2B_<&p~) z_ebz~Gs&?rG2}j6vEuu2JP&Yv)LCaS^Hr3|XT=~mWrk`OwU}7iso!ZGqOPK?N>4=J zae>MWr_AX8*Fmvb81LuD9@~GuuABv2XrR!*o}+=v$MiGJ^D412Z0Rpj%?+&jQ@k>Jkcs6KNRb~Ig`Go5J zh&=3c;#O#^Cx+zSr?Ch)m}>Adm$@{Tu$qilxfioCpi_@&#M@5bI9#^vI=q4ho?Wf_M$ z+Bz02Q{T%D!vDvN9b4z7Gk;m3-8Xye`r7e*%Nt+uyH+KhT89l(`dTGt1$6%Nsv*Tgz#R>qxbpQR&sbUS6-RLdMcfQQt3`O8%eLHfzoD z`qf|=Q6GJ=GZM(>HCcb=I*27V0P_3Vu(uB1+tm2Dg#2je`<&j(qN0I^t|A{GxfX?k)@Yh|O>IU7TjZVq;Qs1Sg0j8hd(l}3 z?pJ2IzwzQr^!o+IkoulwXeJ=U!1nzu|XVk}W7MCL77 z*1ck-+HA0}OP|SDvit(_ZbTgFOBKrdA!)CUl!HEtP#x?2ztKIQPYxa5qJB7w*;1NZ z?77mqqyBjRyRl%PU9bm~dW-JWiR)jzS8mheH^*y^-<4bR_|0*>@_2CPlNU=l9KVl~ zthylHe;dtxKqkoNwd(PYSd3AxY~y$33&r?Nt<@8AoMe0X#-m1$-{nj7ILVl@vyV_N zUauurBggNZMlQxaxp>_t7wYjsjNiN;cGvjbT#VoB5-N7bY!?<3j^ET<*72L;HOKGL zMm>IWT$d6w#PR$1_=TKl-hY+LqWd?H&ui87ju(=B{4U>FjNftXqehS4 z&6n%`!I(0$k5DdNuO(L_$L~HP7h|7XyzY|=^>`u1Z{82PYy2)3<2Sp6irq2Wg$0G< zH}#fv{N{Mg@tYhuuKS+9#}l#6nD^h}E1sY6yY$6k{I0X9LNbn%Y%kw<)adcMbfxYe zj9CZvAIin+wd88#_`T7{#n>koulwYBp~i3C54&spUR;dd>=G(=$7~lC6pr82TiW_Cyxv+B* zf8TiH;S>3b76x4)Fvgj4?W0Q7E`WckXy|RldP_9Vrqnfr?$~wxT_}{H*U2@{m;LCb zlQlm5bh2Hv9{0pGZe5?+|2bZ=-F)LxqsQ@`rk^mTlB*|kbJZAA}!mM$eWouStF5 zFBd(i$RmU`9|gL61ZTUlRj?uOzxYk{&h-)X&Q;rtZ$EN$%eNo-Y{cI)I7*;xkr+D0 zkNT%RsefO4vz>&uhRR(F`fJpC;yf3fe?_a#bM=Ir>hyk1uHH^*qYlqM{|Zn0#rc?a zRN17xe!aB)u3Z;f{X;HS|M1Q9$Rm&ROaIh2^EEWGLs|r%{?#Zk@3elL^HX~O zwyOGWU3~r(=!ZRkRX^JbnEF2E{;z&frB%?nilm!x-<+})S08<3LK|W9RnRNkgjZ%R zA8Aw4f)C4H_b-38`VWGQ5&h%Z?XRAquKR-Yd(E$>rK zeSmr)`1F5T*9G(XtA90CsC_VDpAR&A$^*L8Z2AWc@S$_Uq|ej;Nz1kak8`hn$o7Ba zyWr)c$yiA|RJ68=%7@N{UTL+&D+ZOic zu{B;+#rQ0&9C=B^7a-*+y+#w1@S-Wly0!t(`uC6Vt?HL*pRr7NSp5y_YI@woI% zbbf^WhZ~hmru;i2KFfPrV2@p!OgUIC<)|1rC|{}^!Rm-!Ajf0-z57IUv^%WV$Y1Jj zyg~l+D!&Z()FsKmaw$itqV+-fQspRB%YibX53C)O9XV98W#garSL1`&SgQ|HF6F40 zH04W`V?Vzfm_+Z{Pjc3c+9!Ez}_=>tX|)JvK^nycm5d%xe_&HhpP zmF}lVGq|!)4wg$fDn<^992HY8 zNN*M%zw%cUF@BM0S6)yK7dInXX^V{*i0vHCFO zQjXGxjXtQCqiR3zmey6vf#*|>rZOz>M{l(pcOSaKj;DQ& z95u(&m>i|+j6SHBG&wd_%W=zvpSI&^`EgetHO5m@uGNQ0Q!lCdxT9JQ^a0#2_*Eiu z)EG}=a+E$|^g+F(>0^^$4#>07>8G{sTb66}VdSV}m1C=44&1lf9XTLZTo!x3m~tsc z>7zy;)JvK^`uuX>zAgPm#xcl&;L1WdST5zL7&$6g<@j!r95S9xaO7~y*AhA7sVSFo zls;zkLA|8uW4m7tw98^gj<_z6w)!yTQjUsAQ!lCa%j14I&@Ss@a>Qk!94wb|ls<0s zL3z^jv9nqZcRcM&xNno@*({fGRE!*yuaYLm6V-CK<7w#^GL9{(HQzVoQjXFmj6Nt& znjFtm%b~{834H!2J94NtY55P|eBYEyIVvV?^^zt>AoWGtWBmicj;9ehYK*5bIZEq{ zJ}6I`93{UTkf+b-r?u`|mTUE49Jp_vapZtpaarvBV#=i)rS(Q1lqXG& zk$yRF-!|{eIG&nvDM!VmD_P}eN|Hmy)47fuaa}+^Rv$4rO4l2GP@Xh>H2dX1yHp%G zP;Oin%E5B2K8zezFKKd&^~-^F*%Xr_E(_(Tm~tsc>EDe$sF$Nto=+!K%i*q{_9fi6 ziQ}m$mvU50n(~#>Ix`e{s#(hWu*)JvKiWhn!+q%s}GZ=UQ+eZ>6asXK8?ts$J6VsJi@MD+Wrxfqx4Cm59%dN zA9MY3sQL#xoqig>S8$zjuw1JTBS$5x9P|BhplwF}Had>QWuY7uQ!eEweah&AdP&pA zV!s?=|A@%}9k{Yk4wg$fDn<^_)#(CQjXH0S`NxrNt5H+YB?~T@_kh4m+tkRmRtYzx5@9tOu3Y!LOG0l zsdB7y%SjkdV{%k3KPP-ghxS3R?GlrtG|IFKchxk^^zvXM!y`WZ|Qe3j>Yelh(1iYl%sT*(Ff&8lj9D*9Jp^MIC7xexGZcJmPUpoDApk4YLIZ$p~7RteLDM#rDqYuiHrjNOPInXZ8#N>#}LOED2<)|1rC|}xs zfztdWIn4JLRiVwl&v?I>aw$jYbw(f5OUk~5(&A(}Fm|9_<~nl3b%C_ihbfnGR7{$B zN!3TUUkB)7RteLDMx9v(FgUCrjNBra>#sclaT}E<2?k%)TH7^sz2U4(T6jjT~sB_!tHqv7fSB zs}Caw^^&TOUcVeDd!r)<%8koHIk@kMasU^B@}U;O)u+IZEo`jr*O( zsq3&&d;RzS+v@J$A*}LS2`e-k1`my&jL?_f^U994-UqOk8KKw0ZSVM*h4nT4-^XX( z!|;{H{Y3Ny76dn*+~VX5CqJLgc9Eys!r%Sml@=B*YHseS*Ht60b;|9v@UOlhaD>kg z+$GiF;0ZTc+923q;nlyn)50#*U=N?M=iTebzs&(nq<=#+b?g`Zp~aD4WKJ``$XW;|;*sKuU{l2&jyH~90I_A6;%ez*+WfabW zje6@bD_5*ufUVK<-nM4J>aLZ`!^3^nz6SbzTGYO}5@=Z4*Xn#wV+5 z;aH{$8`?j+Yp<69f_;78uJX$PyFu|u97kYZMgDCThJBTM;pEegwy(s4ebqtRSEeNP z@qvAnaz|Jg_EqxJ`P|ujV8>S;8fNrxsD(TJRbb(w#9_{es*VJ|ep)*w z-aZbWj8&oC!mzKBudm|2pAYOS18k%Y+P*R+v5$|ouf&6W)j``=rX=?9fqj+xafXFq zUnM^apH4>)Gc64JnomEoopR?`81^-vJg~0}u&+93`^uEWKK;C^!$~0n7`_v z=dVmjtoV5BJ?5_rQTxhVH}=be`6~nFpgQRJD^n8t1@=|)1@hOc)4`u?Sx?f>mrPT!TwO?UhwT^uH!TeRUSlCz5g@y|ITD$+~^kv<3`S3$ukHF z`zpH75a+M1-+{X9>&V?>U*D_NhehUM{wliAP%(eidhprlV*Z+@AH08McwXnPEHn~h zeONM{*ZHdy>p;c)RV%}Pf1T>IS7BeBt`mZ=ulNQn{pldnV_%o9SQx&44flA3dzzXG zn;I%H_RrTBtLCh$2VVnHymLM7g9nGO%gV<`+tf{4H7?eKHLTZ!nJ=7teDs7g<(@AKb;S3s^D+4Fl?&i zXW_HM!GF@iu&H_Yz@`fR2n*vqtK_H41Dh)NhgujmRr1sMz^1BiL2T8Sqbv-YD*5Sr zU{eKuw1r_)B|n`HY^wB=W((sztK_HiflU?sF&4%?CdtpjXRL!i&cb-lnvc(T2mb^M zV;@sKJ|{W&6D^GQtawUlKd?7I@Q6SVPU*y&Bv$H!Jlbiyl2hFXSRbs$HI8envc&p4*t0o#y+Mzd}veY z=M);vY*WWp+tlb;3w`b-@7Wu@_RBLfSo_tm-n+#7^tNy0*&E8Bc2KK%n3h5BUCJ(x zo~IHYdzUl}n@U(}<$vbT^HlP|JXOPbp2~dTdW=y@vfF;CU7_w0>lkC>jPk`Lyo8rJhv=4X)ydzXlhd8&r>JeB$B zeDpk(_?gb$2vY}o0ngqzQV6KmepxT9{c8AmIC~>PIFO#FQl9>uy7_=P-sBl2MFm-WKlCCZtlUf8=teC%B!AM9OXeilC1yF`5KT_PXs zU1EL~K8-tjgSB7!>_*8Ro4RV@f~8&R@=(~}aP4(8Sz%MryZp}zdhM6@Kw(q0 zw&Z_dQ?)Mqwg>xx*?+KKNyB^}5a+4<{seMUY^uCZ zZ7po7^exe>?_Mozs@9QDKZQ-Lt)IfC*49rQJ|g6%b)dqgrs=t`snC#b9HUL;x0HaJ z*`}8JZBrA^v0?3Z_+8?6i7?iF2}4c>RkuVwb*%k*_;j{Qx!o4V+OOnOno!q?eCn{N ziG1o<`%UD7wO^5cn}xCVEBWd5s>AP6qCBvvQtk)~W9?V+)8(mS?Ke@LI@W#@`RF}L ze6G*5_M6D34x5_D2W!9L-)fA7@jg}Zv*@{TewU=&6RZqa`<47G^5mYUChDgSo0`Z6 zewPN>`CPk&@jg}Zv(zj1+Hayfb@*LMZc3cpM4 zcLC!z72kkQ^}E!WWM8Gf5USyKDN#Q7U7CC1@y1_CuZ3Y>C7;~=_N)%S5Q*~4d$_Y* z%I&r=?5pIb%LDs5f6eF*YD~OO)dBBTFa4|boy0uEzUKzmSHa(4VZ2+FeBtEd1N$oS zZ?iD$tK?_lgLkV8nfyW|>KXP`${k^0*jLGCIez_U`$|0V?NGxnM4~*}zLHNSzYvLh z>hKGZ$Vb~(%JaPXg-Dd=1@sHykq7pb;dwo`>X9e6UkDE$*jEO;Th*b4-=#!8b(~vG z28{4OQ(p?!6~cUzZzog1~U&prmf!PPM_3s4Rr1s2d8ydf4O>1Q`nJ4B z?FZifkR7I9Wzo-3j=#4t7RLP5;|DHr9643_HGECa2hDvkuA{m2%$rd9m(+e>m2d95 zEb@#;x#oHL1Pf#SD*5SrriXrmi8o;E>)~3W(C<$0!&qxMzJQ@65gH_khMg?&BYZ5J8;oV^x?eU*GE!Bp!!delo|xu&??0 zPqKZjcm6u}f8_f|b=lX&)%Nw3*ZlAZVc6F^d|+P%zt_T;ze;|(Jg~2Vzrn(=uack62liF)w^GkI#4q{{#!ezUJd| zl7m0d!q_LAhY#Mr3jQPu<2EL%;7&bKz zAJ|mE@3k;&s^q831Dh)N8!QZ)D*5SrU{eKun}uOhB|i(F9S;7J7KTmD!v{81@JCn} zHdXS|<$+BV{6j4an=1L~d|*=rf0Tt`Qzbv04{WO7kG3#us^q8hflU?sW(&inN`5*Y z*i^wEV`11-$6b(Pp~j-YCb+EIrtMT44ayV4{WO7PqHvGc638nvc(H z2Y-%*VN>(*Imf|2*TS%=dHB$#ZmP$ouC2DI@85ByUEd%Kn@U((thP-R{N6Ugu&IQz z@PSPg{3Z*-rb@nW^4sQ42fy3Gu&H_Yz@`d*uZ3Y#B|lvr*i^yaU}4x)$xr74n=1I* zEDW0}`C0hvaPXhBFl=fbKCr2RKf=PWsgj>A4{WO7A8KLPRLM{01Dh)Nqbv-YD*5Sr zU{eKuw1r_)B|n`HY^vZlTNpM~^3(airV9QT3&W;LeilAs9sF??hE2`KXS{=df`wsI z^YJ;!!JlYh*wj3HU{eKul7(SYB|nRPS{?j$3&W=7<1^L4pKf8;)I5A(Qw6_lVc1m3 z&r+{b9sC&8GWm!|+rke(KFtyQl3mc zA`4z_Fn_8~N zre0gvR2iG(&h*)g!lu@~R|}h3TR(+Ot*xIr{4OPq^@UAM({nLTg@%0NJm;xv>#?cp zcArfZe=EIhgz-L=ux|C*ZQsbXUn#e{oiN^~63!yeK(whM|2A6}yib*UshO`2HPY{r zlsm%u+`;=)$xoN(4D~)$o^@pH_X+hrRr1sM?5EzRe&GKuYSEaZEPSVWpDOw3e9lns zQw4vtg`ZIGQzbv0&%Ww?s>m<%)UT-bsgj@02lLc_e&cFWuQ3+J+OOni;WO4Lw|{HD zud?!}b2SDI&(+xcbb0i-RnDIV#@cW1-t-^W-a#1eQwdA0{A2X)Ui-bLjqdc9y%k5*`vpRZZ} z+pFk6$M@1*;1T-Z?~U5n9Uk8hD!)}E6Ue7~yk8x8@sZ|CZ?A=6 zV*jg|a#KBGpA?fBEw-%Zk(<2u&deeBJE zfA-{Y$j^KxAMaNWn)&g~n$HOqhK-eceHH(G^?Hx;4RO`-<4ymEjn&~dYR^*l-2F29 z&e&J&St4x^OtQ3JR(qC)Tt4^Za!o@%dEnddo&WS1qn~yQ!^TR!aP#qbQ}|sQ;)!pF zKdC)S%ynZQp99sNCBZ9qjGDV3)XAmF#vU~IKXTOTRHvWJurO?FzW&qc^q-kd|CyDu z|IBv!$s7w~&r+WLGipTg+0~ytiTA73!KY{1*uMI0th{gC7`3r#uhQ0PNrFJ{VXD63 zlM((6zx~_-Ge-7W7&cb&g`ba4BW;v=n%y>0S)bNOEq z`M24+z{X0x)Xb-6J&z?`)IS7s-Pp$mYr|6R2n)l;O1^ON@xdOZ$(J8sz6%_+v4c1K z?>OP0As-*uSiv7E0h1r7_1@7<-r`KMSAn&KQPo$LRnYOW2M5dd40m z2Cr)R;h-VEer9)^ zbHKaIv&^>VS8o@qc9bjV#yRlDajkK{+ z9`*_A02@o#jeYX$E*s0TF^?te#y)xUK4D^FpRf+Fv4q{&&!=(oSSb(tgmr+8CG5sN zdGtPEVn%H&bKTg-2R8Q4SH0ED_eNP5HdgY5laCKOe){>^DKO3 zcii`*Pa6C=7KV+L{49JLYhx>ou(6wVkB!x5aj28R#!?fE<7>stFKn#VL?dl1bsGdY zi=zW(-dz^?VYsIj!%ynZQAJ|yI!@gl1U}Fipv7b+2 zW1%O%ehNSRwe^Gdu?$fg%Un11>v`b$>2FekZ>+J$$$1}J?Tcw^VOQODC+utgV(zLn z81O8?6anf5!SSbrl4m|KKo*xvS(0&R!H3!hAB`YHTJKtsO%Q=D~8>p#U=*INAtdxo17!h~#gwc0P!_QI~_IcHedRrE&x zcvkq3sI4D8U*+?coOjjlSDCMQ)Y7wlze;?(U)8XFzsme9eDHpi_}IflK83GCXiu*L zQ$K~TL+Mc(YUFuW_C1_;C5$~xgx#`z&r{RF@3gYL&b739pD^=f(Cs>f?o7 z&C_m$UDbWk*B=YJT3bJbU9GL3!Z%ZG{S-cgYwM@cc6D97c6I0Ov#a8dr|{3DdxQLM zb$xdtfBa zwQ^p8_p2ISwLoCu;$JuU$0sLtymRk;jQ^@h79R1t$rjGS2lLfOKXtC*({5qxTatX? z~~ zU%fD26+O(fFwV6~eilBnopR?`81vOU@*JmpM~HsTweX|LcZB4p%VT{KTH!Xe9l`17A}4pa_xqR9m5`-X>BawH++AxlP{cn`hks|e0yMR zEMeGK!otNb&uV33DTC_W7CuASSjiVoK6&m@HujXcC2L~|FHkm?uyFCqGhNwODR+j2 z?@=~Z@`aO69@tpX!%Pdq#!7xVpXtMAJLS%?@IA`L=8@;M%EpQw&b9CkWn(2jT^`!l z(l2WJj>u$VpNZPo2K#3+{y9SbOd)LiGnxGKx;D~xgz^t$$_@Q9g|P9@lv$qLWn-0p zrhT9doNHD7nKJu&gYO8bSLmO~)GPGQl(}9F_RnO>4gE8Pu<_57Ssvq`>3H2kqP`=P zf1|sk=V-_`1{nWL20!%A6vD*mpUL>Y4gE8Pu<_4i@`aO+kMYlB@I#+WA#D6JW#$7Ld+S3>uh1nnTNpN0 z^0UZuRL8?V`lRuTGseQOv67#K5B4@OU~iKS`a7;nN$l6p!1K>^@%rzZXSzup*F5;= z5QdHY)AY_9^Yc~*zum%^$L8ZR)yjZ*EaicXB`jL@+cenNOTS59fn^KB#!9|$^0(Ki zPPsEI3>%wA9?WA!4>K){d937Tk!QA3?i>rl#^#gf97hl5S{Qqq^5}>2*h(X8Y-#t{ z*up=P?pMA(Uf9^$`YHS~rRk^e&jbzm?ypAr8P+X<|Aik3(S?Te{$b|6xX!!crAc4P zJ}0gfTL(>NerC9R54&GsTiG+**muwFt~FwoUHCrKnka0m)`PDf7QPQ_>!+}-we_RF znXYkypzzT|O)!Rigl&DMKelybVOyzBH};Kbg>BVZ^697W(^OkO`g{(1TH#linqXY` zX-exq(QnXEZ}q%?C2e6_MH7T*Tbp;*_R~~z-rAI8Te(LbC26?u)ugqqZ7cOt_-bNb zWL%tm)tc}t`&wH+#o5=|`f2pp*SQ&Ot9I5jb*fztZZ7O9pB;3I)o!=K zuGZF1VOMMGr?9KF^;6i@+WIN%YHj^A+OAgWwX0(byIR=QAkb%VI1k6S(lxyE+kx6U z%6#3Y@!vNeE9`3R`@XQNwe?fj)!O}qZOG}^9is@JYg=(k)D8m3830 zuL^F@bTz*+VBINau2oelM4kFE`I&s{LSp|yvOKg zl!bBrM)HM|Pd_++Blx2&jPo~=pU$TayDCf_2>X}*_0pxLUSlkb^EZ+&1pa#E_AM+- z9SD9T=39AAurT~cNWKvGFtBUFtw}c4Da?TSU2Ao|udcAMC*MBKoOAEBF#JeJzVP$$ zsl$(iFm)iH6yPVm(cAv?7w5e}IB3Xc z8yjh3-~H6l*2WTsjV0{LL3go zOIW0-H3l5v;E%R2Y-}Dru(5*Q-0|6Oeg#L%1DtVPJbcY@t}KB4`Z=oO)qi|wvc?}{ zVc1y77jAw&V>{mZkCBGYxQ=_j`>Vr1g)^=yKk4kQFm)i<*aQCfkikE}!mzQDF9d#h zPU^U7#eE;pn6Rrlz{cLR<>N_yB#07;<9mcji!-ik4%w09rzJwq1Z?cY+sBzRvF#Ry zjg@?2*J`ia-*FYD4y0`?Gs+!jK6PDK7wlvD+tSBg&MS=ldOp?ZCo?Pz8=J5HbUOWK zrqh3B!kEyvu~Ke#J7L&Z!dc|0W3RBw*22cdj@B9BJT`=J z4oA%!O}<6b5~PtICl+UGmp(I59YDsPW`>Lv4mk`31^e%2nT<(g<)g!@X_;FmY8X;Fp(oM z=COCLUU{3&9AjbFSjiU>-~FY14!7Q_G2?zDT3;s|H00+4KN7@0!NRbyk}ur+d@zq? zh}u}@y0MQ>+{TgyHkPm(`}n}d20_y;8W(3=H4Ga|I2)hcV`Eu%jlIG|iNu)4NdFl?;kXW_HMDfdYW!^Y;32R2s99bsYESjkV92WMRc z|4=IfZ0y;8yxi0`oeym6Z5#J8^Q%!7hK-f{bUs)s7W~l`hK-f{bUv`LA6Pr0M`Jcy z81q=kPv-+0+kMBrMh{~w3>z!?S@?|Y=vXx0JcC4StjdQAw@C2yXUt=l-?8s;8u!;WYURIArwt!?Hdgw{4BKa5V3J+OFpt$i&tsXA*e6dN{v?E{ z1Hr~ha+HN(V()9xJ8cTdz96#u9d8pFDaVOU$T^Wv(0h z`Q-M8=(4qN9cNxGtqU}E9!t)dd^Hg{5)VWhD*|TnCn4w#REMu7hgv|qkChbWu{!8^ zEK?Hu`(fj3Ec{9Atg+9@T`NxX)il4btyfwtfoRT3bJbZLO`J z_Bq4qr_!TMNI~ZR^P2`u$0y+SbK|ZM7Z60epS3u&r82KK&H7 zwYGi=+ge*cg>9{^pTf4*){j1)qj7=&`-pXbAAiDb>>J0h#|iV+a(`@Vcam-89%o3Q z;Tpc0Tv08o{r8g()`T^T_pXF3vI2Z{)N8`z)1=lsHC)db9nz{@V3vosBKr}NRamH61(q+z^wB`jS0_0m3u$p>q~WLHqA#y|A~5a%Ryp-n$Zix`kiJGddy<)`VHF(=9Bus?`r0cSeUY z1Oe8BDG&BGQEwuVzdvJ5nE0@*+N*Kvz|v3V*gk{3!IGavp2n>M zhrXIp&flEYb^hv6Z#^c-RnuLt&81;MP`WnB#!6iX6~3CZCI%gKZTrK|edNnJCBB;e zsNS{C{M3@;sV~M2_0Ob|n}zYNRq}<%H|KmY`)d02K2ywD%~2hM@vfDy zXs4DfI>NypZDG7?&BF&aR`8oUZvEz0)}ws9Yn?ZIP3E(^c-JaEY{pm^HdgYbX1;dE z`5W=c6#8nqNy`)ZYBD~YvhW%2`1m=&!mzRVeE-14GBnPQ#6a-Xbl4qVF}{@Wu2l!T zYdzzs>x^$I=KA|#d><2Ou}Ao?OCS57aL|yy-A{G;$qWm_#^&okp|2)$hCKAuWcp9& zt0_nSneFtGITnVE&DVcmV;TClj|n!m^h<3Y!7<5KQwxA)De9|f?$U|5d^L?d_4n4s5{8W>%r-&nm*)rvf3$^RWApIQ^H`SH zKVMCO^=*UwO!RGo{Y>lAopBJDvU$wXym7&upik z%&{ zewu3Qhx>;o)N5Ba6?T>Pq8t0{MqyWL_s7Dn*49s9S8MC1@X=ITKk>ay8oTg+NIf*t zM^lqxy0~7uTE1lcbMFlTyllaTCe_~Ht#S@ZWtelpg?}dKA_$7}u38Vi=Z@mMYi<2# zyUKI-g?}ckE%{%ZcTMX*;@e4i=2L61^xFWx!t7U~Pv3p2=c~lWIxzVZ{+XaX&R5rE zv#Z)Y)6A*zezmi(tL#(K8~yv@3cISc@9^ONjqyjO(l!>!f1p`Hc}O7Ll*{q&O}(|+JYK6QM%)x)RL z?zz=|`n7B|zTKM0r;hiliG1qV51h!Sj&HYm`0Q}>1G}mNzK>4Wjn(~;$fu6?tBHK- z*bkh@r;cy8Ci2mCl^TFu)j|8|XG&t9e(HF?>X9e+eqawDoNHx>p1EPJ8~f^|?J6;0 zS9QRd8^Uhv=ac))O=7+3*te9(XWH;qNB&ITZuRhiU1f;+j$p1E`}9-C`&ExTx%UHm z_~hOX?BSDpKd^^S?lU)ue6S9DuxgOz-~0CicP!}cQofn0_X002Y^vLr3H$nVVNe#cCI3^Z0HBHZjO@)Sh;}~t~+AJ9~T2DUx z6gIWCehQmfTR(+Ot*xJ8o?2T!b?gI9d?uq!t<+;v*CyFiu5Ckp4cFKMoG4Qr-)K$b zQ^z-2J$$hC%X(${Mr$IUI`%3h^3iL*ln1^bG+g5wt%-c<_(rRT57vGuPo{UOiG1qV ztCYy6j&HOk@~Pt+t%-c`St&!b^qAARJs`!!9kh2hUo@`ad{os+8N^ zP8jc235zuTdJV)mtH{62)&+j~C0}ah)3e^QM7;jJTa|K0bP&cj& z@!fMBu0H3`j&F>3-9)At`}q9(t?oC|!Di zVPBykpMDDan$~{``&z62(7u-Iv#-uK<&x|x*RLUghKu*Fy1y3hU$q{5<680lwYGkW z_pi0}Q-`mJ#P?^#``0u*!@hEy&*XzCQO{T(7CtYo_pdm6vo_tnYX3_L*S>S@Eo`dv z3EdCz-)A!lo2qr>(@$YjYwM@5skQY}*wotkDfTqg)=wS&mlB^9U>{*qH`ZfQHx@Rv zu&H(VUP|nXg-xw}&lfhewtfnmT3bJbO|7k;M%&cwIc@4%C0^4#v z$yNG_&d@)9>4Q3MH5b}fEV_s|jfnAF0C`wGzFMA{OD0d0c*bexk53IYr^g|!trbIH1OO!7mi=^@vMax=T{4t{27Dx1*hNA zeE(O!xcJafcS9=1lnEDGJ5#W;i&X&}FNdoZfebq@i;kbWM~0pjls{LM zS^C`6aQvI23P<^sFX(hyxea+vRQ7|RGJMS4uwM*W91dR|wmOgmZ8jhAwxB}DN(`&s76ivXK(%g@H3GLpiuA%?ksD22*hY{xWv(&|2mA`Yx*a`Q4Xx3MQ z;E7h14F2-#<4@f6^|S8Vx$BQ%dhS=gcjD0fpSW+WNuPX5+evRYefIrlJ*TfuG5zv{)dzH{;xmW|Hxl;di^^`pWODR*KVHhC!N0SsD&qYe(2QA5C2A| zTQB(N$&-h@Yje|2b$Xxczk2f9{_(NRbHAn2j~@2xlYhD9^PBJ6q|-N?vd_fd9`p6h zLvPmUFMj-xiNAjPW1E|=*6H(JK7QgOcRjJWyjG{r+ESkQuj2-7xptvW-?!t<6UTj` zw591xoqok57fjrL@hi4G-lo&<*!8xFKfiAOE!VzLr?-w>JMrQDUbSW8u{wQF+dC(I z^OvvMGIxwlmo}}P_?WtWv$_77{Z~&s=_5kFV&>9`KXCY;yMDpM?scUt2b=Q0HTtZH zO~((~a+Q&9(flbBr+np!&8`OX3DX$W6cYYtkm|=eB9*|NA{Nv+wLk@=BIX)8t)y-g)MpdFGjCe)GJu ztH6x^x_gGLe&)I_9o%R5^T^HrwCW%FK5}rA;a|%o-(EFm^mPZPS^j1|x9V#TUv%&d z!~cJK;LcV5`v0aMTxRCyv3Va`HSR}$|N3Dwe_#LC1*>Ae4d?fZcmD32zr7-y|3^Om zm2<9}8p_AG=~tceo4*X@=T{5<*V*eI4&}?P8!K-gJ@bFPdajfHs~K0l_B*Hi?k{}h zHMjon-u1iJ{@!W7?%x*dAL8^caq7qRPjLEQ_u!rT-SOR>`P_bY{39;?_I{T?Ww-p( z{$Dx#`+@3;PO#(@VN{=fX^OAgF*=I8CJHyqgL%wPHZtp{c~^ZV}Z#DT0c z|NpW%eZZBEPmgIlu-cKIhxWA`aOLaMYj+-S8StA2T~*2v#W zA76f8cJNmRCmH!WGIZX7m2+M`_|S7&{@0y3?m*_1M-P7GYdXAnSib{*xvS}5%eQp+ zvLF0(|5dZkJy>-_hcBA`=KddVjvXxfnMuF$nf=e){Nn4S|5t~n^|@*PSqC=0e&9Dc z{K?;z?>}|hqX)Jg)!~1=YRvxon}@GzH~MD#!Z%-Aw&jY|`~E|xzx({Q*Y>9}tLGYh zb?V?DPOhXPaZw6>BlQbXshUV!=7bgvGd`|;(g$6>x2N_F@b-`%kK0nF!~AOBGD_n)?9bsgsW z{d;wI^zXfB!YBpN6~~9;Cy`pJ!Kp4f1sL58jdTzrCzw^~;dAJqLA| z`ta-2hp*@`_2GA+4|kb#>cgdw=Q2~C`taM(hb^Z5E1?flSP!+P{l9=doQ(A{-}I0A za0S*=VERveI1=lv-HfjS`tWA1$NTkouZKQ-5bO2GPjvWE=))glJ(r!S`L`4La4_^? zLt2N2Kp#E@eHc8g!@q+*{1Nowcm7O=pM*aA(Yt^D`urd1@He0j|N1vCy#C&=bogcH z!|S1sHvOv(KMsAkXUeY+y!RhEJRSOQ>9@BY*k$C2`taYe-ySt#U;Zkf5BuL6rvD4{ z;c}<^lhB7xIQ72+ec0x-pMgI7uG7Ct=tH;v_0Wgz`0j;1bjLpu`f!lLpEb~jF8{s{ zedzM{o6v_Y|6hbYbm!*>(1-5)T>yRP&M)<$JOBR-edx-^3($wI{7@gd@|cI)FnCXg zsSmGu_pc6aTA}5O`taW_dgb8zcj++o;fA@p4=#E~hp7*r{CUg4wmDiJs1LvJ<+6kK z$90(cu=W>254PWD(xDF*o%`zRfzc1thxcB$`SmuVKd29Xz4UVj78(6QeOPvS-*aXf z{X>2DTJ`y>-#7Y+`tVC@YF6(u`iuH-#Mk=e^_xAn*z!X z``$l)`K!9F!aOYdbX@H`F=b?cBRLc}{+LR_4_gwm-cujQ7j8t$AnrjI;MInYWaAKvO=}eCMD3awWsB zO&I?YXvm^1SGN4p&;H^yg!A&Y_2wC8Pg$^~>JG)8AUAbG6~8yxP`$|H%s% zFkJVswih3H_Y|{d>m0P>nY^N(&U}6U((nDC^eo0%-^v@(%zFY|0(;$>6KMx@>$9|O z=_Kp7X@&A;<;%*O?gQ+7MhR%`Tlbqe%Gy7`MFMp{5=M9Z{ZQ7$vi!v?=jf>4NeguFI%@hQJ2gn z0(qXbXwhOnM>oRI2g0LcWF2~pwBLuM*xeic8{K2D@4dU?oRv#oHpBS0M}BKfYS!#! zZ;u2XEBJI)rXT|XZXTCrzP3YrSC6_y-_k$*^;I~_=zR7){#mcD61=Hvw&P(Qzdorm zubXxLuH%R=;FdxjZT-?V<5&u>Y+r)=jKLw4+vRWz5Z@gBPb?aqj=|DB&0HG5p^ZGuPbrW>cqk8M?a10B)eVu6QnuoPdYz zxm%TOv$MH&^A)Gdm!0@~48>bLaXIXMW5@CPyx(BmGyA-r?>7Tb zT~|CKKYIG%jZ#~m@yl$_-MZX7ZhX(_*z(Tzo6cHg?XjbQ=z-W*^gZUmZT$on*p|C0 zXVXu#&;2HbO6_`Q{cazaPWbV@(F1Ne)3zbP>XZjf*;=Dxn3taua<>ij*!FDww!Ooq zJ=>2H@=nTW&(?3-n{RZd?MMEM*~{-R*zwu=ZF}veJ=>2HVv}~pXY04^y>HsH{Wu{u zNvAzqzikgm^0ECmAvP)0NPg~tZ`bJWGnOhB4(JE_eHf(OledF**QCwLbvxDu;6pBY z^$mnrpmmb1(ze-CtYgb}<>#@Y!G?LP_>{ql21EMgFI%^zsU9YYMSen0!rj1%v>p9E ze`3$+cL}zSoTox8XlL&C;X4+@iF?-CzIODx+Ka>ZcSc@#2<6&-a1v}2IKP{B2|;kv zg+G7kpZYI9^jkRg^A?0jBM!LEe(ZQ`|7^VV8Sj6(it8%A+vN}4j6Sx*u>{A${{M^V zKjZ!xG{zu(`o?GfV)^ooKPh|R<EaP~8WAgV6+9dq{ zOns$W|6|3Fr{4Mc{`ND(w$X=$^rwF@+eB}_V-frTe8<8v>qPnFzcU9Xs@g8=$?I*S zr}KLId84B&hN%Cza1}a z>V_Zr`mXqgU#|V>KVJbJ&>o)uM0z{ViVuz;|D8EF=?&-gw$amhz5O|(w~apcJ7V=V zUQQhU=MO<|zwqBhZ;K5Q_x?@{-u~JDe59;!;(fj6hnd@rbLk*B>)ng_p6igUlR9eH z4@WJrdYd|XIKozs1@c{6-ecr=SXW_vx}KiI^(3$DrS;p^l%oIaTd1eo4zd3u;Y?pX z8-$rk9eJ?*zdiw{s z%TYMpzTWf0%uao@{!jI*Wx(EfJBc3OIM|Wi zkou5+-6H7iPegj#pN#*K@CU88FIkKCY5WbLuV{SDi^=SR|A}1_)c*FyF!qwQ>uVF) zL}eqcL-gij+p4`QS8#`oy};c<{LYDXT5j$7bbYsVyY_54)A-K!Vo%5DcwN%w?Vb+P zA>H@(@%k=yLDKJGVDG2%a_aEe?Wi6P=OXjal)Qs%;I8aj=T=vL+RPct*t|i|IfpF2 z-TEUs;=sw{0N>}fp?a&22ZOdc+HIA$S5D+7cDG(v*0*)rwr#&``my>|*;<)S=4=hU z^Y@y5S>M*?_sgbt)i37Xkx4hzCF8k7T|+umUt_B}DL(mChDNPkorzZ1hf$uUIs9^) zx9=Wbclz}8b_A)$>NiJ^8OG_{Hr~${hV}l+%EGwb)3!eAchwI!UAHfMMYP=qhJogg zX2S6^Q=W|L6I_9Rv0vZZE&j4zOin?5!zxo__q;v>gQax+NA=m=k8VVt-F*l5six~Q zfOo-9{HO1rVClf|eRs#E^?hr|+M zwvPgT-a6iX^dH%$dg$DKZ;f6yP>o#20aBfUZD<7gJl?_(oN(ZSiO9rapXY^OG znc&IHzDjrlpL`%s$fvo=@t{D@7#m@&@r=MGY1O9!fP=L}L)&L6DZ`XOra+QDkt zM(vL~d!QP%Y=9aL-i$+D@@fS7#CaJov5y)ur=J>jYCkn#Odno3D*72Tv2XS0!}eY^0jGX}Hvps9CEXzOF_+*jl9?Xs%HA zH^$YyjUQL{WUo@0igGpO!Xaw*wh`*AYsRb7tH!En2v1lO6Zx31c97IF{o-N5!y%Bt z*lfKc^xriYQO4f7&FImM)i1gMsl1wb=w$qL(?|(#LXG?*eAEE-8ZJxt{ZCA zBiGlUF9~&j)79$U+{e|_i-w}iIPh$knuxY3w^PrDylxz-PW|X8;mKI6k&z1r$od#w zg7u0y7&Im1!I&wd$!`8`NWM z+ts6=s8tVvFYL#Z3!oFQCa>JKO3l4ul+e@BpRp?ksfm~qt`o`x*UwnU7j*)41sCJs z$rwAwP%}=gync#WR6kM8|JWGJ?HKi$dz#g!?`l$?zOxbj4)r|f=k92fzC3m7wct&? z+I8c0^*~Fdx^G8?y1OxcLa`RnNh^FUd_(%XUmwiyJ1Xc^JcKA4U7^8TDzn&)(Ij_QHMk-WKW83+M~`u?IYP zlKi--UOluksqRM~VtoTOXLuhqdsrW7llp7a!U<}?;2ChURR2MzsD1+`s=ob3t3G{) z?H)3%fAy@(N2oK?6Z*w(=Q#aK7Z%6;=XWClluJKjp_^cwV)q4^+J1t zdj8gWwdbbo>gk*7)Z=Z}Kt8Tf8&;f7o~o&Xq5J#wQv(MM6gO!2scO*BxoXg`)6{_2 z4ApPoWb|RY>f3+JTVof;cF)EdUYMJp=6-CHnsvnpHEGRIHDT2d_2qkV>PvUS-IG;c zy!%@9g}bxrbLi7vwEvkqu2nDG-k_ejB`x#u#3!$jw%I-%+a5G%khs{01!^GLA2?(V zcrY97PeI$`z=Kh5jX7)3?wMPMt2tMWMEfJ9{fXxdg+3XkUb??Y+>7x4^u9**;)6TY zS3cFEzI0!+`tn1cP+$1eb?S5XwW{au$cmiWwr%?Z1`LpX3?6y98a(n0aRUa=#2ieM zIq1`G#9Lz*#dcHY%)J^qJvmx+26-=to8v`u~Co<{Zgdz+;XZrh~o*ar>MyqESzouy(UO2CVG(uY2Mhwh#+drb9g zjD5z3hpW?S$EbPOS4yy+=UhHY9enC$^*Y=e&)%U9J=3mU-*da#|I}^jm4~lWFF$;} z`qPK5Q(plezWBg(1-zH`hfGm}22W7^`}bD^ht0#>FF@O;t3ku(gFY4WFcbVAv3t_^ zkxMz}Ga-WuYM_6%k5>yb6V#ct6V%F2OjCdM>ATf8UbtJm`TSk#>(AY(UfXrO+W*8& z>ea_@QeS)QX7%!}whnExee!(R*d>Z{z_AY;I!EMh(6IR;3v9nn-@&2-7k*@l%=_{i zr>Nzhm?Cm__KrnP{JF&r<^+hg^q2pZ>BBjaxK$H|M_uI_T{7Y3jT?XQ=b;n4y+6 zO;M*_HCp}ov$v^lJbknJ^B3+?Z$69mG5$lC6MxR#@bK~HsF9P-Q^UtDQ$xorR)a?^ z1n*0vZLWd7{YU4q!1(dQm(EL!Qm5CBQ_F9dqRzf$nkv0v8f0O#xchFtO8wa$wExVl z>KkyJ6Spm&?%RL78a}R6jheJZjhwhz4If{M@t-B*A21kWhYq0Zp-EO2PLP=)>8VgH>q%Y~gXzy1oSUbsuReF9`isxr zd(5%3ZR$3*FMYt+N1*+omFlua+%KKVbC?T=fD@t-67ABOe^WBvCVIKF`IY}frvI(O*q)9c2mGg9N# z`A^PK8{yX8KT90)6>Zz*89HXUZhzt`_$x&I1`M9EJLuD|)3LjK7{7eT?!`MN0uM}4 z=kJ=M&bweDw?v~Amu2`h)}UWU0}bJxrswaxZ9 z_MxMfV9bjYWv+j0^6ox;JD+pg-ZA_hw;zM9i9!Di7<>xHoX2^`XrovXWrk~}XkYsD z#hyEK_FH}XiEiySzl(LiN#}UjAKNGPi;iKY^{CCQ=i^N)3<1_o!!KfYW*0d8sWAob zXSSYyV&Bi8S?|+^_a1x7y0XQX_W&p(wiV{44*hvsg z8%w`@Zk^Ba2JLtGn-t8`w^J^LZN=Wt+xf#tP)9@ie?hz-uy!Jwe;6{b-I*q%^%*+_ z|6-$V>6x9#$r`wWsuh-%qVTxD<}@bnku*zXJN&S~VfKk>%deZN)_rQWS^(@u{IL4Y>1xG|Q`H4e%u@@m zouJMDzF%4rl{oqsa)BFnO1YXmXR{hUe7G7j zb-kJ}<6;Rbc^3~JTirc4%fBxfh)XH0@s!KmNUo8W!I{Wsi>as5` zP?vpafm#Xrhc7>@eth6*CG8)0O8xMaM}&U&tB;EBw?Aq2RyA$@$E8iSKY8w-=rH_= zv$v>~7#qibI?lrMH=_NsFm4%tc7j@pv*pI!bJfOObJe2kMB%Y*|GoWBsJCBwP}=?B zD-U`2hP27raJBFv1%^P+iUNiEoYClm_L8~<7Zr|CeQnbntIw*GX9B19vIK@ zFU(Ao@t;*U0rgH-Ywnw=7No|4FVobS;KLG(pS)Q4$!ThF<0Q2JSod74lMN5gk+KV5 z`&fJbOm#YN59P;if86v-AZJoR>NFXX>d}itJM+=EG(p?&@)BVckSIM{xen$c$HK;yksad9qq{+bP0>g^-65 zjQ`B~3BsQxusfVqF-FF|2zCgD{qc{Q06aPRbm0NV&i1u`vB(4aPae$KHd?*?;-_TH zOM#;oHcwECS|_L#w?GDPwmJJwoGl;=OK+SE9!ykAQEtVpQ`F)cCc#ZqtL~eoR^5-Y zk*9w~PcBo#$DE0^2i{}Nam;k%r!#!1^nD5Dbw0*Vz4|s}dg=9(W!;}qH(o8?F;T`# z-M19DauM>LjOX`D47Gn5EB4NLM8=gFOo0vJ9a`1L)qm#oAY zW)bX3t8SaF&b?#0$i2;H{d4b`p*B7>w@2+$_i_&+4{SZwU)nNR+J1N6ZngTZ>FO-V z*qXa%sukB^j=^)A&-!b3%~ThE{xtOy>cT_MbV#@PtWRA_9&rEdZ2XI^odn(fpy;vE zTe0>rr>EDBS7(7QOR)xQJ=S0U@GP|kI;vRvD`$-sy(s%O_h{%(>TvGWjI)mW*vi?X z)uK~i)0;k0`!hzV^`}ql(6;S^?=$b3`4iNtdDzQO8!!HHv`>s+u>#wD>xJ8Z7j}#8 zwrSkgS0FFjUOjKDS~Yj9T8zG|Et#n1j2qmoJ}~d5AeOo?LkDYyD8Txko>oBit7fgUGPEutHv^ z3`-o^TF<#h+jQs59VfC!pKY)nj*IijcFuupor8Wz8;ED$NHdN37oCE469}`6m1Fwn z(xKnv!v$we#u&#-y6_$G^y$t<{agd2IkrWpi#%ohydh2>xbPP^0Ry{karG}#VisM{cK65UP zeExQIS+AGdU?{WWNxb8tR*e?I)K+UY8ub4nRvAGj9Y{?q%^_dj!k`tA!i${hIR zUJnKO<>9$V!Umf%n`OA+V{HJbXA2<)i+Vj(?3sxGPLph{8vLDn#4Ey>0 z_9=T@b6OW^J;yk%#m?57U!T=6l)X~$pKE~a%9;Rg{QUm>Q|_o|*%o!4)eq7y^usTI z3G77eyvJ*Po9k?3pk2WK#D4Zbs^A{)`Rki1l0idlZ+_DZjda$Q-?ke*Vt%9Nu<>Kp z|GU^fVv9el{d)6#zkP+j^WoOv(y_lB_85P&EOx})BdgMXTg=Vl((Mn_j<&Hs^iTWeJI+r}=Yu@zPMH%S%WTWa z+cXBePwcb39}maEYCniEu^l^}aSV8$y$I9sL;jV(F+3kG{KVGccdW~nEFD`0O|v$P z4+8uV5|kSlJTPS78Xe!KPY`2G`a^qg45Zb2jAg3*-i1xK`p~9-m;^pd{|476+Z+6yavi60CecPkCvml=tS-rRb$z?#?}ZfB zr{fCi^W#__<7|C3rrq&h+Jf)eK~~y=fN>n}STBzKd&1#?&F99ES5+p>)7WR4^sdCz>7f6V8`Vb06g2It(i!8rDXanKfREN}B^xzagp zJ}p=IIiJt^#(ilE#-{V3e|uRU;y!ET0Amv#xN{C3yky5~^Fe36u?ViZdShO$7`F_% zlyQDOXu1yh80X|Gvt>Ch##1kM(uU;I_34q=d~TeckK5L0naqzjFT0kf%ts#Re7ZMo zoS(0&_2K3V*HK}+EbHVG{l|7K572Htjyzyq8^^MKKCdsLOT6(qabbOSE*&|Le1-Le z`ZR1ej0^jxE2&BxjLY#ht_`P}-jR=8fIKDS*Pr|atj{^@*v z|CrCMkL}t$!1ARqPRH6fT~_z7Fiy*Ep)S!qbmQ#U3iZ%`%D&~s*?d^j!Yi(GJ6<KG`oZ?*;2E?2GO-+Q{##cD!yJ<%;o)>twu6Tv%Tx{gZs| z*dRmTUm<>R<7{6TXV+0@aaIm&K3DGDI5!{L_2gOl;+6&9%D86S_3Osj`fMD_hI8cZ z@w(T{XZK_`pN$J;NayqG3-N(2jr9CJZR>O6v_1#|cYm||bK`72tOen7*ZXgNe)D^1 z$b)cSWqoYN#SC_Ag>gF8w#&6;$Kl4=`XGP#{oIbjjkEb!mTQ%I!>!N8`T4Zo$m;_s ztK)S4z|%Yyu;VC<)3Mx>xu5GjS-0%Q*}fF+-FhT$oS#qQ4b4-Vk8y6k5JwcY>*W*t z;$e_{9Qnf1Xd{nvET7#t%Rk0-GF~Sxtgn;)Nj`UMJU6xB$6)O_3YW9w-1PoF{kLKI zuwi_Tc;Uldc%K*E>xFlD;dU?F;)QFy@HQ`8?uARe@O&>k$qUE4@X@aoj`w{pe8dYM z_QLzT@Ln&x%L})A;TA7k>xH*@;c_or>V@Zf;YnUN=7o=b)f>MTKH`NBd*OXvc&``U z<%Qe5aElkN^}^e{aJd&Q^}_SL@FXuB^TJ18@y73kk9gt3UU;7u-s^>TdEs_1+~S36 zz3?_KT<(QSz3_Z5Jjn~kyztSNz43eDBVPEh7vATE_j=)7Ubx*0w|L=NFTBkQmwVw- zFFfB1Px8VsFMRYRZ~R{Ph!;NWh4*>ky94V51 zxJdfGBI$d*bYK2<6-jR|lHO7zz1B;YUvG2dZ(EV{@*?S_MbhUNNuN|CJyswsyY%7vpUL?J=Nc#LD>6412 z$BLvMHRmup|Ni*iFOq(wNc!O->HCVL?=6zPt4Ml#k@S`#>9tixa^nFFr_j>96{V4U*pa$QpX8qmV`IvG#nud|M~$-)Q2gPk28*2xjvK@dN#LZD$A6Q~XV3 z#`ABx4>j}^@NIsU-D=`L1b?%kH^DDA^ep%@4bAVHFw8nf;5pLJxOQ&7i!xjCGR!=u z;>q9LAzh88;eXW7XTUEp^wsd0#{3W9d9R_{;m$ua<9LN2Jeh9v; zXCY{gll72x^E_hWSHNFs=*Qs8C4S_80`xKy{}lXPhGw26hNi#B(DZHDJ)rfEN6i+0 zvB^XKSwlY$-`2_cKW*aqeL(zC34CUYPd!DN{u)EmXFkSLH>@>u8T@sIUJrk@p_zWZ zp*O(aXy^;zGau_=`UFFdgU>X^b6tMO(40fgE8{oex!KTL;a_3sKY@Rdp)Z7gxuF@i z#n2yy&otKa5j?Ln^i}Y!497tyOg!b+$~onw(!?j>*BF|9%Fy(;8=5}zv8~hatTS{P ze!ZbH@Tnu1hw0ZEx&eOH&^h?b$2?3w)zEX{GmY_0cYNZ+x&Z&Zt|11`2(T*>ZYX*O_zD}8|UfxO-_HV_GsIG=CPkLCy!g!&y&yZ z^iBF;>tcT#I^TapTe|JsLfY0@;G+)qi6548>3sc6?<7x~lb^Jk$I@<|z{yYA&12~| zoIIr4OuKC!UFO8Qw9U`@UE1a;LpRO8cW5_{OY2&~b<8l!+B{_* ze{6i<@QQglYfJiI8rWp|!XRl|PeEJEWAaIUhqn3MvTmJMo4l-_w9Owl{declonPj$ z?Y5z8nW>BQxO8CR+vsWv%%M0D=Wna&RW8X)>v2W}P`!pPmeP0E~GgAWYQaFy8eH;ll z6OMhH1;;THgRu`RI|+_;vMQxzEs1V0yhS3Ivnxh47ho4#B^!6nQ&v_ z*v4qM*>Lr6Jkt<6&Vj3fn+A6c+*~-OH5qy;{93piTn283p+ zxMn!EMIMrupM)dtQ*h+j;n>zqaFjXn zf-=LiM>`y4<6gKjxCh{N!Lbi(;W+n~!?EvIz;P^p0!NwI3ReTixgbx-Th1-#Bnd~J zCg3dZShvC@fC2;q_aZKzZ=kzW(_N@(WC)_f)Mz|Z{$RqNEeSHXy zWjVJj^C%o;j6A#!j%6uRE8up(wZf5C zT=+Za5kLNG`9Zlo+6QuKelKmUkz0y=e?IV`Z)xgnOH+SanrqC`;~bj%pN*g9&@&x+ zu0zjv=rbIede7EFon`4#hhFW_We&Z;p{cuUS?X0wQ+HZ=t3z*d=#M${)ec?d(6tVo zcIXC&Zgl7thrZsS+Z_59hi-T1yB+#|hknSRcRBPE4!y^rpLghW*eoW+AP@7K<@fBq z1KGg;Ahtw@L3a9Cw|Q+V|k+aLjIW-K5{ndj9;3)VY!pTKU+Ur zvvg;EXX(0!(KF&e#DRzd#W^sHS=P+KqksR7xrZQ%=d|kT>NWar9{GBxV;MIFzY=Lb z+>2Ppd5oClIFJ&@cz(1_b=%SL`q_q~OxKS1u?=n7{rFp;*#$a&WK-89o@|4kj=p9E z+tKMGzJJ4^6|cW}F8yWj5C60&|NFW+&mZ&Cohz3PdBS-iX109$CMF~lw>99FjJZSJ=9uKb8c+lcRT`qjC+q^EFsR()j2es%}ISOm;KuQ10 z_eFS6&zqe)*Y{}~CND{cF2aK$FSMk&VV~~EKV2qzMjVJZ5OJV891w(L@L;$@+mgq| zgMrz*ZSIc#=rD?TdxQtaed(L$xz6kp-NJ)*Kkf_` zO{mvmKa237=AGrAzc*Q)>Rc8NTE2CK2fzPZgPD`EHTS*Q)HNP7_%DwKHyS+Hg`JRi zuqhkBK1l2BaeYK=x{C*6uSIw;#C7Dil?N*)HqH(EacyfNJZSmj^Usa9bVvR%Ci+Ai zh&T{&pnDuRe*0kfZlvp$`h*a($9S-CKe26eZ5u@X_0~RU_v6m+pslHJk78`7bA3GM z+6T{qeXu;jgCQFodrmlKmX|u4#e}uIHNX+q=WR=zVe5Jd9Ez4n!RIL*u}74ya4}-~c3c z{k}Lbww$hc;^^FC;lY9m?E7NZHb~lFjc(Zo?S9-D9t`_rF-u3^$Ai9ousy!1XU^!6mz8E+43qQSmU+h$PEIioh{lVVgLAxJ!h6hi?`{Kh9 z9&`kyGc0H^w$5hppygYy@u0zfc|2HU@SwqoPUnQwcyQ*H#%!t~7aZ4@N_u1;EI$S+Q|$*pG|e7l%Cb`Dgj&`W^YlnCKI6AmTv8f$njj01tL3(px+@Cakeb zJh-R%Ql{lUC&E5x_v6m+V847zu8w777%pZXjQu>iKbU7@r?x@MOP$N&LCd#Z<3WS} z@_4Y`;6Z~E!@g;Xcra6+?2Uo2M|d#y^^=bWLp!$}Z6P*@?1Pps9sS5Y*pVkuOvHhR z1Apus7)1tj`TgQ!y)Rz6bZG&O>x`3q%r7;t4Z08N`^9!Y?hFrx{j`{+qwnLv4)+Hm zJQ%XE2Y9gD@U1I6*zNm+2LI*pV2ixO;0BmZ=n=oxV!;y}cK?r`8Ff4_KOz7IXdgLY5I z*C0gqzF%zjV;>L7rk<~m`jnrJzK;ie`{3aS4{Fxs`RDIVmZv(K#ex7_jwiNj5rW+;E#m^ z(>PFhUmWx|e*)bZ`mx>@hd9b9;E~Rr)nh!^8~dQ$k2}MIC*=O%FQWT{;Z%2q1v|%s zF~hg6@L;#UUu^JS9uGcZ@SwqoVc#^hZu7=eI=yg1GTA^Q;qjot9@z(Dhfh8p^v4*U zpEU2I_r)DKWMd*cXgLx25eFg;L>#ajaNZYp@&`(e{k}Lb_BC5qM}Ke_)nh!!{muN& zjQy<{)X_crpxuu@Ox7=4pQ&%mCUT8E28BJsgNMHr;lWTII0aT7==-z{+k7@p z^!?(Hhn7bnZwk}8N*D2u9uWs34n!R21_vBGI5)gmXAAZg4-T>w9q0E+ju#Kw{rF_z z!S)CbhBMm(JZSmWYdmQ1Umg#B&fr0V6P?Zpxo-0X*~AC<_v+gJXM_hsyuvB)@rsSJ z_(rD5&-Lntc{rF_z!NUv0L4y;W&I!40 z^M&=*un;Ek%2@m!n+JRN_lv(B;lWTYI0aT7tgP5LH|)nncrfIl&p*pI*YC(b#zdcp z0}%%z4s?$Lj(zYXyf1bvjy=SKWyo(GzsH<+-TM0^$URg9Z;8oEWyOsdbw#PP8VoJx76IMLl|79Q&&X4~AHVOr%^`-=}TZ zP1kZ1eZN@qp(Fp?cuRNWpRhc7L>!1X5OJVe95}gnF#LLP&_g_^?+)ts#qL15XCJit z@yWu2c+m2#*Lcw2zdRm1Z1AALiDAo{0v=4&)Z+eNu-s4TZn#Hy z@bGscJQ(3Ye?9azOi?{n9i63jSG=Qq5eFg;L>xHDzc&-UFzzuP40WG7OWnhRc0cY6 z4~Df-xAN1`_rFi#|K3b{gaC2|9;@Xz^p(0oqAW!?R=33mTtrE#b0dhXM}NXdhh7MwmR0; zF+H*my7SPHKZQK(ES+)DC*nZFfrta$;Q+U}HuLvMoVUBC=&|n)1_n=c-OkuBN${Wz z&H`bbjkErV_7>{{6s%ZDxf3wRn)7 zaMzem+px`N{_OboNqqZY?EUEeU?CsHbybUWN5JQ(|4ga<<`LmpdsuySJK+^`=P;lYrHKL0G=T)!j# z7!!RW4n!P?IM6)~96ufm-z|0BQlIe0pFdDMX!qljg$K(cJm^fiyC=DHn8o5j%eP+R zL4*JDc<|Q-4;q{pwyddjn=fsus_D(2FYej*iw}Q4!h<1};T%vdtnbq{?51luiryD% zK6K=t8*k~3{1cW(kB9>i2O}Cl7VnGOBRr^Cm*=0|lUzT{V)3BmTUU6n+wY4F{>$URe=~T{;KZWjTm;bF9V#M{wa>N~NxFBfv=5v{KFs4$DggO+c-#)Ag` z?MHvc3I2iT?W})K@_d@u1dm$NTq5 z?0$T*@L=q3qx*xQc-j5P_rn|(4_dzU8V?%$m&b!63?4K%F>F~=>o#wx%qAL=3pXVb z+jGZ-3VVbHV?T`WV1x(#_0ZceW%*cjbe68=KYB(Sh&T{&pg0E{Ja`g*kD7SWd_GV- zX!qljg$K(cJZR??eph=`n8o5j%eP+RL4*JDcyN-zg9aytEo+K+uqoZpxFMTp_S3o< zmW3jZV;2xR*x`30JQ&Ia8AchgzE9h*o33RlvJYxLbmX5KZ|RQw6P8DhhyxJ^A`Wzm z11A>`ItIrs@!+23OU+)PJA5L3Z^rJ&o#Dao9X9nSKOOy|_Xi_9s9BfipWTyOKg?qB zV7uX4ukoP4e|bDO+u%Wi6T_A@1w2@nOnh*EpQQc0laB|TwPl7|$oscPeygm_q-dFU z<=p0F21}o;-ygJXSih@&xaqo25grWZhTL)Isw3T5x)h2Y5eFg;L>%Y_2SzcE`94X< z?EE=f{%zyx>T3K}?OW%%I;dOUFV2SYYGcp{uL%S)Zj;z7%|uJB;De{aU%zdRm1!{9-K6P?Zp zNj#XzG=6aR2Y+(%@t{9OpZ5_S?8qS-)2DC0pgVXvIA53euf@|`OLje3x-*}B_2cb` zBR}Fm#DRzd#W>*F2Rr6H79K?I0=r(v(m{v@dyEImP`7n%&E3O;FE1-kiSFie!n>Of1>+?ns=6e*xx6iK05Yic$mz*v@wb;a25jAf$Ypah&a)A1!;)u z*7u9;etfd(BQ#2?GgI)6`N{KiSao~@Y11I}^aemk8DIUz* z2nuJWdw9_9$DQH9us*$S7TPYDTKw;mv`2U_WMdETpygXvc(B{=iw*wEWo52b(Gyvx&+^Kc(B@9^t|EU!HtC*su;WWIKqR@q`Nr8rNb=NK4|&YYdmQ1Umg!`HF(hA z#IR*et=qgc+0u(I7o!%DyPg?n=3wa;e2lI^SKty=3152Wa zhyxJ^{^&VSU>}V6?C9+N;I|+7(RuavzhmC#`Xvg(&YpGLc#ywAXnu!~Hp6bcFSh$} zXLwNG4QD^Oe|GK{y+8PO(fvWqJIg;8i$Vew$h@U1I6*zNm+2LI*p;KvOfG&nJA zSyRA+wM}&u$9Z*7>gbVuF!pyR9}oIt)bbqiKEi_?Ib>rZJZL!)`4I;q4n!QV9FT2p z4et+X3}oZAf9(5%fx%OSW!#WhA9X}e@nG-n51ReBGdvjDc(`}+)6p-62g@Tos9Bfi zpT!}rA7-(5(DJRF@qCr*!sYO&8b}D2Zjd^|9yl9Lww3vaMzem+px_S z%24!ul8_f#mff&VcjTWg6FnmiL>!1X&>aqhco4ZAbDl1HY&=MPbnMTFF!=+;gLXeY zS$MEL!h_+=_T>IxFYSXHE?v90^y7Vkw%_dQ|HaF77bvt_kZ|eROU{27=I)aEWJ_aE z(vVH=2ui9FjftS7I+X<&EJ-KuYzbO}ok2@osveI7LZn(rl{92h^^M7FP?OCxH3T~n zX}TprV{1b)$l?AW{pxh0Ca6!;C9hnu?5ZG_*paLXq>(hftrchFXNj`&IZKip9vNfnfpIIG8+>pu9UmRqU=|m$6u>E8@ zSr;^cuRCN?^`x<-Y`&$e%zdH?{LCh+St|?W8nag}1tWw`?M&*C2PJH+q&l0aW9`h0 zCYJ=2WGdUK;pC@N^+{yPpk|Cu%L61vW+E5VGdUONX9-4w0p^nFGzV50fT|2in(C`E z@rtJEKnRXZ2&t+vQ`bNl3F@TL96OgwCbtLGnaZYIyb9-@M13V%%Qa>i7@0`NQLqNT zwvh7qzLH+W56iiFB&5HK@k@S|nFy(isf?s=!tiCx;S^_&!z> z7@NTiL3+|CT~d{)M(1;hOi~yT#(5& z)@I^4up=2%;dki`JH}` zn;M|QbaT)lRl3IwNl=)6u$#|Td5UUaQ2IimD%k*8C8Z@14JL98kic9+s}{~2+D*p6 z)y7nPO)ij0k89z9_$|k(1vlB3T->Ze31EU`qLxLTJFs4AfTx0FRb2*JzCI_-CF&}ehI(ywkWjdi2vTw~M->(;eXLZd9BJ8Rqrzj7R%cRO zx~We3TLqQGi0!HR?bbI@*v)Hd83)~D>aNKqc0l7XGM%cHI>~#6v2jS3uvF7Bnp|z7 zD$~rQolt<%2na;gGmh$AvSGbo*04Q@q!>S5+k_2^`ZN^J#Zat3C9=DeP#Itkr~sUR z(!_p&<;4}2sgS_Zt3)iMN)chvUiFzqC&(jBA*aNdaU?m+OVp!_joAzB=8+{Q_djY!!)IO7HUI zi;m+gKoWs$v~JIj)rl*q%v2Bu8lDhWB*C#fA!>p*XetCF^lEXaJ<$L0H=;IG3q_WtmE&f$4<{5^zyR zw9pfAlBI9=Ji%{B6@kS7*l0NjwRX%+TEm@|3_ zlaPv_Ss`SEV2k+x-pnMiv>^(R15E=?8VYEx%8;y?2-Cwv= z@}Wt>*F4o4k~@P$753q{>7lI;;szLpMJZaD8>{pH+~t?U7+af2XRyyV;K)`V2b-{A z>pZ#bt-?(yP@Bo7cH#u4SC#0*95@1ov6vf+pfIBXhb^-wK^vrHF)}Z;M}3YfE74dN z=VDD&*-)z9lmHfp8_{4cXqHqx4h`sl6HAFDbhmM~!(7v#Q3@vk9MH_*p<|kWwCZ&C zm_c?Lt(P&6%j8^F2i9D<81S$Gic25xsP3DWI96bz)-+WRpDsVb?tuk3k8R!bY4R zVB^sdXJ$T^1T|PWIcZc=%)@mZ4-=dqQ{6Qx1q&i1M|~=naVn4yE zs4e5^fZh`QL98OIQ4))K9+DvQJ3aO3jsm5`X8b4c8ffK!~J#L9u zgK6s2IsgPJQ0Oo5DZ|u?ILe8DSX!W~25d<{1wvTh3NGC&4uDmO>~={kL1Y8h9ZqJX zD1eYY*a>7ewq!n97KG$yCLPKrqU}sGRm4&$hh>w`Nm}xiXcJj=Hl;O0HSwqDi=etz zHr|$2Nerr5fdDa?K@O6oQ72UhLq?mBgn@~S2c_W#sg#L9Hc^0x0!J+ga{zWk=A&K~ zLO977?rcC^LH0B#E1kVTVJhda=unZ^cgym4$TI2P!WwT`Jw zXHZ&>+SuBK5L~*9gR7TqiPkohB>>J{dG=L;?K-BQ2gF)DQA*8HB}@!f9Wezn+5kHX zbPcUTnKYLx{UrhRdY%|yPQ&>a52*5%25z}kbV~x9%25%lR(y&nOAdNLNfKL>4wpy{ z@(z~HOe3ldnp0pP_hn;TAZfN?v7xeHup>#J#Nj3|KS6U+HpJS+LG6;DdT~&V=TexL zF!NYraunt~LEKuBBxf~+4K-7*j}t5}h9!~1M&3Wrhdxc>6u}=n&(+}!Qi*fA zk#rsnaD)s{H<&KWhpwT0bTJ=G%=l@`F+30w5?S9A;3*bW+45zT!H`!&%L-%2bPBet z$6PJ{{*H!q&ETR&3HTe0v@ND<_3X94tknv~Qlj%HXwKMtfkO1XISZ0MS@MNvp`fq*Ey#>%vhlLlda@;06}@VsZuk65}tX zAw`>2bbLMxDO#e@4*N+9O&v^yt?+Pq6+fMUF|?$PUK4~x2+Dd%9U8!iw2l@G_{OUf zzLwM_VbO)<&xE7^Rw~dlQL~IbUePFl9der0ru%B4X#z_GX?YU=vnu$~4tP|`*C z(nqj__zwzG1O`G;8&twz#q9zwA*xb4j0b&*%?^8(02Y}D<|(Pew1{yJ7AmYMvIYI- z>f&aWgLRMZ3!3ViX@K8>Lmf_ZIL<8#l49ozDuIHrDOQ*jO{)>sLP=FKJ8vQ@Got6@ z$zE$2*%6@L9c-{VNCmkomn?@VE=S`ti$V+=V7Y;LC755rKyJbO1wjc^1dw9Dt^!%X zP%raH4q!>5d&nQqx4weWGt;y!}jx@$nlcW!6p{ErYDZbH=X=D!J zDryy4kK39?I6jQ3680pb!xFtiVU49=7$S!al!o?ffK^z`f=xTbRvX$pY(yird=#+K ztEX`*0fFw=#d$e!N9q(_Y~ z@1X~>q6GP}${cmRv1Hz9YAdQlEobZnoqTq2SV&5pIIg&y^BB7t=pYcJCxUXsIHp$5KwAh#{84SI4;3mO{5 zM-E!cME!}`tOmO-;J(;VoQQ;2RKf_z2D=kRRO02Bz>yN{k5B;E0CRY65|m(BwqU*E znMrFy2US2^#~FoycMY_FNCNae_L)F*dmQr)g_zPlLPzmr& zNzv+u?`zGAFzHZGm1zQqHl_;ph4~;g!bxkvIy`{4?tS@d2n0;wnYjxW=8lErF)lK!4qNBz1 z3qHiFQ}yybwvKOwA#IRKYIeO_3Pn|_<0$leDVvfLyH-o_d>FRaO1!Z%?`65z8?oL3 zs_2~j>1a}@Q6f@&-H1gF!!^JcB^mF-np(DMQoq^_mBRL9vS9mZXh1`*&$8ZTt> zn=!+2D9ubIPcwoz@y0*i44W_B@8BRKC=u@{8+9;LmXfNEV3oC*25Skf&LrxfzaVDR zm=*Y?cD?10A}W;bI7V*fm#r{w{g)hk`3K|#yN?FOI5J`gJUUVzVgVWgZ=%_t9Jq~= z)USVS0B`54DPKc-?DyDVsQdUjq&flh5I0bzq>?+d>~u7^IEyr!gt<=apIoxMgn%)^ zqM86-B;@Zl5{Y#k7Z8E#6fn^MZ?T{Q2Xsi@`2iQ`npnv0{x*NyqJun>fMVmR#qK5- zPl(EPIuft2G0q_432)SK+N;nc58fnr9A@p6i-{K?_bpriW*WkvW*|38lMe7;)*Cd5 zSokrX7ERz?bo~z4lS|~Kra2&zlUjaidBuV+fS_k92nlNA8qxAt;%u2f0<>6LyKa3A zY@)`-i)B?&1q3Z#yh6@?Mm1rkc!;5PqCPW0X-v1GQ3}Khhjabv8=y0p#ycAkMHX~| zQcw;NP>I~e<2YQ=+acRyGAp1|!@PJ7MyLuo{%0%ofyX3NLFY&U2uY9)MJAyE%Rx^E z)F$4s!c4>!--IPbzZw@7G({^WPOMtJni4S5z}A3?z%fhHL?b~`5ELUcDJVckYS=-h zVlWT8nHHDaA*!P+U_78Obt4c2)9Y@fWf8!x>*jb0Aesazyi@6 zR5b-vI|3Y!AYZW3P!ma=G-;HIfdsfkE?*Eq3lB0Cwd6FU6LXJSBRGb0ed=pc@E0?% zgpZ|saC^daBwjcJfT0;hmMD(5T&b;?VBS|V0l6nr0ipa4v+p%hJTPUTd>lpkJ6!{_tiF%EKIZxGmv6Q5JV{s8eV&!o@9^uq(x4RApY9 zapxp>6QH9Bdx)sQ4lgm*W`*!t$iBomG)Z3gfhomOnTimvNS8zKO2ZZnA_mPsOnBIp zuE}Xv;4rvEa3QqtPbj>~=Xtq4t=~LCYe^XXj#N%an9Mc7m+F@Sf?s0H4^>SKU@o6{ z^#BjkN{?G1v^x#6G`-f~%>s~H3WjR0g*#u36s88QO_ zNK~eioB4hUz#wkU2iM^C11++^VcZZ6$vT-L7Re=KFnD65gcNrm-Z7D>tbqMd-)$eH4Sv!L4wAUVheOU5d%1|G2S6r`xUj@| z6|riApkJk&%U zl#av@>NKTaKj?Ia#_fzs{n8`>amzM{nv`5QU=8%l(6|I>NqJw+dq&)BaHo(I`l|;C z1beNfG#@y8z-EjP7hU4i2;_{uhES4)PJlIyS6OhHvAe3?XRllg^^W&!71*B5^(0)6 zrHu1jMN6W-D}s<5wjnWypozO+ zUEb2jm$p!Dn!tO{CZHHx$ub9PEMA93xqLj1GIlg7n z#am6PLvIP`E7orewr|)3cR{fIV$hp52ivb$k1*&mIqX9nF;*nR9R2R@W zO?40m?&VIunsIZC>K{{u_t2zpHJW$Jsp51*T@H70aFrS_u4~A0*u;4MM0O9J2db{P zAPzl}6HZecz|^W#LJM+syMa1D5vfYP?B)hglS$ypo-{{NXT^eHfGbOUEFAF(05xo| zt!;srGf7&kZrZuCRbDOP27|5>^G>}h_r2M>EfO8SNb>XLq`pRlvG5KJp4wQW*;K-p zBVx}GKJZOR4i*joKV3Pv3c1G}Cp=^olE6}hkmM>VHRed*or_o(Feb4%b5NQ9%-s%q zr?w7VxFG=A<~oPnjO>8?rZdnQ09r8HRN@^B--YPfQ}qqFphQiOk)#;FQlA$Y=CP@FE4E5OfIRegC@XXGXY)C7p(C_)ed68s*I>0!B^%m z-_p8M)*SAyVlQL}#k2*irYQx>1`iXLP}c(ZU!qM&uk*R!8vgbqR<045t zkN=b`c8?c|x5xp5)cMd_Jlg9RQjC%DT&Ay!)ljF9|C^IA3CX^8MKayO{SAJr@pr)5LH-2d!X#Nz7JY+z4t=uH9PGmRoBB-R| zbx^Jr!i)v6 zCMQL^CX+FGoYS?L$O6}K1fJo*mj(X8H5EK6cx5%qM-3miqGE3lf#910SaYC_xvix$ za(~e7JOULUM(Z*yrd`}Gk_IxBRCw4IHiH8VS_7S54=4)^km3SEU$`!7pqaQ0F$>Qx zAQ8`ykN}#}X9$w`X5Yt!G`u;2aA|`$CJZ#*AmE9Y{CEmpAYm~AX(>zsOIPo%u%{vn z!)!H{2t8yMkKbg#nFcURdmMWrW3JyNaP1ZrjYLL}aUvsk+7L>y5bDN3Gm*i{b?&9* z!=i)*Auy_eCo^-cAq-bya&Qpgriw^{90q|B4uHGMvk2--GF5T zGk;};iK(p65!IEIvKHZ&ZIXSJ*|`w8Fo%f zjZg-1)xgLrODc<97DrGiN*YH+3o60&S{!4jFd3G7wpn={r`JM85Uwo0 z1~4IOZ8cnd-1=l&Pm3)fPTMkGZa^^QVr3Y{Ru|tXCn!=dR;77)1T=vK^mR_3&`HEw zus(&**ZxA=F5xHCV>-D$Q(v9pE>K;aY7ykZTlG>EdKDV!67`9ibZbMcJ{|%ZKvJ=7 zm|&eKLgWTQqVZC`JY^9xbZpj47H(i9dBc-EH8j4Mfq63lTulZ7Gy$B0@m+vx8kXq% zB=nRM1sRe!Gnom$zQWFjUxTqDfU#G9FNUvG^=jr@Bwjkjg;7EDPMEhB;q$YRw>Si_T&4x1;T0N?O)1K>Ra6M?gF6D%aq${7rcprmSBFT2Y8OiCGgU>6~<;>hmtE@+(?X-l;?c%rH(w59fEqk1#h;4Rz6H+{4zxn zc9uU5n6uz}<)bdD*-(jJTFC3sL* z(UKS}AKcC41p%D{iii3^2e=!DA?|e?iIn4xAO!f1L5e}#Ccu1}sx;q~g{r|}T%K4A zV%adECQ9X%D_7v;TwOz>489SIBY1^F=aSd*GT{zmB|?aZI}8~eRJEMnIm3Ay!>Bg5 z3-cj@ABb|8Y$Bv8OkS7~*FQ7Oc90m~*?pfl#i=#Ty+y_8?z3m zZ_E{8G`$p93AaALZ2B^jBmfv`nB_Y>+^(~Eus^^U!ANKrxjTl}YR1Z+Nzaha6T_GQGpwu#>sGcWoC zL-6anmT_?yhHxI#bHUw>W~(anT=QFEh`;0>stgW2kb&_FaWXKh5gt|Yw-HDfGc0si zJ-)@SHLSX?_4$nW-iu9=|@!dKu%q(siW^vIlk+8DIxim^sa^TyP z^6grE=K-1qN09%YvGV||vnv1pxi>etVU>;AKapT4Xbut7+Kt;r@fZ|^KKi}s$=e_SuTYmqh-}|2Ro_(J4oaa2} zyiJlb!6;ha=-JS3XQ9^(qjtdAHQErlYg<2hDDfTM&@e>^Ontci);!la?C!C(hJ~{o zEcFvudO25SaC)B35|433x@j4N#@f1qHq(Ym7mO%#3tZ!Brb2iMiS&_S`zA2XkS|$u z7CLWXmNh*&ggQ`hj!tI8Guy9Ja>y~52ja;obqR|@s~G9I`l+_z9yYMyuaV0{n&)H3 zCoT#2*i_Tvmpl*dkLgRx`+IStBW@zpSs-5hP$*+aqBL2KKgPvdvf< zCuY)FY@JJ>_N|Bbu9`O*aall#_I;w%j(ZZ~HJCgzskW)pO1*${8!EAPG-m;0-B1|z zh12pTt|Jr6XHskS)gdwJvgv&dN{Jy*C-)Xg^6qusETX-kVSUcxg__10N^J?b=w)<( z#g;U?IF=I!7i#y)rpuT*&^L$0QlsD9nQPFs&WDW$89qnkKV1zw|bQ z*QhCH>#0~GiTkDqog{kGSXb$-Jn)-HcVepAeo!-VzHitMboXySw=Pzi@?^U6%vV+e z%=<3ZkDqMP^Qq|D?IWqvW)*k8tY zsvFueyUIJQK0L74dWdH%MYI{OMf-RVuR_}w_B#r!)~trn>_$R~T-_@Y840CBKg@Jv z5D|3siPfmKMvBD}#$L+BE*%^Wv`3GujMW*=oVB-{;y`X75=~;-2J?tDhgaOhVL3g@ zOf&)8x={^&cp&Mkm`PhPk$lO6F=aER`8mTOXK$dYPHPqqtljXeFZ;a4(k}04QjIDX zaYDA?mV0%jb1k;CWc+ey#aD=0a%c#!oru70wFZkdiVrDobFGb{hNW0vl)!LNapGXi zOcfzQ#c5=a;}KYOoem^F9=o+sOb-zYl`ZoGs zKHZFQq{p*3u#G0FTx^l;vGc?VEs=}YCk8vV!4om3j?zPHw2I8`%5hyNS01QL>XB2? z{Ce>yiyYtRq^lv{9zpZRrd4l8O*`h)?ke80yHC!cfx|dbURLASg1muWLP;ysHc!be ze5%qLS)Ww3N7gf=xDykK&-EMi5?p<|U%f(J7RR3vwhCaMCC)vEKD-Z5p&@&|$lF=267H72ma^ofS7!Iq9R(P82IS>ckcU zx8uMS3{!nW+HTW5O$~?=npl8zcl7$qqsn1SLdzM-s*udY-VWC|!M&s%hf3drPwpQY zt8SqoD03%7TyTxY>114s&afTad9Zqiq&*&X)QdfZ534{W@1!r zQ%Kn=etM5p3A|I+Al#nh3^A&~&KPxkJ+rG=C~GRHjKa^W~&gV?>*y2HSC z0@*vTjTlw+NFSAtl8Lw?mzFgQOKU%=Mye)@qN(+}M!p@0KSy zLkGn*#%PMj&6z3cjKO*$xM!;q&e_+@Hhiq-`ua!7N5PPc-fK-$qLW_DNVj4|vvO#! zX$aZ6!^V>CE|Pw>MjjL*R&$iQb@n1>ii1{0R=zPH8dS(Oq_CI8Tk-P|Ex{m?dDUD8 z`g?Ra)9%;W7hNuGuCgD^m2PnO=A&gX!$5}!{1ljsR;MGLaoUn;i;6Qx{mkHk3@!Y$ zzO%7ClyhL0fEx=ke_3OgO_F<Iv|&ORfvdYEUC4Ly^8C3`WrWKkQ9rHC^(Ri zTG9or`%Pp`_tB!fV$WR$78gL7pKngUJL)p8%+=RAFmVV`-OFTiSq;PCk7(DEszU)w z6cU0f`lv_$fOTH1_GCyH17VN$(SAq`Lx!6`^t2E%NK@Y#Sg61T&czOF3}`r;#h+}M zv5yvI0o?G{X_~}((#iqJ5gb36SvOspf&J{j+OIB`!eZoxrIsh5!dTCT-P8h%;+ot^ zKRLU1PADk)oBFX@mMGJDN&|X_IwQhM7CW65Lakr5mH25kNzuf1Zpp4NbQg{z22Lxe zmuUjE(B6RVFEi9bF>&Y~5-vrC-ah!p+0u{GR5CIs21)8>Ojz0&k484@3BFeS%`_~K zP1=n?FsPbR(x7r8!zh({!~px%XpM7G0u;yB$x&C&db8)Oi;if_&~%A8OcCD~(Ke9N zTQ(}JC&MxM6n!G9ZOAGR5ueCGF#Mz#PcM zjrGI6Zct1isc$vL*29=}SKBx=^`X!JDUeDSIW&W~Eva^Rq1+?0D1~T26wYv@h4kh& z%yFlVnaDE2ya+j#lssp5mWBD!ZwQT2Z4G7Gzu-JW7(c>SW5)xpq6% zj8fI=Q8*!8T7-@ngCh=V=nZ^rvb#7$yy55?j(fR~zP)>hBkH0ut_~K*gUkM?zlI@K zhBgE1Ux_bq;<7Vt0&pWoHen>;%us4$dY88=c6LjFPJ`SfX5J57-@)#AbqCh{o?j`f z(NWPFL=??oDbYFz(}*}^tNh$L!j`NSl^qih)nON&MoLj9>RP3{3F6bHHWex@)^JzfCbHa70oDuE4pF`l zC1s+Dxw`LMy^=cN4%f6x$S6k43c()GZaO=l7>4cA2wBzF+O4zobD##^uhWh`*&d$l zE%^=;yT#@dSs63iT7;&A`?Ki?rjGL)t2;VbpE7U|`sB?X(3uy+bqa;x4j}+6jfZxt z_hRo@x-vwf7`JiJLNr((HS-4U?ox*}3r(cVcpx+Sxy8s2h_>3P#>@aWXd5LAPP>do z6hWSPCO_*#2xrxmbP=uFHM3h?AbsSPHjfwXzTe`pRLquQaToe~C2cI#zIHpX%@H2j z?I{epp7dqCu1=|^sb9LYo2|F9GVRvgPzqtU;^rOf6*+|U)H7qzcB9;4auRbk!sr2r zYtX%2ewBjuY6I1RK>RX;-FOWBQrse?ZsLHzYF#r~are7!vS971fA>`;Mpy@%pKjJL zgVQcIGYWeVi4MC>2Muzs4{B9HfFCg|PB>arYn`Zf0ZNvCNv6EV+t>89~m&duGTLMOO}R%RD~D%0l(39oR_8 zyJaeFUSjd&dbi?iMNH1R&!~M=+?E2FZC$d7GnGP4&W|=26Iw3W8^+P#U{jR*;+4~wxGj6t@mna}j+9Fyz1f~i zhqI_rX;J~PA#TYzQ0L-Ks_H(usmJwrndwI4}vyU!cyp^RN$_70%pPHu>4o!Bj39~dQYqs=33lms;fuxfT!yHLoDCU144 z4N5l}Paw9L#z(iPQtpadWI>6(;-+qkJif|JlNKVHYDXjEV*)xuUmXrUR@;l!j=s*8 z+nPaWer7PKuv}S=$e%=4To&(Ci7GY?)`|_` zQO>4yLC%`wyNL?hQlV34HmxSjYNAi2;`1PzSKQHzwGVNS))LUyd{@n^3X@rKC61C3 zW6=~Q*;!1peip0bX-ljitzCCc6XTfBN_iWR_)F5;--hQXCt;P;cDyT-ytepkA)-jI zaJvs;Az37Iwo35f$|jyTVOx&NdzizG?1cIBDxN*pGt4?5Rxe|?Sgf>jVOR%m_3HJ^ zZbw}+7jYI@=d>`Hi>fz;OWjr>WX}89HdP83_pIUyg`KC^NIs27gpoPewHN|!ak zgmw=o6JyOZZzZF!@<<~o9%NkKv3k{3#-t==gD0v}+UfUb)@_#BZ#O}um^8@^t+>qJ zc`KdIrN>Ajy?AiM5(c{_Fhcjt;=4UADAs3q-0nNRSs+yxCo1CmLmRoBTIYIV@wBm% z+4`rQQ1LR#Z7e&piA(Kl3`r!;dUY!o)68N|l&u6isbM=oqN^%|wCo`%oN!1*M{~Cm ztwAIcsBEbf(>Z$*rgt5krPTbP(HYc36bKl;lv%ttf z+1Iq%=INu^Y7?73=}a^hv!R9|YeaE_RQX*X8Guz-3iNjjb_JWjqwDl^0~( z_(|Ixk@7;^Ky}9+2n-s;2#^OmB?zVl(e4azT9yf(@mm8f=9m1LCWsry>I?{wd--+; zVhdd~EpE?Vv^6c1OSkX4&J~oVT{pDRK(VxD)hBd(ib;AUHmscmHsN2+o;VXE>6$nb zpG=eLC~X&V*5MJ943cqu2U&8#7|T%8e#~x;NM~L|Yo;B?DJmnqaBkL*+Lf&}{kpp* z=t4HKXfu;^huwh_mAb!StTR2No4e#W!mYQgc?Wx8R`hY7q$%jbU2T|(+`HNYVNN`0 zcce->%?sPz*^%jc<<)J{h8EQMo-?s_ro22*g9dTCouRf&{J{wgJ1 zIqAueq>uF_r*@S2P2ng8am6WLG-Y8l#>4P>`XX!>7rtnfY%8HI)NQ!)N|%RA0*q$q zXeSS!cG+m9rc_64-cd6)nd@tG>nIE#7URCx1}=PUh{Z(eTiFF*Lq-w@QAlMxvmof- zAbk#G*|Z{ZZGJa0O(2QJHLT_SYSQzPD@nFwg6#ye4a`zWeVVOENxM5xS@C>|cj0q) zSsErIgJ)6VzV`9{VD53AGBeX2x5!F*DXD|x|2dn-ovy-f@6_GnULaq|c^;!#xpN0y zt>|j|i4BiAX;?Rd>NdvK)W_0b7$oR6BrA4GZWkqzVhqT^1xu^sa zFt?b%cd3%~F7&aERh)`^nHFR6^%o!7a8aHIY9VLp+23G(9uPGzL0 zm&q;WjoFi(Gj^Y3h(+BhtaOPiBi@I+oXnib-HIiiO0y}gRbj8RBM~_*8FL=Gp@c@% zkv%t}`C^;x8Z8Jx?bef(RB-=lUFEihS;d$Z1kns6cb3+H-ASW6rlQ2ajFAEC9ArOZ z4c`UOM{>BxnxlLA;Y5~QqGAW0jBGM$^vt-j5%z8@VfAb45F9ZxhY{Z?N>l=}5@Ko;rZXq+;SVBdE?WLR$3sKiUIHD*K%bQJZ>L*rqFHG|9xiPB2E0f2xiS zVoEvjD=9ku!9KoyH_6SYC0-20;1`;~?+mHbIsLO`R*J_h+}XlTF(bNl>? zbs5X6)t3rswpd_OxbvyWje`sy&AAP1sVOntZN`ol3lvoY^qqSPv_w~q++PbI;?`y> z1C1H_VhuQbYL72onxcpJck@adxii=-N4P+(5=3*XHal&gwcE9?=452u1E&sP?oks= z^TTp|Btlnx>3ToL_>k|Zu54j+hn2HU5p`vweUhTPiBTB3&x%KfI~NYlW_As261{Ag zPjEABl*z1Sf{T-bO_?13ve{5Nk?L6S03`S9(4Z~M89t=i>|z)ZN_24gyPM_fY7$Px zxhP%}#JR^#qc&x7F4Q`yjcpSXh_7&om-aj3(2M#2IwWNz%j}v5Tn|T0;2-Yt`!Sgz ztGmA2Tw|FFLwwN-=VkY%*{Map7Dq!B4p7S%)}|`FpF6cn7`zU0w<LzojSKIX5}8u z4oc15I6o}2A+q|u24m5c8Bpgj#r7;VvXPl-emf#>KP>0$P{YDBEsqRpLo~Az)2Pqa z)JnxdqNs^=r>~t6y=fX|uj$4hXL+=p=tGrVmL#pvKx@HFdiXS_$Eb8Fh5RITpj_w0$RQkLtPmUyoiw5HtBa|*<$BxHZ9;~~d55js< zSSfK}yx)?1oa@(Htl^5K_4H{5k*Tb+p7Io;fg0dwhBjkanxaK0+GZy>ds>-SJj3)I z?wTU{`0Wy`u$wfGXt36<1|FkkqG->7gmR7Q{**rqA@Wfm#ipkS8d zF;uMB_{xbZb6^1r9kmTLRlV&h;9#Ga8y@JULzzOJR5nD9XK-bcK1s!~KJM6|=MThN zb~b825KZ2Ste4xZ#Ab_alP;>00UKIU1mP7kLoj6~HdGkXRXQ<39VX2?RS1Vz7v^A& zp6S{(s515#E3U}|2j{WlmYH;vCN>K#3VncPh(xIF>~o0lcOqd(#d_PPWv1y2(Lt`U zbk~ZR(K4up&iXmp{ISofpDqzK($ah&jV9f4#l)J~V^WpqNiy9=-axna!Kl4ddaiYp zR3%K69B)oF%UT6R5uIiAvjt0x%(ITN6BL6seC%AECgp6kWePc!rLwFhFK9P~TsLl% zYcFR5oKLpzW;6Mxk6Je*lFd}l#6aaU2sDwhROU4wza~xAoUNucVrdMDDTaxAm9q|= z>S;T$&=1VABC_NrO%Eb-3MR8cxzfLE7TX5jr`qHXZAJ5q7Jm6i3o4|F$P9MERWER^ znqR)wCyDO-ffdPcwi_0WjzlL+XCuF0_MZ>$q$e)0TD@8Wz09nQE67w<7EP|r_D-cviVNZfr=9s zczR$cnmqi0G+4GyeV=Nij~T=7QxoCQVSeLEG+9QI#n7Ij;v0P)XFKn^7cscOau9=S zhI6A+cv6Zo1DR|BRO;=L5>-OzZh?v|=2uBt*qCG1N1=a}1?$jl$<9REoMDbGt1@G! zsyIg2Jyr8_gIBusJYq2oyW#j`wFA2-zTckh(!6w&wQ}eg^*aUV{<#ikDgu@MXV%nB z&64`54I=21`m&q-G!P4sl`C0k+K}j91@$o<&i+-jcqIJ&+#xs+&3svkLPfn`H@jA_ z$uTsIdY_ZYl)vdYaLv|>;@lE7;FS@5+q%Ci=RlRB-{wnTb~emLMfr7oC=#x+^#M=Q zR~9Ql`$&-P`6kKZ89Y;s4*nW?%x#&7yXu)H*x|Ptnz0g zpy-l?VJQ`yeC~XQ5z&P9xlDChGZ~$N;V9L4&E8@tT!>&D0b&FNo^J~;X~l~bF^w*r zYe$qQ@;n1!8(ILaV#lCxLl1i}`oxAB*Qf?<67Qg(rJ_k+JkZYET5c?Ig5)m~Vvz|~ z@Ru?f4^#&^R!fF$Mnp728LW3w8MblfU6s`X>m}x3p4l{DrIL%!+AOW1J+Xtp1*b2F z(7+@Xl_8BDiF@6!$yO{a+9={%wfabae(m6MG|?Pxayhc`kkmitz{IY|G+k3IIrSko zG77ObxwiFgNWZzGw$8<|X5^HJ>-O8xa<06K3=UgoE06}RJ6k{JaF6>6a5gwc2`rGz zTEab2%FHZ%)^;>+Vt(Xa^F;Se|J6SPt}N*8Jh(5u$sI?Wn|;LDhYbBl9-lOHw-i?L zcSVrGC%eCsw^=LY!qOXzPE@^}xy1LY?8K1SNp_aFzfI(q9~yw6Wgom~lYB~BFepS? zXV$_n$)$Z-HFrNprce095oBt+0|+#=qfp^2-K-S}n-h#&Bl|Ll`{AJj2^A*PPuRgC zMyGt-3h9TZbbE_F?--@c>k+XqS{6ITGnF}>J6 z+2jREi+7`zG`AEFTpDWop>P-|p%3yYP915oFD%$HL=zbsX+AHw*-~amM@JgNef`sj zmbk4H_>8i#HK>T$#bxYY>7b4A{P9a8te>>7Ro121&fvt~0&vHoqx)P?I6IEM&25F13|zsiC8Vs<&XGd9i!E-{CTmyUDA6cC z;te3@QEHQ&Zc!iA8H4C8c|(IL#VTWpF4i~ISzTT{#ShV%RMzdNS;K@$&&%!J5Lp1e zcBcccYxx=O=4Vtte%ZIm?Wv1!%SfslqUq$S#fiZKHsv@=PK zI!-rLOwDDA8<7diJQ$Lh88XW3Xr~WVnTU&}w>-pD!-b%*?!$d{4Yt&yymQ+vOh$Ym zC%z=0tGdCaQ@cdmkC?D9^HV0B+}Y6Qno2|y5lNcerlG$fKT}&p<#C3PP#>DKh=8g^O)B~P3Zmy;K@Z_SdlkCRI*d)zmNZf@q zGJ{Vg!Zq1~nVa=>4v}6VcCTYK5_N7t<1-nsLrB}hhG}8L^ssSS*vLwbFQj6(hud(M z4L=HyEzLStS+Dh@XA*984bqp}?dT;{tDD)IN`6leGvy zAU{EJDbaYi6NsxWqteV_cdN_bG(`8lF)L7MCRKtGsvt-bsc^*C*lh+u+9SI}KYF4c zU{5~XnERHEwF&c`i|zCYYR$-O|L|RGgsKn%mb^-uC1m_8w%9FJ0v)S4-p&UfO&;#e zshs;8RtPuh5+x=Pk#+=ste;~cOeizV2#4`6YLcvJ zBfzwj*)^v-rR~eSQ{}6ACdiK$xk;w)_q%oX>$FEjMzfO7Dd`^AOlXrF(%0kcWn3KZlYeB;!#M^#ckEzYxqVSd$v_K3|6`Mb!?%N+h0vNMH7Ti!O2NG zFtLrTDbPftBYEZ7_fjMq;LvC~wJw51Lt{Hw{45Q!G`p9WKnoGzhgSW_FB{ z_@-Uks4-SgO?wu0ERaK@*5sz!K_~MID7>dw6K2$fJs_3{bZKcwMKuHq=M+J?@hj7G z&4T7dG(u&9=a7)uuN`8!$-rh~$aV+P=?m>INm%B6#zKf7NJJ2|A6(r(sb%N}u{4x9 z*KhS}398@d_AF6iP0LXYTc4WXLv88CFTWy^iP^3tM|5Ggi|Hf?$3?3hX&$!F83w$Z z?ntraj*m(&dWGnTkc!-;f~B}EhnXW~(;Z-RiWsFGVG`+MjbjyI4mL&S>{deak%Cps zXUw3V%s{h4-}#DeiE!|VJ0h0CL%dIq8;iMnB)MrHO)cuZ%@V10qE*T7fHJ^%*#31{Yl##lL8?vhUoSmjm~ z+Gd|j?qN2*WNerFdoN)G_@M~`ktgS|BI~l&mri0!y<10jB_|;$3P02#%O4TVW5}C! zDC8=_=muPzM<3EvK5(>gd1SYpP;6Cz)~4cW))}i{ix(1J&wdq3i1HVAn-a&ch zKC~Ug#A6(xWDrb_(pnfY1@rZac%^-W7=gU4Uu-Esr&M>guY*c@#@-+&?<6&mXraB^ zwb|hR`dGZ_TL!Ey`V;dHgAZBv4?DE4N?&@g+a0yVqi^?Z)P?==dM^4P!Z7V7XH&6z zrH~(NlJBon4e2+4-cOoO97eq-KY30mzONUiW%3|l};6^q}#J1`pDwlM!@>B76 z*k^@&Bfze(u^Ep_x9-W>fu*t?C3cM=6hk-}?{^tk3z~4z-l2Zwh1kZVsxc6KiRJ8QI_+Y(&klxx=F3b@WT|u=4jf45iplV|XCS#Sm6`#pm z?@1d>fjT)`Zi(o{I4rGmc&^;YJp$GnDmEXN5`?msTGMkq8XBx2-I6&= zciUUoJj_Zd_%e;rVlB@3*0Gymgw5gu$1+40fRsuDREum^nA2`Y+|`MnOpZ41d-e%( zrlC>x6QnMH(LBtcOJGcYBA3^goPBVZz*gUO&$llTshZJsE>J(;*+#27_S2D@^rBm= z>x^fl>#)Q&TMe_!(AVdj3PZv~p>4;VQKMT$qJv#zQ0-(F-l#2@qiiFqE6j!k4YSwj zGbMg+JL0?8#F~2BWj2HRyAcV$P0Z-UpzYTS9pIXApDF0ZzGa|&Kc_Ih09V(r{eh_6 zBRenaJ~oAfFxtYTT^A3ejobK*RVHSeITPJW)=Z`W(UoR9-(-j%(^CxgNj2rpzm{y{ zCK)wsVn5cdibAa$)a9|d2HX3&5rNj8wXS9aD{PylREZZ<<@7xtUxdfYPOZA48Qumh zZ);L|yJ|PH*{7T(<{Hw4$68NG)S*=x0xVmsNw*H|MlDOF}*J61)>WKf~|q8wAHmJR>eBuG+Rtb9J1Io z`a3u9uw3%tQL#w|Yb=^g*ER%QiG@qH%_*SE=v#u4q`QU-Ng@05&pU9+g9(AAGd4y$ z*S;;xsSIuG>X-4$(W73A&UPb3=b}|!vQ{E@WmBn0DdP}&eTmfd)RF?BZg58*EOyUi zF>bXX`mqE`Z>2AZ*rnl;JzEzeUT-&T9l-9Y2@!FN&rp4!7ppNzTf3kEi!$e3L2Q~)e>F_y(9HUkcKJAN=4m-X!~-Km z#WP}3lO_Fp1cO5+j@O{E`6hFL6iGJD>73PwggHrr(#1wKOPa2s`&_gDpVELlT|Gtx z^eZ>iNN&;v9yF=G@Zv_B=Il6ubg(h3TGOv@oT@$;f&3Hl*+}Q5w`^J{~c^1|K^m%uP zYdWu?Xkl*wJ97nO)p!?JLK_%vEHSwicKzAvU`os&eNdhIJ*HR+Q1|H*rCQ;p;b;q=qVvH!aD56){{b3lXhW zxVMyD1YKGem*u>`S1`r+FkrM|GKW}dEuEa?am9hrMVdjAB;5)c3U90qK+E`TzR}gD zZ{H22$b7|HLT*L_M)aNX_oy;pP*SiSXeJ9oW0QhWGdD_XBAq|uUFlYpi_XrSehdl- zsvD!9+VgcP<@G5&bnJdYSAt#<3sj4!SU64@trSdMEWQ~kDIt?>xP;zvq<36EhjTF!t%^&~fDMt~nm70H&4c0TFl%(5&XOpywrYzrSFhfcs5#K_Uqj7I1M=j5C`y->Yma-ZCHPu9?{u8}|FnZ4+LJ*~gmWt7aD)=`m$i zMOCp7msz$IndBX-B3EN&qA`cX;~THbC^n&}TdXrdE}$)G6|!FY;cW4wr|&Gf8+}a* z-qC4jswU*2Y5MJUOU4Y^%e*@lBC(DwPZI1h-Z7}MoQ15rUPf9#B_*h;)RW_wTqNghj z+(0}Mr=?Nqi}0#&o1P;{9kDo55iQ<(U2U$ym@w-^{z+_*4GKxUOm)s}a+e~V+n_Qo z*Flz;+$5%?(_7M!sZHBcQBX!$>8rtIx!$-8xanb?Fdp#ZLEFX;W3jY%9xrXs8N*jy zC0r^nJgj>Dxcushj_DN_Fo=Lz)yU7hb{% zD4R~S!WwID*etd~mo448Iiu@*gQp>Tg%$D7DcK!mp7FQ>L9T|zUe$|LPEmH}5yQLd zMkC3eFo>PZSo0`Q^bP1}F%_94=`)K*V@3%Oyt76h2~=%kKhHErQewJ}c@-_@KeQh! z%eS0;x-D@UhG19YoSv~O*nOU`AQ_tjp&Kz4J)835K6+;NjcN$4h@R#ZUkSS%#aEWg zl6{&Xig3V8 znzQLYu>EAcklfNat!VTiYAdt4k%f3aiXoaetQSX;?#@18jcRY%MC|RO>(Mh@pH!u6 zX%^=L>VT_1Y`7TVM>=8m+D4(id59%r8&i8CEL8pJdoFQV=x)A5^jMhbS;iO{ZQyeW zJ~(y%05n$h&Js&~Myqj-F6pjo8zy#_vwx(`7V1$voYP=$h+i0Q_b+s0);QKPd)yM@ z{!|<7sKe>vGL(j;Ue5sKW~@=07b#UH=7wX-%yJ)QWtnsebn2|yfk{+jSxkfY*uhSe zT?RX+vzz2sT;&F=P2f`HZQlUrgT|?}>ZG!3E~7&%+j1^wIE@LTkGNEa*|b%dO;ur( z+v>F3B_EGms?&0pv09ycwbJ`IH=LW^1(9r5}ABULVS)7EA*u}Wd36c1fQ6K;}GF!!zVPaLTR zayHd&`c$iJROM{=dGdNEnNa)Z4slm)OEf?3!wzwDs6MXZ2mb5-Evmm+cgMqNj{U+4$h4QcJ8@revtH>Tn4Cs&+t$ciJj$rq^= zCp#s>g4+)WF)K5NiL_<hib=5&M!m_AJO&`F6cca@lExy{@F_esQo?dZIMmf)@ zIAau-1aHcO%yk`>t9Tm@9E0d2haQxGMeUJdL>0~=!iY}4me<)%F>|IgmUH$>q3Msd zo6NZ!cC109^w6Y0@U{0;cUosZ=1HosJxa z-zo`{@J(Jf)d#7T>hZxxP=bEo(7(MfDrE~Ul%NkmJMLb`(MTEJn zOP54OZT`?;lSw?oBAe0z4zo?Iw6RsQW@zl$v;=O7DDVkq_H1l~6Idlfn8lLJ(otj- zrYFdt*qatLw5c{@F-*4#2GB%f5%PhRuDh9;L+k$}CK2bDR()6&b8Oe$N zTDmPLe9h7I28|+4ja;HGmqr-Dun_h2Fq_UjU$-U_>4?1NAY(S4x$_u`UL13@h+A~y zQ%jpoDWRp6-ISn8a>D}dR}3xsUAoMllq<9}>s(gL5_|Y>%QA6eEpuQjLrasbQQSr0 z8*%R+v4m#Z=^if!t%qv$a07sjSFt$hJZ=ZEtg`y_?xQ z+DOQ}$li(6IxTtkHviyvmD>VWW2tiUo|u2LQ8xfpg;CzB9A;^EsLG|KU*8X}a#GIQ zG^td%HmdklE^QL9Ztc>@NcvXh1t3kp;N9Zb!2gYE>0p!<3#Fx4mSW&E5mVWVp`A5DXAePZN9)T@D+ZQZ+f9VaVNj=W$uPWs%g>5wBa^?*a;#Iw&A+-eNe3<=?DvyPl`&Vz(21>WB=i;rC zHWy>L^o|H|h}1ZAdTxAXUNG406GWTcf7ymCQj4yY~^;J&^foYTfAYXxSnPG zo3iTfY_Y>ht!P7rMlSB_84=xSgznf7A|b8vLgr}1-?A1K_xJWQ^LKAt)LAjlCh0|; zB4(k9@AULXW^nPsxnYjU3J2GEuNw}nODvu_Qi@HM7C4IJPN_p%qb6|J8>JKZNK9?E zkjA&IizNUOe;cSCbXk%xEw_)w8Yet!UH@zbe3#L?v-BxiNm#b$lvPf1bIVXqZzb3) z?k*m*IE;^U4sd~;Bgp1kDgaF*XEZ%Pg|l?_&mw>{XAGkPWNGF-e0JKH`89Hs#@_ab zb4Et0q_RQ$9Mhm1npyj5o#u>#g*Jb6ge8=}#rKzNAO{fC1wINPpRY`p`d5-IrYxjY zl<{58Oji5au;TS)=$|fO-pO9;Y{PXp5M?FLt$m!m?#fXsmq@hn?cZ4ltcHzGRZUv6 zdjw5LA6S3#fnGk#OT$XX(pLw%;5!=|u@lbK7f&;9TZ$~Un*0AD>tIo zM`@jQd7w7w)P?nH)O2gLIBH%I;_FrowhENP^rqZ<)0_M~3t}9(nHqJCmYEjm^76(7 z^VxggstOoo&F%J%@%R27E4I!i){AYnS72@nxd`11%8yfo%<3MHwE+C9!fpNmN->5W zr4|Rq!ivT@=TC>yHyF*|D4%|`oTb!@SghLN3v=@?D>k>apeZ?r-6z(N`Z(g!rL0~v zlf9|nP5o;v&|)@ojX35Vm-#0LeX$z@R#{+OJxjg>j0KseO;1utJUW2|CMv zG-t~)qp)U6EQwaW7E~*@pdWmoc8gXH+W;}Y1$L1>|?T+-1KoyMH;TSj<16ld9Bh zs61>n$J3TLmM16{Ia{L5snLE&G5aI#G@I<}I#Tn?C^=8N-Hk(zWMebJV)zC?Fzp%g7F$!PMG0@0id4HV_>p|lP ztzuU4*{t@kdw{B(=8e+I#%xtNH?l15ql=J-jxj5uj3{iiOkCc_enzaGs@SqumY_a@ za$uFGa~AL~EJHCH=aQaUE(9&XhuLwa#)NmRTgwHlAl4AZl3Dm%4=z%n7o+O zw9lNZ=^5J@#oW+&#vn^0_?zU%QirKYL{Fh8wtaKK%_++^E}c=!IT`zy*{we^QF+JA zoI5ppkA2l<$x4t^Qx%u7FCY-Cc)B1jXU{gqDsIO4R;*ru6??3wii6mmiVdEiUmNBl z8!K*0)(xpfI%%m6jIKALo)kl=Fo3JP!+&eXs(7K+rdG|`8Bs0(Zc&j8bo;s{ggT^NL zyyr$8xPW+xM`|;(O~ht5uGdUa1n#VWZ!Va7;iz@xoai zTmIb`KOyJn4k&xibF)lW@ggGL%FU$6Te)(twd7!1xi4d-t$C+XOpAE&+{T!jTxzN) z79=D-G@N2!;Dbv6=x48 zqt&+C=EnUx^K!WWMK_ydCtUAkW*9yg_9k5!q&&^#qFc{TU(HS!N#{XymH^!`WV&3!KuZ7Kz^Mu&T@86RgUQ0nHc9U((+{mtOvYW-~Ah|^8m(3x`Eqgsq z;K|*DaB)*BbCUq5t#zIW%`(AA^35ESiOiCGZK1C$MpSJ?57j@JaFuUqWW{UNfflxok>D;fAcuqXW*?Rh(zHv@`mVY!3Nw zu-B4HFxzZDCuU~n^4;B7gJCy2d9Wbxs;EtM2j8@hy~Zsp3$=eMjx%oQH+yex_8zYV zFQsP;thKFs%u>KYAmr0G1{X1si8UVy-; zon_7PB}*4KE?qEZ;p{oA{_QkbMTX)l^h~7UvM#e)F*OfY*`i#v%FQdpoDjzv6AYih z8lAZt@po0&ZMhlk+g8LCqF5bCHgc-&^m-U7Iwh0^nI$cxmk+We zX`j7(ubRW*wi#sWWVRWsIXf#ejul^WYB2-<0!)%N)<%gk1x+WH4Z zwH9E;>O$rX(RrD$LkLScR*z}Tt)gt@Lbv__3pFj*IbSXu`#alDwh{JNdZf@7$tai+ zw;y&%{}9{nqQ);1NIF=(I)s}Jm~213xg0yCniXL9WnyGW*rN^Hm#e+$O^f^zwC$%h z9p*A#f%r0snHEOngnSm=)*Wd!%4_|$rN?d(s%@S9T~1bvhndycHH*`HD7VZ*T+8SS zOJElYp%9AvmEvE0&|e7S!$eTRyfe@7VRE=6YzWumH9pM5|Eh3%?NB%<%nP@Nd&ASA zFH8v!@y=v0G5iBt>z)${*IJrbni;l~G4fu0m|3{JFfr8EY{7naxTG+%)Ee$BToq2J znOIyw+`L;pOsU0y zN&l|5-%CiNo-o&ktBRZP*+7hsmmcEXq3}2{j<+|a7Wyc2Utu%l86t#2-6#LT^%l0i z@OZeSbWe%07gkVjf%hK=Q_1-TYWL|v2p95BDBO!*D|x(!=XjuhJBP`|DdhKhaySpa zd&3F56AHIuUr{@AHPTDXeDpsLp`RI*SgyImPUnsm#K!cnd zU1ffo^)4YUB+ku-E#!()hXp*p%X2efH;421ZRI_ca56rZ@b*>MufcW+`B*_ex`I-v z#_LIED*2#RHNh+U}lip}$PSs!SQxPdwZ{pRM7?YtznAcKptkGj#}^i65^f&;Q*fVWIc5YD zhDc>}Q z;@SO0jo~8Dvk-O(H6VaO*a`P>U?<#mqD6PbTnx3Kj`9~n8FLx)Zulp28Pf#9igK62 z4q!*HQ`nu~GHzwu%D9zr+rxZzCXHP%jRU)eJ@MO<^!Frv_1Zw}MPdvVgKB(F!tDk2 z=65Il0w`dfh|50M_Ohw`@a zJOv!a`wif5%tsL0kv#Y3ouk0f#9T+rQ}Le$rUTW8@;Sp&Q^@_v*8$-eQaqO29|w-l zg+BrFiQpt~GME5P$?B#QPQ`p0I33I+y;#a(T69<@8p;tt__>=%G`TrMPR2k6A!1-f~shv!Pr zOCI}Zv3}YI5)du|t1RD#l1@3S25Z0o7{qS~TujT!Z!H)GBVZKwb)cCRRST~t%m&ig z2sY8e>XWYquc1t@1+TNRsXoi$_23eEz+RSj)r*(;QVUZKZ@~YJ;7#Do;4R=Xuo=7+ zybW9quCThB6y8qy?;wsVW7=2Ivv#Fty_1~13tSDZ0oUSx9e6i@HiR2U??%uJZUQ%h zTfhW*V~zF5qp0(v!>#nl5(q$Tp!PkGUQz-96s)hyZF=;dLFyV48V|>W+pM3DgU%lt z?f~y0jXS}6i9!AIE+E?eKA!IfcY_ar4}uSY599X{;`%7hk6BvdnCtfqAEypJf!iku z^C@sW=1+sq5cad+Ufe!Mn9qYRfG;vyzJ&Xi!B@b2;H&hPuQ7tYPTs!(^;Dn#Cb%Cw z0Jbn5zr~39HetU5z6-twz7HM*4}pilBgFp$@F;i;{E&Bl1Re)J22X$|!BhDC1pE~I z3_J~f4m3ue0lxsxf?tAPfnS5)fZu}Of!~8afIoug!1Le*@F(zR@FMsN_$&Au_&fLq z_$T-m_&4|u_%HY$cnO3;ITSz<)D%iVW3Pm{7Sw@q;Uw$-`Fz*oK9{{>XL8K@j~0}}`@+O|99)YtbQ?LBed3+#>)hDMB=XAo&080B9p2vdY!14GUYGo^j6EL4hS|<_5 z$(T<8*F#-3Q+$hhITib9pqajOdN%H%!-Ss+W`Ra98#IAApc%{sYL9t5=YuoAnP35E z0Smz*&$jKM00s)2YlzJJ2>4W3SYe-i0pXHcY-pz)_6gMOpoNIW<3xQVxy9 zb%f3LV~xM{xNQI%!6xu(@EY)1@H+5%a0$2+yaBusya~LSe)1OL-502hQa`>7zs=yS z;BDY?{I39S2k!t^QV&;wcVd1QxEfpot_9Z-{@vhua09pzx0}Gt;1+NzxDDKn-yPsR z;7;&fa2I$Vct5xsd;ok9dA?*SHai7*TFXmq7Z7MQuroqb3YJgTC#o;!UNd1 zfM&ReD{^i2E#gwU=G*Dp#P=QWUGP2deefW72s{iP0Y3nbg2%uQ!H>Y>;K$$z@FaK& z{Dd<8l)U{6^V8tx;2H1>@GSTx_!W8hHTVtqE%oy|@O#|<0RD*EbKrT*FMvORKZ6%> z`wRFhWf}#41Ahnq!0n&lU*O;1KZN}+_#b!)gd+486hRFrfm%=pGganU4|V`M7U6ku z+Zo(KesDtBG?)se z5pFt|L3xhhc`VpMJsijLcyIzZ5u5~02B(m(Qwe(-xV$hgoL(FkW){z6osf8p1(aC) z_C8@&u?23v1&Y!FFS0N+^1k!X%ukq`NZ;2N%xnD3!QKq!f_Y#*I0Kvs_QHPw&z9mM zcpjxCUTs`hNcxLFYf&_BemIN#iH0pE{x+a_UwocuocICJxh2H26f7fu%ZrnZzOBH1 zHaG|DM|++`9On|(dEk6-0cZyof)2uTf-caFy{C8pF_*(i>>fvvcZ!5nT$Bk;doSa* zTd4=HgI@F3*eZoS>arjEBlum!a}`(()_?&pNIXN}V$$)oMlr0#eVF$~if7q+Z4`Si zc~RNb=aw5+U#Z`9yuZHKMrz~2hT@X2k#{#)-j@4-b7vOIpzHp`EBO;ZJyr&-v!^Z z`tJ?jColD3r|=;0JVf}1@l!u}1b@xNKj8T&`G(qs$MF9l_z`#i&F>O;kC z$MtBjpE1h3Q@n_0Dg3Iqig!c!H9x;8t~S4iifiooY;k}PrSMzQ{T=21J_A;8sg}>0xUL>Bsg1>>kgMWa3f`5U3g9)s-)#tuK{r(60e~Tl;ukwx3 zW?D6<42pLhX68f86Ie+Tl&54O8*=82@PAreZ?rhXn`@4J$==tRRO?;-)oh~82vdU; zq-Ij6sX<^@Qwp`9uIAMiN1=w)z+cE$J5%>|^ni!@k7v3a}rLd}C70r7=F{X-lUZ4&c4XHE*C!m1pK`3;V_xe>uDg`+>2X z2k|@@90Cpn&BUoWdkXIzM*bRV-W1F7=5Tn;Tfz}FmxUwoJBm2QBZ1gyyLGENDutsh z4(55x%}6VDj%A!yGb2pLO=Xxte8+%e!ExYt-broLjC8}(U`<8-PQ>pda5CXeiE*Eb zyXsf%e_GAuu|8N!nZNtZthoaEliE;zJ}+KG7ioy^k4JK{=XT38Da^{nr}?~*IA((; zpt)rZ&t@z-FZ5{~?=J$a zil;{Fi&8j?_ZMStBi!ytZwvPBJ7fE*-@hv?sku5Vt+^&FtGPBTuNj9t`nqs7@0z>WH-?L9Zi;2{_g2;1 z99Gxdf_o{f0RuI+#(v{tW{|uNfk$}j;+orNtx{M^T;~*TH?!nX!!>s>(^cw0?J^SE z<`JYuqr|(8ch>V19okTHd)P=^o3Otcyao*8|61@m@Op3wxRf#chMM=pv3_TGBYAxj zcr)SO0xkoaV>-=9p;AAYO3oxVP~XznQk%b(_}*4?S1cR+XMFDp+}}?5zJr9q--n05 zekBn7yNc&K!3DJIBS^J;Y~CH-W$p8UY+PK;*u92u*Am}##Qko}*MoVaeFM)M!A;;1 zq+z0eqDePnSNOGrxdrnm{bqljK7V~Ec>nltY-ja%_!z?8%JVjGJ5br~;Q1bKC-tE+ zznApys`&_Wfv596+}{uG1}75k13+U?X^G#PfJAPRh5cCgV9h<@LxlS<_z2-X3N$W0 z2KHuNx`*e-!6(2c!KZ*|%BR6+i0`xDUhp~ad7!d^c-eR6-LJ+teT;nqTBb5OE%+K~>`NZM&O6^A>^H&v-~s%%klweL zOTJB<-@*J{+`h;2`!%1;;&>3ZhY0^Lcm(qgz@y-?|1*wHWpOkR=MTY;NayjFeUJ4l z{!dt*wHNW}NdG<)o~-$7c#1eQH#Tcu$jS&$K=_}6pOL4%=_{&R^_ga*qdw2E4#rRJ zKj--f5>t0qzbJ)gi1Qbq*`%ndH~1d#OE8aj5@JH;=0nx$dsf!md|B2_HdAu>fY`S1hqVRdQNz6p~^e zd!Fz7SSrOZ8at05P2SD&H7V2*PaP(ICcZ#6(*Fv9^301VRz!#1MCSlvC^+WlD!x4`?~9X zWT=Op!V9tx?KFbs~IUfs|tL!5N=YKg1c4*hY`2< zlZMhH_B&F(zZDKAe_GQYLAWEqQQ&CuIF)b*@%}WP)4>dIjO9yf%x{NdOWzL1mA(^> zr)`T!98V~HFPvEVemJQ#E}RTb0jGk~h)=x5=_Oy=&%~}Zk7z9JuF9vHdUrI|1 zV;&*wC|F0GtOpywMz9IDR}*dveeyM!AEs_zOMYHgdN916_bvgF*ujyni*g z23%YELAb8;Xm~eiTwgjO+<@DSr7hv6lH^m5!CyT_DIT-_bP(;Nx|clJ`6~6r#8jaoL*T>UBjBUpW8fa}aqtQ7N$@G~Y492FS#U4-9QZu=0{9~M z68JLs3b+q^6?_eR9ekst{i+{@Z(_cmd`^IdJWzTZ9!Byz>KXTMktgN(+xR!LLsbh{ zbyH@aKfYsQ{L+~S@eyn)Ze;y|vr|_os6n{*;J^`KtPZ94=N>7HLlE%+UPZ6(VT@Qx+t*)7` zD8tXeGsN=?@GSTx_!Vxy2EPHn1-}Eo2Y=kZuz!3*F|;LqSi@E7n`@Hg;x@DJkp zC-@iUe}k^l!|W1zzW-DDN%(K+r{RC(Q}U0OC_|`4hFgm$muC$qfm%=p%Ag+X0CogB z)uI_e*j;#z!@et!R@H8`+M}gzdG3zi9$?Sfr@~&?_Xf+TgNcOQ2kZ-8f&YGB64)Oc z049T1f>(h9Ykw9FBHY2?klJg*p|x5UoPo~QN@H`eAhxvG(Cx8<%p9D?@r|{mX;52YL(E4&F&sq32g4v*n z^3LJe4CdBq?qJ;DHXodU+nI!4z_SG`#JmVd_SA~~EU=jTw&8XnZcDH)1E+))cFbqb(C|C#9gAHIK*aTh;UISjsJFf$;2bX|LaeD)JBX|>d zGj4AImx0aTt+>4nTn?@PZwK!HSAwhXe+pZK)q8#)NIZ<_r{w*T zu|ETE^b9@x85`G&7!TK5I~2nW#B*b<)_T8y=i4dVRJ&8S8NXY=t>89rJGcY92iytX z3+@6MGw-W?7MinDct7vmjoSx+c#aR&{t_Ol6h4Ig!{8&}qu^uU9`JGS3GhkqDe!6V z8S?U3a4+W1fzN|^?4Bzg@xqGZ3*d|3OW@1kE8srr;Hx~p1|*mGI?r!_Z-V>51GUoc z`86~UT1D7zfp3HF;P+k96aCaW>KW+6a(3y*0k~Z1O7v`g_+IT9;roPDy*PqQ_@Hpe+$KVNY6xslyn@?gE zU;h+Oh4~53pMsx(r^)Bf!87Fh7ucT#zXZPmJ&>)hLe+j<`-kwG+CPTh);>pD{yzK; zzXM6{GUmG`=CUrEE1;v~=MVV(5j+Q;2hv-5q4xQ3iM{uW@F&{!&$Qu-wZ95~A-rS* zPSc>T*#8Fp4*miD8S8K=dHWamH~0_uFZdsRF9B_W6+jW}%^0hxL;8ui7Sw?&al44T zmND1kw*%M_^G;xA%)5Ybn4co9C&8|mf5LNo9rPAVz<+ljes2%__5`ANd-2>GOa%LY zeZed0b`Sf3Np%y#{&nNR0k};DudIU?1_y$Jz`?|K2+u>o6mS@5Al%{L2yi4g3LFil z;x`RU$2i$e$ zht86&crC3jMHdbzzK9*#OSnGJ4=w_$z-q7t41hr}L|!lExfTo)&j?VPE=M!wP_$%5 z$Aw6^|)^U8^I~XKZQ*^Ukz%B>os*RhS&0Ry07`j>Hh2RPqhE_m@fgR+a8^N2vo55Rfy9_LczHBDXmlysDkM>te`&Xm4--W*rpE`jx&0FjKhFs?FtndF3 z-bQ_2Ubj=Yf^xl`_e8ti!ShPuyo%>?w0(9#`{$j+tvtSq=hfgEa4r6$=)+uBHzT|o zTo0avH@<;)Z>;+l>HBzkm@$77;U_VEHDByp^KWD>9^cKl-vVwW{B7jpI^Mk-KT=!qfudvcks+2=~ z;|`3|kJNRAk6OAfv5xfodLAJa;id2~^J5+&e$m4oc;3eg1=zC!R1yPjlIh=rKXR;s z^f@J4`Z(!JUqJh@pTPV{dmnxr^QSR?hUaH_-pliI;PaTj!1If=!}Dt0zUyi1wX5+D=b6X>uKuq=d{D&rT>O!aQ_8(7W|U7 z{1v!^cYh6j1AYsBhu`mU{{!Yfg6F{V;05p}@aMWvco91Im%4w3zt;Ub{EhH`2mj!m ze}aDz=HK8ynE#9W|G-Nil;M>@5!8SZs0DSPT!xMlWCyS#*a_@ho)mWBIS%X!#)I9! z1h6~U1MCU*0(*mrU?1Yy7rX-O2PWaRKR5tP2CoFK0tbSFz`@`UaA+AlU2qs^0EhGL z5#VzA-I3()C~$PSSeRNa6{eMI3)9Qxf^?E+5cU{wEI1Av4^9BSe^$@i0l<9RX!4aJn^og13wRqxXmt)3r*!`!W`k13YI~Nv}cPzA)pJ&hT*WoPUTMXLDJB1}+ zDOd)UgB9gn3TN{?r#!B3F7cfQBo8{D@E4RtPyZ6y%k_l|%aW<=Q0OS{TIeim-M(Y! zDkt9JxX@i5U+5`|zuc{`E1(q_i_#gB4w>GWP*_R+(>}Y#WH0tU(vxngXxUx#{c$zB z7aH*E$L}Jr3akcezyKHoL*Qbtw!AP5mv=9Wl=mo%miH{Iqa5qYdlfd6_bzP2e-n5$ zkiOSzc)k|A4oH{t^|aL`;8Jii>Ar#I8^KZdy@@=%8N7wCm+{;T-irBc;Bs&Uczbzb z;T`3D3bSlyXJ5)XE?h~QT!r5|3I8shDebF?_Zo{Eeu*&G;eRQ(*=YZy@b2>N;d<)( zhVpKO8;Ns-us3DxOgO^c0&WGj0oB!F=$Q0}Zzr8Qz7oezNzgOA|$QSb=U<;Qs5Kt0@3J}i8kdi+Fre)y!dIr_KweH!e|`2Gy(d=}hG zT%QA)`Cxp+JCxkD6FB0xc;LG4E;6B2C6?_eR9ee|P6R14*^Lzko z0p9}O2DkCfcc_Q&g7200i|x8E^MEA%+p6SjV^6>)CKY?bG+fFI`nfg&*e6f5O^Lj(!FWCPC{tEsE{$4(ublC^M{7>*N@Ne)R z@L%vh@DlMMoDT(11RM+srFwWhpm|tw57m7g_A-9YQkV6Zcc^D>sz0Kz+g9a5Kd=7q z!p`+a7IvveO9Jd#e^g<7{oaM$z=Zmv3%m3F9$-(f7udUgDt&dTSQ7dQa~E#=fPKLu zXdmm0!YfF7KQO6&I`(OW{V^W^n$b$$5pX($Hep_?_qFsZ>vx2o*@68v<~Z_tAULT0 z82bG&1UrVX=ttvrKJOe%9uFa|L&22#V+#||ZVsS2%#6Ze_&0#VdG83)IkNs#_Vb~I zxE)Pir-BQhZ_}_(2Q%uAqg>;{F_@19$ARO)3A}$|{qfL(v3*Z{R5}8h3r?VYPb{2N zula;E4-7$?6P~BPoPzyS;?W+~X{4*RI-TcC+-8ABFdN)P-)O2osqo6J(n|FAkT8cl zHG{d9e`poY`Mi4uI1~2;pam?%eGzB{XMx4!p{;&GSOS*fzYHwrofY70{LcaBV(uyK z6wV{;`SmB$R+`6m3Kvj+?chSt0XlhCJbV}7yY)`}DTEzcKg#pTg_XoBeU*8 z>rZ9oI+dC@l{VA-ep;aqKglKfiR+^J(+dY|Gp;oL_6n=&b^gZtx@h%k@++BLzRpjk zpRB1@{EcCNcn3*i2poWn;9~N$7EB};!}#qDPdHLPvoLDyH)}g(QTm?dGI$jq*Nv2= zkysk7|E(i_>D8S>-K@tv9_{#X+bv6pc2hj;Q;^q<<^YAEds28u&OdnOBbs8%g^+x>P1hm(B3hO4d!JDzah4e3@ zex8F5)>=>WSM%h__3EE<$=6)UJeM+uu$gdg1#bhFgDdLi!SlQQ?bzQzUatgS!R;#S z?*#7xSA%Q7{fv)mN%Ok;`HbcHL^!rVmoo53yMR&X1*9ozxl z1MURx1U@DcFQ`ZJ+3@Cy9g13nHu0X_*nMVjL0 znmN6I=qP*|x6km-XTkq#>^z{PD7rS>)4MLa6MBXvOU`)(BMI)nVP z=<*ryo&$|xo#*}n_MgK=_#(QlYZvxgxxNHS>z5#%zku>|Ug`02- zZo_wQhq&)X*LHo+^*y)`KfsUh0Dgjp@Cbf}U*K2x4Iabq@C5#Vr|>5{gTLT!pvgCQ zDH|q4KqR~bQIG_pAqL#w0WbK#0zU*GDa1lDNDe6=C8UDXkOp3cw2%(cLk7qQnIJP{ zfvk`XvO^BY3ArFQ1+}3L)P;Ib9~wYIXatR+3B>b3+7z=HG=~<@5?VoPXajAb z9khoI&=ER8XXpZ5p&N9E9?%ndL2u{-eW4%phXF7U2Ekw$0(1dN2&VHAvp zG4KYAg>f(*Ccs3P1e0M3OoeGM9cIAHn0j`doW-@u-(%{9+O{COic$kPW49x%qw2V3 z$JBMrfw?db=EIxt7A$~;un69U#qbWi3rk=rya&sOZ+Q%3L=a@x5-Z$@qk$dAikK9} z%9w`e(-6Ccw%rHl<@Bi=Vefo1t9|{9Z=6*;o6crq+8xG{xLyrwU@feJ^)XIb;@Ax} zoUk7e=LS&!_G8SA$le5-VGC@9ZLl47z)si&yYagRS)agO*ax4&emH>JK{y15xjzC& zxjqKR;RKw7Q}7z?+G*sSfq3%xEPg+Ob1{~29xlM=a1p+MOYkLrzrxRD_!_=}D{vLA z!F9M1)5!HL=1sT-x8Xau19#zjxJUf=;Ro{NNA4eh#<_pOd8)fuEF+itE()O#?4OT1W@!A%nZIDCw_CmY+gROG4nuP$Ori$4qkx*U@=}@kT8YZsa&tRJw{=7 zQ~J40DW^>-r%hc&+y3QCjCGEf%EL3zSf0QGkzzarO_pfYY%+|6A<^r`A@#WzALWVW*FO*MCG z##&l)-{BO*~=3-|bDg&I8iF8SyFKgX|_O!E*AqoUArnw}p1LJnh%uJAiBDQ*LMvanJ!eLXa;D z#nTBoLl@`@-9T}6=b83EpPuAnFL!5`PA}+9xIWMq`r&3p#Jl>t^BV)mqk%BU?KTEu zKLjR4cOmb)pmP^=*1qYk-0Pc;I*;F>?ryYmw0GPO<6hqu!`(0TPi{A5KKD>!uZ@~iW7s4WUFW1{{&GkF;0*l@1N9)^Nd&61FN|<-uynDqfM|Gw%}(gY=iBv!=237>F!5rS&KuQ zn!nmj8uz&S(+)6>h237*2cP19KOArmu-{Dwu{#8Z;RqbXtvLC44D+~qAmu>wUg{qY zvdh5<{G7y1--ZGFopKMh{hY@BjC+V(CeGsi8TaSlJm~x50($FRd6>F4lcsquyIW&` z9)w*cG$$^1J=@O-e~~nQ;m+f_J*O$op$~}zubYIT6>>mEy^@xza@Lt@J z$d$j>6YRexe2|^9idXAJzu{i%Ca+*#1%2sV!@N%X0d{0Z8D)$c?lQ)=a1(C9ZTQYT z8n@BtKAJcZ$7Jr1=cU<^8x54`|8R5m@6Bh&ZhoLw^n#ycq{vGhx{Ds)!#$`$KHo>D zCdwo9{sFrm;Q{;v58)A1#jPW0_?hcpKz)&4F@J-{==M82fj{6W{0YzCFZdg@S5TWd z>tZq;XE01)L@?Qr)HT)>>Crl^ag6beL+^3_p*Q(Q{QtEV;U#29H)k(GX3CM1XHmqZ zHaCe!-}~cvPR^Mf(H^aMpFm0`5Z46aQn?7{Gw)p5g8b1Fkt2I&oIJ+E96JQrR z5}sLxkd7HKGeKr>=Asps)}hXKW$`#?zG%Mnd&)yr`~=wvjz~LAn(xbooufDVcZfd+ z+|q4-<1zp;jzv9TuUeE83*c*YOR5z z+d_1k=XwQuo!C==cnW$J+0R33_cd2rfZgeSRvQ+=k0Uc&mmJ++#lA2U0i7*U6tftp zy)I6Un7pyweyE8*t66ZDQ)?5d1h>7f3s z_S{$TyvukI>w_r^j&9O7-UyPhdd^h|UkzF_*Ik{kH9%``8`|ShOA_ji;tPh}S(Brd z+T~Pp(RwaUIhEY^5_D8t%1^D!t%>|vpgE(wl(34}1)(-}b$IS|JI~X^-Cyo)0OTDyysQy4;EMI?s&rdywDBqcXk5u7l?Y zuYOU$&Wp7?X{X)Ton#&P!x#nf!gW-0`JD-`vZ}o{T|DdUdZqJUq(@iMpnO;R)D3^# zp$B$7NrU|N@_d9#qAtC0?*o0IAN2PuhrZhfeS`W|77 z#NMy&F$Q|l7=t|O6FFsh5T^P#;rfu9vZ(iekhWq845o3_-0Tp~2J&eG@opeq$@Unp z5ue6jt%w?|p>e)@hI%yL%DOz{4)c8M%EpNgjLH#4{UY77_uAHxJRm(I;dK~A9%#;J zG}mL`4Hyf`C*|olt^<^}@t6}}B20qGFa@TFY3S_kjcDV4kJgwcBc9pwE^*ac%~cXwm%A?=?KJ{w{8 zk{A2nQ;+s3q&N0se}FtZh`;ruBfLlZ5O&&opnV55klPnj*AHWV1hntqDCRLZ4kzFw zoPyJE2LAVR+u}M)+@JA0&UsFdKa5p)8W|Tzhti|=@N?3w`2+21zlgjq(EAd0U&2>} zy9{4@wC93xQ_oiNMfTfhuVk`D4p~>=D%aQGI@f)9&MJpDxc?Sz!Yz+ZBH2#fZbyb? z+(y3IgYU?bWSoR^$8+3>36=l5=x`pshX#}v`MZbz`=Gf^o!yp;wdUvPbNxX0AF+QB zlJ}GCX9w;2i}M1`{Jp+QwXYmgy)_i^S;=_7h}B6}w`JJE5w>u0-;YoCd9ke#}lsq@a&;2 z-$U3vgiUWe#cv(z>7V4~GtjeAyZV>s6Y@}Ps@ef3U;ZYK3~xBhUf%1vrhm$TBMN6? zM(|NwhjuX%^Cd6iJD~O;31&3z&U;7g#6H?Zh39(>88NuILvlR$^@0y9@OwX{Et6mB zp*PY<3Qn7+xc1ZLJ8pKHZ^wV&KkN?vhutA+snVvl^)T0xBbi4+y5UCr+Ka06Rb!d9?>sIv*tZxP9{j0F*|48n!1Rd0eNMVOR{tr9#ZRua=aftDz^A;c_A2j4=gas@3+W&|WPps22{J>L z&@)gQ>ZJ3u-G^1)D}Ni9XDE}2`K>l2tDTOsyt~5rXByd%lO6jUkQ2GNAUEWJypRv_ zLma#U1)v}lf>*tth2l^ew1I~%w63=sFJuG30hV*V=p8tRNx$yt+qf>&y z>2cm`lPDo72kJ8i?GuF52aubyFIRhUi=m75<#sZ4x{$^%n3v!gDep><7bU4blcUlb zrM#EOSGhZG?6KjQKYuU3%3JyWiWtIs_b&7NFH?UnQ-2fdeQEqUXN57YOMNOsxB{GJ zloFVUvi&-`n?_mks+?EtiOQwcUpnU!sLYl}P6en4l|XwPHD6hndRiI%t3c4J@se-o zC((DJZad}NX@{yJyBbu78c-8z!8uM;N(0P>q01FlZLiuDo-gv$|EY@~r$5IWI@k5R zS6vNotA zWyf(1UsSx?Hy!hyvdBd&=2}!Hvk3_E}oO7 z26@Y(eTz6; zhY7e(ME^;IbMotsYcje|!9K{zSW`*oG?>o)49uA@3ueO{m<#i~-&3P#*Fk4d)T6Db z@3|MU(|2^ZjNPXm&^M-j#c|4(6Na%w^3^GWKazIF6}=DaZ&1lod-|65C&D>(cY*gI z^~^b|PWuj63T!MSFBg%PAg6Ri5xx>NSL06_i+UT`i|w@hjN2pEJKjgGcVP)E#qB*< z=KY0d;>_tU=l*?I0V}<~+VbQkxm}stR#}-y-!jPQU$Xmex5wy9f0KAud4H!3PaL<_ zNhlwp>uS*1sy!*QYlutdSFFWchrP~^TThy<@T@*U#s=>b-ubLw#(g8?rmv^5j!j%Y zV2y>&(AbRsASaM%+;R){Tai~^*E)ZJHGAF&lPpo6$|OqT4FAr;1={A%kfS_3 zM|hp{E+Q)qz^9FH!iiCgwsZ^imLbbN^YBTS7)|BM;rG&#<0#!u1&8NXovEB-W=`Rl@xr+&}fEPPo?`Ly!~eoM-(q`RTM{ zf8y_%9X2h`UvbjEwey$rfzUM_;nq^t)&D(4JL{Yk%9xs~EDIpgh2*8TO_whNGAPk3 zIFEoxA7=+)MnMvY<~|18-~liAd>Wl$?FEI$@?}C_)>Cj@9n*@)OddII0qoSjPl~Cs z6zj`EzJ|x>wC9R4j9YSFR%FnBM7GY_Na@RFKig-tWhs5xZ9P-^a$v_?C_1I~f> z>V@5hN#n~!I+%mxJ5c>!?OS{qziA;Iq$f-U$OxIZ&kR|7<){hHyQC6kR^rd*OJ-z; z9LURwpInd|@<3i+36jj7TiWw{+~7OFHMfzDgX0 z@mB=1C}uGz&UFdQl9;71OA}8S%(74p%0mU*DngLcaHB&y>s?TZ{Hu(6N78%6UCyZD z^B6(j4~EK2RbNrtOvVX?I)kzhb*>tIwdW(q-kK8jyEC_0oqWjPD{j<)n!d+IEngX< zwol_IrHnehJZ4?us7JW^(11f2yHMU5a@`!MI!{_@Ys7tH^lJj~FblV)*fo6KZx*yA;`&%CN@I|^BQS(-1C_lD;bLWFkgOC zXRxau;e0(@1*k6}H=geVbejlq5e2bNZ%pzPGE?AQns$9M_N6&t zQt!4Y$e#++e1(z9xqn>GfSLH21+!s}?Y{_ZViEGD2>Pmj9chHm0~*A$l0GRsMUhby zKSe`+_^PzWD0pY_Rxiy7mdQBfa&}|^b1rF_ht83ng64eU)BbJA&>2y0axXpJdMnF6d0|?=klyYai$g zhkM-LC(I9^HKIRq{{Vi1hwun~hF{=U_zfPz@9+fvfT!>$JcGaBZ)9=MjN!7%874%q zktz~ivb6VG=Wtj?lvTq>Vx>2tA;!|Tqt59#Yq%|XN8q)V(_${CMlYugEn)hsVy0yk zHurkMXEc;D{Z=V6U|B{|h_z-L$*jdja!7&9lvZgo6{g0UIsA%t!8r$|7j+>ux}-rr z&BMJclX9!)l$PsskRCFigT`DlVrGKOh{=MP6|zBgtBje$3ZHRc89A+2&0K`b4SB4x zW?oBYn3Xg05m$c5$!XRFjPm9Z^oXG?iNo#{P}?zp=b-0XfP0+-S`f1kyb6V(2o!~4 zP#oNZFM(MSN`Z&_B%m`NN^@TZ%0f9P4;7#yRD#Orr}|z6(;oA}tV(*SL3OABHK7*N zhB{D}wD0k#?#^RRW_hz7a_U0^(7C*tcWTIWBWP^P<-3<~@pfFATV_6o`(BY1@Ez_q z=t^z9_Ij$F(sQV2_d^oT=d5JLa*8f*S-U;|iguwHa@4TIzeZvGI3W%R^^Z^XAMIaTb}w&Rd^3n!MzIZdM~m5&F;&{El58-h+7c13cQml znq5g-Ci;2Z2=C~mF^OoSJ9*WExO!stvZ^ApD&eZyGJ6xIj~yRvoK?+C&I!PbNZ4+3 z@zXElCVBl~0BINqgFx#ox*&6~U8XtDf$IY3mk;!=dJR8At&_a{^j_8Xxb}-HPdV!b zS;H-lF#uTy76S=G_cGDf4<7H4 ztVNG?Fcq}+YCYyhu))%ro%)nBovK_Pois+IwP?&*A#Wq-9i{o`Oh>yGGbC(oVd4NN+WC{)Di5Lvr?^=chcU z{p1_7xcILX(#J3k5auG|<_Gb^?`60wVAO)~iLkzn%@V9pIz;%xmh`A@9wE$8E6#Py z(mFp!SJtGWOA}-_LAH9zY8%62W%TzLtC~-Filr@a#^~bhKG1REJpm`dnd5It*`bc1 z=_$(9X*h$M`e(765UqZbGlrtN?VJ_e+H8(}Gg<@Z9F?<#as0F(&sdX6KAeN|aKUPc zzZ^zqd%mC*?Lso+bL2bav$Y+!-iK;CE+S_h;dNfa7gifP?n|~E>$XUbGso7JFdBDb zT|IgK6>(e!$@|)BM?b6`S<%kU?_`{6{SAJufS$eDoAUN)*p_h>yKCg}b>x@FzBBz( zC(Rw~zTb@m9XryG>WIva$kcpHd$R)1zHDSBevzbu`7Qo*mP~nDzJB+B_cpS>#NJEa zYXEMyh~u`UnQ7MZ<95gDOg?qywlgx1GgfRFcdagF8v6v}F4!^eWN8exvw4qae;>-) zbAZls{Q-G?^6U9=*?*45vS)-mc>wBj1t=dsh0+tx>1|QK2xKT8=UE)304C#9HxIDd z95*MA9}@0sHfp&YCa`j{^a@@{1r-r-sgWKSDU(Bew{uZZYz5s zyB7|-f1sf03aR>f8WMEgyi61MEEW z`PuIWe!ukOU1ZlgbSF&G1RXUG#W!a}Ni!Ah(jgZ2WT0=lEK3)AEGU z8aXj@L2kn3fxM6p@ksrQizvhtk}a z;kqp7Telqd<)H$ouTznHtOS+0uYw<)9~{K2%6&Dc4mHTnnotYQ(Gu1seRcfm`>@9y zzv_S0!(V-_8(=oXYy^#=3B*HFXy%{5$wtZ(om;CjVM`dzv2Q_`-sE#ju3JHC&~IO; zzPI5z7tf8#I#ze-0!*PY-$OQ!}*6$hP9?QaZPY< z^y%aGv(q|UpERD!+6Pz(eUa(>9+K7)zeXQe^8-W8ek{i8kGuh-LG7^C`)WRrSBZrxzupjLoL7kEv>q)rp z?HWn_;hbLljs^9Z#$i7mCU8Fys$n;Y`^hi`rouFsPMmtz&ER?_%!1i=eA0V3zfdup zdO6%~m-L-62lu%N{xs&pm<9glBj-)*--0pRE6ocq7ji#%oqhB+=3?yM!Tw#p zGnb+{?`e*FIYjlFlvS=(v`er>{Mj5a^>k2KF= zpQy_i^E_#OYK<~4VE;LOFTxl8ac12l6U|HhNoFB_HGWeg}8p zE_@I7;6D5SKf(j}2_C{D_!)kIUkR^sk|G%|{tcOr;dlR5p4JxQiQVS$9!9695MEpH zr+*v2S{Qa$n^>J5uA}oaWG4QWfYW~eh27tv16W*vQicf;{NPL^{6RjvgsFNQg?kc+ zhL}Je=6}NNkY%_z3CtkA8Tgxl zKh0n<_JE(0^v@J#7%S)bdcu7s?t0dikv3o%=>pTu^vKD89+z)lYP#!vEs}_3H2CWON zL)z;?J*W@y)U_<;Y_maN4$pTEVdoH5-yMvx6DH2M%U8W+G{UdGdm3Zvtl%cZ84pc) zM$H16VVq0Yxe4)VZH&GRRQ9_hnMa+*EuxgsJTRZqq-%}&JMOH#HlzMw$2%O^Er~10 zu6W14!qR7e)`0~t_;>8(e=lD@RGflvK|ii zZ};crzZ24rJ`MV|rQRm${_YF9JANd8$-i`$U04QvB4o7>EDeQsWOhX34yvE(%kc|1 z|IWum_hq3p)0YZ`(X)w-SpJXv?LZtI1Mj~e$FWx&EB;eQ$33j$%IBW<2mkTBSG^$L zNt@(<_?$jY`REi_{ep~6fi*A42$z{ofwi<D4#< zMZS@O{L)X@UUuqJceTs=2JRer-9r9#-hkYc@74Hap#SZ@F(Ll$wmzE@?t9qxn-lIG z{kA0BYpy5AuM9czo&4yD4wBOgdPASUwgkPy-?z>>i0z^B%30BrqrQae2U@GpA9DZ< zwBz5A5MM^S9PLby=R6ns$hN=Prt>?a8eewVG2xzY4|@A9scb!#^Y$0 zX249C71%}kcF{iVvfHQ2kq2qf!tco4=0MiT&c@#y-Yc3Do{Jei*M1&4sDE~neyP3( P9ww<$r*cI+z3}&c_MMAk delta 104820 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 From 2f74aea6f55b90bd78cf0e6215ef852135759192 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 04:38:57 +0100 Subject: [PATCH 035/379] Replace deprecated functions --- mods/ENTITIES/drippingwater/init.lua | 12 ++-- mods/ENTITIES/mcl_boats/init.lua | 50 ++++++++-------- mods/ENTITIES/mcl_falling_nodes/init.lua | 6 +- mods/ENTITIES/mcl_item_entity/init.lua | 26 ++++---- mods/ENTITIES/mcl_minecarts/init.lua | 24 ++++---- mods/ENTITIES/mcl_mobs/api.lua | 60 +++++++++---------- mods/ENTITIES/mcl_mobs/mount.lua | 26 ++++---- mods/ENTITIES/mobs_mc/2_throwing.lua | 14 ++--- mods/ENTITIES/mobs_mc/3_shared.lua | 2 +- mods/ENTITIES/mobs_mc/blaze.lua | 2 +- mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 4 +- mods/ENTITIES/mobs_mc/enderman.lua | 2 +- mods/ENTITIES/mobs_mc/villager.lua | 2 +- mods/ENVIRONMENT/lightning/init.lua | 2 +- mods/HUD/mcl_inventory/init.lua | 2 +- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 2 +- mods/ITEMS/mcl_bows/bow.lua | 2 +- mods/ITEMS/mcl_end/eye_of_ender.lua | 16 ++--- mods/ITEMS/mcl_fire/fire_charge.lua | 2 +- mods/ITEMS/mcl_itemframes/init.lua | 2 +- mods/ITEMS/mcl_mobspawners/init.lua | 4 +- mods/ITEMS/mcl_portals/portal_nether.lua | 2 +- mods/ITEMS/mcl_signs/init.lua | 4 +- mods/ITEMS/mcl_throwing/init.lua | 8 +-- mods/ITEMS/mcl_tnt/init.lua | 18 +++--- .../minetest-3d_armor/3d_armor/armor.lua | 2 +- .../minetest-3d_armor/3d_armor_stand/init.lua | 2 +- mods/MAPGEN/mcl_mapgen_core/init.lua | 14 ++--- mods/MAPGEN/tsm_railcorridors/init.lua | 6 +- 29 files changed, 159 insertions(+), 159 deletions(-) diff --git a/mods/ENTITIES/drippingwater/init.lua b/mods/ENTITIES/drippingwater/init.lua index 5cd74cd50..9aad3eb88 100644 --- a/mods/ENTITIES/drippingwater/init.lua +++ b/mods/ENTITIES/drippingwater/init.lua @@ -20,7 +20,7 @@ minetest.register_entity("drippingwater:drop_water", { initial_sprite_basepos = {x=0, y=0}, on_activate = function(self, staticdata) - self.object:setsprite({x=0,y=0}, 1, 1, true) + self.object:set_sprite({x=0,y=0}, 1, 1, true) end, on_step = function(self, dtime) @@ -28,11 +28,11 @@ minetest.register_entity("drippingwater:drop_water", { local ownpos = self.object:get_pos() if k==1 then - self.object:setacceleration({x=0, y=-5, z=0}) + self.object:set_acceleration({x=0, y=-5, z=0}) end if minetest.get_node({x=ownpos.x, y=ownpos.y +0.5, z=ownpos.z}).name == "air" then - self.object:setacceleration({x=0, y=-5, z=0}) + self.object:set_acceleration({x=0, y=-5, z=0}) end if minetest.get_node({x=ownpos.x, y=ownpos.y -0.5, z=ownpos.z}).name ~= "air" then @@ -58,7 +58,7 @@ minetest.register_entity("drippingwater:drop_lava", { initial_sprite_basepos = {x=0, y=0}, on_activate = function(self, staticdata) - self.object:setsprite({x=0,y=0}, 1, 0, true) + self.object:set_sprite({x=0,y=0}, 1, 0, true) end, on_step = function(self, dtime) @@ -66,11 +66,11 @@ minetest.register_entity("drippingwater:drop_lava", { local ownpos = self.object:get_pos() if k==1 then - self.object:setacceleration({x=0, y=-5, z=0}) + self.object:set_acceleration({x=0, y=-5, z=0}) end if minetest.get_node({x=ownpos.x, y=ownpos.y +0.5, z=ownpos.z}).name == "air" then - self.object:setacceleration({x=0, y=-5, z=0}) + self.object:set_acceleration({x=0, y=-5, z=0}) end diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index a583a0788..45b6edbaf 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -69,7 +69,7 @@ function boat.on_rightclick(self, clicker) mcl_player.player_set_animation(clicker, "stand" , 30) local pos = clicker:get_pos() pos = {x = pos.x, y = pos.y + 0.2, z = pos.z} - clicker:setpos(pos) + clicker:set_pos(pos) elseif not self._driver then local attach = clicker:get_attach() if attach and attach:get_luaentity() then @@ -91,7 +91,7 @@ function boat.on_rightclick(self, clicker) mcl_player.player_set_animation(player, "sit" , 30) end end, name) - clicker:set_look_horizontal(self.object:getyaw()) + clicker:set_look_horizontal(self.object:get_yaw()) end end @@ -143,10 +143,10 @@ function boat.on_punch(self, puncher) end function boat.on_step(self, dtime) - self._v = get_v(self.object:getvelocity()) * get_sign(self._v) + self._v = get_v(self.object:get_velocity()) * get_sign(self._v) if self._driver then local ctrl = self._driver:get_player_control() - local yaw = self.object:getyaw() + local yaw = self.object:get_yaw() if ctrl.up then -- Forwards self._v = self._v + 0.1 @@ -174,15 +174,15 @@ function boat.on_step(self, dtime) end if ctrl.left then if self._v < 0 then - self.object:setyaw(yaw - (1 + dtime) * 0.03) + self.object:set_yaw(yaw - (1 + dtime) * 0.03) else - self.object:setyaw(yaw + (1 + dtime) * 0.03) + self.object:set_yaw(yaw + (1 + dtime) * 0.03) end elseif ctrl.right then if self._v < 0 then - self.object:setyaw(yaw + (1 + dtime) * 0.03) + self.object:set_yaw(yaw + (1 + dtime) * 0.03) else - self.object:setyaw(yaw - (1 + dtime) * 0.03) + self.object:set_yaw(yaw - (1 + dtime) * 0.03) end end else @@ -192,15 +192,15 @@ function boat.on_step(self, dtime) self._animation = 0 end end - local velo = self.object:getvelocity() + local velo = self.object:get_velocity() if self._v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then - self.object:setpos(self.object:get_pos()) + self.object:set_pos(self.object:get_pos()) return end local s = get_sign(self._v) self._v = self._v - 0.02 * s if s ~= get_sign(self._v) then - self.object:setvelocity({x = 0, y = 0, z = 0}) + self.object:set_velocity({x = 0, y = 0, z = 0}) self._v = 0 return end @@ -220,13 +220,13 @@ function boat.on_step(self, dtime) else new_acce = {x = 0, y = -9.8, z = 0} end - new_velo = get_velocity(self._v, self.object:getyaw(), - self.object:getvelocity().y) - self.object:setpos(self.object:get_pos()) + new_velo = get_velocity(self._v, self.object:get_yaw(), + self.object:get_velocity().y) + self.object:set_pos(self.object:get_pos()) else p.y = p.y + 1 if is_water(p) then - local y = self.object:getvelocity().y + local y = self.object:get_velocity().y if y >= 5 then y = 5 elseif y < 0 then @@ -234,24 +234,24 @@ function boat.on_step(self, dtime) else new_acce = {x = 0, y = 5, z = 0} end - new_velo = get_velocity(self._v, self.object:getyaw(), y) - self.object:setpos(self.object:get_pos()) + new_velo = get_velocity(self._v, self.object:get_yaw(), y) + self.object:set_pos(self.object:get_pos()) else new_acce = {x = 0, y = 0, z = 0} - if math.abs(self.object:getvelocity().y) < 1 then + if math.abs(self.object:get_velocity().y) < 1 then local pos = self.object:get_pos() pos.y = math.floor(pos.y) + boat_y_offset - self.object:setpos(pos) - new_velo = get_velocity(self._v, self.object:getyaw(), 0) + self.object:set_pos(pos) + new_velo = get_velocity(self._v, self.object:get_yaw(), 0) else - new_velo = get_velocity(self._v, self.object:getyaw(), - self.object:getvelocity().y) - self.object:setpos(self.object:get_pos()) + new_velo = get_velocity(self._v, self.object:get_yaw(), + self.object:get_velocity().y) + self.object:set_pos(self.object:get_pos()) end end end - self.object:setvelocity(new_velo) - self.object:setacceleration(new_acce) + self.object:set_velocity(new_velo) + self.object:set_acceleration(new_acce) end -- Register one entity for all boat types diff --git a/mods/ENTITIES/mcl_falling_nodes/init.lua b/mods/ENTITIES/mcl_falling_nodes/init.lua index 5f54f58d3..dfbf198e7 100644 --- a/mods/ENTITIES/mcl_falling_nodes/init.lua +++ b/mods/ENTITIES/mcl_falling_nodes/init.lua @@ -141,9 +141,9 @@ minetest.register_entity(":__builtin:falling_node", { on_step = function(self, dtime) -- Set gravity - local acceleration = self.object:getacceleration() + local acceleration = self.object:get_acceleration() if not vector.equals(acceleration, {x = 0, y = -10, z = 0}) then - self.object:setacceleration({x = 0, y = -10, z = 0}) + self.object:set_acceleration({x = 0, y = -10, z = 0}) end -- Turn to actual node when colliding with ground, or continue to move local pos = self.object:get_pos() @@ -222,7 +222,7 @@ minetest.register_entity(":__builtin:falling_node", { minetest.check_for_falling(np) return end - local vel = self.object:getvelocity() + local vel = self.object:get_velocity() -- Fix position if entity does not move if vector.equals(vel, {x = 0, y = 0, z = 0}) then local npos = vector.round(self.object:get_pos()) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 4b10cdac7..f0184ea0b 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -98,14 +98,14 @@ minetest.register_globalstep(function(dtime) local opos = object:get_pos() local vec = vector.subtract(checkpos, opos) vec = vector.add(opos, vector.divide(vec, 2)) - object:moveto(vec) + object:move_to(vec) --fix eternally falling items minetest.after(0, function(object) local lua = object:get_luaentity() if lua then - object:setacceleration({x=0, y=0, z=0}) + object:set_acceleration({x=0, y=0, z=0}) end end, object) @@ -264,7 +264,7 @@ function minetest.handle_node_drops(pos, drops, digger) if math.random(1,2) == 1 then z = -z end - obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) + obj:set_velocity({x=1/x, y=obj:get_velocity().y, z=1/z}) end end end @@ -285,7 +285,7 @@ function minetest.item_drop(itemstack, dropper, pos) v.x = v.x*4 v.y = v.y*4 + 2 v.z = v.z*4 - obj:setvelocity(v) + obj:set_velocity(v) -- Force collection delay obj:get_luaentity()._insta_collect = false return itemstack @@ -373,7 +373,7 @@ core.register_entity(":__builtin:item", { if not self or not self.object or not self.object:get_luaentity() then return end - local vel = self.object:getvelocity() + local vel = self.object:get_velocity() if vel and vel.x == 0 and vel.z == 0 then local x = math.random(1, 5) if math.random(1,2) == 1 then @@ -384,7 +384,7 @@ core.register_entity(":__builtin:item", { z = -z end local y = math.random(2,4) - self.object:setvelocity({x=1/x, y=y, z=1/z}) + self.object:set_velocity({x=1/x, y=y, z=1/z}) end end, self) end @@ -444,8 +444,8 @@ core.register_entity(":__builtin:item", { self._forcetimer = 0 self.object:set_armor_groups({immortal = 1}) - self.object:setvelocity({x = 0, y = 2, z = 0}) - self.object:setacceleration({x = 0, y = -get_gravity(), z = 0}) + self.object:set_velocity({x = 0, y = 2, z = 0}) + self.object:set_acceleration({x = 0, y = -get_gravity(), z = 0}) self:set_item(self.itemstring) end, @@ -589,8 +589,8 @@ core.register_entity(":__builtin:item", { -- Set new item moving speed accordingly local newv = vector.multiply(shootdir, 3) - self.object:setacceleration({x = 0, y = 0, z = 0}) - self.object:setvelocity(newv) + self.object:set_acceleration({x = 0, y = 0, z = 0}) + self.object:set_velocity(newv) disable_physics(self.object, self, false, false) @@ -643,8 +643,8 @@ core.register_entity(":__builtin:item", { local f = 1.39 -- Set new item moving speed into the direciton of the liquid local newv = vector.multiply(vec, f) - self.object:setacceleration({x = 0, y = 0, z = 0}) - self.object:setvelocity({x = newv.x, y = -0.22, z = newv.z}) + self.object:set_acceleration({x = 0, y = 0, z = 0}) + self.object:set_velocity({x = newv.x, y = -0.22, z = newv.z}) self.physical_state = true self._flowing = true @@ -662,7 +662,7 @@ core.register_entity(":__builtin:item", { -- If node is not registered or node is walkably solid and resting on nodebox local nn = minetest.get_node({x=p.x, y=p.y-0.5, z=p.z}).name - local v = self.object:getvelocity() + local v = self.object:get_velocity() if not core.registered_nodes[nn] or core.registered_nodes[nn].walkable and v.y == 0 then if self.physical_state then diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index 6454c3ed9..dccbb1cf2 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -61,7 +61,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) if puncher:get_player_control().sneak then if self._driver then if self._old_pos then - self.object:setpos(self._old_pos) + self.object:set_pos(self._old_pos) end mcl_player.player_attached[self._driver] = nil local player = minetest.get_player_by_name(self._driver) @@ -98,7 +98,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) return end - local vel = self.object:getvelocity() + local vel = self.object:get_velocity() if puncher:get_player_name() == self._driver then if math.abs(vel.x + vel.z) > 7 then return @@ -121,7 +121,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) end function cart:on_step(dtime) - local vel = self.object:getvelocity() + local vel = self.object:get_velocity() local update = {} if self._last_float_check == nil then self._last_float_check = 0 @@ -139,7 +139,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) -- Detach driver if self._driver then if self._old_pos then - self.object:setpos(self._old_pos) + self.object:set_pos(self._old_pos) end mcl_player.player_attached[self._driver] = nil local player = minetest.get_player_by_name(self._driver) @@ -164,7 +164,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) if self._punched then vel = vector.add(vel, self._velocity) - self.object:setvelocity(vel) + self.object:set_velocity(vel) self._old_dir.y = 0 elseif vector.equals(vel, {x=0, y=0, z=0}) then return @@ -217,8 +217,8 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) (self._old_vel.x * vel.x < 0 or self._old_vel.z * vel.z < 0) then self._old_vel = {x = 0, y = 0, z = 0} self._old_pos = pos - self.object:setvelocity(vector.new()) - self.object:setacceleration(vector.new()) + self.object:set_velocity(vector.new()) + self.object:set_acceleration(vector.new()) return end self._old_vel = vector.new(vel) @@ -292,7 +292,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) new_acc = vector.multiply(dir, acc) end - self.object:setacceleration(new_acc) + self.object:set_acceleration(new_acc) self._old_pos = vector.new(pos) self._old_dir = vector.new(dir) self._old_switch = last_switch @@ -321,7 +321,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) elseif dir.z < 0 then yaw = 1 end - self.object:setyaw(yaw * math.pi) + self.object:set_yaw(yaw * math.pi) end if self._punched then @@ -341,9 +341,9 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) end self.object:set_animation(anim, 1, 0) - self.object:setvelocity(vel) + self.object:set_velocity(vel) if update.pos then - self.object:setpos(pos) + self.object:set_pos(pos) end update = nil end @@ -387,7 +387,7 @@ mcl_minecarts.place_minecart = function(itemstack, pointed_thing) le._railtype = railtype end local cart_dir = mcl_minecarts:get_rail_direction(railpos, {x=1, y=0, z=0}, nil, nil, railtype) - cart:setyaw(minetest.dir_to_yaw(cart_dir)) + cart:set_yaw(minetest.dir_to_yaw(cart_dir)) if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 337deeb07..64e3211e8 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -137,15 +137,15 @@ local set_velocity = function(self, v) -- do not move if mob has been ordered to stay if self.order == "stand" then - self.object:setvelocity({x = 0, y = 0, z = 0}) + self.object:set_velocity({x = 0, y = 0, z = 0}) return end local yaw = (self.object:get_yaw() or 0) + self.rotate - self.object:setvelocity({ + self.object:set_velocity({ x = sin(yaw) * -v, - y = self.object:getvelocity().y, + y = self.object:get_velocity().y, z = cos(yaw) * v }) end @@ -154,7 +154,7 @@ end -- calculate mob velocity local get_velocity = function(self) - local v = self.object:getvelocity() + local v = self.object:get_velocity() return (v.x * v.x + v.z * v.z) ^ 0.5 end @@ -403,7 +403,7 @@ local item_drop = function(self, cooked) if obj and obj:get_luaentity() then - obj:setvelocity({ + obj:set_velocity({ x = random(-10, 10) / 9, y = 6, z = random(-10, 10) / 9, @@ -642,7 +642,7 @@ local do_env_damage = function(self) -- don't fall when on ignore, just stand still if self.standing_in == "ignore" then - self.object:setvelocity({x = 0, y = 0, z = 0}) + self.object:set_velocity({x = 0, y = 0, z = 0}) end local nodef = minetest.registered_nodes[self.standing_in] @@ -738,7 +738,7 @@ local do_jump = function(self) -- something stopping us while moving? if self.state ~= "stand" and get_velocity(self) > 0.5 - and self.object:getvelocity().y ~= 0 then + and self.object:get_velocity().y ~= 0 then return false end @@ -776,13 +776,13 @@ local do_jump = function(self) if not nod.name:find("fence") and not nod.name:find("gate") then - local v = self.object:getvelocity() + local v = self.object:get_velocity() v.y = self.jump_height set_animation(self, "jump") -- only when defined - self.object:setvelocity(v) + self.object:set_velocity(v) -- when in air move forward minetest.after(0.3, function(self, v) @@ -912,7 +912,7 @@ local breed = function(self) self.on_grown(self) else -- jump when fully grown so as not to fall into ground - self.object:setvelocity({ + self.object:set_velocity({ x = 0, y = self.jump_height, z = 0 @@ -1041,7 +1041,7 @@ local replace = function(self, pos) or not self.replace_rate or not self.replace_what or self.child == true - or self.object:getvelocity().y ~= 0 + or self.object:get_velocity().y ~= 0 or random(1, self.replace_rate) > 1 then return end @@ -1267,7 +1267,7 @@ local smart_mobs = function(self, s, p, dist, dtime) end s.y = s.y - sheight - self.object:setpos({x = s.x, y = s.y + 2, z = s.z}) + self.object:set_pos({x = s.x, y = s.y + 2, z = s.z}) else -- dig 2 blocks to make door toward player direction @@ -1670,7 +1670,7 @@ local follow_flop = function(self) if not flight_check(self, s) then self.state = "flop" - self.object:setvelocity({x = 0, y = -5, z = 0}) + self.object:set_velocity({x = 0, y = -5, z = 0}) set_animation(self, "stand") @@ -1944,7 +1944,7 @@ local do_states = function(self, dtime) self.timer = 0 self.blinktimer = 0 self.blinkstatus = false - self.object:settexturemod("") + self.object:set_texture_mod("") end -- walk right up to player unless the timer is active @@ -1970,9 +1970,9 @@ local do_states = function(self, dtime) self.blinktimer = 0 if self.blinkstatus then - self.object:settexturemod("") + self.object:set_texture_mod("") else - self.object:settexturemod("^[brighten") + self.object:set_texture_mod("^[brighten") end self.blinkstatus = not self.blinkstatus @@ -2026,13 +2026,13 @@ local do_states = function(self, dtime) local me_y = floor(p1.y) local p2 = p local p_y = floor(p2.y + 1) - local v = self.object:getvelocity() + local v = self.object:get_velocity() if flight_check(self, s) then if me_y < p_y then - self.object:setvelocity({ + self.object:set_velocity({ x = v.x, y = 1 * self.walk_velocity, z = v.z @@ -2040,7 +2040,7 @@ local do_states = function(self, dtime) elseif me_y > p_y then - self.object:setvelocity({ + self.object:set_velocity({ x = v.x, y = -1 * self.walk_velocity, z = v.z @@ -2049,7 +2049,7 @@ local do_states = function(self, dtime) else if me_y < p_y then - self.object:setvelocity({ + self.object:set_velocity({ x = v.x, y = 0.01, z = v.z @@ -2057,7 +2057,7 @@ local do_states = function(self, dtime) elseif me_y > p_y then - self.object:setvelocity({ + self.object:set_velocity({ x = v.x, y = -0.01, z = v.z @@ -2241,7 +2241,7 @@ local do_states = function(self, dtime) vec.y = vec.y * (v / amount) vec.z = vec.z * (v / amount) - obj:setvelocity(vec) + obj:set_velocity(vec) end end end @@ -2257,12 +2257,12 @@ local falling = function(self, pos) end -- floating in water (or falling) - local v = self.object:getvelocity() + local v = self.object:get_velocity() if v.y > 0 then -- apply gravity when moving up - self.object:setacceleration({ + self.object:set_acceleration({ x = 0, y = -10, z = 0 @@ -2271,14 +2271,14 @@ local falling = function(self, pos) elseif v.y <= 0 and v.y > self.fall_speed then -- fall downwards at set speed - self.object:setacceleration({ + self.object:set_acceleration({ x = 0, y = self.fall_speed, z = 0 }) else -- stop accelerating once max fall speed hit - self.object:setacceleration({x = 0, y = 0, z = 0}) + self.object:set_acceleration({x = 0, y = 0, z = 0}) end -- in water then float up @@ -2286,7 +2286,7 @@ local falling = function(self, pos) if self.floats == 1 then - self.object:setacceleration({ + self.object:set_acceleration({ x = 0, y = -self.fall_speed / (max(1, v.y) ^ 2), z = 0 @@ -2296,7 +2296,7 @@ local falling = function(self, pos) -- fall damage onto solid ground if self.fall_damage == 1 - and self.object:getvelocity().y == 0 then + and self.object:get_velocity().y == 0 then local d = (self.old_y or 0) - self.object:get_pos().y @@ -2475,7 +2475,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) if self.knock_back and tflp >= punch_interval then - local v = self.object:getvelocity() + local v = self.object:get_velocity() local r = 1.4 - min(punch_interval, 1.4) local kb = r * 2.0 local up = 2 @@ -2496,7 +2496,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) kb = kb * 1.5 end - self.object:setvelocity({ + self.object:set_velocity({ x = dir.x * kb, y = up, z = dir.z * kb diff --git a/mods/ENTITIES/mcl_mobs/mount.lua b/mods/ENTITIES/mcl_mobs/mount.lua index 04050eb0e..d24fc26fe 100644 --- a/mods/ENTITIES/mcl_mobs/mount.lua +++ b/mods/ENTITIES/mcl_mobs/mount.lua @@ -190,7 +190,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) end local acce_y = 0 - local velo = entity.object:getvelocity() + local velo = entity.object:get_velocity() entity.v = get_v(velo) * get_sign(entity.v) @@ -215,7 +215,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) end -- fix mob rotation - entity.object:setyaw(entity.driver:get_look_horizontal() - entity.rotate) + entity.object:set_yaw(entity.driver:get_look_horizontal() - entity.rotate) if can_fly then @@ -275,7 +275,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) if s ~= get_sign(entity.v) then - entity.object:setvelocity({x = 0, y = 0, z = 0}) + entity.object:set_velocity({x = 0, y = 0, z = 0}) entity.v = 0 return end @@ -348,7 +348,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) if math.abs(velo.y) < 1 then local pos = entity.object:get_pos() pos.y = math.floor(pos.y) + 0.5 - entity.object:setpos(pos) + entity.object:set_pos(pos) velo.y = 0 end end @@ -360,8 +360,8 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) new_velo = get_velocity(v, entity.object:get_yaw() - rot_view, velo.y) new_acce.y = new_acce.y + acce_y - entity.object:setvelocity(new_velo) - entity.object:setacceleration(new_acce) + entity.object:set_velocity(new_velo) + entity.object:set_acceleration(new_acce) -- CRASH! if enable_crash then @@ -387,7 +387,7 @@ end function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) local ctrl = entity.driver:get_player_control() - local velo = entity.object:getvelocity() + local velo = entity.object:get_velocity() local dir = entity.driver:get_look_dir() local yaw = entity.driver:get_look_horizontal() + 1.57 -- offset fix between old and new commands local rot_steer, rot_view = math.pi / 2, 0 @@ -397,24 +397,24 @@ function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) end if ctrl.up then - entity.object:setvelocity({ + entity.object:set_velocity({ x = dir.x * speed, y = dir.y * speed + 2, z = dir.z * speed }) elseif ctrl.down then - entity.object:setvelocity({ + entity.object:set_velocity({ x = -dir.x * speed, y = dir.y * speed + 2, z = -dir.z * speed }) elseif not ctrl.down or ctrl.up or ctrl.jump then - entity.object:setvelocity({x = 0, y = -2, z = 0}) + entity.object:set_velocity({x = 0, y = -2, z = 0}) end - entity.object:setyaw(yaw + math.pi + math.pi / 2 - entity.rotate) + entity.object:set_yaw(yaw + math.pi + math.pi / 2 - entity.rotate) -- firing arrows if ctrl.LMB and ctrl.sneak and shoots then @@ -431,8 +431,8 @@ function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) ent.owner_id = tostring(entity.object) -- so arrows dont hurt entity you are riding local vec = {x = dir.x * 6, y = dir.y * 6, z = dir.z * 6} local yaw = entity.driver:get_look_horizontal() - obj:setyaw(yaw + math.pi / 2) - obj:setvelocity(vec) + obj:set_yaw(yaw + math.pi / 2) + obj:set_velocity(vec) else obj:remove() end diff --git a/mods/ENTITIES/mobs_mc/2_throwing.lua b/mods/ENTITIES/mobs_mc/2_throwing.lua index 810c63f22..f2f15a1a6 100644 --- a/mods/ENTITIES/mobs_mc/2_throwing.lua +++ b/mods/ENTITIES/mobs_mc/2_throwing.lua @@ -116,9 +116,9 @@ local throwing_shoot_arrow = function(itemstack, player) local playerpos = player:get_pos() local obj = minetest.add_entity({x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, arrow[2]) --mc local dir = player:get_look_dir() - obj:setvelocity({x=dir.x*22, y=dir.y*22, z=dir.z*22}) - obj:setacceleration({x=dir.x*-3, y=-10, z=dir.z*-3}) - obj:setyaw(player:get_look_yaw()+math.pi) + obj:set_velocity({x=dir.x*22, y=dir.y*22, z=dir.z*22}) + obj:set_acceleration({x=dir.x*-3, y=-10, z=dir.z*-3}) + obj:set_yaw(player:get_look_yaw()+math.pi) minetest.sound_play("throwing_sound", {pos=playerpos}) if obj:get_luaentity().player == "" then obj:get_luaentity().player = player @@ -267,13 +267,13 @@ if c("egg") then ent.velocity = egg_VELOCITY -- needed for api internal timing ent.switch = 1 -- needed so that egg doesn't despawn straight away - obj:setvelocity({ + obj:set_velocity({ x = dir.x * egg_VELOCITY, y = dir.y * egg_VELOCITY, z = dir.z * egg_VELOCITY }) - obj:setacceleration({ + obj:set_acceleration({ x = dir.x * -3, y = -egg_GRAVITY, z = dir.z * -3 @@ -351,13 +351,13 @@ if c("snowball") then ent.velocity = snowball_VELOCITY -- needed for api internal timing ent.switch = 1 -- needed so that egg doesn't despawn straight away - obj:setvelocity({ + obj:set_velocity({ x = dir.x * snowball_VELOCITY, y = dir.y * snowball_VELOCITY, z = dir.z * snowball_VELOCITY }) - obj:setacceleration({ + obj:set_acceleration({ x = dir.x * -3, y = -snowball_GRAVITY, z = dir.z * -3 diff --git a/mods/ENTITIES/mobs_mc/3_shared.lua b/mods/ENTITIES/mobs_mc/3_shared.lua index 411033598..fce0850b4 100644 --- a/mods/ENTITIES/mobs_mc/3_shared.lua +++ b/mods/ENTITIES/mobs_mc/3_shared.lua @@ -53,7 +53,7 @@ mobs_mc.make_owner_teleport_function = function(dist, teleport_check_interval) if minetest.registered_nodes[minetest.get_node(telepos).name].walkable == false and minetest.registered_nodes[minetest.get_node(telepos_below).name].walkable == true then -- Correct position found! Let's teleport. - self.object:setpos(telepos) + self.object:set_pos(telepos) return end end diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 0f8476358..2f06c4a3b 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -101,7 +101,7 @@ mobs:register_arrow("mobs_mc:blaze_fireball", { if node.name == "air" then minetest.set_node(pos_above, {name=mobs_mc.items.fire}) else - local v = self.object:getvelocity() + local v = self.object:get_velocity() v = vector.normalize(v) local crashpos = vector.subtract(pos, v) local crashnode = minetest.get_node(crashpos) diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index 48a6aac7a..4b08db128 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -100,10 +100,10 @@ mooshroom_def.on_rightclick = function(self, clicker) minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, mobs_mc.items.mushroom_red .. " 5") end - local oldyaw = self.object:getyaw() + local oldyaw = self.object:get_yaw() self.object:remove() local cow = minetest.add_entity(pos, "mobs_mc:cow") - cow:setyaw(oldyaw) + cow:set_yaw(oldyaw) if not minetest.settings:get_bool("creative_mode") then item:add_wear(mobs_mc.misc.shears_wear) diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index 06998175c..da3054a5c 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -314,7 +314,7 @@ mobs:register_mob("mobs_mc:enderman", { end end if telepos then - self.object:setpos(telepos) + self.object:set_pos(telepos) end end end, diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 330250f38..e2d91310d 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -595,7 +595,7 @@ local function return_item(itemstack, dropper, pos, inv_p) v.x = v.x*4 v.y = v.y*4 + 2 v.z = v.z*4 - obj:setvelocity(v) + obj:set_velocity(v) obj:get_luaentity()._insta_collect = false end end diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index e3792f7e2..3d417cce9 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -163,7 +163,7 @@ lightning.strike = function(pos) posadd = {x=math.cos(angle),y=0,z=math.sin(angle)} posadd = vector.normalize(posadd) local mob = minetest.add_entity(vector.add(pos2, posadd), "mobs_mc:skeleton") - mob:setyaw(angle-math.pi/2) + mob:set_yaw(angle-math.pi/2) angle = angle + (math.pi*2) / 3 end diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 05f61aac0..bed3c4850 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -20,7 +20,7 @@ local function return_item(itemstack, dropper, pos, inv) v.x = v.x*4 v.y = v.y*4 + 2 v.z = v.z*4 - obj:setvelocity(v) + obj:set_velocity(v) obj:get_luaentity()._insta_collect = false end end diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 5e7da9d2b..a5820821c 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -310,7 +310,7 @@ function mesecon.mvps_move_objects(pos, dir, nodestack) local nn = minetest.get_node(np) if not ((not minetest.registered_nodes[nn.name]) or minetest.registered_nodes[nn.name].walkable) then - obj:setpos(np) + obj:set_pos(np) end end end diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 55a4e0b1d..14cea6a74 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -41,7 +41,7 @@ mcl_bows.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damag end obj:set_velocity({x=dir.x*power, y=dir.y*power, z=dir.z*power}) obj:set_acceleration({x=0, y=-GRAVITY, z=0}) - obj:setyaw(yaw-math.pi/2) + obj:set_yaw(yaw-math.pi/2) local le = obj:get_luaentity() le._shooter = shooter le._damage = damage diff --git a/mods/ITEMS/mcl_end/eye_of_ender.lua b/mods/ITEMS/mcl_end/eye_of_ender.lua index 131db7bbc..e15beb50b 100644 --- a/mods/ITEMS/mcl_end/eye_of_ender.lua +++ b/mods/ITEMS/mcl_end/eye_of_ender.lua @@ -35,10 +35,10 @@ minetest.register_entity("mcl_end:ender_eye", { else -- 80% to drop as an item local pos = self.object:get_pos() - local v = self.object:getvelocity() + local v = self.object:get_velocity() self.object:remove() local item = minetest.add_item(pos, "mcl_end:ender_eye") - item:setvelocity(v) + item:set_velocity(v) return end elseif self._age >= 2 then @@ -46,8 +46,8 @@ minetest.register_entity("mcl_end:ender_eye", { self._phase = 1 -- Stop the eye and wait for another second. -- The vertical speed changes are just eye candy. - self.object:setacceleration({x=0, y=-3, z=0}) - self.object:setvelocity({x=0, y=self.object:getvelocity().y*0.2, z=0}) + self.object:set_acceleration({x=0, y=-3, z=0}) + self.object:set_velocity({x=0, y=self.object:get_velocity().y*0.2, z=0}) end else -- Fly normally and generate particles @@ -126,7 +126,7 @@ minetest.register_craftitem("mcl_end:ender_eye", { local velocity = 4 -- Stronghold is close: Fly directly to stronghold and take Y into account. dir = vector.normalize(vector.direction(origin, closest_stronghold.pos)) - obj:setvelocity({x=dir.x*velocity, y=dir.y*velocity, z=dir.z*velocity}) + obj:set_velocity({x=dir.x*velocity, y=dir.y*velocity, z=dir.z*velocity}) else local velocity = 12 -- Don't care about Y if stronghold is still far away. @@ -134,8 +134,8 @@ minetest.register_craftitem("mcl_end:ender_eye", { local o = {x=origin.x, y=0, z=origin.z} local s = {x=closest_stronghold.pos.x, y=0, z=closest_stronghold.pos.z} dir = vector.normalize(vector.direction(o, s)) - obj:setacceleration({x=dir.x*-3, y=4, z=dir.z*-3}) - obj:setvelocity({x=dir.x*velocity, y=3, z=dir.z*velocity}) + obj:set_acceleration({x=dir.x*-3, y=4, z=dir.z*-3}) + obj:set_velocity({x=dir.x*velocity, y=3, z=dir.z*velocity}) end @@ -150,4 +150,4 @@ minetest.register_craft({ type = "shapeless", output = "mcl_end:ender_eye", recipe = {"mcl_mobitems:blaze_powder", "mcl_throwing:ender_pearl"}, -}) \ No newline at end of file +}) diff --git a/mods/ITEMS/mcl_fire/fire_charge.lua b/mods/ITEMS/mcl_fire/fire_charge.lua index d35ffae97..78dbade78 100644 --- a/mods/ITEMS/mcl_fire/fire_charge.lua +++ b/mods/ITEMS/mcl_fire/fire_charge.lua @@ -46,7 +46,7 @@ minetest.register_craftitem("mcl_fire:fire_charge", { local ent = fireball:get_luaentity() ent._shot_from_dispenser = true local v = ent.velocity or 1 - fireball:setvelocity(vector.multiply(dropdir, v)) + fireball:set_velocity(vector.multiply(dropdir, v)) ent.switch = 1 stack:take_item() end, diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index 2d2fffb34..52ceb6fc3 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -77,7 +77,7 @@ local update_item_entity = function(pos, node) lua:_update_texture() if node.name == "mcl_itemframes:item_frame" then local yaw = math.pi*2 - node.param2 * math.pi/2 - e:setyaw(yaw) + e:set_yaw(yaw) end end end diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index 58ec364c6..dc74b23f0 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -338,8 +338,8 @@ doll_def.on_activate = function(self, staticdata, dtime_s) mob = default_mob end set_doll_properties(self.object, mob) - self.object:setvelocity({x=0, y=0, z=0}) - self.object:setacceleration({x=0, y=0, z=0}) + self.object:set_velocity({x=0, y=0, z=0}) + self.object:set_acceleration({x=0, y=0, z=0}) self.object:set_armor_groups({immortal=1}) end diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index 64de52ba7..c2b358ea8 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -197,7 +197,7 @@ local function find_nether_target_y(target_x, target_z) local air = 4 for y = start_y, math.max(mcl_vars.mg_lava_nether_max + 1), -1 do - local nval_cave = nobj_cave:get3d({x = target_x, y = y, z = target_z}) + local nval_cave = nobj_cave:get_3d({x = target_x, y = y, z = target_z}) if nval_cave > TCAVE then -- Cavern air = air + 1 diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index c9763379a..280d02b5e 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -223,7 +223,7 @@ local update_sign = function(pos, fields, sender) text_entity:get_luaentity()._signnodename = nn text_entity:set_properties({textures={generate_texture(create_lines(text), nn)}}) - text_entity:setyaw(sign_info.yaw) + text_entity:set_yaw(sign_info.yaw) end local show_formspec = function(player, pos) @@ -359,7 +359,7 @@ minetest.register_node("mcl_signs:wall_sign", { x = place_pos.x + sign_info.delta.x, y = place_pos.y + sign_info.delta.y, z = place_pos.z + sign_info.delta.z}, "mcl_signs:text") - text_entity:setyaw(sign_info.yaw) + text_entity:set_yaw(sign_info.yaw) text_entity:get_luaentity()._signnodename = nodeitem:get_name() minetest.sound_play({name="default_place_node_hard", gain=1.0}, {pos = place_pos}) diff --git a/mods/ITEMS/mcl_throwing/init.lua b/mods/ITEMS/mcl_throwing/init.lua index ee0b4fcb1..c2402d328 100644 --- a/mods/ITEMS/mcl_throwing/init.lua +++ b/mods/ITEMS/mcl_throwing/init.lua @@ -28,8 +28,8 @@ mcl_throwing.throw = function(throw_item, pos, dir, velocity) local itemstring = ItemStack(throw_item):get_name() local obj = minetest.add_entity(pos, entity_mapping[itemstring]) - obj:setvelocity({x=dir.x*velocity, y=dir.y*velocity, z=dir.z*velocity}) - obj:setacceleration({x=dir.x*-3, y=-GRAVITY, z=dir.z*-3}) + obj:set_velocity({x=dir.x*velocity, y=dir.y*velocity, z=dir.z*velocity}) + obj:set_acceleration({x=dir.x*-3, y=-GRAVITY, z=dir.z*-3}) return obj end @@ -208,7 +208,7 @@ local pearl_on_step = function(self, dtime) -- First determine good teleport position local dir = {x=0, y=0, z=0} - local v = self.object:getvelocity() + local v = self.object:get_velocity() if walkable then local vc = table.copy(v) -- vector for calculating -- Node is walkable, we have to find a place somewhere outside of that node @@ -261,7 +261,7 @@ local pearl_on_step = function(self, dtime) local oldpos = player:get_pos() -- Teleport and hurt player - player:setpos(telepos) + player:set_pos(telepos) player:set_hp(player:get_hp() - 5) -- 5% chance to spawn endermite at the player's origin diff --git a/mods/ITEMS/mcl_tnt/init.lua b/mods/ITEMS/mcl_tnt/init.lua index fbe82c1c1..54d252f2f 100644 --- a/mods/ITEMS/mcl_tnt/init.lua +++ b/mods/ITEMS/mcl_tnt/init.lua @@ -10,7 +10,7 @@ end local function activate_if_tnt(nname, np, tnt_np, tntr) if nname == "mcl_tnt:tnt" then local e = spawn_tnt(np, nname) - e:setvelocity({x=(np.x - tnt_np.x)*5+(tntr / 4), y=(np.y - tnt_np.y)*5+(tntr / 3), z=(np.z - tnt_np.z)*5+(tntr / 4)}) + e:set_velocity({x=(np.x - tnt_np.x)*5+(tntr / 4), y=(np.y - tnt_np.y)*5+(tntr / 3), z=(np.z - tnt_np.z)*5+(tntr / 4)}) end end @@ -18,13 +18,13 @@ local function do_tnt_physics(tnt_np,tntr) local objs = minetest.get_objects_inside_radius(tnt_np, tntr) for k, obj in pairs(objs) do local ent = obj:get_luaentity() - local v = obj:getvelocity() + local v = obj:get_velocity() local p = obj:get_pos() if ent and ent.name == "mcl_tnt:tnt" then - obj:setvelocity({x=(p.x - tnt_np.x) + (tntr / 2) + v.x, y=(p.y - tnt_np.y) + tntr + v.y, z=(p.z - tnt_np.z) + (tntr / 2) + v.z}) + obj:set_velocity({x=(p.x - tnt_np.x) + (tntr / 2) + v.x, y=(p.y - tnt_np.y) + tntr + v.y, z=(p.z - tnt_np.z) + (tntr / 2) + v.z}) else if v ~= nil then - obj:setvelocity({x=(p.x - tnt_np.x) + (tntr / 4) + v.x, y=(p.y - tnt_np.y) + (tntr / 2) + v.y, z=(p.z - tnt_np.z) + (tntr / 4) + v.z}) + obj:set_velocity({x=(p.x - tnt_np.x) + (tntr / 4) + v.x, y=(p.y - tnt_np.y) + (tntr / 2) + v.y, z=(p.z - tnt_np.z) + (tntr / 4) + v.z}) else local dist = math.max(1, vector.distance(tnt_np, p)) local damage = (4 / dist) * tntr @@ -100,9 +100,9 @@ function TNT:on_activate(staticdata) local phi = math.random(0, 65535) / 65535 * 2*math.pi local hdir_x = math.cos(phi) * 0.02 local hdir_z = math.sin(phi) * 0.02 - self.object:setvelocity({x=hdir_x, y=2, z=hdir_z}) - self.object:setacceleration({x=0, y=-10, z=0}) - self.object:settexturemod("^mcl_tnt_blink.png") + self.object:set_velocity({x=hdir_x, y=2, z=hdir_z}) + self.object:set_acceleration({x=0, y=-10, z=0}) + self.object:set_texture_mod("^mcl_tnt_blink.png") end local function add_effects(pos, radius, drops) @@ -170,9 +170,9 @@ function TNT:on_step(dtime) if self.blinktimer > 0.25 then self.blinktimer = self.blinktimer - 0.25 if self.blinkstatus then - self.object:settexturemod("") + self.object:set_texture_mod("") else - self.object:settexturemod("^mcl_tnt_blink.png") + self.object:set_texture_mod("^mcl_tnt_blink.png") end self.blinkstatus = not self.blinkstatus end diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua b/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua index ae9799f9a..c4de2c522 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua @@ -433,7 +433,7 @@ if ARMOR_DROP == true or ARMOR_DESTROY == true then armor.drop_armor = function(pos, stack) local obj = minetest.add_item(pos, stack) if obj then - obj:setvelocity({x=math.random(-1, 1), y=5, z=math.random(-1, 1)}) + obj:set_velocity({x=math.random(-1, 1), y=5, z=math.random(-1, 1)}) end end minetest.register_on_dieplayer(function(player) diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua index 02eb0bcbd..c3571a6bc 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua @@ -63,7 +63,7 @@ local function update_entity(pos) yaw = math.pi / 2 end end - object:setyaw(yaw) + object:set_yaw(yaw) object:set_properties({textures={texture}}) end end diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 9a979d436..65dd895cc 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1022,7 +1022,7 @@ local function generate_clay(minp, maxp, seed, voxelmanip_data, voxelmanip_area, local surfacenode = voxelmanip_data[surface_pos] local genrnd = math.random(1, 20) - if genrnd == 1 and perlin_clay:get3d({x=cx,y=y,z=cz}) > 0 and waternode == c_water and + if genrnd == 1 and perlin_clay:get_3d({x=cx,y=y,z=cz}) > 0 and waternode == c_water and (surfacenode == c_dirt or minetest.get_item_group(minetest.get_name_from_content_id(surfacenode), "sand") == 1) then local diamondsize = math.random(1, 3) for x1 = -diamondsize, diamondsize do @@ -1062,7 +1062,7 @@ local function generate_structures(minp, maxp, seed, biomemap) local x1 = minp.x + math.floor((divx+1)*divlen) local z1 = minp.z + math.floor((divz+1)*divlen) -- Determine amount from perlin noise - local amount = math.floor(perlin_structures:get2d({x=x0, y=z0}) * 9) + local amount = math.floor(perlin_structures:get_2d({x=x0, y=z0}) * 9) -- Find random positions based on this random local pr = PseudoRandom(seed+1) for i=0, amount do @@ -1445,12 +1445,12 @@ local function generate_tree_decorations(minp, maxp, seed, data, param2_data, ar local pos = vector.add(pos, dirs[d]) local p_pos = area:index(pos.x, pos.y, pos.z) - local vine_threshold = math.max(0.33333, perlin_vines_density:get2d(pos)) + local vine_threshold = math.max(0.33333, perlin_vines_density:get_2d(pos)) if dense_vegetation then vine_threshold = vine_threshold * (2/3) end - if perlin_vines:get2d(pos) > -1.0 and perlin_vines_fine:get3d(pos) > vine_threshold and data[p_pos] == c_air then + if perlin_vines:get_2d(pos) > -1.0 and perlin_vines_fine:get_3d(pos) > vine_threshold and data[p_pos] == c_air then local rdir = {} rdir.x = -dirs[d].x @@ -1462,13 +1462,13 @@ local function generate_tree_decorations(minp, maxp, seed, data, param2_data, ar local grow_upwards = false -- Only possible on the wood, not on the leaves if i == 1 then - grow_upwards = perlin_vines_upwards:get3d(pos) > 0.8 + grow_upwards = perlin_vines_upwards:get_3d(pos) > 0.8 end if grow_upwards then -- Grow vines up 1-4 nodes, even through jungleleaves. -- This may give climbing access all the way to the top of the tree :-) -- But this will be fairly rare. - local length = math.ceil(math.abs(perlin_vines_length:get3d(pos)) * 4) + local length = math.ceil(math.abs(perlin_vines_length:get_3d(pos)) * 4) for l=0, length-1 do local t_pos = area:index(treepos.x, treepos.y, treepos.z) @@ -1486,7 +1486,7 @@ local function generate_tree_decorations(minp, maxp, seed, data, param2_data, ar end else -- Grow vines down, length between 1 and maxvinelength - local length = math.ceil(math.abs(perlin_vines_length:get3d(pos)) * maxvinelength) + local length = math.ceil(math.abs(perlin_vines_length:get_3d(pos)) * maxvinelength) for l=0, length-1 do if data[p_pos] == c_air then data[p_pos] = c_vine diff --git a/mods/MAPGEN/tsm_railcorridors/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua index 6812125eb..bfaa6916d 100644 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ b/mods/MAPGEN/tsm_railcorridors/init.lua @@ -736,13 +736,13 @@ local function create_corridor_section(waypoint, axis, sign, up_or_down, up_or_d -- Mob spawner (at center) if place_mob_spawners and tsm_railcorridors.nodes.spawner and not no_spawner and - webperlin_major:get3d(p) > 0.3 and webperlin_minor:get3d(p) > 0.5 then + webperlin_major:get_3d(p) > 0.3 and webperlin_minor:get_3d(p) > 0.5 then -- Place spawner (if activated in gameconfig), -- enclose in cobwebs and setup the spawner node. local spawner_placed = SetNodeIfCanBuild(p, {name=tsm_railcorridors.nodes.spawner}) if spawner_placed then local size = 1 - if webperlin_major:get3d(p) > 0.5 then + if webperlin_major:get_3d(p) > 0.5 then size = 2 end if place_cobwebs then @@ -765,7 +765,7 @@ local function create_corridor_section(waypoint, axis, sign, up_or_down, up_or_d if pr:next(1,5) == 1 then local h = pr:next(0, 2) -- 3 possible cobweb heights local cpos = {x=basepos.x+vek.x, y=basepos.y+h, z=basepos.z+vek.z} - if webperlin_major:get3d(cpos) > 0.05 and webperlin_minor:get3d(cpos) > 0.1 then + if webperlin_major:get_3d(cpos) > 0.05 and webperlin_minor:get_3d(cpos) > 0.1 then if h == 0 then -- No check neccessary at height offset 0 since the cobweb is on the floor return TryPlaceCobweb(cpos) From 4f8377b16141183193aea0cea92dacc60ff9550e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 05:07:42 +0100 Subject: [PATCH 036/379] Fix warning in tsm_railcorridors --- mods/MAPGEN/tsm_railcorridors/init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/MAPGEN/tsm_railcorridors/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua index bfaa6916d..3cc0d75da 100644 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ b/mods/MAPGEN/tsm_railcorridors/init.lua @@ -124,7 +124,6 @@ local function InitRandomizer(seed) -- Used for cobweb generation, both noises have to reach a high value for cobwebs to appear webperlin_major = PerlinNoise(934, 3, 0.6, 500) webperlin_minor = PerlinNoise(834, 3, 0.6, 50) - pr_inited = true end local carts_table = {} From a9776814a695f6ac3223f82f184647aa34290be4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 05:11:49 +0100 Subject: [PATCH 037/379] Fix player attachment offsets --- mods/ENTITIES/mcl_boats/init.lua | 2 +- mods/ENTITIES/mcl_minecarts/init.lua | 2 +- mods/ENTITIES/mobs_mc/horse.lua | 2 +- mods/ENTITIES/mobs_mc/llama.lua | 2 +- mods/ENTITIES/mobs_mc/pig.lua | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index 45b6edbaf..3ebcb6f9e 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -82,7 +82,7 @@ function boat.on_rightclick(self, clicker) end self._driver = clicker clicker:set_attach(self.object, "", - {x = 0, y = 3.75, z = -1}, {x = 0, y = 0, z = 0}) + {x = 0, y = 0.42, z = -1}, {x = 0, y = 0, z = 0}) clicker:set_properties({ visual_size = driver_visual_size }) mcl_player.player_attached[name] = true minetest.after(0.2, function(name) diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index dccbb1cf2..b053b1f6a 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -494,7 +494,7 @@ register_minecart( self._driver = player_name self._start_pos = self.object:get_pos() mcl_player.player_attached[player_name] = true - clicker:set_attach(self.object, "", {x=0, y=8.25, z=-2}, {x=0, y=0, z=0}) + clicker:set_attach(self.object, "", {x=0, y=-1.75, z=-2}, {x=0, y=0, z=0}) mcl_player.player_attached[name] = true minetest.after(0.2, function(name) local player = minetest.get_player_by_name(name) diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 45ff5ee81..533948a0e 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -142,7 +142,7 @@ local horse = { self.max_speed_reverse = 2 self.accel = 6 self.terrain_type = 3 - self.driver_attach_at = {x = 0, y = 7.5, z = -1.75} + self.driver_attach_at = {x = 0, y = 4.17, z = -1.75} self.driver_eye_offset = {x = 0, y = 3, z = 0} self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y} end diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mobs_mc/llama.lua index 711fb1344..e70b9a18c 100644 --- a/mods/ENTITIES/mobs_mc/llama.lua +++ b/mods/ENTITIES/mobs_mc/llama.lua @@ -69,7 +69,7 @@ mobs:register_mob("mobs_mc:llama", { self.max_speed_reverse = 2 self.accel = 4 self.terrain_type = 3 - self.driver_attach_at = {x = 0, y = 7.5, z = -1.5} + self.driver_attach_at = {x = 0, y = 4.17, z = -1.5} self.driver_eye_offset = {x = 0, y = 3, z = 0} self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y} end diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index cb6bf6a1d..1f685c2fe 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -59,7 +59,7 @@ mobs:register_mob("mobs_mc:pig", { self.max_speed_reverse = 2 self.accel = 4 self.terrain_type = 3 - self.driver_attach_at = {x = 0.0, y = 6.75, z = -1.5} + self.driver_attach_at = {x = 0.0, y = 2.75, z = -1.5} self.driver_eye_offset = {x = 0, y = 3, z = 0} self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y} end From 149d1450ef211e499d424c8b52b6c8a12426228c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 05:14:31 +0100 Subject: [PATCH 038/379] Remove console spam from mcl_loot --- mods/CORE/mcl_loot/init.lua | 3 --- 1 file changed, 3 deletions(-) diff --git a/mods/CORE/mcl_loot/init.lua b/mods/CORE/mcl_loot/init.lua index 3b52e3655..35c72539d 100644 --- a/mods/CORE/mcl_loot/init.lua +++ b/mods/CORE/mcl_loot/init.lua @@ -114,9 +114,6 @@ local function get_random_slots(max_slot) table.insert(slots_out, slots[r]) table.remove(slots, r) end - for s=1, #slots_out do - print(slots_out[s]) - end return slots_out end From 4c8433b41ccd2b3cfa8761fcdbd537e93bcf0750 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 05:21:05 +0100 Subject: [PATCH 039/379] Fix clouds speed parameter (MT 5.0.0) --- mods/ENVIRONMENT/mcl_weather/skycolor.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENVIRONMENT/mcl_weather/skycolor.lua b/mods/ENVIRONMENT/mcl_weather/skycolor.lua index 180a3f87c..196bd79ff 100644 --- a/mods/ENVIRONMENT/mcl_weather/skycolor.lua +++ b/mods/ENVIRONMENT/mcl_weather/skycolor.lua @@ -235,7 +235,7 @@ local initsky = function(player) end -- MC-style clouds: Layer 127, thickness 4, fly to the “West” - player:set_clouds({height=mcl_worlds.layer_to_y(127), speed={x=-2, y=0}, thickness=4, color="#FFF0FEF"}) + player:set_clouds({height=mcl_worlds.layer_to_y(127), speed={x=-2, z=0}, thickness=4, color="#FFF0FEF"}) end minetest.register_on_joinplayer(initsky) From 2b3922c9729ea857c062e2791ad6328ee9965a86 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 05:45:16 +0100 Subject: [PATCH 040/379] Replace deprecated player attribute calls --- mods/ITEMS/mcl_beds/functions.lua | 11 ++++++----- mods/PLAYER/mcl_hunger/api.lua | 12 ++++++------ mods/PLAYER/mcl_player/init.lua | 4 ++-- mods/PLAYER/mcl_skins/init.lua | 6 +++--- mods/PLAYER/mcl_spawn/init.lua | 15 ++++++++------- mods/PLAYER/mcl_sprint/init.lua | 2 +- mods/PLAYER/playerphysics/init.lua | 12 +++++++----- 7 files changed, 33 insertions(+), 29 deletions(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 02f72ff5b..0f5716098 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -127,7 +127,7 @@ local function lay_down(player, pos, bed_pos, state, skip) mcl_player.player_attached[name] = false playerphysics.remove_physics_factor(player, "speed", "mcl_beds:sleeping") playerphysics.remove_physics_factor(player, "jump", "mcl_beds:sleeping") - player:set_attribute("mcl_beds:sleeping", "false") + player:get_meta():set_string("mcl_beds:sleeping", "false") hud_flags.wielditem = true mcl_player.player_set_animation(player, "stand" , 30) mcl_beds.pos[name] = nil @@ -181,7 +181,7 @@ local function lay_down(player, pos, bed_pos, state, skip) player:set_look_horizontal(yaw) player:set_look_vertical(0) - player:set_attribute("mcl_beds:sleeping", "true") + player:get_meta():set_string("mcl_beds:sleeping", "true") playerphysics.add_physics_factor(player, "speed", "mcl_beds:sleeping", 0) playerphysics.add_physics_factor(player, "jump", "mcl_beds:sleeping", 0) player:set_pos(p) @@ -296,7 +296,7 @@ end function mcl_beds.on_rightclick(pos, player, is_top) -- Anti-Inception: Don't allow to sleep while you're sleeping - if player:get_attribute("mcl_beds:sleeping") == "true" then + if player:get_meta():get_string("mcl_beds:sleeping") == "true" then return end if minetest.get_modpath("mcl_worlds") then @@ -343,9 +343,10 @@ end -- Callbacks minetest.register_on_joinplayer(function(player) - if player:get_attribute("mcl_beds:sleeping") == "true" then + local meta = player:get_meta() + if meta:get_string("mcl_beds:sleeping") == "true" then -- Make player awake on joining server - player:set_attribute("mcl_beds:sleeping", "false") + meta:set_string("mcl_beds:sleeping", "false") end playerphysics.remove_physics_factor(player, "speed", "mcl_beds:sleeping") playerphysics.remove_physics_factor(player, "jump", "mcl_beds:sleeping") diff --git a/mods/PLAYER/mcl_hunger/api.lua b/mods/PLAYER/mcl_hunger/api.lua index 04c384f98..ad609e055 100644 --- a/mods/PLAYER/mcl_hunger/api.lua +++ b/mods/PLAYER/mcl_hunger/api.lua @@ -2,23 +2,23 @@ mcl_hunger.registered_foods = {} if mcl_hunger.active then function mcl_hunger.get_hunger(player) - local hunger = player:get_attribute("mcl_hunger:hunger") or 20 + local hunger = player:get_meta():get_string("mcl_hunger:hunger") or 20 return tonumber(hunger) end function mcl_hunger.get_saturation(player) - local saturation = player:get_attribute("mcl_hunger:saturation") or mcl_hunger.SATURATION_INIT + local saturation = player:get_meta():get_string("mcl_hunger:saturation") or mcl_hunger.SATURATION_INIT return tonumber(saturation) end function mcl_hunger.get_exhaustion(player) - local exhaustion = player:get_attribute("mcl_hunger:exhaustion") or 0 + local exhaustion = player:get_meta():get_string("mcl_hunger:exhaustion") or 0 return tonumber(exhaustion) end function mcl_hunger.set_hunger(player, hunger, update_hudbars) hunger = math.min(20, math.max(0, hunger)) - player:set_attribute("mcl_hunger:hunger", tostring(hunger)) + player:get_meta():set_string("mcl_hunger:hunger", tostring(hunger)) if update_hudbars ~= false then hb.change_hudbar(player, "hunger", hunger) mcl_hunger.update_saturation_hud(player, nil, hunger) @@ -28,7 +28,7 @@ if mcl_hunger.active then function mcl_hunger.set_saturation(player, saturation, update_hudbar) saturation = math.min(mcl_hunger.get_hunger(player), math.max(0, saturation)) - player:set_attribute("mcl_hunger:saturation", tostring(saturation)) + player:get_meta():set_string("mcl_hunger:saturation", tostring(saturation)) if update_hudbar ~= false then mcl_hunger.update_saturation_hud(player, saturation) end @@ -37,7 +37,7 @@ if mcl_hunger.active then function mcl_hunger.set_exhaustion(player, exhaustion, update_hudbar) exhaustion = math.min(mcl_hunger.EXHAUST_LVL, math.max(0.0, exhaustion)) - player:set_attribute("mcl_hunger:exhaustion", tostring(exhaustion)) + player:get_meta():set_string("mcl_hunger:exhaustion", tostring(exhaustion)) if update_hudbar ~= false then mcl_hunger.update_exhaustion_hud(player, exhaustion) end diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index b01c0b4d5..bd56ad804 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -75,12 +75,12 @@ function mcl_player.player_set_textures(player, textures, preview) player_textures[name] = textures player:set_properties({textures = textures,}) if preview then - player:set_attribute("mcl_player:preview", preview) + player:get_meta():set_string("mcl_player:preview", preview) end end function mcl_player.player_get_preview(player) - local preview = player:get_attribute("mcl_player:preview") + local preview = player:get_meta():get_string("mcl_player:preview") if not preview then return "player.png" else diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index cfb0ff831..e4b35435d 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -72,7 +72,7 @@ while true do end mcl_skins.cycle_skin = function(player) - local skin_id = tonumber(player:get_attribute("mcl_skins:skin_id")) + local skin_id = tonumber(player:get_meta():get_string("mcl_skins:skin_id")) if not skin_id then skin_id = 0 end @@ -106,7 +106,7 @@ mcl_skins.set_player_skin = function(player, skin_id) skin_file = skin .. ".png" mcl_skins.skins[playername] = skin mcl_skins.previews[playername] = preview - player:set_attribute("mcl_skins:skin_id", tostring(skin_id)) + player:get_meta():set_string("mcl_skins:skin_id", tostring(skin_id)) mcl_skins.update_player_skin(player) if minetest.get_modpath("3d_armor") then armor.textures[playername].skin = skin_file @@ -134,7 +134,7 @@ end minetest.register_on_joinplayer(function(player) local name = player:get_player_name() - local skin_id = player:get_attribute("mcl_skins:skin_id") + local skin_id = player:get_meta():get_string("mcl_skins:skin_id") local set_skin -- do we already have a skin in player attributes? if skin_id then diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index bf8c1344d..746beeb84 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -10,7 +10,7 @@ local mg_name = minetest.get_mapgen_setting("mg_name") mcl_spawn.get_spawn_pos = function(player) local spawn, custom_spawn = nil, false if player ~= nil and player:is_player() then - local attr = player:get_attribute("mcl_beds:spawn") + local attr = player:get_meta():get_string("mcl_beds:spawn") if attr ~= nil and attr ~= "" then spawn = minetest.string_to_pos(attr) custom_spawn = true @@ -21,7 +21,7 @@ mcl_spawn.get_spawn_pos = function(player) custom_spawn = false end if not spawn or spawn == "" then - local attr = player:get_attribute("mcl_spawn:first_spawn") + local attr = player:get_meta():get_string("mcl_spawn:first_spawn") if attr ~= nil and attr ~= "" then spawn = minetest.string_to_pos(attr) custom_spawn = false @@ -36,16 +36,17 @@ end -- changed. mcl_spawn.set_spawn_pos = function(player, pos, message) local spawn_changed = false + local meta = player:get_meta() if pos == nil then - if player:get_attribute("mcl_beds:spawn") ~= "" then + if meta:get_string("mcl_beds:spawn") ~= "" then spawn_changed = true if message then minetest.chat_send_player(player:get_player_name(), "Respawn position cleared!") end end - player:set_attribute("mcl_beds:spawn", "") + meta:set_string("mcl_beds:spawn", "") else - local oldpos = minetest.string_to_pos(player:get_attribute("mcl_beds:spawn")) + local oldpos = minetest.string_to_pos(meta:get_string("mcl_beds:spawn")) if oldpos then -- We don't bother sending a message if the new spawn pos is basically the same if vector.distance(pos, oldpos) > 0.1 then @@ -55,7 +56,7 @@ mcl_spawn.set_spawn_pos = function(player, pos, message) end end end - player:set_attribute("mcl_beds:spawn", minetest.pos_to_string(pos)) + meta:set_string("mcl_beds:spawn", minetest.pos_to_string(pos)) end return spawn_changed end @@ -99,6 +100,6 @@ end) minetest.register_on_newplayer(function(player) -- Remember where the player spawned first - player:set_attribute("mcl_spawn:first_spawn", minetest.pos_to_string(player:get_pos())) + player:get_meta():set_string("mcl_spawn:first_spawn", minetest.pos_to_string(player:get_pos())) end) diff --git a/mods/PLAYER/mcl_sprint/init.lua b/mods/PLAYER/mcl_sprint/init.lua index 123809a89..c19152907 100644 --- a/mods/PLAYER/mcl_sprint/init.lua +++ b/mods/PLAYER/mcl_sprint/init.lua @@ -107,7 +107,7 @@ minetest.register_globalstep(function(dtime) if players[playerName]["shouldSprint"] == true then --Stopped local sprinting -- Prevent sprinting if hungry or sleeping - if (mcl_hunger.active and mcl_hunger.get_hunger(player) <= 6) or (player:get_attribute("mcl_beds:sleeping") == "true")then + if (mcl_hunger.active and mcl_hunger.get_hunger(player) <= 6) or (player:get_meta():get_string("mcl_beds:sleeping") == "true")then sprinting = false else sprinting = true diff --git a/mods/PLAYER/playerphysics/init.lua b/mods/PLAYER/playerphysics/init.lua index 2b7d7df02..50d6454d3 100644 --- a/mods/PLAYER/playerphysics/init.lua +++ b/mods/PLAYER/playerphysics/init.lua @@ -1,7 +1,7 @@ playerphysics = {} local function calculate_attribute_product(player, attribute) - local a = minetest.deserialize(player:get_attribute("playerphysics:physics")) + local a = minetest.deserialize(player:get_meta():get_string("playerphysics:physics")) local product = 1 if a == nil or a[attribute] == nil then return product @@ -16,7 +16,8 @@ local function calculate_attribute_product(player, attribute) end function playerphysics.add_physics_factor(player, attribute, id, value) - local a = minetest.deserialize(player:get_attribute("playerphysics:physics")) + local meta = player:get_meta() + local a = minetest.deserialize(meta:get_string("playerphysics:physics")) if a == nil then a = { [attribute] = { [id] = value } } elseif a[attribute] == nil then @@ -24,20 +25,21 @@ function playerphysics.add_physics_factor(player, attribute, id, value) else a[attribute][id] = value end - player:set_attribute("playerphysics:physics", minetest.serialize(a)) + meta:set_string("playerphysics:physics", minetest.serialize(a)) local raw_value = calculate_attribute_product(player, attribute) player:set_physics_override({[attribute] = raw_value}) end function playerphysics.remove_physics_factor(player, attribute, id) - local a = minetest.deserialize(player:get_attribute("playerphysics:physics")) + local meta = player:get_meta() + local a = minetest.deserialize(meta:get_string("playerphysics:physics")) if a == nil or a[attribute] == nil then -- Nothing to remove return else a[attribute][id] = nil end - player:set_attribute("playerphysics:physics", minetest.serialize(a)) + meta:set_string("playerphysics:physics", minetest.serialize(a)) local raw_value = calculate_attribute_product(player, attribute) player:set_physics_override({[attribute] = raw_value}) end From c4558a31ab63dd1b67de6df3e0940ce7289096f5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 05:52:31 +0100 Subject: [PATCH 041/379] Update modpack meta files (MT 5.0.0) --- mods/CORE/modpack.txt | 0 mods/ENTITIES/modpack.txt | 0 mods/ENVIRONMENT/modpack.conf | 2 ++ mods/ENVIRONMENT/modpack.txt | 0 mods/HELP/doc/modpack.conf | 1 + mods/HELP/doc/modpack.txt | 0 mods/HELP/modpack.txt | 0 mods/HUD/modpack.txt | 0 mods/ITEMS/REDSTONE/modpack.txt | 1 - mods/ITEMS/minetest-3d_armor/modpack.txt | 0 mods/ITEMS/modpack.txt | 0 mods/MAPGEN/modpack.txt | 0 mods/MISC/modpack.txt | 0 mods/PLAYER/modpack.txt | 0 14 files changed, 3 insertions(+), 1 deletion(-) delete mode 100644 mods/CORE/modpack.txt delete mode 100644 mods/ENTITIES/modpack.txt create mode 100644 mods/ENVIRONMENT/modpack.conf delete mode 100644 mods/ENVIRONMENT/modpack.txt create mode 100644 mods/HELP/doc/modpack.conf delete mode 100644 mods/HELP/doc/modpack.txt delete mode 100644 mods/HELP/modpack.txt delete mode 100644 mods/HUD/modpack.txt delete mode 100644 mods/ITEMS/REDSTONE/modpack.txt delete mode 100644 mods/ITEMS/minetest-3d_armor/modpack.txt delete mode 100644 mods/ITEMS/modpack.txt delete mode 100644 mods/MAPGEN/modpack.txt delete mode 100644 mods/MISC/modpack.txt delete mode 100644 mods/PLAYER/modpack.txt diff --git a/mods/CORE/modpack.txt b/mods/CORE/modpack.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/mods/ENTITIES/modpack.txt b/mods/ENTITIES/modpack.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/mods/ENVIRONMENT/modpack.conf b/mods/ENVIRONMENT/modpack.conf new file mode 100644 index 000000000..8c40cfab8 --- /dev/null +++ b/mods/ENVIRONMENT/modpack.conf @@ -0,0 +1,2 @@ +name = ENVIRONMENT +description = Meta-modpack containing environment and nature-related mods for MineClone 2 diff --git a/mods/ENVIRONMENT/modpack.txt b/mods/ENVIRONMENT/modpack.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/mods/HELP/doc/modpack.conf b/mods/HELP/doc/modpack.conf new file mode 100644 index 000000000..5e2f43080 --- /dev/null +++ b/mods/HELP/doc/modpack.conf @@ -0,0 +1 @@ +name = doc diff --git a/mods/HELP/doc/modpack.txt b/mods/HELP/doc/modpack.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/mods/HELP/modpack.txt b/mods/HELP/modpack.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/mods/HUD/modpack.txt b/mods/HUD/modpack.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/mods/ITEMS/REDSTONE/modpack.txt b/mods/ITEMS/REDSTONE/modpack.txt deleted file mode 100644 index 33d91f571..000000000 --- a/mods/ITEMS/REDSTONE/modpack.txt +++ /dev/null @@ -1 +0,0 @@ -The presence of this file indicates that the current folder is a modpack. \ No newline at end of file diff --git a/mods/ITEMS/minetest-3d_armor/modpack.txt b/mods/ITEMS/minetest-3d_armor/modpack.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/mods/ITEMS/modpack.txt b/mods/ITEMS/modpack.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/mods/MAPGEN/modpack.txt b/mods/MAPGEN/modpack.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/mods/MISC/modpack.txt b/mods/MISC/modpack.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/mods/PLAYER/modpack.txt b/mods/PLAYER/modpack.txt deleted file mode 100644 index e69de29bb..000000000 From 98b3003e07f1ab85e83547dc922109f603dcfa51 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 06:25:03 +0100 Subject: [PATCH 042/379] Fix mcl_meshhand race condition --- mods/PLAYER/mcl_meshhand/init.lua | 5 ----- 1 file changed, 5 deletions(-) diff --git a/mods/PLAYER/mcl_meshhand/init.lua b/mods/PLAYER/mcl_meshhand/init.lua index 1e318a5b5..87b9e6927 100644 --- a/mods/PLAYER/mcl_meshhand/init.lua +++ b/mods/PLAYER/mcl_meshhand/init.lua @@ -17,11 +17,6 @@ if has_mcl_skins == true then }) end --change the player's hand to their skin - minetest.register_on_joinplayer(function(player) - local skin = mcl_skins.skins[player:get_player_name()] - player:get_inventory():set_stack("hand", 1, "mcl_meshhand:"..skin) - end) - mcl_skins.register_on_set_skin(function(player, skin) local name = player:get_player_name() player:get_inventory():set_stack("hand", 1, "mcl_meshhand:"..skin) From ea0c2e9568dcb9d63f777ac62307af65c9a47603 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 06:35:24 +0100 Subject: [PATCH 043/379] Utilize formspec prepend --- mods/CORE/mcl_formspec_prepend/init.lua | 6 ++++++ mods/CORE/mcl_formspec_prepend/mod.conf | 2 ++ mods/CORE/mcl_init/init.lua | 7 ------- mods/ENTITIES/mobs_mc/villager.lua | 1 - mods/HELP/mcl_craftguide/init.lua | 2 -- mods/HUD/mcl_inventory/creative.lua | 1 - mods/HUD/mcl_inventory/init.lua | 1 - mods/ITEMS/REDSTONE/mcl_dispensers/depends.txt | 1 - mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 1 - mods/ITEMS/REDSTONE/mcl_droppers/depends.txt | 1 - mods/ITEMS/REDSTONE/mcl_droppers/init.lua | 1 - mods/ITEMS/mcl_anvils/depends.txt | 1 - mods/ITEMS/mcl_anvils/init.lua | 1 - mods/ITEMS/mcl_beds/functions.lua | 2 +- mods/ITEMS/mcl_chests/depends.txt | 1 - mods/ITEMS/mcl_chests/init.lua | 5 ----- mods/ITEMS/mcl_crafting_table/depends.txt | 1 - mods/ITEMS/mcl_crafting_table/init.lua | 1 - mods/ITEMS/mcl_furnaces/depends.txt | 1 - mods/ITEMS/mcl_furnaces/init.lua | 2 -- mods/ITEMS/mcl_hoppers/init.lua | 1 - 21 files changed, 9 insertions(+), 31 deletions(-) create mode 100644 mods/CORE/mcl_formspec_prepend/init.lua create mode 100644 mods/CORE/mcl_formspec_prepend/mod.conf diff --git a/mods/CORE/mcl_formspec_prepend/init.lua b/mods/CORE/mcl_formspec_prepend/init.lua new file mode 100644 index 000000000..8babbd728 --- /dev/null +++ b/mods/CORE/mcl_formspec_prepend/init.lua @@ -0,0 +1,6 @@ +minetest.register_on_joinplayer(function(player) + local bg = ""--"bgcolor[#080808BB;true]" + local slots = "listcolors[#9990;#FFF7;#FFF0;#000;#FFF]" + local prepend = bg .. slots +-- player:set_formspec_prepend(prepend) +end) diff --git a/mods/CORE/mcl_formspec_prepend/mod.conf b/mods/CORE/mcl_formspec_prepend/mod.conf new file mode 100644 index 000000000..b724158a4 --- /dev/null +++ b/mods/CORE/mcl_formspec_prepend/mod.conf @@ -0,0 +1,2 @@ +name = mcl_formspec_prepend +description = Set formspec prepend string for all players diff --git a/mods/CORE/mcl_init/init.lua b/mods/CORE/mcl_init/init.lua index de50bf00a..fda683e0a 100644 --- a/mods/CORE/mcl_init/init.lua +++ b/mods/CORE/mcl_init/init.lua @@ -1,13 +1,6 @@ -- Some global variables (don't overwrite them!) mcl_vars = {} ---- GUI / inventory menu colors -mcl_vars.gui_slots = "listcolors[#9990;#FFF7;#FFF0;#000;#FFF]" -mcl_vars.gui_bg = "bgcolor[#080808BB;true]" -mcl_vars.gui_bg_img = "" - -mcl_vars.inventory_header = mcl_vars.gui_slots .. mcl_vars.gui_bg - -- Mapgen variables local mg_name = minetest.get_mapgen_setting("mg_name") local minecraft_height_limit = 256 diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index e2d91310d..d96dfd169 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -491,7 +491,6 @@ local function show_trade_formspec(playername, trader, tradenum) "size[9,8.75]" .."background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]" ..disabled_img - ..mcl_vars.inventory_header .."label[4,0;"..minetest.formspec_escape(profession).."]" .."list[current_player;main;0,4.5;9,3;9]" .."list[current_player;main;0,7.74;9,1;]" diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 6b3d41328..a8c75cbf6 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -315,8 +315,6 @@ function craftguide:get_formspec(player_name, is_fuel) data.pagemax = max(1, ceil(#data.items / ipp)) local formspec = "size["..data.iX..","..(iY+3)..".6;]".. - mcl_vars.gui_slots .. - mcl_vars.gui_bg .. [=[background[1,1;1,1;craftguide_bg.png;true] button[2.4,0.21;0.8,0.5;search;?] button[3.05,0.21;0.8,0.5;clear;X] diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index fcc8efddb..9bcf52bd8 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -378,7 +378,6 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz end formspec = "size[10,9.3]".. - mcl_vars.inventory_header.. "background[-0.19,-0.25;10.5,9.87;"..inv_bg.."]".. "label[-5,-5;"..name.."]".. tab(name, "blocks") .. diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index bed3c4850..cea5ffd01 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -86,7 +86,6 @@ local function set_inventory(player, armor_change_only) local form = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png]".. - mcl_vars.inventory_header.. player_preview.. --armor "list[detached:"..player_name.."_armor;armor;0,0;1,1;1]".. diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/depends.txt b/mods/ITEMS/REDSTONE/mcl_dispensers/depends.txt index c17d2db09..a6648be24 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/depends.txt +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/depends.txt @@ -1,4 +1,3 @@ -mcl_init mesecons mcl_sounds mcl_tnt diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 2c3c6b789..98b297a42 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -13,7 +13,6 @@ local setup_dispenser = function(pos) -- Set formspec and inventory local form = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]".. - mcl_vars.inventory_header.. "image[3,-0.2;5,0.75;mcl_dispensers_fnt_dispenser.png]".. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/depends.txt b/mods/ITEMS/REDSTONE/mcl_droppers/depends.txt index d8d7ca50f..3abc2f249 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/depends.txt +++ b/mods/ITEMS/REDSTONE/mcl_droppers/depends.txt @@ -1,4 +1,3 @@ -mcl_init mesecons mcl_util doc? diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua index be42e79a4..baa453e76 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua @@ -13,7 +13,6 @@ local setup_dropper = function(pos) -- Set formspec and inventory local form = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]".. - mcl_vars.inventory_header.. "image[3,-0.2;5,0.75;mcl_droppers_fnt_dropper.png]".. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. diff --git a/mods/ITEMS/mcl_anvils/depends.txt b/mods/ITEMS/mcl_anvils/depends.txt index 021df7cb0..a2749e992 100644 --- a/mods/ITEMS/mcl_anvils/depends.txt +++ b/mods/ITEMS/mcl_anvils/depends.txt @@ -1,4 +1,3 @@ -mcl_init mcl_sounds mcl_core? screwdriver? diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index 8b3717a34..790541cbe 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -15,7 +15,6 @@ local function get_anvil_formspec(set_name) end return "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;mcl_anvils_inventory.png]".. - mcl_vars.inventory_header.. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. "list[context;input;1,2.5;1,1;]".. diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 0f5716098..e91094812 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -196,7 +196,7 @@ end local function update_formspecs(finished) local ges = #minetest.get_connected_players() - local form_n = "size[8,15;true]" + local form_n = "size[8,15;true]no_prepend[]" local all_in_bed = ges == player_in_bed local night_skip = is_night_skip_enabled() local button_leave = "button_exit[2,12;4,0.75;leave;Leave bed]" diff --git a/mods/ITEMS/mcl_chests/depends.txt b/mods/ITEMS/mcl_chests/depends.txt index cd00aa229..114024130 100644 --- a/mods/ITEMS/mcl_chests/depends.txt +++ b/mods/ITEMS/mcl_chests/depends.txt @@ -1,4 +1,3 @@ -mcl_init mcl_core mcl_sounds mcl_end diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 57c991ce3..770e05bae 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -170,7 +170,6 @@ minetest.register_node("mcl_chests:"..basename, { minetest.show_formspec(clicker:get_player_name(), "mcl_chests:"..formspec_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,8.75]".. - mcl_vars.inventory_header.. "background[-0.19,-0.25;9.41,10.48;mcl_chests_inventory_chest.png]".. "image[0,-0.2;5,0.75;mcl_chests_fnt_chest.png]".. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. @@ -293,7 +292,6 @@ minetest.register_node("mcl_chests:"..basename.."_left", { "mcl_chests:"..formspec_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,11.5]".. "background[-0.19,-0.25;9.41,12.5;mcl_chests_inventory_chest_large.png]".. - mcl_vars.inventory_header.. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,3.5;9,3;]".. "list[current_player;main;0,7.5;9,3;9]".. @@ -415,7 +413,6 @@ minetest.register_node("mcl_chests:"..basename.."_right", { "size[9,11.5]".. "background[-0.19,-0.25;9.41,12.5;mcl_chests_inventory_chest_large.png]".. - mcl_vars.inventory_header.. "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,0.5;9,3;]".. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,3.5;9,3;]".. "list[current_player;main;0,7.5;9,3;9]".. @@ -618,7 +615,6 @@ minetest.register_node("mcl_chests:ender_chest", { local meta = minetest.get_meta(pos) meta:set_string("formspec", "size[9,8.75]".. - mcl_vars.inventory_header.. "background[-0.19,-0.25;9.41,10.48;mcl_chests_inventory_chest.png]".. "image[0,-0.2;5,0.75;mcl_chests_fnt_ender_chest.png]".. "list[current_player;enderchest;0,0.5;9,3;]".. @@ -713,7 +709,6 @@ for color, desc in pairs(boxtypes) do local meta = minetest.get_meta(pos) meta:set_string("formspec", "size[9,8.75]".. - mcl_vars.inventory_header.. "background[-0.19,-0.25;9.41,10.48;mcl_chests_inventory_chest.png]".. "image[0,-0.2;5,0.75;mcl_chests_fnt_shulker_box.png]".. "list[current_name;main;0,0.5;9,3;]".. diff --git a/mods/ITEMS/mcl_crafting_table/depends.txt b/mods/ITEMS/mcl_crafting_table/depends.txt index e3b8528c2..3d96266de 100644 --- a/mods/ITEMS/mcl_crafting_table/depends.txt +++ b/mods/ITEMS/mcl_crafting_table/depends.txt @@ -1,2 +1 @@ -mcl_init mcl_sounds diff --git a/mods/ITEMS/mcl_crafting_table/init.lua b/mods/ITEMS/mcl_crafting_table/init.lua index 37dc74a29..72ea0a8cd 100644 --- a/mods/ITEMS/mcl_crafting_table/init.lua +++ b/mods/ITEMS/mcl_crafting_table/init.lua @@ -14,7 +14,6 @@ minetest.register_node("mcl_crafting_table:crafting_table", { local form = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png^crafting_inventory_workbench.png]".. - mcl_vars.inventory_header.. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. "list[current_player;craft;1.75,0.5;3,3;]".. diff --git a/mods/ITEMS/mcl_furnaces/depends.txt b/mods/ITEMS/mcl_furnaces/depends.txt index 441fdfde6..017e4fb6c 100644 --- a/mods/ITEMS/mcl_furnaces/depends.txt +++ b/mods/ITEMS/mcl_furnaces/depends.txt @@ -1,4 +1,3 @@ -mcl_init mcl_core mcl_sounds mcl_craftguide diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index 9a8804fde..a81a86b36 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -6,7 +6,6 @@ local function active_formspec(fuel_percent, item_percent) return "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_inventory_furnace.png]".. - mcl_vars.inventory_header.. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. "list[current_name;src;2.75,0.5;1,1;]".. @@ -29,7 +28,6 @@ end local inactive_formspec = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_inventory_furnace.png]".. - mcl_vars.inventory_header.. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. "list[current_name;src;2.75,0.5;1,1;]".. diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index c7f7b0b9a..cced02c6a 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -6,7 +6,6 @@ local chest = minetest.get_content_id("mcl_chests:chest") local mcl_hoppers_formspec = "size[9,7]".. "background[-0.19,-0.25;9.41,10.48;mcl_hoppers_inventory.png]".. - mcl_vars.inventory_header.. "list[current_name;main;2,0.5;5,1;]".. "list[current_player;main;0,2.5;9,3;9]".. "list[current_player;main;0,5.74;9,1;]".. From 3ca01c31498eef534c21c1b5b941c10b0256c732 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 06:38:25 +0100 Subject: [PATCH 044/379] Use formspec prepend for real --- mods/CORE/mcl_formspec_prepend/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/CORE/mcl_formspec_prepend/init.lua b/mods/CORE/mcl_formspec_prepend/init.lua index 8babbd728..ac5e48de6 100644 --- a/mods/CORE/mcl_formspec_prepend/init.lua +++ b/mods/CORE/mcl_formspec_prepend/init.lua @@ -1,6 +1,6 @@ minetest.register_on_joinplayer(function(player) - local bg = ""--"bgcolor[#080808BB;true]" + local bg = "bgcolor[#080808BB;true]" local slots = "listcolors[#9990;#FFF7;#FFF0;#000;#FFF]" local prepend = bg .. slots --- player:set_formspec_prepend(prepend) + player:set_formspec_prepend(prepend) end) From 0b9c0d177c5d78a66f2d33b2c84a7babdc9f6cc2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 07:15:53 +0100 Subject: [PATCH 045/379] Fix bug in mcl_player.player.get_preview --- mods/PLAYER/mcl_player/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index bd56ad804..a766eed28 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -81,7 +81,7 @@ end function mcl_player.player_get_preview(player) local preview = player:get_meta():get_string("mcl_player:preview") - if not preview then + if preview == nil or preview == "" then return "player.png" else return preview From 581f0fa2dda04692dab9f7c32ba6f1006e7495eb Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 07:32:13 +0100 Subject: [PATCH 046/379] Move mcl_formspec_prepend --- mods/{CORE => HUD}/mcl_formspec_prepend/init.lua | 0 mods/{CORE => HUD}/mcl_formspec_prepend/mod.conf | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename mods/{CORE => HUD}/mcl_formspec_prepend/init.lua (100%) rename mods/{CORE => HUD}/mcl_formspec_prepend/mod.conf (100%) diff --git a/mods/CORE/mcl_formspec_prepend/init.lua b/mods/HUD/mcl_formspec_prepend/init.lua similarity index 100% rename from mods/CORE/mcl_formspec_prepend/init.lua rename to mods/HUD/mcl_formspec_prepend/init.lua diff --git a/mods/CORE/mcl_formspec_prepend/mod.conf b/mods/HUD/mcl_formspec_prepend/mod.conf similarity index 100% rename from mods/CORE/mcl_formspec_prepend/mod.conf rename to mods/HUD/mcl_formspec_prepend/mod.conf From cfac33a94f558b9b2a9367108f2f877bb7d0b21d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 07:32:22 +0100 Subject: [PATCH 047/379] Fix settable hand --- mods/PLAYER/mcl_player_init/init.lua | 4 ++++ mods/PLAYER/mcl_player_init/mod.conf | 2 ++ 2 files changed, 6 insertions(+) create mode 100644 mods/PLAYER/mcl_player_init/init.lua create mode 100644 mods/PLAYER/mcl_player_init/mod.conf diff --git a/mods/PLAYER/mcl_player_init/init.lua b/mods/PLAYER/mcl_player_init/init.lua new file mode 100644 index 000000000..52967a441 --- /dev/null +++ b/mods/PLAYER/mcl_player_init/init.lua @@ -0,0 +1,4 @@ +minetest.register_on_joinplayer(function(player) + -- Settable hand + player:get_inventory():set_size("hand", 1) +end) diff --git a/mods/PLAYER/mcl_player_init/mod.conf b/mods/PLAYER/mcl_player_init/mod.conf new file mode 100644 index 000000000..8d559910c --- /dev/null +++ b/mods/PLAYER/mcl_player_init/mod.conf @@ -0,0 +1,2 @@ +name = mcl_player_init +description = Initialize player gameplay stuff that are neither model nor HUD-related From 05e3a616b4d77cb183b5eae959edfdcf07030223 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 07:49:14 +0100 Subject: [PATCH 048/379] Fix broken skin init --- mods/PLAYER/mcl_skins/init.lua | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index e4b35435d..25dd17acb 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -137,19 +137,18 @@ minetest.register_on_joinplayer(function(player) local skin_id = player:get_meta():get_string("mcl_skins:skin_id") local set_skin -- do we already have a skin in player attributes? - if skin_id then + if skin_id ~= nil and skin_id ~= "" then set_skin = tonumber(skin_id) -- otherwise use random skin if not set - else + end + if not set_skin then set_skin = math.random(0, mcl_skins.skin_count) end - if set_skin then - local ok = mcl_skins.set_player_skin(player, set_skin) - if not ok then - set_skin = math.random(0, mcl_skins.skin_count) - minetest.log("warning", "[mcl_skins] Player skin for "..name.." not found, falling back to skin #"..set_skin) - mcl_skins.set_player_skin(player, set_skin) - end + local ok = mcl_skins.set_player_skin(player, set_skin) + if not ok then + set_skin = math.random(0, mcl_skins.skin_count) + minetest.log("warning", "[mcl_skins] Player skin for "..name.." not found, falling back to skin #"..set_skin) + mcl_skins.set_player_skin(player, set_skin) end end) From 5e5dcfaaa32267ec4ea6747882064723e3d28d06 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 08:40:04 +0100 Subject: [PATCH 049/379] Tweak scrollbar in creative inventory --- mods/HUD/mcl_inventory/creative.lua | 8 ++++---- .../textures/crafting_creative_down.png | Bin 621 -> 3464 bytes .../textures/crafting_creative_up.png | Bin 607 -> 3469 bytes .../crafting_inventory_creative_scroll.png | Bin 2336 -> 0 bytes .../mcl_inventory/textures/crafting_slider.png | Bin 70 -> 0 bytes .../textures/mcl_inventory_slider.png | Bin 0 -> 881 bytes .../textures/mcl_inventory_slider_bg.png | Bin 0 -> 1097 bytes 7 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 mods/HUD/mcl_inventory/textures/crafting_inventory_creative_scroll.png delete mode 100644 mods/HUD/mcl_inventory/textures/crafting_slider.png create mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_slider.png create mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_slider_bg.png diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 9bcf52bd8..e7d09ce01 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -336,13 +336,13 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz "listring[detached:"..playername.."_armor;armor]".. "listring[current_player;main]" else - inv_bg = inv_bg .. "^crafting_inventory_creative_scroll.png" -- Creative inventory slots main_list = "list[detached:creative_"..playername..";main;0,1.75;9,5;"..tostring(start_i).."]" .. -- ... and scroll bar - "image_button[9.02,1.76;"..tostring(arrow_height)..",0.6;crafting_creative_up.png;creative_prev;]".. - "image[9.033," .. tostring(slider_pos) .. ";0.78,"..tostring(slider_height) .. ";crafting_slider.png]".. - "image_button[9.02,6.15;"..tostring(arrow_height)..",0.6;crafting_creative_down.png;creative_next;]" + "image[9.033,2.230;0.78,4.525;mcl_inventory_slider_bg.png]".. + "image[9.033," .. tostring(slider_pos) .. ";0.78,"..tostring(slider_height) .. ";mcl_inventory_slider.png]".. + "image_button[9.015,1.77;0.85,0.6;crafting_creative_up.png;creative_prev;]".. + "image_button[9.015,6.15;0.85,0.6;crafting_creative_down.png;creative_next;]" end local tab_icon = { diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_down.png b/mods/HUD/mcl_inventory/textures/crafting_creative_down.png index 5a45c17322d465b26eebf1d6678ec06a1e3ffade..4f100aae05a5491129efe1600d9c8e5c9303e29d 100644 GIT binary patch delta 3285 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 Rqcs2k002ovPDHLkV1ij?X&wLo delta 397 zcmV;80doG08{Y(wBa;dXy?+5|NklRgzQCW%`n=BPj*Lq;Hu9l2Ont`jMq0 z2?bTAU&$)sQ;MyTkY+1!DcBALa%{w-;CghG=OPXT+ozj+8__AaIe)rS&P7xTcAoB* zFCZF)qC*dIiikp?t62em`l}V^ltyV~=TtZk1wn;)-tzNHbBxKqMN1@>a#?<7D z@n&FLP6J^m6#SMrrgn#YsnZt6)$$8?O`#+Q#?mt4Y2s@HFc(xAhB)ES6Y ztKWM`4Mzeso(TT~pMQ)6YBYRFVe0&rW}FG}*>B64BE$~P7eB_eT&-E4^=kQJOpAHA z!?4+YAJc%dtN7sixV9UFJfb_NMYJCr*iDDQo~Y&Q5c&>ojx=s^b|>B(({U5!I?qq% r4!c|De3~OX^|B93rPJk-BJ~+f!yS@VA80ZF0000n zy?*`r&6_uG-@bkK?%n(M?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^fBg9I^XJcB zzkdDx{rk_KKY#!J{rB(R|Ns9lT)1%L$dQbUjN;;AcX#*2ix)%4xnKZPu;lW}HlW8` zOM?7@fi#8S|9^&mYn&Mw7}&RZx;TbZFuuLZ*q$3Ias1)`-RZsoi7`$ZCifTh-&f~o zkaQ?q$Z&hBVXSIE_p+PWZ@yQ^Eqr#ZdfJc5^JgN{{U~$@KJ5!8{`$QBiv7M{+h_eb z_(VSbuYT1IQ~vOW&ummBe|`w~Y5xD`>h(X*>;DQ^na6MX|I=Bv)5mMfUOha$zNqrR z=f|JD-@Q8QypI3JyVt+(8)-Rk>!0sm`L;b@s^&g(j_2P^OSvDYDx2lVCme4|Vm!*! z#R|gPKK*BS6XCFN!HrWt8LY(ubTq_1yy8PqBEsFpD#D!;$_Q2mRNIi`2*iv>o9;_7 z-vF`>rZX{==`4r{0Aip?5eMd~ALs*{4$)ds%D(3|-;3ZkTwq-=%ku(&x-@`R8pQo~ zUmt4uY_hM}&i@PdR~%mBU#4?s!^Eh)so$@ZY&xlS|H#7kpZ;I*t(WK45EJ3v@tNfY z&>AF%Br%$6FwEc0JWrGv*{S_*RS0Wr9;_jiH5erLl7u@uRF!?cV^(Pg41u?x5PWeSEeJur0f)T* zDW*5zus*=cwILZElOS*3(Pn!SQSh7-B#acvaN9rJlLdRKi*?T~VAP?7;ZdgOP-q$e zg$5)<9&A4bkK6;#-!;f`mlzs_-rU@FQq9~7=ydKI8{M_CXXF%3ci#P(r6P<66!@T6 z0w<&$j)p~jrxG`v{Cx5)|Jz7I1H+)z+uzJHy7}bilW*np-e|7;kew&H9)V#^5q_f<{n5=(-6C}K*G}fsR77W|A4+qJk=KqOuJJ~ zs-0Iaw*v+eBs@Tw3lXpwfe*=$Fe5<@AVW@q<* zMRZ1z&C`u>Oj`=3|Ec@``TI_r2g`ql*j4{Ao6i2{*OZUf?>~vbSD{f$?tuL7mmk=E SG-`eXnds^2=d#Wzp$P!*L`*;c diff --git a/mods/HUD/mcl_inventory/textures/crafting_slider.png b/mods/HUD/mcl_inventory/textures/crafting_slider.png deleted file mode 100644 index 2e41f099b4ebf6b395a072c9c219182c1e7de3f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61SFYwH*Nw;xHyJXFea~XW1aGeaS^i$m+FP% Q*+2;fPgg&ebxsLQ0HgyB)c^nh diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_slider.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_slider.png new file mode 100644 index 0000000000000000000000000000000000000000..9808b3731c8f1dea70e73e54ee37f0b4c8f9a949 GIT binary patch literal 881 zcmV-%1CIQOP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=E5j@%#&hTl0wkAQ8A&2b0>sW<5H`$K4^GrL`> z-Aa8aC_o%zgFi#U`R(fnUr>m03`xy%$vL8=k_uN0JYMDMDW=t~lIs3O&+@SQ7#Si# zFV|~6w|<3O9}_HX`SC0d*0vqrhUhlDicHUQy!Ct=629cL-$U8+YWitA`{B0DZsV`- z$q`na$;Tl2lKqzHR%czD&F}76; zs$+`{#5!mms4Y+-MzjYd>Qrgax%x&8OH6z+md4DDWyxHO3%3O&%}Rp}czOU4mIi79 zG2d&U<+m(TPI@nYu(Xm_Sb#V4gXRWlVCjg%*I&*fG@= z-&Mnn^-(5R0YP11c5JZ5<1%q5J#tGHXMvu^6ykL>$oe*b5W%-%F(e=mGl^0rb@Alt+0EUH*TO|`g=xvfLh({ct#Ddlx?*;P zMy&@Qa->6#eAwYfIch`twA8faX3bk^wR4w_>AWKU44$uY`(ZO~4SpWb432;bRa{vG? zBLDy{BLR4&KXw2B00(qQO+^Re0|o~gEzWXQs{jB1H%UZ6R9M69&@mAJAPfYsFSaWl z7RDZjfJ8#7yL0U@sU%q*{)iGKN|Y#3q7WrYlqgZ6MDcb2f7k+%=I{}c00000NkvXX Hu0mjfef^RL literal 0 HcmV?d00001 diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_slider_bg.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_slider_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..32e6c8eac46e103083f20726c0b9700e7d4e60c6 GIT binary patch literal 1097 zcmV-P1h)H$P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3vta^xrshW~SlJ%S}61ji9yReOUy{=Q(Qv)$>L zRA$GdEi4Ox^az|V{`q@`zi^Rg4pA+qlG24MmRQ))$=7||lCHS#`-*I%rn37N`&-+mj-7a+)-@Y}ByC$b$`%xv^|r7URNgLy4==WCNZaK!l}% znn2Buwa}io?D-mH%-jinAG9g zG1_6_Ub#w*RcoqNb1l^y%BRJqEj4SomFAthbZq~gx`m#5={{(nltvsn(y)<789q^K zQ)Zkx)3ljqnf{=5s6JDp7jnO*Mu*xW7Pp;!P=ng+hYMQAi7sX!#*skW76BAAFJ@P! z7k|G2I2nd4&NT4_ z0000FP)t-sM@L7aqobXjot>SX|Ns9PT)4Ra000SaNLh0L04^f{04^f|c%?sf00007 zbV*G`2jc?<2O2P~bUJbX000?DL_t(2&tqUvA`Dy@20)cDVKAy{(5nIf@ylw3<5w;D P00000NkvXXu0mjf>lq9Q literal 0 HcmV?d00001 From 7ca999626da81e9d7099a45d0167010f63f0226f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Mar 2019 23:17:06 +0100 Subject: [PATCH 050/379] Restrict v6 generation of ice spikes to snow block --- mods/MAPGEN/mcl_mapgen_core/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 65dd895cc..5bb284793 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1251,7 +1251,7 @@ local function generate_structures(minp, maxp, seed, biomemap) if spike < 3 then -- Check surface local floor = {x=p.x+4, y=p.y-1, z=p.z+4} - local surface = minetest.find_nodes_in_area({x=p.x+1,y=p.y-1,z=p.z+1}, floor, {"mcl_core:snowblock", "mcl_core:dirt_with_grass_snow"}) + local surface = minetest.find_nodes_in_area({x=p.x+1,y=p.y-1,z=p.z+1}, floor, {"mcl_core:snowblock"}) -- Check for collision with spruce local spruce_collisions = minetest.find_nodes_in_area({x=p.x+1,y=p.y+2,z=p.z+1}, {x=p.x+4, y=p.y+6, z=p.z+4}, {"mcl_core:sprucetree", "mcl_core:spruceleaves"}) From 66c6b373a5144cf8e5dec5cb55ce77e9eb37e9d2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Mar 2019 03:53:06 +0100 Subject: [PATCH 051/379] Make many entities non-pointable --- mods/ENTITIES/drippingwater/init.lua | 1 + mods/ENTITIES/mcl_item_entity/init.lua | 1 + mods/ITEMS/mcl_banners/init.lua | 2 +- mods/ITEMS/mcl_end/eye_of_ender.lua | 1 + mods/ITEMS/mcl_itemframes/init.lua | 2 +- mods/ITEMS/mcl_mobspawners/init.lua | 4 ++-- mods/ITEMS/mcl_signs/init.lua | 2 +- mods/ITEMS/mcl_throwing/init.lua | 3 +++ mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua | 1 + 9 files changed, 12 insertions(+), 5 deletions(-) diff --git a/mods/ENTITIES/drippingwater/init.lua b/mods/ENTITIES/drippingwater/init.lua index 9aad3eb88..efa37fd2a 100644 --- a/mods/ENTITIES/drippingwater/init.lua +++ b/mods/ENTITIES/drippingwater/init.lua @@ -13,6 +13,7 @@ minetest.register_entity("drippingwater:drop_water", { physical = true, collide_with_objects = false, collisionbox = {0,0,0,0,0,0}, + pointable = false, visual = "cube", visual_size = {x=0.05, y=0.1}, textures = {water_tex, water_tex, water_tex, water_tex, water_tex, water_tex}, diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index f0184ea0b..54a568f99 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -306,6 +306,7 @@ core.register_entity(":__builtin:item", { physical = true, collide_with_objects = false, collisionbox = {-0.3, -0.3, -0.3, 0.3, 0.3, 0.3}, + pointable = false, visual = "wielditem", visual_size = {x = 0.4, y = 0.4}, textures = {""}, diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index a04d88ed5..d1df29d07 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -468,7 +468,7 @@ local entity_standing = { mesh = "amc_banner.b3d", visual_size = { x=2.499, y=2.499 }, textures = make_banner_texture(), - collisionbox = { 0, 0, 0, 0, 0, 0 }, + pointable = false, _base_color = nil, -- base color of banner _layers = nil, -- table of layers painted over the base color. diff --git a/mods/ITEMS/mcl_end/eye_of_ender.lua b/mods/ITEMS/mcl_end/eye_of_ender.lua index e15beb50b..69edbde35 100644 --- a/mods/ITEMS/mcl_end/eye_of_ender.lua +++ b/mods/ITEMS/mcl_end/eye_of_ender.lua @@ -5,6 +5,7 @@ minetest.register_entity("mcl_end:ender_eye", { textures = {"mcl_end_ender_eye.png"}, visual_size = {x=1.5, y=1.5}, collisionbox = {0,0,0,0,0,0}, + pointable = false, -- Save and restore age get_staticdata = function(self) diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index 52ceb6fc3..104379be1 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -2,8 +2,8 @@ minetest.register_entity("mcl_itemframes:item",{ hp_max = 1, visual = "wielditem", visual_size = {x=0.3,y=0.3}, - collisionbox = {0,0,0,0,0,0}, physical = false, + pointable = false, textures = { "empty.png" }, _texture = "empty.png", diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index dc74b23f0..61b72af37 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -318,8 +318,8 @@ minetest.register_node("mcl_mobspawners:spawner", { local doll_def = { hp_max = 1, - physical = true, - collisionbox = {0,0,0,0,0,0}, + physical = false, + pointable = false, visual = "mesh", makes_footstep_sound = false, timer = 0, diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index 280d02b5e..67fdf43e1 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -429,7 +429,7 @@ minetest.register_node("mcl_signs:standing_sign67_5", ssign67) -- FIXME: Prevent entity destruction by /clearobjects minetest.register_entity("mcl_signs:text", { - collisionbox = { 0, 0, 0, 0, 0, 0 }, + pointable = false, visual = "upright_sprite", textures = {}, physical = false, diff --git a/mods/ITEMS/mcl_throwing/init.lua b/mods/ITEMS/mcl_throwing/init.lua index c2402d328..f8c90dcf1 100644 --- a/mods/ITEMS/mcl_throwing/init.lua +++ b/mods/ITEMS/mcl_throwing/init.lua @@ -78,6 +78,7 @@ local snowball_ENTITY={ textures = {"mcl_throwing_snowball.png"}, visual_size = {x=0.5, y=0.5}, collisionbox = {0,0,0,0,0,0}, + pointable = false, get_staticdata = get_staticdata, on_activate = on_activate, @@ -90,6 +91,7 @@ local egg_ENTITY={ textures = {"mcl_throwing_egg.png"}, visual_size = {x=0.45, y=0.45}, collisionbox = {0,0,0,0,0,0}, + pointable = false, get_staticdata = get_staticdata, on_activate = on_activate, @@ -103,6 +105,7 @@ local pearl_ENTITY={ textures = {"mcl_throwing_ender_pearl.png"}, visual_size = {x=0.9, y=0.9}, collisionbox = {0,0,0,0,0,0}, + pointable = false, get_staticdata = get_staticdata, on_activate = on_activate, diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua index c3571a6bc..b23d069ce 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua @@ -238,6 +238,7 @@ minetest.register_entity("3d_armor_stand:armor_entity", { mesh = "3d_armor_entity.obj", visual_size = {x=1, y=1}, collisionbox = {-0.1,-0.4,-0.1, 0.1,1.3,0.1}, + pointable = false, textures = {"3d_armor_trans.png"}, pos = nil, timer = 0, From dcba7e2325986b785feef0ce5b0a5d21baef03f6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Mar 2019 04:04:21 +0100 Subject: [PATCH 052/379] Del. unneeded doc_identifier support 4 armorstand --- mods/ITEMS/minetest-3d_armor/3d_armor_stand/depends.txt | 1 - mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua | 4 ---- 2 files changed, 5 deletions(-) diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/depends.txt b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/depends.txt index 3998650d3..f3ae02169 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/depends.txt +++ b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/depends.txt @@ -2,5 +2,4 @@ mcl_core mcl_sounds mcl_stairs -doc_identifier? screwdriver? diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua index b23d069ce..cd378d6d3 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua @@ -280,10 +280,6 @@ minetest.register_lbm({ end, }) -if minetest.get_modpath("doc_identifier") ~= nil then - doc.sub.identifier.register_object("3d_armor_stand:armor_entity", "nodes", "3d_armor_stand:armor_stand") -end - minetest.register_craft({ output = "3d_armor_stand:armor_stand", recipe = { From 720bc6a56f2165522bed9f0f9f67b8471b634e44 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Mar 2019 12:41:59 +0100 Subject: [PATCH 053/379] Revert "Move mcl_formspec_prepend" This reverts commit 581f0fa2dda04692dab9f7c32ba6f1006e7495eb. --- mods/{HUD => CORE}/mcl_formspec_prepend/init.lua | 0 mods/{HUD => CORE}/mcl_formspec_prepend/mod.conf | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename mods/{HUD => CORE}/mcl_formspec_prepend/init.lua (100%) rename mods/{HUD => CORE}/mcl_formspec_prepend/mod.conf (100%) diff --git a/mods/HUD/mcl_formspec_prepend/init.lua b/mods/CORE/mcl_formspec_prepend/init.lua similarity index 100% rename from mods/HUD/mcl_formspec_prepend/init.lua rename to mods/CORE/mcl_formspec_prepend/init.lua diff --git a/mods/HUD/mcl_formspec_prepend/mod.conf b/mods/CORE/mcl_formspec_prepend/mod.conf similarity index 100% rename from mods/HUD/mcl_formspec_prepend/mod.conf rename to mods/CORE/mcl_formspec_prepend/mod.conf From 26c915059174913834c4a866ede68674d9785b58 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Mar 2019 12:42:06 +0100 Subject: [PATCH 054/379] Revert "Use formspec prepend for real" This reverts commit 3ca01c31498eef534c21c1b5b941c10b0256c732. --- mods/CORE/mcl_formspec_prepend/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/CORE/mcl_formspec_prepend/init.lua b/mods/CORE/mcl_formspec_prepend/init.lua index ac5e48de6..8babbd728 100644 --- a/mods/CORE/mcl_formspec_prepend/init.lua +++ b/mods/CORE/mcl_formspec_prepend/init.lua @@ -1,6 +1,6 @@ minetest.register_on_joinplayer(function(player) - local bg = "bgcolor[#080808BB;true]" + local bg = ""--"bgcolor[#080808BB;true]" local slots = "listcolors[#9990;#FFF7;#FFF0;#000;#FFF]" local prepend = bg .. slots - player:set_formspec_prepend(prepend) +-- player:set_formspec_prepend(prepend) end) From a84f7935fa01eea7531e3d233bd5acae7e683930 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Mar 2019 12:42:08 +0100 Subject: [PATCH 055/379] Revert "Utilize formspec prepend" This reverts commit ea0c2e9568dcb9d63f777ac62307af65c9a47603. --- mods/CORE/mcl_formspec_prepend/init.lua | 6 ------ mods/CORE/mcl_formspec_prepend/mod.conf | 2 -- mods/CORE/mcl_init/init.lua | 7 +++++++ mods/ENTITIES/mobs_mc/villager.lua | 1 + mods/HELP/mcl_craftguide/init.lua | 2 ++ mods/HUD/mcl_inventory/creative.lua | 1 + mods/HUD/mcl_inventory/init.lua | 1 + mods/ITEMS/REDSTONE/mcl_dispensers/depends.txt | 1 + mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 1 + mods/ITEMS/REDSTONE/mcl_droppers/depends.txt | 1 + mods/ITEMS/REDSTONE/mcl_droppers/init.lua | 1 + mods/ITEMS/mcl_anvils/depends.txt | 1 + mods/ITEMS/mcl_anvils/init.lua | 1 + mods/ITEMS/mcl_beds/functions.lua | 2 +- mods/ITEMS/mcl_chests/depends.txt | 1 + mods/ITEMS/mcl_chests/init.lua | 5 +++++ mods/ITEMS/mcl_crafting_table/depends.txt | 1 + mods/ITEMS/mcl_crafting_table/init.lua | 1 + mods/ITEMS/mcl_furnaces/depends.txt | 1 + mods/ITEMS/mcl_furnaces/init.lua | 2 ++ mods/ITEMS/mcl_hoppers/init.lua | 1 + 21 files changed, 31 insertions(+), 9 deletions(-) delete mode 100644 mods/CORE/mcl_formspec_prepend/init.lua delete mode 100644 mods/CORE/mcl_formspec_prepend/mod.conf diff --git a/mods/CORE/mcl_formspec_prepend/init.lua b/mods/CORE/mcl_formspec_prepend/init.lua deleted file mode 100644 index 8babbd728..000000000 --- a/mods/CORE/mcl_formspec_prepend/init.lua +++ /dev/null @@ -1,6 +0,0 @@ -minetest.register_on_joinplayer(function(player) - local bg = ""--"bgcolor[#080808BB;true]" - local slots = "listcolors[#9990;#FFF7;#FFF0;#000;#FFF]" - local prepend = bg .. slots --- player:set_formspec_prepend(prepend) -end) diff --git a/mods/CORE/mcl_formspec_prepend/mod.conf b/mods/CORE/mcl_formspec_prepend/mod.conf deleted file mode 100644 index b724158a4..000000000 --- a/mods/CORE/mcl_formspec_prepend/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = mcl_formspec_prepend -description = Set formspec prepend string for all players diff --git a/mods/CORE/mcl_init/init.lua b/mods/CORE/mcl_init/init.lua index fda683e0a..de50bf00a 100644 --- a/mods/CORE/mcl_init/init.lua +++ b/mods/CORE/mcl_init/init.lua @@ -1,6 +1,13 @@ -- Some global variables (don't overwrite them!) mcl_vars = {} +--- GUI / inventory menu colors +mcl_vars.gui_slots = "listcolors[#9990;#FFF7;#FFF0;#000;#FFF]" +mcl_vars.gui_bg = "bgcolor[#080808BB;true]" +mcl_vars.gui_bg_img = "" + +mcl_vars.inventory_header = mcl_vars.gui_slots .. mcl_vars.gui_bg + -- Mapgen variables local mg_name = minetest.get_mapgen_setting("mg_name") local minecraft_height_limit = 256 diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index d96dfd169..e2d91310d 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -491,6 +491,7 @@ local function show_trade_formspec(playername, trader, tradenum) "size[9,8.75]" .."background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]" ..disabled_img + ..mcl_vars.inventory_header .."label[4,0;"..minetest.formspec_escape(profession).."]" .."list[current_player;main;0,4.5;9,3;9]" .."list[current_player;main;0,7.74;9,1;]" diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index a8c75cbf6..6b3d41328 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -315,6 +315,8 @@ function craftguide:get_formspec(player_name, is_fuel) data.pagemax = max(1, ceil(#data.items / ipp)) local formspec = "size["..data.iX..","..(iY+3)..".6;]".. + mcl_vars.gui_slots .. + mcl_vars.gui_bg .. [=[background[1,1;1,1;craftguide_bg.png;true] button[2.4,0.21;0.8,0.5;search;?] button[3.05,0.21;0.8,0.5;clear;X] diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index e7d09ce01..536cc56a1 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -378,6 +378,7 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz end formspec = "size[10,9.3]".. + mcl_vars.inventory_header.. "background[-0.19,-0.25;10.5,9.87;"..inv_bg.."]".. "label[-5,-5;"..name.."]".. tab(name, "blocks") .. diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index cea5ffd01..bed3c4850 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -86,6 +86,7 @@ local function set_inventory(player, armor_change_only) local form = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png]".. + mcl_vars.inventory_header.. player_preview.. --armor "list[detached:"..player_name.."_armor;armor;0,0;1,1;1]".. diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/depends.txt b/mods/ITEMS/REDSTONE/mcl_dispensers/depends.txt index a6648be24..c17d2db09 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/depends.txt +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/depends.txt @@ -1,3 +1,4 @@ +mcl_init mesecons mcl_sounds mcl_tnt diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 98b297a42..2c3c6b789 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -13,6 +13,7 @@ local setup_dispenser = function(pos) -- Set formspec and inventory local form = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]".. + mcl_vars.inventory_header.. "image[3,-0.2;5,0.75;mcl_dispensers_fnt_dispenser.png]".. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/depends.txt b/mods/ITEMS/REDSTONE/mcl_droppers/depends.txt index 3abc2f249..d8d7ca50f 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/depends.txt +++ b/mods/ITEMS/REDSTONE/mcl_droppers/depends.txt @@ -1,3 +1,4 @@ +mcl_init mesecons mcl_util doc? diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua index baa453e76..be42e79a4 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua @@ -13,6 +13,7 @@ local setup_dropper = function(pos) -- Set formspec and inventory local form = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]".. + mcl_vars.inventory_header.. "image[3,-0.2;5,0.75;mcl_droppers_fnt_dropper.png]".. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. diff --git a/mods/ITEMS/mcl_anvils/depends.txt b/mods/ITEMS/mcl_anvils/depends.txt index a2749e992..021df7cb0 100644 --- a/mods/ITEMS/mcl_anvils/depends.txt +++ b/mods/ITEMS/mcl_anvils/depends.txt @@ -1,3 +1,4 @@ +mcl_init mcl_sounds mcl_core? screwdriver? diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index 790541cbe..8b3717a34 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -15,6 +15,7 @@ local function get_anvil_formspec(set_name) end return "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;mcl_anvils_inventory.png]".. + mcl_vars.inventory_header.. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. "list[context;input;1,2.5;1,1;]".. diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index e91094812..0f5716098 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -196,7 +196,7 @@ end local function update_formspecs(finished) local ges = #minetest.get_connected_players() - local form_n = "size[8,15;true]no_prepend[]" + local form_n = "size[8,15;true]" local all_in_bed = ges == player_in_bed local night_skip = is_night_skip_enabled() local button_leave = "button_exit[2,12;4,0.75;leave;Leave bed]" diff --git a/mods/ITEMS/mcl_chests/depends.txt b/mods/ITEMS/mcl_chests/depends.txt index 114024130..cd00aa229 100644 --- a/mods/ITEMS/mcl_chests/depends.txt +++ b/mods/ITEMS/mcl_chests/depends.txt @@ -1,3 +1,4 @@ +mcl_init mcl_core mcl_sounds mcl_end diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 770e05bae..57c991ce3 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -170,6 +170,7 @@ minetest.register_node("mcl_chests:"..basename, { minetest.show_formspec(clicker:get_player_name(), "mcl_chests:"..formspec_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,8.75]".. + mcl_vars.inventory_header.. "background[-0.19,-0.25;9.41,10.48;mcl_chests_inventory_chest.png]".. "image[0,-0.2;5,0.75;mcl_chests_fnt_chest.png]".. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. @@ -292,6 +293,7 @@ minetest.register_node("mcl_chests:"..basename.."_left", { "mcl_chests:"..formspec_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,11.5]".. "background[-0.19,-0.25;9.41,12.5;mcl_chests_inventory_chest_large.png]".. + mcl_vars.inventory_header.. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,3.5;9,3;]".. "list[current_player;main;0,7.5;9,3;9]".. @@ -413,6 +415,7 @@ minetest.register_node("mcl_chests:"..basename.."_right", { "size[9,11.5]".. "background[-0.19,-0.25;9.41,12.5;mcl_chests_inventory_chest_large.png]".. + mcl_vars.inventory_header.. "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,0.5;9,3;]".. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,3.5;9,3;]".. "list[current_player;main;0,7.5;9,3;9]".. @@ -615,6 +618,7 @@ minetest.register_node("mcl_chests:ender_chest", { local meta = minetest.get_meta(pos) meta:set_string("formspec", "size[9,8.75]".. + mcl_vars.inventory_header.. "background[-0.19,-0.25;9.41,10.48;mcl_chests_inventory_chest.png]".. "image[0,-0.2;5,0.75;mcl_chests_fnt_ender_chest.png]".. "list[current_player;enderchest;0,0.5;9,3;]".. @@ -709,6 +713,7 @@ for color, desc in pairs(boxtypes) do local meta = minetest.get_meta(pos) meta:set_string("formspec", "size[9,8.75]".. + mcl_vars.inventory_header.. "background[-0.19,-0.25;9.41,10.48;mcl_chests_inventory_chest.png]".. "image[0,-0.2;5,0.75;mcl_chests_fnt_shulker_box.png]".. "list[current_name;main;0,0.5;9,3;]".. diff --git a/mods/ITEMS/mcl_crafting_table/depends.txt b/mods/ITEMS/mcl_crafting_table/depends.txt index 3d96266de..e3b8528c2 100644 --- a/mods/ITEMS/mcl_crafting_table/depends.txt +++ b/mods/ITEMS/mcl_crafting_table/depends.txt @@ -1 +1,2 @@ +mcl_init mcl_sounds diff --git a/mods/ITEMS/mcl_crafting_table/init.lua b/mods/ITEMS/mcl_crafting_table/init.lua index 72ea0a8cd..37dc74a29 100644 --- a/mods/ITEMS/mcl_crafting_table/init.lua +++ b/mods/ITEMS/mcl_crafting_table/init.lua @@ -14,6 +14,7 @@ minetest.register_node("mcl_crafting_table:crafting_table", { local form = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png^crafting_inventory_workbench.png]".. + mcl_vars.inventory_header.. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. "list[current_player;craft;1.75,0.5;3,3;]".. diff --git a/mods/ITEMS/mcl_furnaces/depends.txt b/mods/ITEMS/mcl_furnaces/depends.txt index 017e4fb6c..441fdfde6 100644 --- a/mods/ITEMS/mcl_furnaces/depends.txt +++ b/mods/ITEMS/mcl_furnaces/depends.txt @@ -1,3 +1,4 @@ +mcl_init mcl_core mcl_sounds mcl_craftguide diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index a81a86b36..9a8804fde 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -6,6 +6,7 @@ local function active_formspec(fuel_percent, item_percent) return "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_inventory_furnace.png]".. + mcl_vars.inventory_header.. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. "list[current_name;src;2.75,0.5;1,1;]".. @@ -28,6 +29,7 @@ end local inactive_formspec = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_inventory_furnace.png]".. + mcl_vars.inventory_header.. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. "list[current_name;src;2.75,0.5;1,1;]".. diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index cced02c6a..c7f7b0b9a 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -6,6 +6,7 @@ local chest = minetest.get_content_id("mcl_chests:chest") local mcl_hoppers_formspec = "size[9,7]".. "background[-0.19,-0.25;9.41,10.48;mcl_hoppers_inventory.png]".. + mcl_vars.inventory_header.. "list[current_name;main;2,0.5;5,1;]".. "list[current_player;main;0,2.5;9,3;9]".. "list[current_player;main;0,5.74;9,1;]".. From 3edf8803015774e3712b63532d4fb3916d4d166f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Mar 2019 13:05:26 +0100 Subject: [PATCH 056/379] Add minimal formspec prepend --- mods/CORE/mcl_init/init.lua | 8 ++++++-- mods/HELP/mcl_craftguide/init.lua | 3 +-- mods/HUD/mcl_formspec_prepend/depends.txt | 1 + mods/HUD/mcl_formspec_prepend/init.lua | 3 +++ mods/HUD/mcl_formspec_prepend/mod.conf | 1 + 5 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 mods/HUD/mcl_formspec_prepend/depends.txt create mode 100644 mods/HUD/mcl_formspec_prepend/init.lua create mode 100644 mods/HUD/mcl_formspec_prepend/mod.conf diff --git a/mods/CORE/mcl_init/init.lua b/mods/CORE/mcl_init/init.lua index de50bf00a..7f310b9a4 100644 --- a/mods/CORE/mcl_init/init.lua +++ b/mods/CORE/mcl_init/init.lua @@ -1,12 +1,16 @@ -- Some global variables (don't overwrite them!) mcl_vars = {} ---- GUI / inventory menu colors +--- GUI / inventory menu settings mcl_vars.gui_slots = "listcolors[#9990;#FFF7;#FFF0;#000;#FFF]" +-- nonbg is added as formspec prepend in mcl_formspec_prepend +mcl_vars.gui_nonbg = mcl_vars.gui_slots + +-- Background stuff must be manually added by mods (no formspec prepend) mcl_vars.gui_bg = "bgcolor[#080808BB;true]" mcl_vars.gui_bg_img = "" -mcl_vars.inventory_header = mcl_vars.gui_slots .. mcl_vars.gui_bg +mcl_vars.inventory_header = mcl_vars.gui_bg -- Mapgen variables local mg_name = minetest.get_mapgen_setting("mg_name") diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 6b3d41328..3c8217063 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -315,8 +315,7 @@ function craftguide:get_formspec(player_name, is_fuel) data.pagemax = max(1, ceil(#data.items / ipp)) local formspec = "size["..data.iX..","..(iY+3)..".6;]".. - mcl_vars.gui_slots .. - mcl_vars.gui_bg .. + mcl_vars.inventory_header.. [=[background[1,1;1,1;craftguide_bg.png;true] button[2.4,0.21;0.8,0.5;search;?] button[3.05,0.21;0.8,0.5;clear;X] diff --git a/mods/HUD/mcl_formspec_prepend/depends.txt b/mods/HUD/mcl_formspec_prepend/depends.txt new file mode 100644 index 000000000..3b355984e --- /dev/null +++ b/mods/HUD/mcl_formspec_prepend/depends.txt @@ -0,0 +1 @@ +mcl_init diff --git a/mods/HUD/mcl_formspec_prepend/init.lua b/mods/HUD/mcl_formspec_prepend/init.lua new file mode 100644 index 000000000..0eb97de62 --- /dev/null +++ b/mods/HUD/mcl_formspec_prepend/init.lua @@ -0,0 +1,3 @@ +minetest.register_on_joinplayer(function(player) + player:set_formspec_prepend(mcl_vars.gui_nonbg) +end) diff --git a/mods/HUD/mcl_formspec_prepend/mod.conf b/mods/HUD/mcl_formspec_prepend/mod.conf new file mode 100644 index 000000000..c576d4493 --- /dev/null +++ b/mods/HUD/mcl_formspec_prepend/mod.conf @@ -0,0 +1 @@ +name = mcl_formspec_prepend From e0418553a6f0ade5f27754ae9d4fb5baa900e77f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Mar 2019 13:51:21 +0100 Subject: [PATCH 057/379] Version 0.49.0 --- README.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 2a70ceef4..e81c549d9 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.48.0 +Version: 0.49.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore @@ -75,13 +75,14 @@ These items do not work yet, but you can get them with `/giveme` for testing: * Minecart with Command Block: `mcl_minecarts:command_block_minecart` ## Installation -This game requires [Minetest](http://minetest.net) to run -(version 0.4.16 or 0.4.17). -So you need to install Minetest first. Only stable versions of Minetest are -officially supported. Minetest 5.0.0 (when released) will NOT be supported (yet). -There is no support whatsoever for running MineClone 2 in development versions of Minetest. -To install MineClone 2, move this directory into the “games” directory of -your Minetest data directory. Consult the help of Minetest to learn more. +This game requires [Minetest](http://minetest.net) to run (version 5.0.0 or +later). So you need to install Minetest first. Only stable versions of Minetest +are officially supported. +There is no support for running MineClone 2 in development versions of Minetest. + +To install MineClone 2 (if you haven't already), move this directory into the +“games” directory of your Minetest data directory. Consult the help of +Minetest to learn more. ## Project description The main goal of **MineClone 2** is to be a clone of Minecraft and to be released as free software. From 1217d9fa884b18ea9c5f2870b4a952a5cce881c6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Mar 2019 20:43:39 +0100 Subject: [PATCH 058/379] New translation system, part 1: entities --- mods/ENTITIES/mcl_boats/init.lua | 9 ++-- mods/ENTITIES/mcl_minecarts/init.lua | 22 ++++----- mods/ENTITIES/mcl_minecarts/rails.lua | 26 ++++++----- mods/ENTITIES/mcl_mobs/api.lua | 10 ++--- mods/ENTITIES/mobs_mc/1_items_default.lua | 6 +-- mods/ENTITIES/mobs_mc/2_throwing.lua | 4 +- mods/ENTITIES/mobs_mc/4_heads.lua | 4 +- mods/ENTITIES/mobs_mc/agent.lua | 4 +- mods/ENTITIES/mobs_mc/bat.lua | 4 +- mods/ENTITIES/mobs_mc/blaze.lua | 5 +-- mods/ENTITIES/mobs_mc/chicken.lua | 7 +-- mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 4 +- mods/ENTITIES/mobs_mc/creeper.lua | 7 +-- mods/ENTITIES/mobs_mc/depends.txt | 1 - mods/ENTITIES/mobs_mc/ender_dragon.lua | 4 +- mods/ENTITIES/mobs_mc/enderman.lua | 7 +-- mods/ENTITIES/mobs_mc/endermite.lua | 4 +- mods/ENTITIES/mobs_mc/ghast.lua | 6 +-- mods/ENTITIES/mobs_mc/guardian.lua | 4 +- mods/ENTITIES/mobs_mc/guardian_elder.lua | 4 +- mods/ENTITIES/mobs_mc/horse.lua | 4 +- mods/ENTITIES/mobs_mc/intllib.lua | 45 ------------------- mods/ENTITIES/mobs_mc/iron_golem.lua | 5 +-- mods/ENTITIES/mobs_mc/llama.lua | 4 +- mods/ENTITIES/mobs_mc/ocelot.lua | 4 +- mods/ENTITIES/mobs_mc/parrot.lua | 7 +-- mods/ENTITIES/mobs_mc/pig.lua | 4 +- mods/ENTITIES/mobs_mc/polar_bear.lua | 6 +-- mods/ENTITIES/mobs_mc/rabbit.lua | 4 +- mods/ENTITIES/mobs_mc/sheep.lua | 4 +- mods/ENTITIES/mobs_mc/shulker.lua | 6 +-- mods/ENTITIES/mobs_mc/silverfish.lua | 4 +- mods/ENTITIES/mobs_mc/skeleton+stray.lua | 7 +-- mods/ENTITIES/mobs_mc/skeleton_wither.lua | 4 +- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 4 +- mods/ENTITIES/mobs_mc/snowman.lua | 5 +-- mods/ENTITIES/mobs_mc/spider.lua | 6 +-- mods/ENTITIES/mobs_mc/squid.lua | 4 +- mods/ENTITIES/mobs_mc/vex.lua | 4 +- mods/ENTITIES/mobs_mc/villager.lua | 4 +- mods/ENTITIES/mobs_mc/villager_evoker.lua | 5 +-- mods/ENTITIES/mobs_mc/villager_illusioner.lua | 4 +- mods/ENTITIES/mobs_mc/villager_vindicator.lua | 5 +-- mods/ENTITIES/mobs_mc/villager_zombie.lua | 4 +- mods/ENTITIES/mobs_mc/witch.lua | 6 +-- mods/ENTITIES/mobs_mc/wither.lua | 8 +--- mods/ENTITIES/mobs_mc/wolf.lua | 4 +- mods/ENTITIES/mobs_mc/zombie.lua | 7 +-- mods/ENTITIES/mobs_mc/zombiepig.lua | 5 +-- 49 files changed, 80 insertions(+), 245 deletions(-) delete mode 100644 mods/ENTITIES/mobs_mc/intllib.lua diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index 3ebcb6f9e..32815855b 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -1,3 +1,4 @@ +local S = minetest.get_translator("mcl_boats") -- -- Helper functions -- @@ -258,7 +259,7 @@ end minetest.register_entity("mcl_boats:boat", boat) local boat_ids = { "boat", "boat_spruce", "boat_birch", "boat_jungle", "boat_acacia", "boat_dark_oak" } -local names = { "Oak Boat", "Spruce Boat", "Birch Boat", "Jungle Boat", "Acacia Boat", "Dark Oak Boat" } +local names = { S("Oak Boat"), S("Spruce Boat"), S("Birch Boat"), S("Jungle Boat"), S("Acacia Boat"), S("Dark Oak Boat") } local craftstuffs = {} if minetest.get_modpath("mcl_core") then craftstuffs = { "mcl_core:wood", "mcl_core:sprucewood", "mcl_core:birchwood", "mcl_core:junglewood", "mcl_core:acaciawood", "mcl_core:darkwood" } @@ -273,9 +274,9 @@ for b=1, #boat_ids do -- Only create one help entry for all boats if b == 1 then help = true - longdesc = "Boats are used to travel on the surface of water." - usagehelp = "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. Rightclick the boat again to leave it, punch the boat to make it drop as an item." - helpname = "Boat" + longdesc = S("Boats are used to travel on the surface of water.") + usagehelp = S("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. Rightclick the boat again to leave it, punch the boat to make it drop as an item.") + helpname = S("Boat") end minetest.register_craftitem(itemstring, { diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index b053b1f6a..0305dba2e 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_minecarts") + mcl_minecarts = {} mcl_minecarts.modpath = minetest.get_modpath("mcl_minecarts") mcl_minecarts.speed_max = 10 @@ -470,11 +472,11 @@ end register_minecart( "mcl_minecarts:minecart", "mcl_minecarts:minecart", - "Minecart", - "Minecarts can be used for a quick transportion on rails." .. "\n" .. - "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.", - "You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving." .. "\n" .. - "To obtain the minecart, punch it while holding down the sneak key.", + S("Minecart"), + S("Minecarts can be used for a quick transportion on rails.") .. "\n" .. + S("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."), + S("You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.") .. "\n" .. + S("To obtain the minecart, punch it while holding down the sneak key."), "mcl_minecarts_minecart.b3d", {"mcl_minecarts_minecart.png"}, "mcl_minecarts_minecart_normal.png", @@ -511,7 +513,7 @@ register_minecart( register_minecart( "mcl_minecarts:chest_minecart", "mcl_minecarts:chest_minecart", - "Minecart with Chest", + S("Minecart with Chest"), nil, nil, "mcl_minecarts_minecart_chest.b3d", { "mcl_chests_normal.png", "mcl_minecarts_minecart.png" }, @@ -523,7 +525,7 @@ register_minecart( register_minecart( "mcl_minecarts:furnace_minecart", "mcl_minecarts:furnace_minecart", - "Minecart with Furnace", + S("Minecart with Furnace"), nil, nil, "mcl_minecarts_minecart_block.b3d", { @@ -566,7 +568,7 @@ register_minecart( register_minecart( "mcl_minecarts:command_block_minecart", "mcl_minecarts:command_block_minecart", - "Minecart with Command Block", + S("Minecart with Command Block"), nil, nil, "mcl_minecarts_minecart_block.b3d", { @@ -587,7 +589,7 @@ register_minecart( register_minecart( "mcl_minecarts:hopper_minecart", "mcl_minecarts:hopper_minecart", - "Minecart with Hopper", + S("Minecart with Hopper"), nil, nil, "mcl_minecarts_minecart_hopper.b3d", { @@ -605,7 +607,7 @@ register_minecart( register_minecart( "mcl_minecarts:tnt_minecart", "mcl_minecarts:tnt_minecart", - "Minecart with TNT", + S("Minecart with TNT"), nil, nil, "mcl_minecarts_minecart_block.b3d", { diff --git a/mods/ENTITIES/mcl_minecarts/rails.lua b/mods/ENTITIES/mcl_minecarts/rails.lua index 04f420f8d..f288ce049 100644 --- a/mods/ENTITIES/mcl_minecarts/rails.lua +++ b/mods/ENTITIES/mcl_minecarts/rails.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_minecarts") + -- Template rail function local register_rail = function(itemstring, tiles, def_extras, creative) local groups = {handy=1,pickaxey=1, attached_node=1,rail=1,connect_to_raillike=1,dig_by_water=1,destroy_by_lava_flow=1, transport=1} @@ -64,14 +66,14 @@ local rail_rules_long = local rail_rules_short = mesecon.rules.pplate -local railuse = "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." +local railuse = S("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.") -- Normal rail register_rail("mcl_minecarts:rail", {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"}, { - description = "Rail", - _doc_items_longdesc = "Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.", + description = S("Rail"), + _doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction."), _doc_items_usagehelp = railuse, } ) @@ -80,9 +82,9 @@ register_rail("mcl_minecarts:rail", register_rail("mcl_minecarts:golden_rail", {"mcl_minecarts_rail_golden.png", "mcl_minecarts_rail_golden_curved.png", "mcl_minecarts_rail_golden_t_junction.png", "mcl_minecarts_rail_golden_crossing.png"}, { - description = "Powered Rail", - _doc_items_longdesc = "Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.", - _doc_items_usagehelp = railuse .. "\n" .. "Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.", + description = S("Powered Rail"), + _doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts."), + _doc_items_usagehelp = railuse .. "\n" .. S("Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power."), _rail_acceleration = -3, mesecons = { conductor = { @@ -118,9 +120,9 @@ register_rail("mcl_minecarts:golden_rail_on", register_rail("mcl_minecarts:activator_rail", {"mcl_minecarts_rail_activator.png", "mcl_minecarts_rail_activator_curved.png", "mcl_minecarts_rail_activator_t_junction.png", "mcl_minecarts_rail_activator_crossing.png"}, { - description = "Activator Rail", - _doc_items_longdesc = "Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.", - _doc_items_usagehelp = railuse .. "\n" .. "To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.", + description = S("Activator Rail"), + _doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts."), + _doc_items_usagehelp = railuse .. "\n" .. S("To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail."), mesecons = { conductor = { state = mesecon.state.off, @@ -157,9 +159,9 @@ register_rail("mcl_minecarts:activator_rail_on", register_rail("mcl_minecarts:detector_rail", {"mcl_minecarts_rail_detector.png", "mcl_minecarts_rail_detector_curved.png", "mcl_minecarts_rail_detector_t_junction.png", "mcl_minecarts_rail_detector_crossing.png"}, { - description = "Detector Rail", - _doc_items_longdesc = "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.", - _doc_items_usagehelp = railuse .. "\n" .. "To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.", + description = S("Detector Rail"), + _doc_items_longdesc = S("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."), + _doc_items_usagehelp = railuse .. "\n" .. S("To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail."), mesecons = { receptor = { state = mesecon.state.off, diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 64e3211e8..3c2d61bd8 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -9,7 +9,7 @@ local MAX_MOB_NAME_LENGTH = 30 -- Intllib local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP .. "/intllib.lua") +local S = minetest.get_translator("mcl_mobs") mobs.intllib = S @@ -71,7 +71,7 @@ local mobs_spawn_chance = tonumber(minetest.settings:get("mobs_spawn_chance") or if peaceful_only then minetest.register_on_joinplayer(function(player) minetest.chat_send_player(player:get_player_name(), - S("** Peaceful Mode Active - No Monsters Will Spawn")) + S("Peaceful mode active! No monsters will spawn.")) end) end @@ -3562,8 +3562,8 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) inventory_image = invimg, groups = grp, - _doc_items_longdesc = "This allows you to place a single mob.", - _doc_items_usagehelp = "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.", + _doc_items_longdesc = S("This allows you to place a single mob."), + _doc_items_usagehelp = S("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."), on_place = function(itemstack, placer, pointed_thing) @@ -3588,7 +3588,7 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) return itemstack end if not privs.maphack then - minetest.chat_send_player(name, "You need the “maphack” privilege to change the mob spawner.") + minetest.chat_send_player(name, S("You need the “maphack” privilege to change the mob spawner.")) return itemstack end mcl_mobspawners.setup_spawner(pointed_thing.under, itemstack:get_name()) diff --git a/mods/ENTITIES/mobs_mc/1_items_default.lua b/mods/ENTITIES/mobs_mc/1_items_default.lua index f705b7826..37d54a076 100644 --- a/mods/ENTITIES/mobs_mc/1_items_default.lua +++ b/mods/ENTITIES/mobs_mc/1_items_default.lua @@ -3,13 +3,9 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes - ---dofile(minetest.get_modpath("mobs").."/api.lua") --THIS IS THE MASTER ITEM LIST TO USE WITH DEFAULT --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") local c = mobs_mc.is_item_variable_overridden diff --git a/mods/ENTITIES/mobs_mc/2_throwing.lua b/mods/ENTITIES/mobs_mc/2_throwing.lua index f2f15a1a6..1e4c0a551 100644 --- a/mods/ENTITIES/mobs_mc/2_throwing.lua +++ b/mods/ENTITIES/mobs_mc/2_throwing.lua @@ -3,9 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") --maikerumines throwing code --arrow (weapon) diff --git a/mods/ENTITIES/mobs_mc/4_heads.lua b/mods/ENTITIES/mobs_mc/4_heads.lua index 80c971988..b60cd168e 100644 --- a/mods/ENTITIES/mobs_mc/4_heads.lua +++ b/mods/ENTITIES/mobs_mc/4_heads.lua @@ -1,9 +1,7 @@ --MC Heads for minetest --maikerumine --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") -- Heads system diff --git a/mods/ENTITIES/mobs_mc/agent.lua b/mods/ENTITIES/mobs_mc/agent.lua index 9de2292e8..cc4bc0dad 100644 --- a/mods/ENTITIES/mobs_mc/agent.lua +++ b/mods/ENTITIES/mobs_mc/agent.lua @@ -2,9 +2,7 @@ --################### AGENT --################### --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:agent", { type = "npc", diff --git a/mods/ENTITIES/mobs_mc/bat.lua b/mods/ENTITIES/mobs_mc/bat.lua index 6021b424f..10e7a3adb 100644 --- a/mods/ENTITIES/mobs_mc/bat.lua +++ b/mods/ENTITIES/mobs_mc/bat.lua @@ -1,8 +1,6 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:bat", { type = "animal", diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 2f06c4a3b..34ee630fc 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -3,11 +3,8 @@ -- Model and mobs_blaze.png see https://github.com/22i/minecraft-voxel-blender-models -- blaze.lua partial copy of mobs_mc/ghast.lua --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") ---dofile(minetest.get_modpath("mobs").."/api.lua") --################### --################### BLAZE --################### diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua index 0c3d0510f..fec0bb53e 100644 --- a/mods/ENTITIES/mobs_mc/chicken.lua +++ b/mods/ENTITIES/mobs_mc/chicken.lua @@ -1,11 +1,6 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - - ---dofile(minetest.get_modpath("mobs").."/api.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### CHICKEN diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index 4b08db128..83d89ff15 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -1,8 +1,6 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") local cow_def = { type = "animal", diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 77fd06ac7..77737997c 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -1,11 +1,6 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") - +local S = minetest.get_translator("mobs_mc") --################### --################### CREEPER diff --git a/mods/ENTITIES/mobs_mc/depends.txt b/mods/ENTITIES/mobs_mc/depends.txt index 2b399cc63..b37d4adb9 100644 --- a/mods/ENTITIES/mobs_mc/depends.txt +++ b/mods/ENTITIES/mobs_mc/depends.txt @@ -8,5 +8,4 @@ mcl_fishing? bones? mesecons_materials? mobs_mc_gameconfig? -intllib? doc_items? diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index 1492fde53..8bcd25416 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -2,9 +2,7 @@ --################### ENDERDRAGON --################### --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") --[[ mobs:register_mob("mobs_mc:12enderdragon", { diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index da3054a5c..6af9ebe4a 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -10,12 +10,7 @@ -- and they are provoked by looking directly at them. -- TODO: Implement MC behaviour. --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") - +local S = minetest.get_translator("mobs_mc") --################### --################### ENDERMAN diff --git a/mods/ENTITIES/mobs_mc/endermite.lua b/mods/ENTITIES/mobs_mc/endermite.lua index 6cdcaf765..0776ca47b 100644 --- a/mods/ENTITIES/mobs_mc/endermite.lua +++ b/mods/ENTITIES/mobs_mc/endermite.lua @@ -2,9 +2,7 @@ --################### ENDERMITE --################### --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:endermite", { type = "monster", diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index 26912f43f..2ed0fb952 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -3,11 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### GHAST diff --git a/mods/ENTITIES/mobs_mc/guardian.lua b/mods/ENTITIES/mobs_mc/guardian.lua index 56bda522f..89ad0964a 100644 --- a/mods/ENTITIES/mobs_mc/guardian.lua +++ b/mods/ENTITIES/mobs_mc/guardian.lua @@ -4,9 +4,7 @@ --################### GUARDIAN --################### --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:guardian", { type = "monster", diff --git a/mods/ENTITIES/mobs_mc/guardian_elder.lua b/mods/ENTITIES/mobs_mc/guardian_elder.lua index 11dba11a9..85ad5053f 100644 --- a/mods/ENTITIES/mobs_mc/guardian_elder.lua +++ b/mods/ENTITIES/mobs_mc/guardian_elder.lua @@ -4,9 +4,7 @@ --################### GUARDIAN --################### --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:guardian_elder", { type = "monster", diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 533948a0e..c20543003 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -3,9 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### HORSE diff --git a/mods/ENTITIES/mobs_mc/intllib.lua b/mods/ENTITIES/mobs_mc/intllib.lua deleted file mode 100644 index 6669d7202..000000000 --- a/mods/ENTITIES/mobs_mc/intllib.lua +++ /dev/null @@ -1,45 +0,0 @@ - --- Fallback functions for when `intllib` is not installed. --- Code released under Unlicense . - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mobs_mc/iron_golem.lua index ebd93dc64..9ca88ba5d 100644 --- a/mods/ENTITIES/mobs_mc/iron_golem.lua +++ b/mods/ENTITIES/mobs_mc/iron_golem.lua @@ -3,11 +3,8 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") ---dofile(minetest.get_modpath("mobs").."/api.lua") --################### --################### IRON GOLEM --################### diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mobs_mc/llama.lua index e70b9a18c..a69db0bac 100644 --- a/mods/ENTITIES/mobs_mc/llama.lua +++ b/mods/ENTITIES/mobs_mc/llama.lua @@ -1,6 +1,4 @@ --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### LLAMA diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua index 58a7d94f9..634d77a3f 100644 --- a/mods/ENTITIES/mobs_mc/ocelot.lua +++ b/mods/ENTITIES/mobs_mc/ocelot.lua @@ -3,9 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### OCELOT AND CAT diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua index 89e4c77fc..7e465e8f5 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mobs_mc/parrot.lua @@ -3,12 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") - +local S = minetest.get_translator("mobs_mc") --################### --################### PARROT diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index 1f685c2fe..2b10c99be 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -1,8 +1,6 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:pig", { type = "animal", diff --git a/mods/ENTITIES/mobs_mc/polar_bear.lua b/mods/ENTITIES/mobs_mc/polar_bear.lua index 84da77e7a..1db07e0f2 100644 --- a/mods/ENTITIES/mobs_mc/polar_bear.lua +++ b/mods/ENTITIES/mobs_mc/polar_bear.lua @@ -1,10 +1,6 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### POLARBEAR diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua index a92c93f94..ea71d788e 100644 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ b/mods/ENTITIES/mobs_mc/rabbit.lua @@ -1,8 +1,6 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") local rabbit = { type = "animal", diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index 9ddf9e039..c734cfe28 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -1,8 +1,6 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### SHEEP diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index ddb17e7c3..0d23a14f5 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -3,11 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### SHULKER diff --git a/mods/ENTITIES/mobs_mc/silverfish.lua b/mods/ENTITIES/mobs_mc/silverfish.lua index dc2a9c92b..77415b400 100644 --- a/mods/ENTITIES/mobs_mc/silverfish.lua +++ b/mods/ENTITIES/mobs_mc/silverfish.lua @@ -2,9 +2,7 @@ --################### SILVERFISH --################### --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:silverfish", { type = "monster", diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index a10fef5ec..35cc9ed8c 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -3,12 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") - +local S = minetest.get_translator("mobs_mc") --################### --################### SKELETON diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua index cd932129c..16f353cee 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua @@ -3,9 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### WITHER SKELETON diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 2c21dcfa8..da52d3bcf 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -1,8 +1,6 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") -- Returns a function that spawns children in a circle around pos. -- To be used as on_die callback. diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua index 1c1ad6860..f0f8fc4fb 100644 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ b/mods/ENTITIES/mobs_mc/snowman.lua @@ -3,9 +3,8 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") + local snow_trail_frequency = 0.5 -- Time in seconds for checking to add a new snow trail local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false diff --git a/mods/ENTITIES/mobs_mc/spider.lua b/mods/ENTITIES/mobs_mc/spider.lua index 2fe6ae53a..9ec7f44b9 100644 --- a/mods/ENTITIES/mobs_mc/spider.lua +++ b/mods/ENTITIES/mobs_mc/spider.lua @@ -3,11 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### SPIDER diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua index 721f861b8..b22ca08f4 100644 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ b/mods/ENTITIES/mobs_mc/squid.lua @@ -4,9 +4,7 @@ --################### SQUID --################### --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:squid", { type = "animal", diff --git a/mods/ENTITIES/mobs_mc/vex.lua b/mods/ENTITIES/mobs_mc/vex.lua index 01f7af707..692783e08 100644 --- a/mods/ENTITIES/mobs_mc/vex.lua +++ b/mods/ENTITIES/mobs_mc/vex.lua @@ -3,9 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### VEX diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index e2d91310d..4357cebcc 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -19,9 +19,7 @@ -- TODO: Internal inventory, pick up items, trade with other villagers -- TODO: Farm stuff --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") -- playername-indexed table containing the previously used tradenum local player_tradenum = {} diff --git a/mods/ENTITIES/mobs_mc/villager_evoker.lua b/mods/ENTITIES/mobs_mc/villager_evoker.lua index 6d9fc87a4..22af9d4b5 100644 --- a/mods/ENTITIES/mobs_mc/villager_evoker.lua +++ b/mods/ENTITIES/mobs_mc/villager_evoker.lua @@ -3,11 +3,8 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") ---dofile(minetest.get_modpath("mobs").."/api.lua") --################### --################### EVOKER --################### diff --git a/mods/ENTITIES/mobs_mc/villager_illusioner.lua b/mods/ENTITIES/mobs_mc/villager_illusioner.lua index e6d1b2c91..de4ee89d1 100644 --- a/mods/ENTITIES/mobs_mc/villager_illusioner.lua +++ b/mods/ENTITIES/mobs_mc/villager_illusioner.lua @@ -3,9 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:illusioner", { type = "monster", diff --git a/mods/ENTITIES/mobs_mc/villager_vindicator.lua b/mods/ENTITIES/mobs_mc/villager_vindicator.lua index 82eff89be..9558074a7 100644 --- a/mods/ENTITIES/mobs_mc/villager_vindicator.lua +++ b/mods/ENTITIES/mobs_mc/villager_vindicator.lua @@ -3,11 +3,8 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") ---dofile(minetest.get_modpath("mobs").."/api.lua") --################### --################### VINDICATOR --################### diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua index f340c0436..7e8037df1 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua @@ -3,9 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") -- TODO: Turn villagers to zombie villager diff --git a/mods/ENTITIES/mobs_mc/witch.lua b/mods/ENTITIES/mobs_mc/witch.lua index 7edce46e5..83e7b7b30 100644 --- a/mods/ENTITIES/mobs_mc/witch.lua +++ b/mods/ENTITIES/mobs_mc/witch.lua @@ -3,11 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") +local S = minetest.get_translator("mobs_mc") --################### --################### WITCH diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 9602d5a54..d61237a9d 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -3,18 +3,12 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") ---dofile(minetest.get_modpath("mobs").."/api.lua") - - --################### --################### WITHER --################### - mobs:register_mob("mobs_mc:wither", { type = "monster", hp_max = 300, diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index fc73e834e..b7e69864a 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -1,8 +1,6 @@ --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") local default_walk_chance = 50 diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index 72c76b329..0b329c55d 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -3,12 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") - +local S = minetest.get_translator("mobs_mc") --################### --################### ZOMBIE diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua index d85c2ceb2..a4b1db60d 100644 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ b/mods/ENTITIES/mobs_mc/zombiepig.lua @@ -3,11 +3,8 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") +local S = minetest.get_translator("mobs_mc") ---dofile(minetest.get_modpath("mobs").."/api.lua") --################### --################### ZOMBIE PIGMAN --################### From d691490016213c12c4dae9e87b6a6d6a5d0bbc95 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Mar 2019 20:55:56 +0100 Subject: [PATCH 059/379] New translation system, part 2: Environment, help --- mods/ENVIRONMENT/lightning/init.lua | 9 +- mods/ENVIRONMENT/mcl_void_damage/init.lua | 6 +- mods/ENVIRONMENT/mcl_weather/weather_core.lua | 18 ++-- mods/HELP/mcl_doc/init.lua | 82 ++++++++++--------- mods/HELP/mcl_doc_basics/depends.txt | 1 - mods/HELP/mcl_doc_basics/init.lua | 8 +- 6 files changed, 62 insertions(+), 62 deletions(-) diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 3d417cce9..527bfa860 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -1,4 +1,3 @@ - --[[ Copyright (C) 2016 - Auke Kok @@ -10,6 +9,8 @@ of the license, or (at your option) any later version. --]] +local S = minetest.get_translator("lightning") + lightning = {} lightning.interval_low = 17 @@ -178,7 +179,7 @@ lightning.strike = function(pos) if obj:is_player() then -- Player damage if minetest.get_modpath("mcl_death_messages") then - mcl_death_messages.player_damage(obj, string.format("%s was struck by lightning.", obj:get_player_name())) + mcl_death_messages.player_damage(obj, S("@1 was struck by lightning.", obj:get_player_name())) end obj:set_hp(obj:get_hp()-5) -- Mobs @@ -233,7 +234,7 @@ end) minetest.register_chatcommand("lightning", { params = "[ ]", - description = "Let lightning strike at the specified position or yourself", + description = S("Let lightning strike at the specified position or yourself"), privs = { maphack = true }, func = function(name, param) local pos = {} @@ -254,7 +255,7 @@ minetest.register_chatcommand("lightning", { if player then lightning.strike(player:get_pos()) else - return false, "No position specified and unknown player" + return false, S("No position specified and unknown player") end end return true diff --git a/mods/ENVIRONMENT/mcl_void_damage/init.lua b/mods/ENVIRONMENT/mcl_void_damage/init.lua index f8f4578f9..5490f5000 100644 --- a/mods/ENVIRONMENT/mcl_void_damage/init.lua +++ b/mods/ENVIRONMENT/mcl_void_damage/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_void_damage") + local voidtimer = 0 minetest.register_globalstep(function(dtime) @@ -24,7 +26,7 @@ minetest.register_globalstep(function(dtime) local spawn = mcl_spawn.get_spawn_pos(obj) obj:set_pos(spawn) mcl_worlds.dimension_change(obj, mcl_worlds.pos_to_dimension(spawn)) - minetest.chat_send_player(obj:get_player_name(), "The void is off-limits to you!") + minetest.chat_send_player(obj:get_player_name(), S("The void is off-limits to you!")) else obj:remove() end @@ -32,7 +34,7 @@ minetest.register_globalstep(function(dtime) -- Damage enabled, not immortal: Deal void damage (4 HP / 0.5 seconds) if obj:get_hp() > 0 then if is_player then - mcl_death_messages.player_damage(obj, string.format("%s fell into the endless void.", obj:get_player_name())) + mcl_death_messages.player_damage(obj, S("@1 fell into the endless void.", obj:get_player_name())) end obj:set_hp(obj:get_hp() - 4) end diff --git a/mods/ENVIRONMENT/mcl_weather/weather_core.lua b/mods/ENVIRONMENT/mcl_weather/weather_core.lua index bec9606dd..507040f10 100644 --- a/mods/ENVIRONMENT/mcl_weather/weather_core.lua +++ b/mods/ENVIRONMENT/mcl_weather/weather_core.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_weather") + -- weather states, 'none' is default, other states depends from active mods mcl_weather.state = "none" @@ -182,18 +184,18 @@ mcl_weather.get_weather = function() end minetest.register_privilege("weather_manager", { - description = "Gives ability to control weather", + description = S("Gives ability to control weather"), give_to_singleplayer = false }) -- Weather command definition. Set minetest.register_chatcommand("weather", { - params = "(clear | rain | snow | thunder) []", - description = "Changes the weather to the specified parameter.", + params = S("(clear | rain | snow | thunder) []"), + description = S("Changes the weather to the specified parameter."), privs = {weather_manager = true}, func = function(name, param) if (param == "") then - return false, "Error: No weather specified." + return false, S("Error: No weather specified.") end local new_weather, end_time local parse1, parse2 = string.match(param, "(%w+) ?(%d*)") @@ -204,13 +206,13 @@ minetest.register_chatcommand("weather", { new_weather = parse1 end else - return false, "Error: Invalid parameters." + return false, S("Error: Invalid parameters.") end if parse2 then if type(tonumber(parse2)) == "number" then local duration = tonumber(parse2) if duration < 1 then - return false, "Error: Duration can't be less than 1 second." + return false, S("Error: Duration can't be less than 1 second.") end end_time = minetest.get_gametime() + duration end @@ -220,14 +222,14 @@ minetest.register_chatcommand("weather", { if success then return true else - return false, "Error: Invalid weather specified. Use “clear”, “rain”, “snow” or “thunder”." + return false, S("Error: Invalid weather specified. Use “clear”, “rain”, “snow” or “thunder”.") end end }) minetest.register_chatcommand("toggledownfall", { params = "", - description = "Toggles between clear weather and weather with downfall (randomly rain, thunderstorm or snow)", + description = S("Toggles between clear weather and weather with downfall (randomly rain, thunderstorm or snow)"), privs = {weather_manager = true}, func = function(name, param) -- Currently rain/thunder/snow: Set weather to clear diff --git a/mods/HELP/mcl_doc/init.lua b/mods/HELP/mcl_doc/init.lua index b4f292b4c..fc35f8e30 100644 --- a/mods/HELP/mcl_doc/init.lua +++ b/mods/HELP/mcl_doc/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_doc") + -- Disable built-in factoids; it is planned to add custom ones as replacements doc.sub.items.disable_core_factoid("node_mining") doc.sub.items.disable_core_factoid("tool_capabilities") @@ -14,7 +16,7 @@ end) -- dig_by_water doc.sub.items.register_factoid("nodes", "drop_destroy", function(itemstring, def) if def.groups.dig_by_water then - return "Water can flow into this block and cause it to drop as an item." + return S("Water can flow into this block and cause it to drop as an item.") end return "" end) @@ -22,9 +24,9 @@ end) -- usable by hoes doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def) if def.groups.cultivatable == 2 then - return "This block can be turned into dirt with a hoe." + return S("This block can be turned into dirt with a hoe.") elseif def.groups.cultivatable == 2 then - return "This block can be turned into farmland with a hoe." + return S("This block can be turned into farmland with a hoe.") end return "" end) @@ -33,15 +35,15 @@ end) doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def) local datastring = "" if def.groups.soil_sapling == 2 then - datastring = datastring .. "This block acts as a soil for all saplings." .. "\n" + datastring = datastring .. S("This block acts as a soil for all saplings.") .. "\n" elseif def.groups.soil_sapling == 1 then - datastring = datastring .. "This block acts as a soil for some saplings." .. "\n" + datastring = datastring .. S("This block acts as a soil for some saplings.") .. "\n" end if def.groups.soil_sugarcane then - datastring = datastring .. "Sugar canes will grow on this block." .. "\n" + datastring = datastring .. S("Sugar canes will grow on this block.") .. "\n" end if def.groups.soil_nether_wart then - datastring = datastring .. "Nether wart will grow on this block." .. "\n" + datastring = datastring .. S("Nether wart will grow on this block.") .. "\n" end return datastring end) @@ -50,9 +52,9 @@ doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def) local formstring = "" if def.groups.leafdecay ~= nil then if def.drop ~= "" and def.drop ~= nil and def.drop ~= itemstring then - formstring = string.format("This block quickly decays when there is no wood block of any species within a distance of %d. When decaying, it disappears and may drop one of its regular drops. The block does not decay when the block has been placed by a player.", def.groups.leafdecay) + formstring = S("This block quickly decays when there is no wood block of any species within a distance of @1. When decaying, it disappears and may drop one of its regular drops. The block does not decay when the block has been placed by a player.", def.groups.leafdecay) else - formstring = string.format("This block quickly decays and disappears when there is no wood block of any species within a distance of %d. The block does not decay when the block has been placed by a player.", def.groups.leafdecay) + formstring = S("This block quickly decays and disappears when there is no wood block of any species within a distance of @1. The block does not decay when the block has been placed by a player.", def.groups.leafdecay) end end return formstring @@ -62,9 +64,9 @@ end) doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def) local datastring = "" if def.groups.place_flowerlike == 1 then - return "This plant can only grow on grass blocks and dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher." + return S("This plant can only grow on grass blocks and dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.") elseif def.groups.place_flowerlike == 2 then - return "This plant can grow on grass blocks, podzol, dirt and coarse dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher." + return S("This plant can grow on grass blocks, podzol, dirt and coarse dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.") end return "" end) @@ -72,7 +74,7 @@ end) -- flammable doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def) if def.groups.flammable then - return "This block is flammable." + return S("This block is flammable.") end return "" end) @@ -80,7 +82,7 @@ end) -- destroys_items doc.sub.items.register_factoid("nodes", "groups", function(itemstring, def) if def.groups.destroys_items then - return "This block destroys any item it touches." + return S("This block destroys any item it touches.") end return "" end) @@ -91,25 +93,25 @@ doc.sub.items.register_factoid(nil, "use", function(itemstring, def) local s = "" if def.groups.eatable and not def._doc_items_usagehelp then if def.groups.food == 2 then - s = s .. "To eat it, wield it, then rightclick." + s = s .. S("To eat it, wield it, then rightclick.") if def.groups.can_eat_when_full == 1 then - s = s .. "\n" .. "You can eat this even when your hunger bar is full." + s = s .. "\n" .. S("You can eat this even when your hunger bar is full.") else - s = s .. "\n" .. "You cannot eat this when your hunger bar is full." + s = s .. "\n" .. S("You cannot eat this when your hunger bar is full.") end elseif def.groups.food == 3 then - s = s .. "To drink it, wield it, then rightclick." + s = s .. S("To drink it, wield it, then rightclick.") if def.groups.can_eat_when_full ~= 1 then - s = s .. "\n" .. "You cannot drink this when your hunger bar is full." + s = s .. "\n" .. S("You cannot drink this when your hunger bar is full.") end else - s = s .. "To consume it, wield it, then rightclick." + s = s .. S("To consume it, wield it, then rightclick.") if def.groups.can_eat_when_full ~= 1 then - s = s .. "\n" .. "You cannot consume this when your hunger bar is full." + s = s .. "\n" .. S("You cannot consume this when your hunger bar is full.") end end if def.groups.no_eat_delay ~= 1 then - s = s .. "\n" .. "You have to wait for about 2 seconds before you can eat or drink again." + s = s .. "\n" .. S("You have to wait for about 2 seconds before you can eat or drink again.") end end return s @@ -118,10 +120,10 @@ end) doc.sub.items.register_factoid(nil, "groups", function(itemstring, def) local s = "" if def.groups.eatable and def.groups.eatable > 0 then - s = s .. string.format("Hunger points restored: %d", def.groups.eatable) + s = s .. S("Hunger points restored: @1", def.groups.eatable) end if def._mcl_saturation and def._mcl_saturation > 0 then - s = s .. "\n" .. string.format("Saturation points restored: %.1f", def._mcl_saturation) + s = s .. "\n" .. S("Saturation points restored: @1%.1f", string.format("%.1f", def._mcl_saturation)) end return s end) @@ -132,12 +134,12 @@ doc.sub.items.register_factoid(nil, "groups", function(itemstring, def) local mdef = minetest.registered_items[def._repair_material] local desc if mdef and mdef.description and mdef.description ~= "" then - return string.format("This item can be repaired at an anvil with: %s.", mdef.description) + return S("This item can be repaired at an anvil with: @1.", mdef.description) elseif def._repair_material == "group:wood" then - return "This item can be repaired at an anvil with any wooden planks." + return S("This item can be repaired at an anvil with any wooden planks.") elseif string.sub(def._repair_material, 1, 6) == "group:" then local group = string.sub(def._repair_material, 7) - return string.format("This item can be repaired at an anvil with any item in the “%s” group.", group) + return S("This item can be repaired at an anvil with any item in the “@1” group.", group) end end return "" @@ -145,7 +147,7 @@ end) doc.sub.items.register_factoid(nil, "groups", function(itemstring, def) if minetest.get_item_group(itemstring, "no_rename") == 1 then - return "This item cannot be renamed at an anvil." + return S("This item cannot be renamed at an anvil.") else return "" end @@ -154,7 +156,7 @@ end) doc.sub.items.register_factoid("nodes", "gravity", function(itemstring, def) local s = "" if minetest.get_item_group(itemstring, "crush_after_fall") == 1 then - s = s .. "This block crushes any block it falls into." + s = s .. S("This block crushes any block it falls into.") end return s end) @@ -162,22 +164,22 @@ end) doc.sub.items.register_factoid("nodes", "gravity", function(itemstring, def) local s = "" if minetest.get_item_group(itemstring, "crush_after_fall") == 1 then - s = s .. "When this block falls deeper than 1 block, it causes damage to any player it hits. The damage dealt is B×2−2 hit points with B = number of blocks fallen. The damage can never be more than 40 HP." + s = s .. S("When this block falls deeper than 1 block, it causes damage to any player it hits. The damage dealt is B×2−2 hit points with B = number of blocks fallen. The damage can never be more than 40 HP.") end return s end) -- Mining, hardness and all that doc.sub.items.register_factoid("nodes", "mining", function(itemstring, def) - local pickaxey = { "Diamond Pickaxe", "Iron Pickaxe", "Stone Pickaxe", "Golden Pickaxe", "Wooden Pickaxe" } - local axey = { "Diamond Axe", "Iron Axe", "Stone Axe", "Golden Axe", "Wooden Axe" } - local shovely = { "Diamond Shovel", "Iron Shovel", "Stone Shovel", "Golden Shovel", "Wooden Shovel" } + local pickaxey = { S("Diamond Pickaxe"), S("Iron Pickaxe"), S("Stone Pickaxe"), S("Golden Pickaxe"), S("Wooden Pickaxe") } + local axey = { S("Diamond Axe"), S("Iron Axe"), S("Stone Axe"), S("Golden Axe"), S("Wooden Axe") } + local shovely = { S("Diamond Shovel"), S("Iron Shovel"), S("Stone Shovel"), S("Golden Shovel"), S("Wooden Shovel") } local datastring = "" local groups = def.groups if groups then if groups.dig_immediate == 3 then - datastring = datastring .. "This block can be mined by any tool instantly." .. "\n" + datastring = datastring .. S("This block can be mined by any tool instantly.") .. "\n" else local tool_minable = false @@ -213,7 +215,7 @@ doc.sub.items.register_factoid("nodes", "mining", function(itemstring, def) end if tool_minable then - datastring = "This block can be mined by:\n" .. datastring .. "\n" + datastring = S("This block can be mined by:") .. "\n" .. datastring .. "\n" end end end @@ -222,9 +224,9 @@ doc.sub.items.register_factoid("nodes", "mining", function(itemstring, def) hardness = 0 end if hardness == -1 then - datastring = datastring .. "Hardness: ∞" + datastring = datastring .. S("Hardness: ∞") else - datastring = datastring .. string.format("Hardness: %.2f", hardness) + datastring = datastring .. S("Hardness: @1", string.format("%.2f", hardness)) end local blast = def._mcl_blast_resistance if not blast then @@ -232,7 +234,7 @@ doc.sub.items.register_factoid("nodes", "mining", function(itemstring, def) end -- TODO: Blast resistance as number if blast >= 1000 then - datastring = datastring .. "\n" .. "This block will not be destroyed by TNT explosions." + datastring = datastring .. "\n" .. S("This block will not be destroyed by TNT explosions.") end return datastring end) @@ -240,7 +242,7 @@ end) -- Special drops when mined by shears doc.sub.items.register_factoid("nodes", "drops", function(itemstring, def) if def._mcl_shears_drop == true then - return "This block drops itself when mined by shears." + return S("This block drops itself when mined by shears.") elseif type(def._mcl_shears_drop) == "table" then local drops = {} for d=1, #def._mcl_shears_drop do @@ -255,11 +257,11 @@ doc.sub.items.register_factoid("nodes", "drops", function(itemstring, def) text = itemname end if itemcount > 1 then - text = string.format("%d×%s", itemcount, text) + text = S("@1×@2", itemcount, text) end table.insert(drops, text) end - local ret = string.format("This blocks drops the following when mined by shears: %s", table.concat(drops, ", ")) + local ret = S("This blocks drops the following when mined by shears: @1", table.concat(drops, S(", "))) return ret end return "" diff --git a/mods/HELP/mcl_doc_basics/depends.txt b/mods/HELP/mcl_doc_basics/depends.txt index 31aa39034..8e695ec83 100644 --- a/mods/HELP/mcl_doc_basics/depends.txt +++ b/mods/HELP/mcl_doc_basics/depends.txt @@ -1,2 +1 @@ doc -intllib? diff --git a/mods/HELP/mcl_doc_basics/init.lua b/mods/HELP/mcl_doc_basics/init.lua index f4980bfe1..be4f4ae22 100644 --- a/mods/HELP/mcl_doc_basics/init.lua +++ b/mods/HELP/mcl_doc_basics/init.lua @@ -1,10 +1,4 @@ --- Boilerplate to support localized strings if intllib mod is installed. -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function(s) return s end -end +local S = minetest.get_translator("mcl_doc_basics") doc.add_category("basics", { From 0d6610dcee4fd12231cd244b78ed7340719043b6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Mar 2019 21:10:39 +0100 Subject: [PATCH 060/379] New translation system, part 3: HUD --- mods/HUD/awards/api.lua | 5 +- mods/HUD/awards/chat_commands.lua | 7 +- mods/HUD/awards/depends.txt | 1 - mods/HUD/awards/init.lua | 9 -- mods/HUD/awards/sfinv.lua | 7 +- mods/HUD/awards/triggers.lua | 7 +- mods/HUD/awards/unified_inventory.lua | 7 +- mods/HUD/mcl_achievements/depends.txt | 1 - mods/HUD/mcl_achievements/init.lua | 7 +- mods/HUD/mcl_death_messages/init.lua | 132 +++++++++++++------------- mods/HUD/mcl_inventory/creative.lua | 37 ++++---- mods/HUD/mcl_inventory/init.lua | 11 ++- 12 files changed, 100 insertions(+), 131 deletions(-) diff --git a/mods/HUD/awards/api.lua b/mods/HUD/awards/api.lua index 09f929176..d377f37ce 100644 --- a/mods/HUD/awards/api.lua +++ b/mods/HUD/awards/api.lua @@ -29,10 +29,7 @@ function awards.save() end end -local S = function(s) return s end -function awards.set_intllib(locale) - S = locale -end +local S = minetest.get_translator("awards") function awards.init() awards.players = awards.load() diff --git a/mods/HUD/awards/chat_commands.lua b/mods/HUD/awards/chat_commands.lua index c386c19cb..6571267db 100644 --- a/mods/HUD/awards/chat_commands.lua +++ b/mods/HUD/awards/chat_commands.lua @@ -14,12 +14,7 @@ -- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function ( s ) return s end -end +local S = minetest.get_translator("awards") minetest.register_chatcommand("awards", { params = S("[c|clear|disable|enable]"), diff --git a/mods/HUD/awards/depends.txt b/mods/HUD/awards/depends.txt index cffd94739..80a448a44 100644 --- a/mods/HUD/awards/depends.txt +++ b/mods/HUD/awards/depends.txt @@ -1,3 +1,2 @@ -intllib? sfinv? unified_inventory? diff --git a/mods/HUD/awards/init.lua b/mods/HUD/awards/init.lua index acf8bfdca..63c9303c1 100644 --- a/mods/HUD/awards/init.lua +++ b/mods/HUD/awards/init.lua @@ -14,18 +14,9 @@ -- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- - -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function ( s ) return s end -end - dofile(minetest.get_modpath("awards").."/api.lua") dofile(minetest.get_modpath("awards").."/chat_commands.lua") dofile(minetest.get_modpath("awards").."/sfinv.lua") dofile(minetest.get_modpath("awards").."/unified_inventory.lua") dofile(minetest.get_modpath("awards").."/triggers.lua") -awards.set_intllib(S) diff --git a/mods/HUD/awards/sfinv.lua b/mods/HUD/awards/sfinv.lua index de85998c3..5d02cbb58 100644 --- a/mods/HUD/awards/sfinv.lua +++ b/mods/HUD/awards/sfinv.lua @@ -1,10 +1,5 @@ if minetest.get_modpath("sfinv") then - local S - if minetest.get_modpath("intllib") then - S = intllib.Getter() - else - S = function ( s ) return s end - end + local S = minetest.get_translator("awards") sfinv.register_page("awards:awards", { title = S("Awards"), diff --git a/mods/HUD/awards/triggers.lua b/mods/HUD/awards/triggers.lua index 88a952fdf..42e126bd4 100644 --- a/mods/HUD/awards/triggers.lua +++ b/mods/HUD/awards/triggers.lua @@ -14,12 +14,7 @@ -- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function ( s ) return s end -end +local S = minetest.get_translator("awards") awards.register_trigger("dig", function(def) local tmp = { diff --git a/mods/HUD/awards/unified_inventory.lua b/mods/HUD/awards/unified_inventory.lua index a4bb02dc3..be5ca5f94 100644 --- a/mods/HUD/awards/unified_inventory.lua +++ b/mods/HUD/awards/unified_inventory.lua @@ -1,10 +1,5 @@ if minetest.get_modpath("unified_inventory") ~= nil then - local S - if minetest.get_modpath("intllib") then - S = intllib.Getter() - else - S = function ( s ) return s end - end + local S = minetest.get_translator("awards") unified_inventory.register_button("awards", { type = "image", diff --git a/mods/HUD/mcl_achievements/depends.txt b/mods/HUD/mcl_achievements/depends.txt index 1679faebb..203a4c0ab 100644 --- a/mods/HUD/mcl_achievements/depends.txt +++ b/mods/HUD/mcl_achievements/depends.txt @@ -1,2 +1 @@ awards -intllib? diff --git a/mods/HUD/mcl_achievements/init.lua b/mods/HUD/mcl_achievements/init.lua index fed23ee33..cfeea18be 100644 --- a/mods/HUD/mcl_achievements/init.lua +++ b/mods/HUD/mcl_achievements/init.lua @@ -3,12 +3,7 @@ -- If true, activates achievements from other Minecraft editions (XBox, PS, etc.) local non_pc_achievements = false -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function ( s ) return s end -end +local S = minetest.get_translator("mcl_achievements") -- Achievements from PC Edition diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index 00f39ac44..302b1a670 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -1,101 +1,103 @@ +local S = minetest.get_translator("mcl_death_messages") + mcl_death_messages = {} -- Death messages local msgs = { ["arrow"] = { - "%s was fatally hit by an arrow.", - "%s has been killed with an arrow.", + S("%s was fatally hit by an arrow."), + S("%s has been killed with an arrow."), }, ["arrow_name"] = { - "%s was shot by an arrow from %s.", + S("%s was shot by an arrow from %s."), }, ["fire"] = { - "%s has been cooked crisp.", - "%s felt the burn.", - "%s died in the flames.", - "%s died in a fire.", + S("%s has been cooked crisp."), + S("%s felt the burn."), + S("%s died in the flames."), + S("%s died in a fire."), }, ["lava"] = { - "%s melted in lava.", - "%s took a bath in a hot lava tub.", - "%s died in lava.", - "%s could not survive in lava.", + S("%s melted in lava."), + S("%s took a bath in a hot lava tub."), + S("%s died in lava."), + S("%s could not survive in lava."), }, ["drown"] = { - "%s forgot to breathe.", - "%s drowned.", - "%s ran out of oxygen.", + S("%s forgot to breathe."), + S("%s drowned."), + S("%s ran out of oxygen."), }, ["starve"] = { - "%s starved.", + S("%s starved."), }, ["murder"] = { - "%s was killed by %s.", + S("%s was killed by %s."), }, ["mob_kill"] = { - "%s was killed by a mob.", + S("%s was killed by a mob."), }, ["blaze_fireball"] = { - "%s was burned to death by a blaze's fireball.", - "%s was killed by a fireball from a blaze.", + S("%s was burned to death by a blaze's fireball."), + S("%s was killed by a fireball from a blaze."), }, ["fire_charge"] = { - "%s was hit by a fire charge.", + S("%s was hit by a fire charge."), }, ["ghast_fireball"] = { - "A ghast scared %s to death.", - "%s has been fireballed by a ghast.", + S("A ghast scared %s to death."), + S("%s has been fireballed by a ghast."), }, ["fall_damage"] = { - "%s fell from a high cliff.", - "%s took fatal fall damage.", - "%s fell victim to gravity.", + S("%s fell from a high cliff."), + S("%s took fatal fall damage."), + S("%s fell victim to gravity."), }, ["other"] = { - "%s died.", + S("%s died."), } } local mobkills = { - ["mobs_mc:zombie"] = "%s was killed by a zombie.", - ["mobs_mc:baby_zombie"] = "%s was killed by a baby zombie.", - ["mobs_mc:blaze"] = "%s was killed by a blaze.", - ["mobs_mc:slime"] = "%s was killed by a slime.", - ["mobs_mc:witch"] = "%s was killed by a witch.", - ["mobs_mc:magma_cube_tiny"] = "%s was killed by a magma cube.", - ["mobs_mc:magma_cube_small"] = "%s was killed by a magma cube.", - ["mobs_mc:magma_cube_big"] = "%s was killed by a magma cube.", - ["mobs_mc:wolf"] = "%s was killed by a wolf.", - ["mobs_mc:cat"] = "%s was killed by a cat.", - ["mobs_mc:ocelot"] = "%s was killed by an ocelot.", - ["mobs_mc:ender_dragon"] = "%s was killed by an ender dragon.", - ["mobs_mc:wither"] = "%s was killed by a wither.", - ["mobs_mc:enderman"] = "%s was killed by an enderman.", - ["mobs_mc:endermite"] = "%s was killed by an endermite.", - ["mobs_mc:ghast"] = "%s was killed by a ghast.", - ["mobs_mc:guardian_elder"] = "%s was killed by an elder guardian.", - ["mobs_mc:guardian"] = "%s was killed by a guardian.", - ["mobs_mc:iron_golem"] = "%s was killed by an iron golem.", - ["mobs_mc:polar_bear"] = "%s was killed by a polar_bear.", - ["mobs_mc:killer_bunny"] = "%s was killed by a killer bunny.", - ["mobs_mc:shulker"] = "%s was killed by a shulker.", - ["mobs_mc:silverfish"] = "%s was killed by a silverfish.", - ["mobs_mc:skeleton"] = "%s was killed by a skeleton.", - ["mobs_mc:stray"] = "%s was killed by a stray.", - ["mobs_mc:slime_tiny"] = "%s was killed by a slime.", - ["mobs_mc:slime_small"] = "%s was killed by a slime.", - ["mobs_mc:slime_big"] = "%s was killed by a slime.", - ["mobs_mc:spider"] = "%s was killed by a spider.", - ["mobs_mc:cave_spider"] = "%s was killed by a cave spider.", - ["mobs_mc:vex"] = "%s was killed by a vex.", - ["mobs_mc:evoker"] = "%s was killed by an evoker.", - ["mobs_mc:illusioner"] = "%s was killed by an illusioner.", - ["mobs_mc:vindicator"] = "%s was killed by a vindicator.", - ["mobs_mc:villager_zombie"] = "%s was killed by a zombie villager.", - ["mobs_mc:husk"] = "%s was killed by a husk.", - ["mobs_mc:baby_husk"] = "%s was killed by a baby husk.", - ["mobs_mc:pigman"] = "%s was killed by a zombie pigman.", - ["mobs_mc:baby_pigman"] = "%s was killed by a baby zombie pigman.", + ["mobs_mc:zombie"] = S("%s was killed by a zombie."), + ["mobs_mc:baby_zombie"] = S("%s was killed by a baby zombie."), + ["mobs_mc:blaze"] = S("%s was killed by a blaze."), + ["mobs_mc:slime"] = S("%s was killed by a slime."), + ["mobs_mc:witch"] = S("%s was killed by a witch."), + ["mobs_mc:magma_cube_tiny"] = S("%s was killed by a magma cube."), + ["mobs_mc:magma_cube_small"] = S("%s was killed by a magma cube."), + ["mobs_mc:magma_cube_big"] = S("%s was killed by a magma cube."), + ["mobs_mc:wolf"] = S("%s was killed by a wolf."), + ["mobs_mc:cat"] = S("%s was killed by a cat."), + ["mobs_mc:ocelot"] = S("%s was killed by an ocelot."), + ["mobs_mc:ender_dragon"] = S("%s was killed by an ender dragon."), + ["mobs_mc:wither"] = S("%s was killed by a wither."), + ["mobs_mc:enderman"] = S("%s was killed by an enderman."), + ["mobs_mc:endermite"] = S("%s was killed by an endermite."), + ["mobs_mc:ghast"] = S("%s was killed by a ghast."), + ["mobs_mc:guardian_elder"] = S("%s was killed by an elder guardian."), + ["mobs_mc:guardian"] = S("%s was killed by a guardian."), + ["mobs_mc:iron_golem"] = S("%s was killed by an iron golem."), + ["mobs_mc:polar_bear"] = S("%s was killed by a polar_bear."), + ["mobs_mc:killer_bunny"] = S("%s was killed by a killer bunny."), + ["mobs_mc:shulker"] = S("%s was killed by a shulker."), + ["mobs_mc:silverfish"] = S("%s was killed by a silverfish."), + ["mobs_mc:skeleton"] = S("%s was killed by a skeleton."), + ["mobs_mc:stray"] = S("%s was killed by a stray."), + ["mobs_mc:slime_tiny"] = S("%s was killed by a slime."), + ["mobs_mc:slime_small"] = S("%s was killed by a slime."), + ["mobs_mc:slime_big"] = S("%s was killed by a slime."), + ["mobs_mc:spider"] = S("%s was killed by a spider."), + ["mobs_mc:cave_spider"] = S("%s was killed by a cave spider."), + ["mobs_mc:vex"] = S("%s was killed by a vex."), + ["mobs_mc:evoker"] = S("%s was killed by an evoker."), + ["mobs_mc:illusioner"] = S("%s was killed by an illusioner."), + ["mobs_mc:vindicator"] = S("%s was killed by a vindicator."), + ["mobs_mc:villager_zombie"] = S("%s was killed by a zombie villager."), + ["mobs_mc:husk"] = S("%s was killed by a husk."), + ["mobs_mc:baby_husk"] = S("%s was killed by a baby husk."), + ["mobs_mc:pigman"] = S("%s was killed by a zombie pigman."), + ["mobs_mc:baby_pigman"] = S("%s was killed by a baby zombie pigman."), } -- Select death message diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 536cc56a1..2637ac289 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -1,3 +1,6 @@ +local S = minetest.get_translator("mcl_inventory") +local F = function(s) return minetest.formspec_escape(S(s)) end + -- Prepare player info table local players = {} @@ -320,16 +323,16 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz player_preview.. -- crafting guide button "image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]".. - "tooltip[__mcl_craftguide;Recipe book]".. + "tooltip[__mcl_craftguide;"..F("Recipe book")"..]".. -- help button "image_button[9,2;1,1;doc_button_icon_lores.png;__mcl_doc;]".. - "tooltip[__mcl_doc;Help]".. + "tooltip[__mcl_doc;"..F("Help").."]".. -- skins button "image_button[9,3;1,1;mcl_skins_button.png;__mcl_skins;]".. - "tooltip[__mcl_skins;Select player skin]".. + "tooltip[__mcl_skins;"..F("Select player skin").."]".. -- achievements button "image_button[9,4;1,1;mcl_achievements_button.png;__mcl_achievements;]".. - "tooltip[__mcl_achievements;Achievements]" + "tooltip[__mcl_achievements;"..F("Achievements").."]" -- For shortcuts listrings = listrings .. @@ -382,35 +385,35 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz "background[-0.19,-0.25;10.5,9.87;"..inv_bg.."]".. "label[-5,-5;"..name.."]".. tab(name, "blocks") .. - "tooltip[blocks;Building Blocks]".. + "tooltip[blocks;"..F("Building Blocks").."]".. tab(name, "deco") .. - "tooltip[deco;Decoration Blocks]".. + "tooltip[deco;"..F("Decoration Blocks").."]".. tab(name, "redstone") .. - "tooltip[redstone;Redstone]".. + "tooltip[redstone;"..F("Redstone").."]".. tab(name, "rail") .. - "tooltip[rail;Transportation]".. + "tooltip[rail;"..F("Transportation").."]".. tab(name, "misc") .. - "tooltip[misc;Miscellaneous]".. + "tooltip[misc;"..F("Miscellaneous").."]".. tab(name, "nix") .. - "tooltip[nix;Search Items]".. + "tooltip[nix;"..F("Search Items").."]".. fnt.. "list[current_player;main;0,7;9,1;]".. main_list.. tab(name, "food") .. - "tooltip[food;Foodstuffs]".. + "tooltip[food;"..F("Foodstuffs").."]".. tab(name, "tools") .. - "tooltip[tools;Tools]".. + "tooltip[tools;"..F("Tools").."]".. tab(name, "combat") .. - "tooltip[combat;Combat]".. + "tooltip[combat;"..F("Combat").."]".. tab(name, "mobs") .. - "tooltip[mobs;Mobs]".. + "tooltip[mobs;"..F("Mobs").."]".. -- TODO: Add brew --tab(name, "brew") .. - --"tooltip[brew;Brewing]".. + --"tooltip[brew;"..F("Brewing").."]".. tab(name, "matr") .. - "tooltip[matr;Materials]".. + "tooltip[matr;"..F("Materials").."]".. tab(name, "inv") .. - "tooltip[inv;Survival Inventory]".. + "tooltip[inv;"..F("Survival Inventory").."]".. "list[detached:trash;main;9,7;1,1;]".. "image[9,7;1,1;crafting_creative_trash.png]".. listrings diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index bed3c4850..899abeba9 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -1,3 +1,6 @@ +local S = minetest.get_translator("mcl_inventory") +local F = function(s) return minetest.formspec_escape(S(s)) end + mcl_inventory = {} local show_armor = minetest.get_modpath("3d_armor") ~= nil @@ -101,16 +104,16 @@ local function set_inventory(player, armor_change_only) "list[current_player;craftpreview;7,1.5;1,1;]".. -- crafting guide button "image_button[4.5,3;1,1;craftguide_book.png;__mcl_craftguide;]".. - "tooltip[__mcl_craftguide;Recipe book]".. + "tooltip[__mcl_craftguide;"..F("Recipe book").."]".. -- help button "image_button[8,3;1,1;doc_button_icon_lores.png;__mcl_doc;]".. - "tooltip[__mcl_doc;Help]".. + "tooltip[__mcl_doc;"..F("Help").."]".. -- skins button "image_button[3,3;1,1;mcl_skins_button.png;__mcl_skins;]".. - "tooltip[__mcl_skins;Select player skin]".. + "tooltip[__mcl_skins;"..F("Select player skin").."]".. -- achievements button "image_button[7,3;1,1;mcl_achievements_button.png;__mcl_achievements;]".. - "tooltip[__mcl_achievements;Achievements]".. + "tooltip[__mcl_achievements;"..F("Achievements").."]".. -- for shortcuts "listring[current_player;main]".. "listring[current_player;craft]".. From 0cc038c5452d972e76c1f9179edc37f25b972dc9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Mar 2019 21:14:30 +0100 Subject: [PATCH 061/379] New translation system, part 4: Misc/Player --- mods/MISC/mcl_commands/init.lua | 7 +------ mods/MISC/mcl_privs/init.lua | 4 +++- mods/MISC/mcl_wip/init.lua | 6 ++++-- mods/PLAYER/mcl_skins/init.lua | 5 +---- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/mods/MISC/mcl_commands/init.lua b/mods/MISC/mcl_commands/init.lua index b7ce1e1cd..50dd05264 100644 --- a/mods/MISC/mcl_commands/init.lua +++ b/mods/MISC/mcl_commands/init.lua @@ -1,11 +1,6 @@ local minecraftaliases = true -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end -end +local S = minetest.get_translator("mcl_commands") local function handle_kill_command(suspect, victim) if minetest.settings:get_bool("enable_damage") == false then diff --git a/mods/MISC/mcl_privs/init.lua b/mods/MISC/mcl_privs/init.lua index c242ed3de..00670db1c 100644 --- a/mods/MISC/mcl_privs/init.lua +++ b/mods/MISC/mcl_privs/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_privs") + minetest.register_privilege("maphack", { - description = "Can place and use advanced blocks like mob spawners, command blocks and barriers.", + description = S("Can place and use advanced blocks like mob spawners, command blocks and barriers."), }) diff --git a/mods/MISC/mcl_wip/init.lua b/mods/MISC/mcl_wip/init.lua index 8f9d206b8..640cc3766 100644 --- a/mods/MISC/mcl_wip/init.lua +++ b/mods/MISC/mcl_wip/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_wip") + local wip_items = { "mcl_fishing:fishing_rod", "mcl_maps:empty_map", @@ -27,7 +29,7 @@ for i=1,#wip_items do if new_description == "" then new_description = wip_items[i] end - new_description = new_description .. "\n"..core.colorize("#FF0000", "(WIP)") + new_description = new_description .. "\n"..core.colorize("#FF0000", S("(WIP)")) new_groups.not_in_craft_guide = 1 minetest.override_item(wip_items[i], { description = new_description, groups = new_groups }) end @@ -39,7 +41,7 @@ for i=1,#experimental_items do break end local new_description = def.description - new_description = new_description .. "\n"..core.colorize("#FFFF00", "(Temporary)") + new_description = new_description .. "\n"..core.colorize("#FFFF00", S("(Temporary)")) minetest.override_item(experimental_items[i], { description = new_description }) end diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index 25dd17acb..fac543e3c 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -6,10 +6,7 @@ mcl_skins = { skin_count = 0, -- counter of _custom_ skins (all skins except character.png) } - --- Load support for intllib. -local S, NS = dofile(mcl_skins.modpath .. "/intllib.lua") - +local S = minetest.get_translator("mcl_skins") -- load skin list and metadata local id, f, data, skin = 0 From 342202c979103870156680497b4aab00a5dbf6d7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Mar 2019 21:35:02 +0100 Subject: [PATCH 062/379] New translation system, part 5: Items, part 1 --- mods/ITEMS/mcl_anvils/init.lua | 26 ++++---- mods/ITEMS/mcl_banners/init.lua | 40 ++++++------ mods/ITEMS/mcl_banners/patterncraft.lua | 82 +++++++++++++------------ mods/ITEMS/mcl_beds/api.lua | 13 ++-- mods/ITEMS/mcl_beds/beds.lua | 34 +++++----- mods/ITEMS/mcl_beds/functions.lua | 20 +++--- mods/ITEMS/mcl_books/init.lua | 52 ++++++++-------- mods/ITEMS/mcl_bows/arrow.lua | 12 ++-- mods/ITEMS/mcl_bows/bow.lua | 12 ++-- 9 files changed, 153 insertions(+), 138 deletions(-) diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index 8b3717a34..0eae2ce5a 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_anvils") + local MAX_NAME_LENGTH = 30 local MAX_WEAR = 65535 local SAME_TOOL_REPAIR_BOOST = math.ceil(MAX_WEAR * 0.12) -- 12% @@ -23,7 +25,7 @@ local function get_anvil_formspec(set_name) "list[context;output;8,2.5;1,1;]".. "field[3.25,1;4,1;name;;"..minetest.formspec_escape(set_name).."]".. "field_close_on_enter[name;false]".. - "button[7,0.7;2,1;name_button;Set Name]".. + "button[7,0.7;2,1;name_button;"..minetest.formspec_escape(S("Set Name")).."]".. "listring[context;output]".. "listring[current_player;main]".. "listring[context;input]".. @@ -433,20 +435,20 @@ if minetest.get_modpath("screwdriver") then end local anvildef0 = table.copy(anvildef) -anvildef0.description = "Anvil" +anvildef0.description = S("Anvil") anvildef0._doc_items_longdesc = -[[The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!]] +S("The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!") anvildef0._doc_items_usagehelp = -"To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.".."\n".. -"To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.".."\n".. -"There are two possibilities to repair tools (and armor):".."\n".. -"• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.".."\n".. -"• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.".."\n".. -"Armor counts as a tool. It is possible to repair and rename a tool in a single step.".."\n\n".. -"The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed." +S("To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.").."\n".. +S("To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.").."\n".. +S("There are two possibilities to repair tools (and armor):").."\n".. +S("• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.").."\n".. +S("• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.").."\n".. +S("Armor counts as a tool. It is possible to repair and rename a tool in a single step.").."\n\n".. +S("The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.") local anvildef1 = table.copy(anvildef) -anvildef1.description = "Slightly Damaged Anvil" +anvildef1.description = S("Slightly Damaged Anvil") anvildef1._doc_items_create_entry = false anvildef1.groups.not_in_creative_inventory = 1 anvildef1.groups.anvil = 2 @@ -454,7 +456,7 @@ anvildef1._doc_items_create_entry = false anvildef1.tiles = {"mcl_anvils_anvil_top_damaged_1.png^[transformR90", "mcl_anvils_anvil_base.png", "mcl_anvils_anvil_side.png"} local anvildef2 = table.copy(anvildef) -anvildef2.description = "Very Damaged Anvil" +anvildef2.description = S("Very Damaged Anvil") anvildef2._doc_items_create_entry = false anvildef2.groups.not_in_creative_inventory = 1 anvildef2.groups.anvil = 3 diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index d1df29d07..2c7304b96 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_banners") + local node_sounds if minetest.get_modpath("mcl_sounds") then node_sounds = mcl_sounds.node_sound_wood_defaults() @@ -14,22 +16,22 @@ mcl_banners = {} mcl_banners.colors = { -- Format: -- [ID] = { banner description, wool, unified dyes color group, overlay color, dye, color name for emblazonings } - ["unicolor_white"] = {"white", "White Banner", "mcl_wool:white", "#FFFFFF", "mcl_dye:white", "White" }, - ["unicolor_darkgrey"] = {"grey", "Grey Banner", "mcl_wool:grey", "#303030", "mcl_dye:dark_grey", "Grey" }, - ["unicolor_grey"] = {"silver", "Light Grey Banner", "mcl_wool:silver", "#5B5B5B", "mcl_dye:grey", "Light Grey" }, - ["unicolor_black"] = {"black", "Black Banner", "mcl_wool:black", "#000000", "mcl_dye:black", "Black" }, - ["unicolor_red"] = {"red", "Red Banner", "mcl_wool:red", "#BC0000", "mcl_dye:red", "Red" }, - ["unicolor_yellow"] = {"yellow", "Yellow Banner", "mcl_wool:yellow", "#E6CD00", "mcl_dye:yellow", "Yellow" }, - ["unicolor_dark_green"] = {"green", "Green Banner", "mcl_wool:green", "#006000", "mcl_dye:dark_green", "Green" }, - ["unicolor_cyan"] = {"cyan", "Cyan Banner", "mcl_wool:cyan", "#00ACAC", "mcl_dye:cyan", "Cyan" }, - ["unicolor_blue"] = {"blue", "Blue Banner", "mcl_wool:blue", "#0000AC", "mcl_dye:blue", "Blue" }, - ["unicolor_red_violet"] = {"magenta", "Magenta Banner", "mcl_wool:magenta", "#AC007C", "mcl_dye:magenta", "Magenta"}, - ["unicolor_orange"] = {"orange", "Orange Banner", "mcl_wool:orange", "#E67300", "mcl_dye:orange", "Orange" }, - ["unicolor_violet"] = {"purple", "Purple Banner", "mcl_wool:purple", "#6400AC", "mcl_dye:violet", "Violet" }, - ["unicolor_brown"] = {"brown", "Brown Banner", "mcl_wool:brown", "#603000", "mcl_dye:brown", "Brown" }, - ["unicolor_pink"] = {"pink", "Pink Banner", "mcl_wool:pink", "#DE557C", "mcl_dye:pink", "Pink" }, - ["unicolor_lime"] = {"lime", "Lime Banner", "mcl_wool:lime", "#30AC00", "mcl_dye:green", "Lime" }, - ["unicolor_light_blue"] = {"light_blue", "Light Blue Banner", "mcl_wool:light_blue", "#4040CF", "mcl_dye:lightblue", "Light Blue" }, + ["unicolor_white"] = {"white", S("White Banner"), "mcl_wool:white", "#FFFFFF", "mcl_dye:white", "White" }, + ["unicolor_darkgrey"] = {"grey", S("Grey Banner"), "mcl_wool:grey", "#303030", "mcl_dye:dark_grey", "Grey" }, + ["unicolor_grey"] = {"silver", S("Light Grey Banner"), "mcl_wool:silver", "#5B5B5B", "mcl_dye:grey", "Light Grey" }, + ["unicolor_black"] = {"black", S("Black Banner"), "mcl_wool:black", "#000000", "mcl_dye:black", "Black" }, + ["unicolor_red"] = {"red", S("Red Banner"), "mcl_wool:red", "#BC0000", "mcl_dye:red", "Red" }, + ["unicolor_yellow"] = {"yellow", S("Yellow Banner"), "mcl_wool:yellow", "#E6CD00", "mcl_dye:yellow", "Yellow" }, + ["unicolor_dark_green"] = {"green", S("Green Banner"), "mcl_wool:green", "#006000", "mcl_dye:dark_green", "Green" }, + ["unicolor_cyan"] = {"cyan", S("Cyan Banner"), "mcl_wool:cyan", "#00ACAC", "mcl_dye:cyan", "Cyan" }, + ["unicolor_blue"] = {"blue", S("Blue Banner"), "mcl_wool:blue", "#0000AC", "mcl_dye:blue", "Blue" }, + ["unicolor_red_violet"] = {"magenta", S("Magenta Banner"), "mcl_wool:magenta", "#AC007C", "mcl_dye:magenta", "Magenta"}, + ["unicolor_orange"] = {"orange", S("Orange Banner"), "mcl_wool:orange", "#E67300", "mcl_dye:orange", "Orange" }, + ["unicolor_violet"] = {"purple", S("Purple Banner"), "mcl_wool:purple", "#6400AC", "mcl_dye:violet", "Violet" }, + ["unicolor_brown"] = {"brown", S("Brown Banner"), "mcl_wool:brown", "#603000", "mcl_dye:brown", "Brown" }, + ["unicolor_pink"] = {"pink", S("Pink Banner"), "mcl_wool:pink", "#DE557C", "mcl_dye:pink", "Pink" }, + ["unicolor_lime"] = {"lime", S("Lime Banner"), "mcl_wool:lime", "#30AC00", "mcl_dye:green", "Lime" }, + ["unicolor_light_blue"] = {"light_blue", S("Light Blue Banner"), "mcl_wool:light_blue", "#4040CF", "mcl_dye:lightblue", "Light Blue" }, } local colors_reverse = {} @@ -192,9 +194,9 @@ end minetest.register_node("mcl_banners:standing_banner", { _doc_items_entry_name = "Banner", _doc_items_image = "mcl_banners_item_base.png^mcl_banners_item_overlay.png", - _doc_items_longdesc = "Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.", - _doc_items_usagehelp = [[Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible. -You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.]], + _doc_items_longdesc = S("Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting."), + _doc_items_usagehelp = S("Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible.").."\n".. +S("You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer."), walkable = false, is_ground_content = false, paramtype = "light", diff --git a/mods/ITEMS/mcl_banners/patterncraft.lua b/mods/ITEMS/mcl_banners/patterncraft.lua index f60d5678c..5518f883f 100644 --- a/mods/ITEMS/mcl_banners/patterncraft.lua +++ b/mods/ITEMS/mcl_banners/patterncraft.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_banners") + -- Pattern crafting. This file contains the code for crafting all the -- emblazonings you can put on the banners. It's quite complicated; -- run-of-the-mill crafting won't work here. @@ -17,99 +19,99 @@ local d = "group:dye" -- dye local e = "" -- empty slot (one of them must contain the banner) local patterns = { ["border"] = { - name = "%s Bordure", + name = S("%s Bordure"), { d, d, d }, { d, e, d }, { d, d, d }, }, ["bricks"] = { - name = "%s Bricks", + name = S("%s Bricks"), type = "shapeless", { e, "mcl_core:brick_block", d }, }, ["circle"] = { - name = "%s Roundel", + name = S("%s Roundel"), { e, e, e }, { e, d, e }, { e, e, e }, }, ["creeper"] = { - name = "%s Creeper Charge", + name = S("%s Creeper Charge"), type = "shapeless", { e, "mcl_heads:creeper", d }, }, ["cross"] = { - name = "%s Saltire", + name = S("%s Saltire"), { d, e, d }, { e, d, e }, { d, e, d }, }, ["curly_border"] = { - name = "%s Bordure Indented", + name = S("%s Bordure Indented"), type = "shapeless", { e, "mcl_core:vine", d }, }, ["diagonal_up_left"] = { - name = "%s Per Bend Inverted", + name = S("%s Per Bend Inverted"), { e, e, e }, { d, e, e }, { d, d, e }, }, ["diagonal_up_right"] = { - name = "%s Per Bend Sinister Inverted", + name = S("%s Per Bend Sinister Inverted"), { e, e, e }, { e, e, d }, { e, d, d }, }, ["diagonal_right"] = { - name = "%s Per Bend", + name = S("%s Per Bend"), { e, d, d }, { e, e, d }, { e, e, e }, }, ["diagonal_left"] = { - name = "%s Per Bend Sinister", + name = S("%s Per Bend Sinister"), { d, d, e }, { d, e, e }, { e, e, e }, }, ["flower"] = { - name = "%s Flower Charge", + name = S("%s Flower Charge"), type = "shapeless", { e, "mcl_flowers:oxeye_daisy", d }, }, ["gradient"] = { - name = "%s Gradient", + name = S("%s Gradient"), { d, e, d }, { e, d, e }, { e, d, e }, }, ["gradient_up"] = { - name = "%s Base Gradient", + name = S("%s Base Gradient"), { e, d, e }, { e, d, e }, { d, e, d }, }, ["half_horizontal_bottom"] = { - name = "%s Per Fess Inverted", + name = S("%s Per Fess Inverted"), { e, e, e }, { d, d, d }, { d, d, d }, }, ["half_horizontal"] = { - name = "%s Per Fess", + name = S("%s Per Fess"), { d, d, d }, { d, d, d }, { e, e, e }, }, ["half_vertical"] = { - name = "%s Per Pale", + name = S("%s Per Pale"), { d, d, e }, { d, d, e }, { d, d, e }, }, ["half_vertical_right"] = { - name = "%s Per Pale Inverted", + name = S("%s Per Pale Inverted"), { e, d, d }, { e, d, d }, { e, d, d }, @@ -117,126 +119,126 @@ local patterns = { ["thing"] = { -- Symbol used for the “Thing”: U+1F65D 🙝 - name = "%s Thing Charge", + name = S("%s Thing Charge"), type = "shapeless", -- TODO: Replace with enchanted golden apple { e, "mcl_core:apple_gold", d }, }, ["rhombus"] = { - name = "%s Lozenge", + name = S("%s Lozenge"), { e, d, e }, { d, e, d }, { e, d, e }, }, ["skull"] = { - name = "%s Skull Charge", + name = S("%s Skull Charge"), type = "shapeless", { e, "mcl_heads:wither_skeleton", d }, }, ["small_stripes"] = { - name = "%s Paly", + name = S("%s Paly"), { d, e, d }, { d, e, d }, { e, e, e }, }, ["square_bottom_left"] = { - name = "%s Base Dexter Canton", + name = S("%s Base Dexter Canton"), { e, e, e }, { e, e, e }, { d, e, e }, }, ["square_bottom_right"] = { - name = "%s Base Sinister Canton", + name = S("%s Base Sinister Canton"), { e, e, e }, { e, e, e }, { e, e, d }, }, ["square_top_left"] = { - name = "%s Chief Dexter Canton", + name = S("%s Chief Dexter Canton"), { d, e, e }, { e, e, e }, { e, e, e }, }, ["square_top_right"] = { - name = "%s Chief Sinister Canton", + name = S("%s Chief Sinister Canton"), { e, e, d }, { e, e, e }, { e, e, e }, }, ["straight_cross"] = { - name = "%s Cross", + name = S("%s Cross"), { e, d, e }, { d, d, d }, { e, d, e }, }, ["stripe_bottom"] = { - name = "%s Base", + name = S("%s Base"), { e, e, e }, { e, e, e }, { d, d, d }, }, ["stripe_center"] = { - name = "%s Pale", + name = S("%s Pale"), { e, d, e }, { e, d, e }, { e, d, e }, }, ["stripe_downleft"] = { - name = "%s Bend Sinister", + name = S("%s Bend Sinister"), { e, e, d }, { e, d, e }, { d, e, e }, }, ["stripe_downright"] = { - name = "%s Bend", + name = S("%s Bend"), { d, e, e }, { e, d, e }, { e, e, d }, }, ["stripe_left"] = { - name = "%s Pale Dexter", + name = S("%s Pale Dexter"), { d, e, e }, { d, e, e }, { d, e, e }, }, ["stripe_middle"] = { - name = "%s Fess", + name = S("%s Fess"), { e, e, e }, { d, d, d }, { e, e, e }, }, ["stripe_right"] = { - name = "%s Pale Sinister", + name = S("%s Pale Sinister"), { e, e, d }, { e, e, d }, { e, e, d }, }, ["stripe_top"] = { - name = "%s Chief", + name = S("%s Chief"), { d, d, d }, { e, e, e }, { e, e, e }, }, ["triangle_bottom"] = { - name = "%s Chevron", + name = S("%s Chevron"), { e, e, e }, { e, d, e }, { d, e, d }, }, ["triangle_top"] = { - name = "%s Chevron Inverted", + name = S("%s Chevron Inverted"), { d, e, d }, { e, d, e }, { e, e, e }, }, ["triangles_bottom"] = { - name = "%s Base Indented", + name = S("%s Base Indented"), { e, e, e }, { d, e, d }, { e, d, e }, }, ["triangles_top"] = { - name = "%s Chief Indented", + name = S("%s Chief Indented"), { e, d, e }, { d, e, d }, { e, e, e }, @@ -270,9 +272,9 @@ mcl_banners.make_advanced_banner_description = function(description, layers) end -- Warn about missing information if #layers == max_layer_lines + 1 then - table.insert(layerstrings, "And one addional layer") + table.insert(layerstrings, S("And one addional layer")) elseif #layers > max_layer_lines + 1 then - table.insert(layerstrings, string.format("And %d addional layers", #layers - max_layer_lines)) + table.insert(layerstrings, string.format(S("And %d addional layers"), #layers - max_layer_lines)) end -- Final string concatenations: Just a list of strings diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index 4fbbe55eb..6c94121b3 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -1,3 +1,4 @@ +local S = minetest.get_translator("mcl_beds") local reverse = true @@ -32,17 +33,17 @@ local function kick_player_after_destruct(destruct_pos) end end -local beddesc = "Beds allow you to sleep at night and make the time pass faster." -local beduse = "To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger." +local beddesc = S("Beds allow you to sleep at night and make the time pass faster.") +local beduse = S("To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.") if minetest.settings:get_bool("enable_bed_respawn") == false then - beddesc = beddesc .. "\n" .. "In local folklore, legends are told of other worlds where setting the start point for your next life would be possible. But this world is not one of them." + beddesc = beddesc .. "\n" .. S("In local folklore, legends are told of other worlds where setting the start point for your next life would be possible. But this world is not one of them.") else - beddesc = beddesc .. "\n" .. "By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed." + beddesc = beddesc .. "\n" .. S("By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.") end if minetest.settings:get_bool("enable_bed_night_skip") == false then - beddesc = beddesc .. "\n" .. "In this strange world, going to bed won't skip the night, but you can skip thunderstorms." + beddesc = beddesc .. "\n" .. S("In this strange world, going to bed won't skip the night, but you can skip thunderstorms.") else - beddesc = beddesc .. "\n" .. "Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner." + beddesc = beddesc .. "\n" .. S("Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.") end local default_sounds diff --git a/mods/ITEMS/mcl_beds/beds.lua b/mods/ITEMS/mcl_beds/beds.lua index 40deac70a..6ac2071e5 100644 --- a/mods/ITEMS/mcl_beds/beds.lua +++ b/mods/ITEMS/mcl_beds/beds.lua @@ -1,4 +1,4 @@ --- 3D bed +local S = minetest.get_translator("mcl_beds") local nodebox = { bottom = { @@ -15,22 +15,22 @@ local nodebox = { local colors = { -- { ID, decription, wool, dye } - { "red", "Red Bed", "mcl_wool:red", "mcl_dye:red" }, - { "blue", "Blue Bed", "mcl_wool:blue", "mcl_dye:blue" }, - { "cyan", "Cyan Bed", "mcl_wool:cyan", "mcl_dye:cyan" }, - { "grey", "Grey Bed", "mcl_wool:grey", "mcl_dye:dark_grey" }, - { "silver", "Light Grey Bed", "mcl_wool:silver", "mcl_dye:grey" }, - { "black", "Black Bed", "mcl_wool:black", "mcl_dye:black" }, - { "yellow", "Yellow Bed", "mcl_wool:yellow", "mcl_dye:yellow" }, - { "green", "Green Bed", "mcl_wool:green", "mcl_dye:dark_green" }, - { "magenta", "Magenta Bed", "mcl_wool:magenta", "mcl_dye:magenta" }, - { "orange", "Orange Bed", "mcl_wool:orange", "mcl_dye:orange" }, - { "purple", "Purple Bed", "mcl_wool:purple", "mcl_dye:violet" }, - { "brown", "Brown Bed", "mcl_wool:brown", "mcl_dye:brown" }, - { "pink", "Pink Bed", "mcl_wool:pink", "mcl_dye:pink" }, - { "lime", "Lime Bed", "mcl_wool:lime", "mcl_dye:green" }, - { "light_blue", "Light Blue Bed", "mcl_wool:light_blue", "mcl_dye:lightblue" }, - { "white", "White Bed", "mcl_wool:white", "mcl_dye:white" }, + { "red", S("Red Bed"), "mcl_wool:red", "mcl_dye:red" }, + { "blue", S("Blue Bed"), "mcl_wool:blue", "mcl_dye:blue" }, + { "cyan", S("Cyan Bed"), "mcl_wool:cyan", "mcl_dye:cyan" }, + { "grey", S("Grey Bed"), "mcl_wool:grey", "mcl_dye:dark_grey" }, + { "silver", S("Light Grey Bed"), "mcl_wool:silver", "mcl_dye:grey" }, + { "black", S("Black Bed"), "mcl_wool:black", "mcl_dye:black" }, + { "yellow", S("Yellow Bed"), "mcl_wool:yellow", "mcl_dye:yellow" }, + { "green", S("Green Bed"), "mcl_wool:green", "mcl_dye:dark_green" }, + { "magenta", S("Magenta Bed"), "mcl_wool:magenta", "mcl_dye:magenta" }, + { "orange", S("Orange Bed"), "mcl_wool:orange", "mcl_dye:orange" }, + { "purple", S("Purple Bed"), "mcl_wool:purple", "mcl_dye:violet" }, + { "brown", S("Brown Bed"), "mcl_wool:brown", "mcl_dye:brown" }, + { "pink", S("Pink Bed"), "mcl_wool:pink", "mcl_dye:pink" }, + { "lime", S("Lime Bed"), "mcl_wool:lime", "mcl_dye:green" }, + { "light_blue", S("Light Blue Bed"), "mcl_wool:light_blue", "mcl_dye:lightblue" }, + { "white", S("White Bed"), "mcl_wool:white", "mcl_dye:white" }, } for c=1, #colors do diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 0f5716098..3a4877a68 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_beds") + local pi = math.pi local player_in_bed = 0 local is_sp = minetest.is_singleplayer() @@ -67,20 +69,20 @@ local function lay_down(player, pos, bed_pos, state, skip) if bed_pos then -- No sleeping if too far away if vector.distance(bed_pos, pos) > 2 then - minetest.chat_send_player(name, "You can't sleep, the bed's too far away!") + minetest.chat_send_player(name, S("You can't sleep, the bed's too far away!")) return false end for _, other_pos in pairs(mcl_beds.bed_pos) do if vector.distance(bed_pos, other_pos) < 0.1 then - minetest.chat_send_player(name, "This bed is already occupied!") + minetest.chat_send_player(name, S("This bed is already occupied!")) return false end end -- No sleeping while moving. Slightly different behaviour than in MC. if vector.length(player:get_player_velocity()) > 0.001 then - minetest.chat_send_player(name, "You have to stop moving before going to bed!") + minetest.chat_send_player(name, S("You have to stop moving before going to bed!")) return false end @@ -96,7 +98,7 @@ local function lay_down(player, pos, bed_pos, state, skip) -- Approximation of monster detection range if def._cmi_is_mob and ((mobname ~= "mobs_mc:pigman" and def.type == "monster" and not monster_exceptions[mobname]) or (mobname == "mobs_mc:pigman" and ent.state == "attack")) then if math.abs(bed_pos.y - obj:get_pos().y) <= 5 then - minetest.chat_send_player(name, "You can't sleep now, monsters are nearby!") + minetest.chat_send_player(name, S("You can't sleep now, monsters are nearby!")) end return false end @@ -143,10 +145,10 @@ local function lay_down(player, pos, bed_pos, state, skip) local def1 = minetest.registered_nodes[n1.name] local def2 = minetest.registered_nodes[n2.name] if def1.walkable or def2.walkable then - minetest.chat_send_player(name, "You can't sleep, the bed is obstructed!") + minetest.chat_send_player(name, S("You can't sleep, the bed is obstructed!")) return false elseif (def1.damage_per_second ~= nil and def1.damage_per_second > 0) or (def2.damage_per_second ~= nil and def2.damage_per_second > 0) then - minetest.chat_send_player(name, "It's too dangerous to sleep here!") + minetest.chat_send_player(name, S("It's too dangerous to sleep here!")) return false end @@ -162,14 +164,14 @@ local function lay_down(player, pos, bed_pos, state, skip) -- Values taken from Minecraft Wiki with offset of +6000 if tod < 18541 and tod > 5458 and (not weather_mod or (mcl_weather.get_weather() ~= "thunder")) then if spawn_changed then - minetest.chat_send_player(name, "New respawn position set! But you can only sleep at night or during a thunderstorm.") + minetest.chat_send_player(name, S("New respawn position set! But you can only sleep at night or during a thunderstorm.")) else - minetest.chat_send_player(name, "You can only sleep at night or during a thunderstorm.") + minetest.chat_send_player(name, S("You can only sleep at night or during a thunderstorm.")) end return false end if spawn_changed then - minetest.chat_send_player(name, "New respawn position set!") + minetest.chat_send_player(name, S("New respawn position set!")) end mcl_beds.player[name] = 1 diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index a2627c77f..2c8d4afc0 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -1,10 +1,12 @@ +local S =minetest.get_translator("mcl_books") + local max_text_length = 4500 -- TODO: Increase to 12800 when scroll bar was added to written book local max_title_length = 64 -- Book minetest.register_craftitem("mcl_books:book", { - description = "Book", - _doc_items_longdesc = "Books are used to make bookshelves and book and quills.", + description = S("Book"), + _doc_items_longdesc = S("Books are used to make bookshelves and book and quills."), inventory_image = "default_book.png", stack_max = 64, groups = { book=1, craftitem = 1 }, @@ -50,15 +52,15 @@ end local make_description = function(title, author, generation) local desc if generation == 0 then - desc = string.format("“%s”", title) + desc = S("“@1”", title) elseif generation == 1 then - desc = string.format("Copy of “%s”", title) + desc = S("Copy of “@1”", title) elseif generation == 2 then - desc = string.format("Copy of Copy of “%s”", title) + desc = S("Copy of Copy of “@1”", title) else - desc = "Tattered Book" + desc = S("Tattered Book") end - desc = desc .. "\n" .. core.colorize("#AAAAAA", string.format("by %s", author)) + desc = desc .. "\n" .. core.colorize("#AAAAAA", S("by @1", author)) return desc end @@ -81,8 +83,8 @@ local write = function(itemstack, user, pointed_thing) local formspec = "size[8,9]".. "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]".. "textarea[0.75,0.1;7.25,9;text;;"..minetest.formspec_escape(text).."]".. - "button[0.75,7.95;3,1;sign;Sign]".. - "button_exit[4.25,7.95;3,1;ok;Done]" + "button[0.75,7.95;3,1;sign;"..minetest.formspec_escape(S("Sign")).."]".. + "button_exit[4.25,7.95;3,1;ok;"..minetest.formspec_escape(S("Done")).."]" minetest.show_formspec(user:get_player_name(), "mcl_books:writable_book", formspec) end @@ -101,16 +103,16 @@ local read = function(itemstack, user, pointed_thing) local formspec = "size[8,9]".. "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]".. "textarea[0.75,0.1;7.25,9;;"..core.colorize("#000000", minetest.formspec_escape(text))..";]".. - "button_exit[2.25,7.95;3,1;ok;Done]" + "button_exit[2.25,7.95;3,1;ok;"..minetest.formspec_escape(S("Done")).."]" minetest.show_formspec(user:get_player_name(), "mcl_books:written_book", formspec) end -- Book and Quill minetest.register_craftitem("mcl_books:writable_book", { description = "Book and Quill", - _doc_items_longdesc = "This item can be used to write down some notes.", - _doc_items_usagehelp = "Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.".."\n".. - "A book can hold up to 4500 characters. The title length is limited to 64 characters.", + _doc_items_longdesc = S("This item can be used to write down some notes."), + _doc_items_usagehelp = S("Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.").."\n".. + S("A book can hold up to 4500 characters. The title length is limited to 64 characters."), inventory_image = "mcl_books_book_writable.png", groups = { book=1 }, stack_max = 1, @@ -134,11 +136,11 @@ minetest.register_on_player_receive_fields(function ( player, formname, fields ) local name = player:get_player_name() local formspec = "size[8,9]".. "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]".. - "field[0.75,1;7.25,1;title;"..core.colorize("#000000", "Enter book title:")..";]".. - "label[0.75,1.5;"..core.colorize("#404040", minetest.formspec_escape("by " .. name)).."]".. - "label[0.75,6.95;"..core.colorize("#000000", "Note: The book will no longer") .. "\n" .. core.colorize("#000000", "be editable after signing.").."]".. - "button_exit[0.75,7.95;3,1;sign;Sign and Close]".. - "button[4.25,7.95;3,1;cancel;Cancel]" + "field[0.75,1;7.25,1;title;"..core.colorize("#000000", S("Enter book title:"))..";]".. + "label[0.75,1.5;"..core.colorize("#404040", minetest.formspec_escape(S("by @1", name))).."]".. + "label[0.75,6.95;"..core.colorize("#000000", minetest.formspec_escape(S("Note: The book will no longer\nbe editable after signing."))).."]".. + "button_exit[0.75,7.95;3,1;sign;"..minetest.formspec_escape(S("Sign and Close")).."]".. + "button[4.25,7.95;3,1;cancel;"..minetest.formspec_escape(S("Cancel")).."]" minetest.show_formspec(player:get_player_name(), "mcl_books:signing", formspec) end end @@ -149,7 +151,7 @@ minetest.register_on_player_receive_fields(function ( player, formname, fields ) if book:get_name() == "mcl_books:writable_book" then local title = fields.title if string.len(title) == 0 then - title = "Nameless Book" + title = S("Nameless Book") end title = cap_text_length(title, max_title_length) local meta = newbook:get_meta() @@ -184,11 +186,11 @@ end -- Written Book minetest.register_craftitem("mcl_books:written_book", { - description = "Written Book", - _doc_items_longdesc = "Written books contain some text written by someone. They can be read and copied, but not edited.", - _doc_items_usagehelp = [[Hold it in your hand, then rightclick to read the book. + description = S("Written Book"), + _doc_items_longdesc = S("Written books contain some text written by someone. They can be read and copied, but not edited."), + _doc_items_usagehelp = S("Hold it in your hand, then rightclick to read the book.").."\n\n".. -To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.]], +S("To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied."), inventory_image = "mcl_books_book_written.png", groups = { not_in_creative_inventory=1, book=1, no_rename=1 }, stack_max = 16, @@ -322,8 +324,8 @@ end -- Bookshelf minetest.register_node("mcl_books:bookshelf", { - description = "Bookshelf", - _doc_items_longdesc = "Bookshelves are used for decoration.", + description = S("Bookshelf"), + _doc_items_longdesc = S("Bookshelves are used for decoration."), tiles = {"mcl_books_bookshelf_top.png", "mcl_books_bookshelf_top.png", "default_bookshelf.png"}, stack_max = 64, is_ground_content = false, diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index a3c8fb4a1..9561fea0d 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_bows") + -- Time in seconds after which a stuck arrow is deleted local ARROW_TIMEOUT = 60 -- Time after which stuck arrow is rechecked for being stuck @@ -11,11 +13,11 @@ local mod_awards = minetest.get_modpath("awards") and minetest.get_modpath("mcl_ local mod_button = minetest.get_modpath("mesecons_button") minetest.register_craftitem("mcl_bows:arrow", { - description = "Arrow", - _doc_items_longdesc = [[Arrows are ammunition for bows and dispensers. -An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage. -Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.]], - _doc_items_usagehelp = "To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.", + description = S("Arrow"), + _doc_items_longdesc = S("Arrows are ammunition for bows and dispensers.").."\n".. +S("An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.").."\n".. +S("Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons."), + _doc_items_usagehelp = S("To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it."), inventory_image = "mcl_bows_arrow_inv.png", groups = { ammo=1, ammo_bow=1 }, _on_dispense = function(itemstack, dispenserpos, droppos, dropnode, dropdir) diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 14cea6a74..543c573d5 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_bows") + mcl_bows = {} local arrows = { @@ -95,10 +97,10 @@ end -- Bow item, uncharged state minetest.register_tool("mcl_bows:bow", { - description = "Bow", - _doc_items_longdesc = [[Bows are ranged weapons to shoot arrows at your foes. -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 = [[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.]], + description = S("Bow"), + _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_durability = BOW_DURABILITY, inventory_image = "mcl_bows_bow.png", stack_max = 1, @@ -138,7 +140,7 @@ end -- Bow in charging state for level=0, 2 do minetest.register_tool("mcl_bows:bow_"..level, { - description = "Bow", + description = S("Bow"), _doc_items_create_entry = false, inventory_image = "mcl_bows_bow_"..level..".png", stack_max = 1, From 1cb142ec5f8827096960495781a5029835167370 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Mar 2019 22:01:45 +0100 Subject: [PATCH 063/379] Fix crasher in mcl_inventory --- mods/HUD/mcl_inventory/creative.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 2637ac289..8b3eef709 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -323,7 +323,7 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz player_preview.. -- crafting guide button "image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]".. - "tooltip[__mcl_craftguide;"..F("Recipe book")"..]".. + "tooltip[__mcl_craftguide;"..F("Recipe book").."]".. -- help button "image_button[9,2;1,1;doc_button_icon_lores.png;__mcl_doc;]".. "tooltip[__mcl_doc;"..F("Help").."]".. From 1df3d0e42bfce42bc0165b5f2ecdec9fbe17e296 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Mar 2019 22:03:34 +0100 Subject: [PATCH 064/379] Fix some PseudRandom weirdness in mcl_structures --- mods/MAPGEN/mcl_structures/init.lua | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index fa233682a..737722f2a 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -15,6 +15,10 @@ mcl_structures.get_struct = function(file) return allnode end +local mapseed = tonumber(minetest.get_mapgen_setting("seed")) +-- Random number generator for all generated structures +local pr = PseudoRandom(mapseed) + -- Call on_construct on pos. -- Useful to init chests from formspec. local init_node_construct = function(pos) @@ -171,8 +175,6 @@ mcl_structures.generate_igloo_basement = function(pos, orientation) else return success end - -- FIXME: Use better seeding - local pr = PseudoRandom(math.random(0, 4294967295)) local size = {x=9,y=5,z=7} local lootitems = mcl_loot.get_multi_loot({ { @@ -277,8 +279,6 @@ mcl_structures.generate_end_portal_shrine = function(pos) -- Shuffle stone brick types local bricks = minetest.find_nodes_in_area(area_start, area_end, "mcl_core:stonebrick") - -- FIXME: Use better seeding - local pr = PseudoRandom(math.random(0, 4294967295)) for b=1, #bricks do local r_bricktype = pr:next(1, 100) local r_infested = pr:next(1, 100) @@ -368,10 +368,7 @@ mcl_structures.generate_desert_temple = function(pos) local chests = minetest.find_nodes_in_area({x=newpos.x-size.x, y=newpos.y, z=newpos.z-size.z}, vector.add(newpos, size), "mcl_chests:chest") -- Add desert temple loot into chests - -- FIXME: Use better seeding - local pr = PseudoRandom(math.random(0, 4294967295)) for c=1, #chests do - -- FIXME: Use better seeding local lootitems = mcl_loot.get_multi_loot({ { stacks_min = 2, From e4fbbeddb2b2dd429625311293c0e4e3880013db Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Mar 2019 23:40:43 +0100 Subject: [PATCH 065/379] New translation system, part 6: Items, part 2 --- mods/ITEMS/mcl_buckets/init.lua | 26 +-- mods/ITEMS/mcl_cake/init.lua | 20 ++- mods/ITEMS/mcl_cauldrons/init.lua | 20 ++- mods/ITEMS/mcl_chests/init.lua | 56 ++++--- mods/ITEMS/mcl_clock/init.lua | 8 +- mods/ITEMS/mcl_cocoas/init.lua | 12 +- mods/ITEMS/mcl_compass/init.lua | 6 +- mods/ITEMS/mcl_core/craftitems.lua | 70 ++++---- mods/ITEMS/mcl_core/nodes_base.lua | 202 ++++++++++++----------- mods/ITEMS/mcl_core/nodes_cactuscane.lua | 14 +- mods/ITEMS/mcl_core/nodes_climb.lua | 9 +- mods/ITEMS/mcl_core/nodes_glass.lua | 39 ++--- mods/ITEMS/mcl_core/nodes_liquid.lua | 26 +-- mods/ITEMS/mcl_core/nodes_misc.lua | 27 +-- mods/ITEMS/mcl_core/nodes_trees.lua | 51 +++--- 15 files changed, 306 insertions(+), 280 deletions(-) diff --git a/mods/ITEMS/mcl_buckets/init.lua b/mods/ITEMS/mcl_buckets/init.lua index c5b45c4d4..3144bd816 100644 --- a/mods/ITEMS/mcl_buckets/init.lua +++ b/mods/ITEMS/mcl_buckets/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_buckets") + -- Minetest 0.4 mod: bucket -- See README.txt for licensing and other information. @@ -182,9 +184,9 @@ function mcl_buckets.register_liquid(source_place, source_take, itemname, invent end minetest.register_craftitem("mcl_buckets:bucket_empty", { - description = "Empty Bucket", - _doc_items_longdesc = "A bucket can be used to collect and release liquids.", - _doc_items_usagehelp = "Punch a liquid source to collect the liquid. With the filled bucket, you can right-click somewhere to empty the bucket which will create a liquid source at the position you've clicked at.", + description = S("Empty Bucket"), + _doc_items_longdesc = S("A bucket can be used to collect and release liquids."), + _doc_items_usagehelp = S("Punch a liquid source to collect the liquid. With the filled bucket, you can right-click somewhere to empty the bucket which will create a liquid source at the position you've clicked at."), inventory_image = "bucket.png", stack_max = 16, @@ -302,9 +304,9 @@ if mod_mcl_core then {"mcl_core:lava_source", "mcl_nether:nether_lava_source"}, "mcl_buckets:bucket_lava", "bucket_lava.png", - "Lava Bucket", - "A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution.", - "Choose a place where you want to empty the bucket, then get in a safe spot somewhere above it. Be prepared to run away when something goes wrong as the lava will soon start to flow after placing. To empty the bucket (which places a lava source), right-click on your chosen place." + S("Lava Bucket"), + S("A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution."), + S("Choose a place where you want to empty the bucket, then get in a safe spot somewhere above it. Be prepared to run away when something goes wrong as the lava will soon start to flow after placing. To empty the bucket (which places a lava source), right-click on your chosen place.") ) -- Water bucket @@ -313,9 +315,9 @@ if mod_mcl_core then {"mcl_core:water_source"}, "mcl_buckets:bucket_water", "bucket_water.png", - "Water Bucket", - "A bucket can be used to collect and release liquids. This one is filled with water.", - "Right-click on any block to empty the bucket and put a water source on this spot.", + S("Water Bucket"), + S("A bucket can be used to collect and release liquids. This one is filled with water."), + S("Right-click on any block to empty the bucket and put a water source on this spot."), function(pos, placer) -- Check protection local placer_name = "" @@ -355,9 +357,9 @@ if mod_mclx_core then {"mclx_core:river_water_source"}, "mcl_buckets:bucket_river_water", "bucket_river_water.png", - "River Water Bucket", - "A bucket can be used to collect and release liquids. This one is filled with river water.", - "Right-click on any block to empty the bucket and put a river water source on this spot.", + S("River Water Bucket"), + S("A bucket can be used to collect and release liquids. This one is filled with river water."), + S("Right-click on any block to empty the bucket and put a river water source on this spot."), function(pos, placer) -- Check protection local placer_name = "" diff --git a/mods/ITEMS/mcl_cake/init.lua b/mods/ITEMS/mcl_cake/init.lua index ca6f7a556..f3cc02329 100644 --- a/mods/ITEMS/mcl_cake/init.lua +++ b/mods/ITEMS/mcl_cake/init.lua @@ -3,6 +3,8 @@ #!#!#!#Released under CC Attribution-ShareAlike 3.0 Unported #!#!# ]]-- +local S = minetest.get_translator("mcl_cake") + local cake_texture = {"cake_top.png","cake_bottom.png","cake_inner.png","cake_side.png","cake_side.png","cake_side.png"} local slice_1 = { -7/16, -8/16, -7/16, -5/16, 0/16, 7/16} local slice_2 = { -7/16, -8/16, -7/16, -3/16, 0/16, 7/16} @@ -28,9 +30,9 @@ minetest.register_craft({ }) minetest.register_node("mcl_cake:cake", { - description = "Cake", - _doc_items_longdesc = "Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.", - _doc_items_usagehelp = "Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.", + description = S("Cake"), + _doc_items_longdesc = S("Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken."), + _doc_items_usagehelp = S("Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full."), tiles = {"cake_top.png","cake_bottom.png","cake_side.png","cake_side.png","cake_side.png","cake_side.png"}, inventory_image = "cake.png", wield_image = "cake.png", @@ -134,9 +136,9 @@ local register_slice = function(level, nodebox, desc) end end -register_slice(6, slice_6, "Cake (6 Slices Left)") -register_slice(5, slice_5, "Cake (5 Slices Left)") -register_slice(4, slice_4, "Cake (4 Slices Left)") -register_slice(3, slice_3, "Cake (3 Slices Left)") -register_slice(2, slice_2, "Cake (2 Slices Left)") -register_slice(1, slice_1, "Cake (1 Slice Left)") +register_slice(6, slice_6, S("Cake (6 Slices Left)")) +register_slice(5, slice_5, S("Cake (5 Slices Left)")) +register_slice(4, slice_4, S("Cake (4 Slices Left)")) +register_slice(3, slice_3, S("Cake (3 Slices Left)")) +register_slice(2, slice_2, S("Cake (2 Slices Left)")) +register_slice(1, slice_1, S("Cake (1 Slice Left)")) diff --git a/mods/ITEMS/mcl_cauldrons/init.lua b/mods/ITEMS/mcl_cauldrons/init.lua index 0b447155c..aee2a314a 100644 --- a/mods/ITEMS/mcl_cauldrons/init.lua +++ b/mods/ITEMS/mcl_cauldrons/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_cauldron") + -- Cauldron mod, adds cauldrons. -- TODO: Extinguish fire of burning entities @@ -42,9 +44,9 @@ end -- Empty cauldron minetest.register_node("mcl_cauldrons:cauldron", { - description = "Cauldron", - _doc_items_longdesc = "Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.", - _doc_items_usagehelp = "Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.", + description = S("Cauldron"), + _doc_items_longdesc = S("Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners."), + _doc_items_usagehelp = S("Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer."), wield_image = "mcl_cauldrons_cauldron.png", inventory_image = "mcl_cauldrons_cauldron.png", drawtype = "nodebox", @@ -101,14 +103,14 @@ local register_filled_cauldron = function(water_level, description, river_water) end -- Filled cauldrons (3 levels) -register_filled_cauldron(1, "Cauldron (1/3 Water)") -register_filled_cauldron(2, "Cauldron (2/3 Water)") -register_filled_cauldron(3, "Cauldron (3/3 Water)") +register_filled_cauldron(1, S("Cauldron (1/3 Water)")) +register_filled_cauldron(2, S("Cauldron (2/3 Water)")) +register_filled_cauldron(3, S("Cauldron (3/3 Water)")) if minetest.get_modpath("mclx_core") then - register_filled_cauldron(1, "Cauldron (1/3 River Water)", true) - register_filled_cauldron(2, "Cauldron (2/3 River Water)", true) - register_filled_cauldron(3, "Cauldron (3/3 River Water)", true) + register_filled_cauldron(1, S("Cauldron (1/3 River Water)"), true) + register_filled_cauldron(2, S("Cauldron (2/3 River Water)"), true) + register_filled_cauldron(3, S("Cauldron (3/3 River Water)"), true) end minetest.register_craft({ diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 57c991ce3..9f0ebd45b 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_chests") + local no_rotate, simple_rotate if minetest.get_modpath("screwdriver") then no_rotate = screwdriver.disallow @@ -446,9 +448,9 @@ end end register_chest("chest", - "Chest", - "Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.", - "To access the chest's inventory, rightclick the chest. When broken, the items of the chest will drop out.", + S("Chest"), + S("Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other."), + S("To access the chest's inventory, rightclick the chest. When broken, the items of the chest will drop out."), { small = {"default_chest_top.png", "mcl_chests_chest_bottom.png", "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", @@ -476,9 +478,9 @@ local traptiles = { } register_chest("trapped_chest", - "Trapped Chest", - "A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.", - "To access the inventory of a trapped chest, rightclick it. When broken, the items will drop out.", + S("Trapped Chest"), + S("A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other."), + S("To access the inventory of a trapped chest, rightclick it. When broken, the items will drop out."), traptiles, nil, {receptor = { @@ -599,9 +601,9 @@ minetest.register_craft({ }) minetest.register_node("mcl_chests:ender_chest", { - description = "Ender Chest", - _doc_items_longdesc = "Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.", - _doc_items_usagehelp = "Rightclick the ender chest to access your personal interdimensional inventory.", + description = S("Ender Chest"), + _doc_items_longdesc = S("Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players."), + _doc_items_usagehelp = S("Rightclick the ender chest to access your personal interdimensional inventory."), tiles = {"mcl_chests_ender_chest_top.png", "mcl_chests_ender_chest_bottom.png", "mcl_chests_ender_chest_right.png", "mcl_chests_ender_chest_left.png", "mcl_chests_ender_chest_back.png", "mcl_chests_ender_chest_front.png"}, @@ -648,22 +650,22 @@ minetest.register_craft({ -- Shulker boxes local boxtypes = { - white = "White Shulker Box", - grey = "Light Grey Shulker Box", - orange = "Orange Shulker Box", - cyan = "Cyan Shulker Box", - magenta = "Magenta Shulker Box", - violet = "Purple Shulker Box", - lightblue = "Light Blue Shulker Box", - blue = "Blue Shulker Box", - yellow = "Yellow Shulker Box", - brown = "Brown Shulker Box", - green = "Lime Shulker Box", - dark_green = "Green Shulker Box", - pink = "Pink Shulker Box", - red = "Red Shulker Box", - dark_grey = "Grey Shulker Box", - black = "Black Shulker Box", + white = S("White Shulker Box"), + grey = S("Light Grey Shulker Box"), + orange = S("Orange Shulker Box"), + cyan = S("Cyan Shulker Box"), + magenta = S("Magenta Shulker Box"), + violet = S("Purple Shulker Box"), + lightblue = S("Light Blue Shulker Box"), + blue = S("Blue Shulker Box"), + yellow = S("Yellow Shulker Box"), + brown = S("Brown Shulker Box"), + green = S("Lime Shulker Box"), + dark_green = S("Green Shulker Box"), + pink = S("Pink Shulker Box"), + red = S("Red Shulker Box"), + dark_grey = S("Grey Shulker Box"), + black = S("Black Shulker Box"), } local shulker_mob_textures = { @@ -689,8 +691,8 @@ for color, desc in pairs(boxtypes) do local mob_texture = shulker_mob_textures[color] minetest.register_node("mcl_chests:"..color.."_shulker_box", { description = desc, - _doc_items_longdesc = "A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.", - _doc_items_usagehelp = "To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.", + _doc_items_longdesc = S("A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors."), + _doc_items_usagehelp = S("To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents."), tiles = { "mcl_chests_"..color.."_shulker_box_top.png", -- top "[combine:16x16:-32,-28="..mob_texture, -- bottom diff --git a/mods/ITEMS/mcl_clock/init.lua b/mods/ITEMS/mcl_clock/init.lua index 0f0b8461a..2e2d1b00a 100644 --- a/mods/ITEMS/mcl_clock/init.lua +++ b/mods/ITEMS/mcl_clock/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_clock") + --[[ mcl_clock, renew of the renew of the watch mod @@ -54,11 +56,11 @@ function watch.register_item(name, image, creative, frame) end local longdesc, usagehelp if use_doc then - longdesc = "Clocks are tools which shows the current time of day in the Overworld." - usagehelp = "The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol." + longdesc = S("Clocks are tools which shows the current time of day in the Overworld.") + usagehelp = S("The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol.") end minetest.register_craftitem(name, { - description = "Clock", + description = S("Clock"), _doc_items_create_entry = use_doc, _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, diff --git a/mods/ITEMS/mcl_cocoas/init.lua b/mods/ITEMS/mcl_cocoas/init.lua index fdd9f8c6e..cd780b917 100644 --- a/mods/ITEMS/mcl_cocoas/init.lua +++ b/mods/ITEMS/mcl_cocoas/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_cocoas") + mcl_cocoas = {} -- Place cocoa @@ -70,9 +72,9 @@ end --[[ TODO: Use a mesh for cocoas for perfect texture compability. ]] local crop_def = { - description = "Premature Cocoa", + description = S("Premature Cocoa"), _doc_items_create_entry = true, - _doc_items_longdesc = "Cocoas are plants which grow on the side of jungle trees in 3 stages.", + _doc_items_longdesc = S("Cocoas are plants which grow on the side of jungle trees in 3 stages."), drawtype = "nodebox", tiles = { "[combine:16x16:6,1=mcl_cocoas_cocoa_stage_0.png", "[combine:16x16:6,11=mcl_cocoas_cocoa_stage_0.png", @@ -115,7 +117,7 @@ local crop_def = { -- 2nd stage minetest.register_node("mcl_cocoas:cocoa_1", table.copy(crop_def)) -crop_def.description = "Medium Cocoa" +crop_def.description = S("Medium Cocoa") crop_def._doc_items_create_entry = false crop_def.groups.cocoa = 2 crop_def.tiles = { @@ -146,8 +148,8 @@ crop_def.selection_box = { minetest.register_node("mcl_cocoas:cocoa_2", table.copy(crop_def)) -- Final stage -crop_def.description = "Mature Cocoa" -crop_def._doc_items_longdesc = "A mature cocoa is a plant which grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further." +crop_def.description = S("Mature Cocoa") +crop_def._doc_items_longdesc = S("A mature cocoa is a plant which grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.") crop_def._doc_items_create_entry = true crop_def.groups.cocoa = 3 crop_def.tiles = { diff --git a/mods/ITEMS/mcl_compass/init.lua b/mods/ITEMS/mcl_compass/init.lua index a8d557e8e..ee7df7de7 100644 --- a/mods/ITEMS/mcl_compass/init.lua +++ b/mods/ITEMS/mcl_compass/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_compass") + mcl_compass = {} local compass_frames = 32 @@ -79,11 +81,11 @@ for i,img in ipairs(images) do local use_doc, longdesc, usagehelp use_doc = i == stereotype_frame if use_doc then - longdesc = "Compasses are tools which point to the world origin (X=0, Z=0) or the spawn point in the Overworld." + longdesc = S("Compasses are tools which point to the world origin (X=0, Z=0) or the spawn point in the Overworld.") end local itemstring = "mcl_compass:"..(i-1) minetest.register_craftitem(itemstring, { - description = "Compass", + description = S("Compass"), _doc_items_create_entry = use_doc, _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, diff --git a/mods/ITEMS/mcl_core/craftitems.lua b/mods/ITEMS/mcl_core/craftitems.lua index bbdd66ea6..42b6210ed 100644 --- a/mods/ITEMS/mcl_core/craftitems.lua +++ b/mods/ITEMS/mcl_core/craftitems.lua @@ -1,12 +1,14 @@ -- mods/default/craftitems.lua +local S = minetest.get_translator("mcl_core") + -- -- Crafting items -- minetest.register_craftitem("mcl_core:stick", { - description = "Stick", - _doc_items_longdesc = "Sticks are a very versatile crafting material; used in countless crafting recipes.", + description = S("Stick"), + _doc_items_longdesc = S("Sticks are a very versatile crafting material; used in countless crafting recipes."), _doc_items_hidden = false, inventory_image = "default_stick.png", stack_max = 64, @@ -14,16 +16,16 @@ minetest.register_craftitem("mcl_core:stick", { }) minetest.register_craftitem("mcl_core:paper", { - description = "Paper", - _doc_items_longdesc = "Paper is used to craft books and maps.", + description = S("Paper"), + _doc_items_longdesc = S("Paper is used to craft books and maps."), inventory_image = "default_paper.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:coal_lump", { - description = "Coal", - _doc_items_longdesc = "“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.", + description = S("Coal"), + _doc_items_longdesc = S("“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things."), _doc_items_hidden = false, groups = { coal=1 }, inventory_image = "default_coal_lump.png", @@ -32,8 +34,8 @@ minetest.register_craftitem("mcl_core:coal_lump", { }) minetest.register_craftitem("mcl_core:charcoal_lump", { - description = "Charcoal", - _doc_items_longdesc = "Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.", + description = S("Charcoal"), + _doc_items_longdesc = S("Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks."), _doc_items_hidden = false, groups = { coal=1 }, inventory_image = "mcl_core_charcoal.png", @@ -42,32 +44,32 @@ minetest.register_craftitem("mcl_core:charcoal_lump", { }) minetest.register_craftitem("mcl_core:iron_nugget", { - description = "Iron Nugget", - _doc_items_longdesc = "Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots.", + description = S("Iron Nugget"), + _doc_items_longdesc = S("Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots."), inventory_image = "mcl_core_iron_nugget.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:gold_nugget", { - description = "Gold Nugget", - _doc_items_longdesc = "Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.", + description = S("Gold Nugget"), + _doc_items_longdesc = S("Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots."), inventory_image = "mcl_core_gold_nugget.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:diamond", { - description = "Diamond", - _doc_items_longdesc = "Diamonds are precious minerals and useful to create the highest tier of armor and tools.", + description = S("Diamond"), + _doc_items_longdesc = S("Diamonds are precious minerals and useful to create the highest tier of armor and tools."), inventory_image = "default_diamond.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:clay_lump", { - description = "Clay Ball", - _doc_items_longdesc = "Clay balls are a raw material, mainly used to create bricks in the furnace.", + description = S("Clay Ball"), + _doc_items_longdesc = S("Clay balls are a raw material, mainly used to create bricks in the furnace."), _doc_items_hidden = false, inventory_image = "default_clay_lump.png", stack_max = 64, @@ -75,64 +77,64 @@ minetest.register_craftitem("mcl_core:clay_lump", { }) minetest.register_craftitem("mcl_core:iron_ingot", { - description = "Iron Ingot", - _doc_items_longdesc = "Molten iron. It is used to craft armor, tools, and whatnot.", + description = S("Iron Ingot"), + _doc_items_longdesc = S("Molten iron. It is used to craft armor, tools, and whatnot."), inventory_image = "default_steel_ingot.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:gold_ingot", { - description = "Gold Ingot", - _doc_items_longdesc = "Molten gold. It is used to craft armor, tools, and whatnot.", + description = S("Gold Ingot"), + _doc_items_longdesc = S("Molten gold. It is used to craft armor, tools, and whatnot."), inventory_image = "default_gold_ingot.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:emerald", { - description = "Emerald", - _doc_items_longdesc = "Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.", + description = S("Emerald"), + _doc_items_longdesc = S("Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting."), inventory_image = "mcl_core_emerald.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:brick", { - description = "Brick", - _doc_items_longdesc = "Bricks are used to craft brick blocks.", + description = S("Brick"), + _doc_items_longdesc = S("Bricks are used to craft brick blocks."), inventory_image = "default_clay_brick.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:flint", { - description = "Flint", - _doc_items_longdesc = "Flint is a raw material.", + description = S("Flint"), + _doc_items_longdesc = S("Flint is a raw material."), inventory_image = "default_flint.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_core:sugar", { - description = "Sugar", - _doc_items_longdesc = "Sugar comes from sugar canes and is used to make sweet foods.", + description = S("Sugar"), + _doc_items_longdesc = S("Sugar comes from sugar canes and is used to make sweet foods."), inventory_image = "mcl_core_sugar.png", stack_max = 64, groups = { craftitem = 1 }, }) minetest.register_craftitem("mcl_core:bowl",{ - description = "Bowl", - _doc_items_longdesc = "Bowls are mainly used to hold tasty soups.", + description = S("Bowl"), + _doc_items_longdesc = S("Bowls are mainly used to hold tasty soups."), inventory_image = "mcl_core_bowl.png", stack_max = 64, groups = { craftitem = 1 }, }) minetest.register_craftitem("mcl_core:apple", { - description = "Apple", - _doc_items_longdesc = "Apples are food items which can be eaten.", + description = S("Apple"), + _doc_items_longdesc = S("Apples are food items which can be eaten."), wield_image = "default_apple.png", inventory_image = "default_apple.png", stack_max = 64, @@ -144,8 +146,8 @@ minetest.register_craftitem("mcl_core:apple", { -- TODO: Status effects minetest.register_craftitem("mcl_core:apple_gold", { - description = core.colorize("#55FFFF", "Golden Apple"), - _doc_items_longdesc = "Golden apples are precious food items which can be eaten.", + description = core.colorize("#55FFFF", S("Golden Apple")), + _doc_items_longdesc = S("Golden apples are precious food items which can be eaten."), wield_image = "mcl_core_apple_golden.png", inventory_image = "mcl_core_apple_golden.png", stack_max = 64, diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 813950104..decdda0dc 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -1,8 +1,10 @@ +local S = minetest.get_translator("mcl_core") + -- Simple solid cubic nodes, most of them are the ground materials and simple building blocks minetest.register_node("mcl_core:stone", { - description = "Stone", - _doc_items_longdesc = "One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.", + description = S("Stone"), + _doc_items_longdesc = S("One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava."), _doc_items_hidden = false, tiles = {"default_stone.png"}, is_ground_content = true, @@ -15,8 +17,8 @@ minetest.register_node("mcl_core:stone", { }) minetest.register_node("mcl_core:stone_with_coal", { - description = "Coal Ore", - _doc_items_longdesc = "Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.", + description = S("Coal Ore"), + _doc_items_longdesc = S("Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height."), _doc_items_hidden = false, tiles = {"mcl_core_coal_ore.png"}, is_ground_content = true, @@ -29,8 +31,8 @@ minetest.register_node("mcl_core:stone_with_coal", { }) minetest.register_node("mcl_core:stone_with_iron", { - description = "Iron Ore", - _doc_items_longdesc = "Some iron contained in stone, it is prety common and can be found below sea level.", + description = S("Iron Ore"), + _doc_items_longdesc = S("Some iron contained in stone, it is prety common and can be found below sea level."), tiles = {"mcl_core_iron_ore.png"}, is_ground_content = true, stack_max = 64, @@ -43,8 +45,8 @@ minetest.register_node("mcl_core:stone_with_iron", { minetest.register_node("mcl_core:stone_with_gold", { - description = "Gold Ore", - _doc_items_longdesc = "This stone contains pure gold, a rare metal.", + description = S("Gold Ore"), + _doc_items_longdesc = S("This stone contains pure gold, a rare metal."), tiles = {"mcl_core_gold_ore.png"}, is_ground_content = true, stack_max = 64, @@ -62,8 +64,8 @@ local redstone_ore_activate = function(pos) t:start(redstone_timer) end minetest.register_node("mcl_core:stone_with_redstone", { - description = "Redstone Ore", - _doc_items_longdesc = "Redstone ore is commonly found near the bottom of the world. It glows when it is punched or walked upon.", + description = S("Redstone Ore"), + _doc_items_longdesc = S("Redstone ore is commonly found near the bottom of the world. It glows when it is punched or walked upon."), tiles = {"mcl_core_redstone_ore.png"}, is_ground_content = true, stack_max = 64, @@ -93,7 +95,7 @@ local redstone_ore_reactivate = function(pos) end -- Light the redstone ore up when it has been touched minetest.register_node("mcl_core:stone_with_redstone_lit", { - description = "Lit Redstone Ore", + description = S("Lit Redstone Ore"), _doc_items_create_entry = false, tiles = {"mcl_core_redstone_ore.png"}, paramtype = "light", @@ -126,8 +128,8 @@ minetest.register_node("mcl_core:stone_with_redstone_lit", { }) minetest.register_node("mcl_core:stone_with_lapis", { - description = "Lapis Lazuli Ore", - _doc_items_longdesc = "Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world.", + description = S("Lapis Lazuli Ore"), + _doc_items_longdesc = S("Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world."), tiles = {"mcl_core_lapis_ore.png"}, is_ground_content = true, stack_max = 64, @@ -148,8 +150,8 @@ minetest.register_node("mcl_core:stone_with_lapis", { }) minetest.register_node("mcl_core:stone_with_emerald", { - description = "Emerald Ore", - _doc_items_longdesc = "Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.", + description = S("Emerald Ore"), + _doc_items_longdesc = S("Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters."), tiles = {"mcl_core_emerald_ore.png"}, is_ground_content = true, stack_max = 64, @@ -161,8 +163,8 @@ minetest.register_node("mcl_core:stone_with_emerald", { }) minetest.register_node("mcl_core:stone_with_diamond", { - description = "Diamond Ore", - _doc_items_longdesc = "Diamond ore is rare and can be found in clusters near the bottom of the world.", + description = S("Diamond Ore"), + _doc_items_longdesc = S("Diamond ore is rare and can be found in clusters near the bottom of the world."), tiles = {"mcl_core_diamond_ore.png"}, is_ground_content = true, stack_max = 64, @@ -174,7 +176,7 @@ minetest.register_node("mcl_core:stone_with_diamond", { }) minetest.register_node("mcl_core:stonebrick", { - description = "Stone Bricks", + description = S("Stone Bricks"), _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"default_stone_brick.png"}, stack_max = 64, @@ -186,7 +188,7 @@ minetest.register_node("mcl_core:stonebrick", { }) minetest.register_node("mcl_core:stonebrickcarved", { - description = "Chiseled Stone Bricks", + description = S("Chiseled Stone Bricks"), _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_carved.png"}, stack_max = 64, @@ -198,7 +200,7 @@ minetest.register_node("mcl_core:stonebrickcarved", { }) minetest.register_node("mcl_core:stonebrickcracked", { - description = "Cracked Stone Bricks", + description = S("Cracked Stone Bricks"), _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_cracked.png"}, stack_max = 64, @@ -210,7 +212,7 @@ minetest.register_node("mcl_core:stonebrickcracked", { }) minetest.register_node("mcl_core:stonebrickmossy", { - description = "Mossy Stone Bricks", + description = S("Mossy Stone Bricks"), _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_mossy.png"}, stack_max = 64, @@ -222,7 +224,7 @@ minetest.register_node("mcl_core:stonebrickmossy", { }) minetest.register_node("mcl_core:stone_smooth", { - description = "Polished Stone", + description = S("Polished Stone"), _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_stairs_stone_slab_top.png"}, stack_max = 64, @@ -234,7 +236,7 @@ minetest.register_node("mcl_core:stone_smooth", { }) minetest.register_node("mcl_core:granite", { - description = "Granite", + description = S("Granite"), _doc_items_longdesc = "Granite is an igneous rock.", tiles = {"mcl_core_granite.png"}, is_ground_content = true, @@ -246,8 +248,8 @@ minetest.register_node("mcl_core:granite", { }) minetest.register_node("mcl_core:granite_smooth", { - description = "Polished Granite", - _doc_items_longdesc = "Polished granite is a decorational building block made from granite.", + description = S("Polished Granite"), + _doc_items_longdesc = S("Polished granite is a decorational building block made from granite."), tiles = {"mcl_core_granite_smooth.png"}, stack_max = 64, is_ground_content = false, @@ -258,8 +260,8 @@ minetest.register_node("mcl_core:granite_smooth", { }) minetest.register_node("mcl_core:andesite", { - description = "Andesite", - _doc_items_longdesc = "Andesite is an igneous rock.", + description = S("Andesite"), + _doc_items_longdesc = S("Andesite is an igneous rock."), tiles = {"mcl_core_andesite.png"}, is_ground_content = true, stack_max = 64, @@ -270,8 +272,8 @@ minetest.register_node("mcl_core:andesite", { }) minetest.register_node("mcl_core:andesite_smooth", { - description = "Polished Andesite", - _doc_items_longdesc = "Polished andesite is a decorational building block made from andesite.", + description = S("Polished Andesite"), + _doc_items_longdesc = S("Polished andesite is a decorational building block made from andesite."), tiles = {"mcl_core_andesite_smooth.png"}, is_ground_content = false, stack_max = 64, @@ -282,8 +284,8 @@ minetest.register_node("mcl_core:andesite_smooth", { }) minetest.register_node("mcl_core:diorite", { - description = "Diorite", - _doc_items_longdesc = "Diorite is an igneous rock.", + description = S("Diorite"), + _doc_items_longdesc = S("Diorite is an igneous rock."), tiles = {"mcl_core_diorite.png"}, is_ground_content = true, stack_max = 64, @@ -294,8 +296,8 @@ minetest.register_node("mcl_core:diorite", { }) minetest.register_node("mcl_core:diorite_smooth", { - description = "Polished Diorite", - _doc_items_longdesc = "Polished diorite is a decorational building block made from diorite.", + description = S("Polished Diorite"), + _doc_items_longdesc = S("Polished diorite is a decorational building block made from diorite."), tiles = {"mcl_core_diorite_smooth.png"}, is_ground_content = false, stack_max = 64, @@ -307,8 +309,8 @@ minetest.register_node("mcl_core:diorite_smooth", { -- Grass Block minetest.register_node("mcl_core:dirt_with_grass", { - description = "Grass Block", - _doc_items_longdesc = "A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.", + description = S("Grass Block"), + _doc_items_longdesc = S("A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt."), _doc_items_hidden = false, tiles = {"default_grass.png", "default_dirt.png", {name="default_dirt.png^default_grass_side.png", tileable_vertical=false}}, is_ground_content = true, @@ -367,8 +369,8 @@ end minetest.register_node("mcl_core:grass_path", { tiles = {"mcl_core_grass_path_top.png", "default_dirt.png", "mcl_core_grass_path_side.png"}, - description = "Grass Path", - _doc_items_longdesc = "Grass paths are a decorational variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.", + description = S("Grass Path"), + _doc_items_longdesc = S("Grass paths are a decorational variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block."), drop = "mcl_core:dirt", is_ground_content = true, drawtype = "nodebox", @@ -390,8 +392,8 @@ minetest.register_node("mcl_core:grass_path", { -- TODO: Add particles minetest.register_node("mcl_core:mycelium", { - description = "Mycelium", - _doc_items_longdesc = "Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt.", + description = S("Mycelium"), + _doc_items_longdesc = S("Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt."), tiles = {"mcl_core_mycelium_top.png", "default_dirt.png", {name="mcl_core_mycelium_side.png", tileable_vertical=false}}, is_ground_content = true, stack_max = 64, @@ -409,8 +411,8 @@ minetest.register_node("mcl_core:mycelium", { mcl_core.register_snowed_node("mcl_core:mycelium_snow", "mcl_core:mycelium") minetest.register_node("mcl_core:podzol", { - description = "Podzol", - _doc_items_longdesc = "Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.", + description = S("Podzol"), + _doc_items_longdesc = S("Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it."), tiles = {"mcl_core_dirt_podzol_top.png", "default_dirt.png", {name="mcl_core_dirt_podzol_side.png", tileable_vertical=false}}, is_ground_content = true, stack_max = 64, @@ -425,8 +427,8 @@ minetest.register_node("mcl_core:podzol", { mcl_core.register_snowed_node("mcl_core:podzol_snow", "mcl_core:podzol") minetest.register_node("mcl_core:dirt", { - description = "Dirt", - _doc_items_longdesc = "Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby.", + description = S("Dirt"), + _doc_items_longdesc = S("Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby."), _doc_items_hidden = false, tiles = {"default_dirt.png"}, is_ground_content = true, @@ -438,8 +440,8 @@ minetest.register_node("mcl_core:dirt", { }) minetest.register_node("mcl_core:coarse_dirt", { - description = "Coarse Dirt", - _doc_items_longdesc = "Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.", + description = S("Coarse Dirt"), + _doc_items_longdesc = S("Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover."), tiles = {"mcl_core_coarse_dirt.png"}, is_ground_content = true, stack_max = 64, @@ -450,8 +452,8 @@ minetest.register_node("mcl_core:coarse_dirt", { }) minetest.register_node("mcl_core:gravel", { - description = "Gravel", - _doc_items_longdesc = "This block consists of a couple of loose stones and can't support itself.", + description = S("Gravel"), + _doc_items_longdesc = S("This block consists of a couple of loose stones and can't support itself."), tiles = {"default_gravel.png"}, is_ground_content = true, stack_max = 64, @@ -472,8 +474,8 @@ minetest.register_node("mcl_core:gravel", { -- sandstone -- minetest.register_node("mcl_core:sand", { - description = "Sand", - _doc_items_longdesc = "Sand is found in large quantities at beaches and deserts.", + description = S("Sand"), + _doc_items_longdesc = S("Sand is found in large quantities at beaches and deserts."), _doc_items_hidden = false, tiles = {"default_sand.png"}, is_ground_content = true, @@ -485,9 +487,9 @@ minetest.register_node("mcl_core:sand", { }) minetest.register_node("mcl_core:sandstone", { - description = "Sandstone", + description = S("Sandstone"), _doc_items_hidden = false, - _doc_items_longdesc = "Sandstone is compressed sand and is a rather soft kind of stone.", + _doc_items_longdesc = S("Sandstone is compressed sand and is a rather soft kind of stone."), tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, @@ -498,8 +500,8 @@ minetest.register_node("mcl_core:sandstone", { }) minetest.register_node("mcl_core:sandstonesmooth", { - description = "Cut Sandstone", - _doc_items_longdesc = "Cut sandstone is a decorational building block.", + description = S("Cut Sandstone"), + _doc_items_longdesc = S("Cut sandstone is a decorational building block."), tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, @@ -510,8 +512,8 @@ minetest.register_node("mcl_core:sandstonesmooth", { }) minetest.register_node("mcl_core:sandstonecarved", { - description = "Chiseled Sandstone", - _doc_items_longdesc = "Chiseled sandstone is a decorational building block.", + description = S("Chiseled Sandstone"), + _doc_items_longdesc = S("Chiseled sandstone is a decorational building block."), tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_carved.png"}, is_ground_content = false, stack_max = 64, @@ -522,9 +524,9 @@ minetest.register_node("mcl_core:sandstonecarved", { }) minetest.register_node("mcl_core:sandstonesmooth2", { - description = "Smooth Sandstone", + description = S("Smooth Sandstone"), _doc_items_hidden = false, - _doc_items_longdesc = "Smooth sandstone is compressed sand and is a rather soft kind of stone.", + _doc_items_longdesc = S("Smooth sandstone is compressed sand and is a rather soft kind of stone."), tiles = {"mcl_core_sandstone_top.png"}, is_ground_content = false, stack_max = 64, @@ -537,8 +539,8 @@ minetest.register_node("mcl_core:sandstonesmooth2", { -- red sandstone -- minetest.register_node("mcl_core:redsand", { - description = "Red Sand", - _doc_items_longdesc = "Red sand is found in large quantities in mesa biomes.", + description = S("Red Sand"), + _doc_items_longdesc = S("Red sand is found in large quantities in mesa biomes."), tiles = {"mcl_core_red_sand.png"}, is_ground_content = true, stack_max = 64, @@ -549,8 +551,8 @@ minetest.register_node("mcl_core:redsand", { }) minetest.register_node("mcl_core:redsandstone", { - description = "Red Sandstone", - _doc_items_longdesc = "Red sandstone is compressed red sand and is a rather soft kind of stone.", + description = S("Red Sandstone"), + _doc_items_longdesc = S("Red sandstone is compressed red sand and is a rather soft kind of stone."), tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, @@ -561,8 +563,8 @@ minetest.register_node("mcl_core:redsandstone", { }) minetest.register_node("mcl_core:redsandstonesmooth", { - description = "Cut Red Sandstone", - _doc_items_longdesc = "Cut red sandstone is a decorational building block.", + description = S("Cut Red Sandstone"), + _doc_items_longdesc = S("Cut red sandstone is a decorational building block."), tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, @@ -573,8 +575,8 @@ minetest.register_node("mcl_core:redsandstonesmooth", { }) minetest.register_node("mcl_core:redsandstonecarved", { - description = "Chiseled Red Sandstone", - _doc_items_longdesc = "Chiseled red sandstone is a decorational building block.", + description = S("Chiseled Red Sandstone"), + _doc_items_longdesc = S("Chiseled red sandstone is a decorational building block."), tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_carved.png"}, is_ground_content = false, stack_max = 64, @@ -585,8 +587,8 @@ minetest.register_node("mcl_core:redsandstonecarved", { }) minetest.register_node("mcl_core:redsandstonesmooth2", { - description = "Smooth Red Sandstone", - _doc_items_longdesc = "Smooth red sandstone is a decorational building block.", + description = S("Smooth Red Sandstone"), + _doc_items_longdesc = S("Smooth red sandstone is a decorational building block."), tiles = {"mcl_core_red_sandstone_top.png"}, is_ground_content = false, stack_max = 64, @@ -599,8 +601,8 @@ minetest.register_node("mcl_core:redsandstonesmooth2", { --- minetest.register_node("mcl_core:clay", { - description = "Clay", - _doc_items_longdesc = "Clay is a versatile kind of earth commonly found at beaches underwater.", + description = S("Clay"), + _doc_items_longdesc = S("Clay is a versatile kind of earth commonly found at beaches underwater."), _doc_items_hidden = false, tiles = {"default_clay.png"}, is_ground_content = true, @@ -614,8 +616,8 @@ minetest.register_node("mcl_core:clay", { minetest.register_node("mcl_core:brick_block", { -- Original name: “Bricks” - description = "Brick Block", - _doc_items_longdesc = "Brick blocks are a good building material for building solid houses and can take quite a punch.", + description = S("Brick Block"), + _doc_items_longdesc = S("Brick blocks are a good building material for building solid houses and can take quite a punch."), tiles = {"default_brick.png"}, is_ground_content = false, stack_max = 64, @@ -627,9 +629,9 @@ minetest.register_node("mcl_core:brick_block", { minetest.register_node("mcl_core:bedrock", { - description = "Bedrock", - _doc_items_longdesc = "Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.".."\n".. - "In the End dimension, starting a fire on this block will create an eternal fire.", + description = S("Bedrock"), + _doc_items_longdesc = S("Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.").."\n".. + S("In the End dimension, starting a fire on this block will create an eternal fire."), tiles = {"mcl_core_bedrock.png"}, stack_max = 64, groups = {creative_breakable=1, building_block=1, material_stone=1}, @@ -666,7 +668,7 @@ minetest.register_node("mcl_core:bedrock", { }) minetest.register_node("mcl_core:cobble", { - description = "Cobblestone", + description = S("Cobblestone"), _doc_items_longdesc = doc.sub.items.temp.build, _doc_items_hidden = false, tiles = {"default_cobble.png"}, @@ -679,7 +681,7 @@ minetest.register_node("mcl_core:cobble", { }) minetest.register_node("mcl_core:mossycobble", { - description = "Moss Stone", + description = S("Moss Stone"), _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"default_mossycobble.png"}, is_ground_content = false, @@ -691,8 +693,8 @@ minetest.register_node("mcl_core:mossycobble", { }) minetest.register_node("mcl_core:coalblock", { - description = "Block of Coal", - _doc_items_longdesc = "Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.", + description = S("Block of Coal"), + _doc_items_longdesc = S("Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal."), tiles = {"default_coal_block.png"}, is_ground_content = false, stack_max = 64, @@ -703,8 +705,8 @@ minetest.register_node("mcl_core:coalblock", { }) minetest.register_node("mcl_core:ironblock", { - description = "Block of Iron", - _doc_items_longdesc = "A block of iron is mostly a decorational block but also useful as a compact storage of iron ingots.", + description = S("Block of Iron"), + _doc_items_longdesc = S("A block of iron is mostly a decorational block but also useful as a compact storage of iron ingots."), tiles = {"default_steel_block.png"}, is_ground_content = false, stack_max = 64, @@ -715,8 +717,8 @@ minetest.register_node("mcl_core:ironblock", { }) minetest.register_node("mcl_core:goldblock", { - description = "Block of Gold", - _doc_items_longdesc = "A block of gold is mostly a shiny decorational block but also useful as a compact storage of gold ingots.", + description = S("Block of Gold"), + _doc_items_longdesc = S("A block of gold is mostly a shiny decorational block but also useful as a compact storage of gold ingots."), tiles = {"default_gold_block.png"}, is_ground_content = false, stack_max = 64, @@ -727,8 +729,8 @@ minetest.register_node("mcl_core:goldblock", { }) minetest.register_node("mcl_core:diamondblock", { - description = "Block of Diamond", - _doc_items_longdesc = "A block of diamond mostly a shiny decorational block but also useful as a compact storage of diamonds.", + description = S("Block of Diamond"), + _doc_items_longdesc = S("A block of diamond mostly a shiny decorational block but also useful as a compact storage of diamonds."), tiles = {"default_diamond_block.png"}, is_ground_content = false, stack_max = 64, @@ -739,8 +741,8 @@ minetest.register_node("mcl_core:diamondblock", { }) minetest.register_node("mcl_core:lapisblock", { - description = "Lapis Lazuli Block", - _doc_items_longdesc = "A lapis lazuli block is mostly a decorational block but also useful as a compact storage of lapis lazuli.", + description = S("Lapis Lazuli Block"), + _doc_items_longdesc = S("A lapis lazuli block is mostly a decorational block but also useful as a compact storage of lapis lazuli."), tiles = {"mcl_core_lapis_block.png"}, is_ground_content = false, stack_max = 64, @@ -751,8 +753,8 @@ minetest.register_node("mcl_core:lapisblock", { }) minetest.register_node("mcl_core:emeraldblock", { - description = "Block of Emerald", - _doc_items_longdesc = "A block of emerald is mostly a shiny decorational block but also useful as a compact storage of emeralds.", + description = S("Block of Emerald"), + _doc_items_longdesc = S("A block of emerald is mostly a shiny decorational block but also useful as a compact storage of emeralds."), tiles = {"mcl_core_emerald_block.png"}, is_ground_content = false, stack_max = 64, @@ -763,8 +765,8 @@ minetest.register_node("mcl_core:emeraldblock", { }) minetest.register_node("mcl_core:obsidian", { - description = "Obsidian", - _doc_items_longdesc = "Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava.", + description = S("Obsidian"), + _doc_items_longdesc = S("Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava."), tiles = {"default_obsidian.png"}, is_ground_content = true, sounds = mcl_sounds.node_sound_stone_defaults(), @@ -775,8 +777,8 @@ minetest.register_node("mcl_core:obsidian", { }) minetest.register_node("mcl_core:ice", { - description = "Ice", - _doc_items_longdesc = "Ice is a translucent solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.", + description = S("Ice"), + _doc_items_longdesc = S("Ice is a translucent solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source."), drawtype = "glasslike", tiles = {"default_ice.png"}, is_ground_content = true, @@ -800,8 +802,8 @@ minetest.register_node("mcl_core:ice", { }) minetest.register_node("mcl_core:packed_ice", { - description = "Packed Ice", - _doc_items_longdesc = "Packed ice is a compressed form of ice. It is opaque and solid.", + description = S("Packed Ice"), + _doc_items_longdesc = S("Packed ice is a compressed form of ice. It is opaque and solid."), tiles = {"mcl_core_ice_packed.png"}, is_ground_content = true, stack_max = 64, @@ -840,10 +842,10 @@ for i=0,3 do local use_doc = i == 0 local longdesc if use_doc then - longdesc = "Frosted ice is a short-lived solid translucent block. It melts into a water source within a few seconds." + longdesc = S("Frosted ice is a short-lived solid translucent block. It melts into a water source within a few seconds.") end minetest.register_node("mcl_core:frosted_ice_"..i, { - description = "Frosted Ice", + description = S("Frosted Ice"), _doc_items_create_entry = use_doc, _doc_items_longdesc = longdesc, drawtype = "glasslike", @@ -886,8 +888,8 @@ for i=1,8 do local id, desc, longdesc, usagehelp, help, walkable, drawtype, node_box if i == 1 then id = "mcl_core:snow" - desc = "Top Snow" - longdesc = "Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.".."\n".."Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height." + desc = S("Top Snow") + longdesc = S("Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.".."\n".."Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.") usagehelp = "This block can only be placed on full solid blocks and on another top snow (which increases its height)." walkable = false else @@ -995,8 +997,8 @@ for i=1,8 do end minetest.register_node("mcl_core:snowblock", { - description = "Snow", - _doc_items_longdesc = "This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.", + description = S("Snow"), + _doc_items_longdesc = S("This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold."), _doc_items_hidden = false, tiles = {"default_snow.png"}, is_ground_content = true, diff --git a/mods/ITEMS/mcl_core/nodes_cactuscane.lua b/mods/ITEMS/mcl_core/nodes_cactuscane.lua index d0c00654b..59efa7592 100644 --- a/mods/ITEMS/mcl_core/nodes_cactuscane.lua +++ b/mods/ITEMS/mcl_core/nodes_cactuscane.lua @@ -1,9 +1,11 @@ -- Cactus and Sugar Cane +local S = minetest.get_translator("mcl_core") + minetest.register_node("mcl_core:cactus", { - description = "Cactus", - _doc_items_longdesc = "This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.", - _doc_items_usagehelp = "A cactus can only be placed on top of another cactus or any sand.", + description = S("Cactus"), + _doc_items_longdesc = S("This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well."), + _doc_items_usagehelp = S("A cactus can only be placed on top of another cactus or any sand."), drawtype = "nodebox", tiles = {"mcl_core_cactus_top.png", "mcl_core_cactus_bottom.png", "mcl_core_cactus_side.png"}, is_ground_content = true, @@ -44,9 +46,9 @@ minetest.register_node("mcl_core:cactus", { }) minetest.register_node("mcl_core:reeds", { - description = "Sugar Canes", - _doc_items_longdesc = "Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.", - _doc_items_usagehelp = "Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.", + description = S("Sugar Canes"), + _doc_items_longdesc = S("Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well."), + _doc_items_usagehelp = S("Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow."), drawtype = "plantlike", tiles = {"default_papyrus.png"}, inventory_image = "mcl_core_reeds.png", diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 25f8cdb51..eda1fc66e 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -1,8 +1,9 @@ -- Climbable nodes +local S = minetest.get_translator("mcl_core") minetest.register_node("mcl_core:ladder", { - description = "Ladder", - _doc_items_longdesc = "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.", + 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."), drawtype = "signlike", is_ground_content = false, tiles = {"default_ladder.png"}, @@ -77,8 +78,8 @@ minetest.register_node("mcl_core:ladder", { minetest.register_node("mcl_core:vine", { - description = "Vines", - _doc_items_longdesc = "Vines are climbable blocks which can be placed on the sides solid full-cube blocks. Vines slowly grow and spread.", + description = S("Vines"), + _doc_items_longdesc = S("Vines are climbable blocks which can be placed on the sides solid full-cube blocks. Vines slowly grow and spread."), drawtype = "signlike", tiles = {"mcl_core_vine.png"}, inventory_image = "mcl_core_vine.png", diff --git a/mods/ITEMS/mcl_core/nodes_glass.lua b/mods/ITEMS/mcl_core/nodes_glass.lua index 6bd8a9248..b9344962f 100644 --- a/mods/ITEMS/mcl_core/nodes_glass.lua +++ b/mods/ITEMS/mcl_core/nodes_glass.lua @@ -1,8 +1,9 @@ -- Glass nodes +local S = minetest.get_translator("mcl_core") minetest.register_node("mcl_core:glass", { - description = "Glass", - _doc_items_longdesc = "A decorational and mostly transparent block.", + description = S("Glass"), + _doc_items_longdesc = S("A decorational and mostly transparent block."), drawtype = "glasslike", is_ground_content = false, tiles = {"default_glass.png"}, @@ -23,7 +24,7 @@ function mcl_core.add_glass(desc, recipeitem, colorgroup, color) minetest.register_node("mcl_core:glass_"..color, { description = desc, - _doc_items_longdesc = "Stained glass is a decorational and mostly transparent block which comes in various different colors.", + _doc_items_longdesc = S("Stained glass is a decorational and mostly transparent block which comes in various different colors."), drawtype = "glasslike", is_ground_content = false, tiles = {"mcl_core_glass_"..color..".png"}, @@ -50,20 +51,20 @@ function mcl_core.add_glass(desc, recipeitem, colorgroup, color) end ---- colored glass -mcl_core.add_glass( "Red Stained Glass", "mcl_dye:red", "basecolor_red", "red") -mcl_core.add_glass( "Green Stained Glass", "mcl_dye:dark_green", "unicolor_dark_green", "green") -mcl_core.add_glass( "Blue Stained Glass", "mcl_dye:blue", "basecolor_blue", "blue") -mcl_core.add_glass( "Light Blue Stained Glass", "mcl_dye:lightblue", "unicolor_light_blue", "light_blue") -mcl_core.add_glass( "Black Stained Glass", "mcl_dye:black", "basecolor_black", "black") -mcl_core.add_glass( "White Stained Glass", "mcl_dye:white", "basecolor_white", "white") -mcl_core.add_glass( "Yellow Stained Glass", "mcl_dye:yellow", "basecolor_yellow", "yellow") -mcl_core.add_glass( "Brown Stained Glass", "mcl_dye:brown", "unicolor_dark_orange", "brown") -mcl_core.add_glass( "Orange Stained Glass", "mcl_dye:orange", "excolor_orange", "orange") -mcl_core.add_glass( "Pink Stained Glass", "mcl_dye:pink", "unicolor_light_red", "pink") -mcl_core.add_glass( "Grey Stained Glass", "mcl_dye:dark_grey", "unicolor_darkgrey", "gray") -mcl_core.add_glass( "Lime Stained Glass", "mcl_dye:green", "basecolor_green", "lime") -mcl_core.add_glass( "Light Grey Stained Glass", "mcl_dye:grey", "basecolor_grey", "silver") -mcl_core.add_glass( "Magenta Stained Glass", "mcl_dye:magenta", "basecolor_magenta", "magenta") -mcl_core.add_glass( "Purple Stained Glass", "mcl_dye:violet", "excolor_violet", "purple") -mcl_core.add_glass( "Cyan Stained Glass", "mcl_dye:cyan", "basecolor_cyan", "cyan") +mcl_core.add_glass( S("Red Stained Glass"), "mcl_dye:red", "basecolor_red", "red") +mcl_core.add_glass( S("Green Stained Glass"), "mcl_dye:dark_green", "unicolor_dark_green", "green") +mcl_core.add_glass( S("Blue Stained Glass"), "mcl_dye:blue", "basecolor_blue", "blue") +mcl_core.add_glass( S("Light Blue Stained Glass"), "mcl_dye:lightblue", "unicolor_light_blue", "light_blue") +mcl_core.add_glass( S("Black Stained Glass"), "mcl_dye:black", "basecolor_black", "black") +mcl_core.add_glass( S("White Stained Glass"), "mcl_dye:white", "basecolor_white", "white") +mcl_core.add_glass( S("Yellow Stained Glass"), "mcl_dye:yellow", "basecolor_yellow", "yellow") +mcl_core.add_glass( S("Brown Stained Glass"), "mcl_dye:brown", "unicolor_dark_orange", "brown") +mcl_core.add_glass( S("Orange Stained Glass"), "mcl_dye:orange", "excolor_orange", "orange") +mcl_core.add_glass( S("Pink Stained Glass"), "mcl_dye:pink", "unicolor_light_red", "pink") +mcl_core.add_glass( S("Grey Stained Glass"), "mcl_dye:dark_grey", "unicolor_darkgrey", "gray") +mcl_core.add_glass( S("Lime Stained Glass"), "mcl_dye:green", "basecolor_green", "lime") +mcl_core.add_glass( S("Light Grey Stained Glass"), "mcl_dye:grey", "basecolor_grey", "silver") +mcl_core.add_glass( S("Magenta Stained Glass"), "mcl_dye:magenta", "basecolor_magenta", "magenta") +mcl_core.add_glass( S("Purple Stained Glass"), "mcl_dye:violet", "excolor_violet", "purple") +mcl_core.add_glass( S("Cyan Stained Glass"), "mcl_dye:cyan", "basecolor_cyan", "cyan") diff --git a/mods/ITEMS/mcl_core/nodes_liquid.lua b/mods/ITEMS/mcl_core/nodes_liquid.lua index 7d7386907..8fe032054 100644 --- a/mods/ITEMS/mcl_core/nodes_liquid.lua +++ b/mods/ITEMS/mcl_core/nodes_liquid.lua @@ -1,11 +1,13 @@ -- Liquids: Water and lava +local S = minetest.get_translator("mcl_core") + local WATER_ALPHA = 179 local WATER_VISC = 1 local LAVA_VISC = 7 minetest.register_node("mcl_core:water_flowing", { - description = "Flowing Water", + description = S("Flowing Water"), _doc_items_create_entry = false, wield_image = "default_water_flowing_animated.png^[verticalframe:64:0", drawtype = "flowingliquid", @@ -45,14 +47,14 @@ minetest.register_node("mcl_core:water_flowing", { }) minetest.register_node("mcl_core:water_source", { - description = "Water Source", - _doc_items_entry_name = "Water", + description = S("Water Source"), + _doc_items_entry_name = S("Water"), _doc_items_longdesc = -[[Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time. -Water interacts with lava in various ways: +S("Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.").."\n".. +S([[Water interacts with lava in various ways: • When water is directly above or horizontally next to a lava source, the lava turns into obsidian. • When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone. -• When water is directly below lava, the water turns into stone.]], +• When water is directly below lava, the water turns into stone.]]), _doc_items_hidden = false, drawtype = "liquid", tiles = { @@ -89,7 +91,7 @@ Water interacts with lava in various ways: }) minetest.register_node("mcl_core:lava_flowing", { - description = "Flowing Lava", + description = S("Flowing Lava"), _doc_items_create_entry = false, wield_image = "default_lava_flowing_animated.png^[verticalframe:64:0", drawtype = "flowingliquid", @@ -135,15 +137,15 @@ minetest.register_node("mcl_core:lava_flowing", { }) minetest.register_node("mcl_core:lava_source", { - description = "Lava Source", + description = S("Lava Source"), _doc_items_entry_name = "Lava", _doc_items_longdesc = -[[Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out. -A lava source sets fire to a couple of air blocks above when they're next to a flammable block. -Lava interacts with water various ways: +S("Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.").."\n".. +S("A lava source sets fire to a couple of air blocks above when they're next to a flammable block.").."\n".. +S([[Lava interacts with water various ways: • When a lava source is directly below or horizontally next to water, the lava turns into obsidian. • When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone. -• When lava is directly above water, the water turns into stone.]], +• When lava is directly above water, the water turns into stone.]]), drawtype = "liquid", tiles = { {name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}} diff --git a/mods/ITEMS/mcl_core/nodes_misc.lua b/mods/ITEMS/mcl_core/nodes_misc.lua index 26b25618b..7c6f7dc7e 100644 --- a/mods/ITEMS/mcl_core/nodes_misc.lua +++ b/mods/ITEMS/mcl_core/nodes_misc.lua @@ -1,8 +1,9 @@ -- Other nodes +local S = minetest.get_translator("mcl_core") minetest.register_node("mcl_core:bone_block", { - description = "Bone Block", - _doc_items_longdesc = "Bone blocks are decorational blocks and a compact storage of bone meal.", + description = S("Bone Block"), + _doc_items_longdesc = S("Bone blocks are decorational blocks and a compact storage of bone meal."), tiles = {"mcl_core_bone_block_top.png", "mcl_core_bone_block_top.png", "mcl_core_bone_block_side.png"}, is_ground_content = false, paramtype2 = "facedir", @@ -14,8 +15,8 @@ minetest.register_node("mcl_core:bone_block", { }) minetest.register_node("mcl_core:slimeblock", { - description = "Slime Block", - _doc_items_longdesc = "Slime blocks are very bouncy and prevent fall damage.", + description = S("Slime Block"), + _doc_items_longdesc = S("Slime blocks are very bouncy and prevent fall damage."), drawtype = "nodebox", paramtype = "light", is_ground_content = false, @@ -47,8 +48,8 @@ minetest.register_node("mcl_core:slimeblock", { }) minetest.register_node("mcl_core:cobweb", { - description = "Cobweb", - _doc_items_longdesc = "Cobwebs can be walked through, but significantly slow you down.", + description = S("Cobweb"), + _doc_items_longdesc = S("Cobwebs can be walked through, but significantly slow you down."), drawtype = "plantlike", paramtype2 = "degrotate", visual_scale = 1.1, @@ -73,8 +74,8 @@ minetest.register_node("mcl_core:cobweb", { minetest.register_node("mcl_core:deadbush", { - description = "Dead Bush", - _doc_items_longdesc = "Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks.", + description = S("Dead Bush"), + _doc_items_longdesc = S("Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks."), _doc_items_hidden = false, drawtype = "plantlike", waving = 1, @@ -112,9 +113,9 @@ minetest.register_node("mcl_core:deadbush", { }) minetest.register_node("mcl_core:barrier", { - description = "Barrier", - _doc_items_longdesc = "Barriers are invisble walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.", - _doc_items_usagehelp = "When you hold a barrier in hand, you reveal all placed barriers in a short distance around you.", + description = S("Barrier"), + _doc_items_longdesc = S("Barriers are invisble walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block."), + _doc_items_usagehelp = S("When you hold a barrier in hand, you reveal all placed barriers in a short distance around you."), drawtype = "airlike", paramtype = "light", inventory_image = "mcl_core_barrier.png", @@ -169,7 +170,7 @@ minetest.register_node("mcl_core:barrier", { -- This node only exists because Minetest does not have support for “dimensions” yet and needs to -- be removed when support for this is implemented. minetest.register_node("mcl_core:realm_barrier", { - description = "Realm Barrier", + description = S("Realm Barrier"), _doc_items_create_entry = false, drawtype = "airlike", paramtype = "light", @@ -202,7 +203,7 @@ minetest.register_node("mcl_core:realm_barrier", { -- The void does not exist as a block in Minecraft but we register it as a -- block here to make things easier for us. minetest.register_node("mcl_core:void", { - description = "Void", + description = S("Void"), _doc_items_create_entry = false, drawtype = "airlike", paramtype = "light", diff --git a/mods/ITEMS/mcl_core/nodes_trees.lua b/mods/ITEMS/mcl_core/nodes_trees.lua index afe03e3ff..433ae03ad 100644 --- a/mods/ITEMS/mcl_core/nodes_trees.lua +++ b/mods/ITEMS/mcl_core/nodes_trees.lua @@ -1,4 +1,5 @@ -- Tree nodes: Wood, Wooden Planks, Sapling, Leaves +local S = minetest.get_translator("mcl_core") -- Register tree trunk (wood) and bark local register_tree_trunk = function(subname, description_trunk, description_bark, longdesc, tile_inner, tile_bark) @@ -18,7 +19,7 @@ local register_tree_trunk = function(subname, description_trunk, description_bar minetest.register_node("mcl_core:"..subname.."_bark", { description = description_bark, - _doc_items_longdesc = "This is a decorative block surrounded by the bark of a tree trunk.", + _doc_items_longdesc = S("This is a decorative block surrounded by the bark of a tree trunk."), tiles = {tile_bark}, paramtype2 = "facedir", on_place = mcl_util.rotate_axis, @@ -145,35 +146,35 @@ end --------------------- -register_tree_trunk("tree", "Oak Wood", "Oak Bark", "The trunk of an oak tree.", "default_tree_top.png", "default_tree.png") -register_tree_trunk("darktree", "Dark Oak Wood", "Dark Oak Bark", "The trunk of a dark oak tree.", "mcl_core_log_big_oak_top.png", "mcl_core_log_big_oak.png") -register_tree_trunk("acaciatree", "Acacia Wood", "Acacia Bark", "The trunk of an acacia.", "default_acacia_tree_top.png", "default_acacia_tree.png") -register_tree_trunk("sprucetree", "Spruce Wood", "Spruce Bark", "The trunk of a spruce tree.", "mcl_core_log_spruce_top.png", "mcl_core_log_spruce.png") -register_tree_trunk("birchtree", "Birch Wood", "Birch Bark", "The trunk of a birch tree.", "mcl_core_log_birch_top.png", "mcl_core_log_birch.png") -register_tree_trunk("jungletree", "Jungle Wood", "Jungle Bark", "The trunk of a jungle tree.", "default_jungletree_top.png", "default_jungletree.png") +register_tree_trunk("tree", S("Oak Wood"), S("Oak Bark"), S("The trunk of an oak tree."), "default_tree_top.png", "default_tree.png") +register_tree_trunk("darktree", S("Dark Oak Wood"), S("Dark Oak Bark"), S("The trunk of a dark oak tree."), "mcl_core_log_big_oak_top.png", "mcl_core_log_big_oak.png") +register_tree_trunk("acaciatree", S("Acacia Wood"), S("Acacia Bark"), S("The trunk of an acacia."), "default_acacia_tree_top.png", "default_acacia_tree.png") +register_tree_trunk("sprucetree", S("Spruce Wood"), S("Spruce Bark"), S("The trunk of a spruce tree."), "mcl_core_log_spruce_top.png", "mcl_core_log_spruce.png") +register_tree_trunk("birchtree", S("Birch Wood"), S("Birch Bark"), S("The trunk of a birch tree."), "mcl_core_log_birch_top.png", "mcl_core_log_birch.png") +register_tree_trunk("jungletree", S("Jungle Wood"), S("Jungle Bark"), S("The trunk of a jungle tree."), "default_jungletree_top.png", "default_jungletree.png") -register_wooden_planks("wood", "Oak Wood Planks", {"default_wood.png"}) -register_wooden_planks("darkwood", "Dark Oak Wood Planks", {"mcl_core_planks_big_oak.png"}) -register_wooden_planks("junglewood", "Jungle Wood Planks", {"default_junglewood.png"}) -register_wooden_planks("sprucewood", "Spruce Wood Planks", {"mcl_core_planks_spruce.png"}) -register_wooden_planks("acaciawood", "Acacia Wood Planks", {"default_acacia_wood.png"}) -register_wooden_planks("birchwood", "Birch Wood Planks", {"mcl_core_planks_birch.png"}) +register_wooden_planks("wood", S("Oak Wood Planks"), {"default_wood.png"}) +register_wooden_planks("darkwood", S("Dark Oak Wood Planks"), {"mcl_core_planks_big_oak.png"}) +register_wooden_planks("junglewood", S("Jungle Wood Planks"), {"default_junglewood.png"}) +register_wooden_planks("sprucewood", S("Spruce Wood Planks"), {"mcl_core_planks_spruce.png"}) +register_wooden_planks("acaciawood", S("Acacia Wood Planks"), {"default_acacia_wood.png"}) +register_wooden_planks("birchwood", S("Birch Wood Planks"), {"mcl_core_planks_birch.png"}) -register_sapling("sapling", "Oak Sapling", "When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time.", "default_sapling.png", {-5/16, -0.5, -5/16, 5/16, 0.5, 5/16}) -register_sapling("darksapling", "Dark Oak Sapling", "Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.", "mcl_core_sapling_big_oak.png", {-5/16, -0.5, -5/16, 5/16, 7/16, 5/16}) -register_sapling("junglesapling", "Jungle Sapling", "When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. When there are 4 jungle saplings in a 2×2 square, they will grow to a huge jungle tree.", "default_junglesapling.png", {-5/16, -0.5, -5/16, 5/16, 0.5, 5/16}) -register_sapling("acaciasapling", "Acacia Sapling", "When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.", "default_acacia_sapling.png", {-5/16, -0.5, -5/16, 5/16, 4/16, 5/16}) -register_sapling("sprucesapling", "Spruce Sapling", "When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce after some time. When there are 4 spruce saplings in a 2×2 square, they will grow to a huge spruce.", "mcl_core_sapling_spruce.png", {-4/16, -0.5, -4/16, 4/16, 0.5, 4/16}) -register_sapling("birchsapling", "Birch Sapling", "When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.", "mcl_core_sapling_birch.png", {-4/16, -0.5, -4/16, 4/16, 0.5, 4/16}) +register_sapling("sapling", S("Oak Sapling"), S("When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time."), "default_sapling.png", {-5/16, -0.5, -5/16, 5/16, 0.5, 5/16}) +register_sapling("darksapling", S("Dark Oak Sapling"), S("Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light."), "mcl_core_sapling_big_oak.png", {-5/16, -0.5, -5/16, 5/16, 7/16, 5/16}) +register_sapling("junglesapling", S("Jungle Sapling"), S("When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. When there are 4 jungle saplings in a 2×2 square, they will grow to a huge jungle tree."), "default_junglesapling.png", {-5/16, -0.5, -5/16, 5/16, 0.5, 5/16}) +register_sapling("acaciasapling", S("Acacia Sapling"), S("When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time."), "default_acacia_sapling.png", {-5/16, -0.5, -5/16, 5/16, 4/16, 5/16}) +register_sapling("sprucesapling", S("Spruce Sapling"), S("When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce after some time. When there are 4 spruce saplings in a 2×2 square, they will grow to a huge spruce."), "mcl_core_sapling_spruce.png", {-4/16, -0.5, -4/16, 4/16, 0.5, 4/16}) +register_sapling("birchsapling", S("Birch Sapling"), S("When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time."), "mcl_core_sapling_birch.png", {-4/16, -0.5, -4/16, 4/16, 0.5, 4/16}) -register_leaves("leaves", "Oak Leaves", "Oak leaves are grown from oak trees.", {"default_leaves.png"}, "mcl_core:sapling", 20, "mcl_core:apple", 200) -register_leaves("darkleaves", "Dark Oak Leaves", "Dark oak leaves are grown from dark oak trees.", {"mcl_core_leaves_big_oak.png"}, "mcl_core:darksapling", 20, "mcl_core:apple", 200) -register_leaves("jungleleaves", "Jungle Leaves", "Jungle leaves are grown from jungle trees.", {"default_jungleleaves.png"}, "mcl_core:junglesapling", 40) -register_leaves("acacialeaves", "Acacia Leaves", "Acacia leaves are grown from acacia trees.", {"default_acacia_leaves.png"}, "mcl_core:acaciasapling", 20) -register_leaves("spruceleaves", "Spruce Leaves", "Spruce leaves are grown from spruce trees.", {"mcl_core_leaves_spruce.png"}, "mcl_core:sprucesapling", 20) -register_leaves("birchleaves", "Birch Leaves", "Birch leaves are grown from birch trees.", {"mcl_core_leaves_birch.png"}, "mcl_core:birchsapling", 20) +register_leaves("leaves", S("Oak Leaves"), S("Oak leaves are grown from oak trees."), {"default_leaves.png"}, "mcl_core:sapling", 20, "mcl_core:apple", 200) +register_leaves("darkleaves", S("Dark Oak Leaves"), S("Dark oak leaves are grown from dark oak trees."), {"mcl_core_leaves_big_oak.png"}, "mcl_core:darksapling", 20, "mcl_core:apple", 200) +register_leaves("jungleleaves", S("Jungle Leaves"), S("Jungle leaves are grown from jungle trees."), {"default_jungleleaves.png"}, "mcl_core:junglesapling", 40) +register_leaves("acacialeaves", S("Acacia Leaves"), S("Acacia leaves are grown from acacia trees."), {"default_acacia_leaves.png"}, "mcl_core:acaciasapling", 20) +register_leaves("spruceleaves", S("Spruce Leaves"), S("Spruce leaves are grown from spruce trees."), {"mcl_core_leaves_spruce.png"}, "mcl_core:sprucesapling", 20) +register_leaves("birchleaves", S("Birch Leaves"), S("Birch leaves are grown from birch trees."), {"mcl_core_leaves_birch.png"}, "mcl_core:birchsapling", 20) -- Node aliases From a29626881f985d4164f9485fdbfb9445762cf104 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 00:00:09 +0100 Subject: [PATCH 066/379] New translation system, part 7: Items, part 3 --- mods/ITEMS/mcl_crafting_table/init.lua | 8 ++-- mods/ITEMS/mcl_doors/register.lua | 44 +++++++++++---------- mods/ITEMS/mcl_dye/init.lua | 52 ++++++++++++------------- mods/ITEMS/mcl_end/building.lua | 17 ++++---- mods/ITEMS/mcl_end/chorus_plant.lua | 21 +++++----- mods/ITEMS/mcl_end/eye_of_ender.lua | 7 ++-- mods/ITEMS/mcl_farming/beetroot.lua | 32 ++++++++------- mods/ITEMS/mcl_farming/carrots.lua | 22 ++++++----- mods/ITEMS/mcl_farming/hoes.lua | 16 ++++---- mods/ITEMS/mcl_farming/melon.lua | 26 +++++++------ mods/ITEMS/mcl_farming/potatoes.lua | 26 +++++++------ mods/ITEMS/mcl_farming/pumpkin.lua | 34 ++++++++-------- mods/ITEMS/mcl_farming/soil.lua | 10 +++-- mods/ITEMS/mcl_farming/wheat.lua | 34 ++++++++-------- mods/ITEMS/mcl_fences/init.lua | 20 +++++----- mods/ITEMS/mcl_fire/fire_charge.lua | 8 ++-- mods/ITEMS/mcl_fire/flint_and_steel.lua | 8 ++-- mods/ITEMS/mcl_fire/init.lua | 9 +++-- mods/ITEMS/mcl_fishing/init.lua | 32 ++++++++------- mods/ITEMS/mcl_flowerpots/init.lua | 47 +++++++++++----------- 20 files changed, 253 insertions(+), 220 deletions(-) diff --git a/mods/ITEMS/mcl_crafting_table/init.lua b/mods/ITEMS/mcl_crafting_table/init.lua index 37dc74a29..cfe867c28 100644 --- a/mods/ITEMS/mcl_crafting_table/init.lua +++ b/mods/ITEMS/mcl_crafting_table/init.lua @@ -1,7 +1,9 @@ +local S = minetest.get_translator("mcl_crafting_table") + minetest.register_node("mcl_crafting_table:crafting_table", { - description = "Crafting Table", - _doc_items_longdesc = "A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts.", - _doc_items_usagehelp = "Rightclick the crafting table to access the 3×3 crafting grid.", + description = S("Crafting Table"), + _doc_items_longdesc = S("A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts."), + _doc_items_usagehelp = S("Rightclick the crafting table to access the 3×3 crafting grid."), _doc_items_hidden = false, is_ground_content = false, tiles = {"crafting_workbench_top.png", "default_wood.png", "crafting_workbench_side.png", diff --git a/mods/ITEMS/mcl_doors/register.lua b/mods/ITEMS/mcl_doors/register.lua index 919de7436..e8f990f9b 100644 --- a/mods/ITEMS/mcl_doors/register.lua +++ b/mods/ITEMS/mcl_doors/register.lua @@ -1,11 +1,13 @@ +local S = minetest.get_translator("mcl_doors") + --[[ Doors ]] -local wood_longdesc = "Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal." -local wood_usagehelp = "To open or close a wooden door, rightclick it or supply its lower half with a redstone signal." +local wood_longdesc = S("Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.") +local wood_usagehelp = S("To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.") --- Oak Door --- mcl_doors:register_door("mcl_doors:wooden_door", { - description = "Oak Door", + description = S("Oak Door"), _doc_items_longdesc = wood_longdesc, _doc_items_usagehelp = wood_usagehelp, inventory_image = "doors_item_wood.png", @@ -28,7 +30,7 @@ minetest.register_craft({ --- Acacia Door -- mcl_doors:register_door("mcl_doors:acacia_door", { - description = "Acacia Door", + description = S("Acacia Door"), _doc_items_longdesc = wood_longdesc, _doc_items_usagehelp = wood_usagehelp, inventory_image = "mcl_doors_door_acacia.png", @@ -51,7 +53,7 @@ minetest.register_craft({ --- Birch Door -- mcl_doors:register_door("mcl_doors:birch_door", { - description = "Birch Door", + description = S("Birch Door"), _doc_items_longdesc = wood_longdesc, _doc_items_usagehelp = wood_usagehelp, inventory_image = "mcl_doors_door_birch.png", @@ -74,7 +76,7 @@ minetest.register_craft({ --- Dark Oak Door -- mcl_doors:register_door("mcl_doors:dark_oak_door", { - description = "Dark Oak Door", + description = S("Dark Oak Door"), _doc_items_longdesc = wood_longdesc, _doc_items_usagehelp = wood_usagehelp, inventory_image = "mcl_doors_door_dark_oak.png", @@ -97,7 +99,7 @@ minetest.register_craft({ --- Jungle Door -- mcl_doors:register_door("mcl_doors:jungle_door", { - description = "Jungle Door", + description = S("Jungle Door"), _doc_items_longdesc = wood_longdesc, _doc_items_usagehelp = wood_usagehelp, inventory_image = "mcl_doors_door_jungle.png", @@ -120,7 +122,7 @@ minetest.register_craft({ --- Spruce Door -- mcl_doors:register_door("mcl_doors:spruce_door", { - description = "Spruce Door", + description = S("Spruce Door"), _doc_items_longdesc = wood_longdesc, _doc_items_usagehelp = wood_usagehelp, inventory_image = "mcl_doors_door_spruce.png", @@ -174,9 +176,9 @@ minetest.register_craft({ --- Iron Door --- mcl_doors:register_door("mcl_doors:iron_door", { - description = "Iron Door", - _doc_items_longdesc = "Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.", - _doc_items_usagehelp = "To open or close an iron door, supply its lower half with a redstone signal.", + description = S("Iron Door"), + _doc_items_longdesc = S("Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand."), + _doc_items_usagehelp = S("To open or close an iron door, supply its lower half with a redstone signal."), inventory_image = "doors_item_steel.png", groups = {pickaxey=1, mesecon_effector_on=1}, _mcl_hardness = 5, @@ -204,19 +206,19 @@ minetest.register_craft({ --[[ Trapdoors ]] local woods = { -- id, desc, texture, craftitem - { "trapdoor", "Oak Trapdoor", "doors_trapdoor.png", "doors_trapdoor_side.png", "mcl_core:wood" }, - { "acacia_trapdoor", "Acacia Trapdoor", "mcl_doors_trapdoor_acacia.png", "mcl_doors_trapdoor_acacia_side.png", "mcl_core:acaciawood" }, - { "birch_trapdoor", "Birch Trapdoor", "mcl_doors_trapdoor_birch.png", "mcl_doors_trapdoor_birch_side.png", "mcl_core:birchwood" }, - { "spruce_trapdoor", "Spruce Trapdoor", "mcl_doors_trapdoor_spruce.png", "mcl_doors_trapdoor_spruce_side.png", "mcl_core:sprucewood" }, - { "dark_oak_trapdoor", "Dark Oak Trapdoor", "mcl_doors_trapdoor_dark_oak.png", "mcl_doors_trapdoor_dark_oak_side.png", "mcl_core:darkwood" }, - { "jungle_trapdoor", "Jungle Trapdoor", "mcl_doors_trapdoor_jungle.png", "mcl_doors_trapdoor_jungle_side.png", "mcl_core:junglewood" }, + { "trapdoor", S("Oak Trapdoor"), "doors_trapdoor.png", "doors_trapdoor_side.png", "mcl_core:wood" }, + { "acacia_trapdoor", S("Acacia Trapdoor"), "mcl_doors_trapdoor_acacia.png", "mcl_doors_trapdoor_acacia_side.png", "mcl_core:acaciawood" }, + { "birch_trapdoor", S("Birch Trapdoor"), "mcl_doors_trapdoor_birch.png", "mcl_doors_trapdoor_birch_side.png", "mcl_core:birchwood" }, + { "spruce_trapdoor", S("Spruce Trapdoor"), "mcl_doors_trapdoor_spruce.png", "mcl_doors_trapdoor_spruce_side.png", "mcl_core:sprucewood" }, + { "dark_oak_trapdoor", S("Dark Oak Trapdoor"), "mcl_doors_trapdoor_dark_oak.png", "mcl_doors_trapdoor_dark_oak_side.png", "mcl_core:darkwood" }, + { "jungle_trapdoor", S("Jungle Trapdoor"), "mcl_doors_trapdoor_jungle.png", "mcl_doors_trapdoor_jungle_side.png", "mcl_core:junglewood" }, } for w=1, #woods do mcl_doors:register_trapdoor("mcl_doors:"..woods[w][1], { description = woods[w][2], - _doc_items_longdesc = "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.", - _doc_items_usagehelp = "To open or close the trapdoor, rightclick it or send a redstone signal to it.", + _doc_items_longdesc = S("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."), + _doc_items_usagehelp = S("To open or close the trapdoor, rightclick it or send a redstone signal to it."), tile_front = woods[w][3], tile_side = woods[w][4], wield_image = woods[w][3], @@ -242,8 +244,8 @@ for w=1, #woods do end mcl_doors:register_trapdoor("mcl_doors:iron_trapdoor", { - description = "Iron Trapdoor", - _doc_items_longdesc = "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.", + description = S("Iron Trapdoor"), + _doc_items_longdesc = S("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."), tile_front = "doors_trapdoor_steel.png", tile_side = "doors_trapdoor_steel_side.png", wield_image = "doors_trapdoor_steel.png", diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua index c347a9000..90e98ac4a 100644 --- a/mods/ITEMS/mcl_dye/init.lua +++ b/mods/ITEMS/mcl_dye/init.lua @@ -1,5 +1,3 @@ --- minetest/dye/init.lua - -- To make recipes that will work with any dye ever made by anybody, define -- them based on groups. -- You can select any group of groups, based on your need for amount of colors. @@ -15,6 +13,8 @@ mcl_dye = {} +local S = minetest.get_translator("mcl_dye") + -- Other mods can use these for looping through available colors mcl_dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"} mcl_dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"} @@ -64,22 +64,22 @@ local dyelocal = {} -- This collection of colors is partly a historic thing, partly something else. dyelocal.dyes = { - {"white", "mcl_dye_white", "Bone Meal", {dye=1, craftitem=1, basecolor_white=1, excolor_white=1, unicolor_white=1}}, - {"grey", "dye_grey", "Light Grey Dye", {dye=1, craftitem=1, basecolor_grey=1, excolor_grey=1, unicolor_grey=1}}, - {"dark_grey", "dye_dark_grey", "Grey Dye", {dye=1, craftitem=1, basecolor_grey=1, excolor_darkgrey=1, unicolor_darkgrey=1}}, - {"black", "mcl_dye_black", "Ink Sac", {dye=1, craftitem=1, basecolor_black=1, excolor_black=1, unicolor_black=1}}, - {"violet", "dye_violet", "Purple Dye", {dye=1, craftitem=1, basecolor_magenta=1, excolor_violet=1, unicolor_violet=1}}, - {"blue", "mcl_dye_blue", "Lapis Lazuli", {dye=1, craftitem=1, basecolor_blue=1, excolor_blue=1, unicolor_blue=1}}, - {"lightblue", "mcl_dye_light_blue", "Light Blue Dye", {dye=1, craftitem=1, basecolor_blue=1, excolor_blue=1, unicolor_light_blue=1}}, - {"cyan", "dye_cyan", "Cyan Dye", {dye=1, craftitem=1, basecolor_cyan=1, excolor_cyan=1, unicolor_cyan=1}}, - {"dark_green", "dye_dark_green", "Cactus Green",{dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}}, - {"green", "mcl_dye_lime", "Lime Dye", {dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_green=1}}, - {"yellow", "dye_yellow", "Dandelion Yellow", {dye=1, craftitem=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}}, - {"brown", "mcl_dye_brown", "Cocoa Beans", {dye=1, craftitem=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1}}, - {"orange", "dye_orange", "Orange Dye", {dye=1, craftitem=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}}, - {"red", "dye_red", "Rose Red", {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_red=1}}, - {"magenta", "dye_magenta", "Magenta Dye", {dye=1, craftitem=1, basecolor_magenta=1, excolor_red_violet=1,unicolor_red_violet=1}}, - {"pink", "dye_pink", "Pink Dye", {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}}, + {"white", "mcl_dye_white", S("Bone Meal"), {dye=1, craftitem=1, basecolor_white=1, excolor_white=1, unicolor_white=1}}, + {"grey", "dye_grey", S("Light Grey Dye"), {dye=1, craftitem=1, basecolor_grey=1, excolor_grey=1, unicolor_grey=1}}, + {"dark_grey", "dye_dark_grey", S("Grey Dye"), {dye=1, craftitem=1, basecolor_grey=1, excolor_darkgrey=1, unicolor_darkgrey=1}}, + {"black", "mcl_dye_black", S("Ink Sac"), {dye=1, craftitem=1, basecolor_black=1, excolor_black=1, unicolor_black=1}}, + {"violet", "dye_violet", S("Purple Dye"), {dye=1, craftitem=1, basecolor_magenta=1, excolor_violet=1, unicolor_violet=1}}, + {"blue", "mcl_dye_blue", S("Lapis Lazuli"), {dye=1, craftitem=1, basecolor_blue=1, excolor_blue=1, unicolor_blue=1}}, + {"lightblue", "mcl_dye_light_blue", S("Light Blue Dye"), {dye=1, craftitem=1, basecolor_blue=1, excolor_blue=1, unicolor_light_blue=1}}, + {"cyan", "dye_cyan", S("Cyan Dye"), {dye=1, craftitem=1, basecolor_cyan=1, excolor_cyan=1, unicolor_cyan=1}}, + {"dark_green", "dye_dark_green", S("Cactus Green"),{dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}}, + {"green", "mcl_dye_lime", S("Lime Dye"), {dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_green=1}}, + {"yellow", "dye_yellow", S("Dandelion Yellow"), {dye=1, craftitem=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}}, + {"brown", "mcl_dye_brown", S("Cocoa Beans"), {dye=1, craftitem=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1}}, + {"orange", "dye_orange", S("Orange Dye"), {dye=1, craftitem=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}}, + {"red", "dye_red", S("Rose Red"), {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_red=1}}, + {"magenta", "dye_magenta", S("Magenta Dye"), {dye=1, craftitem=1, basecolor_magenta=1, excolor_red_violet=1,unicolor_red_violet=1}}, + {"pink", "dye_pink", S("Pink Dye"), {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}}, } dyelocal.unicolor_to_dye_id = {} @@ -109,8 +109,8 @@ for _, row in ipairs(dyelocal.dyes) do minetest.register_craftitem(item_name, { inventory_image = item_image, description = description, - _doc_items_longdesc = "This item is a dye which is used for dyeing and crafting.", - _doc_items_usagehelp = "Rightclick on a sheep to dye its wool. Other things are dyed by crafting.", + _doc_items_longdesc = S("This item is a dye which is used for dyeing and crafting."), + _doc_items_usagehelp = S("Rightclick on a sheep to dye its wool. Other things are dyed by crafting."), groups = groups, stack_max = 64, }) @@ -295,9 +295,9 @@ end minetest.register_craftitem("mcl_dye:white", { inventory_image = "mcl_dye_white.png", - description = "Bone Meal", - _doc_items_longdesc = "Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.", - _doc_items_usagehelp = "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.", + description = S("Bone Meal"), + _doc_items_longdesc = S("Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants."), + _doc_items_usagehelp = S("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."), stack_max = 64, groups = dyelocal.dyes[1][4], on_place = function(itemstack, user, pointed_thing) @@ -333,9 +333,9 @@ minetest.register_craftitem("mcl_dye:white", { minetest.register_craftitem("mcl_dye:brown", { inventory_image = "mcl_dye_brown.png", - _doc_items_longdesc = "Cocoa beans are a brown dye and can be used to plant cocoas.", - _doc_items_usagehelp = "Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.", - description = "Cocoa Beans", + _doc_items_longdesc = S("Cocoa beans are a brown dye and can be used to plant cocoas."), + _doc_items_usagehelp = S("Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa."), + description = S("Cocoa Beans"), stack_max = 64, groups = dyelocal.dyes[12][4], on_place = function(itemstack, placer, pointed_thing) diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua index f4eff3e16..aeee897f0 100644 --- a/mods/ITEMS/mcl_end/building.lua +++ b/mods/ITEMS/mcl_end/building.lua @@ -1,7 +1,8 @@ -- Building blocks and decorative nodes +local S = minetest.get_translator("mcl_end") minetest.register_node("mcl_end:end_stone", { - description = "End Stone", + description = S("End Stone"), _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_end_end_stone.png"}, stack_max = 64, @@ -12,7 +13,7 @@ minetest.register_node("mcl_end:end_stone", { }) minetest.register_node("mcl_end:end_bricks", { - description = "End Stone Bricks", + description = S("End Stone Bricks"), _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_end_end_bricks.png"}, is_ground_content = false, @@ -24,7 +25,7 @@ minetest.register_node("mcl_end:end_bricks", { }) minetest.register_node("mcl_end:purpur_block", { - description = "Purpur Block", + description = S("Purpur Block"), _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_end_purpur_block.png"}, is_ground_content = false, @@ -36,7 +37,7 @@ minetest.register_node("mcl_end:purpur_block", { }) minetest.register_node("mcl_end:purpur_pillar", { - description = "Purpur Pillar", + description = S("Purpur Pillar"), _doc_items_longdesc = doc.sub.items.temp.build, stack_max = 64, paramtype2 = "facedir", @@ -50,8 +51,8 @@ minetest.register_node("mcl_end:purpur_pillar", { }) minetest.register_node("mcl_end:end_rod", { - description = "End Rod", - _doc_items_longdesc = "End rods are decorational light sources.", + description = S("End Rod"), + _doc_items_longdesc = S("End rods are decorational light sources."), tiles = { "mcl_end_end_rod_top.png", "mcl_end_end_rod_bottom.png", @@ -125,8 +126,8 @@ minetest.register_node("mcl_end:end_rod", { }) minetest.register_node("mcl_end:dragon_egg", { - description = "Dragon Egg", - _doc_items_longdesc = "A dragon egg is a decorational item which can be placed.", + description = S("Dragon Egg"), + _doc_items_longdesc = S("A dragon egg is a decorational item which can be placed."), tiles = { "mcl_end_dragon_egg.png", "mcl_end_dragon_egg.png", diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index 5c48654dc..1374e7746 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -1,6 +1,7 @@ -- Chorus plants -- This includes chorus flowers, chorus plant stem nodes and chorus fruit +local S = minetest.get_translator("mcl_end") --- Plant parts --- @@ -24,9 +25,9 @@ local function round(num, idp) end minetest.register_node("mcl_end:chorus_flower", { - description = "Chorus Flower", - _doc_items_longdesc = "A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow.", - _doc_items_usagehelp = "Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly a chorus plant stem.", + description = S("Chorus Flower"), + _doc_items_longdesc = S("A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow."), + _doc_items_usagehelp = S("Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly a chorus plant stem."), tiles = { "mcl_end_chorus_flower.png", "mcl_end_chorus_flower.png", @@ -108,8 +109,8 @@ minetest.register_node("mcl_end:chorus_flower", { }) minetest.register_node("mcl_end:chorus_flower_dead", { - description = "Dead Chorus Flower", - _doc_items_longdesc = "This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again.", + description = S("Dead Chorus Flower"), + _doc_items_longdesc = S("This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again."), tiles = { "mcl_end_chorus_flower_dead.png", "mcl_end_chorus_flower_dead.png", @@ -131,8 +132,8 @@ minetest.register_node("mcl_end:chorus_flower_dead", { }) minetest.register_node("mcl_end:chorus_plant", { - description = "Chorus Plant Stem", - _doc_items_longdesc = "A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers.", + description = S("Chorus Plant Stem"), + _doc_items_longdesc = S("A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers."), tiles = { "mcl_end_chorus_plant.png", "mcl_end_chorus_plant.png", @@ -356,8 +357,8 @@ local eat_chorus_fruit = function(itemstack, player, pointed_thing) end minetest.register_craftitem("mcl_end:chorus_fruit", { - description = "Chorus Fruit", - _doc_items_longdesc = "A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to.", + description = S("Chorus Fruit"), + _doc_items_longdesc = S("A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to."), wield_image = "mcl_end_chorus_fruit.png", inventory_image = "mcl_end_chorus_fruit.png", on_place = eat_chorus_fruit, @@ -368,7 +369,7 @@ minetest.register_craftitem("mcl_end:chorus_fruit", { }) minetest.register_craftitem("mcl_end:chorus_fruit_popped", { - description = "Popped Chorus Fruit", + description = S("Popped Chorus Fruit"), _doc_items_longdesc = doc.sub.items.temp.craftitem, wield_image = "mcl_end_chorus_fruit_popped.png", inventory_image = "mcl_end_chorus_fruit_popped.png", diff --git a/mods/ITEMS/mcl_end/eye_of_ender.lua b/mods/ITEMS/mcl_end/eye_of_ender.lua index 69edbde35..a76eee0dd 100644 --- a/mods/ITEMS/mcl_end/eye_of_ender.lua +++ b/mods/ITEMS/mcl_end/eye_of_ender.lua @@ -1,4 +1,5 @@ -- Eye of Ender +local S = minetest.get_translator("mcl_end") minetest.register_entity("mcl_end:ender_eye", { physical = false, @@ -72,9 +73,9 @@ minetest.register_entity("mcl_end:ender_eye", { }) minetest.register_craftitem("mcl_end:ender_eye", { - description = "Eye of Ender", - _doc_items_longdesc = "This item is used to locate End portal shrines in the Overworld and to activate End portals." .. "\n" .. "NOTE: The End dimension is currently incomplete and boring.", - _doc_items_usagehelp = "Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters." .. "\n" .. "To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.", + description = S("Eye of Ender"), + _doc_items_longdesc = S("This item is used to locate End portal shrines in the Overworld and to activate End portals." .. "\n" .. "NOTE: The End dimension is currently incomplete and boring."), + _doc_items_usagehelp = S("Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.") .. "\n" .. S("To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame."), wield_image = "mcl_end_ender_eye.png", inventory_image = "mcl_end_ender_eye.png", stack_max = 64, diff --git a/mods/ITEMS/mcl_farming/beetroot.lua b/mods/ITEMS/mcl_farming/beetroot.lua index 8fe693580..a6f8fc9ac 100644 --- a/mods/ITEMS/mcl_farming/beetroot.lua +++ b/mods/ITEMS/mcl_farming/beetroot.lua @@ -1,7 +1,9 @@ +local S = minetest.get_translator("mcl_farming") + minetest.register_craftitem("mcl_farming:beetroot_seeds", { - description = "Beetroot Seeds", - _doc_items_longdesc = "Grows into a beetroot plant. Chickens like beetroot seeds.", - _doc_items_usagehelp = "Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.", + description = S("Beetroot Seeds"), + _doc_items_longdesc = S("Grows into a beetroot plant. Chickens like beetroot seeds."), + _doc_items_usagehelp = S("Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds."), groups = { craftitem=1 }, inventory_image = "mcl_farming_beetroot_seeds.png", wield_image = "mcl_farming_beetroot_seeds.png", @@ -11,9 +13,9 @@ minetest.register_craftitem("mcl_farming:beetroot_seeds", { }) minetest.register_node("mcl_farming:beetroot_0", { - description = "Premature Beetroot Plant (Stage 1)", - _doc_items_longdesc = "Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.", - _doc_items_entry_name = "Premature Beetroot Plant", + description = S("Premature Beetroot Plant (Stage 1)"), + _doc_items_longdesc = S("Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature."), + _doc_items_entry_name = S("Premature Beetroot Plant"), paramtype = "light", paramtype2 = "meshoptions", sunlight_propagates = true, @@ -36,7 +38,7 @@ minetest.register_node("mcl_farming:beetroot_0", { }) minetest.register_node("mcl_farming:beetroot_1", { - description = "Premature Beetroot Plant (Stage 2)", + description = S("Premature Beetroot Plant (Stage 2)"), _doc_items_create_entry = false, paramtype = "light", paramtype2 = "meshoptions", @@ -60,7 +62,7 @@ minetest.register_node("mcl_farming:beetroot_1", { }) minetest.register_node("mcl_farming:beetroot_2", { - description = "Premature Beetroot Plant (Stage 3)", + description = S("Premature Beetroot Plant (Stage 3)"), _doc_items_create_entry = false, paramtype = "light", paramtype2 = "meshoptions", @@ -84,8 +86,8 @@ minetest.register_node("mcl_farming:beetroot_2", { }) minetest.register_node("mcl_farming:beetroot", { - description = "Mature Beetroot Plant", - _doc_items_longdesc = "A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.", + description = S("Mature Beetroot Plant"), + _doc_items_longdesc = S("A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further."), _doc_items_create_entry = true, paramtype = "light", paramtype2 = "meshoptions", @@ -123,9 +125,9 @@ minetest.register_node("mcl_farming:beetroot", { }) minetest.register_craftitem("mcl_farming:beetroot_item", { - description = "Beetroot", - _doc_items_longdesc = "Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.", - _doc_items_usagehelp = "Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.", + description = S("Beetroot"), + _doc_items_longdesc = S("Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too."), + _doc_items_usagehelp = S("Hold it in your hand and right-click to eat it. Rightclick an animal to feed it."), inventory_image = "mcl_farming_beetroot.png", wield_image = "mcl_farming_beetroot.png", on_place = minetest.item_eat(1), @@ -135,8 +137,8 @@ minetest.register_craftitem("mcl_farming:beetroot_item", { }) minetest.register_craftitem("mcl_farming:beetroot_soup", { - description = "Beetroot Soup", - _doc_items_longdesc = "Beetroot soup is a food item.", + description = S("Beetroot Soup"), + _doc_items_longdesc = S("Beetroot soup is a food item."), stack_max = 1, inventory_image = "mcl_farming_beetroot_soup.png", wield_image = "mcl_farming_beetroot_soup.png", diff --git a/mods/ITEMS/mcl_farming/carrots.lua b/mods/ITEMS/mcl_farming/carrots.lua index 294906773..d8c759ffd 100644 --- a/mods/ITEMS/mcl_farming/carrots.lua +++ b/mods/ITEMS/mcl_farming/carrots.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_farming") + for i=1, 7 do local texture, sel_height if i < 3 then @@ -14,13 +16,13 @@ for i=1, 7 do local create, name, longdesc if i == 1 then create = true - name = "Premature Carrot Plant" - longdesc = "Carrot plants are plants which grow on farmland under sunlight in 8 stages, of which only 4 are actually visible. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature." + name = S("Premature Carrot Plant") + longdesc = S("Carrot plants are plants which grow on farmland under sunlight in 8 stages, of which only 4 are actually visible. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.") else create = false end minetest.register_node("mcl_farming:carrot_"..i, { - description = string.format("Premature Carrot Plant (Stage %d)", i), + description = S("Premature Carrot Plant (Stage @1)", i), _doc_items_create_entry = create, _doc_items_entry_name = name, _doc_items_longdesc = longdesc, @@ -47,8 +49,8 @@ for i=1, 7 do end minetest.register_node("mcl_farming:carrot", { - description = "Mature Carrot Plant", - _doc_items_longdesc = "Mature carrot plants are ready to be harvested for carrots. They won't grow any further.", + description = S("Mature Carrot Plant"), + _doc_items_longdesc = S("Mature carrot plants are ready to be harvested for carrots. They won't grow any further."), paramtype = "light", sunlight_propagates = true, paramtype2 = "meshoptions", @@ -79,9 +81,9 @@ minetest.register_node("mcl_farming:carrot", { }) minetest.register_craftitem("mcl_farming:carrot_item", { - description = "Carrot", - _doc_items_longdesc = "Carrots can be eaten and planted. Pigs and rabbits like carrots.", - _doc_items_usagehelp = "Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.", + description = S("Carrot"), + _doc_items_longdesc = S("Carrots can be eaten and planted. Pigs and rabbits like carrots."), + _doc_items_usagehelp = S("Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it."), inventory_image = "farming_carrot.png", groups = { food = 2, eatable = 3 }, _mcl_saturation = 3.6, @@ -97,8 +99,8 @@ minetest.register_craftitem("mcl_farming:carrot_item", { }) minetest.register_craftitem("mcl_farming:carrot_item_gold", { - description = "Golden Carrot", - _doc_items_longdesc = "A golden carrot is a precious food item which can be eaten. It is really, really filling!", + description = S("Golden Carrot"), + _doc_items_longdesc = S("A golden carrot is a precious food item which can be eaten. It is really, really filling!"), inventory_image = "farming_carrot_gold.png", on_place = minetest.item_eat(6), on_secondary_use = minetest.item_eat(6), diff --git a/mods/ITEMS/mcl_farming/hoes.lua b/mods/ITEMS/mcl_farming/hoes.lua index 1d8e9411e..453ede39b 100644 --- a/mods/ITEMS/mcl_farming/hoes.lua +++ b/mods/ITEMS/mcl_farming/hoes.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_farming") + local function create_soil(pos, inv) if pos == nil then return false @@ -23,11 +25,11 @@ local function create_soil(pos, inv) return false end -local hoe_longdesc = "Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch." -local hoe_usagehelp = "Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt." +local hoe_longdesc = S("Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.") +local hoe_usagehelp = S("Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.") minetest.register_tool("mcl_farming:hoe_wood", { - description = "Wood Hoe", + description = S("Wood Hoe"), _doc_items_longdesc = hoe_longdesc, _doc_items_usagehelp = hoe_usagehelp, _doc_items_hidden = false, @@ -79,7 +81,7 @@ minetest.register_craft({ }) minetest.register_tool("mcl_farming:hoe_stone", { - description = "Stone Hoe", + description = S("Stone Hoe"), _doc_items_longdesc = hoe_longdesc, _doc_items_usagehelp = hoe_usagehelp, inventory_image = "farming_tool_stonehoe.png", @@ -125,7 +127,7 @@ minetest.register_craft({ }) minetest.register_tool("mcl_farming:hoe_iron", { - description = "Iron Hoe", + description = S("Iron Hoe"), _doc_items_longdesc = hoe_longdesc, _doc_items_usagehelp = hoe_usagehelp, inventory_image = "farming_tool_steelhoe.png", @@ -179,7 +181,7 @@ minetest.register_craft({ }) minetest.register_tool("mcl_farming:hoe_gold", { - description = "Golden Hoe", + description = S("Golden Hoe"), _doc_items_longdesc = hoe_longdesc, _doc_items_usagehelp = hoe_usagehelp, inventory_image = "farming_tool_goldhoe.png", @@ -234,7 +236,7 @@ minetest.register_craft({ }) minetest.register_tool("mcl_farming:hoe_diamond", { - description = "Diamond Hoe", + description = S("Diamond Hoe"), _doc_items_longdesc = hoe_longdesc, _doc_items_usagehelp = hoe_usagehelp, inventory_image = "farming_tool_diamondhoe.png", diff --git a/mods/ITEMS/mcl_farming/melon.lua b/mods/ITEMS/mcl_farming/melon.lua index 7e3cfa1da..fab744747 100644 --- a/mods/ITEMS/mcl_farming/melon.lua +++ b/mods/ITEMS/mcl_farming/melon.lua @@ -1,8 +1,10 @@ +local S = minetest.get_translator("mcl_farming") + -- Seeds minetest.register_craftitem("mcl_farming:melon_seeds", { - description = "Melon Seeds", - _doc_items_longdesc = "Grows into a melon. Chickens like melon seeds.", - _doc_items_usagehelp = "Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melons grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it melon seeds.", + description = S("Melon Seeds"), + _doc_items_longdesc = S("Grows into a melon. Chickens like melon seeds."), + _doc_items_usagehelp = S("Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melons grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it melon seeds."), stack_max = 64, groups = { craftitem=1 }, inventory_image = "mcl_farming_melon_seeds.png", @@ -14,8 +16,8 @@ minetest.register_craftitem("mcl_farming:melon_seeds", { -- Melon template (will be fed into mcl_farming.register_gourd local melon_base_def = { - description = "Melon", - _doc_items_longdesc = "A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.", + description = S("Melon"), + _doc_items_longdesc = S("A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices."), stack_max = 64, tiles = {"farming_melon_top.png", "farming_melon_top.png", "farming_melon_side.png", "farming_melon_side.png", "farming_melon_side.png", "farming_melon_side.png"}, groups = {handy=1,axey=1, plant=1,building_block=1,enderman_takable=1,dig_by_piston=1}, @@ -68,13 +70,13 @@ for s=1,7 do local doc = s == 1 local longdesc, entry_name if doc then - entry_name = "Premature Melon Stem" - longdesc = "Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons." + entry_name = S("Premature Melon Stem") + longdesc = S("Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.") end local colorstring = mcl_farming:stem_color(startcolor, endcolor, s, 8) local texture = "([combine:16x16:0,"..((8-s)*2).."=mcl_farming_melon_stem_disconnected.png)^[colorize:"..colorstring..":127" minetest.register_node("mcl_farming:melontige_"..s, { - description = string.format("Premature Melon Stem (Stage %d)", s), + description = S("Premature Melon Stem (Stage @1)", s), _doc_items_create_entry = doc, _doc_items_entry_name = entry_name, _doc_items_longdesc = longdesc, @@ -100,9 +102,9 @@ end -- Full melon stem, able to spawn melons local stem_def = { - description = "Mature Melon Stem", + description = S("Mature Melon Stem"), _doc_items_create_entry = true, - _doc_items_longdesc = "A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.", + _doc_items_longdesc = S("A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon."), tiles = {"mcl_farming_melon_stem_disconnected.png^[colorize:#FFA800:127"}, wield_image = "mcl_farming_melon_stem_disconnected.png^[colorize:#FFA800:127", inventory_image = "mcl_farming_melon_stem_disconnected.png^[colorize:#FFA800:127", @@ -117,8 +119,8 @@ mcl_farming:add_gourd("mcl_farming:melontige_unconnect", "mcl_farming:melontige_ -- Items and crafting minetest.register_craftitem("mcl_farming:melon_item", { -- Original name: “Melon” - description = "Melon Slice", - _doc_items_longdesc = "This is a food item which can be eaten.", + description = S("Melon Slice"), + _doc_items_longdesc = S("This is a food item which can be eaten."), stack_max = 64, inventory_image = "farming_melon.png", on_place = minetest.item_eat(2), diff --git a/mods/ITEMS/mcl_farming/potatoes.lua b/mods/ITEMS/mcl_farming/potatoes.lua index 7294275a4..7c795b477 100644 --- a/mods/ITEMS/mcl_farming/potatoes.lua +++ b/mods/ITEMS/mcl_farming/potatoes.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_farming") + -- Premature potato plants for i=1, 7 do @@ -16,8 +18,8 @@ for i=1, 7 do local create, name, longdesc if i==1 then create = true - name = "Premature Potato Plant" - longdesc = "Potato plants are plants which grow on farmland under sunlight in 8 stages, of which only 4 are actually visible. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature." + name = S("Premature Potato Plant") + longdesc = S("Potato plants are plants which grow on farmland under sunlight in 8 stages, of which only 4 are actually visible. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.") else create = false if minetest.get_modpath("doc") then @@ -26,7 +28,7 @@ for i=1, 7 do end minetest.register_node("mcl_farming:potato_"..i, { - description = string.format("Premature Potato Plant (Stage %d)", i), + description = S("Premature Potato Plant (Stage @1)", i), _doc_items_create_entry = create, _doc_items_entry_name = name, _doc_items_longdesc = longdesc, @@ -52,8 +54,8 @@ end -- Mature plant minetest.register_node("mcl_farming:potato", { - description = "Mature Potato Plant", - _doc_items_longdesc = "Mature potato plants are ready to be harvested for potatoes. They won't grow any further.", + description = S("Mature Potato Plant"), + _doc_items_longdesc = S("Mature potato plants are ready to be harvested for potatoes. They won't grow any further."), paramtype = "light", paramtype2 = "meshoptions", sunlight_propagates = true, @@ -84,9 +86,9 @@ minetest.register_node("mcl_farming:potato", { }) minetest.register_craftitem("mcl_farming:potato_item", { - description = "Potato", - _doc_items_longdesc = "Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.", - _doc_items_usagehelp = "Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.", + description = S("Potato"), + _doc_items_longdesc = S("Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes."), + _doc_items_usagehelp = S("Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it."), inventory_image = "farming_potato.png", groups = { food = 2, eatable = 1 }, _mcl_saturation = 0.6, @@ -103,8 +105,8 @@ minetest.register_craftitem("mcl_farming:potato_item", { }) minetest.register_craftitem("mcl_farming:potato_item_baked", { - description = "Baked Potato", - _doc_items_longdesc = "Baked potatoes are food items which are more filling than the unbaked ones.", + description = S("Baked Potato"), + _doc_items_longdesc = S("Baked potatoes are food items which are more filling than the unbaked ones."), stack_max = 64, inventory_image = "farming_potato_baked.png", on_place = minetest.item_eat(5), @@ -114,8 +116,8 @@ minetest.register_craftitem("mcl_farming:potato_item_baked", { }) minetest.register_craftitem("mcl_farming:potato_item_poison", { - description = "Poisonous Potato", - _doc_items_longdesc = "This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.", + description = S("Poisonous Potato"), + _doc_items_longdesc = S("This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly."), stack_max = 64, inventory_image = "farming_potato_poison.png", -- TODO: Cause status effects diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua index 6b0d31816..128f36149 100644 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ b/mods/ITEMS/mcl_farming/pumpkin.lua @@ -1,8 +1,10 @@ +local S = minetest.get_translator("mcl_farming") + -- Seeds minetest.register_craftitem("mcl_farming:pumpkin_seeds", { - description = "Pumpkin Seeds", - _doc_items_longdesc = "Grows into a pumpkin. Chickens like pumpkin seeds.", - _doc_items_usagehelp = "Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkins grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it pumpkin seeds.", + description = S("Pumpkin Seeds"), + _doc_items_longdesc = S("Grows into a pumpkin. Chickens like pumpkin seeds."), + _doc_items_usagehelp = S("Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkins grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it pumpkin seeds."), stack_max = 64, inventory_image = "mcl_farming_pumpkin_seeds.png", groups = { craftitem=1 }, @@ -42,13 +44,13 @@ for s=1,7 do local doc = s == 1 local longdesc, entry_name if doc then - entry_name = "Premature Pumpkin Stem" - longdesc = "Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins." + entry_name = S("Premature Pumpkin Stem") + longdesc = S("Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.") end local colorstring = mcl_farming:stem_color(startcolor, endcolor, s, 8) local texture = "([combine:16x16:0,"..((8-s)*2).."=mcl_farming_pumpkin_stem_disconnected.png)^[colorize:"..colorstring..":127" minetest.register_node("mcl_farming:pumpkin_"..s, { - description = string.format("Premature Pumpkin Stem (Stage %d)", s), + description = S("Premature Pumpkin Stem (Stage @1)", s), _doc_items_entry_name = entry_name, _doc_items_create_entry = doc, _doc_items_longdesc = longdesc, @@ -74,8 +76,8 @@ end -- Full stem (not connected) local stem_def = { - description = "Mature Pumpkin Stem", - _doc_items_longdesc = "A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.", + description = S("Mature Pumpkin Stem"), + _doc_items_longdesc = S("A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin."), tiles = {"mcl_farming_pumpkin_stem_disconnected.png^[colorize:#FFA800:127"}, wield_image = "mcl_farming_pumpkin_stem_disconnected.png^[colorize:#FFA800:127", inventory_image = "mcl_farming_pumpkin_stem_disconnected.png^[colorize:#FFA800:127", @@ -83,8 +85,8 @@ local stem_def = { -- Template for pumpkin local pumpkin_base_def = { - description = "Faceless Pumpkin", - _doc_items_longdesc = "A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.", + description = S("Faceless Pumpkin"), + _doc_items_longdesc = S("A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds."), _doc_items_usagehelp = "To carve a face into the pumpkin, use the shears on the side you want to carve.", stack_max = 64, paramtype2 = "facedir", @@ -97,8 +99,8 @@ local pumpkin_base_def = { minetest.register_node("mcl_farming:pumpkin", pumpkin_base_def) local pumpkin_face_base_def = table.copy(pumpkin_base_def) -pumpkin_face_base_def.description = "Pumpkin" -pumpkin_face_base_def._doc_items_longdesc = "A pumpkin can be worn as a helmet for fun, but it doesn't offer any protection. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds." +pumpkin_face_base_def.description = S("Pumpkin") +pumpkin_face_base_def._doc_items_longdesc = S("A pumpkin can be worn as a helmet for fun, but it doesn't offer any protection. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.") pumpkin_face_base_def.tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_face.png"} pumpkin_face_base_def.groups.armor_head=1 pumpkin_face_base_def.groups.non_combat_armor=1 @@ -116,8 +118,8 @@ end) -- Jack o'Lantern minetest.register_node("mcl_farming:pumpkin_face_light", { - description = "Jack o'Lantern", - _doc_items_longdesc = "A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.", + description = S("Jack o'Lantern"), + _doc_items_longdesc = S("A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly."), is_ground_content = false, stack_max = 64, paramtype = "light", @@ -155,8 +157,8 @@ minetest.register_craft({ }) minetest.register_craftitem("mcl_farming:pumpkin_pie", { - description = "Pumpkin Pie", - _doc_items_longdesc = "A pumpkin pie is a tasty food item which can be eaten.", + description = S("Pumpkin Pie"), + _doc_items_longdesc = S("A pumpkin pie is a tasty food item which can be eaten."), stack_max = 64, inventory_image = "mcl_farming_pumpkin_pie.png", wield_image = "mcl_farming_pumpkin_pie.png", diff --git a/mods/ITEMS/mcl_farming/soil.lua b/mods/ITEMS/mcl_farming/soil.lua index 0b38a5ed9..d8e591ec8 100644 --- a/mods/ITEMS/mcl_farming/soil.lua +++ b/mods/ITEMS/mcl_farming/soil.lua @@ -1,7 +1,9 @@ +local S = minetest.get_translator("mcl_farming") + minetest.register_node("mcl_farming:soil", { tiles = {"mcl_farming_farmland_dry.png", "default_dirt.png"}, - description = "Farmland", - _doc_items_longdesc = "Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.", + description = S("Farmland"), + _doc_items_longdesc = S("Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it."), drop = "mcl_core:dirt", drawtype = "nodebox", paramtype = "light", @@ -24,8 +26,8 @@ minetest.register_node("mcl_farming:soil", { minetest.register_node("mcl_farming:soil_wet", { tiles = {"mcl_farming_farmland_wet.png", "default_dirt.png"}, - description = "Hydrated Farmland", - _doc_items_longdesc = "Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmlands is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.", + description = S("Hydrated Farmland"), + _doc_items_longdesc = S("Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmlands is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it."), drop = "mcl_core:dirt", drawtype = "nodebox", paramtype = "light", diff --git a/mods/ITEMS/mcl_farming/wheat.lua b/mods/ITEMS/mcl_farming/wheat.lua index f7521d268..41c31c347 100644 --- a/mods/ITEMS/mcl_farming/wheat.lua +++ b/mods/ITEMS/mcl_farming/wheat.lua @@ -1,8 +1,10 @@ +local S = minetest.get_translator("mcl_farming") + minetest.register_craftitem("mcl_farming:wheat_seeds", { -- Original Minecraft name: “Seeds” - description = "Wheat Seeds", - _doc_items_longdesc = "Grows into a wheat plant. Chickens like wheat seeds.", - _doc_items_usagehelp = "Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.", + description = S("Wheat Seeds"), + _doc_items_longdesc = S("Grows into a wheat plant. Chickens like wheat seeds."), + _doc_items_usagehelp = S("Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds."), groups = { craftitem=1 }, inventory_image = "mcl_farming_wheat_seeds.png", on_place = function(itemstack, placer, pointed_thing) @@ -24,14 +26,14 @@ for i=1,7 do local create, name, longdesc if i == 1 then create = true - name = "Premature Wheat Plant" - longdesc = "Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature." + name = S("Premature Wheat Plant") + longdesc = S("Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.") else create = false end minetest.register_node("mcl_farming:wheat_"..i, { - description = string.format("Premature Wheat Plant (Stage %d)", i), + description = S("Premature Wheat Plant (Stage @1)", i), _doc_items_create_entry = create, _doc_items_entry_name = name, _doc_items_longdesc = longdesc, @@ -58,8 +60,8 @@ for i=1,7 do end minetest.register_node("mcl_farming:wheat", { - description = "Mature Wheat Plant", - _doc_items_longdesc = "Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.", + description = S("Mature Wheat Plant"), + _doc_items_longdesc = S("Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further."), sunlight_propagates = true, paramtype = "light", paramtype2 = "meshoptions", @@ -86,8 +88,8 @@ minetest.register_node("mcl_farming:wheat", { mcl_farming:add_plant("plant_wheat", "mcl_farming:wheat", {"mcl_farming:wheat_1", "mcl_farming:wheat_2", "mcl_farming:wheat_3", "mcl_farming:wheat_4", "mcl_farming:wheat_5", "mcl_farming:wheat_6", "mcl_farming:wheat_7"}, 25, 20) minetest.register_craftitem("mcl_farming:wheat_item", { - description = "Wheat", - _doc_items_longdesc = "Wheat is used in crafting. Some animals like wheat.", + description = S("Wheat"), + _doc_items_longdesc = S("Wheat is used in crafting. Some animals like wheat."), _doc_items_usagehelp = "Rightclick an animal to try to feed it wheat.", inventory_image = "farming_wheat_harvested.png", groups = { craftitem = 1 }, @@ -108,8 +110,8 @@ minetest.register_craft({ }) minetest.register_craftitem("mcl_farming:cookie", { - description = "Cookie", - _doc_items_longdesc = "This is a food item which can be eaten.", + description = S("Cookie"), + _doc_items_longdesc = S("This is a food item which can be eaten."), inventory_image = "farming_cookie.png", groups = {food=2, eatable=2}, _mcl_saturation = 0.4, @@ -119,8 +121,8 @@ minetest.register_craftitem("mcl_farming:cookie", { minetest.register_craftitem("mcl_farming:bread", { - description = "Bread", - _doc_items_longdesc = "This is a food item which can be eaten.", + description = S("Bread"), + _doc_items_longdesc = S("This is a food item which can be eaten."), inventory_image = "farming_bread.png", groups = {food=2, eatable=5}, _mcl_saturation = 6.0, @@ -129,8 +131,8 @@ minetest.register_craftitem("mcl_farming:bread", { }) minetest.register_node("mcl_farming:hay_block", { - description = "Hay Bale", - _doc_items_longdesc = "Hay bales are decorative blocks made from wheat.", + description = S("Hay Bale"), + _doc_items_longdesc = S("Hay bales are decorative blocks made from wheat."), tiles = {"mcl_farming_hayblock_top.png", "mcl_farming_hayblock_top.png", "mcl_farming_hayblock_side.png"}, is_ground_content = false, stack_max = 64, diff --git a/mods/ITEMS/mcl_fences/init.lua b/mods/ITEMS/mcl_fences/init.lua index 2f4c9952d..1e2539faa 100644 --- a/mods/ITEMS/mcl_fences/init.lua +++ b/mods/ITEMS/mcl_fences/init.lua @@ -1,5 +1,7 @@ local init = os.clock() +local S = minetest.get_translator("mcl_fences") + -- Node box local p = {-2/16, -0.5, -2/16, 2/16, 0.5, 2/16} local x1 = {-0.5, 4/16, -1/16, -2/16, 7/16, 1/16} --oben(quer) -x @@ -36,7 +38,7 @@ mcl_fences.register_fence = function(id, fence_name, texture, groups, hardness, table.insert(connects_to, fence_id) minetest.register_node(fence_id, { description = fence_name, - _doc_items_longdesc = "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.", + _doc_items_longdesc = S("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."), tiles = {texture}, inventory_image = "mcl_fences_fence_mask.png^" .. texture .. "^mcl_fences_fence_mask.png^[makealpha:255,126,126", wield_image = "mcl_fences_fence_mask.png^" .. texture .. "^mcl_fences_fence_mask.png^[makealpha:255,126,126", @@ -172,8 +174,8 @@ mcl_fences.register_fence_gate = function(id, fence_gate_name, texture, groups, cgroups_closed.mesecon_effector_off = nil minetest.register_node(gate_id, { description = fence_gate_name, - _doc_items_longdesc = "Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.", - _doc_items_usagehelp = "Right-click the fence gate to open or close it.", + _doc_items_longdesc = S("Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates."), + _doc_items_usagehelp = S("Right-click the fence gate to open or close it."), tiles = {texture}, inventory_image = "mcl_fences_fence_gate_mask.png^" .. texture .. "^mcl_fences_fence_gate_mask.png^[makealpha:255,126,126", wield_image = "mcl_fences_fence_gate_mask.png^" .. texture .. "^mcl_fences_fence_gate_mask.png^[makealpha:255,126,126", @@ -250,12 +252,12 @@ local wood_connect = {"group:fence_wood"} local wood_sounds = mcl_sounds.node_sound_wood_defaults() local woods = { - {"", "Oak Fence", "Oak Fence Gate", "mcl_fences_fence_oak.png", "mcl_fences_fence_gate_oak.png", "mcl_core:wood"}, - {"spruce", "Spruce Fence", "Spruce Fence Gate", "mcl_fences_fence_spruce.png", "mcl_fences_fence_gate_spruce.png", "mcl_core:sprucewood"}, - {"birch", "Birch Fence", "Birch Fence Gate", "mcl_fences_fence_birch.png", "mcl_fences_fence_gate_birch.png", "mcl_core:birchwood"}, - {"jungle", "Jungle Fence", "Jungle Fence Gate", "mcl_fences_fence_jungle.png", "mcl_fences_fence_gate_jungle.png", "mcl_core:junglewood"}, - {"dark_oak", "Dark Oak Fence", "Dark Oak Fence Gate", "mcl_fences_fence_big_oak.png", "mcl_fences_fence_gate_big_oak.png", "mcl_core:darkwood"}, - {"acacia", "Acacia Fence", "Acacia Fence Gate", "mcl_fences_fence_acacia.png", "mcl_fences_fence_gate_acacia.png", "mcl_core:acaciawood"}, + {"", S("Oak Fence"), S("Oak Fence Gate"), "mcl_fences_fence_oak.png", "mcl_fences_fence_gate_oak.png", "mcl_core:wood"}, + {"spruce", S("Spruce Fence"), S("Spruce Fence Gate"), "mcl_fences_fence_spruce.png", "mcl_fences_fence_gate_spruce.png", "mcl_core:sprucewood"}, + {"birch", S("Birch Fence"), S("Birch Fence Gate"), "mcl_fences_fence_birch.png", "mcl_fences_fence_gate_birch.png", "mcl_core:birchwood"}, + {"jungle", S("Jungle Fence"), S("Jungle Fence Gate"), "mcl_fences_fence_jungle.png", "mcl_fences_fence_gate_jungle.png", "mcl_core:junglewood"}, + {"dark_oak", S("Dark Oak Fence"), S("Dark Oak Fence Gate"), "mcl_fences_fence_big_oak.png", "mcl_fences_fence_gate_big_oak.png", "mcl_core:darkwood"}, + {"acacia", S("Acacia Fence"), S("Acacia Fence Gate"), "mcl_fences_fence_acacia.png", "mcl_fences_fence_gate_acacia.png", "mcl_core:acaciawood"}, } for w=1, #woods do diff --git a/mods/ITEMS/mcl_fire/fire_charge.lua b/mods/ITEMS/mcl_fire/fire_charge.lua index 78dbade78..58e86778f 100644 --- a/mods/ITEMS/mcl_fire/fire_charge.lua +++ b/mods/ITEMS/mcl_fire/fire_charge.lua @@ -1,8 +1,10 @@ +local S = minetest.get_translator("mcl_fire") + -- Fire Charge minetest.register_craftitem("mcl_fire:fire_charge", { - description = "Fire Charge", - _doc_items_longdesc = "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.", - _doc_items_usagehelp = "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.", + description = S("Fire Charge"), + _doc_items_longdesc = S("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."), + _doc_items_usagehelp = S("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."), inventory_image = "mcl_fire_fire_charge.png", liquids_pointable = false, stack_max = 64, diff --git a/mods/ITEMS/mcl_fire/flint_and_steel.lua b/mods/ITEMS/mcl_fire/flint_and_steel.lua index 7cb114ad1..6ca2132d0 100644 --- a/mods/ITEMS/mcl_fire/flint_and_steel.lua +++ b/mods/ITEMS/mcl_fire/flint_and_steel.lua @@ -1,8 +1,10 @@ +local S = minetest.get_translator("mcl_fire") + -- Flint and Steel minetest.register_tool("mcl_fire:flint_and_steel", { - description = "Flint and Steel", - _doc_items_longdesc = "Flint and steel is a tool to start fires and ignite blocks.", - _doc_items_usagehelp = "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.", + description = S("Flint and Steel"), + _doc_items_longdesc = S("Flint and steel is a tool to start fires and ignite blocks."), + _doc_items_usagehelp = S("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."), inventory_image = "mcl_fire_flint_and_steel.png", liquids_pointable = false, stack_max = 1, diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index 7743d30dd..d85fbf1c6 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -2,6 +2,7 @@ mcl_fire = {} +local S = minetest.get_translator("mcl_fire") -- -- Items @@ -9,11 +10,11 @@ mcl_fire = {} -- Flame nodes -local fire_help = "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." -local eternal_fire_help = "Eternal fire is a damaging and destructive block. 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." +local fire_help = S("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.") +local eternal_fire_help = S("Eternal fire is a damaging and destructive block. 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.") minetest.register_node("mcl_fire:fire", { - description = "Fire", + description = S("Fire"), _doc_items_longdesc = fire_help, drawtype = "firelike", tiles = { @@ -92,7 +93,7 @@ minetest.register_node("mcl_fire:fire", { }) minetest.register_node("mcl_fire:eternal_fire", { - description = "Eternal Fire", + description = S("Eternal Fire"), _doc_items_longdesc = eternal_fire_help, drawtype = "firelike", tiles = { diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index ab2519b9f..0c23daae7 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_fishing") + local go_fishing = function(itemstack, user, pointed_thing) if pointed_thing and pointed_thing.under then -- Use pointed node's on_rightclick function first, if present @@ -83,9 +85,9 @@ end -- Fishing Rod minetest.register_tool("mcl_fishing:fishing_rod", { - description = "Fishing Rod", - _doc_items_longdesc = "Fishing rods can be used to catch fish.", - _doc_items_usagehelp = "Rightclick a water source to try to go fishing. Who knows what you're going to catch?", + description = S("Fishing Rod"), + _doc_items_longdesc = S("Fishing rods can be used to catch fish."), + _doc_items_usagehelp = S("Rightclick a water source to try to go fishing. Who knows what you're going to catch?"), -- This item is incomplete, hide it from creative inventory groups = { tool=1, not_in_creative_inventory=1 }, inventory_image = "mcl_fishing_fishing_rod.png", @@ -128,8 +130,8 @@ minetest.register_craft({ -- Fish minetest.register_craftitem("mcl_fishing:fish_raw", { - description = "Raw Fish", - _doc_items_longdesc = "Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.", + description = S("Raw Fish"), + _doc_items_longdesc = S("Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value."), inventory_image = "mcl_fishing_fish_raw.png", on_place = minetest.item_eat(2), on_secondary_use = minetest.item_eat(2), @@ -139,8 +141,8 @@ minetest.register_craftitem("mcl_fishing:fish_raw", { }) minetest.register_craftitem("mcl_fishing:fish_cooked", { - description = "Cooked Fish", - _doc_items_longdesc = "Mmh, fish! This is a healthy food item.", + description = S("Cooked Fish"), + _doc_items_longdesc = S("Mmh, fish! This is a healthy food item."), inventory_image = "mcl_fishing_fish_cooked.png", on_place = minetest.item_eat(5), on_secondary_use = minetest.item_eat(5), @@ -158,8 +160,8 @@ minetest.register_craft({ -- Salmon minetest.register_craftitem("mcl_fishing:salmon_raw", { - description = "Raw Salmon", - _doc_items_longdesc = "Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.", + description = S("Raw Salmon"), + _doc_items_longdesc = S("Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value."), inventory_image = "mcl_fishing_salmon_raw.png", on_place = minetest.item_eat(2), on_secondary_use = minetest.item_eat(2), @@ -169,8 +171,8 @@ minetest.register_craftitem("mcl_fishing:salmon_raw", { }) minetest.register_craftitem("mcl_fishing:salmon_cooked", { - description = "Cooked Salmon", - _doc_items_longdesc = "This is a healthy food item which can be eaten.", + description = S("Cooked Salmon"), + _doc_items_longdesc = S("This is a healthy food item which can be eaten."), inventory_image = "mcl_fishing_salmon_cooked.png", on_place = minetest.item_eat(6), on_secondary_use = minetest.item_eat(6), @@ -188,8 +190,8 @@ minetest.register_craft({ -- Clownfish minetest.register_craftitem("mcl_fishing:clownfish_raw", { - description = "Clownfish", - _doc_items_longdesc = "Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely.", + description = S("Clownfish"), + _doc_items_longdesc = S("Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely."), inventory_image = "mcl_fishing_clownfish_raw.png", on_place = minetest.item_eat(1), on_secondary_use = minetest.item_eat(1), @@ -201,8 +203,8 @@ minetest.register_craftitem("mcl_fishing:clownfish_raw", { -- Pufferfish -- TODO: Add real status effect minetest.register_craftitem("mcl_fishing:pufferfish_raw", { - description = "Pufferfish", - _doc_items_longdesc = "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).", + description = S("Pufferfish"), + _doc_items_longdesc = S("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)."), inventory_image = "mcl_fishing_pufferfish_raw.png", on_place = minetest.item_eat(1), on_secondary_use = minetest.item_eat(1), diff --git a/mods/ITEMS/mcl_flowerpots/init.lua b/mods/ITEMS/mcl_flowerpots/init.lua index e4df4459c..c58fab7cf 100644 --- a/mods/ITEMS/mcl_flowerpots/init.lua +++ b/mods/ITEMS/mcl_flowerpots/init.lua @@ -1,25 +1,26 @@ +local S = minetest.get_translator("mcl_flowerpots") local flowers = { - {"dandelion", "mcl_flowers:dandelion", "Dandelion Flower Pot"}, - {"poppy", "mcl_flowers:poppy", "Poppy Floer Pot"}, - {"blue_orchid", "mcl_flowers:blue_orchid", "Blue Orchid Flower Pot"}, - {"allium", "mcl_flowers:allium", "Allium Flower Pot"}, - {"azure_bluet", "mcl_flowers:azure_bluet", "Azure Bluet Flower Pot"}, - {"tulip_red", "mcl_flowers:tulip_red", "Red Tulip Flower Pot"}, - {"tulip_pink", "mcl_flowers:tulip_pink", "Pink Tulip Flower Pot"}, - {"tulip_white", "mcl_flowers:tulip_white", "White Tulip Flower Pot"}, - {"tulip_orange", "mcl_flowers:tulip_orange", "Orange Tulip Flower Pot"}, - {"oxeye_daisy", "mcl_flowers:oxeye_daisy", "Oxeye Daisy Flower Pot"}, - {"mushroom_brown", "mcl_mushrooms:mushroom_brown", "Brown Mushroom Flower Pot"}, - {"mushroom_red", "mcl_mushrooms:mushroom_red", "Red Mushroom Flower Pot"}, - {"sapling", "mcl_core:sapling", "Oak Sapling Flower Pot"}, - {"acaciasapling", "mcl_core:acaciasapling", "Acacia Sapling Flower Pot"}, - {"junglesapling", "mcl_core:junglesapling", "Jungle Sapling Flower Pot"}, - {"darksapling", "mcl_core:darksapling", "Dark Oak Sapling Flower Pot"}, - {"sprucesapling", "mcl_core:sprucesapling", "Spruce Sapling Flower Pot"}, - {"birchsapling", "mcl_core:birchsapling", "Birch Sapling Flower Pot"}, - {"deadbush", "mcl_core:deadbush", "Dead Bush Flower Pot"}, - {"fern", "mcl_flowers:fern", "Fern Flower Pot", {"mcl_flowers_fern_inv.png"}}, + {"dandelion", "mcl_flowers:dandelion", S("Dandelion Flower Pot")}, + {"poppy", "mcl_flowers:poppy", S("Poppy Floer Pot")}, + {"blue_orchid", "mcl_flowers:blue_orchid", S("Blue Orchid Flower Pot")}, + {"allium", "mcl_flowers:allium", S("Allium Flower Pot")}, + {"azure_bluet", "mcl_flowers:azure_bluet", S("Azure Bluet Flower Pot")}, + {"tulip_red", "mcl_flowers:tulip_red", S("Red Tulip Flower Pot")}, + {"tulip_pink", "mcl_flowers:tulip_pink", S("Pink Tulip Flower Pot")}, + {"tulip_white", "mcl_flowers:tulip_white", S("White Tulip Flower Pot")}, + {"tulip_orange", "mcl_flowers:tulip_orange", S("Orange Tulip Flower Pot")}, + {"oxeye_daisy", "mcl_flowers:oxeye_daisy", S("Oxeye Daisy Flower Pot")}, + {"mushroom_brown", "mcl_mushrooms:mushroom_brown", S("Brown Mushroom Flower Pot")}, + {"mushroom_red", "mcl_mushrooms:mushroom_red", S("Red Mushroom Flower Pot")}, + {"sapling", "mcl_core:sapling", S("Oak Sapling Flower Pot")}, + {"acaciasapling", "mcl_core:acaciasapling", S("Acacia Sapling Flower Pot")}, + {"junglesapling", "mcl_core:junglesapling", S("Jungle Sapling Flower Pot")}, + {"darksapling", "mcl_core:darksapling", S("Dark Oak Sapling Flower Pot")}, + {"sprucesapling", "mcl_core:sprucesapling", S("Spruce Sapling Flower Pot")}, + {"birchsapling", "mcl_core:birchsapling", S("Birch Sapling Flower Pot")}, + {"deadbush", "mcl_core:deadbush", S("Dead Bush Flower Pot")}, + {"fern", "mcl_flowers:fern", S("Fern Flower Pot"), {"mcl_flowers_fern_inv.png"}}, } local cubes = { @@ -27,9 +28,9 @@ local cubes = { } minetest.register_node("mcl_flowerpots:flower_pot", { - description = "Flower Pot", - _doc_items_longdesc = "Flower pots are decorational blocks in which flowers and other small plants can be placed.", - _doc_items_usagehelp = "Rightclick an empty flower pot while you wield a plant to place the plant. 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.", + description = S("Flower Pot"), + _doc_items_longdesc = S("Flower pots are decorational blocks in which flowers and other small plants can be placed."), + _doc_items_usagehelp = S("Rightclick an empty flower pot while you wield a plant to place the plant. 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."), drawtype = "mesh", mesh = "flowerpot.obj", tiles = { From 47c817d75aea45889f46ba0b2f25ac846e6efff0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 00:22:28 +0100 Subject: [PATCH 067/379] New translation system, part 8: Items, part 4 --- mods/ITEMS/mcl_flowers/init.lua | 56 ++++++----- mods/ITEMS/mcl_furnaces/init.lua | 10 +- mods/ITEMS/mcl_heads/init.lua | 12 ++- mods/ITEMS/mcl_hoppers/init.lua | 21 ++-- mods/ITEMS/mcl_itemframes/init.lua | 8 +- mods/ITEMS/mcl_jukebox/init.lua | 18 ++-- mods/ITEMS/mcl_maps/init.lua | 14 +-- mods/ITEMS/mcl_mobitems/init.lua | 120 ++++++++++++----------- mods/ITEMS/mcl_mobspawners/init.lua | 2 +- mods/ITEMS/mcl_monster_eggs/depends.txt | 1 - mods/ITEMS/mcl_monster_eggs/init.lua | 4 +- mods/ITEMS/mcl_monster_eggs/intllib.lua | 45 --------- mods/ITEMS/mcl_mushrooms/huge.lua | 16 +-- mods/ITEMS/mcl_mushrooms/small.lua | 20 ++-- mods/ITEMS/mcl_nether/init.lua | 50 +++++----- mods/ITEMS/mcl_nether/lava.lua | 5 +- mods/ITEMS/mcl_ocean/init.lua | 18 ++-- mods/ITEMS/mcl_portals/portal_end.lua | 16 +-- mods/ITEMS/mcl_portals/portal_nether.lua | 12 ++- mods/ITEMS/mcl_potions/init.lua | 40 ++++---- mods/ITEMS/mcl_signs/init.lua | 8 +- mods/ITEMS/mcl_sponges/init.lua | 14 +-- 22 files changed, 248 insertions(+), 262 deletions(-) delete mode 100644 mods/ITEMS/mcl_monster_eggs/intllib.lua diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index ac575e123..8fb8dc800 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -1,10 +1,12 @@ +local S = minetest.get_translator("mcl_flowers") + -- Minetest 0.4 mod: default -- See README.txt for licensing and other information. local init = os.clock() -- Simple flower template -local smallflowerlongdesc = "This is a small flower. Small flowers are mainly used for dye production and can also be potted." -local plant_usage_help = "It can only be placed on a block on which it would also survive." +local smallflowerlongdesc = S("This is a small flower. Small flowers are mainly used for dye production and can also be potted.") +local plant_usage_help = S("It can only be placed on a block on which it would also survive.") -- on_place function for flowers local on_place_flower = mcl_util.generate_on_place_plant_function(function(pos, node, itemstack) @@ -62,16 +64,16 @@ local function add_simple_flower(name, desc, image, simple_selection_box) }) end -add_simple_flower("poppy", "Poppy", "mcl_flowers_poppy", { -5/16, -0.5, -5/16, 5/16, 5/16, 5/16 }) -add_simple_flower("dandelion", "Dandelion", "flowers_dandelion_yellow", { -4/16, -0.5, -4/16, 4/16, 3/16, 4/16 }) -add_simple_flower("oxeye_daisy", "Oxeye Daisy", "mcl_flowers_oxeye_daisy", { -4/16, -0.5, -4/16, 4/16, 4/16, 4/16 }) -add_simple_flower("tulip_orange", "Orange Tulip", "flowers_tulip", { -3/16, -0.5, -3/16, 3/16, 5/16, 3/16 }) -add_simple_flower("tulip_pink", "Pink Tulip", "mcl_flowers_tulip_pink", { -3/16, -0.5, -3/16, 3/16, 5/16, 3/16 }) -add_simple_flower("tulip_red", "Red Tulip", "mcl_flowers_tulip_red", { -3/16, -0.5, -3/16, 3/16, 6/16, 3/16 }) -add_simple_flower("tulip_white", "White Tulip", "mcl_flowers_tulip_white", { -3/16, -0.5, -3/16, 3/16, 4/16, 3/16 }) -add_simple_flower("allium", "Allium", "mcl_flowers_allium", { -3/16, -0.5, -3/16, 3/16, 6/16, 3/16 }) -add_simple_flower("azure_bluet", "Azure Bluet", "mcl_flowers_azure_bluet", { -5/16, -0.5, -5/16, 5/16, 3/16, 5/16 }) -add_simple_flower("blue_orchid", "Blue Orchid", "mcl_flowers_blue_orchid", { -5/16, -0.5, -5/16, 5/16, 7/16, 5/16 }) +add_simple_flower("poppy", S("Poppy"), "mcl_flowers_poppy", { -5/16, -0.5, -5/16, 5/16, 5/16, 5/16 }) +add_simple_flower("dandelion", S("Dandelion"), "flowers_dandelion_yellow", { -4/16, -0.5, -4/16, 4/16, 3/16, 4/16 }) +add_simple_flower("oxeye_daisy", S("Oxeye Daisy"), "mcl_flowers_oxeye_daisy", { -4/16, -0.5, -4/16, 4/16, 4/16, 4/16 }) +add_simple_flower("tulip_orange", S("Orange Tulip"), "flowers_tulip", { -3/16, -0.5, -3/16, 3/16, 5/16, 3/16 }) +add_simple_flower("tulip_pink", S("Pink Tulip"), "mcl_flowers_tulip_pink", { -3/16, -0.5, -3/16, 3/16, 5/16, 3/16 }) +add_simple_flower("tulip_red", S("Red Tulip"), "mcl_flowers_tulip_red", { -3/16, -0.5, -3/16, 3/16, 6/16, 3/16 }) +add_simple_flower("tulip_white", S("White Tulip"), "mcl_flowers_tulip_white", { -3/16, -0.5, -3/16, 3/16, 4/16, 3/16 }) +add_simple_flower("allium", S("Allium"), "mcl_flowers_allium", { -3/16, -0.5, -3/16, 3/16, 6/16, 3/16 }) +add_simple_flower("azure_bluet", S("Azure Bluet"), "mcl_flowers_azure_bluet", { -5/16, -0.5, -5/16, 5/16, 3/16, 5/16 }) +add_simple_flower("blue_orchid", S("Blue Orchid"), "mcl_flowers_blue_orchid", { -5/16, -0.5, -5/16, 5/16, 7/16, 5/16 }) local wheat_seed_drop = { @@ -88,9 +90,9 @@ local wheat_seed_drop = { --- Tall Grass --- local def_tallgrass = { - description = "Tall Grass", + description = S("Tall Grass"), drawtype = "plantlike", - _doc_items_longdesc = "Tall grass is a small plant which often occours 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.", + _doc_items_longdesc = S("Tall grass is a small plant which often occours 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."), _doc_items_usagehelp = plant_usage_help, _doc_items_hidden = false, waving = 1, @@ -122,8 +124,8 @@ minetest.register_node("mcl_flowers:tallgrass", def_tallgrass) --- Fern --- -- The fern is very similar to tall grass, so we can copy a lot from it. local def_fern = table.copy(def_tallgrass) -def_fern.description = "Fern" -def_fern._doc_items_longdesc = "Ferns are small plants which occour naturally in grasslands. 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." +def_fern.description = S("Fern") +def_fern._doc_items_longdesc = S("Ferns are small plants which occour naturally in grasslands. 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.") def_fern.tiles = { "mcl_flowers_fern.png" } def_fern.inventory_image = "mcl_flowers_fern_inv.png" def_fern.wield_image = "mcl_flowers_fern_inv.png" @@ -275,7 +277,7 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im -- Top minetest.register_node("mcl_flowers:"..name.."_top", { - description = desc.." (Top Part)", + description = desc.." " .. S("(Top Part)"), _doc_items_create_entry = false, drawtype = "plantlike", tiles = { top_img }, @@ -310,18 +312,18 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im end -add_large_plant("peony", "Peony", "A peony is a large plant which occupies two blocks. It is mainly used in dye protection.", "mcl_flowers_double_plant_paeonia_bottom.png", "mcl_flowers_double_plant_paeonia_top.png", nil, 5/16, 6/16) -add_large_plant("rose_bush", "Rose Bush", "A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye protection.", "mcl_flowers_double_plant_rose_bottom.png", "mcl_flowers_double_plant_rose_top.png", nil, 5/16, 1/16) -add_large_plant("lilac", "Lilac", "A lilac is a large plant which occupies two blocks. It is mainly used in dye production.", "mcl_flowers_double_plant_syringa_bottom.png", "mcl_flowers_double_plant_syringa_top.png", nil, 5/16, 6/16) +add_large_plant("peony", S("Peony"), S("A peony is a large plant which occupies two blocks. It is mainly used in dye protection."), "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 protection."), "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", "Sunflower", "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_top.png^mcl_flowers_double_plant_sunflower_front.png", "mcl_flowers_double_plant_sunflower_front.png", 6/16, 6/16) -local longdesc_grass = "Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds." -local longdesc_fern = "Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds." +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.") -add_large_plant("double_grass", "Double Tallgrass", longdesc_grass, "mcl_flowers_double_plant_grass_bottom.png", "mcl_flowers_double_plant_grass_top.png", "mcl_flowers_double_plant_grass_inv.png", 6/16, 4/16, wheat_seed_drop, {"mcl_flowers:tallgrass 2"}, false, true) -add_large_plant("double_fern", "Large Fern", longdesc_fern, "mcl_flowers_double_plant_fern_bottom.png", "mcl_flowers_double_plant_fern_top.png", "mcl_flowers_double_plant_fern_inv.png", 5/16, 5/16, wheat_seed_drop, {"mcl_flowers:fern 2"}, false, true) +add_large_plant("double_grass", S("Double Tallgrass"), longdesc_grass, "mcl_flowers_double_plant_grass_bottom.png", "mcl_flowers_double_plant_grass_top.png", "mcl_flowers_double_plant_grass_inv.png", 6/16, 4/16, wheat_seed_drop, {"mcl_flowers:tallgrass 2"}, false, true) +add_large_plant("double_fern", S("Large Fern"), longdesc_fern, "mcl_flowers_double_plant_fern_bottom.png", "mcl_flowers_double_plant_fern_top.png", "mcl_flowers_double_plant_fern_inv.png", 5/16, 5/16, wheat_seed_drop, {"mcl_flowers:fern 2"}, false, true) minetest.register_abm({ label = "Pop out flowers", @@ -348,8 +350,8 @@ minetest.register_abm({ -- Lily Pad minetest.register_node("mcl_flowers:waterlily", { - description = "Lily Pad", - _doc_items_longdesc = "A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.", + description = S("Lily Pad"), + _doc_items_longdesc = S("A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice."), drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index 9a8804fde..781fe4a94 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -1,4 +1,6 @@ +local S = minetest.get_translator("mcl_furnaces") + -- -- Formspecs -- @@ -292,9 +294,9 @@ if minetest.get_modpath("screwdriver") then end minetest.register_node("mcl_furnaces:furnace", { - description = "Furnace", - _doc_items_longdesc = "Furnaces cook or smelt several items, using a furnace fuel, into something else.", - _doc_items_usagehelp = "Right-click the furnace to view it. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.", + description = S("Furnace"), + _doc_items_longdesc = S("Furnaces cook or smelt several items, using a furnace fuel, into something else."), + _doc_items_usagehelp = S("Right-click the furnace to view it. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side."), _doc_items_hidden = false, tiles = { "default_furnace_top.png", "default_furnace_bottom.png", @@ -350,7 +352,7 @@ minetest.register_node("mcl_furnaces:furnace", { }) minetest.register_node("mcl_furnaces:furnace_active", { - description = "Burning Furnace", + description = S("Burning Furnace"), _doc_items_create_entry = false, tiles = { "default_furnace_top.png", "default_furnace_bottom.png", diff --git a/mods/ITEMS/mcl_heads/init.lua b/mods/ITEMS/mcl_heads/init.lua index 180affe27..90114a0f2 100644 --- a/mods/ITEMS/mcl_heads/init.lua +++ b/mods/ITEMS/mcl_heads/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_heads") + -- Heads system local function addhead(name, texture, desc, longdesc) @@ -48,9 +50,9 @@ local function addhead(name, texture, desc, longdesc) end -- Add heads -addhead("zombie", "mcl_heads_zombie_node.png", "Zombie Head", "A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet for fun, but does not offer any protection.") -addhead("creeper", "mcl_heads_creeper_node.png", "Creeper Head", "A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet for fun, but does not offer any protection.") +addhead("zombie", "mcl_heads_zombie_node.png", S("Zombie Head"), S("A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet for fun, but does not offer any protection.")) +addhead("creeper", "mcl_heads_creeper_node.png", S("Creeper Head"), S("A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet for fun, but does not offer any protection.")) -- Original Minecraft name: “Head” -addhead("steve", "mcl_heads_steve_node.png", "Human Head", "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.") -addhead("skeleton", "mcl_heads_skeleton_node.png", "Skeleton Skull", "A skeleton skull is a small decorative block which resembles the head of a skeleton. It can also be worn as a helmet for fun, but does not offer any protection.") -addhead("wither_skeleton", "mcl_heads_wither_skeleton_node.png", "Wither Skeleton Skull", "A wither skeleton skull is a small decorative block which resembles the head of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.") +addhead("steve", "mcl_heads_steve_node.png", S("Human Head"), S("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.")) +addhead("skeleton", "mcl_heads_skeleton_node.png", S("Skeleton Skull"), S("A skeleton skull is a small decorative block which resembles the head of a skeleton. It can also be worn as a helmet for fun, but does not offer any protection.")) +addhead("wither_skeleton", "mcl_heads_wither_skeleton_node.png", S("Wither Skeleton Skull"), S("A wither skeleton skull is a small decorative block which resembles the head of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.")) diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index c7f7b0b9a..64588eadd 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -1,5 +1,6 @@ -local chest = minetest.get_content_id("mcl_chests:chest") +local S = minetest.get_translator("mcl_hoppers") +local chest = minetest.get_content_id("mcl_chests:chest") --[[ BEGIN OF NODE DEFINITIONS ]] @@ -121,16 +122,16 @@ local def_hopper = { -- Enabled downwards hopper local def_hopper_enabled = table.copy(def_hopper) -def_hopper_enabled.description = "Hopper" -def_hopper_enabled._doc_items_longdesc = [[Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempts 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. +def_hopper_enabled.description = S("Hopper") +def_hopper_enabled._doc_items_longdesc = S("Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempts 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.").."\n\n".. -Hoppers interact with containers the following way: +S([[Hoppers interact with containers the following way: • 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 put items into the fuel slot • Ender chests: Hoppers don't interact with ender chests -• Other containers: Hoppers interact with them normally +• Other containers: Hoppers interact with them normally]]).."\n\n".. -Hoppers can be disabled by supplying them with redstone power. Disabled hoppers don't move items.]] -def_hopper_enabled._doc_items_usagehelp = "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. Remember you can place at usable blocks (such as chests) with sneak + right-click. The hopper will keep its orientation when the blocks around it are changed. To access the hopper's inventory, rightclick it." +S("Hoppers can be disabled by supplying them with redstone power. Disabled hoppers don't move items.") +def_hopper_enabled._doc_items_usagehelp = S("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. Remember you can place at usable blocks (such as chests) with sneak + right-click. The hopper will keep its orientation when the blocks around it are changed. To access the hopper's inventory, rightclick it.") def_hopper_enabled.on_place = function(itemstack, placer, pointed_thing) local upos = pointed_thing.under local apos = pointed_thing.above @@ -179,7 +180,7 @@ minetest.register_node("mcl_hoppers:hopper", def_hopper_enabled) -- Disabled downwards hopper local def_hopper_disabled = table.copy(def_hopper) -def_hopper_disabled.description = "Disabled Hopper" +def_hopper_disabled.description = S("Disabled Hopper") def_hopper_disabled._doc_items_create_entry = false def_hopper_disabled.groups.not_in_creative_inventory = 1 def_hopper_disabled.drop = "mcl_hoppers:hopper" @@ -304,7 +305,7 @@ local def_hopper_side = { } local def_hopper_side_enabled = table.copy(def_hopper_side) -def_hopper_side_enabled.description = "Side Hopper" +def_hopper_side_enabled.description = S("Side Hopper") def_hopper_side_enabled.mesecons = { effector = { action_on = function(pos, node) @@ -315,7 +316,7 @@ def_hopper_side_enabled.mesecons = { minetest.register_node("mcl_hoppers:hopper_side", def_hopper_side_enabled) local def_hopper_side_disabled = table.copy(def_hopper_side) -def_hopper_side_disabled.description = "Disabled Side Hopper" +def_hopper_side_disabled.description = S("Disabled Side Hopper") def_hopper_side_disabled.mesecons = { effector = { action_off = function(pos, node) diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index 104379be1..e4e3f5cb0 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_itemframes") + minetest.register_entity("mcl_itemframes:item",{ hp_max = 1, visual = "wielditem", @@ -100,9 +102,9 @@ if minetest.get_modpath("screwdriver") then end minetest.register_node("mcl_itemframes:item_frame",{ - description = "Item Frame", - _doc_items_longdesc = "Item frames are decorative blocks in which items can be placed.", - _doc_items_usagehelp = "Hold any item in your hand and right-click the item frame to place the item into the frame. Rightclick the item frame again to retrieve the item.", + description = S("Item Frame"), + _doc_items_longdesc = S("Item frames are decorative blocks in which items can be placed."), + _doc_items_usagehelp = S("Hold any item in your hand and right-click the item frame to place the item into the frame. Rightclick the item frame again to retrieve the item."), drawtype = "mesh", is_ground_content = false, mesh = "mcl_itemframes_itemframe1facedir.obj", diff --git a/mods/ITEMS/mcl_jukebox/init.lua b/mods/ITEMS/mcl_jukebox/init.lua index efa29399b..3b3b918b6 100644 --- a/mods/ITEMS/mcl_jukebox/init.lua +++ b/mods/ITEMS/mcl_jukebox/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_jukebox") + -- Player name-indexed table containing the currently heard track local active_tracks = {} @@ -27,14 +29,14 @@ for r=1, records do local entryname, longdesc, usagehelp if r == 1 then doc = true - entryname = "Music Disc" - longdesc = "A music disc holds a single music track which can be used in a jukebox to play music." - usagehelp = "Rightclick an empty jukebox with the music disc in your hand to play the music. Rightclick the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players." + entryname = S("Music Disc") + longdesc = S("A music disc holds a single music track which can be used in a jukebox to play music.") + usagehelp = S("Rightclick an empty jukebox with the music disc in your hand to play the music. Rightclick the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players.") end minetest.register_craftitem("mcl_jukebox:record_"..r, { description = - core.colorize("#55FFFF", "Music Disc") .. "\n" .. - core.colorize("#989898", recorddata[r][2] .. "—" .. recorddata[r][1]), + core.colorize("#55FFFF", S("Music Disc")) .. "\n" .. + core.colorize("#989898", S("@1—@2", recorddata[r][2], recorddata[r][1])), _doc_items_create_entry = doc, _doc_items_entry_name = entryname, _doc_items_longdesc = longdesc, @@ -123,9 +125,9 @@ end -- Jukebox minetest.register_node("mcl_jukebox:jukebox", { - description = "Jukebox", - _doc_items_longdesc = "Jukeboxes play music when they're supplied with a music disc.", - _doc_items_usagehelp = "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.", + description = S("Jukebox"), + _doc_items_longdesc = S("Jukeboxes play music when they're supplied with a music disc."), + _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}, diff --git a/mods/ITEMS/mcl_maps/init.lua b/mods/ITEMS/mcl_maps/init.lua index 2c7037bf2..dbe270221 100644 --- a/mods/ITEMS/mcl_maps/init.lua +++ b/mods/ITEMS/mcl_maps/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_maps") + -- Turn empty map into filled map by rightclick local make_filled_map = function(itemstack, placer, pointed_thing) local new_map = ItemStack("mcl_maps:filled_map") @@ -16,9 +18,9 @@ local make_filled_map = function(itemstack, placer, pointed_thing) end minetest.register_craftitem("mcl_maps:empty_map", { - description = "Empty Map", - _doc_items_longdesc = "Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.", - _doc_items_usagehelp = "Rightclick to start using the map (which can't be stacked anymore).", + description = S("Empty Map"), + _doc_items_longdesc = S("Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used."), + _doc_items_usagehelp = S("Rightclick to start using the map (which can't be stacked anymore)."), inventory_image = "mcl_maps_map_empty.png", groups = { not_in_creative_inventory = 1 }, on_place = make_filled_map, @@ -31,9 +33,9 @@ minetest.register_craftitem("mcl_maps:empty_map", { -- Note: This is not at all like Minecraft right now. Minetest's minimap is pretty overpowered, it -- has a very greatly zoomed-out version and even a radar mode minetest.register_craftitem("mcl_maps:filled_map", { - description = "Map", - _doc_items_longdesc = "Maps show your surroundings as you explore the world. They can even show you the world like a radar. MAGIC!\nNote: Maps are subject to change in future versions of MineClone 2.", - _doc_items_usagehelp = "Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key ([F9] by default).\nIn Creative Mode, you don't need this item; the minimap is always available.", + description = S("Map"), + _doc_items_longdesc = S("Maps show your surroundings as you explore the world. They can even show you the world like a radar. MAGIC!\nNote: Maps are subject to change in future versions of MineClone 2."), + _doc_items_usagehelp = S("Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key ([F9] by default).\nIn Creative Mode, you don't need this item; the minimap is always available."), groups = { tool = 1 }, inventory_image = "mcl_maps_map_filled.png^(mcl_maps_map_filled_markings.png^[colorize:#000000)", stack_max = 1, diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index c070c8a88..27acbb61a 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -1,8 +1,10 @@ -- TODO: Add special status effects for raw flesh +local S = minetest.get_translator("mcl_mobitems") + minetest.register_craftitem("mcl_mobitems:rotten_flesh", { - description = "Rotten Flesh", - _doc_items_longdesc = "Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.", + description = S("Rotten Flesh"), + _doc_items_longdesc = S("Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while."), inventory_image = "mcl_mobitems_rotten_flesh.png", wield_image = "mcl_mobitems_rotten_flesh.png", on_place = minetest.item_eat(4), @@ -13,8 +15,8 @@ minetest.register_craftitem("mcl_mobitems:rotten_flesh", { }) minetest.register_craftitem("mcl_mobitems:mutton", { - description = "Raw Mutton", - _doc_items_longdesc = "Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.", + description = S("Raw Mutton"), + _doc_items_longdesc = S("Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value."), inventory_image = "mcl_mobitems_mutton_raw.png", wield_image = "mcl_mobitems_mutton_raw.png", on_place = minetest.item_eat(2), @@ -25,8 +27,8 @@ minetest.register_craftitem("mcl_mobitems:mutton", { }) minetest.register_craftitem("mcl_mobitems:cooked_mutton", { - description = "Cooked Mutton", - _doc_items_longdesc = "Cooked mutton is the cooked flesh from a sheep and is used as food.", + description = S("Cooked Mutton"), + _doc_items_longdesc = S("Cooked mutton is the cooked flesh from a sheep and is used as food."), inventory_image = "mcl_mobitems_mutton_cooked.png", wield_image = "mcl_mobitems_mutton_cooked.png", on_place = minetest.item_eat(6), @@ -37,8 +39,8 @@ minetest.register_craftitem("mcl_mobitems:cooked_mutton", { }) minetest.register_craftitem("mcl_mobitems:beef", { - description = "Raw Beef", - _doc_items_longdesc = "Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.", + description = S("Raw Beef"), + _doc_items_longdesc = S("Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value."), inventory_image = "mcl_mobitems_beef_raw.png", wield_image = "mcl_mobitems_beef_raw.png", on_place = minetest.item_eat(3), @@ -49,8 +51,8 @@ minetest.register_craftitem("mcl_mobitems:beef", { }) minetest.register_craftitem("mcl_mobitems:cooked_beef", { - description = "Steak", - _doc_items_longdesc = "Steak is cooked beef from cows and can be eaten.", + description = S("Steak"), + _doc_items_longdesc = S("Steak is cooked beef from cows and can be eaten."), inventory_image = "mcl_mobitems_beef_cooked.png", wield_image = "mcl_mobitems_beef_cooked.png", on_place = minetest.item_eat(8), @@ -61,8 +63,8 @@ minetest.register_craftitem("mcl_mobitems:cooked_beef", { }) minetest.register_craftitem("mcl_mobitems:chicken", { - description = "Raw Chicken", - _doc_items_longdesc = "Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.", + description = S("Raw Chicken"), + _doc_items_longdesc = S("Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value."), inventory_image = "mcl_mobitems_chicken_raw.png", wield_image = "mcl_mobitems_chicken_raw.png", on_place = minetest.item_eat(2), @@ -73,8 +75,8 @@ minetest.register_craftitem("mcl_mobitems:chicken", { }) minetest.register_craftitem("mcl_mobitems:cooked_chicken", { - description = "Cooked Chicken", - _doc_items_longdesc = "A cooked chicken is a healthy food item which can be eaten.", + description = S("Cooked Chicken"), + _doc_items_longdesc = S("A cooked chicken is a healthy food item which can be eaten."), inventory_image = "mcl_mobitems_chicken_cooked.png", wield_image = "mcl_mobitems_chicken_cooked.png", on_place = minetest.item_eat(6), @@ -85,8 +87,8 @@ minetest.register_craftitem("mcl_mobitems:cooked_chicken", { }) minetest.register_craftitem("mcl_mobitems:porkchop", { - description = "Raw Porkchop", - _doc_items_longdesc = "A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.", + description = S("Raw Porkchop"), + _doc_items_longdesc = S("A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value."), inventory_image = "mcl_mobitems_porkchop_raw.png", wield_image = "mcl_mobitems_porkchop_raw.png", on_place = minetest.item_eat(3), @@ -97,8 +99,8 @@ minetest.register_craftitem("mcl_mobitems:porkchop", { }) minetest.register_craftitem("mcl_mobitems:cooked_porkchop", { - description = "Cooked Porkchop", - _doc_items_longdesc = "Cooked porkchop is the cooked flesh of a pig and is used as food.", + description = S("Cooked Porkchop"), + _doc_items_longdesc = S("Cooked porkchop is the cooked flesh of a pig and is used as food."), inventory_image = "mcl_mobitems_porkchop_cooked.png", wield_image = "mcl_mobitems_porkchop_cooked.png", on_place = minetest.item_eat(8), @@ -109,8 +111,8 @@ minetest.register_craftitem("mcl_mobitems:cooked_porkchop", { }) minetest.register_craftitem("mcl_mobitems:rabbit", { - description = "Raw Rabbit", - _doc_items_longdesc = "Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.", + description = S("Raw Rabbit"), + _doc_items_longdesc = S("Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value."), inventory_image = "mcl_mobitems_rabbit_raw.png", wield_image = "mcl_mobitems_rabbit_raw.png", on_place = minetest.item_eat(3), @@ -121,8 +123,8 @@ minetest.register_craftitem("mcl_mobitems:rabbit", { }) minetest.register_craftitem("mcl_mobitems:cooked_rabbit", { - description = "Cooked Rabbit", - _doc_items_longdesc = "This is a food item which can be eaten.", + description = S("Cooked Rabbit"), + _doc_items_longdesc = S("This is a food item which can be eaten."), inventory_image = "mcl_mobitems_rabbit_cooked.png", wield_image = "mcl_mobitems_rabbit_cooked.png", on_place = minetest.item_eat(5), @@ -143,8 +145,8 @@ end -- TODO: Clear *all* status effects minetest.register_craftitem("mcl_mobitems:milk_bucket", { - description = "Milk", - _doc_items_longdesc = "Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning (in later versions: all status effects), but restores no hunger points.", + description = S("Milk"), + _doc_items_longdesc = S("Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning (in later versions: all status effects), but restores no hunger points."), _doc_items_usagehelp = "Rightclick to drink the milk.", inventory_image = "mcl_mobitems_bucket_milk.png", wield_image = "mcl_mobitems_bucket_milk.png", @@ -156,8 +158,8 @@ minetest.register_craftitem("mcl_mobitems:milk_bucket", { }) minetest.register_craftitem("mcl_mobitems:spider_eye", { - description = "Spider Eye", - _doc_items_longdesc = "Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.", + description = S("Spider Eye"), + _doc_items_longdesc = S("Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly."), inventory_image = "mcl_mobitems_spider_eye.png", wield_image = "mcl_mobitems_spider_eye.png", on_place = minetest.item_eat(2), @@ -168,8 +170,8 @@ minetest.register_craftitem("mcl_mobitems:spider_eye", { }) minetest.register_craftitem("mcl_mobitems:bone", { - description = "Bone", - _doc_items_longdesc = "Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.", + description = S("Bone"), + _doc_items_longdesc = S("Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient."), _doc_items_usagehelp = "Hold the bone in your hand near wolves to attract them. Rightclick the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by rightclicking it.", inventory_image = "mcl_mobitems_bone.png", stack_max = 64, @@ -177,16 +179,16 @@ minetest.register_craftitem("mcl_mobitems:bone", { }) minetest.register_craftitem("mcl_mobitems:string",{ - description = "String", - _doc_items_longdesc = "Strings are used in crafting.", + description = S("String"), + _doc_items_longdesc = S("Strings are used in crafting."), inventory_image = "mcl_mobitems_string.png", stack_max = 64, groups = { craftitem = 1 }, }) minetest.register_craftitem("mcl_mobitems:blaze_rod", { - description = "Blaze Rod", - _doc_items_longdesc = "This is a crafting component dropped from dead blazes.", + description = S("Blaze Rod"), + _doc_items_longdesc = S("This is a crafting component dropped from dead blazes."), wield_image = "mcl_mobitems_blaze_rod.png", inventory_image = "mcl_mobitems_blaze_rod.png", groups = { craftitem = 1 }, @@ -194,8 +196,8 @@ minetest.register_craftitem("mcl_mobitems:blaze_rod", { }) minetest.register_craftitem("mcl_mobitems:blaze_powder", { - description = "Blaze Powder", - _doc_items_longdesc = "This item is mainly used for crafting.", + description = S("Blaze Powder"), + _doc_items_longdesc = S("This item is mainly used for crafting."), wield_image = "mcl_mobitems_blaze_powder.png", inventory_image = "mcl_mobitems_blaze_powder.png", groups = { craftitem = 1, brewitem = 1 }, @@ -203,8 +205,8 @@ minetest.register_craftitem("mcl_mobitems:blaze_powder", { }) minetest.register_craftitem("mcl_mobitems:magma_cream", { - description = "Magma Cream", - _doc_items_longdesc = "Magma cream is a crafting component.", + description = S("Magma Cream"), + _doc_items_longdesc = S("Magma cream is a crafting component."), wield_image = "mcl_mobitems_magma_cream.png", inventory_image = "mcl_mobitems_magma_cream.png", groups = { craftitem = 1, brewitem = 1 }, @@ -212,8 +214,8 @@ minetest.register_craftitem("mcl_mobitems:magma_cream", { }) minetest.register_craftitem("mcl_mobitems:ghast_tear", { - description = "Ghast Tear", - _doc_items_longdesc = "Place this item in an item frame as decoration.", + description = S("Ghast Tear"), + _doc_items_longdesc = S("Place this item in an item frame as decoration."), wield_image = "mcl_mobitems_ghast_tear.png", inventory_image = "mcl_mobitems_ghast_tear.png", -- TODO: Reveal item when it's useful @@ -222,8 +224,8 @@ minetest.register_craftitem("mcl_mobitems:ghast_tear", { }) minetest.register_craftitem("mcl_mobitems:nether_star", { - description = "Nether Star", - _doc_items_longdesc = "A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.", + description = S("Nether Star"), + _doc_items_longdesc = S("A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration."), wield_image = "mcl_mobitems_nether_star.png", inventory_image = "mcl_mobitems_nether_star.png", -- TODO: Reveal item when it's useful @@ -232,8 +234,8 @@ minetest.register_craftitem("mcl_mobitems:nether_star", { }) minetest.register_craftitem("mcl_mobitems:leather", { - description = "Leather", - _doc_items_longdesc = "Leather is a versatile crafting component.", + description = S("Leather"), + _doc_items_longdesc = S("Leather is a versatile crafting component."), wield_image = "mcl_mobitems_leather.png", inventory_image = "mcl_mobitems_leather.png", groups = { craftitem = 1 }, @@ -241,8 +243,8 @@ minetest.register_craftitem("mcl_mobitems:leather", { }) minetest.register_craftitem("mcl_mobitems:feather", { - description = "Feather", - _doc_items_longdesc = "Feathers are used in crafting and are dropped from chickens.", + description = S("Feather"), + _doc_items_longdesc = S("Feathers are used in crafting and are dropped from chickens."), wield_image = "mcl_mobitems_feather.png", inventory_image = "mcl_mobitems_feather.png", groups = { craftitem = 1 }, @@ -250,8 +252,8 @@ minetest.register_craftitem("mcl_mobitems:feather", { }) minetest.register_craftitem("mcl_mobitems:rabbit_hide", { - description = "Rabbit Hide", - _doc_items_longdesc = "Rabbit hide is used to create leather.", + description = S("Rabbit Hide"), + _doc_items_longdesc = S("Rabbit hide is used to create leather."), wield_image = "mcl_mobitems_rabbit_hide.png", inventory_image = "mcl_mobitems_rabbit_hide.png", groups = { craftitem = 1 }, @@ -259,8 +261,8 @@ minetest.register_craftitem("mcl_mobitems:rabbit_hide", { }) minetest.register_craftitem("mcl_mobitems:rabbit_foot", { - description = "Rabbit's Foot", - _doc_items_longdesc = "Must be your lucky day! Place this item in an item frame for decoration.", + description = S("Rabbit's Foot"), + _doc_items_longdesc = S("Must be your lucky day! Place this item in an item frame for decoration."), wield_image = "mcl_mobitems_rabbit_foot.png", inventory_image = "mcl_mobitems_rabbit_foot.png", -- TODO: Reveal item when it's useful @@ -269,8 +271,8 @@ minetest.register_craftitem("mcl_mobitems:rabbit_foot", { }) minetest.register_craftitem("mcl_mobitems:saddle", { - description = "Saddle", - _doc_items_longdesc = "Saddles can be put on some animals in order to mount them.", + description = S("Saddle"), + _doc_items_longdesc = S("Saddles can be put on some animals in order to mount them."), _doc_items_usagehelp = "Rightclick an animal (with the saddle in your hand) to try put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by rightclicking them again.", wield_image = "mcl_mobitems_saddle.png", inventory_image = "mcl_mobitems_saddle.png", @@ -279,8 +281,8 @@ minetest.register_craftitem("mcl_mobitems:saddle", { }) minetest.register_craftitem("mcl_mobitems:rabbit_stew", { - description = "Rabbit Stew", - _doc_items_longdesc = "Rabbit stew is a very nutricious food item.", + description = S("Rabbit Stew"), + _doc_items_longdesc = S("Rabbit stew is a very nutricious food item."), wield_image = "mcl_mobitems_rabbit_stew.png", inventory_image = "mcl_mobitems_rabbit_stew.png", stack_max = 1, @@ -291,21 +293,21 @@ minetest.register_craftitem("mcl_mobitems:rabbit_stew", { }) minetest.register_craftitem("mcl_mobitems:shulker_shell", { - description = "Shulker Shell", - _doc_items_longdesc = "Shulker shells are used in crafting. They are dropped from dead shulkers.", + description = S("Shulker Shell"), + _doc_items_longdesc = S("Shulker shells are used in crafting. They are dropped from dead shulkers."), inventory_image = "mcl_mobitems_shulker_shell.png", groups = { craftitem = 1 }, }) minetest.register_craftitem("mcl_mobitems:slimeball", { - description = "Slimeball", - _doc_items_longdesc = "Slimeballs are used in crafting. They are dropped from slimes.", + description = S("Slimeball"), + _doc_items_longdesc = S("Slimeballs are used in crafting. They are dropped from slimes."), inventory_image = "mcl_mobitems_slimeball.png", groups = { craftitem = 1 }, }) minetest.register_craftitem("mcl_mobitems:gunpowder", { - description = "Gunpowder", + description = S("Gunpowder"), _doc_items_longdesc = doc.sub.items.temp.craftitem, inventory_image = "default_gunpowder.png", stack_max = 64, @@ -313,8 +315,8 @@ minetest.register_craftitem("mcl_mobitems:gunpowder", { }) minetest.register_tool("mcl_mobitems:carrot_on_a_stick", { - description = "Carrot on a Stick", - _doc_items_longdesc = "A carrot on a stick can be used on saddled pigs to ride them.", + description = S("Carrot on a Stick"), + _doc_items_longdesc = S("A carrot on a stick can be used on saddled pigs to ride them."), _doc_items_usagehelp = "Rightclick a saddled pig with the carrot on a stick to mount it. You can now ride it like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.", wield_image = "mcl_mobitems_carrot_on_a_stick.png", inventory_image = "mcl_mobitems_carrot_on_a_stick.png", diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index 61b72af37..e9c2fc32a 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -1,4 +1,4 @@ -local S = mobs.intllib +local S = minetest.get_translator("mcl_mobspawners") mcl_mobspawners = {} diff --git a/mods/ITEMS/mcl_monster_eggs/depends.txt b/mods/ITEMS/mcl_monster_eggs/depends.txt index fde951c96..d867036e5 100644 --- a/mods/ITEMS/mcl_monster_eggs/depends.txt +++ b/mods/ITEMS/mcl_monster_eggs/depends.txt @@ -1,3 +1,2 @@ mcl_sounds mobs_mc -intllib? diff --git a/mods/ITEMS/mcl_monster_eggs/init.lua b/mods/ITEMS/mcl_monster_eggs/init.lua index cdacc7fda..e693db00c 100644 --- a/mods/ITEMS/mcl_monster_eggs/init.lua +++ b/mods/ITEMS/mcl_monster_eggs/init.lua @@ -1,9 +1,7 @@ -- Monster eggs! -- Blocks which spawn silverfish when destroyed. --- Intllib -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP .. "/intllib.lua") +local S = minetest.get_translator("mcl_mobspawners") local spawn_silverfish = function(pos, oldnode, oldmetadata, digger) if not minetest.settings:get_bool("creative_mode") then diff --git a/mods/ITEMS/mcl_monster_eggs/intllib.lua b/mods/ITEMS/mcl_monster_eggs/intllib.lua deleted file mode 100644 index 6669d7202..000000000 --- a/mods/ITEMS/mcl_monster_eggs/intllib.lua +++ /dev/null @@ -1,45 +0,0 @@ - --- Fallback functions for when `intllib` is not installed. --- Code released under Unlicense . - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/mods/ITEMS/mcl_mushrooms/huge.lua b/mods/ITEMS/mcl_mushrooms/huge.lua index a334a6387..8355ffcc9 100644 --- a/mods/ITEMS/mcl_mushrooms/huge.lua +++ b/mods/ITEMS/mcl_mushrooms/huge.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_mushrooms") + local template = { groups = {handy=1,axey=1, building_block = 1, material_wood = 1 }, sounds = mcl_sounds.node_sound_wood_defaults(), @@ -42,7 +44,7 @@ local register_mushroom = function(color, species_id, template, d_cap, d_stem, d -- Stem texture on all sides local stem_full = table.copy(template) stem_full.description = d_stem_all - stem_full._doc_items_longdesc = "This decorative block is like a huge mushroom stem, but with the stem texture on all sides." + stem_full._doc_items_longdesc = S("This decorative block is like a huge mushroom stem, but with the stem texture on all sides.") stem_full.tiles = { "mcl_mushrooms_mushroom_block_skin_stem.png" } stem_full.groups.huge_mushroom = species_id stem_full.groups.huge_mushroom_stem = 2 @@ -155,14 +157,14 @@ local register_mushroom = function(color, species_id, template, d_cap, d_stem, d end -local longdesc_red = "Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides." -local longdesc_red_stem = "The stem part of a huge red mushroom." -register_mushroom("red", 1, red, "Huge Red Mushroom Block", "Huge Red Mushroom Stem", "Huge Red Mushroom All-Faces Stem", longdesc_red, longdesc_red_stem) +local longdesc_red = S("Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides.") +local longdesc_red_stem = S("The stem part of a huge red mushroom.") +register_mushroom("red", 1, red, S("Huge Red Mushroom Block"), S("Huge Red Mushroom Stem"), S("Huge Red Mushroom All-Faces Stem"), longdesc_red, longdesc_red_stem) -local longdesc_brown = "Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides." -local longdesc_brown_stem = "The stem part of a huge brown mushroom." -register_mushroom("brown", 2, brown, "Huge Brown Mushroom Block", "Huge Brown Mushroom Stem", "Huge Brown Mushroom All-Faces Stem", longdesc_brown, longdesc_brown_stem) +local longdesc_brown = S("Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides.") +local longdesc_brown_stem = S("The stem part of a huge brown mushroom.") +register_mushroom("brown", 2, brown, S("Huge Brown Mushroom Block"), S("Huge Brown Mushroom Stem"), S("Huge Brown Mushroom All-Faces Stem"), longdesc_brown, longdesc_brown_stem) minetest.register_craft({ type = "fuel", diff --git a/mods/ITEMS/mcl_mushrooms/small.lua b/mods/ITEMS/mcl_mushrooms/small.lua index b12e925bf..7b4466040 100644 --- a/mods/ITEMS/mcl_mushrooms/small.lua +++ b/mods/ITEMS/mcl_mushrooms/small.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_mushrooms") + local on_place = mcl_util.generate_on_place_plant_function(function(place_pos, place_node) local soil_node = minetest.get_node_or_nil({x=place_pos.x, y=place_pos.y-1, z=place_pos.z}) if not soil_node then return false end @@ -15,16 +17,16 @@ local on_place = mcl_util.generate_on_place_plant_function(function(place_pos, p return ((snn == "mcl_core:podzol" or snn == "mcl_core:podzol_snow" or snn == "mcl_core:mycelium" or snn == "mcl_core:mycelium_snow") or (light_ok and minetest.get_item_group(snn, "solid") == 1 and minetest.get_item_group(snn, "opaque") == 1)) end) -local longdesc_intro_brown = [[Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.]] -local longdesc_intro_red = [[Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.]] +local longdesc_intro_brown = S("Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.") +local longdesc_intro_red = S("Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.") -local longdesc_append = [[A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom. -Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.]] +local longdesc_append = S("A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom.").."\n".. +S("Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.") -local usagehelp = "This mushroom can be placed on mycelium and podzol at any light level. They can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12." +local usagehelp = S("This mushroom can be placed on mycelium and podzol at any light level. They can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.") minetest.register_node("mcl_mushrooms:mushroom_brown", { - description = "Brown Mushroom", + description = S("Brown Mushroom"), _doc_items_longdesc = longdesc_intro_brown .. "\n\n" .. longdesc_append, _doc_items_usagehelp = usagehelp, drawtype = "plantlike", @@ -47,7 +49,7 @@ minetest.register_node("mcl_mushrooms:mushroom_brown", { }) minetest.register_node("mcl_mushrooms:mushroom_red", { - description = "Red Mushroom", + description = S("Red Mushroom"), _doc_items_longdesc = longdesc_intro_red .. "\n\n" .. longdesc_append, _doc_items_usagehelp = usagehelp, drawtype = "plantlike", @@ -69,8 +71,8 @@ minetest.register_node("mcl_mushrooms:mushroom_red", { }) minetest.register_craftitem("mcl_mushrooms:mushroom_stew", { - description = "Mushroom Stew", - _doc_items_longdesc = "Mushroom stew is a healthy soup which can be consumed to restore some hunger points.", + description = S("Mushroom Stew"), + _doc_items_longdesc = S("Mushroom stew is a healthy soup which can be consumed to restore some hunger points."), inventory_image = "farming_mushroom_stew.png", on_place = minetest.item_eat(6, "mcl_core:bowl"), on_secondary_use = minetest.item_eat(6, "mcl_core:bowl"), diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index 4fc36a8b4..ee158945f 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -1,6 +1,8 @@ +local S = minetest.get_translator("mcl_nether") + minetest.register_node("mcl_nether:glowstone", { - description = "Glowstone", - _doc_items_longdesc = "Glowstone is a naturally-glowing block which is home to the Nether.", + description = S("Glowstone"), + _doc_items_longdesc = S("Glowstone is a naturally-glowing block which is home to the Nether."), tiles = {"mcl_nether_glowstone.png"}, is_ground_content = true, stack_max = 64, @@ -22,8 +24,8 @@ minetest.register_node("mcl_nether:glowstone", { }) minetest.register_node("mcl_nether:quartz_ore", { - description = "Nether Quartz Ore", - _doc_items_longdesc = "Nether quartz ore is an ore containing nether quartz. It is commonly found around netherrack in the Nether.", + description = S("Nether Quartz Ore"), + _doc_items_longdesc = S("Nether quartz ore is an ore containing nether quartz. It is commonly found around netherrack in the Nether."), stack_max = 64, tiles = {"mcl_nether_quartz_ore.png"}, is_ground_content = true, @@ -60,8 +62,8 @@ local eternal_on_ignite = function(player, pointed_thing) end minetest.register_node("mcl_nether:netherrack", { - description = "Netherrack", - _doc_items_longdesc = "Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire.", + description = S("Netherrack"), + _doc_items_longdesc = S("Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire."), stack_max = 64, tiles = {"mcl_nether_netherrack.png"}, is_ground_content = true, @@ -76,8 +78,8 @@ minetest.register_node("mcl_nether:netherrack", { }) minetest.register_node("mcl_nether:magma", { - description = "Magma Block", - _doc_items_longdesc = "Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire.", + description = S("Magma Block"), + _doc_items_longdesc = S("Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire."), stack_max = 64, tiles = {{name="mcl_nether_magma.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=1.5}}}, is_ground_content = true, @@ -102,8 +104,8 @@ minetest.register_node("mcl_nether:magma", { }) minetest.register_node("mcl_nether:soul_sand", { - description = "Soul Sand", - _doc_items_longdesc = "Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block.", + description = S("Soul Sand"), + _doc_items_longdesc = S("Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block."), stack_max = 64, tiles = {"mcl_nether_soul_sand.png"}, is_ground_content = true, @@ -120,7 +122,7 @@ minetest.register_node("mcl_nether:soul_sand", { minetest.register_node("mcl_nether:nether_brick", { -- Original name: Nether Brick - description = "Nether Brick Block", + description = S("Nether Brick Block"), _doc_items_longdesc = doc.sub.items.temp.build, stack_max = 64, tiles = {"mcl_nether_nether_brick.png"}, @@ -133,7 +135,7 @@ minetest.register_node("mcl_nether:nether_brick", { minetest.register_node("mcl_nether:red_nether_brick", { -- Original name: Red Nether Brick - description = "Red Nether Brick Block", + description = S("Red Nether Brick Block"), _doc_items_longdesc = doc.sub.items.temp.build, stack_max = 64, tiles = {"mcl_nether_red_nether_brick.png"}, @@ -146,8 +148,8 @@ minetest.register_node("mcl_nether:red_nether_brick", { minetest.register_node("mcl_nether:nether_wart_block", { - description = "Nether Wart Block", - _doc_items_longdesc = "A nether wart block is a purely decorational block made from nether wart.", + description = S("Nether Wart Block"), + _doc_items_longdesc = S("A nether wart block is a purely decorational block made from nether wart."), stack_max = 64, tiles = {"mcl_nether_nether_wart_block.png"}, is_ground_content = false, @@ -163,7 +165,7 @@ minetest.register_node("mcl_nether:nether_wart_block", { }) minetest.register_node("mcl_nether:quartz_block", { - description = "Block of Quartz", + description = S("Block of Quartz"), _doc_items_longdesc = doc.sub.items.temp.build, stack_max = 64, is_ground_content = false, @@ -175,7 +177,7 @@ minetest.register_node("mcl_nether:quartz_block", { }) minetest.register_node("mcl_nether:quartz_chiseled", { - description = "Chiseled Quartz Block", + description = S("Chiseled Quartz Block"), _doc_items_longdesc = doc.sub.items.temp.build, stack_max = 64, is_ground_content = false, @@ -187,7 +189,7 @@ minetest.register_node("mcl_nether:quartz_chiseled", { }) minetest.register_node("mcl_nether:quartz_pillar", { - description = "Pillar Quartz Block", + description = S("Pillar Quartz Block"), _doc_items_longdesc = doc.sub.items.temp.build, stack_max = 64, paramtype2 = "facedir", @@ -200,7 +202,7 @@ minetest.register_node("mcl_nether:quartz_pillar", { _mcl_hardness = 0.8, }) minetest.register_node("mcl_nether:quartz_smooth", { - description = "Smooth Quartz", + description = S("Smooth Quartz"), _doc_items_longdesc = doc.sub.items.temp.build, stack_max = 64, is_ground_content = false, @@ -212,24 +214,24 @@ minetest.register_node("mcl_nether:quartz_smooth", { }) minetest.register_craftitem("mcl_nether:glowstone_dust", { - description = "Glowstone Dust", - _doc_items_longdesc = "Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting.", + description = S("Glowstone Dust"), + _doc_items_longdesc = S("Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting."), inventory_image = "mcl_nether_glowstone_dust.png", stack_max = 64, groups = { craftitem=1 }, }) minetest.register_craftitem("mcl_nether:quartz", { - description = "Nether Quartz", - _doc_items_longdesc = "Nether quartz is a versatile crafting ingredient.", + description = S("Nether Quartz"), + _doc_items_longdesc = S("Nether quartz is a versatile crafting ingredient."), inventory_image = "mcl_nether_quartz.png", stack_max = 64, groups = { craftitem = 1 }, }) minetest.register_craftitem("mcl_nether:netherbrick", { - description = "Nether Brick", - _doc_items_longdesc = "Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences.", + description = S("Nether Brick"), + _doc_items_longdesc = S("Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences."), inventory_image = "mcl_nether_netherbrick.png", stack_max = 64, groups = { craftitem = 1 }, diff --git a/mods/ITEMS/mcl_nether/lava.lua b/mods/ITEMS/mcl_nether/lava.lua index 35959d451..ba76b749e 100644 --- a/mods/ITEMS/mcl_nether/lava.lua +++ b/mods/ITEMS/mcl_nether/lava.lua @@ -1,11 +1,12 @@ -- Lava in the Nether +local S = minetest.get_translator("mcl_nether") -- TODO: Increase flow speed. This could be done by reducing viscosity, -- but this would also allow players to swim faster in lava. local lava_src_def = table.copy(minetest.registered_nodes["mcl_core:lava_source"]) -lava_src_def.description = "Nether Lava Source" +lava_src_def.description = S("Nether Lava Source") lava_src_def._doc_items_create_entry = false lava_src_def._doc_items_entry_name = nil lava_src_def._doc_items_longdesc = nil @@ -16,7 +17,7 @@ lava_src_def.liquid_alternative_flowing = "mcl_nether:nether_lava_flowing" minetest.register_node("mcl_nether:nether_lava_source", lava_src_def) local lava_flow_def = table.copy(minetest.registered_nodes["mcl_core:lava_flowing"]) -lava_flow_def.description = "Flowing Nether Lava" +lava_flow_def.description = S("Flowing Nether Lava") lava_flow_def._doc_items_create_entry = false lava_flow_def.liquid_range = 7 lava_flow_def.liquid_alternative_flowing = "mcl_nether:nether_lava_flowing" diff --git a/mods/ITEMS/mcl_ocean/init.lua b/mods/ITEMS/mcl_ocean/init.lua index 82b8126a4..b84bbeac6 100644 --- a/mods/ITEMS/mcl_ocean/init.lua +++ b/mods/ITEMS/mcl_ocean/init.lua @@ -1,8 +1,10 @@ -- Nodes +local S = minetest.get_translator("mcl_ocean") + minetest.register_node("mcl_ocean:sea_lantern", { - description = "Sea Lantern", - _doc_items_longdesc = "Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.", + description = S("Sea Lantern"), + _doc_items_longdesc = S("Sea lanterns are decorative light sources which look great underwater but can be placed anywhere."), paramtype2 = "facedir", is_ground_content = false, stack_max = 64, @@ -23,8 +25,8 @@ minetest.register_node("mcl_ocean:sea_lantern", { }) minetest.register_node("mcl_ocean:prismarine", { - description = "Prismarine", - _doc_items_longdesc = "Prismarine is used as a building block. It slowly changes its color.", + description = S("Prismarine"), + _doc_items_longdesc = S("Prismarine is used as a building block. It slowly changes its color."), stack_max = 64, is_ground_content = false, -- Texture should have 22 frames for smooth transitions. @@ -36,7 +38,7 @@ minetest.register_node("mcl_ocean:prismarine", { }) minetest.register_node("mcl_ocean:prismarine_brick", { - description = "Prismarine Bricks", + description = S("Prismarine Bricks"), _doc_items_longdesc = doc.sub.items.temp.build, stack_max = 64, is_ground_content = false, @@ -48,7 +50,7 @@ minetest.register_node("mcl_ocean:prismarine_brick", { }) minetest.register_node("mcl_ocean:prismarine_dark", { - description = "Dark Prismarine", + description = S("Dark Prismarine"), _doc_items_longdesc = doc.sub.items.temp.build, stack_max = 64, is_ground_content = false, @@ -62,7 +64,7 @@ minetest.register_node("mcl_ocean:prismarine_dark", { -- Craftitems minetest.register_craftitem("mcl_ocean:prismarine_crystals", { - description = "Prismarine Crystals", + description = S("Prismarine Crystals"), _doc_items_longdesc = doc.sub.items.temp.craftitem, inventory_image = "mcl_ocean_prismarine_crystals.png", stack_max = 64, @@ -70,7 +72,7 @@ minetest.register_craftitem("mcl_ocean:prismarine_crystals", { }) minetest.register_craftitem("mcl_ocean:prismarine_shard", { - description = "Prismarine Shard", + description = S("Prismarine Shard"), _doc_items_longdesc = doc.sub.items.temp.craftitem, inventory_image = "mcl_ocean_prismarine_shard.png", stack_max = 64, diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index bca803dc1..8ba08b040 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_portals") + -- Parameters local SPAWN_MIN = mcl_vars.mg_end_min+70 local SPAWN_MAX = mcl_vars.mg_end_min+98 @@ -6,9 +8,9 @@ local mg_name = minetest.get_mapgen_setting("mg_name") -- End portal minetest.register_node("mcl_portals:portal_end", { - description = "End Portal", - _doc_items_longdesc = "An End portal teleports creatures and objects to the mysterious End dimension (and back!).", - _doc_items_usagehelp = "Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.", + description = S("End Portal"), + _doc_items_longdesc = S("An End portal teleports creatures and objects to the mysterious End dimension (and back!)."), + _doc_items_usagehelp = S("Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld."), tiles = { { name = "mcl_portals_end_portal.png", @@ -295,9 +297,9 @@ if minetest.get_modpath("screwdriver") then end minetest.register_node("mcl_portals:end_portal_frame", { - description = "End Portal Frame", - _doc_items_longdesc = "End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender." .. "\n" .. "NOTE: The End dimension is currently incomplete and boring.", - _doc_items_usagehelp = "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." .. "\n" .. "Place an eye of ender into each block. The end portal appears in the middle after placing the final eye." .. "\n" .. "Once placed, an eye of ender can not be taken back.", + description = S("End Portal Frame"), + _doc_items_longdesc = S("End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender." .. "\n" .. "NOTE: The End dimension is currently incomplete and boring."), + _doc_items_usagehelp = S("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.") .. "\n" .. S("Place an eye of ender into each block. The end portal appears in the middle after placing the final eye." .. "\n" .. "Once placed, an eye of ender can not be taken back."), groups = { creative_breakable = 1, deco_block = 1 }, tiles = { "mcl_portals_endframe_top.png", "mcl_portals_endframe_bottom.png", "mcl_portals_endframe_side.png" }, paramtype2 = "facedir", @@ -319,7 +321,7 @@ minetest.register_node("mcl_portals:end_portal_frame", { }) minetest.register_node("mcl_portals:end_portal_frame_eye", { - description = "End Portal Frame with Eye of Ender", + description = S("End Portal Frame with Eye of Ender"), _doc_items_create_entry = false, groups = { creative_breakable = 1, deco_block = 1, comparator_signal = 15 }, tiles = { "mcl_portals_endframe_top.png^[lowpart:75:mcl_portals_endframe_eye.png", "mcl_portals_endframe_bottom.png", "mcl_portals_endframe_eye.png^mcl_portals_endframe_side.png" }, diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index c2b358ea8..7d39c3954 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_portals") + -- Parameters local TCAVE = 0.6 @@ -77,9 +79,9 @@ local destroy_portal = function(pos) end minetest.register_node("mcl_portals:portal", { - description = "Nether Portal", - _doc_items_longdesc = "A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!", - _doc_items_usagehelp = "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.", + description = S("Nether Portal"), + _doc_items_longdesc = S("A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!"), + _doc_items_usagehelp = S("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."), tiles = { "blank.png", @@ -481,8 +483,8 @@ minetest.register_abm({ --[[ ITEM OVERRIDES ]] local longdesc = minetest.registered_nodes["mcl_core:obsidian"]._doc_items_longdesc -longdesc = longdesc .. "\n" .. "Obsidian is also used as the frame of Nether portals." -local usagehelp = "To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether." +longdesc = longdesc .. "\n" .. S("Obsidian is also used as the frame of Nether portals.") +local usagehelp = S("To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.") minetest.override_item("mcl_core:obsidian", { _doc_items_longdesc = longdesc, diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua index ea859127b..6c51840e8 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -1,7 +1,9 @@ -local brewhelp = "Put this item in an item frame for decoration. It's useless otherwise." +local S = minetest.get_translator("mcl_potions") + +local brewhelp = S("Put this item in an item frame for decoration. It's useless otherwise.") minetest.register_craftitem("mcl_potions:fermented_spider_eye", { - description = "Fermented Spider Eye", + description = S("Fermented Spider Eye"), _doc_items_longdesc = brewhelp, wield_image = "mcl_potions_spider_eye_fermented.png", inventory_image = "mcl_potions_spider_eye_fermented.png", @@ -17,9 +19,9 @@ minetest.register_craft({ }) minetest.register_craftitem("mcl_potions:glass_bottle", { - description = "Glass Bottle", - _doc_items_longdesc = "A glass bottle is used as a container for liquids and can be used to collect water directly.", - _doc_items_usagehelp = "To collect water, it on a cauldron with water (which removes a level of water) or any water source (which removes no water).", + description = S("Glass Bottle"), + _doc_items_longdesc = S("A glass bottle is used as a container for liquids and can be used to collect water directly."), + _doc_items_usagehelp = S("To collect water, it on a cauldron with water (which removes a level of water) or any water source (which removes no water)."), inventory_image = "mcl_potions_potion_bottle_empty.png", wield_image = "mcl_potions_potion_bottle_empty.png", groups = {brewitem=1}, @@ -156,9 +158,9 @@ end -- Itemstring of potions is “mcl_potions:potion_” minetest.register_craftitem("mcl_potions:potion_water", { - description = "Water Bottle", - _doc_items_longdesc = "Water bottles can be used to fill cauldrons. Drinking water has no effect.", - _doc_items_usagehelp = "Rightclick to drink. Rightclick a cauldron to pour the water into the cauldron.", + description = S("Water Bottle"), + _doc_items_longdesc = S("Water bottles can be used to fill cauldrons. Drinking water has no effect."), + _doc_items_usagehelp = S("Rightclick to drink. Rightclick a cauldron to pour the water into the cauldron."), stack_max = 1, inventory_image = potion_image("#0000FF"), wield_image = potion_image("#0000FF"), @@ -200,8 +202,8 @@ minetest.register_craftitem("mcl_potions:potion_water", { }) minetest.register_craftitem("mcl_potions:potion_river_water", { - description = "River Water Bottle", - _doc_items_longdesc = "River water bottles can be used to fill cauldrons. Drinking it has no effect.", + description = S("River Water Bottle"), + _doc_items_longdesc = S("River water bottles can be used to fill cauldrons. Drinking it has no effect."), _doc_items_usagehelp = "Rightclick to drink. Rightclick a cauldron to pour the river water into the cauldron.", stack_max = 1, inventory_image = potion_image("#0044FF"), @@ -248,8 +250,8 @@ minetest.register_craftitem("mcl_potions:potion_river_water", { local how_to_drink = "To drink it, wield it, then rightclick." minetest.register_craftitem("mcl_potions:potion_awkward", { - description = "Awkward Potion", - _doc_items_longdesc = "This potion has an awkward taste and is used for brewing more potions. Drinking it has no effect.", + description = S("Awkward Potion"), + _doc_items_longdesc = S("This potion has an awkward taste and is used for brewing more potions. Drinking it has no effect."), _doc_items_usagehelp = how_to_drink, stack_max = 1, inventory_image = potion_image("#0000FF"), @@ -260,8 +262,8 @@ minetest.register_craftitem("mcl_potions:potion_awkward", { on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), }) minetest.register_craftitem("mcl_potions:potion_mundane", { - description = "Mundane Potion", - _doc_items_longdesc = "This potion has a clean taste and is used for brewing more potions. Drinking it has no effect.", + description = S("Mundane Potion"), + _doc_items_longdesc = S("This potion has a clean taste and is used for brewing more potions. Drinking it has no effect."), _doc_items_usagehelp = how_to_drink, stack_max = 1, inventory_image = potion_image("#0000FF"), @@ -272,8 +274,8 @@ minetest.register_craftitem("mcl_potions:potion_mundane", { on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), }) minetest.register_craftitem("mcl_potions:potion_thick", { - description = "Thick Potion", - _doc_items_longdesc = "This potion has a bitter taste and is used for brewing more potions. Drinking it has no effect.", + description = S("Thick Potion"), + _doc_items_longdesc = S("This potion has a bitter taste and is used for brewing more potions. Drinking it has no effect."), _doc_items_usagehelp = how_to_drink, stack_max = 1, inventory_image = potion_image("#0000FF"), @@ -285,8 +287,8 @@ minetest.register_craftitem("mcl_potions:potion_thick", { }) minetest.register_craftitem("mcl_potions:speckled_melon", { - description = "Glistering Melon", - _doc_items_longdesc = "This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.", + description = S("Glistering Melon"), + _doc_items_longdesc = S("This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else."), stack_max = 64, -- TODO: Reveal item when it's actually useful groups = { brewitem = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1 }, @@ -303,7 +305,7 @@ minetest.register_craft({ }) minetest.register_craftitem("mcl_potions:dragon_breath", { - description = "Dragon's Breath", + description = S("Dragon's Breath"), _doc_items_longdesc = brewhelp, wield_image = "mcl_potions_dragon_breath.png", inventory_image = "mcl_potions_dragon_breath.png", diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index 67fdf43e1..866de83b2 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_signs") + -- Font: 04.jp.org -- load characters map @@ -249,9 +251,9 @@ if minetest.get_modpath("mcl_sounds") then end minetest.register_node("mcl_signs:wall_sign", { - description = "Sign", - _doc_items_longdesc = "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.", - _doc_items_usagehelp = "Place the sign at the side to build a wall sign, place it on top of another block to build a sign with a sign post.\nAfter 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. The text can not be changed once it has been written; you have to break and place the sign again.", + description = S("Sign"), + _doc_items_longdesc = S("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."), + _doc_items_usagehelp = S("Place the sign at the side to build a wall sign, place it on top of another block to build a sign with a sign post.\nAfter 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. The text can not be changed once it has been written; you have to break and place the sign again."), inventory_image = "default_sign.png", walkable = false, is_ground_content = false, diff --git a/mods/ITEMS/mcl_sponges/init.lua b/mods/ITEMS/mcl_sponges/init.lua index 531e74c99..23ab71166 100644 --- a/mods/ITEMS/mcl_sponges/init.lua +++ b/mods/ITEMS/mcl_sponges/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_sponges") + local absorb = function(pos) local change = false -- Count number of absorbed river water vs other nodes @@ -34,8 +36,8 @@ local absorb = function(pos) end minetest.register_node("mcl_sponges:sponge", { - description = "Sponge", - _doc_items_longdesc = "Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.", + description = S("Sponge"), + _doc_items_longdesc = S("Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge."), drawtype = "normal", is_ground_content = false, tiles = {"mcl_sponges_sponge.png"}, @@ -92,8 +94,8 @@ minetest.register_node("mcl_sponges:sponge", { }) minetest.register_node("mcl_sponges:sponge_wet", { - description = "Waterlogged Sponge", - _doc_items_longdesc = "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.", + description = S("Waterlogged Sponge"), + _doc_items_longdesc = S("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."), drawtype = "normal", is_ground_content = false, tiles = {"mcl_sponges_sponge_wet.png"}, @@ -110,8 +112,8 @@ minetest.register_node("mcl_sponges:sponge_wet", { if minetest.get_modpath("mclx_core") then minetest.register_node("mcl_sponges:sponge_wet_river_water", { - description = "Riverwaterlogged Sponge", - _doc_items_longdesc = "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." .. "\n" .. "A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.", + description = S("Riverwaterlogged Sponge"), + _doc_items_longdesc = S("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.") .. "\n" .. S("A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water."), drawtype = "normal", is_ground_content = false, tiles = {"mcl_sponges_sponge_wet_river_water.png"}, From f9b557c2ba4104b04d5954bf04379674bd0114f8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 00:46:35 +0100 Subject: [PATCH 068/379] New translation system, part 9: Items, part 5 --- mods/ITEMS/mcl_stairs/api.lua | 12 ++-- mods/ITEMS/mcl_stairs/register.lua | 106 +++++++++++++++-------------- mods/ITEMS/mcl_throwing/init.lua | 16 +++-- mods/ITEMS/mcl_tnt/init.lua | 8 ++- mods/ITEMS/mcl_tools/init.lua | 58 ++++++++-------- mods/ITEMS/mcl_torches/init.lua | 9 +-- mods/ITEMS/mcl_walls/init.lua | 4 +- mods/ITEMS/mcl_walls/register.lua | 30 ++++---- mods/ITEMS/mcl_wool/init.lua | 40 +++++------ mods/ITEMS/mclx_core/init.lua | 10 +-- mods/ITEMS/mclx_fences/init.lua | 6 +- mods/ITEMS/mclx_stairs/init.lua | 33 +++++---- mods/ITEMS/xpanes/init.lua | 41 +++++------ 13 files changed, 199 insertions(+), 174 deletions(-) diff --git a/mods/ITEMS/mcl_stairs/api.lua b/mods/ITEMS/mcl_stairs/api.lua index d90bc8452..059121263 100644 --- a/mods/ITEMS/mcl_stairs/api.lua +++ b/mods/ITEMS/mcl_stairs/api.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_stairs") + -- Core mcl_stairs API -- Wrapper around mintest.pointed_thing_to_face_pos. @@ -100,7 +102,7 @@ function mcl_stairs.register_stair(subname, recipeitem, groups, images, descript minetest.register_node(":mcl_stairs:stair_" .. subname, { description = description, - _doc_items_longdesc = "Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the bottom or at the upper half of the side of a block will be placed upside down.", + _doc_items_longdesc = S("Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the bottom or at the upper half of the side of a block will be placed upside down."), drawtype = "mesh", mesh = "stairs_stair.obj", tiles = images, @@ -188,13 +190,13 @@ function mcl_stairs.register_slab(subname, recipeitem, groups, images, descripti -- Automatically generate double slab description if not double_description then - double_description = string.format("Double %s", description) + double_description = S("Double @1", description) minetest.log("warning", "[stairs] No explicit description for double slab '"..double_slab.."' added. Using auto-generated description.") end groups.slab = 1 groups.building_block = 1 - local longdesc = "Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created." + local longdesc = S("Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.") local slabdef = { description = description, @@ -258,7 +260,7 @@ function mcl_stairs.register_slab(subname, recipeitem, groups, images, descripti topdef.groups.slab_top = 1 topdef.groups.not_in_creative_inventory = 1 topdef.groups.not_in_craft_guide = 1 - topdef.description = string.format("Upper %s", description) + topdef.description = S("Upper @1", description) topdef._doc_items_create_entry = false topdef._doc_items_longdesc = nil topdef._doc_items_usagehelp = nil @@ -283,7 +285,7 @@ function mcl_stairs.register_slab(subname, recipeitem, groups, images, descripti dgroups.double_slab = 1 minetest.register_node(":"..double_slab, { description = double_description, - _doc_items_longdesc = "Double slabs are full blocks which are created by placing two slabs of the same kind on each other.", + _doc_items_longdesc = S("Double slabs are full blocks which are created by placing two slabs of the same kind on each other."), tiles = images, is_ground_content = false, groups = dgroups, diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index 700852fdd..6eadf629e 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -3,13 +3,15 @@ -- slabs actually take slightly longer to be dug than their stair counterparts. -- Note sure if it is a good idea to preserve this oddity. +local S = minetest.get_translator("mcl_stairs") + local woods = { - { "wood", "default_wood.png", "Oak Wood Stairs", "Oak Wood Slab", "Double Oak Wood Slab" }, - { "junglewood", "default_junglewood.png", "Jungle Wood Stairs", "Jungle Wood Slab", "Double Jungle Wood Slab" }, - { "acaciawood", "default_acacia_wood.png", "Acacia Wood Stairs", "Acacia Wood Slab", "Double Acacia Wood Slab" }, - { "sprucewood", "mcl_core_planks_spruce.png", "Spruce Wood Stairs", "Spruce Wood Slab", "Double Spruce Wood Slab" }, - { "birchwood", "mcl_core_planks_birch.png", "Birch Wood Stairs", "Birch Wood Slab", "Double Birch Wood Slab" }, - { "darkwood", "mcl_core_planks_big_oak.png", "Dark Oak Wood Stairs", "Dark Oak Wood Slab", "Double Dark Oak Wood Slab" }, + { "wood", "default_wood.png", S("Oak Wood Stairs"), S("Oak Wood Slab"), S("Double Oak Wood Slab") }, + { "junglewood", "default_junglewood.png", S("Jungle Wood Stairs"), S("Jungle Wood Slab"), S("Double Jungle Wood Slab") }, + { "acaciawood", "default_acacia_wood.png", S("Acacia Wood Stairs"), S("Acacia Wood Slab"), S("Double Acacia Wood Slab") }, + { "sprucewood", "mcl_core_planks_spruce.png", S("Spruce Wood Stairs"), S("Spruce Wood Slab"), S("Double Spruce Wood Slab") }, + { "birchwood", "mcl_core_planks_birch.png", S("Birch Wood Stairs"), S("Birch Wood Slab"), S("Double Birch Wood Slab") }, + { "darkwood", "mcl_core_planks_big_oak.png", S("Dark Oak Wood Stairs"), S("Dark Oak Wood Slab"), S("Double Dark Oak Wood Slab") }, } for w=1, #woods do @@ -30,131 +32,131 @@ for w=1, #woods do wood[5]) end -mcl_stairs.register_stair_and_slab_simple("stone_rough", "mcl_core:stone", "Stone Stairs", "Stone Slab", "Double Stone Slab") +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", "mcl_core:stone_smooth", {pickaxey=1, material_stone=1}, {"mcl_stairs_stone_slab_top.png", "mcl_stairs_stone_slab_top.png", "mcl_stairs_stone_slab_side.png"}, - "Polished Stone Slab", - mcl_sounds.node_sound_stone_defaults(), 2, "Double Polished Stone Slab") + S("Polished Stone Slab"), + mcl_sounds.node_sound_stone_defaults(), 2, S("Double Polished Stone Slab")) -mcl_stairs.register_stair_and_slab_simple("andesite", "mcl_core:andesite", "Andesite Stairs", "Andesite Slab", "Double Andesite Slab") -mcl_stairs.register_stair_and_slab_simple("granite", "mcl_core:granite", "Granite Stairs", "Granite Slab", "Double Granite Slab") -mcl_stairs.register_stair_and_slab_simple("diorite", "mcl_core:diorite", "Diorite Stairs", "Diorite Slab", "Double Diorite 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_and_slab_simple("cobble", "mcl_core:cobble", "Cobblestone Stairs", "Cobblestone Slab", "Double Cobblestone Slab") -mcl_stairs.register_stair_and_slab_simple("mossycobble", "mcl_core:mossycobble", "Moss Stone Stairs", "Moss Stone Slab", "Double Moss Stone 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("Moss Stone Stairs"), S("Moss Stone Slab"), S("Double Moss Stone Slab")) -mcl_stairs.register_stair_and_slab_simple("brick_block", "mcl_core:brick_block", "Brick Stairs", "Brick Slab", "Double Brick 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("sandstone", "group:sandstone", {pickaxey=1, material_stone=1}, {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, - "Sandstone Stairs", + S("Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, nil, "mcl_core:sandstone") mcl_stairs.register_slab("sandstone", "group:sandstone", {pickaxey=1, material_stone=1}, {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, - "Sandstone Slab", - mcl_sounds.node_sound_stone_defaults(), 2, "Double Sandstone Slab", "mcl_core:sandstone") -mcl_stairs.register_stair_and_slab_simple("sandstonesmooth2", "mcl_core:sandstonesmooth2", "Smooth Sandstone Stairs", "Smooth Sandstone Slab", "Double Smooth Sandstone Slab") + S("Sandstone Slab"), + mcl_sounds.node_sound_stone_defaults(), 2, S("Double Sandstone Slab"), "mcl_core:sandstone") +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:redsandstone", {pickaxey=1, material_stone=1}, {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, - "Red Sandstone Stairs", + S("Red Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, nil, "mcl_core:redsandstone") mcl_stairs.register_slab("redsandstone", "group:redsandstone", {pickaxey=1, material_stone=1}, {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, - "Red Sandstone Slab", - mcl_sounds.node_sound_stone_defaults(), 2, "Double Red Sandstone Slab", "mcl_core:redsandstone") -mcl_stairs.register_stair_and_slab_simple("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", "Smooth Red Sandstone Stairs", "Smooth Red Sandstone Slab", "Double Smooth Red Sandstone Slab") + S("Red Sandstone Slab"), + mcl_sounds.node_sound_stone_defaults(), 2, S("Double Red Sandstone Slab"), "mcl_core:redsandstone") +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")) -- Intentionally not group:stonebrick because of mclx_stairs mcl_stairs.register_stair("stonebrick", "mcl_core:stonebrick", {pickaxey=1, material_stone=1}, {"default_stone_brick.png"}, - "Stone Bricks Stairs", + S("Stone Bricks Stairs"), mcl_sounds.node_sound_stone_defaults(), 1.5, nil, "mcl_core:stonebrick") mcl_stairs.register_slab("stonebrick", "mcl_core:stonebrick", {pickaxey=1, material_stone=1}, {"default_stone_brick.png"}, - "Stone Bricks Slab", - mcl_sounds.node_sound_stone_defaults(), 2, "Double Stone Bricks Slab", "mcl_core:stonebrick") + S("Stone Bricks Slab"), + mcl_sounds.node_sound_stone_defaults(), 2, S("Double Stone Bricks Slab"), "mcl_core:stonebrick") mcl_stairs.register_stair("quartzblock", "group: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"}, - "Quartz Stairs", + S("Quartz Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, nil, "mcl_nether:quartz_block") mcl_stairs.register_slab("quartzblock", "group: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"}, - "Quartz Slab", - mcl_sounds.node_sound_stone_defaults(), 2, "Double Quartz Slab", "mcl_nether:quartz_block") + S("Quartz Slab"), + mcl_sounds.node_sound_stone_defaults(), 2, S("Double Quartz Slab"), "mcl_nether:quartz_block") -mcl_stairs.register_stair_and_slab_simple("quartz_smooth", "mcl_nether:quartz_smooth", "Smooth Quartz Stairs", "Smooth Quartz Slab", "Double Smooth Quartz Slab") +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_and_slab("nether_brick", "mcl_nether:nether_brick", {pickaxey=1, material_stone=1}, {"mcl_nether_nether_brick.png"}, - "Nether Brick Stairs", - "Nether Brick Slab", + S("Nether Brick Stairs"), + S("Nether Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 2, - "Double Nether Brick Slab") + S("Double Nether Brick Slab")) mcl_stairs.register_stair_and_slab("red_nether_brick", "mcl_nether:red_nether_brick", {pickaxey=1, material_stone=1}, {"mcl_nether_red_nether_brick.png"}, - "Red Nether Brick Stairs", - "Red Nether Brick Slab", + S("Red Nether Brick Stairs"), + S("Red Nether Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 2, - "Double Red Nether Brick Slab") + S("Double Red Nether Brick Slab")) -mcl_stairs.register_stair_and_slab_simple("end_bricks", "mcl_end:end_bricks", "End Stone Brick Stairs", "End Stone Brick Slab", "Double End Stone Brick Slab") +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("purpur_block", "group:purpur_block", {pickaxey=1, material_stone=1}, {"mcl_end_purpur_block.png"}, - "Purpur Stairs", + S("Purpur Stairs"), mcl_sounds.node_sound_stone_defaults(), 1.5) mcl_stairs.register_slab("purpur_block", "group:purpur_block", {pickaxey=1, material_stone=1}, {"mcl_end_purpur_block.png"}, - "Purpur Slab", + S("Purpur Slab"), mcl_sounds.node_sound_stone_defaults(), 2, - "Double Purpur Slab") + S("Double Purpur Slab")) -mcl_stairs.register_stair_and_slab_simple("prismarine", "mcl_ocean:prismarine", "Prismarine Stairs", "Prismarine Slab", "Double Prismarine 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_and_slab_simple("prismarine_brick", "mcl_ocean:prismarine_brick", "Prismarine Brick Stairs", "Prismarine Brick Slab", "Double Prismarine Brick Slab") -mcl_stairs.register_stair_and_slab_simple("prismarine_dark", "mcl_ocean:prismarine_dark", "Dark Prismarine Stairs", "Dark Prismarine Slab", "Double Dark Prismarine 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_slab("andesite_smooth", "mcl_core:andesite_smooth", {pickaxey=1}, {"mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, "Polished Andesite Slab", nil, nil, "Double Polished Andesite Slab") -mcl_stairs.register_stair("andesite_smooth", "mcl_core:andesite_smooth", {pickaxey=1}, {"mcl_stairs_andesite_smooth_slab.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, "Polished Andesite Stairs", nil, nil, "woodlike") +mcl_stairs.register_slab("andesite_smooth", "mcl_core:andesite_smooth", {pickaxey=1}, {"mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, S("Polished Andesite Slab"), nil, nil, S("Double Polished Andesite Slab")) +mcl_stairs.register_stair("andesite_smooth", "mcl_core:andesite_smooth", {pickaxey=1}, {"mcl_stairs_andesite_smooth_slab.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, S("Polished Andesite Stairs"), nil, nil, "woodlike") -mcl_stairs.register_slab("granite_smooth", "mcl_core:granite_smooth", {pickaxey=1}, {"mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, "Polished Granite Slab", nil, nil, "Double Polished Granite Slab") -mcl_stairs.register_stair("granite_smooth", "mcl_core:granite_smooth", {pickaxey=1}, {"mcl_stairs_granite_smooth_slab.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, "Polished Granite Stairs", nil, nil, "woodlike") +mcl_stairs.register_slab("granite_smooth", "mcl_core:granite_smooth", {pickaxey=1}, {"mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, S("Polished Granite Slab"), nil, nil, S("Double Polished Granite Slab")) +mcl_stairs.register_stair("granite_smooth", "mcl_core:granite_smooth", {pickaxey=1}, {"mcl_stairs_granite_smooth_slab.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, S("Polished Granite Stairs"), nil, nil, "woodlike") -mcl_stairs.register_slab("diorite_smooth", "mcl_core:diorite_smooth", {pickaxey=1}, {"mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, "Polished Diorite Slab", nil, nil, "Double Polished Diorite Slab") -mcl_stairs.register_stair("diorite_smooth", "mcl_core:diorite_smooth", {pickaxey=1}, {"mcl_stairs_diorite_smooth_slab.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, "Polished Diorite Stairs", nil, nil, "woodlike") +mcl_stairs.register_slab("diorite_smooth", "mcl_core:diorite_smooth", {pickaxey=1}, {"mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, S("Polished Diorite Slab"), nil, nil, S("Double Polished Diorite Slab")) +mcl_stairs.register_stair("diorite_smooth", "mcl_core:diorite_smooth", {pickaxey=1}, {"mcl_stairs_diorite_smooth_slab.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, S("Polished Diorite Stairs"), nil, nil, "woodlike") mcl_stairs.register_stair("stonebrickmossy", "mcl_core:stonebrickmossy", {pickaxey=1}, {"mcl_core_stonebrick_mossy.png"}, - "Mossy Stone Brick Stairs", + S("Mossy Stone Brick Stairs"), mcl_sounds.node_sound_stone_defaults(), 1.5, nil, "mcl_core:stonebrickmossy") mcl_stairs.register_slab("stonebrickmossy", "mcl_core:stonebrickmossy", {pickaxey=1}, {"mcl_core_stonebrick_mossy.png"}, - "Mossy Stone Brick Slab", - mcl_sounds.node_sound_stone_defaults(), 2, "Double Mossy Stone Brick Slab", "mcl_core:stonebrickmossy") + S("Mossy Stone Brick Slab"), + mcl_sounds.node_sound_stone_defaults(), 2, S("Double Mossy Stone Brick Slab"), "mcl_core:stonebrickmossy") diff --git a/mods/ITEMS/mcl_throwing/init.lua b/mods/ITEMS/mcl_throwing/init.lua index f8c90dcf1..93e06ff05 100644 --- a/mods/ITEMS/mcl_throwing/init.lua +++ b/mods/ITEMS/mcl_throwing/init.lua @@ -1,5 +1,7 @@ mcl_throwing = {} +local S = minetest.get_translator("mcl_throwing") + -- -- Snowballs and other throwable items -- @@ -289,12 +291,12 @@ minetest.register_entity("mcl_throwing:snowball_entity", snowball_ENTITY) minetest.register_entity("mcl_throwing:egg_entity", egg_ENTITY) minetest.register_entity("mcl_throwing:ender_pearl_entity", pearl_ENTITY) -local how_to_throw = "Hold it in your and and leftclick to throw." +local how_to_throw = S("Hold it in your and and leftclick to throw.") -- Snowball minetest.register_craftitem("mcl_throwing:snowball", { - description = "Snowball", - _doc_items_longdesc = "Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.", + description = S("Snowball"), + _doc_items_longdesc = S("Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing."), _doc_items_usagehelp = how_to_throw, inventory_image = "mcl_throwing_snowball.png", stack_max = 16, @@ -305,8 +307,8 @@ minetest.register_craftitem("mcl_throwing:snowball", { -- Egg minetest.register_craftitem("mcl_throwing:egg", { - description = "Egg", - _doc_items_longdesc = "Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chickens will pop out of the egg when it hits the ground.", + description = S("Egg"), + _doc_items_longdesc = S("Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chickens will pop out of the egg when it hits the ground."), _doc_items_usagehelp = how_to_throw, inventory_image = "mcl_throwing_egg.png", stack_max = 16, @@ -317,8 +319,8 @@ minetest.register_craftitem("mcl_throwing:egg", { -- Ender Pearl minetest.register_craftitem("mcl_throwing:ender_pearl", { - description = "Ender Pearl", - _doc_items_longdesc = "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, a plant or vines. Each teleportation hurts the user by 5 hit points.", + description = S("Ender Pearl"), + _doc_items_longdesc = S("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, a plant or vines. Each teleportation hurts the user by 5 hit points."), _doc_items_usagehelp = how_to_throw, wield_image = "mcl_throwing_ender_pearl.png", inventory_image = "mcl_throwing_ender_pearl.png", diff --git a/mods/ITEMS/mcl_tnt/init.lua b/mods/ITEMS/mcl_tnt/init.lua index 54d252f2f..c3bc2d935 100644 --- a/mods/ITEMS/mcl_tnt/init.lua +++ b/mods/ITEMS/mcl_tnt/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_tnt") + local mod_death_messages = minetest.get_modpath("mcl_death_messages") local function spawn_tnt(pos, entname) @@ -58,11 +60,11 @@ minetest.register_node("mcl_tnt:tnt", { "default_tnt_side.png", "default_tnt_side.png"}, is_ground_content = false, stack_max = 64, - description = "TNT", + description = S("TNT"), paramtype = "light", sunlight_propagates = true, - _doc_items_longdesc = string.format("An explosive device. When it explodes, it will hurt living beings, destroy blocks around it, throw blocks affected by gravity all over the place and light fires. A single TNT has an explosion radius of %d. 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.", TNT_RANGE), - _doc_items_usagehelp = "Place the TNT on the ground and ignite it with one of the methods above. Quickly get in safe distance quickly. The TNT will start to be affected by gravity and explodes in 4 seconds.", + _doc_items_longdesc = S("An explosive device. When it explodes, it will hurt living beings, destroy blocks around it, throw blocks affected by gravity all over the place and light fires. A single 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.", TNT_RANGE), + _doc_items_usagehelp = S("Place the TNT on the ground and ignite it with one of the methods above. Quickly get in safe distance quickly. The TNT will start to be affected by gravity and explodes in 4 seconds."), groups = { dig_immediate = 3, tnt = 1, enderman_takable=1 }, mesecons = {effector = { action_on = tnt.ignite, diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index b5f8b3036..1a39ff8c0 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_tools") + -- mods/default/tools.lua -- @@ -35,7 +37,7 @@ else end minetest.register_item(":", { type = "none", - _doc_items_longdesc = "You use your bare hand whenever you are not wielding any item. With your hand you can mine the weakest blocks and deal minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are better than the hand. 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. In Creative Mode, the hand is able to break all blocks instantly.", + _doc_items_longdesc = S("You use your bare hand whenever you are not wielding any item. With your hand you can mine the weakest blocks and deal minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are better than the hand. 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. In Creative Mode, the hand is able to break all blocks instantly."), wield_image = "wieldhand.png", wield_scale = {x=1.0,y=1.0,z=2.0}, -- According to Minecraft Wiki, the exact range is 3.975. @@ -50,17 +52,17 @@ minetest.register_item(":", { }) -- Help texts -local pickaxe_longdesc = "Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient." -local axe_longdesc = "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." -local sword_longdesc = "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." -local shovel_longdesc = "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." -local shovel_use = "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." -local shears_longdesc = "Shears are tools to shear sheep, carve pumpkins and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from a grass, leaves and similar blocks." +local pickaxe_longdesc = S("Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.") +local axe_longdesc = S("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.") +local sword_longdesc = S("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.") +local shovel_longdesc = S("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.") +local shovel_use = S("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.") +local shears_longdesc = S("Shears are tools to shear sheep, carve pumpkins and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from a grass, leaves and similar blocks.") local shears_use = "To shear a sheep and obtain its wool, rightclick it. To carve a face into a pumpkin and obtain 4 pumpkin seeds, rightclick it on one of its sides. Mining works are usual, but the drops are different for a few blocks." -- Picks minetest.register_tool("mcl_tools:pick_wood", { - description = "Wooden Pickaxe", + description = S("Wooden Pickaxe"), _doc_items_longdesc = pickaxe_longdesc, _doc_items_hidden = false, inventory_image = "default_tool_woodpick.png", @@ -78,7 +80,7 @@ minetest.register_tool("mcl_tools:pick_wood", { _repair_material = "group:wood", }) minetest.register_tool("mcl_tools:pick_stone", { - description = "Stone Pickaxe", + description = S("Stone Pickaxe"), _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_stonepick.png", groups = { tool=1, pickaxe=1 }, @@ -95,7 +97,7 @@ minetest.register_tool("mcl_tools:pick_stone", { _repair_material = "mcl_core:cobble", }) minetest.register_tool("mcl_tools:pick_iron", { - description = "Iron Pickaxe", + description = S("Iron Pickaxe"), _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_steelpick.png", groups = { tool=1, pickaxe=1 }, @@ -112,7 +114,7 @@ minetest.register_tool("mcl_tools:pick_iron", { _repair_material = "mcl_core:iron_ingot", }) minetest.register_tool("mcl_tools:pick_gold", { - description = "Golden Pickaxe", + description = S("Golden Pickaxe"), _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_goldpick.png", groups = { tool=1, pickaxe=1 }, @@ -129,7 +131,7 @@ minetest.register_tool("mcl_tools:pick_gold", { _repair_material = "mcl_core:gold_ingot", }) minetest.register_tool("mcl_tools:pick_diamond", { - description = "Diamond Pickaxe", + description = S("Diamond Pickaxe"), _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_diamondpick.png", groups = { tool=1, pickaxe=1 }, @@ -238,7 +240,7 @@ end -- Shovels minetest.register_tool("mcl_tools:shovel_wood", { - description = "Wooden Shovel", + description = S("Wooden Shovel"), _doc_items_longdesc = shovel_longdesc, _doc_items_usagehelp = shovel_use, _doc_items_hidden = false, @@ -258,7 +260,7 @@ minetest.register_tool("mcl_tools:shovel_wood", { _repair_material = "group:wood", }) minetest.register_tool("mcl_tools:shovel_stone", { - description = "Stone Shovel", + description = S("Stone Shovel"), _doc_items_longdesc = shovel_longdesc, _doc_items_usagehelp = shovel_use, inventory_image = "default_tool_stoneshovel.png", @@ -277,7 +279,7 @@ minetest.register_tool("mcl_tools:shovel_stone", { _repair_material = "mcl_core:cobble", }) minetest.register_tool("mcl_tools:shovel_iron", { - description = "Iron Shovel", + description = S("Iron Shovel"), _doc_items_longdesc = shovel_longdesc, _doc_items_usagehelp = shovel_use, inventory_image = "default_tool_steelshovel.png", @@ -296,7 +298,7 @@ minetest.register_tool("mcl_tools:shovel_iron", { _repair_material = "mcl_core:iron_ingot", }) minetest.register_tool("mcl_tools:shovel_gold", { - description = "Golden Shovel", + description = S("Golden Shovel"), _doc_items_longdesc = shovel_longdesc, _doc_items_usagehelp = shovel_use, inventory_image = "default_tool_goldshovel.png", @@ -315,7 +317,7 @@ minetest.register_tool("mcl_tools:shovel_gold", { _repair_material = "mcl_core:gold_ingot", }) minetest.register_tool("mcl_tools:shovel_diamond", { - description = "Diamond Shovel", + description = S("Diamond Shovel"), _doc_items_longdesc = shovel_longdesc, _doc_items_usagehelp = shovel_use, inventory_image = "default_tool_diamondshovel.png", @@ -336,7 +338,7 @@ minetest.register_tool("mcl_tools:shovel_diamond", { -- Axes minetest.register_tool("mcl_tools:axe_wood", { - description = "Wooden Axe", + description = S("Wooden Axe"), _doc_items_longdesc = axe_longdesc, _doc_items_hidden = false, inventory_image = "default_tool_woodaxe.png", @@ -353,7 +355,7 @@ minetest.register_tool("mcl_tools:axe_wood", { _repair_material = "group:wood", }) minetest.register_tool("mcl_tools:axe_stone", { - description = "Stone Axe", + description = S("Stone Axe"), _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_stoneaxe.png", groups = { tool=1, axe=1 }, @@ -369,7 +371,7 @@ minetest.register_tool("mcl_tools:axe_stone", { _repair_material = "mcl_core:cobble", }) minetest.register_tool("mcl_tools:axe_iron", { - description = "Iron Axe", + description = S("Iron Axe"), _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_steelaxe.png", groups = { tool=1, axe=1 }, @@ -386,7 +388,7 @@ minetest.register_tool("mcl_tools:axe_iron", { _repair_material = "mcl_core:iron_ingot", }) minetest.register_tool("mcl_tools:axe_gold", { - description = "Golden Axe", + description = S("Golden Axe"), _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_goldaxe.png", groups = { tool=1, axe=1 }, @@ -402,7 +404,7 @@ minetest.register_tool("mcl_tools:axe_gold", { _repair_material = "mcl_core:gold_ingot", }) minetest.register_tool("mcl_tools:axe_diamond", { - description = "Diamond Axe", + description = S("Diamond Axe"), _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_diamondaxe.png", groups = { tool=1, axe=1 }, @@ -420,7 +422,7 @@ minetest.register_tool("mcl_tools:axe_diamond", { -- Swords minetest.register_tool("mcl_tools:sword_wood", { - description = "Wooden Sword", + description = S("Wooden Sword"), _doc_items_longdesc = sword_longdesc, _doc_items_hidden = false, inventory_image = "default_tool_woodsword.png", @@ -438,7 +440,7 @@ minetest.register_tool("mcl_tools:sword_wood", { _repair_material = "group:wood", }) minetest.register_tool("mcl_tools:sword_stone", { - description = "Stone Sword", + description = S("Stone Sword"), _doc_items_longdesc = sword_longdesc, inventory_image = "default_tool_stonesword.png", groups = { weapon=1 }, @@ -455,7 +457,7 @@ minetest.register_tool("mcl_tools:sword_stone", { _repair_material = "mcl_core:cobble", }) minetest.register_tool("mcl_tools:sword_iron", { - description = "Iron Sword", + description = S("Iron Sword"), _doc_items_longdesc = sword_longdesc, inventory_image = "default_tool_steelsword.png", groups = { weapon=1 }, @@ -472,7 +474,7 @@ minetest.register_tool("mcl_tools:sword_iron", { _repair_material = "mcl_core:iron_ingot", }) minetest.register_tool("mcl_tools:sword_gold", { - description = "Golden Sword", + description = S("Golden Sword"), _doc_items_longdesc = sword_longdesc, inventory_image = "default_tool_goldsword.png", groups = { weapon=1 }, @@ -489,7 +491,7 @@ minetest.register_tool("mcl_tools:sword_gold", { _repair_material = "mcl_core:gold_ingot", }) minetest.register_tool("mcl_tools:sword_diamond", { - description = "Diamond Sword", + description = S("Diamond Sword"), _doc_items_longdesc = sword_longdesc, inventory_image = "default_tool_diamondsword.png", groups = { weapon=1 }, @@ -508,7 +510,7 @@ minetest.register_tool("mcl_tools:sword_diamond", { --Shears minetest.register_tool("mcl_tools:shears", { - description = "Shears", + description = S("Shears"), _doc_items_longdesc = shears_longdesc, _doc_items_usagehelp = shears_use, inventory_image = "default_tool_shears.png", diff --git a/mods/ITEMS/mcl_torches/init.lua b/mods/ITEMS/mcl_torches/init.lua index 7a0be478d..62a009406 100644 --- a/mods/ITEMS/mcl_torches/init.lua +++ b/mods/ITEMS/mcl_torches/init.lua @@ -1,3 +1,4 @@ +local S = minetest.get_translator("mcl_torches") -- -- 3d torch part @@ -169,13 +170,13 @@ mcl_torches.register_torch = function(substring, description, doc_items_longdesc end mcl_torches.register_torch("torch", - "Torch", - "Torches are light sources which can be placed at the side or on the top of most blocks.", - [[Torches can generally be placed on full solid opaque blocks. The following exceptions apply: + S("Torch"), + S("Torches are light sources which can be placed at the side or on the top of most blocks."), + S([[Torches can generally be placed on full solid opaque blocks. The following exceptions apply: • Glass, fence, wall, hopper: Can only be placed on top • Upside-down slab/stair: Can only be placed on top • Soul sand, mob spawner: Placement possible -• Glowstone and pistons: No placement possible]], +• Glowstone and pistons: No placement possible]]), "default_torch_on_floor.png", "mcl_torches_torch_floor.obj", "mcl_torches_torch_wall.obj", {{ diff --git a/mods/ITEMS/mcl_walls/init.lua b/mods/ITEMS/mcl_walls/init.lua index fb68f167b..162227805 100644 --- a/mods/ITEMS/mcl_walls/init.lua +++ b/mods/ITEMS/mcl_walls/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_walls") + mcl_walls = {} local function rshift(x, by) @@ -225,7 +227,7 @@ function mcl_walls.register_wall(nodename, description, source, tiles, inventory -- Inventory item minetest.register_node(nodename, { description = description, - _doc_items_longdesc = "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.", + _doc_items_longdesc = S("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."), paramtype = "light", sunlight_propagates = true, is_ground_content = false, diff --git a/mods/ITEMS/mcl_walls/register.lua b/mods/ITEMS/mcl_walls/register.lua index 5c6df791d..363ef55c7 100644 --- a/mods/ITEMS/mcl_walls/register.lua +++ b/mods/ITEMS/mcl_walls/register.lua @@ -1,14 +1,16 @@ -mcl_walls.register_wall("mcl_walls:cobble", "Cobblestone Wall", "mcl_core:cobble") -mcl_walls.register_wall("mcl_walls:mossycobble", "Mossy Cobblestone Wall", "mcl_core:mossycobble") -mcl_walls.register_wall("mcl_walls:andesite", "Andesite Wall", "mcl_core:andesite") -mcl_walls.register_wall("mcl_walls:granite", "Granite Wall", "mcl_core:granite") -mcl_walls.register_wall("mcl_walls:diorite", "Diorite Wall", "mcl_core:diorite") -mcl_walls.register_wall("mcl_walls:brick", "Brick Wall", "mcl_core:brick_block") -mcl_walls.register_wall("mcl_walls:sandstone", "Sandstone Wall", "mcl_core:sandstone") -mcl_walls.register_wall("mcl_walls:redsandstone", "Red Sandstone Wall", "mcl_core:redsandstone") -mcl_walls.register_wall("mcl_walls:stonebrick", "Stone Brick Wall", "mcl_core:stonebrick") -mcl_walls.register_wall("mcl_walls:stonebrickmossy", "Mossy Stone Brick Wall", "mcl_core:stonebrickmossy") -mcl_walls.register_wall("mcl_walls:prismarine", "Prismarine Wall", "mcl_ocean:prismarine") -mcl_walls.register_wall("mcl_walls:endbricks", "End Stone Brick Wall", "mcl_end:end_bricks") -mcl_walls.register_wall("mcl_walls:netherbrick", "Nether Brick Wall", "mcl_nether:nether_brick") -mcl_walls.register_wall("mcl_walls:rednetherbrick", "Red Nether Brick Wall", "mcl_nether:red_nether_brick") +local S = minetest.get_translator("mcl_walls") + +mcl_walls.register_wall("mcl_walls:cobble", S("Cobblestone Wall"), "mcl_core:cobble") +mcl_walls.register_wall("mcl_walls:mossycobble", S("Mossy Cobblestone Wall"), "mcl_core:mossycobble") +mcl_walls.register_wall("mcl_walls:andesite", S("Andesite Wall"), "mcl_core:andesite") +mcl_walls.register_wall("mcl_walls:granite", S("Granite Wall"), "mcl_core:granite") +mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorite") +mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block") +mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone") +mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone") +mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick") +mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy") +mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine") +mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks") +mcl_walls.register_wall("mcl_walls:netherbrick", S("Nether Brick Wall"), "mcl_nether:nether_brick") +mcl_walls.register_wall("mcl_walls:rednetherbrick", S("Red Nether Brick Wall"), "mcl_nether:red_nether_brick") diff --git a/mods/ITEMS/mcl_wool/init.lua b/mods/ITEMS/mcl_wool/init.lua index 14e7d204d..99e7344f6 100644 --- a/mods/ITEMS/mcl_wool/init.lua +++ b/mods/ITEMS/mcl_wool/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_wool") + -- minetest/wool/init.lua -- Backwards compatibility with jordach's 16-color wool mod @@ -9,23 +11,23 @@ local wool = {} -- colors, and then some recipes using more specific colors for a few non-base -- colors available. When crafting, the last recipes will be checked first. wool.dyes = { - -- name, texture, wool desc., carpet desc., dye, color_group - {"white", "wool_white", "White Wool", "White Carpet", nil, "basecolor_white"}, - {"grey", "wool_dark_grey", "Grey Wool", "Grey Carpet", "dark_grey", "unicolor_darkgrey"}, - {"silver", "wool_grey", "Light Grey Wool", "Light Grey Carpet", "grey", "basecolor_grey"}, - {"black", "wool_black", "Black Wool", "Black Carpet", "black", "basecolor_black"}, - {"red", "wool_red", "Red Wool", "Red Carpet", "red", "basecolor_red"}, - {"yellow", "wool_yellow", "Yellow Wool", "Yellow Carpet", "yellow", "basecolor_yellow"}, - {"green", "wool_dark_green", "Green Wool", "Green Carpet", "dark_green", "unicolor_dark_green"}, - {"cyan", "wool_cyan", "Cyan Wool", "Cyan Carpet", "cyan", "basecolor_cyan"}, - {"blue", "wool_blue", "Blue Wool", "Blue Carpet", "blue", "basecolor_blue"}, - {"magenta", "wool_magenta", "Magenta Wool", "Magenta Carpet", "magenta", "basecolor_magenta"}, - {"orange", "wool_orange", "Orange Wool", "Orange Carpet", "orange", "excolor_orange"}, - {"purple", "wool_violet", "Purple Wool", "Purple Carpet", "violet", "excolor_violet"}, - {"brown", "wool_brown", "Brown Wool", "Brown Carpet", "brown", "unicolor_dark_orange"}, - {"pink", "wool_pink", "Pink Wool", "Pink Carpet", "pink", "unicolor_light_red"}, - {"lime", "mcl_wool_lime", "Lime Wool", "Lime Carpet", "green", "basecolor_green"}, - {"light_blue", "mcl_wool_light_blue", "Light Blue Wool", "Light Blue Carpet", "lightblue", "unicolor_light_blue"}, + -- name, texture, wool desc., carpet desc., dye, color_group + {"white", "wool_white", S("White Wool"), S("White Carpet"), nil, "basecolor_white"}, + {"grey", "wool_dark_grey", S("Grey Wool"), S("Grey Carpet"), "dark_grey", "unicolor_darkgrey"}, + {"silver", "wool_grey", S("Light Grey Wool"), S("Light Grey Carpet"), "grey", "basecolor_grey"}, + {"black", "wool_black", S("Black Wool"), S("Black Carpet"), "black", "basecolor_black"}, + {"red", "wool_red", S("Red Wool"), S("Red Carpet"), "red", "basecolor_red"}, + {"yellow", "wool_yellow", S("Yellow Wool"), S("Yellow Carpet"), "yellow", "basecolor_yellow"}, + {"green", "wool_dark_green", S("Green Wool"), S("Green Carpet"), "dark_green", "unicolor_dark_green"}, + {"cyan", "wool_cyan", S("Cyan Wool"), S("Cyan Carpet"), "cyan", "basecolor_cyan"}, + {"blue", "wool_blue", S("Blue Wool"), S("Blue Carpet"), "blue", "basecolor_blue"}, + {"magenta", "wool_magenta", S("Magenta Wool"), S("Magenta Carpet"), "magenta", "basecolor_magenta"}, + {"orange", "wool_orange", S("Orange Wool"), S("Orange Carpet"), "orange", "excolor_orange"}, + {"purple", "wool_violet", S("Purple Wool"), S("Purple Carpet"), "violet", "excolor_violet"}, + {"brown", "wool_brown", S("Brown Wool"), S("Brown Carpet"), "brown", "unicolor_dark_orange"}, + {"pink", "wool_pink", S("Pink Wool"), S("Pink Carpet"), "pink", "unicolor_light_red"}, + {"lime", "mcl_wool_lime", S("Lime Wool"), S("Lime Carpet"), "green", "basecolor_green"}, + {"light_blue", "mcl_wool_light_blue", S("Light Blue Wool"), S("Light Blue Carpet"), "lightblue", "unicolor_light_blue"}, } for _, row in ipairs(wool.dyes) do @@ -38,7 +40,7 @@ for _, row in ipairs(wool.dyes) do -- Node Definition minetest.register_node("mcl_wool:"..name, { description = desc_wool, - _doc_items_longdesc = "Wool is a decorational block which comes in many different colors.", + _doc_items_longdesc = S("Wool is a decorational block which comes in many different colors."), stack_max = 64, is_ground_content = false, tiles = {texture..".png"}, @@ -49,7 +51,7 @@ for _, row in ipairs(wool.dyes) do }) minetest.register_node("mcl_wool:"..name.."_carpet", { description = desc_carpet, - _doc_items_longdesc = "Carpets are thin floor covers which come in many different colors.", + _doc_items_longdesc = S("Carpets are thin floor covers which come in many different colors."), walkable = false, -- See is_ground_content = false, tiles = {texture..".png"}, diff --git a/mods/ITEMS/mclx_core/init.lua b/mods/ITEMS/mclx_core/init.lua index a90159f77..004c351d7 100644 --- a/mods/ITEMS/mclx_core/init.lua +++ b/mods/ITEMS/mclx_core/init.lua @@ -1,13 +1,15 @@ +local S = minetest.get_translator("mclx_core") + -- Liquids: River Water local source = table.copy(minetest.registered_nodes["mcl_core:water_source"]) -source.description = "River Water Source" +source.description = S("River Water Source") source.liquid_range = 2 source.liquid_alternative_flowing = "mclx_core:river_water_flowing" source.liquid_alternative_source = "mclx_core:river_water_source" source.liquid_renewable = false -source._doc_items_longdesc = "River water has the same properties as water, but has a reduced flowing distance and is not renewable." -source._doc_items_entry_name = "River Water" +source._doc_items_longdesc = S("River water has the same properties as water, but has a reduced flowing distance and is not renewable.") +source._doc_items_entry_name = S("River Water") -- Auto-expose entry only in valleys mapgen source._doc_items_hidden = minetest.get_mapgen_setting("mg_name") ~= "valleys" source.post_effect_color = {a=192, r=0x2c, g=0x88, b=0x8c} @@ -24,7 +26,7 @@ source.special_tiles = { } local flowing = table.copy(minetest.registered_nodes["mcl_core:water_flowing"]) -flowing.description = "Flowing River Water" +flowing.description = S("Flowing River Water") flowing.liquid_range = 2 flowing.liquid_alternative_flowing = "mclx_core:river_water_flowing" flowing.liquid_alternative_source = "mclx_core:river_water_source" diff --git a/mods/ITEMS/mclx_fences/init.lua b/mods/ITEMS/mclx_fences/init.lua index 60f0c2995..08c3d91ac 100644 --- a/mods/ITEMS/mclx_fences/init.lua +++ b/mods/ITEMS/mclx_fences/init.lua @@ -1,8 +1,10 @@ +local S = minetest.get_translator("mclx_fences") + -- Red Nether Brick Fence mcl_fences.register_fence_and_fence_gate( "red_nether_brick_fence", - "Red Nether Brick Fence", "Red Nether Brick Fence Gate", + S("Red Nether Brick Fence"), S("Red Nether Brick Fence Gate"), "mcl_fences_fence_red_nether_brick.png", {pickaxey=1, deco_block=1, fence_nether_brick=1}, minetest.registered_nodes["mcl_nether:red_nether_brick"]._mcl_hardness, @@ -13,7 +15,7 @@ mcl_fences.register_fence_and_fence_gate( mcl_fences.register_fence_gate( "nether_brick_fence", - "Nether Brick Fence Gate", + S("Nether Brick Fence Gate"), "mcl_fences_fence_gate_nether_brick.png", {pickaxey=1, deco_block=1, fence_nether_brick=1}, minetest.registered_nodes["mcl_nether:nether_brick"]._mcl_hardness, diff --git a/mods/ITEMS/mclx_stairs/init.lua b/mods/ITEMS/mclx_stairs/init.lua index 29f45f2bb..9bd64d595 100644 --- a/mods/ITEMS/mclx_stairs/init.lua +++ b/mods/ITEMS/mclx_stairs/init.lua @@ -1,31 +1,34 @@ -mcl_stairs.register_stair_and_slab_simple("tree_bark", "mcl_core:tree_bark", "Oak Bark Stairs", "Oak Bark Slab", "Double Oak Bark Slab", "woodlike") -mcl_stairs.register_stair_and_slab_simple("acaciatree_bark", "mcl_core:acaciatree_bark", "Acacia Bark Stairs", "Acacia Bark Slab", "Double Acacia Bark Slab", "woodlike") -mcl_stairs.register_stair_and_slab_simple("sprucetree_bark", "mcl_core:sprucetree_bark", "Spruce Bark Stairs", "Spruce Bark Slab", "Double Spruce Bark Slab", "woodlike") -mcl_stairs.register_stair_and_slab_simple("birchtree_bark", "mcl_core:birchtree_bark", "Birch Bark Stairs", "Birch Bark Slab", "Double Birch Bark Slab", "woodlike") -mcl_stairs.register_stair_and_slab_simple("jungletree_bark", "mcl_core:jungletree_bark", "Jungle Bark Stairs", "Jungle Bark Slab", "Double Jungle Bark Slab", "woodlike") -mcl_stairs.register_stair_and_slab_simple("darktree_bark", "mcl_core:darktree_bark", "Dark Oak Bark Stairs", "Dark Oak Bark Slab", "Double Dark Oak Bark Slab", "woodlike") +local S = minetest.get_translator("mclx_stairs") -mcl_stairs.register_slab("lapisblock", "mcl_core:lapisblock", {pickaxey=3}, {"mcl_core_lapis_block.png", "mcl_core_lapis_block.png", "mcl_stairs_lapis_block_slab.png"}, "Lapis Lazuli Slab", nil, nil, "Double Lapis Lazuli Slab") -mcl_stairs.register_stair("lapisblock", "mcl_core:lapisblock", {pickaxey=3}, {"mcl_stairs_lapis_block_slab.png", "mcl_core_lapis_block.png", "mcl_core_lapis_block.png", "mcl_core_lapis_block.png", "mcl_core_lapis_block.png", "mcl_stairs_lapis_block_slab.png"}, "Lapis Lazuli Stairs", nil, nil, "woodlike") +mcl_stairs.register_stair_and_slab_simple("tree_bark", "mcl_core:tree_bark", S("Oak Bark Stairs"), S("Oak Bark Slab"), S("Double Oak Bark Slab"), "woodlike") +mcl_stairs.register_stair_and_slab_simple("acaciatree_bark", "mcl_core:acaciatree_bark", S("Acacia Bark Stairs"), S("Acacia Bark Slab"), S("Double Acacia Bark Slab"), "woodlike") +mcl_stairs.register_stair_and_slab_simple("sprucetree_bark", "mcl_core:sprucetree_bark", S("Spruce Bark Stairs"), S("Spruce Bark Slab"), S("Double Spruce Bark Slab"), "woodlike") +mcl_stairs.register_stair_and_slab_simple("birchtree_bark", "mcl_core:birchtree_bark", S("Birch Bark Stairs"), S("Birch Bark Slab"), S("Double Birch Bark Slab"), "woodlike") +mcl_stairs.register_stair_and_slab_simple("jungletree_bark", "mcl_core:jungletree_bark", S("Jungle Bark Stairs"), S("Jungle Bark Slab"), S("Double Jungle Bark Slab"), "woodlike") +mcl_stairs.register_stair_and_slab_simple("darktree_bark", "mcl_core:darktree_bark", S("Dark Oak Bark Stairs"), S("Dark Oak Bark Slab"), S("Double Dark Oak Bark Slab"), "woodlike") -mcl_stairs.register_slab("goldblock", "mcl_core:goldblock", {pickaxey=4}, {"default_gold_block.png", "default_gold_block.png", "mcl_stairs_gold_block_slab.png"}, "Slab of Gold", nil, nil, "Double Slab of Gold") -mcl_stairs.register_stair("goldblock", "mcl_core:goldblock", {pickaxey=4}, {"mcl_stairs_gold_block_slab.png", "default_gold_block.png", "default_gold_block.png", "default_gold_block.png", "default_gold_block.png", "mcl_stairs_gold_block_slab.png"}, "Stairs of Gold", nil, nil, "woodlike") +mcl_stairs.register_slab("lapisblock", "mcl_core:lapisblock", {pickaxey=3}, {"mcl_core_lapis_block.png", "mcl_core_lapis_block.png", "mcl_stairs_lapis_block_slab.png"}, S("Lapis Lazuli Slab"), nil, nil, S("Double Lapis Lazuli Slab")) +mcl_stairs.register_stair("lapisblock", "mcl_core:lapisblock", {pickaxey=3}, {"mcl_stairs_lapis_block_slab.png", "mcl_core_lapis_block.png", "mcl_core_lapis_block.png", "mcl_core_lapis_block.png", "mcl_core_lapis_block.png", "mcl_stairs_lapis_block_slab.png"}, S("Lapis Lazuli Stairs"), nil, nil, "woodlike") -mcl_stairs.register_slab("ironblock", "mcl_core:ironblock", {pickaxey=2}, {"default_steel_block.png", "default_steel_block.png", "mcl_stairs_iron_block_slab.png"}, "Slab of Iron", nil, nil, "Double Slab of Iron") -mcl_stairs.register_stair("ironblock", "mcl_core:ironblock", {pickaxey=2}, {"mcl_stairs_iron_block_slab.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "mcl_stairs_iron_block_slab.png"}, "Stairs of Iron", nil, nil, "woodlike") +mcl_stairs.register_slab("goldblock", "mcl_core:goldblock", {pickaxey=4}, {"default_gold_block.png", "default_gold_block.png", "mcl_stairs_gold_block_slab.png"}, S("Slab of Gold"), nil, nil, S("Double Slab of Gold")) +mcl_stairs.register_stair("goldblock", "mcl_core:goldblock", {pickaxey=4}, {"mcl_stairs_gold_block_slab.png", "default_gold_block.png", "default_gold_block.png", "default_gold_block.png", "default_gold_block.png", "mcl_stairs_gold_block_slab.png"}, S("Stairs of Gold"), nil, nil, "woodlike") + +mcl_stairs.register_slab("ironblock", "mcl_core:ironblock", {pickaxey=2}, {"default_steel_block.png", "default_steel_block.png", "mcl_stairs_iron_block_slab.png"}, S("Slab of Iron"), nil, nil, S("Double Slab of Iron")) +mcl_stairs.register_stair("ironblock", "mcl_core:ironblock", {pickaxey=2}, {"mcl_stairs_iron_block_slab.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "mcl_stairs_iron_block_slab.png"}, S("Stairs of Iron"), nil, nil, "woodlike") mcl_stairs.register_stair("stonebrickcracked", "mcl_core:stonebrickcracked", {pickaxey=1}, {"mcl_core_stonebrick_cracked.png"}, - "Cracked Stone Brick Stairs", + S("Cracked Stone Brick Stairs"), mcl_sounds.node_sound_stone_defaults(), 1.5, nil, "mcl_core:stonebrickcracked") mcl_stairs.register_slab("stonebrickcracked", "mcl_core:stonebrickcracked", {pickaxey=1}, {"mcl_core_stonebrick_cracked.png"}, - "Cracked Stone Brick Slab", - mcl_sounds.node_sound_stone_defaults(), 2, "Double Cracked Stone Brick Slab", "mcl_core:stonebrickcracked") + S("Cracked Stone Brick Slab"), + mcl_sounds.node_sound_stone_defaults(), 2, S("Double Cracked Stone Brick Slab"), "mcl_core:stonebrickcracked") +-- TODO: Localize local block = {} block.dyes = { {"white", "White", "white"}, diff --git a/mods/ITEMS/xpanes/init.lua b/mods/ITEMS/xpanes/init.lua index 1b540ee69..e5e72b3ec 100644 --- a/mods/ITEMS/xpanes/init.lua +++ b/mods/ITEMS/xpanes/init.lua @@ -1,3 +1,4 @@ +local S = minetest.get_translator("xpanes") local function is_pane(pos) return minetest.get_item_group(minetest.get_node(pos).name, "pane") > 0 @@ -178,7 +179,7 @@ local pane = function(description, node, append) end xpanes.register_pane("pane"..append, { description = description, - _doc_items_longdesc = "Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.", + _doc_items_longdesc = S("Glass panes are thin layers of glass which neatly connect to their neighbors as you build them."), textures = {texture1, texture1, "xpanes_top_glass"..append..".png"}, use_texture_alpha = true, inventory_image = texture1, @@ -197,8 +198,8 @@ end -- Iron Bars xpanes.register_pane("bar", { - description = "Iron Bars", - _doc_items_longdesc = "Iron bars neatly connect to their neighbors as you build them.", + description = S("Iron Bars"), + _doc_items_longdesc = S("Iron bars neatly connect to their neighbors as you build them."), textures = {"xpanes_pane_iron.png","xpanes_pane_iron.png","xpanes_top_iron.png"}, inventory_image = "xpanes_pane_iron.png", wield_image = "xpanes_pane_iron.png", @@ -213,22 +214,22 @@ xpanes.register_pane("bar", { }) -- Glass Pane -pane("Glass Pane", "mcl_core:glass", "_natural") -- triggers special case +pane(S("Glass Pane"), "mcl_core:glass", "_natural") -- triggers special case -- Stained Glass Pane -pane("Red Stained Glass Pane", "mcl_core:glass_red", "_red") -pane("Green Stained Glass Pane", "mcl_core:glass_green", "_green") -pane("Blue Stained Glass Pane", "mcl_core:glass_blue", "_blue") -pane("Light Blue Stained Glass Pane", "mcl_core:glass_light_blue", "_light_blue") -pane("Black Stained Glass Pane", "mcl_core:glass_black", "_black") -pane("White Stained Glass Pane", "mcl_core:glass_white", "_white") -pane("Yellow Stained Glass Pane", "mcl_core:glass_yellow", "_yellow") -pane("Brown Stained Glass Pane", "mcl_core:glass_brown", "_brown") -pane("Orange Stained Glass Pane", "mcl_core:glass_orange", "_orange") -pane("Pink Stained Glass Pane", "mcl_core:glass_pink", "_pink") -pane("Grey Stained Glass Pane", "mcl_core:glass_gray", "_gray") -pane("Lime Stained Glass Pane", "mcl_core:glass_lime", "_lime") -pane("Light Grey Stained Glass Pane", "mcl_core:glass_silver", "_silver") -pane("Magenta Stained Glass Pane", "mcl_core:glass_magenta", "_magenta") -pane("Purple Stained Glass Pane", "mcl_core:glass_purple", "_purple") -pane("Cyan Stained Glass Pane", "mcl_core:glass_cyan", "_cyan") +pane(S("Red Stained Glass Pane"), "mcl_core:glass_red", "_red") +pane(S("Green Stained Glass Pane"), "mcl_core:glass_green", "_green") +pane(S("Blue Stained Glass Pane"), "mcl_core:glass_blue", "_blue") +pane(S("Light Blue Stained Glass Pane"), "mcl_core:glass_light_blue", "_light_blue") +pane(S("Black Stained Glass Pane"), "mcl_core:glass_black", "_black") +pane(S("White Stained Glass Pane"), "mcl_core:glass_white", "_white") +pane(S("Yellow Stained Glass Pane"), "mcl_core:glass_yellow", "_yellow") +pane(S("Brown Stained Glass Pane"), "mcl_core:glass_brown", "_brown") +pane(S("Orange Stained Glass Pane"), "mcl_core:glass_orange", "_orange") +pane(S("Pink Stained Glass Pane"), "mcl_core:glass_pink", "_pink") +pane(S("Grey Stained Glass Pane"), "mcl_core:glass_gray", "_gray") +pane(S("Lime Stained Glass Pane"), "mcl_core:glass_lime", "_lime") +pane(S("Light Grey Stained Glass Pane"), "mcl_core:glass_silver", "_silver") +pane(S("Magenta Stained Glass Pane"), "mcl_core:glass_magenta", "_magenta") +pane(S("Purple Stained Glass Pane"), "mcl_core:glass_purple", "_purple") +pane(S("Cyan Stained Glass Pane"), "mcl_core:glass_cyan", "_cyan") From 44fcf6eb3460a3c99226f317c3e683ecf2b6f94f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 00:51:45 +0100 Subject: [PATCH 069/379] New translation system, part 10: Armor --- .../ITEMS/minetest-3d_armor/3d_armor/init.lua | 46 ++++++++++--------- .../minetest-3d_armor/3d_armor_stand/init.lua | 8 ++-- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/init.lua b/mods/ITEMS/minetest-3d_armor/3d_armor/init.lua index acd633276..ee4af5b5a 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor/init.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor/init.lua @@ -1,12 +1,14 @@ +local S = minetest.get_translator("3d_armor") + dofile(minetest.get_modpath(minetest.get_current_modname()).."/armor.lua") -- Regisiter Head Armor -local longdesc = "This is a piece of equippable armor which reduces the amount of damage you receive." -local usage = "To equip it, put it on the corresponding armor slot in your inventory menu." +local longdesc = S("This is a piece of equippable armor which reduces the amount of damage you receive.") +local usage = S("To equip it, put it on the corresponding armor slot in your inventory menu.") minetest.register_tool("3d_armor:helmet_leather", { - description = "Leather Cap", + description = S("Leather Cap"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_helmet_leather.png", @@ -16,7 +18,7 @@ minetest.register_tool("3d_armor:helmet_leather", { }) minetest.register_tool("3d_armor:helmet_iron", { - description = "Iron Helmet", + description = S("Iron Helmet"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_helmet_iron.png", @@ -26,7 +28,7 @@ minetest.register_tool("3d_armor:helmet_iron", { }) minetest.register_tool("3d_armor:helmet_gold", { - description = "Golden Helmet", + description = S("Golden Helmet"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_helmet_gold.png", @@ -36,7 +38,7 @@ minetest.register_tool("3d_armor:helmet_gold", { }) minetest.register_tool("3d_armor:helmet_diamond",{ - description = "Diamond Helmet", + description = S("Diamond Helmet"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_helmet_diamond.png", @@ -46,7 +48,7 @@ minetest.register_tool("3d_armor:helmet_diamond",{ }) minetest.register_tool("3d_armor:helmet_chain", { - description = "Chain Helmet", + description = S("Chain Helmet"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_helmet_chain.png", @@ -58,7 +60,7 @@ minetest.register_tool("3d_armor:helmet_chain", { -- Regisiter Torso Armor minetest.register_tool("3d_armor:chestplate_leather", { - description = "Leather Tunic", + description = S("Leather Tunic"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_chestplate_leather.png", @@ -68,7 +70,7 @@ minetest.register_tool("3d_armor:chestplate_leather", { }) minetest.register_tool("3d_armor:chestplate_iron", { - description = "Iron Chestplate", + description = S("Iron Chestplate"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_chestplate_iron.png", @@ -78,7 +80,7 @@ minetest.register_tool("3d_armor:chestplate_iron", { }) minetest.register_tool("3d_armor:chestplate_gold", { - description = "Golden Chestplate", + description = S("Golden Chestplate"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_chestplate_gold.png", @@ -88,7 +90,7 @@ minetest.register_tool("3d_armor:chestplate_gold", { }) minetest.register_tool("3d_armor:chestplate_diamond",{ - description = "Diamond Chestplate", + description = S("Diamond Chestplate"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_chestplate_diamond.png", @@ -98,7 +100,7 @@ minetest.register_tool("3d_armor:chestplate_diamond",{ }) minetest.register_tool("3d_armor:chestplate_chain", { - description = "Chain Chestplate", + description = S("Chain Chestplate"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_chestplate_chain.png", @@ -110,7 +112,7 @@ minetest.register_tool("3d_armor:chestplate_chain", { -- Regisiter Leg Armor minetest.register_tool("3d_armor:leggings_leather", { - description = "Leather Pants", + description = S("Leather Pants"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_leggings_leather.png", @@ -120,7 +122,7 @@ minetest.register_tool("3d_armor:leggings_leather", { }) minetest.register_tool("3d_armor:leggings_iron", { - description = "Iron Leggings", + description = S("Iron Leggings"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_leggings_iron.png", @@ -130,7 +132,7 @@ minetest.register_tool("3d_armor:leggings_iron", { }) minetest.register_tool("3d_armor:leggings_gold", { - description = "Golden Leggings", + description = S("Golden Leggings"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_leggings_gold.png", @@ -140,7 +142,7 @@ minetest.register_tool("3d_armor:leggings_gold", { }) minetest.register_tool("3d_armor:leggings_diamond",{ - description = "Diamond Leggings", + description = S("Diamond Leggings"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_leggings_diamond.png", @@ -150,7 +152,7 @@ minetest.register_tool("3d_armor:leggings_diamond",{ }) minetest.register_tool("3d_armor:leggings_chain", { - description = "Chain Leggings", + description = S("Chain Leggings"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_leggings_chain.png", @@ -161,7 +163,7 @@ minetest.register_tool("3d_armor:leggings_chain", { -- Regisiter Boots minetest.register_tool("3d_armor:boots_leather", { - description = "Leather Boots", + description = S("Leather Boots"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_boots_leather.png", @@ -171,7 +173,7 @@ minetest.register_tool("3d_armor:boots_leather", { }) minetest.register_tool("3d_armor:boots_iron", { - description = "Iron Boots", + description = S("Iron Boots"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_boots_iron.png", @@ -181,7 +183,7 @@ minetest.register_tool("3d_armor:boots_iron", { }) minetest.register_tool("3d_armor:boots_gold", { - description = "Golden Boots", + description = S("Golden Boots"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_boots_gold.png", @@ -191,7 +193,7 @@ minetest.register_tool("3d_armor:boots_gold", { }) minetest.register_tool("3d_armor:boots_diamond",{ - description = "Diamond Boots", + description = S("Diamond Boots"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_boots_diamond.png", @@ -201,7 +203,7 @@ minetest.register_tool("3d_armor:boots_diamond",{ }) minetest.register_tool("3d_armor:boots_chain", { - description = "Chain Boots", + description = S("Chain Boots"), _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_boots_chain.png", diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua index cd378d6d3..775c1f531 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("3d_armor_stand") + local elements = {"head", "torso", "legs", "feet"} local function get_stand_object(pos) @@ -88,9 +90,9 @@ end -- FIXME: The armor stand should be an entity minetest.register_node("3d_armor_stand:armor_stand", { - description = "Armor Stand", - _doc_items_longdesc = "An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.", - _doc_items_usagehelp = "Hold an armor item in your hand and rightclick the armor stand to put it on the armor stand. To take a piece of armor from the armor stand, select your hand and rightclick the armor stand. You'll retrieve the first armor item from above.", + description = S("Armor Stand"), + _doc_items_longdesc = S("An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand."), + _doc_items_usagehelp = S("Hold an armor item in your hand and rightclick the armor stand to put it on the armor stand. To take a piece of armor from the armor stand, select your hand and rightclick the armor stand. You'll retrieve the first armor item from above."), drawtype = "mesh", mesh = "3d_armor_stand.obj", inventory_image = "3d_armor_stand_item.png", From 3cfdb85926992d457e07db23dcd3384968bb602b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 01:07:41 +0100 Subject: [PATCH 070/379] New translation system, part 11: Redstone --- mods/ITEMS/REDSTONE/mcl_comparators/init.lua | 23 ++++++------- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 17 +++++----- mods/ITEMS/REDSTONE/mcl_droppers/init.lua | 12 ++++--- mods/ITEMS/REDSTONE/mcl_observers/init.lua | 8 +++-- .../REDSTONE/mesecons_commandblock/init.lua | 33 ++++++++----------- mods/ITEMS/REDSTONE/mesecons_delayer/init.lua | 16 +++++---- .../REDSTONE/mesecons_noteblock/init.lua | 20 ++++++----- mods/ITEMS/REDSTONE/mesecons_pistons/init.lua | 12 ++++--- .../REDSTONE/mesecons_pressureplates/init.lua | 22 +++++++------ .../REDSTONE/mesecons_solarpanel/init.lua | 14 ++++---- mods/ITEMS/REDSTONE/mesecons_torch/init.lua | 22 +++++++------ .../REDSTONE/mesecons_walllever/init.lua | 8 +++-- mods/ITEMS/REDSTONE/mesecons_wires/init.lua | 20 ++++++----- 13 files changed, 120 insertions(+), 107 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua index 1feb88898..bbd7410ef 100644 --- a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_comparators") + -- Functions that get the input/output rules of the comparator local comparator_get_output_rules = function(node) @@ -223,25 +225,20 @@ for _, state in pairs{mesecon.state.on, mesecon.state.off} do -- Help local longdesc, usagehelp, use_help if state_strs[state] == "off" and mode == "comp" then - longdesc = "Redstone comparators are multi-purpose redstone components. ".. - "They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals." + longdesc = S("Redstone comparators are multi-purpose redstone components.").."\n".. + S("They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.") - usagehelp = "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.".."\n".. - "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 chest) is placed in front of it and the container contains at least one item.".. - "The side inputs are only powered by normal redstone power.".. - "The redstone can operate in two modes: Transmission mode and subtraction mode. It ".. - "starts in transmission mode and the mode can be changed by a rightclick.".."\n\n".. - "Transmission mode:".. - "The 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.".."\n".. - "Subtraction mode:".. - "The 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." + usagehelp = S("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.").."\n".. + S("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.").."\n".. + S("The side inputs are only powered by normal redstone power. The redstone can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by a rightclick.").."\n\n".. + S("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.").."\n".. + S("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.") else use_help = false end local nodedef = { - description = "Redstone Comparator", + description = S("Redstone Comparator"), inventory_image = icon, wield_image = icon, _doc_items_create_entry = use_help, diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 2c3c6b789..d24fc858f 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -7,6 +7,7 @@ All node definitions share a lot of code, so this is the reason why there are so many weird tables below. ]] +local S = minetest.get_translator("mcl_dispensers") -- For after_place_node local setup_dispenser = function(pos) @@ -281,13 +282,13 @@ local dispenserdef = { -- Horizontal dispenser local horizontal_def = table.copy(dispenserdef) -horizontal_def.description = "Dispenser" -horizontal_def._doc_items_longdesc = "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." -horizontal_def._doc_items_usagehelp = [[Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Rightclick the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a single random item. +horizontal_def.description = S("Dispenser") +horizontal_def._doc_items_longdesc = S("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.") +horizontal_def._doc_items_usagehelp = S("Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Rightclick the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a single random item.").."\n\n".. -The dispenser will do different things, depending on the dispensed item: +S("The dispenser will do different things, depending on the dispensed item:").."\n\n".. -• Arrows: Are launched +S([[• Arrows: Are launched • Eggs and snowballs: Are thrown • Fire charges: Are fired in a straight line • Armor: Will be equipped to players and armor stands @@ -301,7 +302,7 @@ The dispenser will do different things, depending on the dispensed item: • TNT: Is placed and ignited • Flint and steel: Is used to ignite a fire in air and to ignite TNT • Spawn eggs: Will summon the mob they contain -• Other items: Are simply dropped]] +• Other items: Are simply dropped]]) horizontal_def.after_place_node = function(pos, placer, itemstack, pointed_thing) setup_dispenser(pos) @@ -319,7 +320,7 @@ minetest.register_node("mcl_dispensers:dispenser", horizontal_def) -- Down dispenser local down_def = table.copy(dispenserdef) -down_def.description = "Downwards-Facing Dispenser" +down_def.description = S("Downwards-Facing Dispenser") down_def.after_place_node = setup_dispenser down_def.tiles = { "default_furnace_top.png", "mcl_dispensers_dispenser_front_vertical.png", @@ -334,7 +335,7 @@ minetest.register_node("mcl_dispensers:dispenser_down", down_def) -- Up dispenser -- The up dispenser is almost identical to the down dispenser , it only differs in textures local up_def = table.copy(down_def) -up_def.description = "Upwards-Facing Dispenser" +up_def.description = S("Upwards-Facing Dispenser") up_def.tiles = { "mcl_dispensers_dispenser_front_vertical.png", "default_furnace_bottom.png", "default_furnace_side.png", "default_furnace_side.png", diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua index be42e79a4..e53313aaa 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua @@ -8,6 +8,8 @@ All node definitions share a lot of code, so this is the reason why there are so many weird tables below. ]] +local S = minetest.get_translator("mcl_droppers") + -- For after_place_node local setup_dropper = function(pos) -- Set formspec and inventory @@ -144,9 +146,9 @@ local dropperdef = { -- Horizontal dropper local horizontal_def = table.copy(dropperdef) -horizontal_def.description = "Dropper" -horizontal_def._doc_items_longdesc = "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." -horizontal_def._doc_items_usagehelp = "Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Rightclick the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item." +horizontal_def.description = S("Dropper") +horizontal_def._doc_items_longdesc = S("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.") +horizontal_def._doc_items_usagehelp = S("Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Rightclick the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.") horizontal_def.after_place_node = function(pos, placer, itemstack, pointed_thing) setup_dropper(pos) orientate_dropper(pos, placer) @@ -163,7 +165,7 @@ minetest.register_node("mcl_droppers:dropper", horizontal_def) -- Down dropper local down_def = table.copy(dropperdef) -down_def.description = "Downwards-Facing Dropper" +down_def.description = S("Downwards-Facing Dropper") down_def.after_place_node = setup_dropper down_def.tiles = { "default_furnace_top.png", "mcl_droppers_dropper_front_vertical.png", @@ -178,7 +180,7 @@ minetest.register_node("mcl_droppers:dropper_down", down_def) -- Up dropper -- The up dropper is almost identical to the down dropper, it only differs in textures local up_def = table.copy(down_def) -up_def.description = "Upwards-Facing Dropper" +up_def.description = S("Upwards-Facing Dropper") up_def.tiles = { "mcl_droppers_dropper_front_vertical.png", "default_furnace_bottom.png", "default_furnace_side.png", "default_furnace_side.png", diff --git a/mods/ITEMS/REDSTONE/mcl_observers/init.lua b/mods/ITEMS/REDSTONE/mcl_observers/init.lua index 0017d461f..af230d80d 100644 --- a/mods/ITEMS/REDSTONE/mcl_observers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_observers/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_observers") + local rules_flat = { { x = 0, y = 0, z = -1, spread = true }, } @@ -84,9 +86,9 @@ mesecon.register_node("mcl_observers:observer", _mcl_hardness = 3.5, }, { - description = "Observer", - _doc_items_longdesc = "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.", - _doc_items_usagehelp = "Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow shows you the side of the output, which is at the opposite side of the “face”. The arrow points to it. You need to place your redstone wire or any other component you want to power here.", + description = S("Observer"), + _doc_items_longdesc = S("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."), + _doc_items_usagehelp = S("Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow shows you the side of the output, which is at the opposite side of the “face”. The arrow points to it. You need to place your redstone wire or any other component you want to power here."), groups = {pickaxey=1, material_stone=1, not_opaque=1, }, tiles = { "mcl_observers_observer_top.png^[transformR180", "default_furnace_bottom.png", diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index acb1a9d00..0b2cbaac6 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -1,3 +1,4 @@ +local S = minetest.get_translator("mesecons_commandblock") local function construct(pos) local meta = minetest.get_meta(pos) @@ -183,33 +184,27 @@ local on_place = function(itemstack, placer, pointed_thing) end minetest.register_node("mesecons_commandblock:commandblock_off", { - description = "Command Block", + description = S("Command Block"), _doc_items_longdesc = -"Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power.", +S("Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power."), _doc_items_usagehelp = -[[To use an already existing command block, just supply it with redstone power and see what happens. This will execute the commands once. To execute the commands again, turn the redstone power off and on again. +S("To use an already existing command block, just supply it with redstone power and see what happens. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.").."\n\n".. -To place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Rightclick the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how they work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom. +S("To place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Rightclick the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how they work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.").."\n\n".. -All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block. +S("All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.").."\n\n".. -Command blocks support placeholders, insert one of these placerholders and they will be replaced by a player name: -• “@c”: commander of this command block -• “@n” or “@p”: nearest player from the command block -• “@f” farthest player from the command block -• “@r”: random player currently in the world -• “@@”: literal “@” sign +S("Command blocks support placeholders, insert one of these placerholders and they will be replaced by a player name:").."\n".. +S("• “@c”: commander of this command block").."\n".. +S("• “@n” or “@p”: nearest player from the command block").."\n".. +S("• “@f” farthest player from the command block").."\n".. +S("• “@r”: random player currently in the world").."\n".. +S("• “@@”: literal “@” sign").."\n\n".. -Example 1: - time 12000 +S("Example 1:\n time 12000\nSets the game clock to 12:00").."\n\n".. -Sets the game clock to 12:00 - -Example 2: - give @n mcl_core:apple 5 - -→ Gives the nearest player 5 apples]], +S("Example 2:\n give @n mcl_core:apple 5\n→ Gives the nearest player 5 apples"), tiles = {{name="jeija_commandblock_off.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=2}}}, groups = {creative_breakable=1, mesecon_effector_off=1}, diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua b/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua index a17dd7f5a..504314c1b 100644 --- a/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mesecons_delayer") + local DELAYS = { 0.1, 0.2, 0.3, 0.4 } local DEFAULT_DELAY = DELAYS[1] @@ -182,9 +184,9 @@ end local help, longdesc, usagehelp, icon, on_construct if i == 1 then help = true - longdesc = "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." - usagehelp = "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, rightclick 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.".."\n".. - "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." + longdesc = S("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.") + usagehelp = S("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, rightclick 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.").."\n".. + S("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.") icon = "mesecons_delayer_item.png" -- Check sides of constructed repeater and lock it, if required @@ -219,7 +221,7 @@ else end minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), { - description = "Redstone Repeater", + description = S("Redstone Repeater"), inventory_image = icon, wield_image = icon, _doc_items_create_entry = help, @@ -292,7 +294,7 @@ minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), { minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), { - description = "Redstone Repeater (Powered)", + description = S("Redstone Repeater (Powered)"), _doc_items_create_entry = false, drawtype = "nodebox", tiles = { @@ -366,7 +368,7 @@ end -- Locked repeater minetest.register_node("mesecons_delayer:delayer_off_locked", { - description = "Redstone Repeater (Locked)", + description = S("Redstone Repeater (Locked)"), _doc_items_create_entry = false, drawtype = "nodebox", -- FIXME: Textures of torch and the lock bar overlap. Nodeboxes are (sadly) not suitable for this. @@ -420,7 +422,7 @@ minetest.register_node("mesecons_delayer:delayer_off_locked", { }) minetest.register_node("mesecons_delayer:delayer_on_locked", { - description = "Redstone Repeater (Locked, Powered)", + description = S("Redstone Repeater (Locked, Powered)"), _doc_items_create_entry = false, drawtype = "nodebox", tiles = { diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua index 9d1737ac6..a6b59df91 100644 --- a/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua @@ -1,15 +1,17 @@ +local S = minetest.get_translator("mesecons_noteblock") + minetest.register_node("mesecons_noteblock:noteblock", { - description = "Note Block", - _doc_items_longdesc = "A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power.", - _doc_items_usagehelp = [[Rightclick the note block to choose the next musical note (there are 24 half notes, or 2 octaves). The intrument played depends on the material of the block below the note block: + description = S("Note Block"), + _doc_items_longdesc = S("A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power."), + _doc_items_usagehelp = S("Rightclick the note block to choose the next musical note (there are 24 half notes, or 2 octaves). The intrument played depends on the material of the block below the note block:").."\n\n".. -• Glass: Sticks -• Wood: Bass guitar -• Stone: Bass drum -• Sand or gravel: Snare drum -• Anything else: Piano +S("• Glass: Sticks").."\n".. +S("• Wood: Bass guitar").."\n".. +S("• Stone: Bass drum").."\n".. +S("• Sand or gravel: Snare drum").."\n".. +S("• Anything else: Piano").."\n\n".. -The note block will only play a note when it is below air, otherwise, it stays silent.]], +S("The note block will only play a note when it is below air, otherwise, it stays silent."), tiles = {"mesecons_noteblock.png"}, groups = {handy=1,axey=1, material_wood=1}, is_ground_content = false, diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua b/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua index 8c290a50b..9c8181653 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mesecons_pistons") + local PISTON_MAXIMUM_PUSH = 12 -- Get mesecon rules of pistons @@ -171,7 +173,7 @@ local pistonspec_normal = { piston_up = "mesecons_pistons:piston_up_normal_off", } -local usagehelp_piston = "This block can have one of 6 possible orientations. On placement, the pusher will face you." +local usagehelp_piston = S("This block can have one of 6 possible orientations. On placement, the pusher will face you.") local on_rotate if minetest.get_modpath("screwdriver") then @@ -180,8 +182,8 @@ end -- offstate minetest.register_node("mesecons_pistons:piston_normal_off", { - description = "Piston", - _doc_items_longdesc = "A piston is a redstone component with a pusher which pushes the block or blocks in front of it when it is supplied with redstone power. Not all blocks can be pushed, however.", + description = S("Piston"), + _doc_items_longdesc = S("A piston is a redstone component with a pusher which pushes the block or blocks in front of it when it is supplied with redstone power. Not all blocks can be pushed, however."), _doc_items_usagehelp = usagehelp_piston, tiles = { "mesecons_piston_bottom.png^[transformR180", @@ -275,8 +277,8 @@ local pistonspec_sticky = { -- offstate minetest.register_node("mesecons_pistons:piston_sticky_off", { - description = "Sticky Piston", - _doc_items_longdesc = "A sticky piston is a redstone component with a sticky pusher which can be extended and retracted. It extends when it is supplied with redstone power. When the pusher extends, it pushes the block or blocks in front of it. When it retracts, it pulls back the single block in front of it. Note that not all blocks can be pushed or pulled.", + description = S("Sticky Piston"), + _doc_items_longdesc = S("A sticky piston is a redstone component with a sticky pusher which can be extended and retracted. It extends when it is supplied with redstone power. When the pusher extends, it pushes the block or blocks in front of it. When it retracts, it pulls back the single block in front of it. Note that not all blocks can be pushed or pulled."), _doc_items_usagehelp = usagehelp_piston, tiles = { diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua b/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua index 395c5130b..6148c7009 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mesecons_pressureplates") + local PRESSURE_PLATE_INTERVAL = 0.04 local pp_box_off = { @@ -95,7 +97,7 @@ function mesecon.register_pressure_plate(basename, description, textures_off, te groups_on.not_in_creative_inventory = 1 groups_on.pressure_plate = 2 if not longdesc then - longdesc = "A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it." + longdesc = S("A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it.") end mesecon.register_node(basename, { @@ -144,12 +146,12 @@ function mesecon.register_pressure_plate(basename, description, textures_off, te end local woods = { - { "wood", "mcl_core:wood", "default_wood.png", "Oak Pressure Plate" }, - { "acaciawood", "mcl_core:acaciawood", "default_acacia_wood.png", "Acacia Pressure Plate" }, - { "birchwood", "mcl_core:birchwood", "mcl_core_planks_birch.png", "Birch Pressure Plate" }, - { "darkwood", "mcl_core:darkwood", "mcl_core_planks_big_oak.png", "Dark Oak Pressure Plate" }, - { "sprucewood", "mcl_core:sprucewood", "mcl_core_planks_spruce.png", "Spruce Pressure Plate" }, - { "junglewood", "mcl_core:junglewood", "default_junglewood.png", "Jungle Pressure Plate" }, + { "wood", "mcl_core:wood", "default_wood.png", S("Oak Pressure Plate") }, + { "acaciawood", "mcl_core:acaciawood", "default_acacia_wood.png", S("Acacia Pressure Plate") }, + { "birchwood", "mcl_core:birchwood", "mcl_core_planks_birch.png", S("Birch Pressure Plate") }, + { "darkwood", "mcl_core:darkwood", "mcl_core_planks_big_oak.png", S("Dark Oak Pressure Plate" )}, + { "sprucewood", "mcl_core:sprucewood", "mcl_core_planks_spruce.png", S("Spruce Pressure Plate") }, + { "junglewood", "mcl_core:junglewood", "default_junglewood.png", S("Jungle Pressure Plate") }, } for w=1, #woods do @@ -164,7 +166,7 @@ for w=1, #woods do mcl_sounds.node_sound_wood_defaults(), {axey=1, material_wood=1}, nil, - "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.") + S("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.")) minetest.register_craft({ type = "fuel", @@ -176,7 +178,7 @@ end mesecon.register_pressure_plate( "mesecons_pressureplates:pressure_plate_stone", - "Stone Pressure Plate", + S("Stone Pressure Plate"), {"default_stone.png"}, {"default_stone.png"}, "default_stone.png", @@ -185,6 +187,6 @@ mesecon.register_pressure_plate( mcl_sounds.node_sound_stone_defaults(), {pickaxey=1, material_stone=1}, { player = true, mob = true }, - "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.") + S("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.")) diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua index 0bd0b737a..d71f0cdd7 100644 --- a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mesecons_solarpanel") + local boxes = { -8/16, -8/16, -8/16, 8/16, -2/16, 8/16 } -- Daylight Sensor @@ -18,7 +20,7 @@ minetest.register_node("mesecons_solarpanel:solar_panel_on", { fixed = boxes }, drop = "mesecons_solarpanel:solar_panel_off", - description="Daylight Sensor", + description=S("Daylight Sensor"), _doc_items_create_entry = false, groups = {handy=1,axey=1, not_in_creative_inventory = 1, material_wood=1}, sounds = mcl_sounds.node_sound_glass_defaults(), @@ -56,8 +58,8 @@ minetest.register_node("mesecons_solarpanel:solar_panel_off", { fixed = boxes }, groups = {handy=1,axey=1, material_wood=1}, - description="Daylight Sensor", - _doc_items_longdesc = "Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.", + description=S("Daylight Sensor"), + _doc_items_longdesc = S("Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted."), _doc_items_usagehelp = "Rightclick the daylight sensor to turn it into an inverted daylight sensor, which supplies redstone energy when it is in moonlight.", sounds = mcl_sounds.node_sound_glass_defaults(), mesecons = {receptor = { @@ -136,7 +138,7 @@ minetest.register_node("mesecons_solarpanel:solar_panel_inverted_on", { }, drop = "mesecons_solarpanel:solar_panel_off", groups = {handy=1,axey=1, not_in_creative_inventory = 1, material_wood=1}, - description="Inverted Daylight Sensor", + description=S("Inverted Daylight Sensor"), _doc_items_create_entry = false, sounds = mcl_sounds.node_sound_glass_defaults(), mesecons = {receptor = { @@ -174,8 +176,8 @@ minetest.register_node("mesecons_solarpanel:solar_panel_inverted_off", { }, drop = "mesecons_solarpanel:solar_panel_off", groups = {handy=1,axey=1, not_in_creative_inventory=1, material_wood=1}, - description="Inverted Daylight Sensor", - _doc_items_longdesc = "An inverted daylight sensor is a variant of the daylight sensor. It is a redstone component which provides redstone power when it in moonlight and no power otherwise. It can turned back into an ordinary daylight sensor.", + description=S("Inverted Daylight Sensor"), + _doc_items_longdesc = S("An inverted daylight sensor is a variant of the daylight sensor. It is a redstone component which provides redstone power when it in moonlight and no power otherwise. It can turned back into an ordinary daylight sensor."), _doc_items_usagehelp = "Rightclick the daylight sensor to turn it into a daylight sensor.", sounds = mcl_sounds.node_sound_glass_defaults(), mesecons = {receptor = { diff --git a/mods/ITEMS/REDSTONE/mesecons_torch/init.lua b/mods/ITEMS/REDSTONE/mesecons_torch/init.lua index 48c593c44..17b45e205 100644 --- a/mods/ITEMS/REDSTONE/mesecons_torch/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_torch/init.lua @@ -1,4 +1,6 @@ --- REDSTONE TORCHES +-- REDSTONE TORCH AND BLOCK OF REDSTONE + +local S = minetest.get_translator("mesecons_torch") local TORCH_COOLOFF = 120 -- Number of seconds it takes for a burned-out torch to reactivate @@ -164,13 +166,13 @@ mcl_torches.register_torch("mesecon_torch_overheated", "Redstone Torch (overheat -mcl_torches.register_torch("mesecon_torch_on", "Redstone Torch", - "A redstone torch is a redstone component which can be used to invert a redstone signal. It supplies its surrounding blocks with redstone power, except for the block it is attached to. A redstone torch is normally lit, but it can also be turned off by powering the block it is attached to. While unlit, a redstone torch does not power anything.", - [[Redstone torches can generally be placed at the side and on the top of full solid opaque blocks. The following exceptions apply: -• Glass, fence, wall, hopper: Can only be placed on top -• Upside-down slab/stair: Can only be placed on top -• Soul sand, mob spawner: Placement possible -• Glowstone and pistons: No placement possible]], +mcl_torches.register_torch("mesecon_torch_on", S("Redstone Torch"), + S("A redstone torch is a redstone component which can be used to invert a redstone signal. It supplies its surrounding blocks with redstone power, except for the block it is attached to. A redstone torch is normally lit, but it can also be turned off by powering the block it is attached to. While unlit, a redstone torch does not power anything."), + S("Redstone torches can generally be placed at the side and on the top of full solid opaque blocks. The following exceptions apply:").."\n".. +S("• Glass, fence, wall, hopper: Can only be placed on top").. +S("• Upside-down slab/stair: Can only be placed on top").. +S("• Soul sand, mob spawner: Placement possible").. +S("• Glowstone and pistons: No placement possible"), "jeija_torches_on.png", "mcl_torches_torch_floor.obj", "mcl_torches_torch_wall.obj", {"jeija_torches_on.png"}, @@ -193,8 +195,8 @@ mcl_torches.register_torch("mesecon_torch_on", "Redstone Torch", ) minetest.register_node("mesecons_torch:redstoneblock", { - description = "Block of Redstone", - _doc_items_longdesc = "A block of redstone permanently supplies redstone power to its surrounding blocks.", + description = S("Block of Redstone"), + _doc_items_longdesc = S("A block of redstone permanently supplies redstone power to its surrounding blocks."), tiles = {"redstone_redstone_block.png"}, stack_max = 64, groups = {pickaxey=1}, diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/init.lua b/mods/ITEMS/REDSTONE/mesecons_walllever/init.lua index 9db4fe743..5f8dbd490 100644 --- a/mods/ITEMS/REDSTONE/mesecons_walllever/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mesecons_wallever") + local lever_get_output_rules = mesecon.rules.buttonlike_get -- LEVER @@ -20,8 +22,8 @@ minetest.register_node("mesecons_walllever:wall_lever_off", { }, groups = {handy=1, dig_by_water=1, destroy_by_lava_flow=1, dig_by_piston=1, attached_node_facedir=1}, is_ground_content = false, - description="Lever", - _doc_items_longdesc = "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.", + description=S("Lever"), + _doc_items_longdesc = S("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."), _doc_items_usagehelp = "Right-click the lever to flip it on or off.", on_rightclick = function (pos, node) minetest.swap_node(pos, {name="mesecons_walllever:wall_lever_on", param2=node.param2}) @@ -122,7 +124,7 @@ minetest.register_node("mesecons_walllever:wall_lever_on", { groups = {handy=1, not_in_creative_inventory = 1, dig_by_water=1, destroy_by_lava_flow=1, dig_by_piston=1, attached_node_facedir=1}, is_ground_content = false, drop = '"mesecons_walllever:wall_lever_off" 1', - description="Lever", + description=S("Lever"), _doc_items_create_entry = false, on_rightclick = function (pos, node) minetest.swap_node(pos, {name="mesecons_walllever:wall_lever_off", param2=node.param2}) diff --git a/mods/ITEMS/REDSTONE/mesecons_wires/init.lua b/mods/ITEMS/REDSTONE/mesecons_wires/init.lua index 01bf6bbbb..49f048a1b 100644 --- a/mods/ITEMS/REDSTONE/mesecons_wires/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_wires/init.lua @@ -4,6 +4,8 @@ -- Where 0 means the wire has no visual connection to that direction and -- 1 means that the wire visually connects to that other node. +local S = minetest.get_translator("mesecons_wires") + -- ####################### -- ## Update wire looks ## -- ####################### @@ -223,23 +225,23 @@ local function register_wires() tiles_off = { dot_off, dot_off, "blank.png", "blank.png", "blank.png", "blank.png" } tiles_on = { dot_on, dot_on, "blank.png", "blank.png", "blank.png", "blank.png" } - longdesc = [[Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on the ground as a trail. -A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components. -Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.]] - usagehelp = [[Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills. An easy way to power a redstone trail is by placing a redstone torch. + longdesc = S("Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on the ground as a trail.").."\n".. +S("A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components.").."\n".. +S("Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.") + usagehelp = S("Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills. An easy way to power a redstone trail is by placing a redstone torch.").."\n\n".. -Read the help entries on the other redstone components to learn how redstone components interact.]] +S("Read the help entries on the other redstone components to learn how redstone components interact.") img = "redstone_redstone_dust.png" - desc_off = "Redstone" - desc_on = "Powered Redstone Spot ("..nodeid..")" + desc_off = S("Redstone") + desc_on = S("Powered Redstone Spot (@1)", nodeid) else -- Connected redstone wire table.insert(nodebox, box_center) tiles_off = { crossing_off, crossing_off, straight0_off, straight1_off, straight0_off, straight1_off, } tiles_on = { crossing_on, crossing_on, straight0_on, straight1_on, straight0_on, straight1_on, } wirehelp = false - desc_off = "Redstone Trail ("..nodeid..")" - desc_on = "Powered Redstone Trail ("..nodeid..")" + desc_off = S("Redstone Trail (@1)", nodeid) + desc_on = S("Powered Redstone Trail (@1)", nodeid) end mesecon.register_node(":mesecons:wire_"..nodeid, { From 2e738a39a4ef39e34a25cf68039ef4a0ca2de662 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 01:59:45 +0100 Subject: [PATCH 071/379] Disable radar mode in survival --- mods/HELP/mcl_doc_basics/init.lua | 6 +++--- mods/ITEMS/mcl_maps/init.lua | 13 +++++++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/mods/HELP/mcl_doc_basics/init.lua b/mods/HELP/mcl_doc_basics/init.lua index be4f4ae22..7b30533e2 100644 --- a/mods/HELP/mcl_doc_basics/init.lua +++ b/mods/HELP/mcl_doc_basics/init.lua @@ -430,11 +430,11 @@ S("There are 2 minimap modes and 3 zoom levels.").."\n\n".. S("Surface mode (image 1) is a top-down view of the world, roughly resembling the colors of the blocks this world is made of. It only shows the topmost blocks, everything below is hidden, like a satellite photo. Surface mode is useful if you got lost.").."\n\n".. -S("Radar mode (image 2) is more complicated. It displays the “denseness” of the area around you and changes with your height. Roughly, the more green an area is, the less “dense” it is. Black areas have many blocks. Use the radar to find caverns, hidden areas, walls and more. The rectangular shapes in image 2 clearly expose the position of a dungeon.").."\n\n".. +S("Radar mode (image 2) is more complicated. It displays the “denseness” of the area around you and changes with your height. Roughly, the more green an area is, the less “dense” it is. Black areas have many blocks. Use the radar to find caverns, hidden areas, walls and more. The rectangular shapes in image 2 clearly expose the position of a dungeon. Radar mode is only available in Creative Mode").."\n\n".. S("There are also two different rotation modes. In “square mode”, the rotation of the minimap is fixed. If you press [Shift]+[F9] to switch to “circle mode”, the minimap will instead rotate with your looking direction, so “up” is always your looking direction.").."\n\n".. -S("In some games, the minimap may be disabled.").."\n\n".. +S("In other games, the minimap may be disabled.").."\n\n".. S("• Toggle minimap mode: [F9]").."\n".. S("• Toggle minimap rotation mode: [Shift]+[F9]"), @@ -767,7 +767,7 @@ S("• Mined blocks don't drop items").."\n".. S("• Items don't get used up").."\n".. S("• Tools don't wear off").."\n".. S("• You can eat food whenever you want").."\n".. -S("• You can always use the minimap").."\n\n".. +S("• You can always use the minimap (including radar mode)").."\n\n".. S("Damage is not affected by Creative Mode, it needs to be disabled seperately.") }}) diff --git a/mods/ITEMS/mcl_maps/init.lua b/mods/ITEMS/mcl_maps/init.lua index dbe270221..e48ae58a4 100644 --- a/mods/ITEMS/mcl_maps/init.lua +++ b/mods/ITEMS/mcl_maps/init.lua @@ -34,7 +34,7 @@ minetest.register_craftitem("mcl_maps:empty_map", { -- has a very greatly zoomed-out version and even a radar mode minetest.register_craftitem("mcl_maps:filled_map", { description = S("Map"), - _doc_items_longdesc = S("Maps show your surroundings as you explore the world. They can even show you the world like a radar. MAGIC!\nNote: Maps are subject to change in future versions of MineClone 2."), + _doc_items_longdesc = S("Maps show your surroundings as you explore the world."), _doc_items_usagehelp = S("Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key ([F9] by default).\nIn Creative Mode, you don't need this item; the minimap is always available."), groups = { tool = 1 }, inventory_image = "mcl_maps_map_filled.png^(mcl_maps_map_filled_markings.png^[colorize:#000000)", @@ -64,10 +64,15 @@ end -- Checks if player is still allowed to display the minimap local function update_minimap(player) - if minetest.settings:get_bool("creative_mode") or has_item_in_hotbar(player, "mcl_maps:filled_map") then - player:hud_set_flags({minimap = true}) + local creative = minetest.settings:get_bool("creative_mode") + if creative then + player:hud_set_flags({minimap=true, minimap_radar = true}) else - player:hud_set_flags({minimap = false}) + if has_item_in_hotbar(player, "mcl_maps:filled_map") then + player:hud_set_flags({minimap = true, minimap_radar = false}) + else + player:hud_set_flags({minimap = false, minimap_radar = false}) + end end end From fed10e688e0d7e64bbee7055aa564f2ec3d4ec76 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 03:05:27 +0100 Subject: [PATCH 072/379] Tweak water/lava drips --- mods/ENTITIES/drippingwater/init.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/drippingwater/init.lua b/mods/ENTITIES/drippingwater/init.lua index efa37fd2a..cd8746e46 100644 --- a/mods/ENTITIES/drippingwater/init.lua +++ b/mods/ENTITIES/drippingwater/init.lua @@ -12,7 +12,7 @@ minetest.register_entity("drippingwater:drop_water", { hp_max = 1, physical = true, collide_with_objects = false, - collisionbox = {0,0,0,0,0,0}, + collisionbox = {-0.025,-0.05,-0.025,0.025,-0.01,0.025}, pointable = false, visual = "cube", visual_size = {x=0.05, y=0.1}, @@ -51,7 +51,9 @@ minetest.register_entity("drippingwater:drop_lava", { hp_max = 1, physical = true, collide_with_objects = false, - collisionbox = {0,0,0,0,0,0}, + collisionbox = {-0.025,-0.05,-0.025,0.025,-0.01,0.025}, + glow = math.max(7, minetest.registered_nodes["mcl_core:lava_source"].light_source - 3), + pointable = false, visual = "cube", visual_size = {x=0.05, y=0.1}, textures = {lava_tex, lava_tex, lava_tex, lava_tex, lava_tex, lava_tex}, From f7d9aea529c658799f65105eb2c984c2615df0a8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 03:40:46 +0100 Subject: [PATCH 073/379] Make blazes glow in the dark --- mods/ENTITIES/mcl_mobs/api.lua | 1 + mods/ENTITIES/mcl_mobs/api.txt | 1 + mods/ENTITIES/mobs_mc/blaze.lua | 1 + mods/ITEMS/mcl_tnt/init.lua | 2 +- 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 3c2d61bd8..dfc4c7733 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -3087,6 +3087,7 @@ minetest.register_entity(name, { -- MCL2 extensions ignores_nametag = def.ignores_nametag or false, rain_damage = def.rain_damage or 0, + glow = def.glow, can_despawn = can_despawn, on_spawn = def.on_spawn, diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 157370d0f..5baab263e 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -215,6 +215,7 @@ functions needed for the mob to work properly which contains the following: are in direct sunlight 'spawn_small_alternative': name of a smaller mob to use as replacement if spawning fails due to space requirements + 'glow' same as in entity definition Node Replacement ---------------- diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 34ee630fc..21e752a35 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -67,6 +67,7 @@ mobs:register_mob("mobs_mc:blaze", { jump_chance = 98, fear_height = 120, blood_amount = 0, + glow = 14, }) mobs:spawn_specific("mobs_mc:blaze", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 5000, 3, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) diff --git a/mods/ITEMS/mcl_tnt/init.lua b/mods/ITEMS/mcl_tnt/init.lua index c3bc2d935..f18f64b5d 100644 --- a/mods/ITEMS/mcl_tnt/init.lua +++ b/mods/ITEMS/mcl_tnt/init.lua @@ -32,7 +32,7 @@ local function do_tnt_physics(tnt_np,tntr) local damage = (4 / dist) * tntr if obj:is_player() == true then if mod_death_messages then - mcl_death_messages.player_damage(obj, string.format("%s was caught in an explosion.", obj:get_player_name())) + mcl_death_messages.player_damage(obj, S("@1 was caught in an explosion.", obj:get_player_name())) end end obj:set_hp(obj:get_hp() - damage) From f40eeb4477a505682d924003955bfea71676aad9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 03:47:14 +0100 Subject: [PATCH 074/379] Make barrier particles glow in the dark --- mods/ITEMS/mcl_core/nodes_misc.lua | 1 + mods/PLAYER/mcl_playerplus/init.lua | 1 + 2 files changed, 2 insertions(+) diff --git a/mods/ITEMS/mcl_core/nodes_misc.lua b/mods/ITEMS/mcl_core/nodes_misc.lua index 7c6f7dc7e..3eb402744 100644 --- a/mods/ITEMS/mcl_core/nodes_misc.lua +++ b/mods/ITEMS/mcl_core/nodes_misc.lua @@ -138,6 +138,7 @@ minetest.register_node("mcl_core:barrier", { expirationtime = 1, size = 8, texture = "mcl_core_barrier.png", + glow = 14, playername = placer:get_player_name() }) end, diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 17074ea98..ea232129c 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -208,6 +208,7 @@ minetest.register_globalstep(function(dtime) expirationtime = 1, size = 8, texture = tex, + glow = 14, playername = name }) end From daed3059bf3f59fc386fc8a7435c7928b6f8e240 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 04:42:24 +0100 Subject: [PATCH 075/379] Predict water when digging ice --- mods/ITEMS/mcl_core/nodes_base.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index decdda0dc..f76a7f86f 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -788,6 +788,7 @@ minetest.register_node("mcl_core:ice", { groups = {handy=1,pickaxey=1, slippery=3, building_block=1}, drop = "", sounds = mcl_sounds.node_sound_glass_defaults(), + node_dig_prediction = "mcl_core:water_source", after_dig_node = function(pos, oldnode) -- Create a water source if ice is destroyed and there was something below it local below = {x=pos.x, y=pos.y-1, z=pos.z} From 9057743eb852dad7d615ad165a784534de0bd93a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 05:12:31 +0100 Subject: [PATCH 076/379] Tweak spawning algorithm --- mods/PLAYER/mcl_spawn/init.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index 746beeb84..b8f3f0869 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -20,10 +20,17 @@ mcl_spawn.get_spawn_pos = function(player) spawn = minetest.setting_get_pos("static_spawnpoint") custom_spawn = false end + -- We are getting desperate ... + -- Use the first spawn point of the player if not spawn or spawn == "" then local attr = player:get_meta():get_string("mcl_spawn:first_spawn") if attr ~= nil and attr ~= "" then + -- Adjust Y spawn = minetest.string_to_pos(attr) + local y = minetest.get_spawn_level(spawn.x, spawn.z) + if y then + spawn.y = y + end custom_spawn = false end end From db8d7af245a20088d23d3496e912d2eccc8b08c8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 19:09:40 +0100 Subject: [PATCH 077/379] Fix lightning dealing way too much damage --- mods/ENVIRONMENT/lightning/init.lua | 99 ++++++++++++++--------------- 1 file changed, 47 insertions(+), 52 deletions(-) diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 527bfa860..0d0b7d1e0 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -121,10 +121,51 @@ lightning.strike = function(pos) minetest.sound_play({ pos = pos, name = "lightning_thunder", gain = 10, max_hear_distance = 500 }) - -- damage nearby objects, player or not - for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 5)) do - -- nil as param#1 is supposed to work, but core can't handle it. - obj:punch(obj, 1.0, {full_punch_interval = 1.0, damage_groups = {fleshy=8}}, nil) + -- damage nearby objects, transform mobs + local objs = minetest.get_objects_inside_radius(pos2, 3.5) + for o=1, #objs do + local obj = objs[o] + local lua = obj:get_luaentity() + if obj:is_player() then + -- Player damage + if minetest.get_modpath("mcl_death_messages") then + mcl_death_messages.player_damage(obj, S("@1 was struck by lightning.", obj:get_player_name())) + end + obj:set_hp(obj:get_hp()-5) + -- Mobs + elseif lua and lua._cmi_is_mob then + -- pig → zombie pigman (no damage) + if lua.name == "mobs_mc:pig" then + local rot = obj:get_yaw() + obj:remove() + obj = minetest.add_entity(pos2, "mobs_mc:pigman") + obj:set_yaw(rot) + -- mooshroom: toggle color red/brown (no damage) + elseif lua.name == "mobs_mc:mooshroom" then + if lua.base_texture[1] == "mobs_mc_mooshroom.png" then + lua.base_texture = { "mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } + else + lua.base_texture = { "mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png" } + end + obj:set_properties({textures = lua.base_texture}) + -- villager → witch (no damage) + elseif lua.name == "mobs_mc:villager" then + -- Witches are incomplete, this code is unused + -- TODO: Enable this code when witches are working. + --[[ + local rot = obj:get_yaw() + obj:remove() + obj = minetest.add_entity(pos2, "mobs_mc:witch") + obj:set_yaw(rot) + ]] + -- TODO: creeper → charged creeper (no damage) + elseif lua.name == "mobs_mc:creeper" then + + -- Other mobs: Just damage + else + obj:set_hp(obj:get_hp()-5, "lightning") + end + end end local playerlist = minetest.get_connected_players() @@ -168,58 +209,11 @@ lightning.strike = function(pos) angle = angle + (math.pi*2) / 3 end - -- Cause a fire, deal damage, transform mobs + -- Cause a fire else minetest.set_node(pos2, {name = "mcl_fire:fire"}) - - local objs = minetest.get_objects_inside_radius(pos2, 3.5) - for o=1, #objs do - local obj = objs[o] - local lua = obj:get_luaentity() - if obj:is_player() then - -- Player damage - if minetest.get_modpath("mcl_death_messages") then - mcl_death_messages.player_damage(obj, S("@1 was struck by lightning.", obj:get_player_name())) - end - obj:set_hp(obj:get_hp()-5) - -- Mobs - elseif lua and lua._cmi_is_mob then - -- pig → zombie pigman - if lua.name == "mobs_mc:pig" then - local rot = obj:get_yaw() - obj:remove() - obj = minetest.add_entity(pos2, "mobs_mc:pigman") - obj:set_yaw(rot) - -- mooshroom: toggle color red/brown - elseif lua.name == "mobs_mc:mooshroom" then - if lua.base_texture[1] == "mobs_mc_mooshroom.png" then - lua.base_texture = { "mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } - else - lua.base_texture = { "mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png" } - end - obj:set_properties({textures = lua.base_texture}) - -- villager → witch - elseif lua.name == "mobs_mc:villager" then - -- Witches are incomplete, this code is unused - -- TODO: Enable this code when witches are working. - --[[ - local rot = obj:get_yaw() - obj:remove() - obj = minetest.add_entity(pos2, "mobs_mc:witch") - obj:set_yaw(rot) - ]] - -- TODO: creeper → charged creeper - elseif lua.name == "mobs_mc:creeper" then - - -- Other mobs: Just Damage - else - obj:set_hp(obj:get_hp()-5) - end - end - end end end - -- TODO: Charged creeper end end @@ -261,3 +255,4 @@ minetest.register_chatcommand("lightning", { return true end, }) + From 20576431e183465adb67f405795dbd1d1e49d8a9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 20:22:01 +0100 Subject: [PATCH 078/379] More death messages, more reliable --- mods/ENTITIES/mobs_mc/ender_dragon.lua | 2 +- mods/ENTITIES/mobs_mc/wither.lua | 2 +- mods/HUD/mcl_death_messages/init.lua | 210 ++++++++++++------------- mods/ITEMS/mcl_nether/depends.txt | 2 +- mods/ITEMS/mcl_nether/init.lua | 6 +- mods/ITEMS/mcl_throwing/init.lua | 5 + mods/MISC/mcl_commands/depends.txt | 1 + mods/MISC/mcl_commands/init.lua | 20 ++- mods/PLAYER/mcl_hunger/depends.txt | 2 +- mods/PLAYER/mcl_hunger/hunger.lua | 7 + mods/PLAYER/mcl_hunger/init.lua | 13 +- mods/PLAYER/mcl_playerplus/init.lua | 6 +- 12 files changed, 148 insertions(+), 128 deletions(-) create mode 100644 mods/MISC/mcl_commands/depends.txt diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index 8bcd25416..dd81ab145 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -124,7 +124,7 @@ mobs:register_arrow("mobs_mc:roar_of_the_dragon2", { for _,obj in ipairs(objects) do local name = self.name if name~="mobs_mc:roar_of_the_dragon2" and name ~= "mobs_mc:enderdragon" then - obj:set_hp(obj:get_hp()-0.05) + obj:set_hp(obj:get_hp()-5) if (obj:get_hp() <= 0) then if (not obj:is_player()) and name ~= self.object:get_luaentity().name then obj:remove() diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index d61237a9d..a06510a94 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -94,7 +94,7 @@ mobs:register_arrow("mobs_mc:roar_of_the_dragon", { for _,obj in ipairs(objects) do local name = self.name if name~="mobs_mc:roar_of_the_dragon" and name ~= "mobs_mc:wither" then - obj:set_hp(obj:get_hp()-0.05) + obj:set_hp(obj:get_hp()-5) if (obj:get_hp() <= 0) then if (not obj:is_player()) and name ~= self.object:get_luaentity().name then obj:remove() diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index 302b1a670..85e51c84c 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -28,9 +28,6 @@ local msgs = { S("%s drowned."), S("%s ran out of oxygen."), }, - ["starve"] = { - S("%s starved."), - }, ["murder"] = { S("%s was killed by %s."), }, @@ -42,13 +39,13 @@ local msgs = { S("%s was killed by a fireball from a blaze."), }, ["fire_charge"] = { - S("%s was hit by a fire charge."), + S("%s was burned by a fire charge."), }, ["ghast_fireball"] = { S("A ghast scared %s to death."), S("%s has been fireballed by a ghast."), }, - ["fall_damage"] = { + ["fall"] = { S("%s fell from a high cliff."), S("%s took fatal fall damage."), S("%s fell victim to gravity."), @@ -117,132 +114,123 @@ end local last_damages = { } -minetest.register_on_dieplayer(function(player) +minetest.register_on_dieplayer(function(player, reason) -- Death message local message = minetest.settings:get_bool("mcl_showDeathMessages") - if message == nil then message = true end + if message == nil then + message = true + end if message then local name = player:get_player_name() if not name then return end - - local node = minetest.registered_nodes[minetest.get_node(player:get_pos()).name] local msg - -- Lava - if minetest.get_item_group(node.name, "lava") ~= 0 then - msg = dmsg("lava", name) - -- Drowning - elseif player:get_breath() == 0 then - msg = dmsg("drown", name) - -- Fire - elseif minetest.get_item_group(node.name, "fire") ~= 0 then - msg = dmsg("fire", name) - -- Other - else - -- Killed by entity - if last_damages[name] then - -- Mob - if last_damages[name].hittertype == "mob" then - if last_damages[name].hittername then - msg = dmsg("murder", name, last_damages[name].hittername) - else - msg = mmsg(last_damages[name].hittersubtype, name) - end - -- Player - elseif last_damages[name].hittertype == "player" then - if last_damages[name].hittername == name then - -- Workaround when player somehow punches self. Caused by creeper explosions in mobs mod. - -- FIXME: Remove when self-punching is no longer buggy. - msg = dmsg("other", name) - else - msg = dmsg("murder", name, last_damages[name].hittername) - end - -- Arrow - elseif last_damages[name].hittertype == "arrow" then - if last_damages[name].shooter == nil then - msg = dmsg("arrow", name) - elseif last_damages[name].shooter:is_player() then - msg = dmsg("arrow_name", name, last_damages[name].shooter:get_player_name()) - elseif last_damages[name].shooter:get_luaentity()._cmi_is_mob then - if last_damages[name].shooter:get_luaentity().nametag ~= "" then - msg = dmsg("arrow_name", name, last_damages[name].shooter:get_player_name()) - else - msg = dmsg("arrow", name) - end - else - msg = dmsg("arrow", name) - end - -- Fireball - elseif last_damages[name].hittertype == "blaze_fireball" then - msg = dmsg("blaze_fireball", name) - elseif last_damages[name].hittertype == "ghast_fireball" then - msg = dmsg("ghast_fireball", name) - elseif last_damages[name].hittertype == "fire_charge" then - msg = dmsg("fire_charge", name) - -- Custom death message - elseif last_damages[name].custom then - msg = last_damages[name].message + if reason.type == "node_damage" then + local pos = player:get_pos() + -- Check multiple nodes because players occupy multiple nodes + -- (we add one additional node because the check may fail if the player was + -- just barely touching the node with the head) + local posses = { pos, {x=pos.x,y=pos.y+1,z=pos.z}, {x=pos.x,y=pos.y+2,z=pos.z}} + for p=1, #posses do + local node = minetest.registered_nodes[minetest.get_node(posses[p]).name] + -- Lava + if minetest.get_item_group(node.name, "lava") ~= 0 then + msg = dmsg("lava", name) + break + -- Fire + elseif minetest.get_item_group(node.name, "fire") ~= 0 then + msg = dmsg("fire", name) + break end - -- Other reason - else - msg = dmsg("other", name) + end + elseif reason.type == "drown" then + msg = dmsg("drown", name) + elseif reason.type == "punch" then + -- Punches + local hitter = reason.object + local hittername, hittertype, hittersubtype, shooter + -- Unknown hitter + if hitter == nil then + msg = dmsg("murder_any") + -- Player + elseif hitter:is_player() then + hittername = hitter:get_player_name() + if hittername ~= nil then + msg = dmsg("murder", name, hittername) + else + msg = dmsg("murder_any", name) + end + -- Mob (according to Common Mob Interface) + elseif hitter:get_luaentity()._cmi_is_mob then + if hitter:get_luaentity().nametag and hitter:get_luaentity().nametag ~= "" then + hittername = hitter:get_luaentity().nametag + end + hittersubtype = hitter:get_luaentity().name + if hittername then + msg = dmsg("murder", name, hittername) + elseif hittersubtype ~= nil and hittersubtype ~= "" then + msg = mmsg(hittersubtype, name) + else + msg = dmsg("murder_any", name) + end + -- Arrow + elseif hitter:get_luaentity().name == "mcl_bows:arrow_entity" or hitter:get_luaentity().name == "mobs_mc:arrow_entity" then + local shooter + if hitter:get_luaentity()._shooter then + shooter = hitter:get_luaentity()._shooter + end + if shooter == nil then + msg = dmsg("arrow", name) + elseif shooter:is_player() then + msg = dmsg("arrow_name", name, shooter:get_player_name()) + elseif shooter:get_luaentity()._cmi_is_mob then + if shooter:get_luaentity().nametag ~= "" then + msg = dmsg("arrow_name", name, shooter:get_player_name()) + else + msg = dmsg("arrow", name) + end + else + msg = dmsg("arrow", name) + end + -- Blaze fireball + elseif hitter:get_luaentity().name == "mobs_mc:blaze_fireball" then + if hitter:get_luaentity()._shot_from_dispenser then + msg = dmsg("fire_charge", name) + else + msg = dmsg("blaze_fireball", name) + end + -- Ghast fireball + elseif hitter:get_luaentity().name == "mobs_monster:fireball" then + msg = dmsg("ghast_fireball", name) + end + -- Falling + elseif reason.type == "fall" then + msg = dmsg("fall", name) + -- Other + elseif reason.type == "set_hp" then + if last_damages[name] and last_damages[name].custom then + msg = last_damages[name].message end end - if msg then - minetest.chat_send_all(msg) + if not msg then + msg = dmsg("other", name) end + minetest.chat_send_all(msg) end end) local start_damage_reset_countdown = function (player) minetest.after(1, function(playername) - last_damages[playername] = nil + -- FIXME: Fix race condition with many damages in quick succession + if last_damages[playername] and last_damages[playername].custom then + last_damages[playername] = nil + end end, player:get_player_name()) end -minetest.register_on_punchplayer(function(player, hitter) - if not player or not player:is_player() or not hitter then - return - end - local msg - local hittername, hittertype, hittersubtype, shooter - -- Player - if hitter:is_player() then - hittername = hitter:get_player_name() - hittertype = "player" - -- Mob (according to Common Mob Interface) - elseif hitter:get_luaentity()._cmi_is_mob then - if hitter:get_luaentity().nametag and hitter:get_luaentity().nametag ~= "" then - hittername = hitter:get_luaentity().nametag - end - hittertype = "mob" - hittersubtype = hitter:get_luaentity().name - -- Arrow - elseif hitter:get_luaentity().name == "mcl_bows:arrow_entity" or hitter:get_luaentity().name == "mobs_mc:arrow_entity" then - hittertype = "arrow" - if hitter:get_luaentity()._shooter then - shooter = hitter:get_luaentity()._shooter - end - -- Blaze fireball - elseif hitter:get_luaentity().name == "mobs_mc:blaze_fireball" then - if hitter:get_luaentity()._shot_from_dispenser then - hittertype = "fire_charge" - else - hittertype = "blaze_fireball" - end - -- Ghast fireball - elseif hitter:get_luaentity().name == "mobs_monster:fireball" then - hittertype = "ghast_fireball" - else - return - end - - last_damages[player:get_player_name()] = { shooter = shooter, hittername = hittername, hittertype = hittertype, hittersubtype = hittersubtype } - start_damage_reset_countdown(player) -end) - --- To be called BEFORE damaging a player. If the player died, then message will be used as the death message. +-- To be called BEFORE damaging a player via set_hp. The next time the player dies due to a set_hp, +-- the message will be shown. This must happen within one second, otherwise it won't work. function mcl_death_messages.player_damage(player, message) last_damages[player:get_player_name()] = { custom = true, message = message } start_damage_reset_countdown(player) diff --git a/mods/ITEMS/mcl_nether/depends.txt b/mods/ITEMS/mcl_nether/depends.txt index 23488aae0..273e76e1d 100644 --- a/mods/ITEMS/mcl_nether/depends.txt +++ b/mods/ITEMS/mcl_nether/depends.txt @@ -2,6 +2,6 @@ mcl_core mcl_sounds mcl_util walkover -mcl_death_messages +mcl_death_messages? doc_items doc? diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index ee158945f..15d5f9318 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -1,5 +1,7 @@ local S = minetest.get_translator("mcl_nether") +local mod_death_messages = minetest.get_modpath("mcl_death_messages") + minetest.register_node("mcl_nether:glowstone", { description = S("Glowstone"), _doc_items_longdesc = S("Glowstone is a naturally-glowing block which is home to the Nether."), @@ -91,7 +93,9 @@ minetest.register_node("mcl_nether:magma", { on_walk_over = function(loc, nodeiamon, player) -- Hurt players standing on top of this block if player:get_hp() > 0 then - mcl_death_messages.player_damage(player, string.format("%s stood too long on a magma block.", player:get_player_name())) + if mod_death_messages then + mcl_death_messages.player_damage(player, string.format("%s stood too long on a magma block.", player:get_player_name())) + end player:set_hp(player:get_hp() - 1) end end, diff --git a/mods/ITEMS/mcl_throwing/init.lua b/mods/ITEMS/mcl_throwing/init.lua index 93e06ff05..8d3915c3a 100644 --- a/mods/ITEMS/mcl_throwing/init.lua +++ b/mods/ITEMS/mcl_throwing/init.lua @@ -1,6 +1,7 @@ mcl_throwing = {} local S = minetest.get_translator("mcl_throwing") +local mod_death_messages = minetest.get_modpath("mcl_death_messages") -- -- Snowballs and other throwable items @@ -267,6 +268,10 @@ local pearl_on_step = function(self, dtime) local oldpos = player:get_pos() -- Teleport and hurt player player:set_pos(telepos) + if mod_death_messages then + mcl_death_messages.player_damage(player, S("@1 used the ender pearl too often.", player:get_player_name())) + end + -- TODO: Deal as fall damage player:set_hp(player:get_hp() - 5) -- 5% chance to spawn endermite at the player's origin diff --git a/mods/MISC/mcl_commands/depends.txt b/mods/MISC/mcl_commands/depends.txt new file mode 100644 index 000000000..6e14ff130 --- /dev/null +++ b/mods/MISC/mcl_commands/depends.txt @@ -0,0 +1 @@ +mcl_death_messages? diff --git a/mods/MISC/mcl_commands/init.lua b/mods/MISC/mcl_commands/init.lua index 50dd05264..1444abd73 100644 --- a/mods/MISC/mcl_commands/init.lua +++ b/mods/MISC/mcl_commands/init.lua @@ -2,6 +2,8 @@ local minecraftaliases = true local S = minetest.get_translator("mcl_commands") +local mod_death_messages = minetest.get_modpath("mcl_death_messages") + local function handle_kill_command(suspect, victim) if minetest.settings:get_bool("enable_damage") == false then return false, S("Players can't be killed right now, damage has been disabled.") @@ -16,17 +18,29 @@ local function handle_kill_command(suspect, victim) return false, S("@1 is already dead", victim) end end - if not suspect == victim then - minetest.log("action", S("@1 killed @2", suspect, victim)) - end -- If player holds a totem of undying, destroy it before killing, -- so it doesn't rescue the player. local wield = victimref:get_wielded_item() if wield:get_name() == "mobs_mc:totem" then victimref:set_wielded_item("") end + if mod_death_messages then + local msg + if suspect == victim then + msg = S("@1 committed suicide.", victim) + else + msg = S("@1 was killed by @2.", victim, suspect) + end + mcl_death_messages.player_damage(victimref, msg) + end -- DIE! victimref:set_hp(0) + -- Log + if not suspect == victim then + minetest.log("action", string.format("%s killed %s using /kill", suspect, victim)) + else + minetest.log("action", string.format("%s committed suicide using /kill", victim)) + end return true end diff --git a/mods/PLAYER/mcl_hunger/depends.txt b/mods/PLAYER/mcl_hunger/depends.txt index db4d6ccba..ed8cc4236 100644 --- a/mods/PLAYER/mcl_hunger/depends.txt +++ b/mods/PLAYER/mcl_hunger/depends.txt @@ -1,2 +1,2 @@ hudbars -intllib? +mcl_death_messages? diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index 939aeed97..d37d05142 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -1,3 +1,6 @@ +local S = minetest.get_translator("mcl_hunger") +local mod_death_messages = minetest.get_modpath("mcl_death_messages") + -- wrapper for minetest.item_eat (this way we make sure other mods can't break this one) local org_eat = minetest.do_item_eat minetest.do_item_eat = function(hp_change, replace_with_item, itemstack, user, pointed_thing) @@ -110,7 +113,11 @@ local function poisonp(tick, time, time_left, damage, exhaustion, name) end -- Deal damage and exhaust player + -- TODO: Introduce fatal poison at higher difficulties if player:get_hp()-damage > 0 then + if mod_death_messages then + mcl_death_messages.player_damage(player, S("@1 succumbed to the poison."), name) + end player:set_hp(player:get_hp()-damage) end diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index 5df787e7d..87812b8d0 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -1,10 +1,5 @@ -local S -if (minetest.get_modpath("intllib")) then - S = intllib.Getter() -else - S = function ( s ) return s end -end - +local S = minetest.get_translator("mcl_hunger") +local mod_death_messages = minetest.get_modpath("mcl_death_messages") mcl_hunger = {} @@ -172,7 +167,11 @@ minetest.register_globalstep(function(dtime) mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) elseif h == 0 then -- Damage hungry player down to 1 HP + -- TODO: Allow starvation at higher difficulty levels if hp-1 > 0 then + if mod_death_messages then + mcl_death_messages.player_damage(player, S("@1 starved to death."), name) + end player:set_hp(hp-1) end end diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index ea232129c..c3315f42c 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("mcl_playerplus") + -- Internal player state local mcl_playerplus_internal = {} @@ -118,7 +120,7 @@ minetest.register_globalstep(function(dtime) -- Check privilege, too and (not minetest.check_player_privs(name, {noclip = true})) then if player:get_hp() > 0 then - mcl_death_messages.player_damage(player, string.format("%s suffocated to death.", name)) + mcl_death_messages.player_damage(player, S("@1 suffocated to death.", name)) player:set_hp(player:get_hp() - 1) end end @@ -134,7 +136,7 @@ minetest.register_globalstep(function(dtime) local dist_feet = vector.distance({x=pos.x, y=pos.y-1, z=pos.z}, near) if dist < 1.1 or dist_feet < 1.1 then if player:get_hp() > 0 then - mcl_death_messages.player_damage(player, string.format("%s was prickled by a cactus.", name)) + mcl_death_messages.player_damage(player, S("@1 was prickled to death by a cactus.", name)) player:set_hp(player:get_hp() - 1) end end From 049c6322769e4751376f095e846d3ea849e2e2cf Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 21:59:16 +0100 Subject: [PATCH 079/379] Generalize node damage death message --- mods/HUD/mcl_death_messages/init.lua | 40 +++++++++++++--------------- mods/ITEMS/mcl_core/nodes_liquid.lua | 9 +++++++ mods/ITEMS/mcl_fire/init.lua | 8 ++++++ 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index 85e51c84c..1436205a8 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -11,18 +11,6 @@ local msgs = { ["arrow_name"] = { S("%s was shot by an arrow from %s."), }, - ["fire"] = { - S("%s has been cooked crisp."), - S("%s felt the burn."), - S("%s died in the flames."), - S("%s died in a fire."), - }, - ["lava"] = { - S("%s melted in lava."), - S("%s took a bath in a hot lava tub."), - S("%s died in lava."), - S("%s could not survive in lava."), - }, ["drown"] = { S("%s forgot to breathe."), S("%s drowned."), @@ -132,18 +120,27 @@ minetest.register_on_dieplayer(function(player, reason) -- (we add one additional node because the check may fail if the player was -- just barely touching the node with the head) local posses = { pos, {x=pos.x,y=pos.y+1,z=pos.z}, {x=pos.x,y=pos.y+2,z=pos.z}} + local highest_damage = 0 + local highest_damage_def = nil + -- Show message for node that dealt the most damage for p=1, #posses do - local node = minetest.registered_nodes[minetest.get_node(posses[p]).name] - -- Lava - if minetest.get_item_group(node.name, "lava") ~= 0 then - msg = dmsg("lava", name) - break - -- Fire - elseif minetest.get_item_group(node.name, "fire") ~= 0 then - msg = dmsg("fire", name) - break + local def = minetest.registered_nodes[minetest.get_node(posses[p]).name] + local dmg = def.damage_per_second + if dmg and dmg > highest_damage then + highest_damage = dmg + highest_damage_def = def end end + if highest_damage_def and highest_damage_def._mcl_node_death_message then + local field = highest_damage_def._mcl_node_death_message + local field_msg + if type(field) == "table" then + field_msg = field[math.random(1, #field)] + else + field_msg = field + end + msg = string.format(field_msg, name) + end elseif reason.type == "drown" then msg = dmsg("drown", name) elseif reason.type == "punch" then @@ -235,3 +232,4 @@ function mcl_death_messages.player_damage(player, message) last_damages[player:get_player_name()] = { custom = true, message = message } start_damage_reset_countdown(player) end + diff --git a/mods/ITEMS/mcl_core/nodes_liquid.lua b/mods/ITEMS/mcl_core/nodes_liquid.lua index 8fe032054..2fdcb1ba1 100644 --- a/mods/ITEMS/mcl_core/nodes_liquid.lua +++ b/mods/ITEMS/mcl_core/nodes_liquid.lua @@ -6,6 +6,13 @@ local WATER_ALPHA = 179 local WATER_VISC = 1 local LAVA_VISC = 7 +local lava_death_messages = { + S("%s melted in lava."), + S("%s took a bath in a hot lava tub."), + S("%s died in lava."), + S("%s could not survive in lava."), +} + minetest.register_node("mcl_core:water_flowing", { description = S("Flowing Water"), _doc_items_create_entry = false, @@ -129,6 +136,7 @@ minetest.register_node("mcl_core:lava_flowing", { liquid_renewable = false, liquid_range = 3, damage_per_second = 4*2, + _mcl_node_death_message = lava_death_messages, post_effect_color = {a=255, r=208, g=73, b=10}, groups = { lava=3, liquid=2, destroys_items=1, not_in_creative_inventory=1, dig_by_piston=1}, _mcl_blast_resistance = 500, @@ -175,6 +183,7 @@ S([[Lava interacts with water various ways: liquid_renewable = false, liquid_range = 3, damage_per_second = 4*2, + _mcl_node_death_message = lava_death_messages, post_effect_color = {a=255, r=208, g=73, b=10}, stack_max = 64, groups = { lava=3, liquid=2, destroys_items=1, not_in_creative_inventory=1, dig_by_piston=1}, diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index d85fbf1c6..0ffaf7752 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -12,6 +12,12 @@ local S = minetest.get_translator("mcl_fire") local fire_help = S("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.") local eternal_fire_help = S("Eternal fire is a damaging and destructive block. 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.") +local fire_death_messages = { + S("%s has been cooked crisp."), + S("%s felt the burn."), + S("%s died in the flames."), + S("%s died in a fire."), +} minetest.register_node("mcl_fire:fire", { description = S("Fire"), @@ -36,6 +42,7 @@ minetest.register_node("mcl_fire:fire", { buildable_to = true, sunlight_propagates = true, damage_per_second = 1, + _mcl_node_death_message = fire_death_messages, groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston=1, destroys_items=1 }, floodable = true, on_flood = function(pos, oldnode, newnode) @@ -115,6 +122,7 @@ minetest.register_node("mcl_fire:eternal_fire", { buildable_to = true, sunlight_propagates = true, damage_per_second = 1, + _mcl_node_death_message = fire_death_messages, groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston = 1, destroys_items = 1}, floodable = true, on_flood = function(pos, oldnode, newnode) From 636ff60c682a4733a8b9a175db03065115afb840 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 22:31:26 +0100 Subject: [PATCH 080/379] Don't re-damage object with arrow if already dead --- mods/ITEMS/mcl_bows/arrow.lua | 36 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 9561fea0d..0b41a282e 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -184,26 +184,28 @@ ARROW_ENTITY.on_step = function(self, dtime) local is_player = obj:is_player() local lua = obj:get_luaentity() if obj ~= self._shooter and (is_player or (lua and lua._cmi_is_mob)) then - obj:punch(self.object, 1.0, { - full_punch_interval=1.0, - damage_groups={fleshy=self._damage}, - }, nil) + if obj:get_hp() > 0 then + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=self._damage}, + }, nil) - if is_player then - if self._shooter and self._shooter:is_player() then - -- “Ding” sound for hitting another player - minetest.sound_play({name="mcl_bows_hit_player", gain=0.1}, {to_player=self._shooter}) + if is_player then + if self._shooter and self._shooter:is_player() then + -- “Ding” sound for hitting another player + minetest.sound_play({name="mcl_bows_hit_player", gain=0.1}, {to_player=self._shooter}) + end end - end - if lua then - local entity_name = lua.name - -- Achievement for hitting skeleton, wither skeleton or stray (TODO) with an arrow at least 50 meters away - -- NOTE: Range has been reduced because mobs unload much earlier than that ... >_> - -- TODO: This achievement should be given for the kill, not just a hit - if self._shooter and self._shooter:is_player() and vector.distance(pos, self._startpos) >= 20 then - if mod_awards and (entity_name == "mobs_mc:skeleton" or entity_name == "mobs_mc:stray" or entity_name == "mobs_mc:witherskeleton") then - awards.unlock(self._shooter:get_player_name(), "mcl:snipeSkeleton") + if lua then + local entity_name = lua.name + -- Achievement for hitting skeleton, wither skeleton or stray (TODO) with an arrow at least 50 meters away + -- NOTE: Range has been reduced because mobs unload much earlier than that ... >_> + -- TODO: This achievement should be given for the kill, not just a hit + if self._shooter and self._shooter:is_player() and vector.distance(pos, self._startpos) >= 20 then + if mod_awards and (entity_name == "mobs_mc:skeleton" or entity_name == "mobs_mc:stray" or entity_name == "mobs_mc:witherskeleton") then + awards.unlock(self._shooter:get_player_name(), "mcl:snipeSkeleton") + end end end end From 086b29f08c6a706517e8fa4e05a665daad4886f8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 22:51:35 +0100 Subject: [PATCH 081/379] Fix minor race condition in mcl_death_messages --- mods/HUD/mcl_death_messages/init.lua | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index 1436205a8..f0f6285ce 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -206,7 +206,7 @@ minetest.register_on_dieplayer(function(player, reason) msg = dmsg("fall", name) -- Other elseif reason.type == "set_hp" then - if last_damages[name] and last_damages[name].custom then + if last_damages[name] then msg = last_damages[name].message end end @@ -214,22 +214,30 @@ minetest.register_on_dieplayer(function(player, reason) msg = dmsg("other", name) end minetest.chat_send_all(msg) + last_damages[name] = nil end end) -local start_damage_reset_countdown = function (player) - minetest.after(1, function(playername) - -- FIXME: Fix race condition with many damages in quick succession - if last_damages[playername] and last_damages[playername].custom then +-- dmg_sequence_number is used to discard old damage events +local dmg_sequence_number = 0 +local start_damage_reset_countdown = function (player, sequence_number) + minetest.after(1, function(playername, sequence_number) + if last_damages[playername] and last_damages[playername].sequence_number == sequence_number then last_damages[playername] = nil end - end, player:get_player_name()) + end, player:get_player_name(), sequence_number) end --- To be called BEFORE damaging a player via set_hp. The next time the player dies due to a set_hp, --- the message will be shown. This must happen within one second, otherwise it won't work. +-- Send a custom death mesage when damaging a player via set_hp. +-- To be called directly BEFORE damaging a player via set_hp. +-- The next time the player dies due to a set_hp, the message will be shown. +-- The player must die via set_hp within 0.1 seconds, otherwise the message will be discarded. function mcl_death_messages.player_damage(player, message) - last_damages[player:get_player_name()] = { custom = true, message = message } - start_damage_reset_countdown(player) + last_damages[player:get_player_name()] = { message = message, sequence_number = dmg_sequence_number } + start_damage_reset_countdown(player, dmg_sequence_number) + dmg_sequence_number = dmg_sequence_number + 1 + if dmg_sequence_number >= 65535 then + dmg_sequence_number = 0 + end end From b8d3e7473b8094cc7afd676594e9043fb2ba1596 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 23:11:44 +0100 Subject: [PATCH 082/379] Mob sfx: Random pitch, higher pitch for children --- mods/ENTITIES/mcl_mobs/api.lua | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index dfc4c7733..f443be5c3 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -105,10 +105,20 @@ local mob_sound = function(self, sound, is_opinion) if is_opinion and self.opinion_sound_cooloff > 0 then return end + local pitch + if self.child then + -- Children have high pitch + pitch = 1.5 + else + pitch = 1.0 + end + -- randomize the pitch a bit + local pitch = pitch + math.random(-10, 10) * 0.005 minetest.sound_play(sound, { object = self.object, gain = 1.0, - max_hear_distance = self.sounds.distance + max_hear_distance = self.sounds.distance, + pitch = pitch, }) self.opinion_sound_cooloff = 1 end From a58b6fd3fbc0079af9334b10e13d437898b5677f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 23:17:42 +0100 Subject: [PATCH 083/379] Fixed pitch for fuse sound --- mods/ENTITIES/mcl_mobs/api.lua | 55 ++++++++-------------------------- 1 file changed, 13 insertions(+), 42 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index f443be5c3..ae89a15e0 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -99,21 +99,23 @@ local mod_mobspawners = minetest.get_modpath("mcl_mobspawners") ~= nil local mod_hunger = minetest.get_modpath("mcl_hunger") ~= nil -- play sound -local mob_sound = function(self, sound, is_opinion) +local mob_sound = function(self, sound, is_opinion, fixed_pitch) if sound then if is_opinion and self.opinion_sound_cooloff > 0 then return end local pitch - if self.child then - -- Children have high pitch - pitch = 1.5 - else - pitch = 1.0 + if not fixed_pitch then + if self.child then + -- Children have high pitch + pitch = 1.5 + else + pitch = 1.0 + end + -- randomize the pitch a bit + pitch = pitch + math.random(-10, 10) * 0.005 end - -- randomize the pitch a bit - local pitch = pitch + math.random(-10, 10) * 0.005 minetest.sound_play(sound, { object = self.object, gain = 1.0, @@ -1943,7 +1945,7 @@ local do_states = function(self, dtime) self.v_start = true self.timer = 0 self.blinktimer = 0 - mob_sound(self, self.sounds.fuse) + mob_sound(self, self.sounds.fuse, nil, false) -- stop timer if out of reach or direct line of sight elseif self.allow_fuse_reset @@ -3655,40 +3657,9 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, end --- protect tamed mob with rune item +-- No-op in MCL2 (protecting mobs is not possible). function mobs:protect(self, clicker) - local name = clicker:get_player_name() - local tool = clicker:get_wielded_item() - - if tool:get_name() ~= "mobs:protector" then - return false - end - - if self.tamed == false then - minetest.chat_send_player(name, S("Not tamed!")) - return true -- false - end - - if self.protected == true then - minetest.chat_send_player(name, S("Already protected!")) - return true -- false - end - - if not mobs.is_creative(clicker:get_player_name()) then - tool:take_item() -- take 1 protection rune - clicker:set_wielded_item(tool) - end - - self.protected = true - - local pos = self.object:get_pos() - pos.y = pos.y + self.collisionbox[2] + 0.5 - - effect(self.object:get_pos(), 25, "mobs_protect_particle.png", 0.5, 4, 2, 15) - - mob_sound(self, "mobs_spell") - - return true + return false end From f373f3a4f1c85e32cc0560eeda5af34d8f23de72 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 23:26:54 +0100 Subject: [PATCH 084/379] Mob spawner: Reduce spawn count for big mobs --- mods/ITEMS/mcl_mobspawners/init.lua | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index e9c2fc32a..70d4cdad1 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -43,6 +43,14 @@ local doll_size_overrides = { ["mobs_mc:enderdragon"] = { x = 0.16, y = 0.16 }, ["mobs_mc:witch"] = { x = 0.95, y = 0.95 }, } +local spawn_count_overrides = { + ["mobs_mc:enderdragon"] = 1, + ["mobs_mc:wither"] = 1, + ["mobs_mc:ghast"] = 1, + ["mobs_mc:guardian_elder"] = 1, + ["mobs_mc:guardian"] = 2, + ["mobs_mc:iron_golem"] = 2, +} local function set_doll_properties(doll, mob) local mobinfo = minetest.registered_entities[mob] @@ -218,7 +226,11 @@ local spawn_mobs = function(pos, elapsed) -- spawn up to 4 mobs in random air blocks if air then - for a=1, 4 do + local max = 4 + if spawn_count_overrides[mob] then + max = spawn_count_overrides[mob] + end + for a=1, max do if #air <= 0 then -- We're out of space! Stop spawning break From 793357cdfeab8f89d08648cfa4a7d2d065ab32aa Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 23:47:50 +0100 Subject: [PATCH 085/379] Fix crash in mcl_hunger --- mods/PLAYER/mcl_hunger/hunger.lua | 2 +- mods/PLAYER/mcl_hunger/init.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index d37d05142..81f37e717 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -116,7 +116,7 @@ local function poisonp(tick, time, time_left, damage, exhaustion, name) -- TODO: Introduce fatal poison at higher difficulties if player:get_hp()-damage > 0 then if mod_death_messages then - mcl_death_messages.player_damage(player, S("@1 succumbed to the poison."), name) + mcl_death_messages.player_damage(player, S("@1 succumbed to the poison.", name)) end player:set_hp(player:get_hp()-damage) end diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index 87812b8d0..0e64a1906 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -170,7 +170,7 @@ minetest.register_globalstep(function(dtime) -- TODO: Allow starvation at higher difficulty levels if hp-1 > 0 then if mod_death_messages then - mcl_death_messages.player_damage(player, S("@1 starved to death."), name) + mcl_death_messages.player_damage(player, S("@1 starved to death.", name)) end player:set_hp(hp-1) end From 9434baf9915112162ab858085f373e0f7387295d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 23:52:41 +0100 Subject: [PATCH 086/379] High pitch for baby monsters --- mods/ENTITIES/mcl_mobs/api.lua | 13 ++++++++----- mods/ENTITIES/mcl_mobs/api.txt | 1 + mods/ENTITIES/mobs_mc/zombie.lua | 2 ++ mods/ENTITIES/mobs_mc/zombiepig.lua | 1 + 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index ae89a15e0..7c66a5f52 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -384,8 +384,10 @@ local item_drop = function(self, cooked) -- no drops if disabled by setting if not mobs_drop_items then return end - -- no drops for child mobs - if self.child then return end + -- no drops for child mobs (except monster) + if (self.child and self.type ~= "monster") then + return + end local obj, item, num local pos = self.object:get_pos() @@ -740,7 +742,7 @@ local do_jump = function(self) if not self.jump or self.jump_height == 0 or self.fly - or self.child + or (self.child and self.type ~= "monster") or self.order == "stand" then return false end @@ -2546,7 +2548,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- attack puncher and call other mobs for help if self.passive == false and self.state ~= "flop" - and self.child == false + and (self.child == false or self.type == "monster") and hitter:get_player_name() ~= self.owner and not mobs.invis[ name ] then @@ -3064,7 +3066,6 @@ minetest.register_entity(name, { pause_timer = 0, horny = false, hornytimer = 0, - child = false, gotten = false, health = 0, reach = def.reach or 3, @@ -3101,6 +3102,8 @@ minetest.register_entity(name, { rain_damage = def.rain_damage or 0, glow = def.glow, can_despawn = can_despawn, + child = def.child or false, + -- End of MCL2 extensions on_spawn = def.on_spawn, diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 5baab263e..10b214127 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -216,6 +216,7 @@ functions needed for the mob to work properly which contains the following: 'spawn_small_alternative': name of a smaller mob to use as replacement if spawning fails due to space requirements 'glow' same as in entity definition + 'child' if true, spawn mob as child Node Replacement ---------------- diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index 0b329c55d..8f27ed3ca 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -92,6 +92,7 @@ baby_zombie.visual_size = {x=zombie.visual_size.x/2, y=zombie.visual_size.y/2} baby_zombie.walk_velocity = 1.2 baby_zombie.run_velocity = 2.4 baby_zombie.sunlight_damage = 0 +baby_zombie.child = 1 mobs:register_mob("mobs_mc:baby_zombie", baby_zombie) @@ -113,6 +114,7 @@ baby_husk.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25} baby_husk.visual_size = {x=zombie.visual_size.x/2, y=zombie.visual_size.y/2} baby_husk.walk_velocity = 1.2 baby_husk.run_velocity = 2.4 +baby_husk.child = 1 mobs:register_mob("mobs_mc:baby_husk", baby_husk) diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua index a4b1db60d..b61d507f9 100644 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ b/mods/ENTITIES/mobs_mc/zombiepig.lua @@ -96,6 +96,7 @@ baby_pigman.textures = { { baby_pigman.walk_velocity = 1.2 baby_pigman.run_velocity = 2.4 baby_pigman.light_damage = 0 +baby_pigman.child = 1 mobs:register_mob("mobs_mc:baby_pigman", baby_pigman) From 6f9e178084b4ab42075cef1c84b70ea8964cf7e1 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Mar 2019 23:55:27 +0100 Subject: [PATCH 087/379] Baby zombies take sunlight damage --- mods/ENTITIES/mobs_mc/zombie.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index 8f27ed3ca..da8cae1ae 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -91,7 +91,6 @@ baby_zombie.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25} baby_zombie.visual_size = {x=zombie.visual_size.x/2, y=zombie.visual_size.y/2} baby_zombie.walk_velocity = 1.2 baby_zombie.run_velocity = 2.4 -baby_zombie.sunlight_damage = 0 baby_zombie.child = 1 mobs:register_mob("mobs_mc:baby_zombie", baby_zombie) From e37411dc1308f48860eddaf233bb6f9d09e5b155 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 00:10:59 +0100 Subject: [PATCH 088/379] Random pitch for eat/drink sounds --- mods/ITEMS/mcl_buckets/init.lua | 4 ++-- mods/PLAYER/mcl_hunger/hunger.lua | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_buckets/init.lua b/mods/ITEMS/mcl_buckets/init.lua index 3144bd816..e17a98632 100644 --- a/mods/ITEMS/mcl_buckets/init.lua +++ b/mods/ITEMS/mcl_buckets/init.lua @@ -28,14 +28,14 @@ mcl_buckets.liquids = {} local sound_place = function(itemname, pos) local def = minetest.registered_nodes[itemname] if def and def.sounds and def.sounds.place then - minetest.sound_play(def.sounds.place, {gain=1.0, pos = pos}) + minetest.sound_play(def.sounds.place, {gain=1.0, pos = pos, pitch = 1 + math.random(-10, 10)*0.005}) end end local sound_take = function(itemname, pos) local def = minetest.registered_nodes[itemname] if def and def.sounds and def.sounds.dug then - minetest.sound_play(def.sounds.dug, {gain=1.0, pos = pos}) + minetest.sound_play(def.sounds.dug, {gain=1.0, pos = pos, pitch = 1 + math.random(-10, 10)*0.005}) end end diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index 81f37e717..7d7306bd0 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -148,6 +148,7 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso pos = pos, max_hear_distance = 12, gain = 1.0, + pitch = 1 + math.random(-10, 10)*0.005, }) else -- Assume the item is a food @@ -186,6 +187,7 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso pos = pos, max_hear_distance = 12, gain = 1.0, + pitch = 1 + math.random(-10, 10)*0.005, }) end From c98df597fc9b6f64406d977899957fdc65ee9496 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 00:18:21 +0100 Subject: [PATCH 089/379] Fix mob detection of fences and walls --- mods/ENTITIES/mcl_mobs/api.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 7c66a5f52..e331cf72b 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -788,7 +788,8 @@ local do_jump = function(self) or minetest.registered_items[nod.name].walkable then if not nod.name:find("fence") - and not nod.name:find("gate") then + and not nod.name:find("fence_gate") + and not nod.name:find("wall") then local v = self.object:get_velocity() From 8b44e6fb7a913d44ed733168a0ec10dc4a182b29 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 00:24:53 +0100 Subject: [PATCH 090/379] Mobs: Also play jump sfx if not moving horizontal --- mods/ENTITIES/mcl_mobs/api.lua | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index e331cf72b..003ca4958 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -801,7 +801,7 @@ local do_jump = function(self) -- when in air move forward minetest.after(0.3, function(self, v) - if not self.object:get_luaentity() then + if not self.object or not self.object:get_luaentity() then return end self.object:set_acceleration({ @@ -811,11 +811,9 @@ local do_jump = function(self) }) end, self, v) - if get_velocity(self) > 0 then - if self.jump_sound_cooloff <= 0 then - mob_sound(self, self.sounds.jump) - self.jump_sound_cooloff = 0.5 - end + if self.jump_sound_cooloff <= 0 then + mob_sound(self, self.sounds.jump) + self.jump_sound_cooloff = 0.5 end else self.facing_fence = true From a5b20b1bf0c4bc1e58a0d90771945894ed5e831d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 00:44:24 +0100 Subject: [PATCH 091/379] Modify pitch of small slimes and magma cubes --- mods/ENTITIES/mcl_mobs/api.lua | 10 +++++++--- mods/ENTITIES/mcl_mobs/api.txt | 4 ++++ mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 3 +++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 003ca4958..ab35de472 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -107,11 +107,15 @@ local mob_sound = function(self, sound, is_opinion, fixed_pitch) end local pitch if not fixed_pitch then + local base_pitch = self.sounds.base_pitch + if not base_pitch then + base_pitch = 1 + end if self.child then - -- Children have high pitch - pitch = 1.5 + -- Children have higher pitch + pitch = base_pitch * 1.5 else - pitch = 1.0 + pitch = base_pitch end -- randomize the pitch a bit pitch = pitch + math.random(-10, 10) * 0.005 diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 10b214127..f38d8ef16 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -131,6 +131,7 @@ functions needed for the mob to work properly which contains the following: 'makes_footstep_sound' when true you can hear mobs walking. 'sounds' this is a table with sounds of the mob 'distance' maximum distance sounds can be heard, default is 10. + 'base_pitch' base pitch to use adult mobs, default is 1.0 (MCL2 extension) 'random' played randomly from time to time. also played for overfeeding animal. 'war_cry' what you hear when mob starts to attack player. (currently disabled) @@ -142,6 +143,9 @@ functions needed for the mob to work properly which contains the following: 'fuse' sound played when mob explode timer starts. 'explode' sound played when mob explodes. + Note: For all sounds except fuse and explode, the pitch is slightly randomized from the base pitch + The pitch of children is 50% higher. + 'drops' table of items that are dropped when mob is killed, fields are: 'name' name of item to drop. 'chance' chance of drop, 1 for always, 2 for 1-in-2 chance etc. diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index da52d3bcf..63a15932a 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -114,6 +114,7 @@ local slime_big = { mobs:register_mob("mobs_mc:slime_big", slime_big) local slime_small = table.copy(slime_big) +slime_small.sounds.base_pitch = 1.15 slime_small.hp_min = 4 slime_small.hp_max = 4 slime_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51} @@ -128,6 +129,7 @@ slime_small.on_die = spawn_children_on_die("mobs_mc:slime_tiny", 4, 0.6, 1.0) mobs:register_mob("mobs_mc:slime_small", slime_small) local slime_tiny = table.copy(slime_big) +slime_tiny.sounds.base_pitch = 1.3 slime_tiny.hp_min = 1 slime_tiny.hp_max = 1 slime_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505} @@ -239,6 +241,7 @@ mobs:register_mob("mobs_mc:magma_cube_small", magma_cube_small) local magma_cube_tiny = table.copy(magma_cube_big) magma_cube_tiny.sounds.jump = "mobs_mc_magma_cube_small" magma_cube_tiny.sounds.death = "mobs_mc_magma_cube_small" +magma_cube_tiny.sounds.base_pitch = 1.25 magma_cube_tiny.hp_min = 1 magma_cube_tiny.hp_max = 1 magma_cube_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505} From 7899f6d4325892ebd19bc420dc958a5060ad9ae6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 00:54:49 +0100 Subject: [PATCH 092/379] Tweak height fear of all mobs --- mods/ENTITIES/mobs_mc/blaze.lua | 2 +- mods/ENTITIES/mobs_mc/ender_dragon.lua | 1 - mods/ENTITIES/mobs_mc/ghast.lua | 1 - mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 4 ++-- mods/ENTITIES/mobs_mc/villager_zombie.lua | 2 +- 5 files changed, 4 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 21e752a35..c832fb70e 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -65,7 +65,7 @@ mobs:register_mob("mobs_mc:blaze", { jump_height = 4, fly = true, jump_chance = 98, - fear_height = 120, + fear_height = 0, blood_amount = 0, glow = 14, }) diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index dd81ab145..06fb82bb7 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -63,7 +63,6 @@ mobs:register_mob("mobs_mc:enderdragon", { jump_height = 14, stepheight = 1.2, jump_chance = 100, - fear_height = 120, fly = true, fly_in = {"air"}, dogshoot_switch = 1, diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index 2ed0fb952..44cf34962 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -73,7 +73,6 @@ mobs:register_mob("mobs_mc:ghast", { fly = true, fly_in = {"air"}, jump_chance = 98, - fear_height = 120, blood_amount = 0, }) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 63a15932a..8e9f93f9a 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -107,7 +107,7 @@ local slime_big = { walk_chance = 0, jump_height = 5.2, jump_chance = 100, - fear_height = 60, + fear_height = 0, spawn_small_alternative = "mobs_mc:slime_small", on_die = spawn_children_on_die("mobs_mc:slime_small", 4, 1.0, 1.5) } @@ -213,7 +213,7 @@ local magma_cube_big = { jump_height = 8, walk_chance = 0, jump_chance = 100, - fear_height = 100000, + fear_height = 0, spawn_small_alternative = "mobs_mc:magma_cube_small", on_die = spawn_children_on_die("mobs_mc:magma_cube_small", 3, 0.8, 1.5) } diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua index 7e8037df1..e23f86bb4 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua @@ -75,7 +75,7 @@ mobs:register_mob("mobs_mc:villager_zombie", { lava_damage = 5, sunlight_damage = 1, view_range = 16, - fear_height = 5, + fear_height = 4, }) From f3b4c567721a2263f3a179af521f9b425ec5f6b4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 01:04:18 +0100 Subject: [PATCH 093/379] Change default mob view range to 16 --- mods/ENTITIES/mcl_mobs/api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index ab35de472..3a5a82737 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -3029,7 +3029,7 @@ minetest.register_entity(name, { visual_size = def.visual_size or {x = 1, y = 1}, mesh = def.mesh, makes_footstep_sound = def.makes_footstep_sound or false, - view_range = def.view_range or 5, + view_range = def.view_range or 16, walk_velocity = def.walk_velocity or 1, run_velocity = def.run_velocity or 2, damage = max(0, (def.damage or 0) * difficulty), From 47ef78bf6ab77a726f2b80e609cda3a078d4e8db Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 01:50:00 +0100 Subject: [PATCH 094/379] Fix group attack for slime, zombie and zombiepig --- mods/ENTITIES/mcl_mobs/api.lua | 18 +++++++++++++----- mods/ENTITIES/mcl_mobs/api.txt | 3 +++ mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 2 +- mods/ENTITIES/mobs_mc/zombie.lua | 5 ++--- mods/ENTITIES/mobs_mc/zombiepig.lua | 2 +- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 3a5a82737..901fe07fd 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -2569,12 +2569,20 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) if obj then - -- only alert members of same mob - if obj.group_attack == true + -- only alert members of same mob or friends + if obj.group_attack and obj.state ~= "attack" - and obj.owner ~= name - and obj.name == self.name then - do_attack(obj, hitter) + and obj.owner ~= name then + if obj.name == self.name then + do_attack(obj, hitter) + elseif type(obj.group_attack) == "table" then + for i=1, #obj.group_attack do + if obj.name == obj.group_attack[i] then + do_attack(obj, hitter) + break + end + end + end end -- have owned mobs attack player threat diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index f38d8ef16..b3e2f03e7 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -78,6 +78,8 @@ functions needed for the mob to work properly which contains the following: punches when nearby. 'group_attack' when true has same mob type grouping together to attack offender. + [MCL2 extension:] When a table, this is a list of + mob types that will get alerted as well (besides same mob type) 'attack_type' tells the api what a mob does when attacking the player or another mob: 'dogfight' is a melee attack when player is within mob reach. @@ -222,6 +224,7 @@ functions needed for the mob to work properly which contains the following: 'glow' same as in entity definition 'child' if true, spawn mob as child + Node Replacement ---------------- diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 8e9f93f9a..4fbeea765 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -58,7 +58,7 @@ end local slime_big = { type = "monster", pathfinding = 1, - group_attack = true, + group_attack = { "mobs_mc:slime_big", "mobs_mc:slime_small", "mobs_mc:slime_tiny" }, hp_min = 16, hp_max = 16, collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02}, diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index da8cae1ae..f08d364d8 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -65,8 +65,8 @@ local zombie = { fear_height = 4, pathfinding = 1, jump = true, - --jump_height = 3, - group_attack = true, + jump_height = 4, + group_attack = { "mobs_mc:zombie", "mobs_mc:baby_zombie", "mobs_mc:husk", "mobs_mc:baby_husk" }, drops = drops_zombie, animation = { speed_normal = 25, speed_run = 50, @@ -75,7 +75,6 @@ local zombie = { run_start = 0, run_end = 40, }, lava_damage = 4, - -- TODO: Burn mob only when in direct sunlight sunlight_damage = 2, view_range = 16, attack_type = "dogfight", diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua index b61d507f9..f21ea4faf 100644 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ b/mods/ENTITIES/mobs_mc/zombiepig.lua @@ -18,7 +18,7 @@ local pigman = { hp_max = 20, armor = 90, attack_type = "dogfight", - group_attack = true, + group_attack = { "mobs_mc:pigman", "mobs_mc:baby_pigman" }, damage = 9, reach = 2, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, From 10035a64af04b3d09ea409edcf2d7208615fe3be Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 01:57:51 +0100 Subject: [PATCH 095/379] Fix mobs not retaliating if friend died with 1 hit --- mods/ENTITIES/mcl_mobs/api.lua | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 901fe07fd..335fd01f9 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -2434,6 +2434,8 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) hitter:set_wielded_item(weapon) end + local die = false + -- only play hit sound and show blood effects if damage is 1 or over if damage >= 1 then @@ -2475,21 +2477,14 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- do damage self.health = self.health - floor(damage) - -- exit here if dead, special item check - if weapon:get_name() == "mobs:pick_lava" then - if check_for_death(self, "lava", {type = "punch", - puncher = hitter}) then - return - end - else - if check_for_death(self, "hit", {type = "punch", - puncher = hitter}) then - return - end + -- skip future functions if dead, except alerting others + if check_for_death(self, "hit", {type = "punch", puncher = hitter}) then + die = true end -- knock back effect (only on full punch) - if self.knock_back + if not die + and self.knock_back and tflp >= punch_interval then local v = self.object:get_velocity() @@ -2524,7 +2519,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) end -- END if damage -- if skittish then run away - if self.runaway == true then + if not die and self.runaway == true then local lp = hitter:get_pos() local s = self.object:get_pos() @@ -2555,9 +2550,11 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) and hitter:get_player_name() ~= self.owner and not mobs.invis[ name ] then - -- attack whoever punched mob - self.state = "" - do_attack(self, hitter) + if not die then + -- attack whoever punched mob + self.state = "" + do_attack(self, hitter) + end -- alert others to the attack local objs = minetest.get_objects_inside_radius(hitter:get_pos(), self.view_range) From a15c58a2dca4c869c67c85972f1d45ae926111d3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 03:58:41 +0100 Subject: [PATCH 096/379] Fix typos in mcl_core --- mods/ITEMS/mcl_core/nodes_base.lua | 2 +- mods/ITEMS/mcl_core/nodes_climb.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index f76a7f86f..d395c33a5 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -730,7 +730,7 @@ minetest.register_node("mcl_core:goldblock", { minetest.register_node("mcl_core:diamondblock", { description = S("Block of Diamond"), - _doc_items_longdesc = S("A block of diamond mostly a shiny decorational block but also useful as a compact storage of diamonds."), + _doc_items_longdesc = S("A block of diamond is mostly a shiny decorational block but also useful as a compact storage of diamonds."), tiles = {"default_diamond_block.png"}, is_ground_content = false, stack_max = 64, diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index eda1fc66e..2c71f677b 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -79,7 +79,7 @@ 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 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"}, inventory_image = "mcl_core_vine.png", From 79a3eb23a7644930b9997ac58f9a110bad9e7ba1 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 04:45:43 +0100 Subject: [PATCH 097/379] Add German translation of mcl_core --- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 239 ++++++++++++++++++++++ mods/ITEMS/mcl_core/locale/template.tr | 238 +++++++++++++++++++++ 2 files changed, 477 insertions(+) create mode 100644 mods/ITEMS/mcl_core/locale/mcl_core.de.tr create mode 100644 mods/ITEMS/mcl_core/locale/template.tr diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr new file mode 100644 index 000000000..717ccf353 --- /dev/null +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -0,0 +1,239 @@ +# textdomain: mcl_core +%s could not survive in lava.=%s konnte nicht in Lava überleben. +%s died in lava.=%s starb in Lava. +%s melted in lava.=%s schmolz in der Lava. +%s took a bath in a hot lava tub.=%s nahm ein Bad in einer heißen Lavawanne. +A block of diamond is mostly a shiny decorational block but also useful as a compact storage of diamonds.=Ein Diamantblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Diamanten. +A block of emerald is mostly a shiny decorational block but also useful as a compact storage of emeralds.=Ein Smaragdblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Smaragden. +A block of gold is mostly a shiny decorational block but also useful as a compact storage of gold ingots.=Ein Goldblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Goldbarren. +A block of iron is mostly a decorational block but also useful as a compact storage of iron ingots.=Ein Eisenblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Eisenbarren. +A cactus can only be placed on top of another cactus or any sand.=Ein Kaktus kann nur auf einem anderen Kaktus oder auf beliebigem Sand platziert werden. +A decorational and mostly transparent block.=Ein Dekoblock, der größtenteils transparent ist. +A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.=Ein Grasblock ist Erde mit einer Grasschicht. Grasblöcke sind vielseitige Blöcke, die das Wachstum aller möglichen Pflanzen fördern. Mit einer Hacke kann man das Land bestellen und einen Ackerboden machen. Mit einer Schaufel verwandelt man ihn in einen Graspfad. Im Licht wird das Gras sich langsam auf benachbarte Erde ausbreiten. Unter einem lichtundurchlässigen Block kann sich dieser Block wieder zurück zu Erde verwandeln. +A lapis lazuli block is mostly a decorational block but also useful as a compact storage of lapis lazuli.=Ein Lapislazuliblock ist hauptsächlich ein Deko-Block aber er ist auch nützlich zur kompakten Aufbewahrung von Lapislazuli. +A lava source sets fire to a couple of air blocks above when they're next to a flammable block.=Eine Lavaquelle zündet einige Luftblöcke über ihr an, wenn sie sich neben einem entzündlichen Block befinden. +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.=Ein Leiterstück, mit dem Sie vertikal klettern können. Leitern können nur an der Seite fester Blöcke und nicht an Glas, Blättern, Eis, Platten, Leuchtsteinen oder Ozeanlaternen platziert werden. +Acacia Bark=Akazienrinde +Acacia Leaves=Akazienblätter +Acacia Sapling=Akaziensetzling +Acacia Wood=Akazienholz +Acacia Wood Planks=Akazienholzplanken +Acacia leaves are grown from acacia trees.=Akazienblätter wachsen an Akazienbäumen. +Andesite=Andesit +Andesite is an igneous rock.=Andesit ist ein magmatisches Gestein. +Apple=Apfel +Apples are food items which can be eaten.=Äpfel sind essbare Gegenstände. +Barrier=Barriere +Barriers are invisble walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.=Barrieren sind unsichtbare feste Blöcke. Sie sind nützlich, um Grenzen für Abenteuerkarten und ähnliches zu bauen. Monster und Tiere werden auf Barrieren nicht auftauchen, und Zäune verbinden sich nicht mit Barrieren. Andere Blöcke können an Barrieren gebaut werden, wie bei allen anderen Blöcken. +Bedrock=Grundgestein +Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.=Grundgestein ist ein sehr harter Gesteinstyp. Er kann unter normalen Umständen nicht abgebaut, zerstört, aufgesammelt oder verschoben werden, außer im Kreativmodus. +Birch Bark=Birkenrinde +Birch Leaves=Birkenblätter +Birch Sapling=Birkensetzling +Birch Wood=Birkenholz +Birch Wood Planks=Birkenholzplanken +Birch leaves are grown from birch trees.=Birkenblätter wachsen an Birken. +Black Stained Glass=Schwarzes Glas +Block of Coal=Kohleblock +Block of Diamond=Diamantblock +Block of Emerald=Smaragdblock +Block of Gold=Goldblock +Block of Iron=Eisenblock +Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.=Kohleblöcke sind für eine kompakte Aufbewahrung von Kohle nützlich und sehr nützlich als Ofenbrennstoff. Ein Kohleblock ist so effizient wie 10 mal Kohle. +Blue Stained Glass=Blaues Glas +Bone Block=Knockenblock +Bone blocks are decorational blocks and a compact storage of bone meal.=Knochenblöcke sind Deko-Blöcke und geeignet zur kompakten Aufbewahrung von Knochenmehl. +Bowl=Schale +Bowls are mainly used to hold tasty soups.=Schalen werden hauptsächlich für leckere Suppen gebraucht. +Brick=Ziegel +Brick Block=Ziegelblock +Brick blocks are a good building material for building solid houses and can take quite a punch.=Ziegelblöcke sind ein gutes Baumaterial für den Bau stabiler Gebäude und halten einiges aus. +Bricks are used to craft brick blocks.=Ziegel werden zur Herstellung von Ziegelblöcken benötigt. +Brown Stained Glass=Braunes Glas +Cactus=Kaktus +Charcoal=Holzkohle +Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.=Holzkohle ist ein alternativer Brennstoff. Er entsteht, wenn Holz im Ofen verkohlt wird. Er brennt genau so lange wie Kohle und hat fast identische Herstellungsrezepte, aber es können keine Kohleblöcke damit gemacht werden. +Chiseled Red Sandstone=Gemeißelter roter Sandstein +Chiseled Sandstone=Gemeißelter Sandstein +Chiseled Stone Bricks=Gemeißelte Steinziegel +Chiseled red sandstone is a decorational building block.=Gemeißelter roter Sandstein ist ein dekorativer Block zum Bauen. +Chiseled sandstone is a decorational building block.=Gemeißelter Sandstein ist ein dekorativer Block zum Bauen. +Clay=Ton +Clay Ball=Tonklumpen +Clay balls are a raw material, mainly used to create bricks in the furnace.=Tonklumpen sind ein Rohstoff, sie werden hauptsächlich zur Ziegelherstellung im Ofen benutzt. +Clay is a versatile kind of earth commonly found at beaches underwater.=Ton ist eine vielseitige Art Erde, die oft an Stränden unter dem Wasser gefunden werden kann. +Coal=Kohle +Coal Ore=Kohleerz +Coarse Dirt=Grobe Erde +Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.=Große Erde ist für einige Pflanzen ein Erdboden und ähnlich wie Erde, aber auf ihr wird nie eine Grasschicht oder ähnliches wachsen. +Cobblestone=Kopfsteinpflaster +Cobweb=Spinnennetz +Cobwebs can be walked through, but significantly slow you down.=Spinnennetze können passiert werden, aber sie verlangsamen Sie beträchtlich. +Cracked Stone Bricks=Brüchige Steinziegel +Cut Red Sandstone=Geschliffener roter Sandstein +Cut Sandstone=Geschliffener Sandstein +Cut red sandstone is a decorational building block.=Geschliffener roter Sandstein ist ein dekorativer Block zum Bauen. +Cut sandstone is a decorational building block.=Geschliffener Sandstein ist ein dekorativer Block zum Bauen. +Cyan Stained Glass=Türkises Glas +Dark Oak Bark=Dunkeleichenrinde +Dark Oak Leaves=Dunkeleichenblätter +Dark Oak Sapling=Dunkeleichensetzling +Dark Oak Wood=Dunkeleichenholz +Dark Oak Wood Planks=Dunkeleichenholzplanken +Dark oak leaves are grown from dark oak trees.=Dunkeleichenblätter wachsen an Dunkeleichen. +Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.=Dunkeleichensetzlinge können zu Dunkeleichen heranwachsen, aber nur in Gruppen. Ein einsamer Dunkeleichensetzling wird nicht wachsen. Eine Gruppe aus vier Dunkeleichensetzlingen werden nach etwas Zeit zu einer Dunkeleiche heranwachen, wenn sie auf einem Erdboden (wie Erde) in einem 2×2-Quadrat platziert wurden und genügend Licht ausgesetzt sind. +Dead Bush=Toter Busch +Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks.=Tote Büsche sind uninteressante Pflanzen, die oft in trockenen Gebieten vorkommen. +Diamond=Diamant +Diamond Ore=Diamanterz +Diamond ore is rare and can be found in clusters near the bottom of the world.=Diamanterz ist selten und kann in kleinen Ansammlungen in der Nähe des Weltbodens gefunden werden. +Diamonds are precious minerals and useful to create the highest tier of armor and tools.=Diamanten sind kostbare Mineralien, die für die hochwertigsten Rüstungen und Werkzeuge gebraucht werden. +Diorite=Diorit +Diorite is an igneous rock.=Diorit ist ein vulkanisches Gestein. +Dirt=Erde +Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby.=Erde dient als Nährboden für einige Pflanzen. Im Licht könnte auf diesem Block eine Gras- oder Myzelschicht wachsen, wenn solche Blöcke in der Nähe sind. +Emerald=Smaragd +Emerald Ore=Smaragderz +Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Smaragderz ist das Erz von Smaragden. Es ist sehr selten und kann nur einzeln gefunden werden, nicht in Ansammlungen. +Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Smaragde sind nicht besonders nützlich, aber man kann sie in der Fertigung durch Goldbarren eintauschen. +Flint=Feuerstein +Flint is a raw material.=Feuerstein ist ein Rohstoff. +Flowing Lava=Fließende Lava +Flowing Water=Fließendes Wasser +Frosted Ice=Brüchiges Eis +Frosted ice is a short-lived solid translucent block. It melts into a water source within a few seconds.=Brüchiges Eis ist ein kurzlebiger durchscheinender Block. Er wird sich in einigen Sekunden zu einer Wasserquelle verwandeln. +Glass=Glas +Gold Ingot=Goldbarren +Gold Nugget=Goldklumpen +Gold Ore=Golderz +Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.=Goldklumpen sind sehr kleine Stücke geschmolzenes Gold; ihr Hauptzweck besteht darin, Goldbarren herzustellen. +Golden Apple=Goldener Apfel +Golden apples are precious food items which can be eaten.=Goldene Äpfel sind kostbare Lebensmittel. +Granite=Granit +Grass Block=Grasblock +Grass Path=Graspfad +Grass paths are a decorational variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Graspfade sind eine dekorative Variante von Grasblöcken. Ihre Oberseite hat eine andere Farbe und sie sind etwas niedriger als Grasblöcke, wodurch sie nützlich sind, um Fußwege zu errichten. Graspfade werden mit einer Schaufel errichtet. Ein Grasphad verwandelt sich in Erde, wenn er sich unter einem festen Block befindet. +Gravel=Kies +Green Stained Glass=Grünes Glas +Grey Stained Glass=Graues Glas +Ice=Eis +Ice is a translucent solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.=Eis ist ein durchscheinender fester Block, der oft in kalten Gebieten gefunden werden kann. Er schmitzt in der nähe von Block-Lichtquellen bei einer Helligkeit von 12 oder höher. Wenn es schmilzt oder abgeaut wird, und darunter ein anderer Block war, wird er sich in eine Wasserquelle verwandeln. +In the End dimension, starting a fire on this block will create an eternal fire.=In der Ende-Dimension wird Feuer auf diesem Block ewig brennen. +Iron Ingot=Eisenbarren +Iron Nugget=Eisenklumpen +Iron Ore=Eisenerz +Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots.=Eisenklumpen sind sehr kleine Brocken aus geschmolzenem Eisen; ihr Hauptzweck besteht darin, Eisenbarren herzustellen. +Jungle Bark=Dschungelrinde +Jungle Leaves=Dschungelblätter +Jungle Sapling=Dschungelsetzling +Jungle Wood=Dschungelholz +Jungle Wood Planks=Dschungelholzplanken +Jungle leaves are grown from jungle trees.=Dschungelblätter wachsen an Dschungelbäumen. +Ladder=Leiter +Lapis Lazuli Block=Lapislazuliblock +Lapis Lazuli Ore=Lapislazulierz +Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world.=Lapislazulierz ist das Erz von Lapislazuli. Es kann relativ selten in Ansammlungen in der Nähe des Weltbodens gefunden werden. +Lava Source=Lavaquelle +Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.=Lava ist heiß und ziemlich gefährlich. Berühren Sie sie nicht, es wird Sie verletzen und es ist schwierig, ihr zu entkommen. +Light Blue Stained Glass=Hellblaues Glas +Light Grey Stained Glass=Hellgraues Glas +Lime Stained Glass=Lindgrünes Glas +Lit Redstone Ore=Leuchtendes Redstoneerz +Magenta Stained Glass=Magenta Glas +Molten gold. It is used to craft armor, tools, and whatnot.=Geschmolzenes Gold. Es wird benutzt, um Rüstungen, Werkzeuge, und anderes herzustellen. +Molten iron. It is used to craft armor, tools, and whatnot.=Geschmolzenes Eisen. Es wird benutzt, um Rüstungen, Werkzeuge, und vieles mehr herzustellen. + +Moss Stone=Moosstein +Mossy Stone Bricks=Moosige Steinziegel +Mycelium=Myzel +Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt.=Myzel ist eine Art Erde und der perfekte Nährboden für Pilze. Anders als bei anderen erdähnlichen Blöcken kann es mit einer Hacke nicht zu Ackerboden verwandelt werden. Im Licht wird sich Myzel langsam auf benachbarte Erde ausbreiten. Unter einem lichtundurchlässigen Block oder einer Flüssigkeit wird es sich früher oder später zurück zu Erde verwandeln. +Oak Bark=Eichenrinde +Oak Leaves=Eichenblätter +Oak Sapling=Eichensetzling +Oak Wood=Eichenholz +Oak Wood Planks=Eichenholzplanken +Oak leaves are grown from oak trees.=Eichenblätter wachsen von Eichen. +Obsidian=Obsidian +Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava.=Obsidian ist ein extrem hartes Mineral mit einem enormen Sprengwiderstand. +One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.=Eines der häufigsten Blöcke der Welt, fast der ganze Untergrund besteht aus stein. Er enthält manchmal Erze. Stein kann entstehen, wenn Wasser auf Lava trifft. +Orange Stained Glass=Orange Glas +Packed Ice=Packeis +Packed ice is a compressed form of ice. It is opaque and solid.=Packeis ist eine kompakte Eisform. Es ist undurchsichtig und fest. +Paper=Papier +Paper is used to craft books and maps.=Papier wird benutzt, um Bücher und Karten herzustellen. +Pink Stained Glass=Rosa Glas +Podzol=Podsol +Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.=Podsol ist eine Art Erde, die man in Taigawäldern finden kann. Nur wenige Pflanzen können hierauf wachsen. +Polished Andesite=Polierter Andesit +Polished Diorite=Polierter Diorit +Polished Granite=Polierter Granit +Polished Stone=Polierter Stein +Polished andesite is a decorational building block made from andesite.=Polierter Andesit ist ein dekorativer Block zum Bauen, der aus Andesit gemacht wurde. +Polished diorite is a decorational building block made from diorite.=Polierter Diorit ist ein dekorativer Block zum Bauen, der aus Diorit gemacht wurde. +Polished granite is a decorational building block made from granite.=Polierter Granit ist ein dekorativer Block zum Bauen, der aus Granit gemacht wurde. +Purple Stained Glass=Violettes Glas +Realm Barrier=Reichsbarriere +Red Sand=Roter Sand +Red Sandstone=Roter Sandstein +Red Stained Glass=Rotes Glas +Red sand is found in large quantities in mesa biomes.=Roter Sand kommt in großen Mengen bei Tafelbergbiomen vor. +Red sandstone is compressed red sand and is a rather soft kind of stone.=Roter Sandstein ist komprimierter roter Sand und ein relativ weiches Gestein. +Redstone Ore=Redstone-Erz +Redstone ore is commonly found near the bottom of the world. It glows when it is punched or walked upon.=Redstone-Erz kommt oft in der Nähe des Weltbodens vor. Er leuchtet, wenn er berührt wird. +Sand=Sand +Sand is found in large quantities at beaches and deserts.=Sand kommt in großen Mengen an Stränden und in Wüsten vor. +Sandstone=Sandstein +Sandstone is compressed sand and is a rather soft kind of stone.=Sandstein ist komprimierter Sand und ein relativ weiches Gestein. +Slime Block=Schleimblock +Slime blocks are very bouncy and prevent fall damage.=Schleimblöcke sind sehr sprunghaft und verhindern Fallschaden. +Smooth Red Sandstone=Weicher roter Sandstein +Smooth Sandstone=Weicher Sandstein +Smooth red sandstone is a decorational building block.=Weicher roter Sandstein ist ein decorativer Block zum Bauen. +Smooth sandstone is compressed sand and is a rather soft kind of stone.=Weicher Sandstein ist komprimierter Sand und ein relativ weiches Gestein. +Snow=Schnee +Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=Etwas Kohle im Stein, es kommt sehr häufig vor und kann in mittelgroßen bis großen Ansammlungen im Stein bei fast jeder Höhe gefunden werden. +Some iron contained in stone, it is prety common and can be found below sea level.=Etwas Eisen umschlossen von Stein, es ist recht verbreitet und kann unter der Meeresoberfläche gefunden werden. +Spruce Bark=Fichtenrinde +Spruce Leaves=Fichtenblätter +Spruce Sapling=Fichtensetzling +Spruce Wood=Fichtenholz +Spruce Wood Planks=Fichtenholzplanken +Spruce leaves are grown from spruce trees.=Fichtenblätter wachsen an Fichten. +Stained glass is a decorational and mostly transparent block which comes in various different colors.=Farbglas ist ein dekorativer und größtenteils durchsichtiger Block, der in verschiedenen Farben daherkommt. +Stick=Stock +Sticks are a very versatile crafting material; used in countless crafting recipes.=Stöcke sind ein vielseitiges Material, sie werden in zahllosen Fertigungsrezepten gebraucht. +Stone=Stein +Stone Bricks=Steinziegel +Sugar=Zucker +Sugar Canes=Zuckerrohr +Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.=Zuckerrohr ist eine Pflanze, die in der Herstellung gebraucht wird. Zuckerrohr wird in der Nähe von Wasser bis zu 3 zusätzliche Blöcke wachsen lassen, wenn sie sich neben Wasser befinden und auf einem Grasblock, auf Erde, Sand, roten Sand, Podsol oder grobe Erde platziert wurden. Wird ein Zuckerrohr abgebrochen, werden alle verbundenen Zuckerrohrblöcke ebenfalls abbrechen. +Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.=Zuckerrohr kann nur auf Zuckerrohr platziert werden und auf Blöcken, auf denen Zuckerrohr wachsen würde. +Sugar comes from sugar canes and is used to make sweet foods.=Zucker kommt von Zuckerrohr und wird benutzt, um süße Lebensmittel zu machen. +The trunk of a birch tree.=Der Baumstamm einer Birke. +The trunk of a dark oak tree.=Der Baumstamm einer Dunkeleiche. +The trunk of a jungle tree.=Der Baumstamm eines Dschungelbaums. +The trunk of a spruce tree.=Der Baumstamm einer Fichte. +The trunk of an acacia.=Der Baumstamm einer Akazie. +The trunk of an oak tree.=Der Baumstamm einer Eiche. +This block consists of a couple of loose stones and can't support itself.=Diser Block besteht aus ein paar losen Steinchen und kann sich nicht selbst tragen. +This is a decorative block surrounded by the bark of a tree trunk.=Dies ist ein dekorativer Block, der von der Rinde eines Baumstamms umgeben ist. +This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.=Ein ganzer Block aus Schnee. Schnee von dieser Dicke wird üblicherweise in Gebieten extremer Kälte gefunden. +This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.=Dies ist ein Teil eines Kaktus, der für gewöhnlich in trockenen Gebieten wächst, vorallem Wüsten. Im Laufe der Zeit werden Kakteen auf bis zu 3 Blöcke hoch auf Sand oder rotem Sand wachsen. Ein Kaktus verletzt Lebewesen, die ihn berühren, er richtet jede halbe Sekunden 1 Schaden an. Wenn ein Kaktusblock bricht, werden alle Kaktusblöcke darüber auch abbrechen. +This stone contains pure gold, a rare metal.=Dieser Stein enthält pures Gold, ein seltenes Metall. +Top Snow=Schneeschicht +Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.=Eine Schneeschicht. Sie schmilzt in der Näche von Lichtquellen außer der Sonne bei einer Helligkeit von 12 oder höher. +Vines=Lianen +Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread.=Lianen sind erkletterbare Blöcke, die an den Seiten von festen ganzen Blöcken platziert werden können. Lianen wachsen langsam und breiten sich aus. +Void=Leere +Water=Wasser +Water Source=Wasserquelle +Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.=Wasser gibt es reichlich in Ozeanen und es kommt im Untergrund auch in einigen Quellen vor. Sie können im Wasser mit Leichtigkeit schwimmen, aber Sie müssen gelegentlich Luft holen. +When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.=Wird er auf einem Nährboden (wie Erde) platziert und ist er dem Licht ausgesetzt, wird ein Birkensetzling langsam zu einer Birke nach etwas Zeit heranwachsen. +When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. When there are 4 jungle saplings in a 2×2 square, they will grow to a huge jungle tree.=Wird er auf einem Nährboden (wie Erde) platziert und ist er dem Licht ausgesetzt, wird ein Dschungelsetzling langsam zu einem Dschungelbaum nach etwas Zeit heranwachsen. Gibt es 4 Dschungelsetzlinge in einem 2×2-Quadrat, werden sie zu einem riesigen Dschungelbaum heranwachsen. +When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce after some time. When there are 4 spruce saplings in a 2×2 square, they will grow to a huge spruce.=Wird er auf einem Nährboden (wie Erde) platziert und ist er dem Licht ausgesetzt, wird ein Fichtensetzling langsam zu einer Fichte nach etwas Zeit heranwachsen. Gibt es 4 Fichtensetzlinge in einem 2×2-Quadrat, werden sie zu einer Riesenfichte heranwachsen. +When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.=Wird er auf einem Nährboden (wie Erde) platziert und ist er dem Licht ausgesetzt, wird ein Akaziensetzling langsam zu einer Akazie nach etwas Zeit heranwachsen. +When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time.=Wird er auf einem Nährboden (wie Erde) platziert und ist er dem Licht ausgesetzt, wird ein Eichensetzling langsam zu einer Eiche nach etwas Zeit heranwachsen. +When you hold a barrier in hand, you reveal all placed barriers in a short distance around you.=Wenn Sie eine Barriere in der Hand halten, legen Sie alle Barrieren in Ihrer Nähe offen. +White Stained Glass=Weißes Glas +Yellow Stained Glass=Gelbes Glas +“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.=„Kohle“ meint Kohleklumpen, die herausfallen, wenn Kohleerz gegraben wird, was im Untergrund gefunden werden kann. Kohle ist der klassische Brennstoff für den Ofen, aber er kann auch benutzt werden, um Fackeln, Kohleblöcke und einige andere Dinge herzustellen. diff --git a/mods/ITEMS/mcl_core/locale/template.tr b/mods/ITEMS/mcl_core/locale/template.tr new file mode 100644 index 000000000..b0ec0e99f --- /dev/null +++ b/mods/ITEMS/mcl_core/locale/template.tr @@ -0,0 +1,238 @@ +# textdomain: mcl_core +%s could not survive in lava.= +%s died in lava.= +%s melted in lava.= +%s took a bath in a hot lava tub.= +A block of diamond is mostly a shiny decorational block but also useful as a compact storage of diamonds.= +A block of emerald is mostly a shiny decorational block but also useful as a compact storage of emeralds.= +A block of gold is mostly a shiny decorational block but also useful as a compact storage of gold ingots.= +A block of iron is mostly a decorational block but also useful as a compact storage of iron ingots.= +A cactus can only be placed on top of another cactus or any sand.= +A decorational and mostly transparent block.= +A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.= +A lapis lazuli block is mostly a decorational block but also useful as a compact storage of lapis lazuli.= +A lava source sets fire to a couple of air blocks above when they're next to a flammable block.= +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.= +Acacia Bark= +Acacia Leaves= +Acacia Sapling= +Acacia Wood= +Acacia Wood Planks= +Acacia leaves are grown from acacia trees.= +Andesite= +Andesite is an igneous rock.= +Apple= +Apples are food items which can be eaten.= +Barrier= +Barriers are invisble walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.= +Bedrock= +Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.= +Birch Bark= +Birch Leaves= +Birch Sapling= +Birch Wood= +Birch Wood Planks= +Birch leaves are grown from birch trees.= +Black Stained Glass= +Block of Coal= +Block of Diamond= +Block of Emerald= +Block of Gold= +Block of Iron= +Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.= +Blue Stained Glass= +Bone Block= +Bone blocks are decorational blocks and a compact storage of bone meal.= +Bowl= +Bowls are mainly used to hold tasty soups.= +Brick= +Brick Block= +Brick blocks are a good building material for building solid houses and can take quite a punch.= +Bricks are used to craft brick blocks.= +Brown Stained Glass= +Cactus= +Charcoal= +Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.= +Chiseled Red Sandstone= +Chiseled Sandstone= +Chiseled Stone Bricks= +Chiseled red sandstone is a decorational building block.= +Chiseled sandstone is a decorational building block.= +Clay= +Clay Ball= +Clay balls are a raw material, mainly used to create bricks in the furnace.= +Clay is a versatile kind of earth commonly found at beaches underwater.= +Coal= +Coal Ore= +Coarse Dirt= +Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.= +Cobblestone= +Cobweb= +Cobwebs can be walked through, but significantly slow you down.= +Cracked Stone Bricks= +Cut Red Sandstone= +Cut Sandstone= +Cut red sandstone is a decorational building block.= +Cut sandstone is a decorational building block.= +Cyan Stained Glass= +Dark Oak Bark= +Dark Oak Leaves= +Dark Oak Sapling= +Dark Oak Wood= +Dark Oak Wood Planks= +Dark oak leaves are grown from dark oak trees.= +Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.= +Dead Bush= +Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks.= +Diamond= +Diamond Ore= +Diamond ore is rare and can be found in clusters near the bottom of the world.= +Diamonds are precious minerals and useful to create the highest tier of armor and tools.= +Diorite= +Diorite is an igneous rock.= +Dirt= +Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby.= +Emerald= +Emerald Ore= +Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.= +Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.= +Flint= +Flint is a raw material.= +Flowing Lava= +Flowing Water= +Frosted Ice= +Frosted ice is a short-lived solid translucent block. It melts into a water source within a few seconds.= +Glass= +Gold Ingot= +Gold Nugget= +Gold Ore= +Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.= +Golden Apple= +Golden apples are precious food items which can be eaten.= +Granite= +Grass Block= +Grass Path= +Grass paths are a decorational variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.= +Gravel= +Green Stained Glass= +Grey Stained Glass= +Ice= +Ice is a translucent solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.= +In the End dimension, starting a fire on this block will create an eternal fire.= +Iron Ingot= +Iron Nugget= +Iron Ore= +Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots.= +Jungle Bark= +Jungle Leaves= +Jungle Sapling= +Jungle Wood= +Jungle Wood Planks= +Jungle leaves are grown from jungle trees.= +Ladder= +Lapis Lazuli Block= +Lapis Lazuli Ore= +Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world.= +Lava Source= +Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.= +Light Blue Stained Glass= +Light Grey Stained Glass= +Lime Stained Glass= +Lit Redstone Ore= +Magenta Stained Glass= +Molten gold. It is used to craft armor, tools, and whatnot.= +Molten iron. It is used to craft armor, tools, and whatnot.= +Moss Stone= +Mossy Stone Bricks= +Mycelium= +Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt.= +Oak Bark= +Oak Leaves= +Oak Sapling= +Oak Wood= +Oak Wood Planks= +Oak leaves are grown from oak trees.= +Obsidian= +Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava.= +One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.= +Orange Stained Glass= +Packed Ice= +Packed ice is a compressed form of ice. It is opaque and solid.= +Paper= +Paper is used to craft books and maps.= +Pink Stained Glass= +Podzol= +Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.= +Polished Andesite= +Polished Diorite= +Polished Granite= +Polished Stone= +Polished andesite is a decorational building block made from andesite.= +Polished diorite is a decorational building block made from diorite.= +Polished granite is a decorational building block made from granite.= +Purple Stained Glass= +Realm Barrier= +Red Sand= +Red Sandstone= +Red Stained Glass= +Red sand is found in large quantities in mesa biomes.= +Red sandstone is compressed red sand and is a rather soft kind of stone.= +Redstone Ore= +Redstone ore is commonly found near the bottom of the world. It glows when it is punched or walked upon.= +Sand= +Sand is found in large quantities at beaches and deserts.= +Sandstone= +Sandstone is compressed sand and is a rather soft kind of stone.= +Slime Block= +Slime blocks are very bouncy and prevent fall damage.= +Smooth Red Sandstone= +Smooth Sandstone= +Smooth red sandstone is a decorational building block.= +Smooth sandstone is compressed sand and is a rather soft kind of stone.= +Snow= +Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.= +Some iron contained in stone, it is prety common and can be found below sea level.= +Spruce Bark= +Spruce Leaves= +Spruce Sapling= +Spruce Wood= +Spruce Wood Planks= +Spruce leaves are grown from spruce trees.= +Stained glass is a decorational and mostly transparent block which comes in various different colors.= +Stick= +Sticks are a very versatile crafting material; used in countless crafting recipes.= +Stone= +Stone Bricks= +Sugar= +Sugar Canes= +Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.= +Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.= +Sugar comes from sugar canes and is used to make sweet foods.= +The trunk of a birch tree.= +The trunk of a dark oak tree.= +The trunk of a jungle tree.= +The trunk of a spruce tree.= +The trunk of an acacia.= +The trunk of an oak tree.= +This block consists of a couple of loose stones and can't support itself.= +This is a decorative block surrounded by the bark of a tree trunk.= +This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.= +This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.= +This stone contains pure gold, a rare metal.= +Top Snow= +Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.= +Vines= +Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread.= +Void= +Water= +Water Source= +Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.= +When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.= +When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. When there are 4 jungle saplings in a 2×2 square, they will grow to a huge jungle tree.= +When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce after some time. When there are 4 spruce saplings in a 2×2 square, they will grow to a huge spruce.= +When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.= +When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time.= +When you hold a barrier in hand, you reveal all placed barriers in a short distance around you.= +White Stained Glass= +Yellow Stained Glass= +“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.= From c6efa8a6262fa4a568cb4ced8a12ca69011dc6df Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 05:51:58 +0100 Subject: [PATCH 098/379] Close formspecs when double chest breaks --- mods/ITEMS/mcl_chests/init.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 9f0ebd45b..e17450aed 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -220,6 +220,9 @@ minetest.register_node("mcl_chests:"..basename.."_left", { if not p or minetest.get_node(p).name ~= "mcl_chests:"..basename.."_right" then return end + for pl=1, #players do + minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..formspec_basename.."_"..p.x.."_"..p.y.."_"..p.z) + end minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 }) end, after_dig_node = function(pos, oldnode, oldmetadata, digger) @@ -341,6 +344,9 @@ minetest.register_node("mcl_chests:"..basename.."_right", { if not p or minetest.get_node(p).name ~= "mcl_chests:"..basename.."_left" then return end + for pl=1, #players do + minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..formspec_basename.."_"..p.x.."_"..p.y.."_"..p.z) + end minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 }) end, after_dig_node = function(pos, oldnode, oldmetadata, digger) From 225930a2c73225041368aea750c260335841bcc8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 06:09:52 +0100 Subject: [PATCH 099/379] Constructing double chest part checks for neighbor ... and reverts to single chest if none found. Required for piston stuff. --- mods/ITEMS/mcl_chests/init.lua | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index e17450aed..d3ceeb3f0 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -204,6 +204,15 @@ minetest.register_node("mcl_chests:"..basename.."_left", { drop = drop, is_ground_content = false, sounds = mcl_sounds.node_sound_wood_defaults(), + on_construct = function(pos) + local n = minetest.get_node(pos) + local param2 = n.param2 + local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") + if not p or minetest.get_node(p).name ~= "mcl_chests:"..basename.."_right" then + n.name = "mcl_chests:"..basename + minetest.swap_node(pos, n) + end + end, on_destruct = function(pos) local n = minetest.get_node(pos) if n.name == "mcl_chests:"..basename then @@ -328,6 +337,15 @@ minetest.register_node("mcl_chests:"..basename.."_right", { drop = drop, is_ground_content = false, sounds = mcl_sounds.node_sound_wood_defaults(), + on_construct = function(pos) + local n = minetest.get_node(pos) + local param2 = n.param2 + local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") + if not p or minetest.get_node(p).name ~= "mcl_chests:"..basename.."_left" then + n.name = "mcl_chests:"..basename + minetest.swap_node(pos, n) + end + end, on_destruct = function(pos) local n = minetest.get_node(pos) if n.name == "mcl_chests:"..basename then From e6e9d137010b41d19a6ea41fd55f15ab8ab2b090 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 07:01:12 +0100 Subject: [PATCH 100/379] Piston support: banner, sign, armor stand, chests, daylight sensor, jukebox, noteblock --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 51 ++++++++----------- mods/ITEMS/mcl_banners/init.lua | 2 +- mods/ITEMS/mcl_signs/init.lua | 2 +- .../minetest-3d_armor/3d_armor_stand/init.lua | 6 +-- 4 files changed, 27 insertions(+), 34 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index a5820821c..1ac74e06f 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -316,21 +316,23 @@ function mesecon.mvps_move_objects(pos, dir, nodestack) end end -mesecon.register_mvps_stopper("mcl_core:obsidian") -mesecon.register_mvps_stopper("mcl_core:bedrock") +-- Unmovable by design mesecon.register_mvps_stopper("mcl_core:barrier") mesecon.register_mvps_stopper("mcl_core:realm_barrier") mesecon.register_mvps_stopper("mcl_core:void") -mesecon.register_mvps_stopper("mcl_chests:chest") -mesecon.register_mvps_stopper("mcl_chests:chest_left") -mesecon.register_mvps_stopper("mcl_chests:chest_right") -mesecon.register_mvps_stopper("mcl_chests:trapped_chest") -mesecon.register_mvps_stopper("mcl_chests:trapped_chest_left") -mesecon.register_mvps_stopper("mcl_chests:trapped_chest_right") -mesecon.register_mvps_stopper("mcl_chests:trapped_chest_on") -mesecon.register_mvps_stopper("mcl_chests:trapped_chest_on_left") -mesecon.register_mvps_stopper("mcl_chests:trapped_chest_on_right") +mesecon.register_mvps_stopper("mcl_core:bedrock") +mesecon.register_mvps_stopper("mcl_core:obsidian") mesecon.register_mvps_stopper("mcl_chests:ender_chest") +mesecon.register_mvps_stopper("mcl_mobspawners:spawner") +mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_off") +mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_on") +mesecon.register_mvps_stopper("mcl_portals:portal") +mesecon.register_mvps_stopper("mcl_portals:portal_end") +mesecon.register_mvps_stopper("mcl_portals:end_portal_frame") +mesecon.register_mvps_stopper("mcl_portals:end_portal_frame_eye") + +-- Unmovable by technical restrictions. +-- Open formspec would screw up if node is destroyed (minor problem) mesecon.register_mvps_stopper("mcl_furnaces:furnace") mesecon.register_mvps_stopper("mcl_furnaces:furnace_active") mesecon.register_mvps_stopper("mcl_hoppers:hopper") @@ -344,24 +346,15 @@ mesecon.register_mvps_stopper("mcl_dispensers:dispenser_down") mesecon.register_mvps_stopper("mcl_anvils:anvil") mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_1") mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_2") -mesecon.register_mvps_stopper("mcl_jukebox:jukebox") -mesecon.register_mvps_stopper("mcl_mobspawners:spawner") -mesecon.register_mvps_stopper("mcl_signs:standing_sign") -mesecon.register_mvps_stopper("mcl_signs:wall_sign") -mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_off") -mesecon.register_mvps_stopper("mesecons_commandblock:commandblock_on") -mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_off") -mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_on") -mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_off") -mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_on") -mesecon.register_mvps_stopper("mesecons_noteblock:noteblock") -mesecon.register_mvps_stopper("3d_armor_stand:armor_stand") -mesecon.register_mvps_stopper("mcl_banners:standing_banner") -mesecon.register_mvps_stopper("mcl_banners:hanging_banner") -mesecon.register_mvps_stopper("mcl_portals:portal") -mesecon.register_mvps_stopper("mcl_portals:portal_end") -mesecon.register_mvps_stopper("mcl_portals:end_portal_frame") -mesecon.register_mvps_stopper("mcl_portals:end_portal_frame_eye") +-- Would screw up on/off state of trapped chest (big problem) +mesecon.register_mvps_stopper("mcl_chests:trapped_chest") +mesecon.register_mvps_stopper("mcl_chests:trapped_chest_left") +mesecon.register_mvps_stopper("mcl_chests:trapped_chest_right") +mesecon.register_mvps_stopper("mcl_chests:trapped_chest_on") +mesecon.register_mvps_stopper("mcl_chests:trapped_chest_on_left") +mesecon.register_mvps_stopper("mcl_chests:trapped_chest_on_right") + +-- Glazed terracotta: unpullable mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_red") mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_orange") mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_yellow") diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index 2c7304b96..e908db9de 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -216,7 +216,7 @@ S("You can copy the pattern of a banner by placing two banners of the same color wield_image = "mcl_banners_item_base.png", selection_box = {type = "fixed", fixed= {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} }, - groups = {axey=1,handy=1, attached_node = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1, material_wood=1 }, + groups = {axey=1,handy=1, attached_node = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1, material_wood=1, dig_by_piston=1 }, stack_max = 16, sounds = node_sounds, drop = "", -- Item drops are handled in entity code diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index 866de83b2..2fada201a 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -172,7 +172,7 @@ local function get_wall_signtext_info(param2, nodename) end end -local sign_groups = {handy=1,axey=1, flammable=1, deco_block=1, material_wood=1, attached_node=1} +local sign_groups = {handy=1,axey=1, flammable=1, deco_block=1, material_wood=1, attached_node=1, dig_by_piston=1} local destruct_sign = function(pos) local objects = minetest.get_objects_inside_radius(pos, 0.5) diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua index 775c1f531..6254e98c1 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua @@ -88,7 +88,7 @@ if minetest.get_modpath("screwdriver") then on_rotate = screwdriver.disallow end --- FIXME: The armor stand should be an entity +-- TODO: The armor stand should be an entity minetest.register_node("3d_armor_stand:armor_stand", { description = S("Armor Stand"), _doc_items_longdesc = S("An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand."), @@ -107,8 +107,8 @@ minetest.register_node("3d_armor_stand:armor_stand", { type = "fixed", fixed = {-0.5,-0.5,-0.5, 0.5,1.4,0.5} }, - -- FIXME: This should be breakable by 2 quick punches - groups = {handy=1, deco_block=1}, + -- TODO: This should be breakable by 2 quick punches + groups = {handy=1, deco_block=1, dig_by_piston=1}, _mcl_hardness = 2, sounds = mcl_sounds.node_sound_wood_defaults(), on_construct = function(pos) From ad8403adbd777f7845bbeca3e7737e5e77a6736e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 07:23:10 +0100 Subject: [PATCH 101/379] Add piston support for trapped chests --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 6 --- mods/ITEMS/mcl_chests/init.lua | 46 ++++++++++++---------- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 1ac74e06f..9eaceb88d 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -347,12 +347,6 @@ mesecon.register_mvps_stopper("mcl_anvils:anvil") mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_1") mesecon.register_mvps_stopper("mcl_anvils:anvil_damage_2") -- Would screw up on/off state of trapped chest (big problem) -mesecon.register_mvps_stopper("mcl_chests:trapped_chest") -mesecon.register_mvps_stopper("mcl_chests:trapped_chest_left") -mesecon.register_mvps_stopper("mcl_chests:trapped_chest_right") -mesecon.register_mvps_stopper("mcl_chests:trapped_chest_on") -mesecon.register_mvps_stopper("mcl_chests:trapped_chest_on_left") -mesecon.register_mvps_stopper("mcl_chests:trapped_chest_on_right") -- Glazed terracotta: unpullable mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_red") diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index d3ceeb3f0..28639fa07 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -71,15 +71,17 @@ local player_chest_close = function(player) end -- This is a helper function to register both chests and trapped chests. Trapped chests will make use of the additional parameters -local register_chest = function(basename, desc, longdesc, usagehelp, tiles_table, hidden, mesecons, on_rightclick_addendum, on_rightclick_addendum_left, on_rightclick_addendum_right, drop, formspec_basename) +local register_chest = function(basename, desc, longdesc, usagehelp, tiles_table, hidden, mesecons, on_rightclick_addendum, on_rightclick_addendum_left, on_rightclick_addendum_right, drop, canonical_basename) -- START OF register_chest FUNCTION BODY if not drop then drop = "mcl_chests:"..basename else drop = "mcl_chests:"..drop end -if not formspec_basename then - formspec_basename = basename +-- The basename of the "canonical" version of the node, if set (e.g.: trapped_chest_on → trapped_chest). +-- Used to get a shared formspec ID and to swap the node back to the canonical version in on_construct. +if not canonical_basename then + canonical_basename = basename end minetest.register_node("mcl_chests:"..basename, { @@ -120,14 +122,16 @@ minetest.register_node("mcl_chests:"..basename, { -- BEGIN OF LISTRING WORKAROUND inv:set_size("input", 1) -- END OF LISTRING WORKAROUND - if minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "right")).name == "mcl_chests:"..basename then - minetest.swap_node(pos, {name="mcl_chests:"..basename.."_right",param2=param2}) + if minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "right")).name == "mcl_chests:"..canonical_basename then + minetest.swap_node(pos, {name="mcl_chests:"..canonical_basename.."_right",param2=param2}) local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") - minetest.swap_node(p, { name = "mcl_chests:"..basename.."_left", param2 = param2 }) - elseif minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "left")).name == "mcl_chests:"..basename then - minetest.swap_node(pos, {name="mcl_chests:"..basename.."_left",param2=param2}) + minetest.swap_node(p, { name = "mcl_chests:"..canonical_basename.."_left", param2 = param2 }) + elseif minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "left")).name == "mcl_chests:"..canonical_basename then + minetest.swap_node(pos, {name="mcl_chests:"..canonical_basename.."_left",param2=param2}) local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") - minetest.swap_node(p, { name = "mcl_chests:"..basename.."_right", param2 = param2 }) + minetest.swap_node(p, { name = "mcl_chests:"..canonical_basename.."_right", param2 = param2 }) + else + minetest.swap_node(pos, { name = "mcl_chests:"..canonical_basename, param2 = param2 }) end end, after_dig_node = function(pos, oldnode, oldmetadata, digger) @@ -170,7 +174,7 @@ minetest.register_node("mcl_chests:"..basename, { on_rightclick = function(pos, node, clicker) minetest.show_formspec(clicker:get_player_name(), - "mcl_chests:"..formspec_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, + "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,8.75]".. mcl_vars.inventory_header.. "background[-0.19,-0.25;9.41,10.48;mcl_chests_inventory_chest.png]".. @@ -189,7 +193,7 @@ minetest.register_node("mcl_chests:"..basename, { on_destruct = function(pos) local players = minetest.get_connected_players() for p=1, #players do - minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..formspec_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) + minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) end end, mesecons = mesecons, @@ -208,8 +212,8 @@ minetest.register_node("mcl_chests:"..basename.."_left", { local n = minetest.get_node(pos) local param2 = n.param2 local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") - if not p or minetest.get_node(p).name ~= "mcl_chests:"..basename.."_right" then - n.name = "mcl_chests:"..basename + if not p or minetest.get_node(p).name ~= "mcl_chests:"..canonical_basename.."_right" then + n.name = "mcl_chests:"..canonical_basename minetest.swap_node(pos, n) end end, @@ -221,7 +225,7 @@ minetest.register_node("mcl_chests:"..basename.."_left", { local players = minetest.get_connected_players() for p=1, #players do - minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..formspec_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) + minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) end local param2 = n.param2 @@ -230,7 +234,7 @@ minetest.register_node("mcl_chests:"..basename.."_left", { return end for pl=1, #players do - minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..formspec_basename.."_"..p.x.."_"..p.y.."_"..p.z) + minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..p.x.."_"..p.y.."_"..p.z) end minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 }) end, @@ -304,7 +308,7 @@ minetest.register_node("mcl_chests:"..basename.."_left", { local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") minetest.show_formspec(clicker:get_player_name(), - "mcl_chests:"..formspec_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, + "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,11.5]".. "background[-0.19,-0.25;9.41,12.5;mcl_chests_inventory_chest_large.png]".. mcl_vars.inventory_header.. @@ -341,8 +345,8 @@ minetest.register_node("mcl_chests:"..basename.."_right", { local n = minetest.get_node(pos) local param2 = n.param2 local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") - if not p or minetest.get_node(p).name ~= "mcl_chests:"..basename.."_left" then - n.name = "mcl_chests:"..basename + if not p or minetest.get_node(p).name ~= "mcl_chests:"..canonical_basename.."_left" then + n.name = "mcl_chests:"..canonical_basename minetest.swap_node(pos, n) end end, @@ -354,7 +358,7 @@ minetest.register_node("mcl_chests:"..basename.."_right", { local players = minetest.get_connected_players() for p=1, #players do - minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..formspec_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) + minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) end local param2 = n.param2 @@ -363,7 +367,7 @@ minetest.register_node("mcl_chests:"..basename.."_right", { return end for pl=1, #players do - minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..formspec_basename.."_"..p.x.."_"..p.y.."_"..p.z) + minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..p.x.."_"..p.y.."_"..p.z) end minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 }) end, @@ -437,7 +441,7 @@ minetest.register_node("mcl_chests:"..basename.."_right", { local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") minetest.show_formspec(clicker:get_player_name(), - "mcl_chests:"..formspec_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, + "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,11.5]".. "background[-0.19,-0.25;9.41,12.5;mcl_chests_inventory_chest_large.png]".. From 6d6fc3f34cdd89e72b26cba3594969599a77cd16 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 07:59:07 +0100 Subject: [PATCH 102/379] Disable active trapped chests at loading time --- mods/ITEMS/mcl_chests/init.lua | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 28639fa07..6f3c0ceb2 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -39,13 +39,8 @@ end local trapped_chest_mesecons_rules = mesecon.rules.pplate --- To be called if a player closed a chest -local player_chest_close = function(player) - local name = player:get_player_name() - if open_chests[name] == nil then - return - end - local pos = open_chests[name].pos +-- To be called when a chest is closed (only relevant for trapped chest atm) +local chest_update_after_close = function(pos) local node = minetest.get_node(pos) if node.name == "mcl_chests:trapped_chest_on" then @@ -66,6 +61,16 @@ local player_chest_close = function(player) minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) end +end + +-- To be called if a player closed a chest +local player_chest_close = function(player) + local name = player:get_player_name() + if open_chests[name] == nil then + return + end + local pos = open_chests[name].pos + chest_update_after_close(pos) open_chests[name] = nil end @@ -839,3 +844,16 @@ minetest.register_craft({ } }) +minetest.register_lbm({ + -- Disable active/open trapped chests when loaded because nobody could + -- have them open at loading time. + -- Fixes redstone weirdness. + label = "Disable active trapped chests", + name = "mcl_chests:reset_trapped_chests", + nodenames = { "mcl_chests:trapped_chest_on", "mcl_chests:trapped_chest_on_left", "mcl_chests:trapped_chest_on_right" }, + run_at_every_load = true, + action = function(pos, node) + minetest.log("error", "lbm!" ..minetest.pos_to_string(pos)) + chest_update_after_close(pos) + end, +}) From b9377a0dbfe885cdedf8dd287718893a57c12b8a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 08:25:00 +0100 Subject: [PATCH 103/379] Fix broken player init in mcl_hunger causing crash --- mods/PLAYER/mcl_hunger/api.lua | 25 +++++++++++++++++++------ mods/PLAYER/mcl_hunger/init.lua | 9 ++------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/api.lua b/mods/PLAYER/mcl_hunger/api.lua index ad609e055..46dc76fa2 100644 --- a/mods/PLAYER/mcl_hunger/api.lua +++ b/mods/PLAYER/mcl_hunger/api.lua @@ -1,19 +1,32 @@ mcl_hunger.registered_foods = {} +function mcl_hunger.init_player(player) + local meta = player:get_meta() + if meta:get_string("mcl_hunger:hunger") == "" then + meta:set_string("mcl_hunger:hunger", tostring(20)) + end + if meta:get_string("mcl_hunger:saturation") == "" then + meta:set_string("mcl_hunger:saturation", tostring(mcl_hunger.SATURATION_INIT)) + end + if meta:get_string("mcl_hunger:exhaustion") == "" then + meta:set_string("mcl_hunger:exhaustion", tostring(0)) + end +end + if mcl_hunger.active then function mcl_hunger.get_hunger(player) - local hunger = player:get_meta():get_string("mcl_hunger:hunger") or 20 - return tonumber(hunger) + local hunger = tonumber(player:get_meta():get_string("mcl_hunger:hunger")) or 20 + return hunger end function mcl_hunger.get_saturation(player) - local saturation = player:get_meta():get_string("mcl_hunger:saturation") or mcl_hunger.SATURATION_INIT - return tonumber(saturation) + local saturation = tonumber(player:get_meta():get_string("mcl_hunger:saturation")) or mcl_hunger.SATURATION_INIT + return saturation end function mcl_hunger.get_exhaustion(player) - local exhaustion = player:get_meta():get_string("mcl_hunger:exhaustion") or 0 - return tonumber(exhaustion) + local exhaustion = tonumber(player:get_meta():get_string("mcl_hunger:exhaustion")) or 0 + return exhaustion end function mcl_hunger.set_hunger(player, hunger, update_hudbars) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index 0e64a1906..a90bdb73e 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -96,15 +96,9 @@ if mcl_hunger.debug then hb.register_hudbar("exhaustion", 0xFFFFFF, S("Exhaust."), { icon = "mcl_hunger_icon_exhaustion.png", bgicon = "mcl_hunger_bgicon_exhaustion.png", bar = "mcl_hunger_bar_exhaustion.png" }, 0, mcl_hunger.EXHAUST_LVL, false, S("%s: %d/%d")) end -minetest.register_on_newplayer(function(player) - local name = player:get_player_name() - mcl_hunger.set_hunger(player, 20, false) - mcl_hunger.set_saturation(player, mcl_hunger.SATURATION_INIT, false) - mcl_hunger.set_exhaustion(player, 0, false) -end) - minetest.register_on_joinplayer(function(player) local name = player:get_player_name() + mcl_hunger.init_player(player) init_hud(player) mcl_hunger.poison_damage[name] = 0 mcl_hunger.poison_hunger[name] = 0 @@ -193,6 +187,7 @@ end) else minetest.register_on_joinplayer(function(player) + mcl_hunger.init_player(player) mcl_hunger.last_eat[player:get_player_name()] = -1 end) From 2f88b4221081b2614da1ff9294bd0bba8af07bef Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 08:40:52 +0100 Subject: [PATCH 104/379] Make armor stand attached --- mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua index 6254e98c1..332970b31 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua @@ -108,7 +108,7 @@ minetest.register_node("3d_armor_stand:armor_stand", { fixed = {-0.5,-0.5,-0.5, 0.5,1.4,0.5} }, -- TODO: This should be breakable by 2 quick punches - groups = {handy=1, deco_block=1, dig_by_piston=1}, + groups = {handy=1, deco_block=1, dig_by_piston=1, attached_node=1}, _mcl_hardness = 2, sounds = mcl_sounds.node_sound_wood_defaults(), on_construct = function(pos) From 4f2baf8506ab03f9cea0f5212913d2310fb2946c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 08:52:47 +0100 Subject: [PATCH 105/379] Play place sound if falling node hit the bottom --- mods/ENTITIES/mcl_falling_nodes/init.lua | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/mods/ENTITIES/mcl_falling_nodes/init.lua b/mods/ENTITIES/mcl_falling_nodes/init.lua index dfbf198e7..753f7c8c8 100644 --- a/mods/ENTITIES/mcl_falling_nodes/init.lua +++ b/mods/ENTITIES/mcl_falling_nodes/init.lua @@ -200,15 +200,19 @@ minetest.register_entity(":__builtin:falling_node", { for _, callback in pairs(minetest.registered_on_dignodes) do callback(np, n2) end - if minetest.registered_nodes[self.node.name] then + local def = minetest.registered_nodes[self.node.name] + if def then minetest.add_node(np, self.node) - if minetest.registered_nodes[self.node.name]._mcl_after_falling then - minetest.registered_nodes[self.node.name]._mcl_after_falling(np, get_falling_depth(self)) + if def._mcl_after_falling then + def._mcl_after_falling(np, get_falling_depth(self)) end if self.meta then local meta = minetest.get_meta(np) meta:from_table(self.meta) end + if def.sounds and def.sounds.place and def.sounds.place.name then + minetest.sound_play(def.sounds.place, {pos = np}) + end end else -- Drop the *falling node* as an item if the destination node is NOT buildable to @@ -238,8 +242,14 @@ minetest.register_entity(":__builtin:falling_node", { local npos3 = table.copy(npos) npos3.y = npos3.y - 1 minetest.add_node(npos3, self.node) - if minetest.registered_nodes[self.node.name]._mcl_after_falling then - minetest.registered_nodes[self.node.name]._mcl_after_falling(npos3, get_falling_depth(self)) + local def = minetest.registered_nodes[self.node.name] + if def then + if def._mcl_after_falling then + def._mcl_after_falling(npos3, get_falling_depth(self)) + end + if def.sounds and def.sounds.place and def.sounds.place.name then + minetest.sound_play(def.sounds.place, {pos = np}) + end end deal_falling_damage(self, dtime) self.object:remove() From eff91038e8bafcefcd1ad442fb29b542071df91d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 10:04:54 +0100 Subject: [PATCH 106/379] Fix crash if item dropped in end portal in the end --- mods/ITEMS/mcl_portals/portal_end.lua | 8 +++- mods/PLAYER/mcl_spawn/init.lua | 58 ++++++++++++++++----------- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index 8ba08b040..4a1a5fd42 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -239,9 +239,13 @@ minetest.register_abm({ local target if dim == "end" then -- End portal in the End: - -- Teleport back to the player's spawn in the Overworld. + -- Teleport back to the player's spawn or world spawn in the Overworld. - target = mcl_spawn.get_spawn_pos(obj) + if obj:is_player() then + target = mcl_spawn.get_spawn_pos(obj) + else + target = mcl_spawn.get_world_spawn_pos(obj) + end else -- End portal in any other dimension: -- Teleport to the End at a fixed position and generate a diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index b8f3f0869..9f8fa70ec 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -2,10 +2,39 @@ mcl_spawn = {} local mg_name = minetest.get_mapgen_setting("mg_name") --- Returns current custom spawn position of player. --- Returns nil if player has no custom spawn position. --- If player is nil or not a player, the default spawn point is returned. --- The second return value is true if spawn point is player-chosen, +local cached_world_spawn + +mcl_spawn.get_world_spawn_pos = function() + local spawn + spawn = minetest.setting_get_pos("static_spawnpoint") + if spawn then + return spawn + end + if cached_world_spawn then + return cached_world_spawn + end + -- 32 attempts to find a suitable spawn point + spawn = { x=math.random(-16, 16), y=8, z=math.random(-16, 16) } + for i=1, 32 do + local y = minetest.get_spawn_level(spawn.x, spawn.z) + if y then + spawn.y = y + cached_world_spawn = spawn + minetest.log("action", "[mcl_spawn] Dynamic world spawn determined to be "..minetest.pos_to_string(spawn)) + return spawn + end + -- Random walk + spawn.x = spawn.x + math.random(-64, 64) + spawn.z = spawn.z + math.random(-64, 64) + end + minetest.log("action", "[mcl_spawn] Failed to determine dynamic world spawn!") + -- Use dummy position if nothing found + return { x=math.random(-16, 16), y=8, z=math.random(-16, 16) } +end + +-- Returns a spawn position of player. +-- If player is nil or not a player, a world spawn point is returned. +-- The second return value is true if returned spawn point is player-chosen, -- false otherwise. mcl_spawn.get_spawn_pos = function(player) local spawn, custom_spawn = nil, false @@ -17,23 +46,9 @@ mcl_spawn.get_spawn_pos = function(player) end end if not spawn or spawn == "" then - spawn = minetest.setting_get_pos("static_spawnpoint") + spawn = mcl_spawn.get_world_spawn_pos() custom_spawn = false end - -- We are getting desperate ... - -- Use the first spawn point of the player - if not spawn or spawn == "" then - local attr = player:get_meta():get_string("mcl_spawn:first_spawn") - if attr ~= nil and attr ~= "" then - -- Adjust Y - spawn = minetest.string_to_pos(attr) - local y = minetest.get_spawn_level(spawn.x, spawn.z) - if y then - spawn.y = y - end - custom_spawn = false - end - end return spawn, custom_spawn end @@ -105,8 +120,3 @@ minetest.register_on_respawnplayer(function(player) end end) -minetest.register_on_newplayer(function(player) - -- Remember where the player spawned first - player:get_meta():set_string("mcl_spawn:first_spawn", minetest.pos_to_string(player:get_pos())) -end) - From 5dd650e921682b7e23c34a3bab454dd18c9daab5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 17:01:36 +0100 Subject: [PATCH 107/379] =?UTF-8?q?Change=20wording:=20=E2=80=9Cdecoration?= =?UTF-8?q?al=E2=80=9D=20=E2=86=92=20=E2=80=9Cdecorative=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/HELP/mcl_doc_basics/init.lua | 2 +- mods/ITEMS/mcl_colorblocks/init.lua | 4 +-- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 34 +++++++++++------------ mods/ITEMS/mcl_core/locale/template.tr | 34 +++++++++++------------ mods/ITEMS/mcl_core/nodes_base.lua | 28 +++++++++---------- mods/ITEMS/mcl_core/nodes_glass.lua | 4 +-- mods/ITEMS/mcl_core/nodes_misc.lua | 2 +- mods/ITEMS/mcl_end/building.lua | 4 +-- mods/ITEMS/mcl_flowerpots/init.lua | 2 +- mods/ITEMS/mcl_heads/description.txt | 2 +- mods/ITEMS/mcl_nether/init.lua | 2 +- mods/ITEMS/mcl_wool/init.lua | 2 +- 12 files changed, 60 insertions(+), 60 deletions(-) diff --git a/mods/HELP/mcl_doc_basics/init.lua b/mods/HELP/mcl_doc_basics/init.lua index 7b30533e2..d8b8c790a 100644 --- a/mods/HELP/mcl_doc_basics/init.lua +++ b/mods/HELP/mcl_doc_basics/init.lua @@ -59,7 +59,7 @@ S("Minetest is a free software game engine for games based on voxel gameplay, in S("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 can, however, be much more complex than this.").."\n\n".. -S("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.").."\n\n".. +S("A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorative blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.").."\n\n".. S("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.").."\n\n".. diff --git a/mods/ITEMS/mcl_colorblocks/init.lua b/mods/ITEMS/mcl_colorblocks/init.lua index 57e96e4d7..18faee845 100644 --- a/mods/ITEMS/mcl_colorblocks/init.lua +++ b/mods/ITEMS/mcl_colorblocks/init.lua @@ -22,9 +22,9 @@ block.dyes = { } local hc_desc = "Terracotta is a basic building material. It comes in many different colors." -local gt_desc = "Glazed terracotta is a decorational block with a complex pattern. It can be rotated by placing it in different directions." +local gt_desc = "Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions." local cp_desc = "Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water." -local conc_desc = "Concrete is a decorational block which comes in many different colors. It is notable for having a very strong and clean color.", +local conc_desc = "Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.", minetest.register_node("mcl_colorblocks:hardened_clay", { description = "Terracotta", diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index 717ccf353..8657503ac 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -3,14 +3,14 @@ %s died in lava.=%s starb in Lava. %s melted in lava.=%s schmolz in der Lava. %s took a bath in a hot lava tub.=%s nahm ein Bad in einer heißen Lavawanne. -A block of diamond is mostly a shiny decorational block but also useful as a compact storage of diamonds.=Ein Diamantblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Diamanten. -A block of emerald is mostly a shiny decorational block but also useful as a compact storage of emeralds.=Ein Smaragdblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Smaragden. -A block of gold is mostly a shiny decorational block but also useful as a compact storage of gold ingots.=Ein Goldblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Goldbarren. -A block of iron is mostly a decorational block but also useful as a compact storage of iron ingots.=Ein Eisenblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Eisenbarren. +A block of diamond is mostly a shiny decorative block but also useful as a compact storage of diamonds.=Ein Diamantblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Diamanten. +A block of emerald is mostly a shiny decorative block but also useful as a compact storage of emeralds.=Ein Smaragdblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Smaragden. +A block of gold is mostly a shiny decorative block but also useful as a compact storage of gold ingots.=Ein Goldblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Goldbarren. +A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots.=Ein Eisenblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Eisenbarren. A cactus can only be placed on top of another cactus or any sand.=Ein Kaktus kann nur auf einem anderen Kaktus oder auf beliebigem Sand platziert werden. -A decorational and mostly transparent block.=Ein Dekoblock, der größtenteils transparent ist. +A decorative and mostly transparent block.=Ein Dekoblock, der größtenteils transparent ist. A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.=Ein Grasblock ist Erde mit einer Grasschicht. Grasblöcke sind vielseitige Blöcke, die das Wachstum aller möglichen Pflanzen fördern. Mit einer Hacke kann man das Land bestellen und einen Ackerboden machen. Mit einer Schaufel verwandelt man ihn in einen Graspfad. Im Licht wird das Gras sich langsam auf benachbarte Erde ausbreiten. Unter einem lichtundurchlässigen Block kann sich dieser Block wieder zurück zu Erde verwandeln. -A lapis lazuli block is mostly a decorational block but also useful as a compact storage of lapis lazuli.=Ein Lapislazuliblock ist hauptsächlich ein Deko-Block aber er ist auch nützlich zur kompakten Aufbewahrung von Lapislazuli. +A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli.=Ein Lapislazuliblock ist hauptsächlich ein Deko-Block aber er ist auch nützlich zur kompakten Aufbewahrung von Lapislazuli. A lava source sets fire to a couple of air blocks above when they're next to a flammable block.=Eine Lavaquelle zündet einige Luftblöcke über ihr an, wenn sie sich neben einem entzündlichen Block befinden. 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.=Ein Leiterstück, mit dem Sie vertikal klettern können. Leitern können nur an der Seite fester Blöcke und nicht an Glas, Blättern, Eis, Platten, Leuchtsteinen oder Ozeanlaternen platziert werden. Acacia Bark=Akazienrinde @@ -42,7 +42,7 @@ Block of Iron=Eisenblock Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.=Kohleblöcke sind für eine kompakte Aufbewahrung von Kohle nützlich und sehr nützlich als Ofenbrennstoff. Ein Kohleblock ist so effizient wie 10 mal Kohle. Blue Stained Glass=Blaues Glas Bone Block=Knockenblock -Bone blocks are decorational blocks and a compact storage of bone meal.=Knochenblöcke sind Deko-Blöcke und geeignet zur kompakten Aufbewahrung von Knochenmehl. +Bone blocks are decorative blocks and a compact storage of bone meal.=Knochenblöcke sind Deko-Blöcke und geeignet zur kompakten Aufbewahrung von Knochenmehl. Bowl=Schale Bowls are mainly used to hold tasty soups.=Schalen werden hauptsächlich für leckere Suppen gebraucht. Brick=Ziegel @@ -56,8 +56,8 @@ Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It Chiseled Red Sandstone=Gemeißelter roter Sandstein Chiseled Sandstone=Gemeißelter Sandstein Chiseled Stone Bricks=Gemeißelte Steinziegel -Chiseled red sandstone is a decorational building block.=Gemeißelter roter Sandstein ist ein dekorativer Block zum Bauen. -Chiseled sandstone is a decorational building block.=Gemeißelter Sandstein ist ein dekorativer Block zum Bauen. +Chiseled red sandstone is a decorative building block.=Gemeißelter roter Sandstein ist ein dekorativer Block zum Bauen. +Chiseled sandstone is a decorative building block.=Gemeißelter Sandstein ist ein dekorativer Block zum Bauen. Clay=Ton Clay Ball=Tonklumpen Clay balls are a raw material, mainly used to create bricks in the furnace.=Tonklumpen sind ein Rohstoff, sie werden hauptsächlich zur Ziegelherstellung im Ofen benutzt. @@ -72,8 +72,8 @@ Cobwebs can be walked through, but significantly slow you down.=Spinnennetze kö Cracked Stone Bricks=Brüchige Steinziegel Cut Red Sandstone=Geschliffener roter Sandstein Cut Sandstone=Geschliffener Sandstein -Cut red sandstone is a decorational building block.=Geschliffener roter Sandstein ist ein dekorativer Block zum Bauen. -Cut sandstone is a decorational building block.=Geschliffener Sandstein ist ein dekorativer Block zum Bauen. +Cut red sandstone is a decorative building block.=Geschliffener roter Sandstein ist ein dekorativer Block zum Bauen. +Cut sandstone is a decorative building block.=Geschliffener Sandstein ist ein dekorativer Block zum Bauen. Cyan Stained Glass=Türkises Glas Dark Oak Bark=Dunkeleichenrinde Dark Oak Leaves=Dunkeleichenblätter @@ -112,7 +112,7 @@ Golden apples are precious food items which can be eaten.=Goldene Äpfel sind ko Granite=Granit Grass Block=Grasblock Grass Path=Graspfad -Grass paths are a decorational variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Graspfade sind eine dekorative Variante von Grasblöcken. Ihre Oberseite hat eine andere Farbe und sie sind etwas niedriger als Grasblöcke, wodurch sie nützlich sind, um Fußwege zu errichten. Graspfade werden mit einer Schaufel errichtet. Ein Grasphad verwandelt sich in Erde, wenn er sich unter einem festen Block befindet. +Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Graspfade sind eine dekorative Variante von Grasblöcken. Ihre Oberseite hat eine andere Farbe und sie sind etwas niedriger als Grasblöcke, wodurch sie nützlich sind, um Fußwege zu errichten. Graspfade werden mit einer Schaufel errichtet. Ein Grasphad verwandelt sich in Erde, wenn er sich unter einem festen Block befindet. Gravel=Kies Green Stained Glass=Grünes Glas Grey Stained Glass=Graues Glas @@ -168,9 +168,9 @@ Polished Andesite=Polierter Andesit Polished Diorite=Polierter Diorit Polished Granite=Polierter Granit Polished Stone=Polierter Stein -Polished andesite is a decorational building block made from andesite.=Polierter Andesit ist ein dekorativer Block zum Bauen, der aus Andesit gemacht wurde. -Polished diorite is a decorational building block made from diorite.=Polierter Diorit ist ein dekorativer Block zum Bauen, der aus Diorit gemacht wurde. -Polished granite is a decorational building block made from granite.=Polierter Granit ist ein dekorativer Block zum Bauen, der aus Granit gemacht wurde. +Polished andesite is a decorative building block made from andesite.=Polierter Andesit ist ein dekorativer Block zum Bauen, der aus Andesit gemacht wurde. +Polished diorite is a decorative building block made from diorite.=Polierter Diorit ist ein dekorativer Block zum Bauen, der aus Diorit gemacht wurde. +Polished granite is a decorative building block made from granite.=Polierter Granit ist ein dekorativer Block zum Bauen, der aus Granit gemacht wurde. Purple Stained Glass=Violettes Glas Realm Barrier=Reichsbarriere Red Sand=Roter Sand @@ -188,7 +188,7 @@ Slime Block=Schleimblock Slime blocks are very bouncy and prevent fall damage.=Schleimblöcke sind sehr sprunghaft und verhindern Fallschaden. Smooth Red Sandstone=Weicher roter Sandstein Smooth Sandstone=Weicher Sandstein -Smooth red sandstone is a decorational building block.=Weicher roter Sandstein ist ein decorativer Block zum Bauen. +Smooth red sandstone is a decorative building block.=Weicher roter Sandstein ist ein decorativer Block zum Bauen. Smooth sandstone is compressed sand and is a rather soft kind of stone.=Weicher Sandstein ist komprimierter Sand und ein relativ weiches Gestein. Snow=Schnee Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=Etwas Kohle im Stein, es kommt sehr häufig vor und kann in mittelgroßen bis großen Ansammlungen im Stein bei fast jeder Höhe gefunden werden. @@ -199,7 +199,7 @@ Spruce Sapling=Fichtensetzling Spruce Wood=Fichtenholz Spruce Wood Planks=Fichtenholzplanken Spruce leaves are grown from spruce trees.=Fichtenblätter wachsen an Fichten. -Stained glass is a decorational and mostly transparent block which comes in various different colors.=Farbglas ist ein dekorativer und größtenteils durchsichtiger Block, der in verschiedenen Farben daherkommt. +Stained glass is a decorative and mostly transparent block which comes in various different colors.=Farbglas ist ein dekorativer und größtenteils durchsichtiger Block, der in verschiedenen Farben daherkommt. Stick=Stock Sticks are a very versatile crafting material; used in countless crafting recipes.=Stöcke sind ein vielseitiges Material, sie werden in zahllosen Fertigungsrezepten gebraucht. Stone=Stein diff --git a/mods/ITEMS/mcl_core/locale/template.tr b/mods/ITEMS/mcl_core/locale/template.tr index b0ec0e99f..6bb6474a3 100644 --- a/mods/ITEMS/mcl_core/locale/template.tr +++ b/mods/ITEMS/mcl_core/locale/template.tr @@ -3,14 +3,14 @@ %s died in lava.= %s melted in lava.= %s took a bath in a hot lava tub.= -A block of diamond is mostly a shiny decorational block but also useful as a compact storage of diamonds.= -A block of emerald is mostly a shiny decorational block but also useful as a compact storage of emeralds.= -A block of gold is mostly a shiny decorational block but also useful as a compact storage of gold ingots.= -A block of iron is mostly a decorational block but also useful as a compact storage of iron ingots.= +A block of diamond is mostly a shiny decorative block but also useful as a compact storage of diamonds.= +A block of emerald is mostly a shiny decorative block but also useful as a compact storage of emeralds.= +A block of gold is mostly a shiny decorative block but also useful as a compact storage of gold ingots.= +A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots.= A cactus can only be placed on top of another cactus or any sand.= -A decorational and mostly transparent block.= +A decorative and mostly transparent block.= A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.= -A lapis lazuli block is mostly a decorational block but also useful as a compact storage of lapis lazuli.= +A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli.= A lava source sets fire to a couple of air blocks above when they're next to a flammable block.= 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.= Acacia Bark= @@ -42,7 +42,7 @@ Block of Iron= Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.= Blue Stained Glass= Bone Block= -Bone blocks are decorational blocks and a compact storage of bone meal.= +Bone blocks are decorative blocks and a compact storage of bone meal.= Bowl= Bowls are mainly used to hold tasty soups.= Brick= @@ -56,8 +56,8 @@ Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It Chiseled Red Sandstone= Chiseled Sandstone= Chiseled Stone Bricks= -Chiseled red sandstone is a decorational building block.= -Chiseled sandstone is a decorational building block.= +Chiseled red sandstone is a decorative building block.= +Chiseled sandstone is a decorative building block.= Clay= Clay Ball= Clay balls are a raw material, mainly used to create bricks in the furnace.= @@ -72,8 +72,8 @@ Cobwebs can be walked through, but significantly slow you down.= Cracked Stone Bricks= Cut Red Sandstone= Cut Sandstone= -Cut red sandstone is a decorational building block.= -Cut sandstone is a decorational building block.= +Cut red sandstone is a decorative building block.= +Cut sandstone is a decorative building block.= Cyan Stained Glass= Dark Oak Bark= Dark Oak Leaves= @@ -112,7 +112,7 @@ Golden apples are precious food items which can be eaten.= Granite= Grass Block= Grass Path= -Grass paths are a decorational variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.= +Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.= Gravel= Green Stained Glass= Grey Stained Glass= @@ -167,9 +167,9 @@ Polished Andesite= Polished Diorite= Polished Granite= Polished Stone= -Polished andesite is a decorational building block made from andesite.= -Polished diorite is a decorational building block made from diorite.= -Polished granite is a decorational building block made from granite.= +Polished andesite is a decorative building block made from andesite.= +Polished diorite is a decorative building block made from diorite.= +Polished granite is a decorative building block made from granite.= Purple Stained Glass= Realm Barrier= Red Sand= @@ -187,7 +187,7 @@ Slime Block= Slime blocks are very bouncy and prevent fall damage.= Smooth Red Sandstone= Smooth Sandstone= -Smooth red sandstone is a decorational building block.= +Smooth red sandstone is a decorative building block.= Smooth sandstone is compressed sand and is a rather soft kind of stone.= Snow= Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.= @@ -198,7 +198,7 @@ Spruce Sapling= Spruce Wood= Spruce Wood Planks= Spruce leaves are grown from spruce trees.= -Stained glass is a decorational and mostly transparent block which comes in various different colors.= +Stained glass is a decorative and mostly transparent block which comes in various different colors.= Stick= Sticks are a very versatile crafting material; used in countless crafting recipes.= Stone= diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index d395c33a5..eef73e5a2 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -249,7 +249,7 @@ minetest.register_node("mcl_core:granite", { minetest.register_node("mcl_core:granite_smooth", { description = S("Polished Granite"), - _doc_items_longdesc = S("Polished granite is a decorational building block made from granite."), + _doc_items_longdesc = S("Polished granite is a decorative building block made from granite."), tiles = {"mcl_core_granite_smooth.png"}, stack_max = 64, is_ground_content = false, @@ -273,7 +273,7 @@ minetest.register_node("mcl_core:andesite", { minetest.register_node("mcl_core:andesite_smooth", { description = S("Polished Andesite"), - _doc_items_longdesc = S("Polished andesite is a decorational building block made from andesite."), + _doc_items_longdesc = S("Polished andesite is a decorative building block made from andesite."), tiles = {"mcl_core_andesite_smooth.png"}, is_ground_content = false, stack_max = 64, @@ -297,7 +297,7 @@ minetest.register_node("mcl_core:diorite", { minetest.register_node("mcl_core:diorite_smooth", { description = S("Polished Diorite"), - _doc_items_longdesc = S("Polished diorite is a decorational building block made from diorite."), + _doc_items_longdesc = S("Polished diorite is a decorative building block made from diorite."), tiles = {"mcl_core_diorite_smooth.png"}, is_ground_content = false, stack_max = 64, @@ -370,7 +370,7 @@ end minetest.register_node("mcl_core:grass_path", { tiles = {"mcl_core_grass_path_top.png", "default_dirt.png", "mcl_core_grass_path_side.png"}, description = S("Grass Path"), - _doc_items_longdesc = S("Grass paths are a decorational variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block."), + _doc_items_longdesc = S("Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block."), drop = "mcl_core:dirt", is_ground_content = true, drawtype = "nodebox", @@ -501,7 +501,7 @@ minetest.register_node("mcl_core:sandstone", { minetest.register_node("mcl_core:sandstonesmooth", { description = S("Cut Sandstone"), - _doc_items_longdesc = S("Cut sandstone is a decorational building block."), + _doc_items_longdesc = S("Cut sandstone is a decorative building block."), tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, @@ -513,7 +513,7 @@ minetest.register_node("mcl_core:sandstonesmooth", { minetest.register_node("mcl_core:sandstonecarved", { description = S("Chiseled Sandstone"), - _doc_items_longdesc = S("Chiseled sandstone is a decorational building block."), + _doc_items_longdesc = S("Chiseled sandstone is a decorative building block."), tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_carved.png"}, is_ground_content = false, stack_max = 64, @@ -564,7 +564,7 @@ minetest.register_node("mcl_core:redsandstone", { minetest.register_node("mcl_core:redsandstonesmooth", { description = S("Cut Red Sandstone"), - _doc_items_longdesc = S("Cut red sandstone is a decorational building block."), + _doc_items_longdesc = S("Cut red sandstone is a decorative building block."), tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, @@ -576,7 +576,7 @@ minetest.register_node("mcl_core:redsandstonesmooth", { minetest.register_node("mcl_core:redsandstonecarved", { description = S("Chiseled Red Sandstone"), - _doc_items_longdesc = S("Chiseled red sandstone is a decorational building block."), + _doc_items_longdesc = S("Chiseled red sandstone is a decorative building block."), tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_carved.png"}, is_ground_content = false, stack_max = 64, @@ -588,7 +588,7 @@ minetest.register_node("mcl_core:redsandstonecarved", { minetest.register_node("mcl_core:redsandstonesmooth2", { description = S("Smooth Red Sandstone"), - _doc_items_longdesc = S("Smooth red sandstone is a decorational building block."), + _doc_items_longdesc = S("Smooth red sandstone is a decorative building block."), tiles = {"mcl_core_red_sandstone_top.png"}, is_ground_content = false, stack_max = 64, @@ -706,7 +706,7 @@ minetest.register_node("mcl_core:coalblock", { minetest.register_node("mcl_core:ironblock", { description = S("Block of Iron"), - _doc_items_longdesc = S("A block of iron is mostly a decorational block but also useful as a compact storage of iron ingots."), + _doc_items_longdesc = S("A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots."), tiles = {"default_steel_block.png"}, is_ground_content = false, stack_max = 64, @@ -718,7 +718,7 @@ minetest.register_node("mcl_core:ironblock", { minetest.register_node("mcl_core:goldblock", { description = S("Block of Gold"), - _doc_items_longdesc = S("A block of gold is mostly a shiny decorational block but also useful as a compact storage of gold ingots."), + _doc_items_longdesc = S("A block of gold is mostly a shiny decorative block but also useful as a compact storage of gold ingots."), tiles = {"default_gold_block.png"}, is_ground_content = false, stack_max = 64, @@ -730,7 +730,7 @@ minetest.register_node("mcl_core:goldblock", { minetest.register_node("mcl_core:diamondblock", { description = S("Block of Diamond"), - _doc_items_longdesc = S("A block of diamond is mostly a shiny decorational block but also useful as a compact storage of diamonds."), + _doc_items_longdesc = S("A block of diamond is mostly a shiny decorative block but also useful as a compact storage of diamonds."), tiles = {"default_diamond_block.png"}, is_ground_content = false, stack_max = 64, @@ -742,7 +742,7 @@ minetest.register_node("mcl_core:diamondblock", { minetest.register_node("mcl_core:lapisblock", { description = S("Lapis Lazuli Block"), - _doc_items_longdesc = S("A lapis lazuli block is mostly a decorational block but also useful as a compact storage of lapis lazuli."), + _doc_items_longdesc = S("A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli."), tiles = {"mcl_core_lapis_block.png"}, is_ground_content = false, stack_max = 64, @@ -754,7 +754,7 @@ minetest.register_node("mcl_core:lapisblock", { minetest.register_node("mcl_core:emeraldblock", { description = S("Block of Emerald"), - _doc_items_longdesc = S("A block of emerald is mostly a shiny decorational block but also useful as a compact storage of emeralds."), + _doc_items_longdesc = S("A block of emerald is mostly a shiny decorative block but also useful as a compact storage of emeralds."), tiles = {"mcl_core_emerald_block.png"}, is_ground_content = false, stack_max = 64, diff --git a/mods/ITEMS/mcl_core/nodes_glass.lua b/mods/ITEMS/mcl_core/nodes_glass.lua index b9344962f..f87ce79ba 100644 --- a/mods/ITEMS/mcl_core/nodes_glass.lua +++ b/mods/ITEMS/mcl_core/nodes_glass.lua @@ -3,7 +3,7 @@ local S = minetest.get_translator("mcl_core") minetest.register_node("mcl_core:glass", { description = S("Glass"), - _doc_items_longdesc = S("A decorational and mostly transparent block."), + _doc_items_longdesc = S("A decorative and mostly transparent block."), drawtype = "glasslike", is_ground_content = false, tiles = {"default_glass.png"}, @@ -24,7 +24,7 @@ function mcl_core.add_glass(desc, recipeitem, colorgroup, color) minetest.register_node("mcl_core:glass_"..color, { description = desc, - _doc_items_longdesc = S("Stained glass is a decorational and mostly transparent block which comes in various different colors."), + _doc_items_longdesc = S("Stained glass is a decorative and mostly transparent block which comes in various different colors."), drawtype = "glasslike", is_ground_content = false, tiles = {"mcl_core_glass_"..color..".png"}, diff --git a/mods/ITEMS/mcl_core/nodes_misc.lua b/mods/ITEMS/mcl_core/nodes_misc.lua index 3eb402744..8d204fa95 100644 --- a/mods/ITEMS/mcl_core/nodes_misc.lua +++ b/mods/ITEMS/mcl_core/nodes_misc.lua @@ -3,7 +3,7 @@ local S = minetest.get_translator("mcl_core") minetest.register_node("mcl_core:bone_block", { description = S("Bone Block"), - _doc_items_longdesc = S("Bone blocks are decorational blocks and a compact storage of bone meal."), + _doc_items_longdesc = S("Bone blocks are decorative blocks and a compact storage of bone meal."), tiles = {"mcl_core_bone_block_top.png", "mcl_core_bone_block_top.png", "mcl_core_bone_block_side.png"}, is_ground_content = false, paramtype2 = "facedir", diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua index aeee897f0..174140ed0 100644 --- a/mods/ITEMS/mcl_end/building.lua +++ b/mods/ITEMS/mcl_end/building.lua @@ -52,7 +52,7 @@ minetest.register_node("mcl_end:purpur_pillar", { minetest.register_node("mcl_end:end_rod", { description = S("End Rod"), - _doc_items_longdesc = S("End rods are decorational light sources."), + _doc_items_longdesc = S("End rods are decorative light sources."), tiles = { "mcl_end_end_rod_top.png", "mcl_end_end_rod_bottom.png", @@ -127,7 +127,7 @@ minetest.register_node("mcl_end:end_rod", { minetest.register_node("mcl_end:dragon_egg", { description = S("Dragon Egg"), - _doc_items_longdesc = S("A dragon egg is a decorational item which can be placed."), + _doc_items_longdesc = S("A dragon egg is a decorative item which can be placed."), tiles = { "mcl_end_dragon_egg.png", "mcl_end_dragon_egg.png", diff --git a/mods/ITEMS/mcl_flowerpots/init.lua b/mods/ITEMS/mcl_flowerpots/init.lua index c58fab7cf..d0d74da88 100644 --- a/mods/ITEMS/mcl_flowerpots/init.lua +++ b/mods/ITEMS/mcl_flowerpots/init.lua @@ -29,7 +29,7 @@ local cubes = { minetest.register_node("mcl_flowerpots:flower_pot", { description = S("Flower Pot"), - _doc_items_longdesc = S("Flower pots are decorational blocks in which flowers and other small plants can be placed."), + _doc_items_longdesc = S("Flower pots are decorative blocks in which flowers and other small plants can be placed."), _doc_items_usagehelp = S("Rightclick an empty flower pot while you wield a plant to place the plant. 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."), drawtype = "mesh", mesh = "flowerpot.obj", diff --git a/mods/ITEMS/mcl_heads/description.txt b/mods/ITEMS/mcl_heads/description.txt index c3a38bb77..b169ba796 100644 --- a/mods/ITEMS/mcl_heads/description.txt +++ b/mods/ITEMS/mcl_heads/description.txt @@ -1 +1 @@ -Small decorational head blocks. +Small decorative head blocks. diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index 15d5f9318..d12b5a418 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -153,7 +153,7 @@ minetest.register_node("mcl_nether:red_nether_brick", { minetest.register_node("mcl_nether:nether_wart_block", { description = S("Nether Wart Block"), - _doc_items_longdesc = S("A nether wart block is a purely decorational block made from nether wart."), + _doc_items_longdesc = S("A nether wart block is a purely decorative block made from nether wart."), stack_max = 64, tiles = {"mcl_nether_nether_wart_block.png"}, is_ground_content = false, diff --git a/mods/ITEMS/mcl_wool/init.lua b/mods/ITEMS/mcl_wool/init.lua index 99e7344f6..40c2340b9 100644 --- a/mods/ITEMS/mcl_wool/init.lua +++ b/mods/ITEMS/mcl_wool/init.lua @@ -40,7 +40,7 @@ for _, row in ipairs(wool.dyes) do -- Node Definition minetest.register_node("mcl_wool:"..name, { description = desc_wool, - _doc_items_longdesc = S("Wool is a decorational block which comes in many different colors."), + _doc_items_longdesc = S("Wool is a decorative block which comes in many different colors."), stack_max = 64, is_ground_content = false, tiles = {texture..".png"}, From e2fd769657371e90e76cf25df1fae82cd745f680 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 18:52:24 +0100 Subject: [PATCH 108/379] New, stratum-based end stone generation --- mods/MAPGEN/mcl_biomes/init.lua | 102 ++++++++++++++++++++++++-------- 1 file changed, 76 insertions(+), 26 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 26efcee65..836548d70 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1606,47 +1606,97 @@ local function register_dimension_ores() --[[ THE END ]] -- Generate fake End - -- TODO: Remove both "ores" when there's a better End generator + -- TODO: Remove the "ores" when there's a better End generator + -- FIXME: Broken lighting in v6 mapgen + + local end_wherein + if mg_name == "v6" then + end_wherein = {"air", "mcl_core:stone"} + else + end_wherein = {"air"} + end minetest.register_ore({ - ore_type = "sheet", + ore_type = "stratum", ore = "mcl_end:end_stone", - wherein = {"air"}, + wherein = end_wherein, y_min = mcl_vars.mg_end_min+64, - y_max = mcl_vars.mg_end_min+80, - column_height_min = 6, - column_height_max = 7, - column_midpoint_factor = 0.0, + y_max = mcl_vars.mg_end_min+100, + noise_params = { + offset = mcl_vars.mg_end_min+70, + scale = -1, + spread = {x=126, y=126, z=126}, + seed = 9999, + octaves = 3, + persist = 0.5, + }, + + np_stratum_thickness = { offset = -2, - scale = 8, - spread = {x=100, y=100, z=100}, - seed = 2999, - octaves = 5, - persist = 0.55, + scale = 10, + spread = {x=126, y=126, z=126}, + seed = 9999, + octaves = 3, + persist = 0.5, }, - noise_threshold = 0, + clust_scarcity = 1, }) minetest.register_ore({ - ore_type = "sheet", + ore_type = "stratum", ore = "mcl_end:end_stone", - wherein = {"air"}, + wherein = end_wherein, y_min = mcl_vars.mg_end_min+64, - y_max = mcl_vars.mg_end_min+80, - column_height_min = 4, - column_height_max = 4, - column_midpoint_factor = 0.0, + y_max = mcl_vars.mg_end_min+100, + noise_params = { - offset = -4, - scale = 3, - spread = {x=200, y=200, z=200}, - seed = 5390, - octaves = 5, - persist = 0.6, + offset = mcl_vars.mg_end_min+72, + scale = -3, + spread = {x=84, y=84, z=84}, + seed = 999, + octaves = 4, + persist = 0.8, }, - noise_threshold = 0, + + np_stratum_thickness = { + offset = -4, + scale = 10, + spread = {x=84, y=84, z=84}, + seed = 999, + octaves = 4, + persist = 0.8, + }, + clust_scarcity = 1, }) + minetest.register_ore({ + ore_type = "stratum", + ore = "mcl_end:end_stone", + wherein = end_wherein, + y_min = mcl_vars.mg_end_min+64, + y_max = mcl_vars.mg_end_min+100, + + noise_params = { + offset = mcl_vars.mg_end_min+70, + scale = -2, + spread = {x=84, y=84, z=84}, + seed = 99, + octaves = 4, + persist = 0.85, + }, + + np_stratum_thickness = { + offset = -3, + scale = 5, + spread = {x=63, y=63, z=63}, + seed = 50, + octaves = 4, + persist = 0.85, + }, + clust_scarcity = 1, + }) + + end From 895b9e7e3ade5b39c5e43bf6325f7007f5771c26 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 19:15:10 +0100 Subject: [PATCH 109/379] More End tweaks --- mods/CORE/mcl_init/init.lua | 2 +- mods/MAPGEN/mcl_biomes/init.lua | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/mods/CORE/mcl_init/init.lua b/mods/CORE/mcl_init/init.lua index 7f310b9a4..afbe9dfa3 100644 --- a/mods/CORE/mcl_init/init.lua +++ b/mods/CORE/mcl_init/init.lua @@ -85,7 +85,7 @@ end mcl_vars.mg_end_min = -27073 -- Carefully chosen to be at a mapchunk border mcl_vars.mg_end_max_official = mcl_vars.mg_end_min + minecraft_height_limit mcl_vars.mg_end_max = mcl_vars.mg_overworld_min - 2000 -mcl_vars.mg_end_platform_pos = { x = 100, y = mcl_vars.mg_end_min + 80, z = 0 } +mcl_vars.mg_end_platform_pos = { x = 100, y = mcl_vars.mg_end_min + 74, z = 0 } -- Realm barrier used to safely separate the End from the void below the Overworld mcl_vars.mg_realm_barrier_overworld_end_max = mcl_vars.mg_end_max diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 836548d70..774ac96b7 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1,4 +1,5 @@ local mg_name = minetest.get_mapgen_setting("mg_name") +local mg_seed = minetest.get_mapgen_setting("seed") -- Some mapgen settings local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" @@ -1627,7 +1628,7 @@ local function register_dimension_ores() offset = mcl_vars.mg_end_min+70, scale = -1, spread = {x=126, y=126, z=126}, - seed = 9999, + seed = mg_seed+9999, octaves = 3, persist = 0.5, }, @@ -1636,7 +1637,7 @@ local function register_dimension_ores() offset = -2, scale = 10, spread = {x=126, y=126, z=126}, - seed = 9999, + seed = mg_seed+9999, octaves = 3, persist = 0.5, }, @@ -1654,7 +1655,7 @@ local function register_dimension_ores() offset = mcl_vars.mg_end_min+72, scale = -3, spread = {x=84, y=84, z=84}, - seed = 999, + seed = mg_seed+999, octaves = 4, persist = 0.8, }, @@ -1663,7 +1664,7 @@ local function register_dimension_ores() offset = -4, scale = 10, spread = {x=84, y=84, z=84}, - seed = 999, + seed = mg_seed+999, octaves = 4, persist = 0.8, }, @@ -1680,7 +1681,7 @@ local function register_dimension_ores() offset = mcl_vars.mg_end_min+70, scale = -2, spread = {x=84, y=84, z=84}, - seed = 99, + seed = mg_seed+99, octaves = 4, persist = 0.85, }, @@ -1689,7 +1690,7 @@ local function register_dimension_ores() offset = -3, scale = 5, spread = {x=63, y=63, z=63}, - seed = 50, + seed = mg_seed+50, octaves = 4, persist = 0.85, }, From 7a4aeb662533cdfbaafd2e29aad54c4a34fd382e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 21:02:40 +0100 Subject: [PATCH 110/379] Generate chorus plants in the End --- mods/ITEMS/mcl_end/chorus_plant.lua | 230 ++++++++++++++++------------ mods/MAPGEN/mcl_biomes/depends.txt | 1 + mods/MAPGEN/mcl_biomes/init.lua | 49 +++++- 3 files changed, 182 insertions(+), 98 deletions(-) diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index 1374e7746..6f7b849b0 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -3,6 +3,8 @@ local S = minetest.get_translator("mcl_end") +mcl_end = {} + --- Plant parts --- local MAX_FLOWER_AGE = 5 -- Maximum age of chorus flower before it dies @@ -168,6 +170,138 @@ minetest.register_node("mcl_end:chorus_plant", { _mcl_hardness = 0.4, }) +-- Grow a complete chorus plant at pos +mcl_end.grow_chorus_plant = function(pos, node) + local flowers = { pos } + -- Plant initial flower (if it isn't there already) + if not node then + node = minetest.get_node(pos) + end + if node.name ~= "mcl_end:chorus_flower" then + minetest.set_node(pos, { name = "mcl_end:chorus_flower" }) + end + while true do + local new_flowers_list = {} + for f=1, #flowers do + local new_flowers = mcl_end.grow_chorus_plant_step(flowers[f], minetest.get_node(flowers[f])) + if #new_flowers > 0 then + table.insert(new_flowers_list, new_flowers) + end + end + if #new_flowers_list == 0 then + return + end + flowers = {} + for l=1, #new_flowers_list do + for f=1, #new_flowers_list[l] do + table.insert(flowers, new_flowers_list[l][f]) + end + end + end +end + +-- Grow a single step of a chorus plant at pos. +-- Pos must be a chorus flower. +mcl_end.grow_chorus_plant_step = function(pos, node) + local new_flower_buds = {} + local above = { x = pos.x, y = pos.y + 1, z = pos.z } + local node_above = minetest.get_node(above) + local around = { + { x=-1, y=0, z= 0 }, + { x= 1, y=0, z= 0 }, + { x= 0, y=0, z=-1 }, + { x= 0, y=0, z= 1 }, + } + local air_around = true + for a=1, #around do + if minetest.get_node(vector.add(above, around[a])).name ~= "air" then + air_around = false + break + end + end + local grown = false + if node_above.name == "air" and air_around then + local branching = false + local h = 0 + for y=1, 4 do + local checkpos = {x=pos.x, y=pos.y-y, z=pos.z} + local node = minetest.get_node(checkpos) + if node.name == "mcl_end:chorus_plant" then + h = y + if not branching then + for a=1, #around do + local node_side = minetest.get_node(vector.add(checkpos, around[a])) + if node_side.name == "mcl_end:chorus_plant" then + branching = true + end + end + end + else + break + end + end + + local grow_chance + if h <= 1 then + grow_chance = 100 + elseif h == 2 and branching == false then + grow_chance = 60 + elseif h == 2 and branching == true then + grow_chance = 50 + elseif h == 3 and branching == false then + grow_chance = 40 + elseif h == 3 and branching == true then + grow_chance = 25 + elseif h == 4 and branching == false then + grow_chance = 20 + end + + if grow_chance then + local new_flowers = {} + local r = math.random(1, 100) + local age = node.param2 + if r <= grow_chance then + table.insert(new_flowers, above) + else + age = age + 1 + local branches + if branching == false then + branches = math.random(1, 4) + elseif branching == true then + branches = math.random(0, 3) + end + local branch_grown = false + for b=1, branches do + local next_branch = math.random(1, #around) + local branch = vector.add(pos, around[next_branch]) + local below_branch = vector.add(branch, {x=0,y=-1,z=0}) + if minetest.get_node(below_branch).name == "air" then + table.insert(new_flowers, branch) + end + end + end + + for _, f in ipairs(new_flowers) do + if age >= MAX_FLOWER_AGE then + minetest.set_node(f, {name="mcl_end:chorus_flower_dead"}) + grown = true + else + minetest.set_node(f, {name="mcl_end:chorus_flower", param2 = age}) + table.insert(new_flower_buds, f) + grown = true + end + end + if #new_flowers >= 1 then + minetest.set_node(pos, {name="mcl_end:chorus_plant"}) + grown = true + end + end + end + if not grown then + minetest.set_node(pos, {name = "mcl_end:chorus_flower_dead"}) + end + return new_flower_buds +end --- ABM --- minetest.register_abm({ @@ -176,101 +310,7 @@ minetest.register_abm({ interval = 35.0, chance = 4.0, action = function(pos, node, active_object_count, active_object_count_wider) - local above = { x = pos.x, y = pos.y + 1, z = pos.z } - local node_above = minetest.get_node(above) - local around = { - { x=-1, y=0, z= 0 }, - { x= 1, y=0, z= 0 }, - { x= 0, y=0, z=-1 }, - { x= 0, y=0, z= 1 }, - } - local air_around = true - for a=1, #around do - if minetest.get_node(vector.add(above, around[a])).name ~= "air" then - air_around = false - break - end - end - local grown = false - if node_above.name == "air" and air_around then - local branching = false - local h = 0 - for y=1, 4 do - local checkpos = {x=pos.x, y=pos.y-y, z=pos.z} - local node = minetest.get_node(checkpos) - if node.name == "mcl_end:chorus_plant" then - h = y - if not branching then - for a=1, #around do - local node_side = minetest.get_node(vector.add(checkpos, around[a])) - if node_side.name == "mcl_end:chorus_plant" then - branching = true - end - end - end - else - break - end - end - - local grow_chance - if h <= 1 then - grow_chance = 100 - elseif h == 2 and branching == false then - grow_chance = 60 - elseif h == 2 and branching == true then - grow_chance = 50 - elseif h == 3 and branching == false then - grow_chance = 40 - elseif h == 3 and branching == true then - grow_chance = 25 - elseif h == 4 and branching == false then - grow_chance = 20 - end - - if grow_chance then - local new_flowers = {} - local r = math.random(1, 100) - local age = node.param2 - if r <= grow_chance then - table.insert(new_flowers, above) - else - age = age + 1 - local branches - if branching == false then - branches = math.random(1, 4) - elseif branching == true then - branches = math.random(0, 3) - end - local branch_grown = false - for b=1, branches do - local next_branch = math.random(1, #around) - local branch = vector.add(pos, around[next_branch]) - local below_branch = vector.add(branch, {x=0,y=-1,z=0}) - if minetest.get_node(below_branch).name == "air" then - table.insert(new_flowers, branch) - end - end - end - - for _, f in ipairs(new_flowers) do - if age >= MAX_FLOWER_AGE then - minetest.set_node(f, {name="mcl_end:chorus_flower_dead"}) - grown = true - else - minetest.set_node(f, {name="mcl_end:chorus_flower", param2 = age}) - grown = true - end - end - if #new_flowers >= 1 then - minetest.set_node(pos, {name="mcl_end:chorus_plant"}) - grown = true - end - end - end - if not grown then - minetest.set_node(pos, {name = "mcl_end:chorus_flower_dead"}) - end + mcl_end.grow_chorus_plant_step(pos, node) end, }) diff --git a/mods/MAPGEN/mcl_biomes/depends.txt b/mods/MAPGEN/mcl_biomes/depends.txt index 3e94ed7ca..4ec3afaea 100644 --- a/mods/MAPGEN/mcl_biomes/depends.txt +++ b/mods/MAPGEN/mcl_biomes/depends.txt @@ -3,3 +3,4 @@ mcl_core mcl_worlds mcl_farming mcl_flowers +mcl_end diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 774ac96b7..a433bb85a 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -9,6 +9,8 @@ local generate_fallen_logs = minetest.settings:get_bool("mcl_generate_fallen_log -- Jungle bush schematic. In PC/Java Edition it's Jungle Wood + Oak Leaves local jungle_bush_schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_jungle_bush_oak_leaves.mts" +local chorus_plant_deco_id + -- -- Register biomes -- @@ -1697,8 +1699,6 @@ local function register_dimension_ores() clust_scarcity = 1, }) - - end @@ -3240,7 +3240,38 @@ end -- Decorations in non-Overworld dimensions local function register_dimension_decorations() - -- TODO + --[[ NETHER ]] + -- TODO: Nether + + --[[ THE END ]] + + -- Chorus plant + minetest.register_decoration({ + name = "mcl_biomes:chorus_plant", + deco_type = "simple", + place_on = {"mcl_end:end_stone", "air"}, + flags = "all_floors", + sidelen = 16, + noise_params = { + offset = -0.012, + scale = 0.024, + spread = {x = 100, y = 100, z = 100}, + seed = 257, + octaves = 3, + persist = 0.6 + }, + y_min = mcl_vars.mg_end_min, + y_max = mcl_vars.mg_end_max, + decoration = "mcl_end:chorus_flower", + height = 1, + biomes = { "End" }, + }) + + deco_id_chorus_plant = minetest.get_decoration_id("mcl_biomes:chorus_plant") + minetest.set_gen_notify({decoration=true}, { deco_id_chorus_plant }) + + -- TODO: End cities + end @@ -3273,5 +3304,17 @@ if mg_name ~= "singlenode" then register_dimension_decorations() -- Overworld decorations for v6 are handled in mcl_mapgen_core + + if deco_id_chorus_plant then + minetest.register_on_generated(function(minp, maxp, blockseed) + local gennotify = minetest.get_mapgen_object("gennotify") + local poslist = {} + for _, pos in ipairs(gennotify["decoration#"..deco_id_chorus_plant] or {}) do + local realpos = { x = pos.x, y = pos.y + 1, z = pos.z } + mcl_end.grow_chorus_plant(realpos) + end + end) + end + end From 05e8cc8a2c9c1935086bb3bc4d7e6682058c5d0a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 21:20:37 +0100 Subject: [PATCH 111/379] Don't turn water into end stone anymore --- mods/MAPGEN/mcl_biomes/init.lua | 6 +++--- mods/MAPGEN/mcl_mapgen_core/init.lua | 10 +--------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index a433bb85a..027d67450 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1624,7 +1624,7 @@ local function register_dimension_ores() ore = "mcl_end:end_stone", wherein = end_wherein, y_min = mcl_vars.mg_end_min+64, - y_max = mcl_vars.mg_end_min+100, + y_max = mcl_vars.mg_end_min+80, noise_params = { offset = mcl_vars.mg_end_min+70, @@ -1651,7 +1651,7 @@ local function register_dimension_ores() ore = "mcl_end:end_stone", wherein = end_wherein, y_min = mcl_vars.mg_end_min+64, - y_max = mcl_vars.mg_end_min+100, + y_max = mcl_vars.mg_end_min+80, noise_params = { offset = mcl_vars.mg_end_min+72, @@ -1677,7 +1677,7 @@ local function register_dimension_ores() ore = "mcl_end:end_stone", wherein = end_wherein, y_min = mcl_vars.mg_end_min+64, - y_max = mcl_vars.mg_end_min+100, + y_max = mcl_vars.mg_end_min+80, noise_params = { offset = mcl_vars.mg_end_min+70, diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 5bb284793..c245fdb81 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1841,15 +1841,7 @@ minetest.register_on_generated(function(minp, maxp, seed) local y = nodes[n].y local p_pos = area:index(nodes[n].x, y, nodes[n].z) - if data[p_pos] == c_water then - if y <= mcl_vars.mg_end_min + 104 and y >= mcl_vars.mg_end_min + 40 then - data[p_pos] = c_end_stone - lvm_used = true - else - data[p_pos] = c_air - lvm_used = true - end - elseif data[p_pos] == c_stone or data[p_pos] == c_dirt or data[p_pos] == c_sand then + if data[p_pos] == c_water or data[p_pos] == c_stone or data[p_pos] == c_dirt or data[p_pos] == c_sand then data[p_pos] = c_air lvm_used = true end From 655a240107fca15fa408a02fcdb3f275580a57d4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Mar 2019 23:19:14 +0100 Subject: [PATCH 112/379] Chorus plant: Prevent double placement of flowers --- mods/ITEMS/mcl_end/chorus_plant.lua | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index 6f7b849b0..f9f4a59af 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -283,12 +283,18 @@ mcl_end.grow_chorus_plant_step = function(pos, node) for _, f in ipairs(new_flowers) do if age >= MAX_FLOWER_AGE then - minetest.set_node(f, {name="mcl_end:chorus_flower_dead"}) - grown = true + local nn = minetest.get_node(f).name + if nn ~= "mcl_end:chorus_flower" and nn ~= "mcl_end:chorus_flower_dead" then + minetest.set_node(f, {name="mcl_end:chorus_flower_dead"}) + grown = true + end else - minetest.set_node(f, {name="mcl_end:chorus_flower", param2 = age}) - table.insert(new_flower_buds, f) - grown = true + local nn = minetest.get_node(f).name + if nn ~= "mcl_end:chorus_flower" and nn ~= "mcl_end:chorus_flower_dead" then + minetest.set_node(f, {name="mcl_end:chorus_flower", param2 = age}) + table.insert(new_flower_buds, f) + grown = true + end end end if #new_flowers >= 1 then From ef0b941bce5664f1f5aeef2782b5a50dd49a565b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Mar 2019 00:35:16 +0100 Subject: [PATCH 113/379] Fix undeclared global bug in mcl_biomes --- mods/MAPGEN/mcl_biomes/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 027d67450..89746e034 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -9,7 +9,7 @@ local generate_fallen_logs = minetest.settings:get_bool("mcl_generate_fallen_log -- Jungle bush schematic. In PC/Java Edition it's Jungle Wood + Oak Leaves local jungle_bush_schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_jungle_bush_oak_leaves.mts" -local chorus_plant_deco_id +local deco_id_chorus_plant -- -- Register biomes From 740e87cd81af727f27412e76cbf61f60f4d8e403 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Mar 2019 01:05:06 +0100 Subject: [PATCH 114/379] Add FIXME for chorus plants --- mods/ITEMS/mcl_end/chorus_plant.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index f9f4a59af..a9a28ed5d 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -304,6 +304,9 @@ mcl_end.grow_chorus_plant_step = function(pos, node) end end if not grown then + -- FIXME: In the End, chorus plant fails to generate thru mapchunk borders. + -- So the chorus plants are capped at a fixed height. + -- The mapgen needs to be taught somehow how to deal with this. minetest.set_node(pos, {name = "mcl_end:chorus_flower_dead"}) end return new_flower_buds From 29c12439c439ddafa951e01dd5836217089f417b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Mar 2019 01:11:29 +0100 Subject: [PATCH 115/379] Fix hand range not being applied if wielding item --- mods/PLAYER/mcl_meshhand/depends.txt | 1 + mods/PLAYER/mcl_meshhand/init.lua | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/mods/PLAYER/mcl_meshhand/depends.txt b/mods/PLAYER/mcl_meshhand/depends.txt index f8be59ba7..c86b5f93b 100644 --- a/mods/PLAYER/mcl_meshhand/depends.txt +++ b/mods/PLAYER/mcl_meshhand/depends.txt @@ -1 +1,2 @@ +mcl_tools mcl_skins? diff --git a/mods/PLAYER/mcl_meshhand/init.lua b/mods/PLAYER/mcl_meshhand/init.lua index 87b9e6927..0ef9e2010 100644 --- a/mods/PLAYER/mcl_meshhand/init.lua +++ b/mods/PLAYER/mcl_meshhand/init.lua @@ -1,5 +1,7 @@ local has_mcl_skins = minetest.get_modpath("mcl_skins") ~= nil +local def = minetest.registered_items[""] + -- mcl_skins is enabled if has_mcl_skins == true then --generate a node for every skin @@ -14,6 +16,7 @@ if has_mcl_skins == true then drawtype = "mesh", mesh = "mcl_meshhand.b3d", node_placement_prediction = "", + range = def.range, }) end --change the player's hand to their skin @@ -34,6 +37,7 @@ else drawtype = "mesh", mesh = "mcl_meshhand.b3d", node_placement_prediction = "", + range = def.range, }) minetest.register_on_joinplayer(function(player) From 022f627fd0366099d3b59f7019da1f323c2422b3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Mar 2019 02:58:53 +0100 Subject: [PATCH 116/379] Drop attached chorus plant nodes if detached --- mods/ITEMS/mcl_end/building.lua | 1 + mods/ITEMS/mcl_end/chorus_plant.lua | 72 +++++++++++++++++++++++++++-- mods/ITEMS/mcl_end/init.lua | 4 +- 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua index 174140ed0..4dbfb5639 100644 --- a/mods/ITEMS/mcl_end/building.lua +++ b/mods/ITEMS/mcl_end/building.lua @@ -8,6 +8,7 @@ minetest.register_node("mcl_end:end_stone", { stack_max = 64, groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), + after_dig_node = mcl_end.check_detach_chorus_plant, _mcl_blast_resistance = 45, _mcl_hardness = 3, }) diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index a9a28ed5d..3eb952b13 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -3,8 +3,6 @@ local S = minetest.get_translator("mcl_end") -mcl_end = {} - --- Plant parts --- local MAX_FLOWER_AGE = 5 -- Maximum age of chorus flower before it dies @@ -26,6 +24,67 @@ local function round(num, idp) return math.floor(num * mult + 0.5) / mult end +-- This detaches all chorus plants that are/were attached +-- at start_pos. +mcl_end.detach_chorus_plant = function(start_pos) + local neighbors = { + { x=0, y=1, z=0 }, + { x=0, y=0, z=1 }, + { x=-1, y=0, z=0 }, + { x=0, y=0, z=-1 }, + { x=1, y=0, z=0 }, + { x=0, y=-1, z=0 }, + } + table.insert(neighbors, { x=0, y=-1, z=0 }) + local tree_start_posses = {} + for i=1, #neighbors do + table.insert(tree_start_posses, vector.add(start_pos, neighbors[i])) + end + + -- From the start_pos, we look at the 6 possible directions. Each of these can + -- have a full independent chorus plant ("tree") that might be detached. + for t=1, #tree_start_posses do + -- For each "tree", we do a depth-first search to traverse all + -- chorus plant nodes. + local touched_nodes_hashes = { minetest.hash_node_position(start_pos) } + local check_posses = { tree_start_posses[t] } + local chorus_nodes = {} + local break_tree = true + while #check_posses > 0 do + local pos = check_posses[1] + local node = minetest.get_node(pos) + touched_nodes_hashes[minetest.hash_node_position(pos)] = true + if node.name == "mcl_end:end_stone" then + -- End stone found, the algorithm ends here (haha!) + -- without destroying any nodes, because chorus plants + -- attach to end stone. + break_tree = false + break + elseif minetest.get_item_group(node.name, "chorus_plant") == 1 then + table.insert(chorus_nodes, pos) + for i=1, #neighbors do + local newpos = vector.add(pos, neighbors[i]) + if not touched_nodes_hashes[minetest.hash_node_position(newpos)] then + table.insert(check_posses, vector.add(pos, neighbors[i])) + end + end + end + table.remove(check_posses, 1) + end + if break_tree then + -- If we traversed the entire chorus plant and it was not attached to end stone: + -- Drop ALL the chorus nodes we found. + for c=1, #chorus_nodes do + minetest.dig_node(chorus_nodes[c]) + end + end + end +end + +mcl_end.check_detach_chorus_plant = function(pos) + mcl_end.detach_chorus_plant(pos) +end + minetest.register_node("mcl_end:chorus_flower", { description = S("Chorus Flower"), _doc_items_longdesc = S("A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow."), @@ -44,7 +103,7 @@ minetest.register_node("mcl_end:chorus_flower", { node_box = chorus_flower_box, selection_box = { type = "regular" }, sounds = mcl_sounds.node_sound_wood_defaults(), - groups = {handy=1,axey=1, deco_block = 1, dig_by_piston = 1, destroy_by_lava_flow = 1,}, + groups = {handy=1,axey=1, deco_block = 1, dig_by_piston = 1, destroy_by_lava_flow = 1,chorus_plant = 1}, node_placement_prediction = "", on_place = function(itemstack, placer, pointed_thing) @@ -106,6 +165,7 @@ minetest.register_node("mcl_end:chorus_flower", { return itemstack end end, + after_dig_node = mcl_end.check_detach_chorus_plant, _mcl_blast_resistance = 2, _mcl_hardness = 0.4, }) @@ -128,7 +188,8 @@ minetest.register_node("mcl_end:chorus_flower_dead", { selection_box = { type = "regular" }, sounds = mcl_sounds.node_sound_wood_defaults(), drop = "mcl_end:chorus_flower", - groups = {handy=1,axey=1, deco_block = 1, dig_by_piston = 1, destroy_by_lava_flow = 1,}, + groups = {handy=1,axey=1, deco_block = 1, dig_by_piston = 1, destroy_by_lava_flow = 1,chorus_plant = 1}, + after_dig_node = mcl_end.check_detach_chorus_plant, _mcl_blast_resistance = 2, _mcl_hardness = 0.4, }) @@ -165,7 +226,8 @@ minetest.register_node("mcl_end:chorus_plant", { { items = { "mcl_end:chorus_fruit"}, rarity = 2 }, } }, - groups = {handy=1,axey=1, not_in_creative_inventory = 1, dig_by_piston = 1, destroy_by_lava_flow = 1 }, + groups = {handy=1,axey=1, not_in_creative_inventory = 1, dig_by_piston = 1, destroy_by_lava_flow = 1, chorus_plant = 1 }, + after_dig_node = mcl_end.check_detach_chorus_plant, _mcl_blast_resistance = 2, _mcl_hardness = 0.4, }) diff --git a/mods/ITEMS/mcl_end/init.lua b/mods/ITEMS/mcl_end/init.lua index 6b76dfcde..e3ca8a86b 100644 --- a/mods/ITEMS/mcl_end/init.lua +++ b/mods/ITEMS/mcl_end/init.lua @@ -1,4 +1,6 @@ +mcl_end = {} + local basepath = minetest.get_modpath(minetest.get_current_modname()) -dofile(basepath.."/building.lua") dofile(basepath.."/chorus_plant.lua") +dofile(basepath.."/building.lua") dofile(basepath.."/eye_of_ender.lua") From 3cdf570460742bcfd7146b9e678f47a7168fd086 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Mar 2019 03:22:35 +0100 Subject: [PATCH 117/379] The End: Remove 2 helper recipes, update help --- mods/ITEMS/mcl_end/chorus_plant.lua | 2 +- mods/ITEMS/mcl_end/eye_of_ender.lua | 2 +- mods/ITEMS/mcl_portals/portal_end.lua | 2 +- mods/MISC/mcl_temp_helper_recipes/init.lua | 18 ------------------ 4 files changed, 3 insertions(+), 21 deletions(-) diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index 3eb952b13..be20e74a4 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -88,7 +88,7 @@ end minetest.register_node("mcl_end:chorus_flower", { description = S("Chorus Flower"), _doc_items_longdesc = S("A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow."), - _doc_items_usagehelp = S("Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly a chorus plant stem."), + _doc_items_usagehelp = S("Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly one chorus plant stem."), tiles = { "mcl_end_chorus_flower.png", "mcl_end_chorus_flower.png", diff --git a/mods/ITEMS/mcl_end/eye_of_ender.lua b/mods/ITEMS/mcl_end/eye_of_ender.lua index a76eee0dd..3dbebebf6 100644 --- a/mods/ITEMS/mcl_end/eye_of_ender.lua +++ b/mods/ITEMS/mcl_end/eye_of_ender.lua @@ -74,7 +74,7 @@ minetest.register_entity("mcl_end:ender_eye", { minetest.register_craftitem("mcl_end:ender_eye", { description = S("Eye of Ender"), - _doc_items_longdesc = S("This item is used to locate End portal shrines in the Overworld and to activate End portals." .. "\n" .. "NOTE: The End dimension is currently incomplete and boring."), + _doc_items_longdesc = S("This item is used to locate End portal shrines in the Overworld and to activate End portals." .. "\n" .. "NOTE: The End dimension is currently incomplete and might change in future versions."), _doc_items_usagehelp = S("Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.") .. "\n" .. S("To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame."), wield_image = "mcl_end_ender_eye.png", inventory_image = "mcl_end_ender_eye.png", diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index 4a1a5fd42..eeb20dfe8 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -302,7 +302,7 @@ end minetest.register_node("mcl_portals:end_portal_frame", { description = S("End Portal Frame"), - _doc_items_longdesc = S("End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender." .. "\n" .. "NOTE: The End dimension is currently incomplete and boring."), + _doc_items_longdesc = S("End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender." .. "\n" .. "NOTE: The End dimension is currently incomplete and might change in future versions."), _doc_items_usagehelp = S("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.") .. "\n" .. S("Place an eye of ender into each block. The end portal appears in the middle after placing the final eye." .. "\n" .. "Once placed, an eye of ender can not be taken back."), groups = { creative_breakable = 1, deco_block = 1 }, tiles = { "mcl_portals_endframe_top.png", "mcl_portals_endframe_bottom.png", "mcl_portals_endframe_side.png" }, diff --git a/mods/MISC/mcl_temp_helper_recipes/init.lua b/mods/MISC/mcl_temp_helper_recipes/init.lua index 06206372d..139e6d500 100644 --- a/mods/MISC/mcl_temp_helper_recipes/init.lua +++ b/mods/MISC/mcl_temp_helper_recipes/init.lua @@ -17,15 +17,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "mcl_end:end_stone", - recipe = { - { "mcl_core:sandstone", "mcl_core:stone", "mcl_core:sandstone" }, - { "mcl_core:stone", "mcl_core:sandstone", "mcl_core:stone" }, - { "mcl_core:sandstone", "mcl_core:stone", "mcl_core:sandstone" }, - }, -}) - minetest.register_craft({ output = "mcl_ocean:prismarine_shard", recipe = { @@ -39,15 +30,6 @@ minetest.register_craft({ recipe = { "mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard", "mcl_core:gold_ingot" }, }) -minetest.register_craft({ - output = "mcl_end:chorus_flower", - recipe = { - { "mcl_flowers:allium", "mcl_end:end_stone", "mcl_flowers:allium" }, - { "mcl_end:end_stone", "mcl_end:end_stone", "mcl_end:end_stone" }, - { "mcl_flowers:allium", "mcl_end:end_stone", "mcl_flowers:allium" }, - }, -}) - minetest.register_craft({ output = "mcl_mobitems:shulker_shell", recipe = { From 2892c45f527b56e4de9709d757c7627e15edc005 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Mar 2019 03:30:18 +0100 Subject: [PATCH 118/379] Fix end portal shrine being in lava in flat mapgen --- mods/MAPGEN/mcl_strongholds/init.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/MAPGEN/mcl_strongholds/init.lua b/mods/MAPGEN/mcl_strongholds/init.lua index e82540f2f..92313bee7 100644 --- a/mods/MAPGEN/mcl_strongholds/init.lua +++ b/mods/MAPGEN/mcl_strongholds/init.lua @@ -19,6 +19,7 @@ local strongholds = {} local strongholds_inited = false local mg_name = minetest.get_mapgen_setting("mg_name") +local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" -- Determine the stronghold positions and store them into the strongholds table. -- The stronghold positions are based on the world seed. @@ -45,7 +46,7 @@ local init_strongholds = function() for a=1, ring.amount do local dist = pr:next(ring.min, ring.max) local y - if mg_name == "flat" then + if superflat then y = mcl_vars.mg_bedrock_overworld_max + 3 else y = pr:next(mcl_vars.mg_bedrock_overworld_max+1, mcl_vars.mg_overworld_min+48) From c8f9c3e9235ecc2d9a07dce191a1e238954a60b4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Mar 2019 04:22:19 +0100 Subject: [PATCH 119/379] Delete drippingwater entities when block unloads --- mods/ENTITIES/drippingwater/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ENTITIES/drippingwater/init.lua b/mods/ENTITIES/drippingwater/init.lua index cd8746e46..6e23183fb 100644 --- a/mods/ENTITIES/drippingwater/init.lua +++ b/mods/ENTITIES/drippingwater/init.lua @@ -19,6 +19,7 @@ minetest.register_entity("drippingwater:drop_water", { textures = {water_tex, water_tex, water_tex, water_tex, water_tex, water_tex}, spritediv = {x=1, y=1}, initial_sprite_basepos = {x=0, y=0}, + static_save = false, on_activate = function(self, staticdata) self.object:set_sprite({x=0,y=0}, 1, 1, true) @@ -59,6 +60,7 @@ minetest.register_entity("drippingwater:drop_lava", { textures = {lava_tex, lava_tex, lava_tex, lava_tex, lava_tex, lava_tex}, spritediv = {x=1, y=1}, initial_sprite_basepos = {x=0, y=0}, + static_save = false, on_activate = function(self, staticdata) self.object:set_sprite({x=0,y=0}, 1, 0, true) From aee7c4b4a2d1d3a896bfa5dd348203c4b1157a36 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Mar 2019 06:06:06 +0100 Subject: [PATCH 120/379] Simplify top snow generation in v6 --- mods/MAPGEN/mcl_mapgen_core/init.lua | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index c245fdb81..fbdf00400 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -934,6 +934,17 @@ local function register_mgv6_decorations() register_mgv6_flower("oxeye_daisy", 3490) register_mgv6_flower("poppy", 9439) + -- Put top snow on snowy grass blocks. The v6 mapgen does not generate the top snow on its own. + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_core:dirt_with_grass_snow"}, + sidelen = 16, + fill_ratio = 11.0, -- complete coverage + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_core:snow", + }) + end -- Apply mapgen-specific mapgen code @@ -1733,20 +1744,7 @@ minetest.register_on_generated(function(minp, maxp, seed) -- A snowy grass block must be below a top snow or snow block at all times. if emin.y <= mcl_vars.mg_overworld_max and emax.y >= mcl_vars.mg_overworld_min then -- v6 mapgen: - -- Put top snow on snowy grass blocks. The mapgen does not generate the top snow on its own. if mg_name == "v6" then - -- FIXME: Cavegen and mudflow might screw this up and cause floating top snow to appear - local snowdirt = minetest.find_nodes_in_area_under_air(minp, maxp, "mcl_core:dirt_with_grass_snow") - for n = 1, #snowdirt do - -- CHECKME: What happens at chunk borders? - local p_pos = area:index(snowdirt[n].x, snowdirt[n].y + 1, snowdirt[n].z) - if p_pos then - data[p_pos] = c_top_snow - end - end - if #snowdirt > 0 then - lvm_used = true - end --[[ Remove broken double plants caused by v6 weirdness. v6 might break the bottom part of double plants because of how it works. From a943428b11df89686e243ca3a0ccf0d46aea3f5f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Mar 2019 06:37:36 +0100 Subject: [PATCH 121/379] Simplify pumpkin map generation --- mods/MAPGEN/mcl_biomes/init.lua | 13 ++++--------- mods/MAPGEN/mcl_mapgen_core/init.lua | 13 ++++--------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 89746e034..b3528570f 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -2953,14 +2953,10 @@ local function register_decorations() -- Pumpkin minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = { x=1, y=2, z=1 }, - data = { - { name = "air", prob = 0 }, - { name = "mcl_farming:pumpkin_face", param1=255, }, - }, - }, + deco_type = "simple", + decoration = "mcl_farming:pumpkin_face", + param2 = 0, + param2_max = 3, place_on = {"group:grass_block_no_snow"}, sidelen = 16, noise_params = { @@ -2973,7 +2969,6 @@ local function register_decorations() }, y_min = 1, y_max = mcl_vars.mg_overworld_max, - rotation = "random", }) -- Grasses and ferns diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index fbdf00400..99acfaa36 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -784,14 +784,10 @@ local function register_mgv6_decorations() -- Pumpkin minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = { x=1, y=2, z=1 }, - data = { - { name = "air", prob = 0 }, - { name = "mcl_farming:pumpkin_face" }, - }, - }, + deco_type = "simple", + decoration = "mcl_farming:pumpkin_face", + param2 = 0, + param2_max = 3, place_on = {"group:grass_block_no_snow"}, sidelen = 16, noise_params = { @@ -804,7 +800,6 @@ local function register_mgv6_decorations() }, y_min = 1, y_max = mcl_vars.overworld_max, - rotation = "random", }) -- Tall grass From f55dac38e2efb1fa0894aac2fd2fd14c860edcca Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Mar 2019 06:50:15 +0100 Subject: [PATCH 122/379] Re-introduce melons in v6 mapgen --- mods/MAPGEN/mcl_mapgen_core/init.lua | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 99acfaa36..28cd84754 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -802,6 +802,27 @@ local function register_mgv6_decorations() y_max = mcl_vars.overworld_max, }) + -- Melon + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = 0.002, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 333, + octaves = 3, + persist = 0.6 + }, + -- Small trick to make sure melon spawn in jungles + spawn_by = { "mcl_core:jungletree", "mcl_flowers:fern" }, + num_spawn_by = 1, + y_min = 1, + y_max = 40, + decoration = "mcl_farming:melon", + }) + -- Tall grass minetest.register_decoration({ deco_type = "simple", @@ -932,7 +953,7 @@ local function register_mgv6_decorations() -- Put top snow on snowy grass blocks. The v6 mapgen does not generate the top snow on its own. minetest.register_decoration({ deco_type = "simple", - place_on = {"mcl_core:dirt_with_grass_snow"}, + place_on = {"group:grass_block_snow"}, sidelen = 16, fill_ratio = 11.0, -- complete coverage y_min = 1, From 2a9e30b900f95f1bec155ff4089264caff4edc34 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Mar 2019 08:41:09 +0100 Subject: [PATCH 123/379] Also generate more gold in MesaPlateauF --- mods/MAPGEN/mcl_biomes/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index b3528570f..57807ebd6 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1270,7 +1270,7 @@ local function register_biome_ores() clust_size = 3, y_min = mcl_worlds.layer_to_y(32), y_max = mcl_worlds.layer_to_y(79), - biomes = { "Mesa", "Mesa_sandlevel", "Mesa_ocean" }, + biomes = { "Mesa", "Mesa_sandlevel", "Mesa_ocean", "MesaPlateauF", "MesaPlateauF_sandlevel", "MesaPlatauF_ocean" }, }) end end From b4b5cb2879725b0600de1d1827643c97b1189f8f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Mar 2019 18:42:53 +0100 Subject: [PATCH 124/379] Tweak mesa-underground transition --- mods/MAPGEN/mcl_biomes/init.lua | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 57807ebd6..35669e870 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1270,7 +1270,7 @@ local function register_biome_ores() clust_size = 3, y_min = mcl_worlds.layer_to_y(32), y_max = mcl_worlds.layer_to_y(79), - biomes = { "Mesa", "Mesa_sandlevel", "Mesa_ocean", "MesaPlateauF", "MesaPlateauF_sandlevel", "MesaPlatauF_ocean" }, + biomes = { "Mesa", "Mesa_sandlevel", "Mesa_ocean", "MesaPlateauF", "MesaPlateauF_sandlevel", "MesaPlateauF_ocean" }, }) end end @@ -1334,23 +1334,21 @@ local function register_biomelike_ores() }) - -- Small hack to make sure stone appears at ca. sea level in Mesa biomes + -- For a transition from stone to hardened clay in mesa biomes that is not perfectly flat minetest.register_ore({ - ore_type = "sheet", + ore_type = "stratum", ore = "mcl_core:stone", - noise_threshold = -100, - noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, octaves=1, persist=1.00}, + wherein = {"group:hardened_clay"}, + noise_params = {offset=-6, scale=2, spread={x=25, y=25, z=25}, octaves=1, persist=0.60}, + stratum_thickness = 8, biomes = { - "Mesa", "Mesa_sandlevel", "Mesa_ocean", "Mesa_deep_ocean", "Mesa_underground", - "MesaPlateauF", "MesaPlateauF_sandlevel", "MesaPlateauF_ocean", "MesaPlateauF_deep_ocean", "MesaPlateauF_underground", + "Mesa_sandlevel", "Mesa_ocean", + "MesaPlateauF_sandlevel", "MesaPlateauF_ocean", }, - wherein = {"mcl_colorblocks:hardened_clay"}, - column_height_min = 32, - column_height_max = 32, - y_min = -32, + y_min = -4, y_max = 0, - }) + }) -- Mesa strata (registered as sheet ores) From f48019a87733ecd5a592eeac386a2da1a983601b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Mar 2019 18:47:27 +0100 Subject: [PATCH 125/379] Use built stratum ore type for mesa strata --- mods/MAPGEN/mcl_biomes/init.lua | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 35669e870..75038ae78 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1363,15 +1363,11 @@ local function register_biomelike_ores() end local y_max = y_min + height-1 minetest.register_ore({ - ore_type = "sheet", + ore_type = "stratum", ore = "mcl_colorblocks:hardened_clay_"..color, wherein = {"mcl_colorblocks:hardened_clay"}, - column_height_min = height, - column_height_max = height, y_min = y_min, y_max = y_max, - noise_threshold = -1.0, - noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=seed, octaves=3, persist=0.70}, biomes = { "Mesa", "MesaPlateauF", }, }) end From c868b7a767863182b88544c9ade3020ddb0d7f76 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Mar 2019 00:04:03 +0100 Subject: [PATCH 126/379] Add MesaPlateauFM biome Variant of MesaPlateauF, more erratic terrain, smooth transitions, has red sandstone, more red sand, fewer trees, much more dry shrubs and coarse dirt --- mods/MAPGEN/mcl_biomes/init.lua | 225 +++++++++++++++++++++++++++++++- 1 file changed, 219 insertions(+), 6 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 75038ae78..8cad4a591 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -116,6 +116,7 @@ local function register_biomes() "SavannaM", "Mesa", "MesaPlateauF", + "MesaPlateauFM", } local OCEAN_MIN = -15 @@ -855,6 +856,71 @@ local function register_biomes() heat_point = 60, }) + -- Mesa Plateau FM + -- Variant of MesaPlateauF: fewer trees, more coarse dirt, more erratic terrain, more sand, red sandstone at sandlevel + minetest.register_biome({ + name = "MesaPlateauFM", + node_top = "mcl_colorblocks:hardened_clay", + depth_top = 1, + node_filler = "mcl_colorblocks:hardened_clay", + node_riverbed = "mcl_core:redsand", + depth_riverbed = 1, + node_stone = "mcl_colorblocks:hardened_clay", + y_min = 12, + y_max = 29, + humidity_point = -4, + heat_point = 80, + vertical_blend = 5, + }) + + -- Grass plateau + minetest.register_biome({ + name = "MesaPlateauFM_grasstop", + node_top = "mcl_core:dirt_with_dry_grass", + depth_top = 1, + node_filler = "mcl_core:coarse_dirt", + depth_filler = 2, + node_riverbed = "mcl_core:dirt", + depth_riverbed = 1, + node_stone = "mcl_colorblocks:hardened_clay", + y_min = 30, + y_max = mcl_vars.mg_overworld_max, + humidity_point = -4, + heat_point = 80, + }) + + -- Helper biome for the red sand at the bottom. + minetest.register_biome({ + name = "MesaPlateauFM_sandlevel", + node_top = "mcl_core:redsand", + depth_top = 2, + node_filler = "mcl_colorblocks:hardened_clay_orange", + depth_filler = 3, + node_riverbed = "mcl_core:redsand", + depth_riverbed = 2, + node_stone = "mcl_colorblocks:hardened_clay_orange", + -- sand has wider reach than in other mesa biomes + y_min = -4, + y_max = 11, + humidity_point = -4, + heat_point = 80, + vertical_blend = 4, + }) + minetest.register_biome({ + name = "MesaPlateauFM_ocean", + node_top = "mcl_core:sand", + depth_top = 3, + node_filler = "mcl_colorblocks:sand", + depth_filler = 2, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = -3, + humidity_point = -4, + heat_point = 80, + }) + + -- Savanna minetest.register_biome({ name = "Savanna", @@ -1270,7 +1336,9 @@ local function register_biome_ores() clust_size = 3, y_min = mcl_worlds.layer_to_y(32), y_max = mcl_worlds.layer_to_y(79), - biomes = { "Mesa", "Mesa_sandlevel", "Mesa_ocean", "MesaPlateauF", "MesaPlateauF_sandlevel", "MesaPlateauF_ocean" }, + biomes = { "Mesa", "Mesa_sandlevel", "Mesa_ocean", + "MesaPlateauF", "MesaPlateauF_sandlevel", "MesaPlateauF_ocean", + "MesaPlateauFM", "MesaPlateauFM_sandlevel", "MesaPlateauFM_ocean", }, }) end end @@ -1316,6 +1384,74 @@ local function register_biomelike_ores() y_max = mcl_vars.mg_overworld_max, biomes = { "MesaPlateauF_grasstop" }, }) + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_core:coarse_dirt", + wherein = {"mcl_core:dirt_with_dry_grass", "mcl_core:dirt"}, + column_height_max = 1, + column_midpoint_factor = 0.0, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + noise_threshold = -2.5, + noise_params = {offset=1, scale=15, spread={x=250, y=250, z=250}, seed=24, octaves=3, persist=0.80}, + biomes = { "MesaPlateauFM_grasstop" }, + }) + minetest.register_ore({ + ore_type = "blob", + ore = "mcl_core:coarse_dirt", + wherein = {"mcl_core:dirt_with_dry_grass", "mcl_core:dirt"}, + clust_scarcity = 1800, + clust_num_ores = 65, + clust_size = 15, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + biomes = { "MesaPlateauFM_grasstop" }, + }) + -- Occasionally dig out portions of MesaPlateauFM + minetest.register_ore({ + ore_type = "blob", + ore = "air", + wherein = {"group:hardened_clay", "group:sand","mcl_core:coarse_dirt"}, + clust_scarcity = 4000, + clust_size = 5, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + biomes = { "MesaPlateauFM", "MesaPlateauFM_grasstop" }, + }) + minetest.register_ore({ + ore_type = "blob", + ore = "mcl_core:redsandstone", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_scarcity = 300, + clust_size = 8, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + biomes = { "MesaPlateauFM_sandlevel" }, + }) + -- More red sand in MesaPlateauFM + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_core:redsand", + wherein = {"group:hardened_clay"}, + clust_scarcity = 1, + clust_num_ores = 12, + clust_size = 10, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + noise_threshold = 0.1, + noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=95, octaves=3, persist=0.70}, + biomes = { "MesaPlateauFM" }, + }) + minetest.register_ore({ + ore_type = "blob", + ore = "mcl_core:redsand", + wherein = {"group:hardened_clay"}, + clust_scarcity = 1500, + clust_size = 4, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + biomes = { "MesaPlateauFM", "MesaPlateauFM_grasstop", "MesaPlateauFM_sandlevel" }, + }) -- Small dirt patches in Extreme Hills M minetest.register_ore({ @@ -1332,8 +1468,6 @@ local function register_biomelike_ores() noise_params = {offset=0, scale=5, spread={x=250, y=250, z=250}, seed=64, octaves=3, persist=0.60}, biomes = { "ExtremeHillsM" }, }) - - -- For a transition from stone to hardened clay in mesa biomes that is not perfectly flat minetest.register_ore({ ore_type = "stratum", @@ -1344,6 +1478,7 @@ local function register_biomelike_ores() biomes = { "Mesa_sandlevel", "Mesa_ocean", "MesaPlateauF_sandlevel", "MesaPlateauF_ocean", + "MesaPlateauFM_sandlevel", "MesaPlateauFM_ocean", }, y_min = -4, y_max = 0, @@ -1914,6 +2049,25 @@ local function register_decorations() flags = "place_center_x, place_center_z", rotation = "random", }) + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:dirt_with_dry_grass", "mcl_core:dirt"}, + sidelen = 16, + noise_params = { + offset = 0.008, + scale = 0.002, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.7 + }, + biomes = {"MesaPlateauFM_grasstop"}, + y_min = 30, + y_max = mcl_vars.mg_overworld_max, + schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_oak_classic.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) minetest.register_decoration({ deco_type = "schematic", @@ -2448,7 +2602,10 @@ local function register_decorations() y_min = 4, y_max = mcl_vars.mg_overworld_max, decoration = "mcl_core:cactus", - biomes = {"Desert","Mesa","Mesa_sandlevel","MesaPlateauF","MesaPlateauF_sandlevel"}, + biomes = {"Desert", + "Mesa","Mesa_sandlevel", + "MesaPlateauF","MesaPlateauF_sandlevel", + "MesaPlateauFM","MesaPlateauFM_sandlevel"}, height = 1, height_max = 3, }) @@ -2970,7 +3127,8 @@ local function register_decorations() local grass_mpf = {"MesaPlateauF_grasstop"} local grass_plains = {"Plains", "SunflowerPlains", "JungleEdge", "JungleEdgeM" } local grass_savanna = {"Savanna", "SavannaM"} - local grass_sparse = {"ExtremeHills", "ExtremeHills+", "ExtremeHills+_snowtop", "ExtremeHillsM", "Jungle", } + local grass_sparse = {"ExtremeHills", "ExtremeHills+", "ExtremeHills+_snowtop", "ExtremeHillsM", "Jungle" } + local grass_mpfm = {"MesaPlateauFM_grasstop" } register_grass_decoration("tallgrass", -0.03, 0.09, grass_forest) register_grass_decoration("tallgrass", -0.015, 0.075, grass_forest) @@ -2988,6 +3146,7 @@ local function register_decorations() register_grass_decoration("tallgrass", 0.09, -0.03, grass_plains) register_grass_decoration("tallgrass", 0.18, -0.03, grass_savanna, dry_index) register_grass_decoration("tallgrass", 0.05, -0.03, grass_sparse) + register_grass_decoration("tallgrass", 0.05, 0.05, grass_mpfm, dry_index) local fern_minimal = { "Jungle", "JungleM", "JungleEdge", "JungleEdgeM", "Taiga", "MegaTaiga", "MegaSpruceTaiga", "ColdTaiga" } local fern_low = { "Jungle", "JungleM", "JungleEdge", "JungleEdgeM", "Taiga", "MegaTaiga", "MegaSpruceTaiga" } @@ -3060,7 +3219,7 @@ local function register_decorations() place_on = {"group:sand", "mcl_core:podzol", "mcl_core:dirt", "mcl_core:dirt_with_dry_grass", "mcl_core:coarse_dirt", "group:hardened_clay"}, sidelen = 16, noise_params = { - offset = 0, + offset = 0.0, scale = 0.035, spread = {x = 100, y = 100, z = 100}, seed = 1972, @@ -3073,6 +3232,60 @@ local function register_decorations() decoration = "mcl_core:deadbush", height = 1, }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:sand", "mcl_core:dirt", "mcl_core:dirt_with_dry_grass", "mcl_core:coarse_dirt"}, + sidelen = 16, + noise_params = { + offset = 0.1, + scale = 0.035, + spread = {x = 100, y = 100, z = 100}, + seed = 1972, + octaves = 3, + persist = 0.6 + }, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + biomes = {"MesaPlateauFM_grasstop"}, + decoration = "mcl_core:deadbush", + height = 1, + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:sand"}, + sidelen = 16, + noise_params = { + offset = 0.045, + scale = 0.055, + spread = {x = 100, y = 100, z = 100}, + seed = 1972, + octaves = 3, + persist = 0.6 + }, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + biomes = {"MesaPlateauFM","MesaPlateauFM_sandlevel"}, + decoration = "mcl_core:deadbush", + height = 1, + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:hardened_clay"}, + sidelen = 16, + noise_params = { + offset = 0.010, + scale = 0.035, + spread = {x = 100, y = 100, z = 100}, + seed = 1972, + octaves = 3, + persist = 0.6 + }, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + biomes = {"MesaPlateauFM", "MesaPlateauFM_sandlevel", "MesaPlateauFM_grasstop"}, + decoration = "mcl_core:deadbush", + height = 1, + }) -- Mushrooms in mushroom biome minetest.register_decoration({ From f59f4d4f7c66727ae7927c37edf60c39e0abe5b8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Mar 2019 00:08:36 +0100 Subject: [PATCH 127/379] Tweak MesaPlateauFM riverbed --- mods/MAPGEN/mcl_biomes/init.lua | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 8cad4a591..69738a815 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -70,7 +70,6 @@ local function register_biomes() * Taiga M * Roofed Forest M * Swampland M - * Mesa Plateau F M * Extreme Hills Edge TODO: @@ -864,7 +863,7 @@ local function register_biomes() depth_top = 1, node_filler = "mcl_colorblocks:hardened_clay", node_riverbed = "mcl_core:redsand", - depth_riverbed = 1, + depth_riverbed = 2, node_stone = "mcl_colorblocks:hardened_clay", y_min = 12, y_max = 29, @@ -880,7 +879,7 @@ local function register_biomes() depth_top = 1, node_filler = "mcl_core:coarse_dirt", depth_filler = 2, - node_riverbed = "mcl_core:dirt", + node_riverbed = "mcl_core:redsand", depth_riverbed = 1, node_stone = "mcl_colorblocks:hardened_clay", y_min = 30, @@ -911,9 +910,9 @@ local function register_biomes() node_top = "mcl_core:sand", depth_top = 3, node_filler = "mcl_colorblocks:sand", - depth_filler = 2, + depth_filler = 3, node_riverbed = "mcl_core:sand", - depth_riverbed = 2, + depth_riverbed = 3, y_min = OCEAN_MIN, y_max = -3, humidity_point = -4, From 18adaef361085a18b82a8a399283ed8ae8b7adec Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Mar 2019 01:57:00 +0100 Subject: [PATCH 128/379] Eroded strata for MesaPlateauFM --- mods/MAPGEN/mcl_biomes/init.lua | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 69738a815..d9f626547 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1484,7 +1484,6 @@ local function register_biomelike_ores() }) - -- Mesa strata (registered as sheet ores) -- Helper function to create strata. @@ -1496,14 +1495,42 @@ local function register_biomelike_ores() seed = 39 end local y_max = y_min + height-1 + -- Full stratum minetest.register_ore({ ore_type = "stratum", ore = "mcl_colorblocks:hardened_clay_"..color, wherein = {"mcl_colorblocks:hardened_clay"}, y_min = y_min, y_max = y_max, - biomes = { "Mesa", "MesaPlateauF", }, + biomes = { "Mesa", "MesaPlateauF" }, }) + -- Eroded stratum + minetest.register_ore({ + ore_type = "stratum", + ore = "mcl_colorblocks:hardened_clay_"..color, + wherein = {"mcl_colorblocks:hardened_clay"}, + y_min = y_min, + y_max = y_max, + biomes = { "MesaPlateauFM" }, + noise_params = { + offset = y_min+(y_max-y_min)/2, + scale = 0, + spread = {x = 50, y = 50, z = 50}, + seed = seed+4, + octaves = 1, + persist = 1.0 + }, + np_stratum_thickness = { + offset = 0.1, + scale = 1, + spread = {x = 28, y = 28, z = 28}, + seed = seed+4, + octaves = 2, + persist = 0.6, + }, + }) + + end -- First stratum near the sand level. Always orange. From f713394f6da427e1c7403566fced45d5b6b89db6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Mar 2019 02:51:59 +0100 Subject: [PATCH 129/379] Add vertical blend to ExtremeHills+ --- mods/MAPGEN/mcl_biomes/init.lua | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index d9f626547..3ee1bad33 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -355,9 +355,10 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 4, y_min = 1, - y_max = 44, + y_max = 41, humidity_point = 24, heat_point = 25, + vertical_blend = 6, }) ---- Sub-biome for Extreme Hills+ for those snow Forests minetest.register_biome({ @@ -370,7 +371,7 @@ local function register_biomes() node_river_water = "mcl_core:ice", node_riverbed = "mcl_core:sand", depth_riverbed = 4, - y_min = 45, + y_min = 42, y_max = mcl_vars.mg_overworld_max, humidity_point = 24, heat_point = 25, @@ -807,6 +808,7 @@ local function register_biomes() y_max = 29, humidity_point = 0, heat_point = 60, + vertical_blend = 0, -- we want a sharp transition }) -- The actual plateau of this biome @@ -830,7 +832,7 @@ local function register_biomes() minetest.register_biome({ name = "MesaPlateauF_sandlevel", node_top = "mcl_core:redsand", - depth_top = 1, + depth_top = 2, node_filler = "mcl_colorblocks:hardened_clay_orange", depth_filler = 3, node_riverbed = "mcl_core:redsand", @@ -892,7 +894,7 @@ local function register_biomes() minetest.register_biome({ name = "MesaPlateauFM_sandlevel", node_top = "mcl_core:redsand", - depth_top = 2, + depth_top = 3, node_filler = "mcl_colorblocks:hardened_clay_orange", depth_filler = 3, node_riverbed = "mcl_core:redsand", @@ -1236,6 +1238,7 @@ local function register_biomes() depth_filler = 2, node_riverbed = "mcl_core:gravel", depth_riverbed = 2, + vertical_blend = 5, }) -- Underground biomes are used to identify the underground and to prevent nodes from the surface From cc9b78215a5ee9737caad170df1f38b0e2d80ca4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Mar 2019 13:23:55 +0100 Subject: [PATCH 130/379] Fix crash with wither projectile --- mods/ENTITIES/mobs_mc/wither.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index a06510a94..05431ce98 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -136,7 +136,7 @@ mobs:register_arrow(":mobs_mc:fireball", { hit_mob = function(self, mob) minetest.sound_play("tnt_explode", {pos = mob:get_pos(), gain = 1.5,max_hear_distance = 16}) - player:punch(self.object, 1.0, { + mob:punch(self.object, 1.0, { full_punch_interval = 0.5, damage_groups = {fleshy = 8}, }, nil) From 2c599c4a0e965d60835f73bc4c13991f031f740c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Mar 2019 13:25:06 +0100 Subject: [PATCH 131/379] Refactor mobs_mc a bit --- mods/ENTITIES/mobs_mc/2_throwing.lua | 4 ++-- mods/ENTITIES/mobs_mc/blaze.lua | 4 ++-- mods/ENTITIES/mobs_mc/ender_dragon.lua | 29 -------------------------- mods/ENTITIES/mobs_mc/ghast.lua | 4 ++-- mods/ENTITIES/mobs_mc/shulker.lua | 4 ++-- mods/ENTITIES/mobs_mc/witch.lua | 4 ++-- 6 files changed, 10 insertions(+), 39 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/2_throwing.lua b/mods/ENTITIES/mobs_mc/2_throwing.lua index 1e4c0a551..5173b5a96 100644 --- a/mods/ENTITIES/mobs_mc/2_throwing.lua +++ b/mods/ENTITIES/mobs_mc/2_throwing.lua @@ -195,8 +195,8 @@ if c("egg") then }, nil) end, - hit_mob = function(self, player) - player:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, { + hit_mob = function(self, mob) + mob:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {}, }, nil) diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index c832fb70e..421a90d4b 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -87,8 +87,8 @@ mobs:register_arrow("mobs_mc:blaze_fireball", { }, nil) end, - hit_mob = function(self, player) - player:punch(self.object, 1.0, { + hit_mob = function(self, mob) + mob:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 5}, }, nil) diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index 06fb82bb7..a06f1c460 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -4,35 +4,6 @@ local S = minetest.get_translator("mobs_mc") ---[[ -mobs:register_mob("mobs_mc:12enderdragon", { - type = "animal", - passive = true, - runaway = true, - stepheight = 1.2, - hp_min = 30, - hp_max = 60, - armor = 150, - collisionbox = {-0.35, -0.01, -0.35, 0.35, 2, 0.35}, - visual = "mesh", - mesh = "enderdragon.b3d", - textures = { - {"enderdragon.png"}, - }, - visual_size = {x=1, y=1}, - walk_velocity = 0.6, - run_velocity = 2, - jump = true, - animation = { - speed_normal = 25, speed_run = 50, - stand_start = 0, stand_end = 20, - walk_start = 0, walk_end = 20, - run_start = 0, run_end = 20, - }, -}) - -mobs:register_egg("mobs_mc:12enderdragon", "Enderdragon", "enderdragon_inv.png", 0) -]] mobs:register_mob("mobs_mc:enderdragon", { type = "monster", pathfinding = 1, diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index 44cf34962..029d517a7 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -94,8 +94,8 @@ mobs:register_arrow(":mobs_monster:fireball", { }, nil) end, - hit_mob = function(self, player) - player:punch(self.object, 1.0, { + hit_mob = function(self, mob) + mob:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 8}, }, nil) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 0d23a14f5..9eff2132d 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -66,8 +66,8 @@ mobs:register_arrow("mobs_mc:shulkerbullet", { }, nil) end, - hit_mob = function(self, player) - player:punch(self.object, 1.0, { + hit_mob = function(self, mob) + mob:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 4}, }, nil) diff --git a/mods/ENTITIES/mobs_mc/witch.lua b/mods/ENTITIES/mobs_mc/witch.lua index 83e7b7b30..8e8d80252 100644 --- a/mods/ENTITIES/mobs_mc/witch.lua +++ b/mods/ENTITIES/mobs_mc/witch.lua @@ -87,8 +87,8 @@ mobs:register_arrow(":mobs:potion_arrow", { }, nil) end, - hit_mob = function(self, player) - player:punch(self.object, 1.0, { + hit_mob = function(self, mob) + mob:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 2}, }, nil) From 053e10f223de7650cbceeef5665c2a1033cc8757 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Mar 2019 13:41:19 +0100 Subject: [PATCH 132/379] Update mcl_biome comments --- mods/MAPGEN/mcl_biomes/init.lua | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 3ee1bad33..b5487bfd6 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -54,7 +54,7 @@ local function register_biomes() * Other modifiers: Some complex biomes require more layers to improve the landscape. The following naming conventions apply: - * The land biome name is equal to the MC biome name (in camel case) + * The land biome name is equal to the MC biome name, as of Minecraft 1.11 (in camel case) * Height modifiers and sub-biomes are appended with underscores and in lowercase. Example: “_ocean” * Non-MC biomes are written in lowercase * MC dimension biomes are named after their MC dimension @@ -62,26 +62,21 @@ local function register_biomes() Intentionally missing biomes: * River (generated by valleys and v7) * Frozen River (generated by valleys and v7) - * Mesa (Bryce) - * Hills biomes - * Plateau - * Plateau M - * Cold Taiga M - * Taiga M - * Roofed Forest M - * Swampland M - * Extreme Hills Edge + * Mesa Bryce (oddities of terrain generator might generate this by chance, esp. v7) + * Hills biomes (shape only) + * Plateau (shape only) + * Plateau M (shape only) + * Cold Taiga M (mountain only) + * Taiga M (mountain only) + * Roofed Forest M (mountain only) + * Swampland M (mountain only) + * Extreme Hills Edge (unused in MC) TODO: * Better beaches * Improve Extreme Hills M * Desert M - Tricky biomes: - * Mushroom Island (must be on island) - * Stone Beach (must be at beaches only) - TODO: Find a way to position these biomes accordingly. - ]] -- List of Overworld biomes without modifiers. @@ -391,7 +386,7 @@ local function register_biomes() }) -- Stone beach - -- TODO: Should occour only at real beaches. + -- Not really a beach in MCL2, only named so according to MC minetest.register_biome({ name = "StoneBeach", node_riverbed = "mcl_core:sand", @@ -1178,7 +1173,7 @@ local function register_biomes() }) -- Mushroom Island / Mushroom Island Shore (rare) - -- TODO: Make sure these biomes only spawn in islands + -- Not neccessarily an island at all, only named after Minecraft's biome minetest.register_biome({ name = "MushroomIsland", node_top = "mcl_core:mycelium", From 256dc9e1b5c10cb95001fbbb09c1d6f9c73e1eeb Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Mar 2019 13:50:27 +0100 Subject: [PATCH 133/379] Vertical blend for mushroomisland --- mods/MAPGEN/mcl_biomes/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index b5487bfd6..7882e34f7 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1185,6 +1185,7 @@ local function register_biomes() y_min = 4, -- Note: Limited in height! y_max = 20, + vertical_blend = 1, humidity_point = 106, heat_point = 50, }) From 0b9e25fd9a3ee94019336b5689c514cec23dbbd2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Mar 2019 14:22:05 +0100 Subject: [PATCH 134/379] Add vertical blend for *_ocean biomes --- mods/MAPGEN/mcl_biomes/init.lua | 47 ++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 7882e34f7..220a3b023 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -193,7 +193,7 @@ local function register_biomes() depth_filler = 2, node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = -3, + y_min = -4, y_max = 0, humidity_point = 58, heat_point = 8, @@ -207,9 +207,10 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = OCEAN_MIN, - y_max = -4, + y_max = -5, humidity_point = 58, heat_point = 8, + vertical_blend = 1, }) -- Mega Taiga @@ -291,7 +292,7 @@ local function register_biomes() depth_filler = 3, node_riverbed = "mcl_core:sand", depth_riverbed = 4, - y_min = -3, + y_min = -4, y_max = 3, humidity_point = 10, heat_point = 45, @@ -305,7 +306,8 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 4, y_min = OCEAN_MIN, - y_max = -4, + y_max = -5, + vertical_blend = 1, humidity_point = 10, heat_point = 45, }) @@ -391,7 +393,7 @@ local function register_biomes() name = "StoneBeach", node_riverbed = "mcl_core:sand", depth_riverbed = 1, - y_min = -6, + y_min = -7, y_max = mcl_vars.mg_overworld_max, humidity_point = 0, heat_point = 8, @@ -404,7 +406,8 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 1, y_min = OCEAN_MIN, - y_max = -7, + y_max = -8, + vertical_blend = 2, humidity_point = 0, heat_point = 8, }) @@ -770,7 +773,7 @@ local function register_biomes() node_riverbed = "mcl_core:redsand", depth_riverbed = 1, node_stone = "mcl_colorblocks:hardened_clay_orange", - y_min = -3, + y_min = -4, y_max = 10, humidity_point = 0, heat_point = 100, @@ -784,7 +787,8 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = OCEAN_MIN, - y_max = -4, + y_max = -5, + vertical_blend = 1, humidity_point = 0, heat_point = 100, }) @@ -833,7 +837,7 @@ local function register_biomes() node_riverbed = "mcl_core:redsand", depth_riverbed = 1, node_stone = "mcl_colorblocks:hardened_clay_orange", - y_min = -3, + y_min = -5, y_max = 10, humidity_point = 0, heat_point = 60, @@ -847,7 +851,8 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = OCEAN_MIN, - y_max = -4, + y_max = -6, + vertical_blend = 1, humidity_point = 0, heat_point = 60, }) @@ -895,8 +900,8 @@ local function register_biomes() node_riverbed = "mcl_core:redsand", depth_riverbed = 2, node_stone = "mcl_colorblocks:hardened_clay_orange", - -- sand has wider reach than in other mesa biomes - y_min = -4, + -- red sand has wider reach than in other mesa biomes + y_min = -7, y_max = 11, humidity_point = -4, heat_point = 80, @@ -911,7 +916,8 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 3, y_min = OCEAN_MIN, - y_max = -3, + y_max = -8, + vertical_blend = 2, humidity_point = -4, heat_point = 80, }) @@ -1010,7 +1016,7 @@ local function register_biomes() depth_filler = 3, node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = -1, + y_min = -2, y_max = 0, humidity_point = 88, heat_point = 81, @@ -1024,7 +1030,8 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = OCEAN_MIN, - y_max = -2, + y_max = -3, + vertical_blend = 1, humidity_point = 88, heat_point = 81, }) @@ -1052,7 +1059,7 @@ local function register_biomes() depth_filler = 3, node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = -1, + y_min = -2, y_max = 0, humidity_point = 92, heat_point = 81, @@ -1066,7 +1073,8 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = OCEAN_MIN, - y_max = -2, + y_max = -3, + vertical_blend = 1, humidity_point = 92, heat_point = 81, }) @@ -1153,7 +1161,7 @@ local function register_biomes() depth_filler = 3, node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = -4, + y_min = -5, y_max = 0, humidity_point = 90, heat_point = 50, @@ -1167,7 +1175,8 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = OCEAN_MIN, - y_max = -5, + y_max = -6, + vertical_blend = 1, humidity_point = 90, heat_point = 50, }) From ae513f7b533a3782a188e74d63f35d30dd0bccaa Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Mar 2019 21:42:30 +0100 Subject: [PATCH 135/379] Add MesaBryce biome --- mods/MAPGEN/mcl_biomes/init.lua | 54 +++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 220a3b023..e6189dd1b 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -62,7 +62,6 @@ local function register_biomes() Intentionally missing biomes: * River (generated by valleys and v7) * Frozen River (generated by valleys and v7) - * Mesa Bryce (oddities of terrain generator might generate this by chance, esp. v7) * Hills biomes (shape only) * Plateau (shape only) * Plateau M (shape only) @@ -109,6 +108,7 @@ local function register_biomes() "Savanna", "SavannaM", "Mesa", + "MesaBryce", "MesaPlateauF", "MesaPlateauFM", } @@ -793,6 +793,52 @@ local function register_biomes() heat_point = 100, }) + -- Mesa Bryce: Variant of Mesa, but without the red sand desert + minetest.register_biome({ + name = "MesaBryce", + node_top = "mcl_colorblocks:hardened_clay", + depth_top = 1, + node_filler = "mcl_colorblocks:hardened_clay", + node_riverbed = "mcl_colorblocks:hardened_clay", + depth_riverbed = 1, + node_stone = "mcl_colorblocks:hardened_clay", + y_min = 0, + y_max = mcl_vars.mg_overworld_max, + humidity_point = -4, + heat_point = 100, + }) + -- Helper biome for the red sand at the bottom of Mesas. + minetest.register_biome({ + name = "MesaBryce_sandlevel", + node_top = "mcl_core:redsand", + depth_top = 1, + node_filler = "mcl_colorblocks:hardened_clay_orange", + depth_filler = 3, + node_riverbed = "mcl_colorblocks:hardned_clay", + depth_riverbed = 1, + node_stone = "mcl_colorblocks:hardened_clay_orange", + y_min = -4, + y_max = -1, + humidity_point = -4, + heat_point = 100, + }) + minetest.register_biome({ + name = "MesaBryce_ocean", + node_top = "mcl_core:sand", + depth_top = 3, + node_filler = "mcl_core:sand", + depth_filler = 2, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = OCEAN_MIN, + y_max = -5, + vertical_blend = 1, + humidity_point = -4, + heat_point = 100, + }) + + + -- Mesa Plateau F -- Identical to Mesa below Y=30. At Y=30 and above there is an oak forest minetest.register_biome({ @@ -1344,6 +1390,7 @@ local function register_biome_ores() y_min = mcl_worlds.layer_to_y(32), y_max = mcl_worlds.layer_to_y(79), biomes = { "Mesa", "Mesa_sandlevel", "Mesa_ocean", + "MesaBryce", "MesaBryce_sandlevel", "MesaBryce_ocean", "MesaPlateauF", "MesaPlateauF_sandlevel", "MesaPlateauF_ocean", "MesaPlateauFM", "MesaPlateauFM_sandlevel", "MesaPlateauFM_ocean", }, }) @@ -1484,6 +1531,7 @@ local function register_biomelike_ores() stratum_thickness = 8, biomes = { "Mesa_sandlevel", "Mesa_ocean", + "MesaBryce_sandlevel", "MesaBryce_ocean", "MesaPlateauF_sandlevel", "MesaPlateauF_ocean", "MesaPlateauFM_sandlevel", "MesaPlateauFM_ocean", }, @@ -1510,7 +1558,7 @@ local function register_biomelike_ores() wherein = {"mcl_colorblocks:hardened_clay"}, y_min = y_min, y_max = y_max, - biomes = { "Mesa", "MesaPlateauF" }, + biomes = { "Mesa", "MesaPlateauF", "MesaBryce" }, }) -- Eroded stratum minetest.register_ore({ @@ -3262,7 +3310,7 @@ local function register_decorations() }, y_min = 4, y_max = mcl_vars.mg_overworld_max, - biomes = {"Desert", "Mesa", "Mesa_sandlevel", "MesaPlateauF", "MesaPlateauF_sandlevel", "MesaPlateauF_grasstop", "Taiga", "MegaTaiga"}, + biomes = {"Desert", "Mesa", "Mesa_sandlevel", "MesaPlateauF", "MesaPlateauF_sandlevel", "MesaPlateauF_grasstop","MesaBryce","Taiga", "MegaTaiga"}, decoration = "mcl_core:deadbush", height = 1, }) From a16886bf170e11d6fe75539f7f77e086b61f62dc Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Mar 2019 21:44:13 +0100 Subject: [PATCH 136/379] Tweak heat and humidity points of new mesa biomes --- mods/MAPGEN/mcl_biomes/init.lua | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index e6189dd1b..867bd46fb 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -804,7 +804,7 @@ local function register_biomes() node_stone = "mcl_colorblocks:hardened_clay", y_min = 0, y_max = mcl_vars.mg_overworld_max, - humidity_point = -4, + humidity_point = -5, heat_point = 100, }) -- Helper biome for the red sand at the bottom of Mesas. @@ -819,7 +819,7 @@ local function register_biomes() node_stone = "mcl_colorblocks:hardened_clay_orange", y_min = -4, y_max = -1, - humidity_point = -4, + humidity_point = -5, heat_point = 100, }) minetest.register_biome({ @@ -833,7 +833,7 @@ local function register_biomes() y_min = OCEAN_MIN, y_max = -5, vertical_blend = 1, - humidity_point = -4, + humidity_point = -5, heat_point = 100, }) @@ -915,8 +915,8 @@ local function register_biomes() node_stone = "mcl_colorblocks:hardened_clay", y_min = 12, y_max = 29, - humidity_point = -4, - heat_point = 80, + humidity_point = -5, + heat_point = 60, vertical_blend = 5, }) @@ -932,8 +932,8 @@ local function register_biomes() node_stone = "mcl_colorblocks:hardened_clay", y_min = 30, y_max = mcl_vars.mg_overworld_max, - humidity_point = -4, - heat_point = 80, + humidity_point = -5, + heat_point = 60, }) -- Helper biome for the red sand at the bottom. @@ -949,8 +949,8 @@ local function register_biomes() -- red sand has wider reach than in other mesa biomes y_min = -7, y_max = 11, - humidity_point = -4, - heat_point = 80, + humidity_point = -5, + heat_point = 60, vertical_blend = 4, }) minetest.register_biome({ @@ -964,8 +964,8 @@ local function register_biomes() y_min = OCEAN_MIN, y_max = -8, vertical_blend = 2, - humidity_point = -4, - heat_point = 80, + humidity_point = -5, + heat_point = 60, }) From f1f6dc4c48edd3b4105eddfcfae5358320bd1b35 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Mar 2019 22:08:17 +0100 Subject: [PATCH 137/379] Colorize bottom terracotta layers of MesaBryce --- mods/MAPGEN/mcl_biomes/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 867bd46fb..0ad818703 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1590,7 +1590,7 @@ local function register_biomelike_ores() end -- First stratum near the sand level. Always orange. - stratum(11, 3, "orange") + stratum(-1, 15, "orange") -- Create random strata for up to Y = 256. -- These strata are calculated based on the world seed and are global. From c62658fd27aea3345a7d434b7f30be77b9cb0c6e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Mar 2019 23:00:59 +0100 Subject: [PATCH 138/379] Erode strata a bit in Mesa and MesaPlateauF --- mods/MAPGEN/mcl_biomes/init.lua | 68 ++++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 19 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 0ad818703..c9c83749c 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -749,7 +749,8 @@ local function register_biomes() heat_point = 27, }) - -- Mesa + -- Mesa: Starts with a couple of sand-covered layers (the "sandlevel"), + -- followed by terracotta with colorful (but imperfect) strata minetest.register_biome({ name = "Mesa", node_top = "mcl_colorblocks:hardened_clay", @@ -793,7 +794,7 @@ local function register_biomes() heat_point = 100, }) - -- Mesa Bryce: Variant of Mesa, but without the red sand desert + -- Mesa Bryce: Variant of Mesa, but without the red sand desert. Has perfect strata minetest.register_biome({ name = "MesaBryce", node_top = "mcl_colorblocks:hardened_clay", @@ -807,7 +808,6 @@ local function register_biomes() humidity_point = -5, heat_point = 100, }) - -- Helper biome for the red sand at the bottom of Mesas. minetest.register_biome({ name = "MesaBryce_sandlevel", node_top = "mcl_core:redsand", @@ -840,7 +840,7 @@ local function register_biomes() -- Mesa Plateau F - -- Identical to Mesa below Y=30. At Y=30 and above there is an oak forest + -- Identical to Mesa below Y=30. At Y=30 and above there is a "dry" oak forest minetest.register_biome({ name = "MesaPlateauF", node_top = "mcl_colorblocks:hardened_clay", @@ -855,9 +855,9 @@ local function register_biomes() heat_point = 60, vertical_blend = 0, -- we want a sharp transition }) - - -- The actual plateau of this biome - -- This is a plateau for grass blocks, tall grass, coarse dirt and oaks. + -- The oak forest plateau of this biome. + -- This is a plateau for grass blocks, dry shrubs, tall grass, coarse dirt and oaks. + -- Strata don't generate here. minetest.register_biome({ name = "MesaPlateauF_grasstop", node_top = "mcl_core:dirt_with_dry_grass", @@ -872,8 +872,6 @@ local function register_biomes() humidity_point = 0, heat_point = 60, }) - - -- Helper biome for the red sand at the bottom. minetest.register_biome({ name = "MesaPlateauF_sandlevel", node_top = "mcl_core:redsand", @@ -904,7 +902,9 @@ local function register_biomes() }) -- Mesa Plateau FM - -- Variant of MesaPlateauF: fewer trees, more coarse dirt, more erratic terrain, more sand, red sandstone at sandlevel + -- Dryer and more "chaotic"/"weathered down" variant of MesaPlateauF: + -- oak forest is less dense, more coarse dirt, more erratic terrain, vertical blend, more red sand layers, + -- red sand as ores, red sandstone at sandlevel minetest.register_biome({ name = "MesaPlateauFM", node_top = "mcl_colorblocks:hardened_clay", @@ -919,7 +919,6 @@ local function register_biomes() heat_point = 60, vertical_blend = 5, }) - -- Grass plateau minetest.register_biome({ name = "MesaPlateauFM_grasstop", @@ -935,8 +934,6 @@ local function register_biomes() humidity_point = -5, heat_point = 60, }) - - -- Helper biome for the red sand at the bottom. minetest.register_biome({ name = "MesaPlateauFM_sandlevel", node_top = "mcl_core:redsand", @@ -1543,7 +1540,7 @@ local function register_biomelike_ores() -- Mesa strata (registered as sheet ores) -- Helper function to create strata. - local stratum = function(y_min, height, color, seed) + local stratum = function(y_min, height, color, seed, is_perfect) if not height then height = 1 end @@ -1551,16 +1548,49 @@ local function register_biomelike_ores() seed = 39 end local y_max = y_min + height-1 - -- Full stratum + local perfect_biomes + if is_perfect then + -- "perfect" means no erosion + perfect_biomes = { "MesaBryce", "Mesa", "MesaPlateauF", "MesaPlateauFM" } + else + perfect_biomes = { "MesaBryce" } + end + -- Full, perfect stratum minetest.register_ore({ ore_type = "stratum", ore = "mcl_colorblocks:hardened_clay_"..color, wherein = {"mcl_colorblocks:hardened_clay"}, y_min = y_min, y_max = y_max, - biomes = { "Mesa", "MesaPlateauF", "MesaBryce" }, + biomes = perfect_biomes, }) - -- Eroded stratum + if not is_perfect then + -- Slightly eroded stratum, only minor imperfections + minetest.register_ore({ + ore_type = "stratum", + ore = "mcl_colorblocks:hardened_clay_"..color, + wherein = {"mcl_colorblocks:hardened_clay"}, + y_min = y_min, + y_max = y_max, + biomes = { "Mesa", "MesaPlateauF" }, + noise_params = { + offset = y_min+(y_max-y_min)/2, + scale = 0, + spread = {x = 50, y = 50, z = 50}, + seed = seed+4, + octaves = 1, + persist = 1.0 + }, + np_stratum_thickness = { + offset = 1.28, + scale = 1, + spread = {x = 18, y = 18, z = 18}, + seed = seed+4, + octaves = 3, + persist = 0.8, + }, + }) + -- Very eroded stratum, most of the color is gone minetest.register_ore({ ore_type = "stratum", ore = "mcl_colorblocks:hardened_clay_"..color, @@ -1585,12 +1615,12 @@ local function register_biomelike_ores() persist = 0.6, }, }) - + end end -- First stratum near the sand level. Always orange. - stratum(-1, 15, "orange") + stratum(-1, 15, "orange", nil, true) -- Create random strata for up to Y = 256. -- These strata are calculated based on the world seed and are global. From 12581e844107bad6e9ffbf5e6dd4de7f1383dfa6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 12 Mar 2019 00:26:33 +0100 Subject: [PATCH 139/379] Tweak MesaBryce sandlevel: Sand beach, strata --- mods/MAPGEN/mcl_biomes/init.lua | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index c9c83749c..0384bab4b 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -794,7 +794,7 @@ local function register_biomes() heat_point = 100, }) - -- Mesa Bryce: Variant of Mesa, but without the red sand desert. Has perfect strata + -- Mesa Bryce: Variant of Mesa, but with perfect strata and a much smaller red sand desert minetest.register_biome({ name = "MesaBryce", node_top = "mcl_colorblocks:hardened_clay", @@ -803,7 +803,7 @@ local function register_biomes() node_riverbed = "mcl_colorblocks:hardened_clay", depth_riverbed = 1, node_stone = "mcl_colorblocks:hardened_clay", - y_min = 0, + y_min = 5, y_max = mcl_vars.mg_overworld_max, humidity_point = -5, heat_point = 100, @@ -818,7 +818,7 @@ local function register_biomes() depth_riverbed = 1, node_stone = "mcl_colorblocks:hardened_clay_orange", y_min = -4, - y_max = -1, + y_max = 4, humidity_point = -5, heat_point = 100, }) @@ -1559,6 +1559,8 @@ local function register_biomelike_ores() minetest.register_ore({ ore_type = "stratum", ore = "mcl_colorblocks:hardened_clay_"..color, + -- Only paint uncolored so the biome can choose + -- a color in advance. wherein = {"mcl_colorblocks:hardened_clay"}, y_min = y_min, y_max = y_max, @@ -1619,13 +1621,19 @@ local function register_biomelike_ores() end - -- First stratum near the sand level. Always orange. - stratum(-1, 15, "orange", nil, true) + -- Hardcoded orange strata near sea level. + + -- For MesaBryce, since it has no sand at these heights + stratum(5, 1, "orange", nil, true) + stratum(7, 2, "orange", nil, true) + + -- 3-level stratum above the sandlevel (all mesa biomes) + stratum(11, 3, "orange", nil, true) -- Create random strata for up to Y = 256. -- These strata are calculated based on the world seed and are global. - -- They are thus unique per-world. - local mesapr = PcgRandom(minetest.get_mapgen_setting("seed")) + -- They are thus different per-world. + local mesapr = PcgRandom(mg_seed) --[[ From 206293e3f9f8db23fcb286e1b1c82e7dda1d9932 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 12 Mar 2019 00:34:44 +0100 Subject: [PATCH 140/379] Fix MesaBryce typo --- mods/MAPGEN/mcl_biomes/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 0384bab4b..0bc7022df 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -814,7 +814,7 @@ local function register_biomes() depth_top = 1, node_filler = "mcl_colorblocks:hardened_clay_orange", depth_filler = 3, - node_riverbed = "mcl_colorblocks:hardned_clay", + node_riverbed = "mcl_colorblocks:hardened_clay", depth_riverbed = 1, node_stone = "mcl_colorblocks:hardened_clay_orange", y_min = -4, From 2e092dc15fa2d8bd611b26dc09e2b49a0caec5a7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 12 Mar 2019 00:46:08 +0100 Subject: [PATCH 141/379] Shrink MesaBryce beach once more --- mods/MAPGEN/mcl_biomes/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 0bc7022df..ea82aa8fd 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -803,7 +803,7 @@ local function register_biomes() node_riverbed = "mcl_colorblocks:hardened_clay", depth_riverbed = 1, node_stone = "mcl_colorblocks:hardened_clay", - y_min = 5, + y_min = 4, y_max = mcl_vars.mg_overworld_max, humidity_point = -5, heat_point = 100, @@ -818,7 +818,7 @@ local function register_biomes() depth_riverbed = 1, node_stone = "mcl_colorblocks:hardened_clay_orange", y_min = -4, - y_max = 4, + y_max = 3, humidity_point = -5, heat_point = 100, }) @@ -1624,7 +1624,7 @@ local function register_biomelike_ores() -- Hardcoded orange strata near sea level. -- For MesaBryce, since it has no sand at these heights - stratum(5, 1, "orange", nil, true) + stratum(4, 1, "orange", nil, true) stratum(7, 2, "orange", nil, true) -- 3-level stratum above the sandlevel (all mesa biomes) From 45a30867c3343eb29ea0d48fe47889e7e3c6f8a6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 12 Mar 2019 00:56:35 +0100 Subject: [PATCH 142/379] Del. color from underground hclay in MesaPlateauFM --- mods/MAPGEN/mcl_biomes/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index ea82aa8fd..b909cf138 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -942,7 +942,7 @@ local function register_biomes() depth_filler = 3, node_riverbed = "mcl_core:redsand", depth_riverbed = 2, - node_stone = "mcl_colorblocks:hardened_clay_orange", + node_stone = "mcl_colorblocks:hardened_clay", -- red sand has wider reach than in other mesa biomes y_min = -7, y_max = 11, From 7935e6463764ceb13cea81b1e4075338718364e1 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 12 Mar 2019 01:49:27 +0100 Subject: [PATCH 143/379] Cleanup ambigious sandstone groups, change meaning - Change meaning of "sandstone" group to include sandstone of any color - Add "normal_sandstone" group - Rename "redsandstone" group to "red_sandstone" --- GROUPS.md | 6 ++++-- mods/HELP/mcl_craftguide/init.lua | 6 ++++-- mods/ITEMS/mcl_core/nodes_base.lua | 28 ++++++++++++++-------------- mods/ITEMS/mcl_stairs/register.lua | 8 ++++---- mods/MAPGEN/mcl_mapgen_core/init.lua | 1 - 5 files changed, 26 insertions(+), 23 deletions(-) diff --git a/GROUPS.md b/GROUPS.md index 70f612470..cb1f531eb 100644 --- a/GROUPS.md +++ b/GROUPS.md @@ -66,8 +66,10 @@ Please read to learn how digging times ### Groups (mostly) used for crafting recipes * `sand=1`: Sand (any color) -* `sandstone=1`: (Yellow) sandstone and related nodes (chiseled and the like) (only full blocks) -* `redsandstone=1`: Red sandstone and related nodes (chiseled and the like) (only full blocks) +* `sandstone=1`: Sandstone (any color) and related nodes (chiseled and the like) (only full blocks) +* `normal_sandstone=1`: “Normal” (yellow) sandstone and related nodes (chiseled and the like) (only full blocks) +* `red_sandstone=1`: Red sandstone and related nodes (chiseled and the like) (only full blocks) +* `hardened_clay=1`: Terracotta (any color) * `quartz_block=1`: Quartz Block and variants (chiseled, pillar, etc.) (only full blocks) * `stonebrick=1`: Stone Bricks and related nodes (only full blocks) * `shulker_box=1`: Block is a shulker box diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 3c8217063..144a9e8c8 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -61,6 +61,8 @@ local group_stereotypes = { banner = "mcl_banners:banner_item_white", mesecon_conductor_craftable = "mesecons:wire_00000000_off", purpur_block = "mcl_end:purpur_block", + normal_sandstone = "mcl_core:sandstone", + red_sandstone = "mcl_core:redsandstone", compass = mcl_compass.stereotype, clock = mcl_clock.sterotype, } @@ -71,8 +73,8 @@ local group_names = { wood = "Any wood planks", tree = "Any wood", sand = "Any sand", - sandstone = "Any sandstone (yellow)", - redsandstone = "Any red sandstone", + normal_sandstone = "Any normal sandstone", + red_sandstone = "Any red sandstone", carpet = "Any carpet", dye = "Any dye", water_bucket = "Any water bucket", diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index eef73e5a2..0661bb43d 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -315,7 +315,7 @@ minetest.register_node("mcl_core:dirt_with_grass", { tiles = {"default_grass.png", "default_dirt.png", {name="default_dirt.png^default_grass_side.png", tileable_vertical=false}}, is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=1, grass_block=1, grass_block_no_snow=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, spreading_dirt_type=1, enderman_takable=1, building_block=1}, + groups = {handy=1,shovely=1,dirt=2,grass_block=1, grass_block_no_snow=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, spreading_dirt_type=1, enderman_takable=1, building_block=1}, drop = 'mcl_core:dirt', sounds = mcl_sounds.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.4}, @@ -349,7 +349,7 @@ minetest.register_node("mcl_core:dirt_with_dry_grass", { tiles = {"default_dry_grass.png", "default_dirt.png", {name="default_dirt.png^default_dry_grass_side.png", tileable_vertical=false}}, is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=1, grass_block=1, grass_block_no_snow=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, spreading_dirt_type=1, enderman_takable=1, building_block=1, not_in_creative_inventory=1}, + groups = {handy=1,shovely=1, dirt=2,grass_block=1, grass_block_no_snow=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, spreading_dirt_type=1, enderman_takable=1, building_block=1, not_in_creative_inventory=1}, drop = 'mcl_core:dirt', sounds = mcl_sounds.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.4}, @@ -397,7 +397,7 @@ minetest.register_node("mcl_core:mycelium", { tiles = {"mcl_core_mycelium_top.png", "default_dirt.png", {name="mcl_core_mycelium_side.png", tileable_vertical=false}}, is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=1, spreading_dirt_type=1, building_block=1}, + groups = {handy=1,shovely=1, dirt=2,spreading_dirt_type=1, building_block=1}, drop = 'mcl_core:dirt', sounds = mcl_sounds.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.4}, @@ -416,7 +416,7 @@ minetest.register_node("mcl_core:podzol", { tiles = {"mcl_core_dirt_podzol_top.png", "default_dirt.png", {name="mcl_core_dirt_podzol_side.png", tileable_vertical=false}}, is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=3, soil=1, soil_sapling=2, soil_sugarcane=1, enderman_takable=1, building_block=1}, + groups = {handy=1,shovely=3, dirt=2,soil=1, soil_sapling=2, soil_sugarcane=1, enderman_takable=1, building_block=1}, drop = 'mcl_core:dirt', sounds = mcl_sounds.node_sound_dirt_defaults(), on_construct = mcl_core.on_snowable_construct, @@ -433,7 +433,7 @@ minetest.register_node("mcl_core:dirt", { tiles = {"default_dirt.png"}, is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, enderman_takable=1, building_block=1}, + groups = {handy=1,shovely=1, dirt=1,soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, enderman_takable=1, building_block=1}, sounds = mcl_sounds.node_sound_dirt_defaults(), _mcl_blast_resistance = 3, _mcl_hardness = 0.5, @@ -445,7 +445,7 @@ minetest.register_node("mcl_core:coarse_dirt", { tiles = {"mcl_core_coarse_dirt.png"}, is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=1, soil=1, soil_sugarcane=1, cultivatable=1, enderman_takable=1, building_block=1}, + groups = {handy=1,shovely=1, dirt=3,soil=1, soil_sugarcane=1, cultivatable=1, enderman_takable=1, building_block=1}, sounds = mcl_sounds.node_sound_dirt_defaults(), _mcl_blast_resistance = 3, _mcl_hardness = 0.5, @@ -493,7 +493,7 @@ minetest.register_node("mcl_core:sandstone", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 4, _mcl_hardness = 0.8, @@ -505,7 +505,7 @@ minetest.register_node("mcl_core:sandstonesmooth", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 4, _mcl_hardness = 0.8, @@ -517,7 +517,7 @@ minetest.register_node("mcl_core:sandstonecarved", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_carved.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 4, _mcl_hardness = 0.8, @@ -530,7 +530,7 @@ minetest.register_node("mcl_core:sandstonesmooth2", { tiles = {"mcl_core_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 4, _mcl_hardness = 0.8, @@ -556,7 +556,7 @@ minetest.register_node("mcl_core:redsandstone", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, redsandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 4, _mcl_hardness = 0.8, @@ -568,7 +568,7 @@ minetest.register_node("mcl_core:redsandstonesmooth", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, redsandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 4, _mcl_hardness = 0.8, @@ -580,7 +580,7 @@ minetest.register_node("mcl_core:redsandstonecarved", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_carved.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, redsandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 4, _mcl_hardness = 0.8, @@ -592,7 +592,7 @@ minetest.register_node("mcl_core:redsandstonesmooth2", { tiles = {"mcl_core_red_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, redsandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 4, _mcl_hardness = 0.8, diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index 6eadf629e..fbbedf2c6 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -50,24 +50,24 @@ mcl_stairs.register_stair_and_slab_simple("mossycobble", "mcl_core:mossycobble", 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("sandstone", "group:sandstone", +mcl_stairs.register_stair("sandstone", "group:normal_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, nil, "mcl_core:sandstone") -mcl_stairs.register_slab("sandstone", "group:sandstone", +mcl_stairs.register_slab("sandstone", "group:normal_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(), 2, S("Double Sandstone Slab"), "mcl_core:sandstone") 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:redsandstone", +mcl_stairs.register_stair("redsandstone", "group:red_sandstone", {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, nil, "mcl_core:redsandstone") -mcl_stairs.register_slab("redsandstone", "group:redsandstone", +mcl_stairs.register_slab("redsandstone", "group:red_sandstone", {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"), diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 28cd84754..18be851ef 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1808,7 +1808,6 @@ minetest.register_on_generated(function(minp, maxp, seed) data[p_pos] = c_sandstone lvm_used = true elseif data[p_pos] == c_redsand then - -- Note: This is the only place in which red sandstone is generatd data[p_pos] = c_redsandstone lvm_used = true end From e26a668b74c35ac3134e78d2bab51cdceb5e024a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 12 Mar 2019 02:13:15 +0100 Subject: [PATCH 144/379] Add emerald ore+monster eggs in all ExtremeHills --- mods/MAPGEN/mcl_biomes/init.lua | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index b909cf138..409debc03 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -270,6 +270,7 @@ local function register_biomes() }) -- Extreme Hills + -- Sparsely populated grasslands with little tallgras and trees. minetest.register_biome({ name = "ExtremeHills", node_top = "mcl_core:dirt_with_grass", @@ -313,6 +314,7 @@ local function register_biomes() }) -- Extreme Hills M + -- Just gravel. minetest.register_biome({ name = "ExtremeHillsM", node_top = "mcl_core:gravel", @@ -341,8 +343,8 @@ local function register_biomes() }) -- Extreme Hills+ - -- This biome is identical to Extreme Hills on the surface but has snow-covered mountains with spruce/oak - -- Forests above a certain height. + -- This biome is near-identical to Extreme Hills on the surface but has snow-covered mountains with spruce/oak + -- forests above a certain height. minetest.register_biome({ name = "ExtremeHills+", node_top = "mcl_core:dirt_with_grass", @@ -357,7 +359,7 @@ local function register_biomes() heat_point = 25, vertical_blend = 6, }) - ---- Sub-biome for Extreme Hills+ for those snow Forests + ---- Sub-biome for Extreme Hills+ for those snow forests minetest.register_biome({ name = "ExtremeHills+_snowtop", node_dust = "mcl_core:snow", @@ -388,7 +390,8 @@ local function register_biomes() }) -- Stone beach - -- Not really a beach in MCL2, only named so according to MC + -- Just stone. + -- Not neccessarily a beach at all, only named so according to MC minetest.register_biome({ name = "StoneBeach", node_riverbed = "mcl_core:sand", @@ -1352,7 +1355,11 @@ local function register_biome_ores() clust_size = 1, y_min = mcl_worlds.layer_to_y(4), y_max = mcl_worlds.layer_to_y(32), - biomes = { "ExtremeHills", "ExtremeHills_beach", "ExtremeHills_ocean" }, + biomes = { + "ExtremeHills", "ExtremeHills_beach", "ExtremeHills_ocean", "ExtremeHills_deep_ocean", "ExtremeHills_underground", + "ExtremeHills+", "ExtremeHills+_ocean", "ExtremeHills+_deep_ocean", "ExtremeHills+_underground", + "ExtremeHillsM", "ExtremeHillsM_ocean", "ExtremeHillsM_deep_ocean", "ExtremeHillsM_underground", + }, }) -- Rarely replace stone with stone monster eggs. @@ -1372,7 +1379,11 @@ local function register_biome_ores() clust_size = 2, y_min = mcl_vars.mg_overworld_min, y_max = mcl_worlds.layer_to_y(61), - biomes = { "ExtremeHills", "ExtremeHills_beach", "ExtremeHills_ocean" }, + biomes = { + "ExtremeHills", "ExtremeHills_beach", "ExtremeHills_ocean", "ExtremeHills_deep_ocean", "ExtremeHills_underground", + "ExtremeHills+", "ExtremeHills+_ocean", "ExtremeHills+_deep_ocean", "ExtremeHills+_underground", + "ExtremeHillsM", "ExtremeHillsM_ocean", "ExtremeHillsM_deep_ocean", "ExtremeHillsM_underground", + }, }) -- Bonus gold spawn in Mesa From 4ede0a1227d859145c82bc166c13afa2df5bed5c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 12 Mar 2019 03:18:07 +0100 Subject: [PATCH 145/379] Fix underwater ice sheet in IcePlainsSpikes biome --- mods/MAPGEN/mcl_biomes/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 409debc03..dee12faa0 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -124,6 +124,8 @@ local function register_biomes() depth_top = 1, node_filler = "mcl_core:dirt", depth_filler = 2, + node_water_top = "mcl_core:ice", + depth_water_top = 1, node_river_water = "mcl_core:ice", node_riverbed = "mcl_core:sand", depth_riverbed = 2, @@ -138,8 +140,6 @@ local function register_biomes() depth_top = 2, node_filler = "mcl_core:dirt", depth_filler = 3, - node_water_top = "mcl_core:ice", - depth_water_top = 2, node_river_water = "mcl_core:ice", node_riverbed = "mcl_core:sand", depth_riverbed = 2, From b551b144d4c2646b5598303681afbcb7ce572da9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 12 Mar 2019 13:33:11 +0100 Subject: [PATCH 146/379] Disable translator of mcl_achievements --- mods/HUD/mcl_achievements/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/HUD/mcl_achievements/init.lua b/mods/HUD/mcl_achievements/init.lua index cfeea18be..8b4e1c488 100644 --- a/mods/HUD/mcl_achievements/init.lua +++ b/mods/HUD/mcl_achievements/init.lua @@ -3,7 +3,9 @@ -- If true, activates achievements from other Minecraft editions (XBox, PS, etc.) local non_pc_achievements = false -local S = minetest.get_translator("mcl_achievements") +-- TODO: Enable translator when there's a translation +-- local S = minetest.get_translator("mcl_achievements") +local S = function(s) return s end -- Achievements from PC Edition From ac7a16eb96c31028179ba9302ed8aee0cfb610e0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 12 Mar 2019 22:03:21 +0100 Subject: [PATCH 147/379] Update to latest version of craftguide --- mods/HELP/mcl_craftguide/.luacheckrc | 5 + mods/HELP/mcl_craftguide/API.md | 173 ++ mods/HELP/mcl_craftguide/LICENSE | 681 ------- mods/HELP/mcl_craftguide/README.md | 17 +- mods/HELP/mcl_craftguide/depends.txt | 2 + mods/HELP/mcl_craftguide/init.lua | 1559 +++++++++++------ mods/HELP/mcl_craftguide/license.txt | 58 + .../locale/mcl_craftguide.de.tr | 25 + .../locale/mcl_craftguide.fr.tr | 24 + .../locale/mcl_craftguide.ru.tr | 25 + mods/HELP/mcl_craftguide/locale/template | 25 + mods/HELP/mcl_craftguide/settingtypes.txt | 5 + .../textures/craftguide_clear_icon.png | Bin 0 -> 708 bytes .../textures/craftguide_next_icon.png | Bin 0 -> 727 bytes .../textures/craftguide_prev_icon.png | Bin 0 -> 728 bytes .../textures/craftguide_search_icon.png | Bin 0 -> 1908 bytes .../textures/craftguide_zoomin_icon.png | Bin 0 -> 3544 bytes .../textures/craftguide_zoomout_icon.png | Bin 0 -> 2948 bytes mods/HUD/mcl_inventory/depends.txt | 1 + mods/HUD/mcl_inventory/init.lua | 3 + 20 files changed, 1418 insertions(+), 1185 deletions(-) create mode 100644 mods/HELP/mcl_craftguide/API.md delete mode 100644 mods/HELP/mcl_craftguide/LICENSE create mode 100644 mods/HELP/mcl_craftguide/license.txt create mode 100644 mods/HELP/mcl_craftguide/locale/mcl_craftguide.de.tr create mode 100644 mods/HELP/mcl_craftguide/locale/mcl_craftguide.fr.tr create mode 100644 mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr create mode 100644 mods/HELP/mcl_craftguide/locale/template create mode 100644 mods/HELP/mcl_craftguide/settingtypes.txt create mode 100644 mods/HELP/mcl_craftguide/textures/craftguide_clear_icon.png create mode 100644 mods/HELP/mcl_craftguide/textures/craftguide_next_icon.png create mode 100644 mods/HELP/mcl_craftguide/textures/craftguide_prev_icon.png create mode 100644 mods/HELP/mcl_craftguide/textures/craftguide_search_icon.png create mode 100644 mods/HELP/mcl_craftguide/textures/craftguide_zoomin_icon.png create mode 100644 mods/HELP/mcl_craftguide/textures/craftguide_zoomout_icon.png diff --git a/mods/HELP/mcl_craftguide/.luacheckrc b/mods/HELP/mcl_craftguide/.luacheckrc index a21bce1f3..5a495c7af 100644 --- a/mods/HELP/mcl_craftguide/.luacheckrc +++ b/mods/HELP/mcl_craftguide/.luacheckrc @@ -4,4 +4,9 @@ allow_defined_top = true read_globals = { "minetest", "default", + "sfinv", + "sfinv_buttons", + "vector", + "string", + "table", } diff --git a/mods/HELP/mcl_craftguide/API.md b/mods/HELP/mcl_craftguide/API.md new file mode 100644 index 000000000..e03a0e2b5 --- /dev/null +++ b/mods/HELP/mcl_craftguide/API.md @@ -0,0 +1,173 @@ +## API + +### Custom recipes + +#### Registering a custom crafting type (example) + +```Lua +craftguide.register_craft_type("digging", { + description = "Digging", + icon = "default_tool_steelpick.png", +}) +``` + +#### Registering a custom crafting recipe (example) + +```Lua +craftguide.register_craft({ + type = "digging", + width = 1, + output = "default:cobble 2", + items = {"default:stone"}, +}) +``` + +--- + +### Recipe filters + +Recipe filters can be used to filter the recipes shown to players. Progressive +mode is implemented as a recipe filter. + +#### `craftguide.add_recipe_filter(name, function(recipes, player))` + +Adds a recipe filter with the given name. The filter function should return the +recipes to be displayed, given the available recipes and an `ObjectRef` to the +user. Each recipe is a table of the form returned by +`minetest.get_craft_recipe`. + +Example function to hide recipes for items from a mod called "secretstuff": + +```lua +craftguide.add_recipe_filter("Hide secretstuff", function(recipes) + local filtered = {} + for _, recipe in ipairs(recipes) do + if recipe.output:sub(1,12) ~= "secretstuff:" then + filtered[#filtered + 1] = recipe + end + end + + return filtered +end) +``` + +#### `craftguide.remove_recipe_filter(name)` + +Removes the recipe filter with the given name. + +#### `craftguide.set_recipe_filter(name, function(recipe, player))` + +Removes all recipe filters and adds a new one. + +#### `craftguide.get_recipe_filters()` + +Returns a map of recipe filters, indexed by name. + +--- + +### Search filters + +Search filters are used to perform specific searches inside the search field. +They can be used like so: `+=,,<...>` + +Examples: + +- `+groups=cracky,crumbly`: search for groups `cracky` and `crumbly` in all items. +- `sand+groups=falling_node`: search for group `falling_node` for items which contain `sand` in their names. + +Notes: +- If `optional name` is omitted, the search filter will apply to all items, without pre-filtering. +- Filters can be combined. +- The `groups` filter is currently implemented by default. + +#### `craftguide.add_search_filter(name, function(item, values))` + +Adds a search filter with the given name. +The search function should return a boolean value (whether the given item should be listed or not). + +Example function to show items which contain at least a recipe of given width(s): + +```lua +craftguide.add_search_filter("widths", function(item, widths) + local has_width + local recipes = recipes_cache[item] + + if recipes then + for i = 1, #recipes do + local recipe_width = recipes[i].width + for j = 1, #widths do + local width = tonumber(widths[j]) + if width == recipe_width then + has_width = true + break + end + end + end + end + + return has_width +end) +``` + +#### `craftguide.remove_search_filter(name)` + +Removes the search filter with the given name. + +#### `craftguide.get_search_filters()` + +Returns a map of search filters, indexed by name. + +--- + +### Custom formspec elements + +#### `craftguide.add_formspec_element(name, def)` + +Adds a formspec element to the current formspec. +Supported types: `box`, `label`, `image`, `button`, `tooltip`, `item_image`, `image_button`, `item_image_button` + +Example: + +```lua +craftguide.add_formspec_element("export", { + type = "button", + element = function(data) + -- Should return a table of parameters according to the formspec element type. + -- Note: for all buttons, the 'name' parameter *must not* be specified! + if data.recipes then + return { + data.iX - 3.7, -- X + sfinv_only and 7.9 or 8, -- Y + 1.6, -- W + 1, -- H + ESC(S("Export")) -- label + } + end + end, + -- Optional. + action = function(player, data) + -- When the button is pressed. + print("Exported!") + end +}) +``` + +#### `craftguide.remove_formspec_element(name)` + +Removes the formspec element with the given name. + +#### `craftguide.get_formspec_elements()` + +Returns a map of formspec elements, indexed by name. + +--- + +### Miscellaneous + +#### `craftguide.show(player_name, item, show_usages)` + +Opens the Crafting Guide with the current filter applied. + + * `player_name`: string param. + * `item`: optional, string param. If set, this item is pre-selected. If the item does not exist or has no recipe, use the player's previous selection. By default, player's previous selection is used + * `show_usages`: optional, boolean param. If true, show item usages. diff --git a/mods/HELP/mcl_craftguide/LICENSE b/mods/HELP/mcl_craftguide/LICENSE deleted file mode 100644 index fedaf1ee5..000000000 --- a/mods/HELP/mcl_craftguide/LICENSE +++ /dev/null @@ -1,681 +0,0 @@ -┌───────────────────────────────────────────────────────────────────┐ -│ Copyright (c) 2015-2017 kilbith │ -│ │ -│ Code: GPL version 3 │ -│ Textures: WTFPL (credits: Gambit) │ -└───────────────────────────────────────────────────────────────────┘ - - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - {project} Copyright (C) {year} {fullname} - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/mods/HELP/mcl_craftguide/README.md b/mods/HELP/mcl_craftguide/README.md index c3b1a1584..f02ad3462 100644 --- a/mods/HELP/mcl_craftguide/README.md +++ b/mods/HELP/mcl_craftguide/README.md @@ -1,14 +1,11 @@ -## ![Preview1](http://i.imgur.com/fIPNYkb.png) Crafting Guide ## +# Crafting Guide (MineClone 2 edition) -#### A Crafting Guide for Minetest that doesn't suck. #### +#### `mcl_craftguide` is based on, `craftguide` the most comprehensive crafting guide on Minetest. +#### Consult the [Minetest Wiki](http://wiki.minetest.net/Crafting_guide) for more details. -#### `craftguide` is simply the most comprehensive mod of his category, with the cleanest code. #### -#### Consult the [Minetest Wiki](http://wiki.minetest.net/Crafting_guide) for more details and comparisons. #### +This crafting guide can be accessed from the invenotory menu (book icon). -#### This crafting guide is usable with a blue book named *"Crafting Guide"*. #### +Crafting guide starts out empty and will be filled with more recipes whenever you hold on +to a new items that you can use to new recipes. -#### This crafting guide features two modes : Standard and Progressive. #### -The Progressive mode is a Terraria-like system that only shows recipes you can craft from items in inventory. -The progressive mode can be enabled with `craftguide_progressive_mode = true` in `minetest.conf`. - -![Preview2](http://i.imgur.com/3q7rVSo.png) +For developers, there's a modding API (see `API.md`). diff --git a/mods/HELP/mcl_craftguide/depends.txt b/mods/HELP/mcl_craftguide/depends.txt index de1a2085e..5bff11578 100644 --- a/mods/HELP/mcl_craftguide/depends.txt +++ b/mods/HELP/mcl_craftguide/depends.txt @@ -2,3 +2,5 @@ mcl_core mcl_compass mcl_clock doc +sfinv? +sfinv_buttons? diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 144a9e8c8..28cae912f 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -1,50 +1,57 @@ mcl_craftguide = {} -local craftguide, datas, mt = {}, {}, minetest --- Progressive Mode: --- true: Only show recipes which include at least one of the items the player posesses --- false: Show all crafting recipes -local progressive_mode = false -if mt.settings:get_bool("craftguide_progressive_mode") == true then - progressive_mode = true -end -local get_recipe = mt.get_craft_recipe -local get_result, show_formspec = mt.get_craft_result, mt.show_formspec -local reg_items = mt.registered_items +local M = minetest +local player_data = {} -local get_recipes = function(query_item) - local recipes = mt.get_all_craft_recipes(query_item) +-- Caches +local init_items = {} +local searches = {} +local recipes_cache = {} +local usages_cache = {} +local fuel_cache = {} - -- Manually add repairing recipes (workaround, because get_all_craft_recipes - -- doesn't return repairing recipes) - if minetest.get_modpath("mcl_core") then - local def = minetest.registered_items[query_item] - if not def then - return - end - if def.type == "tool" then - if recipes == nil then - recipes = {} - end - if minetest.get_item_group(query_item, "disable_repair") ~= 1 then - table.insert(recipes, { - type = "normal", - width = 0, - items = { [1] = query_item, [2] = query_item }, - output = query_item, - -- Special marker for repairing recipes - _is_toolrepair = true, - }) - end - end - end - return recipes -end +local progressive_mode = M.settings:get_bool("craftguide_progressive_mode") and rawget(_G, "sfinv") +local sfinv_only = M.settings:get_bool("craftguide_sfinv_only") and rawget(_G, "sfinv") + +local colorize = M.colorize +local reg_items = M.registered_items +local get_result = M.get_craft_result +local show_formspec = M.show_formspec +local get_player_by_name = M.get_player_by_name +local serialize, deserialize = M.serialize, M.deserialize + +local ESC = M.formspec_escape +local S = M.get_translator("mcl_craftguide") + +local maxn, sort, concat, insert, copy = + table.maxn, table.sort, table.concat, table.insert, + table.copy + +local fmt, find, gmatch, match, sub, split, lower = + string.format, string.find, string.gmatch, string.match, + string.sub, string.split, string.lower --- Lua 5.3 removed `table.maxn`, use this alternative in case of breakage: --- https://github.com/kilbith/xdecor/blob/master/handlers/helpers.lua#L1 -local remove, maxn, sort = table.remove, table.maxn, table.sort local min, max, floor, ceil = math.min, math.max, math.floor, math.ceil +local pairs, next, unpack = pairs, next, unpack +local vec_add, vec_mul = vector.add, vector.multiply + +local DEFAULT_SIZE = 10 +local MIN_LIMIT, MAX_LIMIT = 10, 12 +DEFAULT_SIZE = min(MAX_LIMIT, max(MIN_LIMIT, DEFAULT_SIZE)) + +local GRID_LIMIT = 5 +local POLL_FREQ = 0.25 + +local FMT = { + box = "box[%f,%f;%f,%f;%s]", + label = "label[%f,%f;%s]", + image = "image[%f,%f;%f,%f;%s]", + button = "button[%f,%f;%f,%f;%s;%s]", + tooltip = "tooltip[%s;%s]", + item_image = "item_image[%f,%f;%f,%f;%s]", + image_button = "image_button[%f,%f;%f,%f;%s;%s;%s]", + item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]", +} local group_stereotypes = { wool = "mcl_wool:white", @@ -67,544 +74,1108 @@ local group_stereotypes = { clock = mcl_clock.sterotype, } -local group_names = { - shulker_box = "Any shulker box", - wool = "Any wool", - wood = "Any wood planks", - tree = "Any wood", - sand = "Any sand", - normal_sandstone = "Any normal sandstone", - red_sandstone = "Any red sandstone", - carpet = "Any carpet", - dye = "Any dye", - water_bucket = "Any water bucket", - flower = "Any flower", - mushroom = "Any mushroom", - wood_slab = "Any wooden slab", - wood_stairs = "Any wooden stairs", - coal = "Any coal", - quartz_block = "Any kind of quartz block", - purpur_block = "Any kind of purpur block", - stonebrick = "Any stone bricks", +local item_lists = { + "main", + "craft", + "craftpreview", } -function craftguide:group_to_item(item) - if item:sub(1,6) == "group:" then - local itemsub = item:sub(7) - if group_stereotypes[itemsub] then - item = group_stereotypes[itemsub] - elseif reg_items["mcl_core:"..itemsub] then - item = item:gsub("group:", "mcl_core:") - else - for name, def in pairs(reg_items) do - if def.groups[item:match("[^,:]+$")] then - item = name - end - end +local function table_merge(t, t2) + t, t2 = t or {}, t2 or {} + local c = #t + + for i = 1, #t2 do + c = c + 1 + t[c] = t2[i] + end + + return t +end + +local function table_replace(t, val, new) + for k, v in pairs(t) do + if v == val then + t[k] = new end end - return item:sub(1,6) == "group:" and "" or item +end + +local function table_diff(t, t2) + local hash = {} + + for i = 1, #t do + local v = t[i] + hash[v] = true + end + + for i = 1, #t2 do + local v = t2[i] + hash[v] = nil + end + + local diff, c = {}, 0 + + for i = 1, #t do + local v = t[i] + if hash[v] then + c = c + 1 + diff[c] = v + end + end + + return diff +end + +local function __func() + return debug.getinfo(2, "n").name +end + +local custom_crafts, craft_types = {}, {} + +function mcl_craftguide.register_craft_type(name, def) + local func = "mcl_craftguide." .. __func() .. "(): " + assert(name, func .. "'name' field missing") + assert(def.description, func .. "'description' field missing") + assert(def.icon, func .. "'icon' field missing") + + craft_types[name] = def +end + +function mcl_craftguide.register_craft(def) + local func = "mcl_craftguide." .. __func() .. "(): " + assert(def.type, func .. "'type' field missing") + assert(def.width, func .. "'width' field missing") + assert(def.output, func .. "'output' field missing") + assert(def.items, func .. "'items' field missing") + + custom_crafts[#custom_crafts + 1] = def +end + +local recipe_filters = {} + +function mcl_craftguide.add_recipe_filter(name, f) + local func = "mcl_craftguide." .. __func() .. "(): " + assert(name, func .. "filter name missing") + assert(f and type(f) == "function", func .. "filter function missing") + + recipe_filters[name] = f +end + +function mcl_craftguide.remove_recipe_filter(name) + recipe_filters[name] = nil +end + +function mcl_craftguide.set_recipe_filter(name, f) + local func = "mcl_craftguide." .. __func() .. "(): " + assert(name, func .. "filter name missing") + assert(f and type(f) == "function", func .. "filter function missing") + + recipe_filters = {[name] = f} +end + +function mcl_craftguide.get_recipe_filters() + return recipe_filters +end + +local function apply_recipe_filters(recipes, player) + for _, filter in pairs(recipe_filters) do + recipes = filter(recipes, player) + end + + return recipes +end + +local search_filters = {} + +function mcl_craftguide.add_search_filter(name, f) + local func = "mcl_craftguide." .. __func() .. "(): " + assert(name, func .. "filter name missing") + assert(f and type(f) == "function", func .. "filter function missing") + + search_filters[name] = f +end + +function mcl_craftguide.remove_search_filter(name) + search_filters[name] = nil +end + +function mcl_craftguide.get_search_filters() + return search_filters +end + +local formspec_elements = {} + +function mcl_craftguide.add_formspec_element(name, def) + local func = "mcl_craftguide." .. __func() .. "(): " + assert(def.element, func .. "'element' field not defined") + assert(def.type, func .. "'type' field not defined") + assert(FMT[def.type], func .. "'" .. def.type .. "' type not supported by the API") + + formspec_elements[name] = { + type = def.type, + element = def.element, + action = def.action, + } +end + +function mcl_craftguide.remove_formspec_element(name) + formspec_elements[name] = nil +end + +function mcl_craftguide.get_formspec_elements() + return formspec_elements +end + +local function item_has_groups(item_groups, groups) + for i = 1, #groups do + local group = groups[i] + if not item_groups[group] then + return + end + end + + return true end local function extract_groups(str) - if str:sub(1,6) ~= "group:" then return end - return str:sub(7):split(",") + return split(sub(str, 7), ",") end -local function colorize(str) - -- If client <= 0.4.14, don't colorize for compatibility. - return mt.colorize and mt.colorize("#FFFF00", str) or str -end - -local function get_fueltime(item) - return get_result({method="fuel", width=1, items={item}}).time -end - -function craftguide:get_tooltip(item, recipe_type, cooktime, groups) - local raw = self:get_tooltip_raw(item, recipe_type, cooktime, groups) - if raw == "" then - return raw - else - local tooltip = "tooltip["..item..";" - tooltip = tooltip .. raw - tooltip = tooltip .. "]" - return tooltip - end -end - -function craftguide:get_tooltip_raw(item, recipe_type, cooktime, groups) - local tooltip, item_desc = "", "" - local fueltime = get_fueltime(item) - local has_extras = groups or recipe_type == "cooking" or fueltime > 0 - - if reg_items[item] then - if not groups then - item_desc = reg_items[item].description +local function item_in_recipe(item, recipe) + for _, recipe_item in pairs(recipe.items) do + if recipe_item == item then + return true end - else - return tooltip.."Unknown Item ("..item..")]" end +end + +local function groups_item_in_recipe(item, recipe) + local item_groups = reg_items[item].groups + for _, recipe_item in pairs(recipe.items) do + if sub(recipe_item, 1, 6) == "group:" then + local groups = extract_groups(recipe_item) + if item_has_groups(item_groups, groups) then + local usage = copy(recipe) + table_replace(usage.items, recipe_item, item) + return usage + end + end + end +end + +local function get_item_usages(item) + local usages, c = {}, 0 + + for _, recipes in pairs(recipes_cache) do + for i = 1, #recipes do + local recipe = recipes[i] + if item_in_recipe(item, recipe) then + c = c + 1 + usages[c] = recipe + else + recipe = groups_item_in_recipe(item, recipe) + if recipe then + c = c + 1 + usages[c] = recipe + end + end + end + end + + if fuel_cache[item] then + usages[#usages + 1] = {type = "fuel", width = 1, items = {item}} + end + + return usages +end + +local function get_filtered_items(player) + local items, c = {}, 0 + + for i = 1, #init_items do + local item = init_items[i] + local recipes = recipes_cache[item] + local usages = usages_cache[item] + + if recipes and #apply_recipe_filters(recipes, player) > 0 or + usages and #apply_recipe_filters(usages, player) > 0 then + c = c + 1 + items[c] = item + end + end + + return items +end + +local function cache_recipes(output) + local recipes = M.get_all_craft_recipes(output) or {} + local c = 0 + + for i = 1, #custom_crafts do + local custom_craft = custom_crafts[i] + if match(custom_craft.output, "%S*") == output then + c = c + 1 + recipes[c] = custom_craft + end + end + + if #recipes > 0 then + recipes_cache[output] = recipes + return true + end +end + +local function get_recipes(item, data, player) + local recipes = recipes_cache[item] + local usages = usages_cache[item] + + if recipes then + recipes = apply_recipe_filters(recipes, player) + end + + local no_recipes = not recipes or #recipes == 0 + if no_recipes and not usages then + return + elseif usages and no_recipes then + data.show_usages = true + end + + if data.show_usages then + recipes = apply_recipe_filters(usages_cache[item], player) + if #recipes == 0 then + return + end + end + + return recipes +end + +local function get_burntime(item) + return get_result({method = "fuel", width = 1, items = {item}}).time +end + +local function cache_fuel(item) + local burntime = get_burntime(item) + if burntime > 0 then + fuel_cache[item] = burntime + return true + end +end + +local function groups_to_item(groups) + if #groups == 1 then + local group = groups[1] + local def_gr = "default:" .. group + + if group_stereotypes[group] then + return group_stereotypes[group] + elseif reg_items[def_gr] then + return def_gr + end + end + + for name, def in pairs(reg_items) do + if item_has_groups(def.groups, groups) then + return name + end + end + + return "" +end + +local function get_tooltip(item, groups, cooktime, burntime) + local tooltip + if groups then - local gcol = "#FFAAFF" - local groupstr - if #groups == 1 then - local g = group_names[groups[1]] - -- Treat the groups “compass” and “clock” as fake groups - -- and just print the normal group name without special formatting - if groups[1] == "compass" or groups[1] == "clock" then - gcol = "" - groupstr = reg_items[item].description - elseif group_names[groups[1]] then - -- Use the special group name string - groupstr = group_names[groups[1]] - else - --[[ Fallback: Generic group explanation: This always - works, but the internally used group name (which - looks ugly) is exposed to the user. ]] - groupstr = "Any item belonging to the " .. groups[1] .. " group" - end - else - groupstr = "Any item belonging to the following groups: " - for i=1, #groups do - groupstr = groupstr .. groups[i].. - (groups[i+1] and " and " or "") - end + local groupstr, c = {}, 0 + + for i = 1, #groups do + c = c + 1 + groupstr[c] = colorize("yellow", groups[i]) end - tooltip = tooltip..core.colorize(gcol, groupstr) - end - tooltip = tooltip .. item_desc - if recipe_type == "cooking" then - tooltip = tooltip.."\nCooking time: ".. - colorize(cooktime) - end - if fueltime > 0 and not groups then - tooltip = tooltip.."\nBurning time: ".. - colorize(fueltime) - end - return tooltip -end - -function craftguide:get_recipe(iY, xoffset, tooltip_raw, item, recipe_num, recipes) - local formspec, recipes_total = "", #recipes - if recipes_total > 1 then - formspec = formspec.. - "button[0,"..(iY+3)..";2,1;alternate;Alternate]".. - "label[0,"..(iY+2)..".5;Recipe ".. - recipe_num.." of "..recipes_total.."]" - end - local recipe_type = recipes[recipe_num].type - - local items = recipes[recipe_num].items - local width = recipes[recipe_num].width - local output = recipes[recipe_num].output - local cooking_time = 10 - local is_shapeless = false - if recipe_type == "normal" and width == 0 then - is_shapeless = true - if #items <= 4 then - width = 2 - else - width = min(3, #items) - end - end - - --[[ Recipe type symbols ]] - - -- Cooking (furnace) - if recipe_type == "cooking" then - cooking_time = width - width = 1 - formspec = formspec.. - "image["..(xoffset-0.8)..","..(iY+1).. - ".5;0.5,0.5;default_furnace_front_active.png]" - -- Shapeless recipes (intertwined arrows) - elseif is_shapeless then - formspec = formspec.. - "image["..(xoffset-0.8)..","..(iY+1).. - ".5;0.5,0.5;craftguide_shapeless.png]" - end - - -- Recipe only available in v6 (“v6” icon) - -- TODO/FIXME: This only works for the unique red sand recipe. - -- Remove this when red sand becomes regularily available. - local v6_only_recipe = false - if output == "mcl_core:redsand 8" and - width == 3 and - items[1] == "mcl_core:sand" and - items[2] == "mcl_core:sand" and - items[3] == "mcl_core:sand" and - items[4] == "mcl_core:sand" and - items[5] == "mcl_nether:nether_wart_item" and - items[6] == "mcl_core:sand" and - items[7] == "mcl_core:sand" and - items[8] == "mcl_core:sand" and - items[9] == "mcl_core:sand" then - v6_only_recipe = true - end - - if v6_only_recipe then - formspec = formspec.. - "image["..(xoffset-0.8)..","..(iY+2.75).. - ".5;0.5,0.5;mcl_craftguide_v6.png]" - end - - -- Render slots - - local rows = ceil(maxn(items) / width) - local btn_size, craftgrid_limit = 1, 5 - - if recipe_type == "normal" and - width > craftgrid_limit or rows > craftgrid_limit then - formspec = formspec.. - "label["..xoffset..","..(iY+2).. - ";Recipe is too big to\nbe displayed (".. - width.."x"..rows..")]" + groupstr = concat(groupstr, ", ") + tooltip = S("Any item belonging to the group(s): @1", groupstr) else - for i, v in pairs(items) do - local X = (i-1) % width + xoffset - 4 + (3 - max(1, width)) - local Y = ceil(i / width + iY+2 - min(2, rows)) - - if recipe_type == "normal" and - width > 3 or rows > 3 then - btn_size = width > 3 and 3 / width or 3 / rows - X = btn_size * (i % width) + xoffset - 4 + (3 - max(1, width)) - - Y = btn_size * floor((i-1) / width) + iY+3 - - min(2, rows) - end - - local groups = extract_groups(v) - local label = "" - -- Add the “G” symbols for group item slots - if groups then - --[[ Exception: Groups “compass” and “clock” since the items in these groups should - be treated as a single item from the user perspective. ]] - if not (#groups == 1 and (groups[1] == "compass" or groups[1] == "clock")) then - label = "\nG" or "" - end - end - local item_r = self:group_to_item(v) - local tltip = self:get_tooltip( - item_r, recipe_type, cooking_time, groups) - - formspec = formspec.. - "item_image_button["..X..","..Y..";".. - btn_size..","..btn_size..";"..item_r.. - ";"..item_r..";"..label.."]"..tltip - end + tooltip = reg_items[item].description end - local label = "" - if recipes[recipe_num]._is_toolrepair then - tooltip_raw = tooltip_raw .. "\n" .. core.colorize("#00FF00", string.format("Repaired by %.0f%%", (mcl_core.repair*100))) - label = "\nR" + + if cooktime then + tooltip = tooltip .. "\n" .. + S("Cooking time: @1", colorize("yellow", cooktime)) end - return formspec.. - "image["..(xoffset-1)..","..(iY+2).. - ".12;0.9,0.7;craftguide_arrow.png]".. - "item_image_button["..(xoffset)..","..(iY+2)..";1,1;".. - output..";"..item.."_out"..";"..label.."]".."tooltip["..item.."_out"..";"..minetest.formspec_escape(tooltip_raw).."]" + + if burntime then + tooltip = tooltip .. "\n" .. + S("Burning time: @1", colorize("yellow", burntime)) + end + + return fmt(FMT.tooltip, item, ESC(tooltip)) end -function craftguide:get_formspec(player_name, is_fuel) - local data = datas[player_name] - local iY = data.iX - 5 +local function get_recipe_fs(data, iY) + local fs = {} + local recipe = data.recipes[data.rnum] + local width = recipe.width + local xoffset = data.iX / 2.15 + local cooktime, shapeless + + if recipe.type == "cooking" then + cooktime, width = width, 1 + elseif width == 0 then + shapeless = true + width = min(3, #recipe.items) + end + + local rows = ceil(maxn(recipe.items) / width) + local rightest, btn_size, s_btn_size = 0, 1.1 + + local btn_lab = data.show_usages and + ESC(S("Usage @1 of @2", data.rnum, #data.recipes)) or + ESC(S("Recipe @1 of @2", data.rnum, #data.recipes)) + + fs[#fs + 1] = fmt(FMT.button, + sfinv_only and 5.8 or data.iX - 2.6, + sfinv_only and 7.9 or iY + 3.3, + 2.2, + 1, + "alternate", + btn_lab) + + if width > GRID_LIMIT or rows > GRID_LIMIT then + fs[#fs + 1] = fmt(FMT.label, + (data.iX / 2) - 2, + iY + 2.2, + ESC(S("Recipe is too big to be displayed (@1x@2)", width, rows))) + + return concat(fs) + end + + for i, item in pairs(recipe.items) do + local X = ceil((i - 1) % width + xoffset - width) - + (sfinv_only and 0 or 0.2) + local Y = ceil(i / width + (iY + 2) - min(2, rows)) + + if width > 3 or rows > 3 then + btn_size = width > 3 and 3 / width or 3 / rows + s_btn_size = btn_size + X = btn_size * (i % width) + xoffset - 2.65 + Y = btn_size * floor((i - 1) / width) + (iY + 3) - min(2, rows) + end + + if X > rightest then + rightest = X + end + + local groups + if sub(item, 1, 6) == "group:" then + groups = extract_groups(item) + item = groups_to_item(groups) + end + + local label = groups and "\nG" or "" + + fs[#fs + 1] = fmt(FMT.item_image_button, + X, + Y + (sfinv_only and 0.7 or 0.2), + btn_size, + btn_size, + item, + match(item, "%S*"), + ESC(label)) + + local burntime = fuel_cache[item] + + if groups or cooktime or burntime then + fs[#fs + 1] = get_tooltip(item, groups, cooktime, burntime) + end + end + + local custom_recipe = craft_types[recipe.type] + + if custom_recipe or shapeless or recipe.type == "cooking" then + local icon = custom_recipe and custom_recipe.icon or + shapeless and "shapeless" or "furnace" + + if recipe.type == "cooking" then + icon = "default_furnace_front_active.png" + elseif not custom_recipe then + icon = fmt("craftguide_%s.png", icon) + end + + fs[#fs + 1] = fmt(FMT.image, + rightest + 1.2, + sfinv_only and 6.2 or iY + 1.7, + 0.5, + 0.5, + icon) + + local tooltip = custom_recipe and custom_recipe.description or + shapeless and S("Shapeless") or S("Cooking") + + fs[#fs + 1] = fmt("tooltip[%f,%f;%f,%f;%s]", + rightest + 1.2, + sfinv_only and 6.2 or iY + 1.7, + 0.5, + 0.5, + ESC(tooltip)) + end + + local arrow_X = rightest + (s_btn_size or 1.1) + local output_X = arrow_X + 0.9 + + fs[#fs + 1] = fmt(FMT.image, + arrow_X, + sfinv_only and 6.85 or iY + 2.35, + 0.9, + 0.7, + "craftguide_arrow.png") + + if recipe.type == "fuel" then + fs[#fs + 1] = fmt(FMT.image, + output_X, + sfinv_only and 6.68 or iY + 2.18, + 1.1, + 1.1, + "mcl_craftguide_fuel.png") + else + local output_name = match(recipe.output, "%S+") + local burntime = fuel_cache[output_name] + + fs[#fs + 1] = fmt(FMT.item_image_button, + output_X, + sfinv_only and 6.7 or iY + 2.2, + 1.1, + 1.1, + recipe.output, + ESC(output_name), + "") + + if burntime then + fs[#fs + 1] = get_tooltip(output_name, nil, nil, burntime) + + fs[#fs + 1] = fmt(FMT.image, + output_X + 1, + sfinv_only and 6.83 or iY + 2.33, + 0.6, + 0.4, + "craftguide_arrow.png") + + fs[#fs + 1] = fmt(FMT.image, + output_X + 1.6, + sfinv_only and 6.68 or iY + 2.18, + 0.6, + 0.6, + "mcl_craftguide_fuel.png") + end + end + + return concat(fs) +end + +local function make_formspec(name) + local data = player_data[name] + local iY = sfinv_only and 4 or data.iX - 5 local ipp = data.iX * iY - if not data.items then - data.items = datas.init_items - end data.pagemax = max(1, ceil(#data.items / ipp)) - local formspec = "size["..data.iX..","..(iY+3)..".6;]".. - mcl_vars.inventory_header.. - [=[background[1,1;1,1;craftguide_bg.png;true] - button[2.4,0.21;0.8,0.5;search;?] - button[3.05,0.21;0.8,0.5;clear;X] - tooltip[search;Search] - tooltip[clear;Reset] - tooltip[size_inc;Increase window size] - tooltip[size_dec;Decrease window size] - field_close_on_enter[filter;false]]=].. - "button["..(data.iX/2)..",-0.02;0.7,1;size_inc;+]".. - "button["..((data.iX/2) + 0.5).. - ",-0.02;0.7,1;size_dec;-]".. - "button["..(data.iX-3)..".4,0;0.8,0.95;prev;<]".. - "label["..(data.iX-2)..".1,0.18;".. - colorize(data.pagenum).." / "..data.pagemax.."]".. - "button["..(data.iX-1)..".2,0;0.8,0.95;next;>]".. - "field[0.3,0.32;2.5,1;filter;;".. - mt.formspec_escape(data.filter).."]" + local fs = {} - local even_num = data.iX % 2 == 0 - local xoffset = data.iX / 2 + (even_num and 0.5 or 0) + 2 + if not sfinv_only then + fs[#fs + 1] = fmt("size[%f,%f;]", data.iX - 0.35, iY + 4) - if not next(data.items) then - local msg = "" - if data.filter == "" then - msg = "You don't know any crafting recipes yet.\nCollect some items and open the recipe book again." - else - msg = "No crafting recipes found.\nReset the search and try again." + fs[#fs + 1] = [[ + no_prepend[] + background[1,1;1,1;craftguide_bg.png;true] + ]] + + fs[#fs + 1] = fmt([[ tooltip[size_inc;%s] + tooltip[size_dec;%s] ]], + ESC(S("Increase window size")), + ESC(S("Decrease window size"))) + + fs[#fs + 1] = fmt([[ + image_button[%f,0.12;0.8,0.8;craftguide_zoomin_icon.png;size_inc;] + image_button[%f,0.12;0.8,0.8;craftguide_zoomout_icon.png;size_dec;] ]], + data.iX * 0.47, + data.iX * 0.47 + 0.6) + end + + fs[#fs + 1] = [[ + image_button[2.4,0.12;0.8,0.8;craftguide_search_icon.png;search;] + image_button[3.05,0.12;0.8,0.8;craftguide_clear_icon.png;clear;] + field_close_on_enter[filter;false] + ]] + + fs[#fs + 1] = fmt([[ tooltip[search;%s] + tooltip[clear;%s] + tooltip[prev;%s] + tooltip[next;%s] ]], + ESC(S("Search")), + ESC(S("Reset")), + ESC(S("Previous page")), + ESC(S("Next page"))) + + fs[#fs + 1] = fmt("label[%f,%f;%s / %u]", + sfinv_only and 6.3 or data.iX - 2.2, + 0.22, + colorize("yellow", data.pagenum), + data.pagemax) + + fs[#fs + 1] = fmt([[ + image_button[%f,0.12;0.8,0.8;craftguide_prev_icon.png;prev;] + image_button[%f,0.12;0.8,0.8;craftguide_next_icon.png;next;] ]], + sfinv_only and 5.5 or data.iX - 3.1, + sfinv_only and 7.3 or (data.iX - 1.2) - (data.iX >= 11 and 0.08 or 0)) + + fs[#fs + 1] = fmt("field[0.3,0.32;2.5,1;filter;;%s]", ESC(data.filter)) + + if #data.items == 0 then + local no_item = S("No item to show") + local pos = (data.iX / 2) - 1 + + if next(recipe_filters) and #init_items > 0 and data.filter == "" then + no_item = S("Collect items to reveal more recipes") + pos = pos - 1 end - formspec = formspec.."label[0,2;"..mt.formspec_escape(msg).."]" + + fs[#fs + 1] = fmt(FMT.label, pos, 2, ESC(no_item)) end local first_item = (data.pagenum - 1) * ipp for i = first_item, first_item + ipp - 1 do - local name = data.items[i+1] - if not name then break end + local item = data.items[i + 1] + if not item then + break + end + local X = i % data.iX local Y = (i % ipp - X) / data.iX + 1 - formspec = formspec.. - "item_image_button["..X..","..Y..";1,1;".. - name..";"..name.."_inv;]" + fs[#fs + 1] = fmt("item_image_button[%f,%f;%f,%f;%s;%s_inv;]", + X - (sfinv_only and 0 or (X * 0.05)), + Y, + 1.1, + 1.1, + item, + item) end - if data.item and reg_items[data.item] then - local tooltip_raw = self:get_tooltip_raw(data.item) - local tooltip = "" - if tooltip_raw ~= "" then - tooltip = "tooltip["..data.item..";"..minetest.formspec_escape(tooltip_raw).."]" - end - if not data.recipes_item or (is_fuel and not - get_recipe(data.item).items) then - formspec = formspec.. - "image["..(xoffset-1)..","..(iY+2).. - ".12;0.9,0.7;craftguide_arrow.png]".. - "item_image_button["..(xoffset-2)..","..(iY+2).. - ";1,1;"..data.item..";"..data.item..";]".. - tooltip.. - "image["..(xoffset)..",".. - -- TODO: Remove fire icon, find better way to represent fuel - (iY+1.98)..";1,1;mcl_craftguide_fuel.png]" - else - formspec = formspec..self:get_recipe( - iY, xoffset, tooltip_raw, data.item, - data.recipe_num, data.recipes_item) - end + if data.recipes and #data.recipes > 0 then + fs[#fs + 1] = get_recipe_fs(data, iY) end - data.formspec = formspec - show_formspec(player_name, "craftguide", formspec) -end - -local function player_has_item(T) - for i=1, #T do - if T[i] then return true end - end -end - -local function group_to_items(group) - local items_with_group, counter = {}, 0 - for name, def in pairs(reg_items) do - if def.groups[group:sub(7)] then - counter = counter + 1 - items_with_group[counter] = name - end - end - return items_with_group -end - -local function item_in_inv(inv, item) - return inv:contains_item("main", item) -end - --- Returns true if player knows the item. Used for progressive mode (EXPERIMENTAL). -local function knows_item(playername, item) - local has_item = doc.entry_exists("nodes", item) and doc.entry_revealed(playername, "nodes", item) - if not has_item then - has_item = doc.entry_exists("tools", item) and doc.entry_revealed(playername, "tools", item) - end - if not has_item then - has_item = doc.entry_exists("craftitems", item) and doc.entry_revealed(playername, "craftitems", item) - end - return has_item -end - -function craftguide:recipe_in_inv(inv, item_name, recipes_f, playername) - local recipes = recipes_f or get_recipes(item_name) or {} - local show_item_recipes = {} - - for i=1, #recipes do - show_item_recipes[i] = false - for _, item in pairs(recipes[i].items) do - local group_in_inv = false - if item:sub(1,6) == "group:" then - local groups = group_to_items(item) - for j=1, #groups do - if item_in_inv(inv, groups[j]) then - group_in_inv = true - end - end + for elem_name, def in pairs(formspec_elements) do + local element = def.element(data) + if element then + if find(def.type, "button") then + insert(element, #element, elem_name) end - if group_in_inv or item_in_inv(inv, item) or knows_item(playername, item) then - show_item_recipes[i] = true - end - end - end - for i=#show_item_recipes, 1, -1 do - if not show_item_recipes[i] then - remove(recipes, i) + + fs[#fs + 1] = fmt(FMT[def.type], unpack(element)) end end - return recipes, player_has_item(show_item_recipes) + return concat(fs) end -function craftguide:get_init_items() - local items_list, counter = {}, 0 - for name, def in pairs(reg_items) do - local is_fuel = get_fueltime(name) > 0 - local is_tool = def.type == "tool" - if (not def.groups.not_in_craft_guide or def.groups.not_in_craft_guide == 0) - and (get_recipe(name).items or is_fuel or is_tool) - and def.description and def.description ~= "" then - counter = counter + 1 - items_list[counter] = name +local show_fs = function(player, name) + if sfinv_only then + sfinv.set_player_inventory_formspec(player) + else + show_formspec(name, "mcl_craftguide", make_formspec(name)) + end +end + +mcl_craftguide.add_search_filter("groups", function(item, groups) + local itemdef = reg_items[item] + local has_groups = true + + for i = 1, #groups do + local group = groups[i] + if not itemdef.groups[group] then + has_groups = nil + break end end - sort(items_list) - datas.init_items = items_list -end + return has_groups +end) -function craftguide:get_filter_items(data, player) +local function search(data) local filter = data.filter - local items_list = progressive_mode and data.init_filter_items or - datas.init_items - local inv = player:get_inventory() - local filtered_list, counter = {}, 0 - for i=1, #items_list do - local item = items_list[i] - local item_desc = reg_items[item].description:lower() + if searches[filter] then + data.items = searches[filter] + return + end - if filter ~= "" then - if item:find(filter, 1, true) or - item_desc:find(filter, 1, true) then - counter = counter + 1 - filtered_list[counter] = item - end - elseif progressive_mode then - local _, has_item = self:recipe_in_inv(inv, item, nil, player:get_player_name()) - if has_item then - counter = counter + 1 - filtered_list[counter] = item + local filtered_list, c = {}, 0 + local extras = "^(.-)%+([%w_]+)=([%w_,]+)" + local search_filter = next(search_filters) and match(filter, extras) + local filters = {} + + if search_filter then + for filter_name, values in gmatch(filter, sub(extras, 6, -1)) do + if search_filters[filter_name] then + values = split(values, ",") + filters[filter_name] = values end end end - if progressive_mode and not data.items then - data.init_filter_items = filtered_list + for i = 1, #data.items_raw do + local item = data.items_raw[i] + local def = reg_items[item] + local desc = lower(def.description) + local search_in = item .. desc + local to_add + + if search_filter then + for filter_name, values in pairs(filters) do + local func = search_filters[filter_name] + to_add = func(item, values) and (search_filter == "" or + find(search_in, search_filter, 1, true)) + end + else + to_add = find(search_in, filter, 1, true) + end + + if to_add then + c = c + 1 + filtered_list[c] = item + end end + + if not next(recipe_filters) then + -- Cache the results only if searched 2 times + if searches[filter] == nil then + searches[filter] = false + else + searches[filter] = filtered_list + end + end + data.items = filtered_list end -mt.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "craftguide" then return end - local player_name = player:get_player_name() - local data = datas[player_name] +local function get_inv_items(player) + local inv = player:get_inventory() + local stacks = {} + + for i = 1, #item_lists do + local list = inv:get_list(item_lists[i]) + table_merge(stacks, list) + end + + local inv_items, c = {}, 0 + + for i = 1, #stacks do + local stack = stacks[i] + if not stack:is_empty() then + local name = stack:get_name() + if reg_items[name] then + c = c + 1 + inv_items[c] = name + end + end + end + + return inv_items +end + +local function init_data(name) + player_data[name] = { + filter = "", + pagenum = 1, + iX = sfinv_only and 8 or DEFAULT_SIZE, + items = init_items, + items_raw = init_items, + } +end + +local function reset_data(data) + data.filter = "" + data.pagenum = 1 + data.rnum = 1 + data.query_item = nil + data.show_usages = nil + data.recipes = nil + data.items = data.items_raw +end + +local function cache_usages() + for i = 1, #init_items do + local item = init_items[i] + usages_cache[item] = get_item_usages(item) + end +end + +local function get_init_items() + local c = 0 + for name, def in pairs(reg_items) do + local is_fuel = cache_fuel(name) + if not (def.groups.not_in_craft_guide == 1 or + def.groups.not_in_creative_inventory == 1) and + def.description and def.description ~= "" and + (cache_recipes(name) or is_fuel) then + c = c + 1 + init_items[c] = name + end + end + + sort(init_items) + cache_usages() +end + +local function on_receive_fields(player, fields) + local name = player:get_player_name() + local data = player_data[name] + + for elem_name, def in pairs(formspec_elements) do + if fields[elem_name] and def.action then + return def.action(player, data) + end + end if fields.clear then - data.filter, data.item, data.pagenum, data.recipe_num = - "", nil, 1, 1 - data.items = progressive_mode and data.init_filter_items or - datas.init_items - craftguide:get_formspec(player_name) + reset_data(data) + show_fs(player, name) + elseif fields.alternate then - local recipe = data.recipes_item[data.recipe_num + 1] - data.recipe_num = recipe and data.recipe_num + 1 or 1 - craftguide:get_formspec(player_name) + if #data.recipes == 1 then + return + end + + local num_next = data.rnum + 1 + data.rnum = data.recipes[num_next] and num_next or 1 + show_fs(player, name) + elseif (fields.key_enter_field == "filter" or fields.search) and fields.filter ~= "" then - data.filter = fields.filter:lower() + local fltr = lower(fields.filter) + if data.filter == fltr then + return + end + + data.filter = fltr data.pagenum = 1 - craftguide:get_filter_items(data, player) - craftguide:get_formspec(player_name) + search(data) + show_fs(player, name) + elseif fields.prev or fields.next then + if data.pagemax == 1 then + return + end + data.pagenum = data.pagenum - (fields.prev and 1 or -1) + if data.pagenum > data.pagemax then data.pagenum = 1 elseif data.pagenum == 0 then data.pagenum = data.pagemax end - craftguide:get_formspec(player_name) - elseif (fields.size_inc and data.iX < 12) or - (fields.size_dec and data.iX > 8) then + + show_fs(player, name) + + elseif (fields.size_inc and data.iX < MAX_LIMIT) or + (fields.size_dec and data.iX > MIN_LIMIT) then data.pagenum = 1 - data.iX = data.iX - (fields.size_dec and 1 or -1) - craftguide:get_formspec(player_name) - elseif (fields.quit) then - datas[player_name] = nil + data.iX = data.iX + (fields.size_inc and 1 or -1) + show_fs(player, name) else - for item in pairs(fields) do - if item:find(":") then - if item:sub(-4) == "_inv" or item:sub(-4) == "_out" then - item = item:sub(1,-5) + local item + for field in pairs(fields) do + if find(field, ":") then + item = field + break end + end - local is_fuel = get_fueltime(item) > 0 - local recipes = get_recipes(item) - if not recipes and not is_fuel then return end + if not item then + return + elseif sub(item, -4) == "_inv" then + item = sub(item, 1, -5) + end - if item == data.item then - if data.recipes_item and #data.recipes_item >= 2 then - local recipe = data.recipes_item[data.recipe_num + 1] - data.recipe_num = recipe and data.recipe_num + 1 or 1 - craftguide:get_formspec(player_name) + if item ~= data.query_item then + data.show_usages = nil + else + data.show_usages = not data.show_usages + end + + local recipes = get_recipes(item, data, player) + if not recipes then + return + end + + data.query_item = item + data.recipes = recipes + data.rnum = 1 + + show_fs(player, name) + end +end + +M.register_on_mods_loaded(get_init_items) + +M.register_on_joinplayer(function(player) + local name = player:get_player_name() + init_data(name) +end) + +M.register_on_leaveplayer(function(player) + local name = player:get_player_name() + player_data[name] = nil +end) + +if sfinv_only then + sfinv.register_page("craftguide:craftguide", { + title = S("Craft Guide"), + + get = function(self, player, context) + local name = player:get_player_name() + local formspec = make_formspec(name) + + return sfinv.make_formspec(player, context, formspec) + end, + + on_enter = function(self, player, context) + if next(recipe_filters) then + local name = player:get_player_name() + local data = player_data[name] + + data.items_raw = get_filtered_items(player) + search(data) + end + end, + + on_player_receive_fields = function(self, player, context, fields) + on_receive_fields(player, fields) + end, + }) +else + M.register_on_player_receive_fields(function(player, formname, fields) + if formname == "mcl_craftguide" then + on_receive_fields(player, fields) + end + end) + + local function on_use(user) + local name = user:get_player_name() + + if next(recipe_filters) then + local data = player_data[name] + data.items_raw = get_filtered_items(user) + search(data) + end + + show_formspec(name, "mcl_craftguide", make_formspec(name)) + end + +end + +if progressive_mode then + local function item_in_inv(item, inv_items) + local inv_items_size = #inv_items + + if sub(item, 1, 6) == "group:" then + local groups = extract_groups(item) + for i = 1, inv_items_size do + local inv_item = reg_items[inv_items[i]] + if inv_item then + local item_groups = inv_item.groups + if item_has_groups(item_groups, groups) then + return true + end end + end + else + for i = 1, inv_items_size do + if inv_items[i] == item then + return true + end + end + end + end + + local function recipe_in_inv(recipe, inv_items) + for _, item in pairs(recipe.items) do + if not item_in_inv(item, inv_items) then + return + end + end + + return true + end + + local function progressive_filter(recipes, player) + local name = player:get_player_name() + local data = player_data[name] + + if #data.inv_items == 0 then + return {} + end + + local filtered, c = {}, 0 + for i = 1, #recipes do + local recipe = recipes[i] + if recipe_in_inv(recipe, data.inv_items) then + c = c + 1 + filtered[c] = recipe + end + end + + return filtered + end + + -- Workaround. Need an engine call to detect when the contents + -- of the player inventory changed, instead. + local function poll_new_items() + local players = M.get_connected_players() + for i = 1, #players do + local player = players[i] + local name = player:get_player_name() + local data = player_data[name] + local inv_items = get_inv_items(player) + local diff = table_diff(inv_items, data.inv_items) + + if #diff > 0 then + data.inv_items = table_merge(diff, data.inv_items) + end + end + + M.after(POLL_FREQ, poll_new_items) + end + + poll_new_items() + + mcl_craftguide.add_recipe_filter("Default progressive filter", progressive_filter) + + M.register_on_joinplayer(function(player) + local meta = player:get_meta() + local name = player:get_player_name() + local data = player_data[name] + + data.inv_items = deserialize(meta:get_string("inv_items")) or {} + end) + + local function save_meta(player) + local meta = player:get_meta() + local name = player:get_player_name() + local data = player_data[name] + + meta:set_string("inv_items", serialize(data.inv_items)) + end + + M.register_on_leaveplayer(save_meta) + + M.register_on_shutdown(function() + local players = M.get_connected_players() + for i = 1, #players do + local player = players[i] + save_meta(player) + end + end) +end + +M.register_chatcommand("craft", { + description = S("Show recipe(s) of the pointed node"), + func = function(name) + local player = get_player_by_name(name) + local ppos = player:get_pos() + local dir = player:get_look_dir() + local eye_h = {x = ppos.x, y = ppos.y + 1.625, z = ppos.z} + local node_name + + for i = 1, 10 do + local look_at = vec_add(eye_h, vec_mul(dir, i)) + local node = M.get_node(look_at) + + if node.name ~= "air" then + node_name = node.name + break + end + end + + local red = colorize("red", "[mcl_craftguide] ") + + if not node_name then + return false, red .. S("No node pointed") + end + + local data = player_data[name] + reset_data(data) + + local recipes = recipes_cache[node_name] + local usages = usages_cache[node_name] + + if recipes then + recipes = apply_recipe_filters(recipes, player) + end + + if not recipes or #recipes == 0 then + local ylw = colorize("yellow", node_name) + local msg = red .. "%s: " .. ylw + + if usages then + recipes = usages_cache[node_name] + if #recipes > 0 then + data.show_usages = true + end + elseif recipes_cache[node_name] then + return false, fmt(msg, S("You don't know a recipe for this node")) else - - if progressive_mode then - local inv = player:get_inventory() - local _, has_item = craftguide:recipe_in_inv(inv, item, nil, player:get_player_name()) - - if not has_item then return end - recipes = craftguide:recipe_in_inv(inv, item, recipes, player_name) - end - - data.item = item - data.recipe_num = 1 - data.recipes_item = recipes - - craftguide:get_formspec(player_name, is_fuel) + return false, fmt(msg, S("No recipe for this node")) end end - end - end -end) -function craftguide:on_use(user) - if not datas.init_items then - craftguide:get_init_items() - end + data.query_item = node_name + data.recipes = recipes - local player_name = user:get_player_name() - local data = datas[player_name] + return true, show_fs(player, name) + end, +}) - if progressive_mode or not data then - datas[player_name] = {filter="", pagenum=1, iX=9} - if progressive_mode then - craftguide:get_filter_items( - datas[player_name], user) - end - craftguide:get_formspec(player_name) - else - show_formspec(player_name, "craftguide", data.formspec) - end +function mcl_craftguide.show(name, item, show_usages) + local func = "mcl_craftguide." .. __func() .. "(): " + assert(name, func .. "player name missing") + + local data = player_data[name] + local player = get_player_by_name(name) + local query_item = data.query_item + + reset_data(data) + + item = reg_items[item] and item or query_item + + data.query_item = item + data.show_usages = show_usages + data.recipes = get_recipes(item, data, player) + + show_fs(player, name) end -mcl_craftguide.show_craftguide = function(player) - craftguide:on_use(player) -end +--[[ Custom recipes (>3x3) test code -mt.register_on_player_receive_fields(function(player, formname, fields) - if fields.__mcl_craftguide then - craftguide:on_use(player) +M.register_craftitem(":secretstuff:custom_recipe_test", { + description = "Custom Recipe Test", +}) + +local cr = {} +for x = 1, 6 do + cr[x] = {} + for i = 1, 10 - x do + cr[x][i] = {} + for j = 1, 10 - x do + cr[x][i][j] = "group:wood" + end end -end) -mt.register_on_leaveplayer(function(player) - datas[player:get_player_name()] = nil -end) + M.register_craft({ + output = "secretstuff:custom_recipe_test", + recipe = cr[x] + }) +end +]] diff --git a/mods/HELP/mcl_craftguide/license.txt b/mods/HELP/mcl_craftguide/license.txt new file mode 100644 index 000000000..57174d4d6 --- /dev/null +++ b/mods/HELP/mcl_craftguide/license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) + +Copyright (c) 2015-2019 Jean-Patrick Guerrero and contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +Licenses of media (textures) +---------------------------- + +Copyright © Diego Martínez (kaeza): craftguide_*_icon.png (CC BY-SA 3.0) + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.de.tr b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.de.tr new file mode 100644 index 000000000..f97ba9b02 --- /dev/null +++ b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.de.tr @@ -0,0 +1,25 @@ +# textdomain: mcl_craftguide + +Craft Guide=Rezeptbuch +Crafting Guide=Rezeptbuch +Crafting Guide Sign=Rezepttafel +Search=Suche +Reset=Zurücksetzen +Previous page=Vorherige Seite +Next page=Nächste Seite +Usage @1 of @2=Verwendung @1 von @2 +Recipe @1 of @2=Rezept @1 von @2 +Burning time: @1=Brennzeit: @1 +Cooking time: @1=Kochzeit: @1 +Any item belonging to the group(s): @1=Beliebiger Gegenstand aus Gruppe(n): @1 +Recipe is too big to be displayed (@1x@2)=Rezept ist zu groß für die Anzeige (@1×@2) +Shapeless=Formlos +Cooking=Kochen +Increase window size=Fenster vergrößern +Decrease window size=Fenster verkleinern +No item to show=Nichts anzuzeigen +Collect items to reveal more recipes=Gegenstände aufsammeln, um mehr Rezepte aufzudecken +Show recipe(s) of the pointed node=Rezept(e) des gezeigten Blocks anzeigen +No node pointed=Auf keinen Block gezeigt +You don't know a recipe for this node=Sie kennen kein Rezept für diesen Block +No recipe for this node=Kein Rezept für diesen Block diff --git a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.fr.tr b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.fr.tr new file mode 100644 index 000000000..94de87fbd --- /dev/null +++ b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.fr.tr @@ -0,0 +1,24 @@ +# textdomain: mcl_craftguide + +Craft Guide=Guide de recettes +Crafting Guide=Guide de recettes +Search=Rechercher +Reset=Réinitialiser +Previous page=Page précédente +Next page=Page suivante +Usage @1 of @2=Usage @1 de @2 +Recipe @1 of @2=Recette @1 de @2 +Burning time: @1=Temps de combustion : @1 +Cooking time: @1=Temps de cuisson : @1 +Any item belonging to the group(s): @1=Tout item appartenant au(x) groupe(s) : @1 +Recipe is too big to be displayed (@1x@2)=La recette est trop grande pour être affichée (@1x@2) +Shapeless=Sans forme +Cooking=Cuisson +Increase window size=Agrandir la fenêtre +Decrease window size=Réduire la fenêtre +No item to show=Aucun item à afficher +Collect items to reveal more recipes=Collecte des items pour révéler plus de recettes +Show recipe(s) of the pointed node=Affiche les recettes du bloc visé +No node pointed=Aucun bloc visé +You don't know a recipe for this node=Tu ne connais aucune recette pour ce bloc +No recipe for this node=Aucune recette pour ce bloc diff --git a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr new file mode 100644 index 000000000..04723dbea --- /dev/null +++ b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr @@ -0,0 +1,25 @@ +# textdomain: mcl_craftguide + +Craft Guide=книга рецептов крафта +Crafting Guide=книга рецептов крафта +Crafting Guide Sign=Знак с книгой рецептов +Search=Поиск +Reset=Сброс +Previous page=Предыдущая страница +Next page=Следущая страница +Usage @1 of @2=использование @1 из @2 +Recipe @1 of @2=Рецепт @1 из @2 +Burning time: @1=Время горения: @1 +Cooking time: @1=Время преготовления: @1 +Any item belonging to the group(s): @1=Любой элемент из группы: @1 +Recipe is too big to be displayed (@1x@2)=Рецепт слишком большой для показа (@1x@2) +Shapeless=Бесформенный +Cooking=Приготовление +Increase window size=Увеличить окно +Decrease window size=Уменьшить окно +No item to show=Нет элемента для показа +Collect items to reveal more recipes=Собирайте предметы, чтобы раскрыть больше рецептов +Show recipe(s) of the pointed node=Показать рецепт(ы) выбранной ноды +No node pointed=Не указана нода +You don't know a recipe for this node=Вы не знаете рецепт для этой ноды +No recipe for this node=Нет рецептов для этой ноды diff --git a/mods/HELP/mcl_craftguide/locale/template b/mods/HELP/mcl_craftguide/locale/template new file mode 100644 index 000000000..d051c275c --- /dev/null +++ b/mods/HELP/mcl_craftguide/locale/template @@ -0,0 +1,25 @@ +# textdomain: craftguide + +Craft Guide= +Crafting Guide= +Crafting Guide Sign= +Search= +Reset= +Previous page= +Next page= +Usage @1 of @2= +Recipe @1 of @2= +Burning time: @1= +Cooking time: @1= +Any item belonging to the group(s): @1= +Recipe is too big to be displayed (@1x@2)= +Shapeless= +Cooking= +Increase window size= +Decrease window size= +No item to show= +Collect items to reveal more recipes= +Show recipe(s) of the pointed node= +No node pointed= +You don't know a recipe for this node= +No recipe for this node= diff --git a/mods/HELP/mcl_craftguide/settingtypes.txt b/mods/HELP/mcl_craftguide/settingtypes.txt new file mode 100644 index 000000000..14198aeb0 --- /dev/null +++ b/mods/HELP/mcl_craftguide/settingtypes.txt @@ -0,0 +1,5 @@ +# The progressive mode shows recipes you can craft from items you ever had in your inventory. +craftguide_progressive_mode (Progressive Mode) bool false + +# Integration in the default Minetest Game inventory. +craftguide_sfinv_only (Sfinv only) bool false \ No newline at end of file diff --git a/mods/HELP/mcl_craftguide/textures/craftguide_clear_icon.png b/mods/HELP/mcl_craftguide/textures/craftguide_clear_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9244264adcf8a710ff13a2d684f148f997f1522f GIT binary patch literal 708 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVCwdCaSW-r_4ck|p0J|`+k@?8 z)4T38Ghetp_qK?~6E??3JeK}D7|j>(if@>5FNQ(xtQ%9xq#I|>oJ-rk-tWo9fB*MH zp5A261T+u{c%448b?emavpj!@3x2dSE|*=GYrgL7A+xn2b!l~{&a|J|bNs}_tEEWpk`5!2*`a}1RyVnJUKYCsTDmAJZ691N{Rw#iPDykKZKfD4SDBXYZavSfp zt(M8LUICfU&F8YHzp0s=(DY%oUz2h9J|Q20x{sb8K$MJ(p@+4@qz<4 z!kg0dK3Eysi%9);Rd;NiTfc_o`reublauX^hYkL8bi5ZVT=BywU-{9yDV`H%&hFSD z{eSy3XBU}c*&BW+C(O>xi5IGCE-m?*7^bhf!nSDs-Ve5G964XH7nBIy_{nX@*CKED zC9J9A$E62L@3|g1-|-{rXX!rIBX13O=8G=aFLdP6;d1{6XTq5t?lu(JC&Y2TP@!hB z!wW0ribzTW? zv>WHHXDQnUw9_l$Ihb?k|95ulYSoBmH}=bWKa)PledlLA%OVzTzIe`-^(=?Nn=}vK z|5|oXdfI~7>hssAan;KT<|{qg^yu`QKY#yx%+Ejmf9+EvCB5Qf=OwiwTl#JLZgovQ z!0-C6bfNb@zk-X!W`9H8=%_c!chCE&^5PxeZU@em`wuKW9OwuSX$khe@MP~-NmYTm zX3qx;1G)7Yj~~+PMrdBTn&4iAk_ zCzVg(Na=19?+|cZ@IbL5e8K}(p%j$~LCzBsW`=l_98+=LxOqcU#KxZ4bF1w%xt0{a z`}n5x5A!4yPfR4$8*;e!gynrkwWs^THJ8fwm6_+NZhvfNz`X2$*7H3+nrmg>zn$fk zcU;DTEsp7Yqx;j4fC<766bo4PXc+pOTKe$LWCb^d;0JOacKq4RS~rcuZuyjTGNpGJ zdGs?sCo&vRd%owBN{66>{6Xdinj19ZyXSmv6+FVRpg$o@?6BAl?l~2f9l{R##m}7n zuvdnKCqd%iW=9Tg|0WBd0qnUq*`xfMA{hVF3Oz`Y&}R^LW-c%^fl>ZU%pX(?803|t z4oqwB*k7+NsASMk@89(JA%AxN0fuev7cTA1*!Id^O!B}t4yQjGPcSs;x3LM-7@9OZ z=w8Uk63@e{@FOXM;ULghj(rkR4j+zQ04pijarA>!#Pd1(`(A$LlzLtR)BDcFwBi3|wtWop4gCi;u{`7xI8ZA2L-PYy1jFf#wRRI3-_)Pq&*Imx z{ps&h?Ts7z{(f(M7~k`?l9BmF{*UDcW^d%bulm8@@b{Ao7I4RluIDspxZ8IB{^$7q z%7?}cf4Be5TKAJ}!~JbQq4U|*l{*+&ZhqrE(0ZO>k$w%({XjJjxaR}i|AR;2$Dwqf z`|W`4{~+n`0jQ)&zs5XMrtS@Ycb-gLPVZrJhW300zWWR^`xq^1m zyWUxR_7M!z4@iFKeHXjyz0AM7AYOB&=QfLf7qn^Ky}aAIU0%C^v)*oIvhlX<8Qz#F e2P9I`9q-0Hd(Hm59fiOI%i!ti=d#Wzp$P!RnKjM; literal 0 HcmV?d00001 diff --git a/mods/HELP/mcl_craftguide/textures/craftguide_prev_icon.png b/mods/HELP/mcl_craftguide/textures/craftguide_prev_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b26cd157f95aec853fce734574e5d319686b8399 GIT binary patch literal 728 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 literal 0 HcmV?d00001 diff --git a/mods/HELP/mcl_craftguide/textures/craftguide_zoomin_icon.png b/mods/HELP/mcl_craftguide/textures/craftguide_zoomin_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5b8ecc2cbdfbee1ae0398c6562221d711d47e6f8 GIT binary patch literal 3544 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 Date: Tue, 12 Mar 2019 22:21:06 +0100 Subject: [PATCH 148/379] Remove v6 craftguide image --- .../mcl_craftguide/textures/mcl_craftguide_v6.png | Bin 167 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mods/HELP/mcl_craftguide/textures/mcl_craftguide_v6.png diff --git a/mods/HELP/mcl_craftguide/textures/mcl_craftguide_v6.png b/mods/HELP/mcl_craftguide/textures/mcl_craftguide_v6.png deleted file mode 100644 index 50511b9e7defebc5f7b499a71109ea31198ca57c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaP3?%1DUd;wloB=)|u0T2|DXFNa$l>ejJRpa$ zB*-tA!Qt7BG$6;v)5S5Qg0Z)Iqu>Dp4(6*5er6=F+wk(rDFwT=n6+wtIX=JTwDI2! zn}gX_i?9{jHFC&q@O-1rZaOLPV8i^ZHIsE!uS8}ZWaK&Y^Zwq9ere8meA*L%<}!G? L`njxgN@xNA!Fn|0 From 9fc834c8dbea8afec4b845a1950bd34f64f1bbd4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 12 Mar 2019 23:00:42 +0100 Subject: [PATCH 149/379] Craftguide: Restore old group support --- mods/HELP/mcl_craftguide/init.lua | 68 +++++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 9 deletions(-) diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 28cae912f..56cdd8d1d 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -54,6 +54,9 @@ local FMT = { } local group_stereotypes = { + wood = "mcl_core:wood", + stone = "mcl_core:stone", + sand = "mcl_core:sand", wool = "mcl_wool:white", carpet = "mcl_wool:white_carpet", dye = "mcl_dye:red", @@ -74,6 +77,30 @@ local group_stereotypes = { clock = mcl_clock.sterotype, } +local group_names = { + shulker_box = "Any shulker box", + wool = "Any wool", + wood = "Any wood planks", + tree = "Any wood", + sand = "Any sand", + normal_sandstone = "Any normal sandstone", + red_sandstone = "Any red sandstone", + carpet = "Any carpet", + dye = "Any dye", + water_bucket = "Any water bucket", + flower = "Any flower", + mushroom = "Any mushroom", + wood_slab = "Any wooden slab", + wood_stairs = "Any wooden stairs", + coal = "Any coal", + quartz_block = "Any kind of quartz block", + purpur_block = "Any kind of purpur block", + stonebrick = "Any stone bricks", + stick = "Any stick", +} + + + local item_lists = { "main", "craft", @@ -365,7 +392,7 @@ end local function groups_to_item(groups) if #groups == 1 then local group = groups[1] - local def_gr = "default:" .. group + local def_gr = "mcl_core:" .. group if group_stereotypes[group] then return group_stereotypes[group] @@ -387,15 +414,35 @@ local function get_tooltip(item, groups, cooktime, burntime) local tooltip if groups then - local groupstr, c = {}, 0 + local gcol = "#FFAAFF" + if #groups == 1 then + local g = group_names[groups[1]] + -- Treat the groups “compass” and “clock” as fake groups + -- and just print the normal item name without special formatting + if groups[1] == "compass" or groups[1] == "clock" then + groupstr = reg_items[item].description + elseif group_names[groups[1]] then + -- Use the special group name string + groupstr = minetest.colorize(gcol, group_names[groups[1]]) + else + --[[ Fallback: Generic group explanation: This always + works, but the internally used group name (which + looks ugly) is exposed to the user. ]] + groupstr = minetest.colorize(gcol, groups[1]) + groupstr = S("Any item belonging to the @1 group", groupstr) + end + tooltip = groupstr + else - for i = 1, #groups do - c = c + 1 - groupstr[c] = colorize("yellow", groups[i]) + local groupstr, c = {}, 0 + for i = 1, #groups do + c = c + 1 + groupstr[c] = colorize(gcol, groups[i]) + end + + groupstr = concat(groupstr, ", ") + tooltip = S("Any item belonging to the groups: @1", groupstr) end - - groupstr = concat(groupstr, ", ") - tooltip = S("Any item belonging to the group(s): @1", groupstr) else tooltip = reg_items[item].description end @@ -473,7 +520,10 @@ local function get_recipe_fs(data, iY) item = groups_to_item(groups) end - local label = groups and "\nG" or "" + local label = "" + if groups and (#groups >= 1 and groups[1] ~= "compass" and groups[1] ~= "clock") then + label = "\nG" + end fs[#fs + 1] = fmt(FMT.item_image_button, X, From e24a698baeec77b6684b95c04d0475f4bc3936f3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 12 Mar 2019 23:05:03 +0100 Subject: [PATCH 150/379] =?UTF-8?q?Craftguide:=202=C3=972=20for=20shapeles?= =?UTF-8?q?s=20recipe=20w/=20<=3D=204=20items?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/HELP/mcl_craftguide/init.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 56cdd8d1d..4adf25a19 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -471,7 +471,11 @@ local function get_recipe_fs(data, iY) cooktime, width = width, 1 elseif width == 0 then shapeless = true - width = min(3, #recipe.items) + if #recipe.items <= 4 then + width = 2 + else + width = min(3, #recipe.items) + end end local rows = ceil(maxn(recipe.items) / width) From 82d56de18e129d6a51134c3db0dfe4c707bb00ab Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 12 Mar 2019 23:07:35 +0100 Subject: [PATCH 151/379] Craftguide: Remove no_prepend[] --- mods/HELP/mcl_craftguide/init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 4adf25a19..236d87276 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -640,7 +640,6 @@ local function make_formspec(name) fs[#fs + 1] = fmt("size[%f,%f;]", data.iX - 0.35, iY + 4) fs[#fs + 1] = [[ - no_prepend[] background[1,1;1,1;craftguide_bg.png;true] ]] From cdb6e3e3f50ec35ff37e1df679b04f6c1c877d5e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 12 Mar 2019 23:08:04 +0100 Subject: [PATCH 152/379] Craftguide: Remove /craft command --- mods/HELP/mcl_craftguide/init.lua | 58 ------------------------------- 1 file changed, 58 deletions(-) diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 236d87276..2f37ebd30 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -1133,64 +1133,6 @@ if progressive_mode then end) end -M.register_chatcommand("craft", { - description = S("Show recipe(s) of the pointed node"), - func = function(name) - local player = get_player_by_name(name) - local ppos = player:get_pos() - local dir = player:get_look_dir() - local eye_h = {x = ppos.x, y = ppos.y + 1.625, z = ppos.z} - local node_name - - for i = 1, 10 do - local look_at = vec_add(eye_h, vec_mul(dir, i)) - local node = M.get_node(look_at) - - if node.name ~= "air" then - node_name = node.name - break - end - end - - local red = colorize("red", "[mcl_craftguide] ") - - if not node_name then - return false, red .. S("No node pointed") - end - - local data = player_data[name] - reset_data(data) - - local recipes = recipes_cache[node_name] - local usages = usages_cache[node_name] - - if recipes then - recipes = apply_recipe_filters(recipes, player) - end - - if not recipes or #recipes == 0 then - local ylw = colorize("yellow", node_name) - local msg = red .. "%s: " .. ylw - - if usages then - recipes = usages_cache[node_name] - if #recipes > 0 then - data.show_usages = true - end - elseif recipes_cache[node_name] then - return false, fmt(msg, S("You don't know a recipe for this node")) - else - return false, fmt(msg, S("No recipe for this node")) - end - end - - data.query_item = node_name - data.recipes = recipes - - return true, show_fs(player, name) - end, -}) - function mcl_craftguide.show(name, item, show_usages) local func = "mcl_craftguide." .. __func() .. "(): " assert(name, func .. "player name missing") From e77c5a3562109571be1b545a354dacdf6584d9e8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 13 Mar 2019 00:13:04 +0100 Subject: [PATCH 153/379] Craftguide: Remove call to Lua debug library --- mods/HELP/mcl_craftguide/init.lua | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 2f37ebd30..25f6fac5d 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -153,14 +153,10 @@ local function table_diff(t, t2) return diff end -local function __func() - return debug.getinfo(2, "n").name -end - local custom_crafts, craft_types = {}, {} function mcl_craftguide.register_craft_type(name, def) - local func = "mcl_craftguide." .. __func() .. "(): " + local func = "mcl_craftguide.register_craft_guide(): " assert(name, func .. "'name' field missing") assert(def.description, func .. "'description' field missing") assert(def.icon, func .. "'icon' field missing") @@ -169,7 +165,7 @@ function mcl_craftguide.register_craft_type(name, def) end function mcl_craftguide.register_craft(def) - local func = "mcl_craftguide." .. __func() .. "(): " + local func = "mcl_craftguide.register_craft(): " assert(def.type, func .. "'type' field missing") assert(def.width, func .. "'width' field missing") assert(def.output, func .. "'output' field missing") @@ -181,7 +177,7 @@ end local recipe_filters = {} function mcl_craftguide.add_recipe_filter(name, f) - local func = "mcl_craftguide." .. __func() .. "(): " + local func = "mcl_craftguide.add_recipe_filter(): " assert(name, func .. "filter name missing") assert(f and type(f) == "function", func .. "filter function missing") @@ -193,7 +189,7 @@ function mcl_craftguide.remove_recipe_filter(name) end function mcl_craftguide.set_recipe_filter(name, f) - local func = "mcl_craftguide." .. __func() .. "(): " + local func = "mcl_craftguide.set_recipe_filter(): " assert(name, func .. "filter name missing") assert(f and type(f) == "function", func .. "filter function missing") @@ -215,7 +211,7 @@ end local search_filters = {} function mcl_craftguide.add_search_filter(name, f) - local func = "mcl_craftguide." .. __func() .. "(): " + local func = "mcl_craftguide.add_search_filter(): " assert(name, func .. "filter name missing") assert(f and type(f) == "function", func .. "filter function missing") @@ -233,7 +229,7 @@ end local formspec_elements = {} function mcl_craftguide.add_formspec_element(name, def) - local func = "mcl_craftguide." .. __func() .. "(): " + local func = "mcl_craftguide.add_formspec_element(): " assert(def.element, func .. "'element' field not defined") assert(def.type, func .. "'type' field not defined") assert(FMT[def.type], func .. "'" .. def.type .. "' type not supported by the API") @@ -1134,7 +1130,7 @@ if progressive_mode then end function mcl_craftguide.show(name, item, show_usages) - local func = "mcl_craftguide." .. __func() .. "(): " + local func = "mcl_craftguide.show(): " assert(name, func .. "player name missing") local data = player_data[name] From e26f03f37ec34d8a7a7d209684ba71bd4e6568a0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 13 Mar 2019 02:45:46 +0100 Subject: [PATCH 154/379] Remove some no-longer missing engine features --- MISSING_ENGINE_FEATURES.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/MISSING_ENGINE_FEATURES.md b/MISSING_ENGINE_FEATURES.md index c3bb8a288..313c535f4 100644 --- a/MISSING_ENGINE_FEATURES.md +++ b/MISSING_ENGINE_FEATURES.md @@ -8,8 +8,6 @@ For these features, no easy Lua workaround could be found. ### Lua API #### Tools/wielded item -- Allow **much** faster liquid flowing ([#2810](https://github.com/minetest/minetest/issues/2810)) - - “Lock” hotbar for a brief time after using an item, making it impossible to switch item or to attach/mine/build until the delay is over (For eating with delay) - Tool charging: Holding down the mouse and releasing it, applying a “power level” (For bow and arrows, more charge = higher arrow range) ([issue 5212](https://github.com/minetest/minetest/issues/5212)) - [Dual Wielding](http://minecraft.gamepedia.com/Dual_wield) @@ -21,7 +19,6 @@ For these features, no easy Lua workaround could be found. ## Interface - Inventory: Hold down right mouse button while holding an item stack to drop items into the slots as you move the mouse. Makes crafting MUCH faster -- **Much** more informative item tooltips - Sneak+Leftclick on crafting output crafts as many items as possible and immediately puts it into the player inventory ([issue 5211](https://github.com/minetest/minetest/issues/5211)) - Sneak+click on inventory slot should be able to put items into additional “fallback inventories” if the first inventory is full. Required for large chests - Sneak+click puts items in different inventories depending on the item type (maybe group-based)? Required for sneak-clicking to armor slots @@ -39,8 +36,5 @@ For these features, a workaround (or hack ;-)) by using Lua is theoretically pos - Set damage frequency of `damage_per_second`. In Minecraft many things damage players every half-second rather than every second - Possible to damage players directly when they are with the head inside. This allows to add Minecraft-like suffocation -#### Crafting -- Require tools to be intact in crafting - #### Nice-to-haye - Utility function to rotate pillar-like nodes, requiring only 3 possible orientations (X, Y, Z). Basically this is `minetest.rotate_node` but with less orientations; the purpur pillar would mess up if a mirrored rotation would be possible. This is already implemented in MCL2, See `mcl_util` for more infos From d25e9ec4cc1ad82d3f21f1348407e9446b4a66bc Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 13 Mar 2019 04:52:23 +0100 Subject: [PATCH 155/379] Re-introduce the progressive mode! YESSSSS --- mods/HELP/mcl_craftguide/API.md | 34 +++++++++++------------ mods/HELP/mcl_craftguide/init.lua | 18 ++++++++++-- mods/HELP/mcl_craftguide/settingtypes.txt | 9 +++--- mods/HUD/mcl_inventory/depends.txt | 1 - mods/HUD/mcl_inventory/init.lua | 2 -- settingtypes.txt | 12 ++++---- 6 files changed, 40 insertions(+), 36 deletions(-) diff --git a/mods/HELP/mcl_craftguide/API.md b/mods/HELP/mcl_craftguide/API.md index e03a0e2b5..17b42ee7b 100644 --- a/mods/HELP/mcl_craftguide/API.md +++ b/mods/HELP/mcl_craftguide/API.md @@ -5,7 +5,7 @@ #### Registering a custom crafting type (example) ```Lua -craftguide.register_craft_type("digging", { +mcl_craftguide.register_craft_type("digging", { description = "Digging", icon = "default_tool_steelpick.png", }) @@ -14,7 +14,7 @@ craftguide.register_craft_type("digging", { #### Registering a custom crafting recipe (example) ```Lua -craftguide.register_craft({ +mcl_craftguide.register_craft({ type = "digging", width = 1, output = "default:cobble 2", @@ -29,7 +29,7 @@ craftguide.register_craft({ Recipe filters can be used to filter the recipes shown to players. Progressive mode is implemented as a recipe filter. -#### `craftguide.add_recipe_filter(name, function(recipes, player))` +#### `mcl_craftguide.add_recipe_filter(name, function(recipes, player))` Adds a recipe filter with the given name. The filter function should return the recipes to be displayed, given the available recipes and an `ObjectRef` to the @@ -39,7 +39,7 @@ user. Each recipe is a table of the form returned by Example function to hide recipes for items from a mod called "secretstuff": ```lua -craftguide.add_recipe_filter("Hide secretstuff", function(recipes) +mcl_craftguide.add_recipe_filter("Hide secretstuff", function(recipes) local filtered = {} for _, recipe in ipairs(recipes) do if recipe.output:sub(1,12) ~= "secretstuff:" then @@ -51,15 +51,15 @@ craftguide.add_recipe_filter("Hide secretstuff", function(recipes) end) ``` -#### `craftguide.remove_recipe_filter(name)` +#### `mcl_craftguide.remove_recipe_filter(name)` Removes the recipe filter with the given name. -#### `craftguide.set_recipe_filter(name, function(recipe, player))` +#### `mcl_craftguide.set_recipe_filter(name, function(recipe, player))` Removes all recipe filters and adds a new one. -#### `craftguide.get_recipe_filters()` +#### `mcl_craftguide.get_recipe_filters()` Returns a map of recipe filters, indexed by name. @@ -80,7 +80,7 @@ Notes: - Filters can be combined. - The `groups` filter is currently implemented by default. -#### `craftguide.add_search_filter(name, function(item, values))` +#### `mcl_craftguide.add_search_filter(name, function(item, values))` Adds a search filter with the given name. The search function should return a boolean value (whether the given item should be listed or not). @@ -88,7 +88,7 @@ The search function should return a boolean value (whether the given item should Example function to show items which contain at least a recipe of given width(s): ```lua -craftguide.add_search_filter("widths", function(item, widths) +mcl_craftguide.add_search_filter("widths", function(item, widths) local has_width local recipes = recipes_cache[item] @@ -109,11 +109,11 @@ craftguide.add_search_filter("widths", function(item, widths) end) ``` -#### `craftguide.remove_search_filter(name)` +#### `mcl_craftguide.remove_search_filter(name)` Removes the search filter with the given name. -#### `craftguide.get_search_filters()` +#### `mcl_craftguide.get_search_filters()` Returns a map of search filters, indexed by name. @@ -121,7 +121,7 @@ Returns a map of search filters, indexed by name. ### Custom formspec elements -#### `craftguide.add_formspec_element(name, def)` +#### `mcl_craftguide.add_formspec_element(name, def)` Adds a formspec element to the current formspec. Supported types: `box`, `label`, `image`, `button`, `tooltip`, `item_image`, `image_button`, `item_image_button` @@ -129,7 +129,7 @@ Supported types: `box`, `label`, `image`, `button`, `tooltip`, `item_image`, `im Example: ```lua -craftguide.add_formspec_element("export", { +mcl_craftguide.add_formspec_element("export", { type = "button", element = function(data) -- Should return a table of parameters according to the formspec element type. @@ -152,11 +152,11 @@ craftguide.add_formspec_element("export", { }) ``` -#### `craftguide.remove_formspec_element(name)` +#### `mcl_craftguide.remove_formspec_element(name)` Removes the formspec element with the given name. -#### `craftguide.get_formspec_elements()` +#### `mcl_craftguide.get_formspec_elements()` Returns a map of formspec elements, indexed by name. @@ -164,10 +164,8 @@ Returns a map of formspec elements, indexed by name. ### Miscellaneous -#### `craftguide.show(player_name, item, show_usages)` +#### `mcl_craftguide.show(player_name, item, show_usages)` Opens the Crafting Guide with the current filter applied. * `player_name`: string param. - * `item`: optional, string param. If set, this item is pre-selected. If the item does not exist or has no recipe, use the player's previous selection. By default, player's previous selection is used - * `show_usages`: optional, boolean param. If true, show item usages. diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 25f6fac5d..e92569092 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -10,8 +10,8 @@ local recipes_cache = {} local usages_cache = {} local fuel_cache = {} -local progressive_mode = M.settings:get_bool("craftguide_progressive_mode") and rawget(_G, "sfinv") -local sfinv_only = M.settings:get_bool("craftguide_sfinv_only") and rawget(_G, "sfinv") +local progressive_mode = M.settings:get_bool("mcl_craftguide_progressive_mode") or true +local sfinv_only = false local colorize = M.colorize local reg_items = M.registered_items @@ -1008,6 +1008,8 @@ else M.register_on_player_receive_fields(function(player, formname, fields) if formname == "mcl_craftguide" then on_receive_fields(player, fields) + elseif fields.__mcl_craftguide then + mcl_craftguide.show(player:get_player_name()) end end) @@ -1129,7 +1131,7 @@ if progressive_mode then end) end -function mcl_craftguide.show(name, item, show_usages) +function mcl_craftguide.show_old(name, item, show_usages) local func = "mcl_craftguide.show(): " assert(name, func .. "player name missing") @@ -1148,6 +1150,16 @@ function mcl_craftguide.show(name, item, show_usages) show_fs(player, name) end +function mcl_craftguide.show(name) + local player = minetest.get_player_by_name(name) + if next(recipe_filters) then + local data = player_data[name] + data.items_raw = get_filtered_items(player) + search(data) + end + show_formspec(name, "mcl_craftguide", make_formspec(name)) +end + --[[ Custom recipes (>3x3) test code M.register_craftitem(":secretstuff:custom_recipe_test", { diff --git a/mods/HELP/mcl_craftguide/settingtypes.txt b/mods/HELP/mcl_craftguide/settingtypes.txt index 14198aeb0..dd3a5915e 100644 --- a/mods/HELP/mcl_craftguide/settingtypes.txt +++ b/mods/HELP/mcl_craftguide/settingtypes.txt @@ -1,5 +1,4 @@ -# The progressive mode shows recipes you can craft from items you ever had in your inventory. -craftguide_progressive_mode (Progressive Mode) bool false - -# Integration in the default Minetest Game inventory. -craftguide_sfinv_only (Sfinv only) bool false \ No newline at end of file +# 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. +mcl_craftguide_progressive_mode (Learn crafting recipes progressively) bool true diff --git a/mods/HUD/mcl_inventory/depends.txt b/mods/HUD/mcl_inventory/depends.txt index b1bb24873..46d93c42a 100644 --- a/mods/HUD/mcl_inventory/depends.txt +++ b/mods/HUD/mcl_inventory/depends.txt @@ -1,5 +1,4 @@ mcl_init mcl_player? -mcl_craftguide? _mcl_autogroup? 3d_armor? diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 5d6c8ca66..9738cd4db 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -131,8 +131,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if not minetest.settings:get_bool("creative_mode") and (formname == "" or formname == "main") then set_inventory(player) end - elseif fields.__mcl_craftguide and mod_craftguide then - mcl_craftguide.show(player:get_player_name()) end end) diff --git a/settingtypes.txt b/settingtypes.txt index ba0db568e..ae31f9304 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -40,6 +40,11 @@ mcl_keepInventory (Keep inventory on death) bool false # If enabled, chat messages are shown to everyone when a player dies. mcl_showDeathMessages (Show death 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. +mcl_craftguide_progressive_mode (Learn crafting recipes progressively) bool true + [Mobs] # If enabled, mobs will spawn naturally. This does not affect # affect mob spawners. @@ -74,13 +79,6 @@ mobs_disable_blood (Disable mob blood) bool false flame_sound (Flame sound) bool true [Experimental] -# If enabled, the recipe book will only show recipes which require one -# item which you have already discovered. -# If disabled, the recipe book shows all crafting recipes. -# This setting is EXPERIMENTAL and may be changed in later versions. -# Feedback is appreciated. -craftguide_progressive_mode (Enable recipe book progressive mode) bool false - # Mobs difficulty. This is a number that will affect the initial and maximum # health and the amount of damage that mobs deal. Health and damage will # be multiplied with this number. From 008a1b1cac477b9167c00eafcde9e9aafa6bb44a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 13 Mar 2019 05:57:43 +0100 Subject: [PATCH 156/379] Add German translation for boats --- mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr | 10 ++++++++++ mods/ENTITIES/mcl_boats/locale/template.txt | 10 ++++++++++ 2 files changed, 20 insertions(+) create mode 100644 mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr create mode 100644 mods/ENTITIES/mcl_boats/locale/template.txt diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr new file mode 100644 index 000000000..d18b3526c --- /dev/null +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_boats +Acacia Boat=Akazienboot +Birch Boat=Birkenboot +Boat=Boot +Boats are used to travel on the surface of water.=Boote werden benutzt, um sich auf der Wasseroberfläche zu bewegen. +Dark Oak Boat=Dunkeleichenboot +Jungle Boat=Dschungelboot +Oak Boat=Eichenboot +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. Rightclick the boat again to leave it, punch the boat to make it drop as an item.=Rechtsklicken Sie auf eine Wasserquelle, um das Boot zu platzieren. Rechtsklicken Sie auf das Boot, um es zu betreten. Mit [Links] und [Rechts] lenken, mit [Vorwärts] und [Rückwärts] Geschwindigkeit regeln oder rückwärts fahren. Rechtsklicken Sie erneut auf das Boot, um es zu verlassen, schlagen Sie das Boot, um es als Gegenstand fallen zu lassen. +Spruce Boat=Fichtenboot diff --git a/mods/ENTITIES/mcl_boats/locale/template.txt b/mods/ENTITIES/mcl_boats/locale/template.txt new file mode 100644 index 000000000..9af27b704 --- /dev/null +++ b/mods/ENTITIES/mcl_boats/locale/template.txt @@ -0,0 +1,10 @@ +# textdomain: mcl_boats +Acacia Boat= +Birch Boat= +Boat= +Boats are used to travel on the surface of water.= +Dark Oak Boat= +Jungle Boat= +Oak Boat= +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. Rightclick the boat again to leave it, punch the boat to make it drop as an item.= +Spruce Boat= From f7af5dfa0712d1d28bf70840abf0219babd85ace Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 13 Mar 2019 08:05:59 +0100 Subject: [PATCH 157/379] Version 0.50.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e81c549d9..f480fc8f7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.49.0 +Version: 0.50.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From fb389df3a04148938a2307adb65ad7e9beeb4e71 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 13 Mar 2019 11:32:26 +0100 Subject: [PATCH 158/379] Fix crash when clicking craftbook icon in furnace --- mods/HELP/mcl_craftguide/init.lua | 19 ------------------- mods/ITEMS/mcl_furnaces/init.lua | 6 +----- 2 files changed, 1 insertion(+), 24 deletions(-) diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index e92569092..4785c93b7 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -1131,25 +1131,6 @@ if progressive_mode then end) end -function mcl_craftguide.show_old(name, item, show_usages) - local func = "mcl_craftguide.show(): " - assert(name, func .. "player name missing") - - local data = player_data[name] - local player = get_player_by_name(name) - local query_item = data.query_item - - reset_data(data) - - item = reg_items[item] and item or query_item - - data.query_item = item - data.show_usages = show_usages - data.recipes = get_recipes(item, data, player) - - show_fs(player, name) -end - function mcl_craftguide.show(name) local player = minetest.get_player_by_name(name) if next(recipe_filters) then diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index 781fe4a94..3e1b9c3b6 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -20,7 +20,6 @@ local function active_formspec(fuel_percent, item_percent) (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. "image_button[8,0;1,1;craftguide_book.png;craftguide;]".. "tooltip[craftguide;Recipe book]".. - "tooltip[doc;Help]".. "listring[current_name;dst]".. "listring[current_player;main]".. "listring[current_name;src]".. @@ -41,7 +40,6 @@ local inactive_formspec = "size[9,8.75]".. "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]".. "image_button[8,0;1,1;craftguide_book.png;craftguide;]".. "tooltip[craftguide;Recipe book]".. - "tooltip[doc;Help]".. "listring[current_name;dst]".. "listring[current_player;main]".. "listring[current_name;src]".. @@ -51,9 +49,7 @@ local inactive_formspec = "size[9,8.75]".. local receive_fields = function(pos, formname, fields, sender) if fields.craftguide then - mcl_craftguide.show_craftguide(sender) - elseif fields.doc and minetest.get_modpath("doc") then - doc.show_entry(sender:get_player_name(), "nodes", "mcl_furnaces:furnace", true) + mcl_craftguide.show(sender:get_player_name()) end end From 550efda4953f46d2f116836b8df0513d2876fda5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 13 Mar 2019 11:32:55 +0100 Subject: [PATCH 159/379] Version 0.50.1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f480fc8f7..8345b5f4e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.50.0 +Version: 0.50.1 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 2b586549cfed87b6f4bc6a1b608f94ef2e276f05 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 13 Mar 2019 22:52:14 +0100 Subject: [PATCH 160/379] Add translation templates for 3 mods --- mods/ENTITIES/mcl_falling_nodes/init.lua | 5 +- .../mcl_falling_nodes/locale/template.txt | 3 ++ .../awards/locale/{de.txt => awards.de.tr} | 0 mods/HUD/hbarmor/locale/de.txt | 2 - mods/HUD/hbarmor/locale/hbarmor.de.tr | 2 + .../hbarmor/locale/{it.txt => hbarmor.it.tr} | 4 +- mods/HUD/hbarmor/locale/template.txt | 4 +- mods/HUD/mcl_achievements/locale/template.txt | 49 +++++++++++++++++++ 8 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 mods/ENTITIES/mcl_falling_nodes/locale/template.txt rename mods/HUD/awards/locale/{de.txt => awards.de.tr} (100%) delete mode 100644 mods/HUD/hbarmor/locale/de.txt create mode 100644 mods/HUD/hbarmor/locale/hbarmor.de.tr rename mods/HUD/hbarmor/locale/{it.txt => hbarmor.it.tr} (65%) create mode 100644 mods/HUD/mcl_achievements/locale/template.txt diff --git a/mods/ENTITIES/mcl_falling_nodes/init.lua b/mods/ENTITIES/mcl_falling_nodes/init.lua index 753f7c8c8..35355c790 100644 --- a/mods/ENTITIES/mcl_falling_nodes/init.lua +++ b/mods/ENTITIES/mcl_falling_nodes/init.lua @@ -1,3 +1,4 @@ +local S = minetest.get_translator("mcl_falling_nodes") local dmes = minetest.get_modpath("mcl_death_messages") ~= nil local get_falling_depth = function(self) @@ -48,9 +49,9 @@ local deal_falling_damage = function(self, dtime) -- TODO: Reduce damage if wearing a helmet local msg if minetest.get_item_group(self.node.name, "anvil") ~= 0 then - msg = "%s was smashed by a falling anvil." + msg = S("%s was smashed by a falling anvil.") else - msg = "%s was smashed by a falling block." + msg = S("%s was smashed by a falling block.") end if dmes then mcl_death_messages.player_damage(v, string.format(msg, v:get_player_name())) diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/template.txt b/mods/ENTITIES/mcl_falling_nodes/locale/template.txt new file mode 100644 index 000000000..040742c69 --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +%s was smashed by a falling anvil.= +%s was smashed by a falling block.= diff --git a/mods/HUD/awards/locale/de.txt b/mods/HUD/awards/locale/awards.de.tr similarity index 100% rename from mods/HUD/awards/locale/de.txt rename to mods/HUD/awards/locale/awards.de.tr diff --git a/mods/HUD/hbarmor/locale/de.txt b/mods/HUD/hbarmor/locale/de.txt deleted file mode 100644 index 5a6bacdca..000000000 --- a/mods/HUD/hbarmor/locale/de.txt +++ /dev/null @@ -1,2 +0,0 @@ -Armor = Panzerung -%s: %d%% = %s: %d%% diff --git a/mods/HUD/hbarmor/locale/hbarmor.de.tr b/mods/HUD/hbarmor/locale/hbarmor.de.tr new file mode 100644 index 000000000..d1be86985 --- /dev/null +++ b/mods/HUD/hbarmor/locale/hbarmor.de.tr @@ -0,0 +1,2 @@ +Armor=Panzerung +%s: %d%%=%s: %d%% diff --git a/mods/HUD/hbarmor/locale/it.txt b/mods/HUD/hbarmor/locale/hbarmor.it.tr similarity index 65% rename from mods/HUD/hbarmor/locale/it.txt rename to mods/HUD/hbarmor/locale/hbarmor.it.tr index a2f704b24..f9c8f99e3 100644 --- a/mods/HUD/hbarmor/locale/it.txt +++ b/mods/HUD/hbarmor/locale/hbarmor.it.tr @@ -1,4 +1,4 @@ -Armor = Armatura +Armor=Armatura # Format string for displaying the armor. E.g. "Armor: 100%" -%s: %d%% = +%s: %d%%=%s: %d%% diff --git a/mods/HUD/hbarmor/locale/template.txt b/mods/HUD/hbarmor/locale/template.txt index d898abe48..09bc54cef 100644 --- a/mods/HUD/hbarmor/locale/template.txt +++ b/mods/HUD/hbarmor/locale/template.txt @@ -1,4 +1,4 @@ -Armor = +Armor= # Format string for displaying the armor. E.g. "Armor: 100%" -%s: %d%% = +%s: %d%%= diff --git a/mods/HUD/mcl_achievements/locale/template.txt b/mods/HUD/mcl_achievements/locale/template.txt new file mode 100644 index 000000000..3b6301620 --- /dev/null +++ b/mods/HUD/mcl_achievements/locale/template.txt @@ -0,0 +1,49 @@ +# textdomain: mcl_achievements +Aquire Hardware= +Bake Bread= +Benchmarking= +Cow Tipper= +Craft a bookshelf.= +Craft a cake using wheat, sugar, milk and an egg.= +Craft a crafting table from 4 wooden planks.= +Craft a stone pickaxe using sticks and cobblestone.= +Craft a wooden sword using wooden planks and sticks on a crafting table.= +DIAMONDS!= +Delicious Fish= +Dispense With This= +Eat a cooked porkchop.= +Eat a cooked rabbit.= +Get really desperate and eat rotten flesh.= +Getting Wood= +Getting an Upgrade= +Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.= +Hot Topic= +Into Fire= +Into the Nether= +Iron Belly= +Librarian= +Mine emerald ore.= +On A Rail= +Pick up a blaze rod from the floor.= +Pick up a diamond from the floor.= +Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.= +Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.= +Place a dispenser.= +Place a flower pot.= +Pork Chop= +Pot Planter= +Rabbit Season= +Sniper Duel= +Take a cooked fish from a furnace.@nHint: Use a fishing rod to catch a fish and cook it in a furnace.= +Take an iron ingot from a furnace's output slot.@nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace.= +The Haggler= +The Lie= +Time to Farm!= +Time to Mine!= +Time to Strike!= +Travel by minecart for at least 1000 meters from your starting point in a single ride.= +Use 8 cobblestones to craft a furnace.= +Use a crafting table to craft a wooden hoe from wooden planks and sticks.= +Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.= +Use obsidian and a fire starter to construct a Nether portal.= +Use wheat to craft a bread.= From d7fc15807333cb8d1f5fb43f57045385d25b8b9b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 13 Mar 2019 23:26:33 +0100 Subject: [PATCH 161/379] Make mcl_spawn translatable --- mods/PLAYER/mcl_spawn/init.lua | 7 ++++--- mods/PLAYER/mcl_spawn/locale/template.txt | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 mods/PLAYER/mcl_spawn/locale/template.txt diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index 9f8fa70ec..66fe8cdd0 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -1,5 +1,6 @@ mcl_spawn = {} +local S = minetest.get_translator("mcl_spawn") local mg_name = minetest.get_mapgen_setting("mg_name") local cached_world_spawn @@ -63,7 +64,7 @@ mcl_spawn.set_spawn_pos = function(player, pos, message) if meta:get_string("mcl_beds:spawn") ~= "" then spawn_changed = true if message then - minetest.chat_send_player(player:get_player_name(), "Respawn position cleared!") + minetest.chat_send_player(player:get_player_name(), S("Respawn position cleared!")) end end meta:set_string("mcl_beds:spawn", "") @@ -74,7 +75,7 @@ mcl_spawn.set_spawn_pos = function(player, pos, message) if vector.distance(pos, oldpos) > 0.1 then spawn_changed = true if message then - minetest.chat_send_player(player:get_player_name(), "New respawn position set!") + minetest.chat_send_player(player:get_player_name(), S("New respawn position set!")) end end end @@ -115,7 +116,7 @@ minetest.register_on_respawnplayer(function(player) if (bgroup ~= 1 and bgroup ~= 2) then mcl_spawn.set_spawn_pos(player, nil) end - minetest.chat_send_player(player:get_player_name(), "Your spawn bed was missing or blocked.") + minetest.chat_send_player(player:get_player_name(), S("Your spawn bed was missing or blocked.")) end end end) diff --git a/mods/PLAYER/mcl_spawn/locale/template.txt b/mods/PLAYER/mcl_spawn/locale/template.txt new file mode 100644 index 000000000..8906d18f9 --- /dev/null +++ b/mods/PLAYER/mcl_spawn/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mcl_spawn +New respawn position set!= +Respawn position cleared!= +Your spawn bed was missing or blocked.= From 5aeb4aea74b460af3a90a6b15c20b66320788911 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 13 Mar 2019 23:40:59 +0100 Subject: [PATCH 162/379] Add translation templates for most mods Using the findtext.lua script --- .../mcl_minecarts/locale/template.txt | 23 + .../ENVIRONMENT/lightning/locale/template.txt | 4 + .../mcl_void_damage/locale/template.txt | 3 + mods/HELP/mcl_doc/locale/template.txt | 54 ++ mods/HELP/mcl_doc_basics/locale/template.txt | 465 ++++++++++++++++++ .../mcl_death_messages/locale/template.txt | 53 ++ mods/HUD/mcl_inventory/locale/template.txt | 1 + .../mcl_comparators/locale/template.txt | 9 + .../mcl_dispensers/locale/template.txt | 7 + .../REDSTONE/mcl_droppers/locale/template.txt | 6 + .../mcl_observers/locale/template.txt | 4 + .../mesecons_button/locale/template.txt | 0 .../mesecons_commandblock/locale/template.txt | 14 + .../mesecons_delayer/locale/template.txt | 8 + .../mesecons_lightstone/locale/template.txt | 0 .../mesecons_noteblock/locale/template.txt | 10 + .../mesecons_pistons/locale/template.txt | 6 + .../locale/template.txt | 11 + .../mesecons_solarpanel/locale/template.txt | 5 + .../mesecons_torch/locale/template.txt | 10 + .../mesecons_walllever/locale/template.txt | 4 + .../mesecons_wires/locale/template.txt | 10 + mods/ITEMS/mcl_anvils/locale/template.txt | 13 + mods/ITEMS/mcl_banners/locale/template.txt | 60 +++ mods/ITEMS/mcl_beds/locale/template.txt | 32 ++ mods/ITEMS/mcl_books/locale/template.txt | 25 + mods/ITEMS/mcl_bows/locale/template.txt | 11 + mods/ITEMS/mcl_buckets/locale/template.txt | 13 + mods/ITEMS/mcl_cake/locale/template.txt | 10 + mods/ITEMS/mcl_cauldrons/locale/template.txt | 10 + mods/ITEMS/mcl_chests/locale/template.txt | 28 ++ mods/ITEMS/mcl_clock/locale/template.txt | 4 + mods/ITEMS/mcl_cocoas/locale/template.txt | 6 + .../ITEMS/mcl_colorblocks/locale/template.txt | 0 mods/ITEMS/mcl_compass/locale/template.txt | 3 + .../mcl_crafting_table/locale/template.txt | 4 + mods/ITEMS/mcl_doors/locale/template.txt | 22 + mods/ITEMS/mcl_dye/locale/template.txt | 25 + mods/ITEMS/mcl_end/locale/template.txt | 23 + mods/ITEMS/mcl_farming/locale/template.txt | 93 ++++ mods/ITEMS/mcl_fences/locale/template.txt | 16 + mods/ITEMS/mcl_fire/locale/template.txt | 15 + mods/ITEMS/mcl_fishing/locale/template.txt | 16 + mods/ITEMS/mcl_flowerpots/locale/template.txt | 24 + mods/ITEMS/mcl_flowers/locale/template.txt | 32 ++ mods/ITEMS/mcl_furnaces/locale/template.txt | 5 + mods/ITEMS/mcl_heads/locale/template.txt | 11 + mods/ITEMS/mcl_hoppers/locale/template.txt | 8 + mods/ITEMS/mcl_itemframes/locale/template.txt | 4 + mods/ITEMS/mcl_jukebox/locale/template.txt | 9 + mods/ITEMS/mcl_maps/locale/template.txt | 7 + mods/ITEMS/mcl_mobitems/locale/template.txt | 60 +++ .../ITEMS/mcl_mobspawners/locale/template.txt | 4 + .../mcl_monster_eggs/locale/template.txt | 8 + mods/ITEMS/mcl_mushrooms/locale/template.txt | 21 + mods/ITEMS/mcl_nether/locale/template.txt | 27 + mods/ITEMS/mcl_ocean/locale/template.txt | 9 + mods/ITEMS/mcl_portals/locale/template.txt | 14 + mods/ITEMS/mcl_potions/locale/template.txt | 20 + mods/ITEMS/mcl_signs/locale/template.txt | 4 + mods/ITEMS/mcl_sponges/locale/template.txt | 8 + mods/ITEMS/mcl_stairs/locale/template.txt | 101 ++++ mods/ITEMS/mcl_throwing/locale/template.txt | 9 + mods/ITEMS/mcl_tnt/locale/template.txt | 5 + mods/ITEMS/mcl_tools/locale/template.txt | 29 ++ mods/ITEMS/mcl_torches/locale/template.txt | 3 + mods/ITEMS/mcl_totems/locale/template.txt | 0 mods/ITEMS/mcl_walls/locale/template.txt | 16 + mods/ITEMS/mcl_wool/locale/template.txt | 35 ++ mods/ITEMS/mclx_core/locale/template.txt | 5 + mods/ITEMS/mclx_fences/locale/template.txt | 4 + mods/ITEMS/mclx_stairs/locale/template.txt | 31 ++ .../3d_armor/locale/template.txt | 23 + .../3d_armor_stand/locale/template.txt | 4 + mods/ITEMS/xpanes/locale/template.txt | 21 + mods/MISC/mcl_commands/locale/template.txt | 20 + mods/MISC/mcl_privs/locale/template.txt | 2 + mods/MISC/mcl_wip/locale/template.txt | 3 + .../PLAYER/mcl_playerplus/locale/template.txt | 3 + 79 files changed, 1725 insertions(+) create mode 100644 mods/ENTITIES/mcl_minecarts/locale/template.txt create mode 100644 mods/ENVIRONMENT/lightning/locale/template.txt create mode 100644 mods/ENVIRONMENT/mcl_void_damage/locale/template.txt create mode 100644 mods/HELP/mcl_doc/locale/template.txt create mode 100644 mods/HELP/mcl_doc_basics/locale/template.txt create mode 100644 mods/HUD/mcl_death_messages/locale/template.txt create mode 100644 mods/HUD/mcl_inventory/locale/template.txt create mode 100644 mods/ITEMS/REDSTONE/mcl_comparators/locale/template.txt create mode 100644 mods/ITEMS/REDSTONE/mcl_dispensers/locale/template.txt create mode 100644 mods/ITEMS/REDSTONE/mcl_droppers/locale/template.txt create mode 100644 mods/ITEMS/REDSTONE/mcl_observers/locale/template.txt create mode 100644 mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt create mode 100644 mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt create mode 100644 mods/ITEMS/REDSTONE/mesecons_delayer/locale/template.txt create mode 100644 mods/ITEMS/REDSTONE/mesecons_lightstone/locale/template.txt create mode 100644 mods/ITEMS/REDSTONE/mesecons_noteblock/locale/template.txt create mode 100644 mods/ITEMS/REDSTONE/mesecons_pistons/locale/template.txt create mode 100644 mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/template.txt create mode 100644 mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/template.txt create mode 100644 mods/ITEMS/REDSTONE/mesecons_torch/locale/template.txt create mode 100644 mods/ITEMS/REDSTONE/mesecons_walllever/locale/template.txt create mode 100644 mods/ITEMS/REDSTONE/mesecons_wires/locale/template.txt create mode 100644 mods/ITEMS/mcl_anvils/locale/template.txt create mode 100644 mods/ITEMS/mcl_banners/locale/template.txt create mode 100644 mods/ITEMS/mcl_beds/locale/template.txt create mode 100644 mods/ITEMS/mcl_books/locale/template.txt create mode 100644 mods/ITEMS/mcl_bows/locale/template.txt create mode 100644 mods/ITEMS/mcl_buckets/locale/template.txt create mode 100644 mods/ITEMS/mcl_cake/locale/template.txt create mode 100644 mods/ITEMS/mcl_cauldrons/locale/template.txt create mode 100644 mods/ITEMS/mcl_chests/locale/template.txt create mode 100644 mods/ITEMS/mcl_clock/locale/template.txt create mode 100644 mods/ITEMS/mcl_cocoas/locale/template.txt create mode 100644 mods/ITEMS/mcl_colorblocks/locale/template.txt create mode 100644 mods/ITEMS/mcl_compass/locale/template.txt create mode 100644 mods/ITEMS/mcl_crafting_table/locale/template.txt create mode 100644 mods/ITEMS/mcl_doors/locale/template.txt create mode 100644 mods/ITEMS/mcl_dye/locale/template.txt create mode 100644 mods/ITEMS/mcl_end/locale/template.txt create mode 100644 mods/ITEMS/mcl_farming/locale/template.txt create mode 100644 mods/ITEMS/mcl_fences/locale/template.txt create mode 100644 mods/ITEMS/mcl_fire/locale/template.txt create mode 100644 mods/ITEMS/mcl_fishing/locale/template.txt create mode 100644 mods/ITEMS/mcl_flowerpots/locale/template.txt create mode 100644 mods/ITEMS/mcl_flowers/locale/template.txt create mode 100644 mods/ITEMS/mcl_furnaces/locale/template.txt create mode 100644 mods/ITEMS/mcl_heads/locale/template.txt create mode 100644 mods/ITEMS/mcl_hoppers/locale/template.txt create mode 100644 mods/ITEMS/mcl_itemframes/locale/template.txt create mode 100644 mods/ITEMS/mcl_jukebox/locale/template.txt create mode 100644 mods/ITEMS/mcl_maps/locale/template.txt create mode 100644 mods/ITEMS/mcl_mobitems/locale/template.txt create mode 100644 mods/ITEMS/mcl_mobspawners/locale/template.txt create mode 100644 mods/ITEMS/mcl_monster_eggs/locale/template.txt create mode 100644 mods/ITEMS/mcl_mushrooms/locale/template.txt create mode 100644 mods/ITEMS/mcl_nether/locale/template.txt create mode 100644 mods/ITEMS/mcl_ocean/locale/template.txt create mode 100644 mods/ITEMS/mcl_portals/locale/template.txt create mode 100644 mods/ITEMS/mcl_potions/locale/template.txt create mode 100644 mods/ITEMS/mcl_signs/locale/template.txt create mode 100644 mods/ITEMS/mcl_sponges/locale/template.txt create mode 100644 mods/ITEMS/mcl_stairs/locale/template.txt create mode 100644 mods/ITEMS/mcl_throwing/locale/template.txt create mode 100644 mods/ITEMS/mcl_tnt/locale/template.txt create mode 100644 mods/ITEMS/mcl_tools/locale/template.txt create mode 100644 mods/ITEMS/mcl_torches/locale/template.txt create mode 100644 mods/ITEMS/mcl_totems/locale/template.txt create mode 100644 mods/ITEMS/mcl_walls/locale/template.txt create mode 100644 mods/ITEMS/mcl_wool/locale/template.txt create mode 100644 mods/ITEMS/mclx_core/locale/template.txt create mode 100644 mods/ITEMS/mclx_fences/locale/template.txt create mode 100644 mods/ITEMS/mclx_stairs/locale/template.txt create mode 100644 mods/ITEMS/minetest-3d_armor/3d_armor/locale/template.txt create mode 100644 mods/ITEMS/minetest-3d_armor/3d_armor_stand/locale/template.txt create mode 100644 mods/ITEMS/xpanes/locale/template.txt create mode 100644 mods/MISC/mcl_commands/locale/template.txt create mode 100644 mods/MISC/mcl_privs/locale/template.txt create mode 100644 mods/MISC/mcl_wip/locale/template.txt create mode 100644 mods/PLAYER/mcl_playerplus/locale/template.txt diff --git a/mods/ENTITIES/mcl_minecarts/locale/template.txt b/mods/ENTITIES/mcl_minecarts/locale/template.txt new file mode 100644 index 000000000..74bd547b3 --- /dev/null +++ b/mods/ENTITIES/mcl_minecarts/locale/template.txt @@ -0,0 +1,23 @@ +# textdomain: mcl_minecarts +Minecart= +Minecarts can be used for a quick transportion on rails.= +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.= +You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.= +To obtain the minecart, punch it while holding down the sneak key.= +Minecart with Chest= +Minecart with Furnace= +Minecart with Command Block= +Minecart with Hopper= +Minecart with 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.= +Rail= +Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.= +Powered Rail= +Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.= +Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.= +Activator Rail= +Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.= +To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.= +Detector Rail= +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.= +To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.= diff --git a/mods/ENVIRONMENT/lightning/locale/template.txt b/mods/ENVIRONMENT/lightning/locale/template.txt new file mode 100644 index 000000000..2c07393f6 --- /dev/null +++ b/mods/ENVIRONMENT/lightning/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: lightning +@1 was struck by lightning.= +Let lightning strike at the specified position or yourself= +No position specified and unknown player= diff --git a/mods/ENVIRONMENT/mcl_void_damage/locale/template.txt b/mods/ENVIRONMENT/mcl_void_damage/locale/template.txt new file mode 100644 index 000000000..db9050e2f --- /dev/null +++ b/mods/ENVIRONMENT/mcl_void_damage/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_void_damage +The void is off-limits to you!= +@1 fell into the endless void.= diff --git a/mods/HELP/mcl_doc/locale/template.txt b/mods/HELP/mcl_doc/locale/template.txt new file mode 100644 index 000000000..da297a3e2 --- /dev/null +++ b/mods/HELP/mcl_doc/locale/template.txt @@ -0,0 +1,54 @@ +# textdomain: mcl_doc +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 acts as a soil for all saplings.= +This block acts as a soil for some saplings.= +Sugar canes will grow on this block.= +Nether wart will grow on this block.= +This block quickly decays when there is no wood block of any species within a distance of @1. When decaying, it disappears and may drop one of its regular drops. The block does not decay when the block has been placed by a player.= +This block quickly decays and disappears when there is no wood block of any species within a distance of @1. The block does not decay when the block has been placed by a player.= +This plant can only grow on grass blocks and dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.= +This plant can grow on grass blocks, podzol, dirt and coarse dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.= +This block is flammable.= +This block destroys any item it touches.= +To eat it, wield it, then rightclick.= +You can eat this even when your hunger bar is full.= +You cannot eat this when your hunger bar is full.= +To drink it, wield it, then rightclick.= +You cannot drink this when your hunger bar is full.= +To consume it, wield it, then rightclick.= +You cannot consume this when your hunger bar is full.= +You have to wait for about 2 seconds before you can eat or drink again.= +Hunger points restored: @1= +Saturation points restored: @1%.1f= +This item can be repaired at an anvil with: @1.= +This item can be repaired at an anvil with any wooden planks.= +This item can be repaired at an anvil with any item in the “@1” group.= +This item cannot be renamed at an anvil.= +This block crushes any block it falls into.= +When this block falls deeper than 1 block, it causes damage to any player it hits. The damage dealt is B×2−2 hit points with B @= number of blocks fallen. The damage can never be more than 40 HP.= +Diamond Pickaxe= +Iron Pickaxe= +Stone Pickaxe= +Golden Pickaxe= +Wooden Pickaxe= +Diamond Axe= +Iron Axe= +Stone Axe= +Golden Axe= +Wooden Axe= +Diamond Shovel= +Iron Shovel= +Stone Shovel= +Golden Shovel= +Wooden Shovel= +This block can be mined by any tool instantly.= +This block can be mined by:= +Hardness: ∞= +Hardness: @1= +This block will not be destroyed by TNT explosions.= +This block drops itself when mined by shears.= +@1×@2= +This blocks drops the following when mined by shears: @1= +, = diff --git a/mods/HELP/mcl_doc_basics/locale/template.txt b/mods/HELP/mcl_doc_basics/locale/template.txt new file mode 100644 index 000000000..0fcc0f3b0 --- /dev/null +++ b/mods/HELP/mcl_doc_basics/locale/template.txt @@ -0,0 +1,465 @@ +# textdomain: mcl_doc_basics +Basics= +Everything you need to know about MineClone 2 to get started with playing= +Advanced usage= +Advanced information about Minetest which may be nice to know, but is not crucial to gameplay= +Quick start= +This is a very brief introduction to the basic gameplay:= +Basic controls:= +• Move mouse to look= +• [W], [A], [S] and [D] to move= +• [E] to sprint= +• [Space] to jump or move upwards= +• [Shift] to sneak or move downwards= +• Mouse wheel or [1]-[9] to select item= +• Left-click to mine blocks or attack= +• Recover from swings to deal full damage= +• Right-click to build blocks and use things= +• [I] for the inventory= +• Lowest row in inventory appears in hotbar below= +• [Esc] to close this window= +How to play:= +• 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 them in a 2×2 shape in the crafting grid to craft a crafting table= +• Place the crafting table on the ground= +• Rightclick it for a 3×3 crafting grid= +• Use the crafting guide (book icon) to learn all the possible crafting recipes= +• Craft a wooden pickaxe so you can dig stone= +• Different tools break different kinds of blocks. Try them out!= +• Read entries in this help to learn the rest= +• Continue playing as you wish. There's no goal. Have fun!= +Minetest= +Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).= +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 can, however, be much more complex than this.= +A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorative blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.= +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 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 as well as Minetest Game are both unfinished at the moment, so please forgive us when not everything works out perfectly.= +Sneaking= +Sneaking makes you walk slower and prevents you from falling off the edge of a block.= +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!= +• Sneak: [Shift]= +Sneaking only works when you stand on solid ground, are not in a liquid and don't climb.= +If you jump while holding the sneak key, you also jump slightly higher than usual.= +Sneaking might be disabled by mods. In this case, you still walk slower by sneaking, but you will no longer be stopped at ledges.= +Controls= +These are the default controls:= +Basic movement:= +• Moving the mouse around: Look around= +• W: Move forwards= +• A: Move to the left= +• D: Move to the right= +• S: Move backwards= +• E: Sprint= +While standing on solid ground:= +• Space: Jump= +• Shift: Sneak= +While on a ladder, swimming in a liquid or fly mode is active= +• Space: Move up= +• Shift: Move down= +Extended movement (requires privileges):= +• J: Toggle fast mode, makes you run or fly fast (requires “fast” privilege)= +• K: Toggle fly mode, makes you move freely in all directions (requires “fly” privilege)= +• H: Toggle noclip mode, makes you go through walls in fly mode (requires “noclip” privilege)= +• E: Move even faster when in fast mode= +World interaction:= +• Left mouse button: Punch / mine blocks / take items= +• Right mouse button: Build or use pointed block= +• Shift+Right mouse button: Build= +• Roll mouse wheel: Select next/previous item in hotbar= +• 1-9: Select item in hotbar directly= +• Q: Drop item stack= +• Shift+Q: Drop 1 item= +• I: Show/hide inventory menu= +Inventory interaction:= +See the entry “Basics > Inventory”.= +Camera:= +• Z: Zoom (requires “zoom” privilege)= +• F7: Toggle camera mode= +• F8: Toggle cinematic mode= +Interface:= +• Esc: Open menu window (pauses in single-player mode) or close window= +• F1: Show/hide HUD= +• F2: Show/hide chat= +• F9: Toggle minimap (only works if have a map)= +• Shift+F9: Toggle minimap rotation mode= +• F10: Open/close console/chat log= +• F12: Take a screenshot= +Server interaction:= +• T: Open chat window (chat requires the “shout” privilege)= +• /: Start issuing a server command)= +Technical:= +• R: Toggle far view (disables all fog and allows viewing far away, can make game very slow)= +• +: Increase minimal viewing distance= +• -: Decrease minimal viewing distance= +• F3: Enable/disable fog= +• F5: Enable/disable debug screen which also shows your coordinates= +• F6: Only useful for developers. Enables/disables profiler= +• P: Only useful for developers. Writes current stack traces= +Players= +Players (actually: “player characters”) are the characters which users control.= +Players are living beings which occupy a space of about 1×2×1 cubes. They start with 20 health points (HP) and 10 breath points (BP).= +Players are capable of walking, sneaking, jumping, climbing, swimming, diving, mining, building, fighting and using tools and blocks.= +At a health of 0, the player dies and loses all items in the inventory. The player can just respawn in the world.= +Some blocks reduce breath. While being with the head in a block which causes drowning, the breath points are reduced by 1 for every 2 seconds. When all breath is gone, the player starts to suffer drowning damage. Breath is quickly restored in any other block.= +Damage can be disabled on any world. Without damage, players are immortal and health and breath are unimportant.= +In multi-player mode, the name of other players is written above their head.= +Items= +Items are things you can carry along and store in inventories. They can be used for crafting, smelting, building, mining, and more. Types of items include blocks, tools, weapons and items only used for crafting.= +An item stack is a collection of items of the same type which fits into a single item slot. Item stacks can be dropped on the ground. Items which drop into the same coordinates will form an item stack.= +Dropped item stacks will be collected automatically when you stand close to them.= +Tools= +Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.= +Mining tools are important to break all kinds of blocks. Weapons are another kind of tool. There are some other more specialized tools. Special actions of tools are usually done by right-click.= +When nothing is wielded, players use their hand which may act as tool and weapon. The hand is capable of punching and deals minimum damage.= +Many tools will wear off when using them and may eventually get destroyed. The damage is displayed in a damage bar below the tool icon. If no damage bar is shown, the tool is in mint condition. Tools may be repairable by crafting, see “Basics > Crafting”.= +Weapons= +Some items are usable as a melee weapon when wielded. Weapons share most of the properties of tools.= +Melee weapons deal damage by punching players and other animate objects. There are two ways to attack:= +• Single punch: Left-click once to deal a single punch= +• Quick punching: Hold down the left mouse button to deal quick repeated punches= +There are two core attributes of melee weapons:= +• Maximum damage: Damage which is dealt after a hit when the weapon was fully recovered)= +• Full punch interval: Time it takes for fully recovering from a punch= +A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.= +There is a rule which sometimes makes attacks impossible: Players, animate objects and weapons belong to damage groups. A weapon only deals damage to those who share at least one damage group with it. So if you're using the wrong weapon, you might not deal any damage at all.= +Pointing= +“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, dropped items, players, computer enemies and objects.= +To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.= +A few things can not be pointed. Most blocks are pointable. A few blocks, like air, can never be pointed. Other blocks, like liquids can only be pointed by special items.= +Camera= +You can change the camera mode by pressing [F7].= +There is also Cinematic Mode which can be toggled with [F8]. With Cinematic Mode enabled, the camera movements become more smooth. Some players don't like it, it is a matter of taste.= +By holding down [Z], you can zoom the view at your crosshair. You need the “zoom” privilege to do this.= +• Switch camera mode: [F7]= +• Toggle Cinematic Mode: [F8]= +• Zoom: [Z]= +Blocks= +The world of MineClone 2 is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.= +Blocks can have a wide range of different properties which determine mining times, behavior, looks, shape, and much more. Their properties include:= +• Collidable: Collidable blocks can not be passed through; players can walk on them. Non-collidable blocks can be passed through freely= +• Pointable: Pointable blocks show a wireframe or a halo box when pointed. But you will just point through non-pointable blocks. Liquids are usually non-pointable but they can be pointed at by some special tools= +• Mining properties: By which tools it can be mined, how fast and how much it wears off tools= +• Climbable: While you are at a climbable block, you won't fall and you can move up and down with the jump and sneak keys= +• Drowning damage: See the entry “Basics > Player”= +• Liquids: See the entry “Basics > Liquids”= +• Group memberships: Group memberships are used to determine mining properties, crafting, interactions between blocks and more= +Mining= +Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.= +Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in hardness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining will drop on the ground, ready to be collected.= +After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:= +• Always drops itself (the usual case)= +• Always drops the same items= +• Drops items based on probability= +• Drops nothing= +Building= +Almost all blocks can be built (or placed). Building is very simple and has no delay.= +To build your wielded block, point at a block in the world and right-click. If this is not possible because the pointed block has a special right-click action, hold down the sneak key before right-clicking.= +Blocks can almost always be built at pointable blocks. One exception are blocks attached to the floor; these can only be built on the floor.= +Normally, blocks are built in front of the pointed side of the pointed block. A few blocks are different: When you try to build at them, they are replaced.= +Liquids= +Liquids are special dynamic blocks. Liquids like to spread and flow to their surrounding blocks. Players can swim and drown in them.= +Liquids usually come in two forms: In source form (S) and in flowing form (F).= +Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. A long it is left alone, a liquid source will normally keep its place and does not drain out.= +Flowing liquids take a sloped form. Flowing liquids spread around the world until they drain. A flowing liquid can not sustain itself and always comes from a liquid source, either directly or indirectly. Without a liquid source, a flowing liquid will eventually drain out and disappear.= +All liquids share the following properties:= +• All properties of blocks (including drowning damage= +• Renewability: Renewable liquids can create new sources= +• Flowing range: How many flowing liquids are created at maximum per liquid source, it determines how far the liquid will spread. Possible are ranges from 0 to 8. At 0, no flowing liquids will be created. Image 5 shows a liquid of flowing range 2= +• Viscosity: How slow players move through it and how slow the liquid spreads= +When those criteria are met, the open space is filled with a new liquid source of the same type (image 3).= +Swimming in a liquid is fairly straightforward: The usual direction keys for basic movement, the jump key for rising and the sneak key for sinking.= +The physics for swimming and diving in a liquid are:= +• The higher the viscosity, the slower you move= +• If you rest, you'll slowly sink= +• There is no fall damage for falling into a liquid as such= +• If you fall into a liquid, you will be slowed down on impact (but don't stop instantly). Your impact depth is determined by your speed and the liquid viscosity. For a safe high drop into a liquid, make sure there is enough liquid above the ground, otherwise you might hit the ground and take fall damage= +Liquids are often not pointable. But some special items are able to point all liquids.= +Crafting= +Crafting is the task of combining several items to form a new item.= +To craft something, you need one or more items, a crafting grid (C) and a crafting recipe. A crafting grid is like a normal inventory which can also be used for crafting. Items need to be put in a certain pattern into the crafting grid. Next to the crafting grid is an output slot (O). Here the result will appear when you placed items correctly. This is just a preview, not the actual item. Crafting grids can come in different sizes which limits the possible recipes you can craft.= +To complete the craft, take the result item from the output slot, which will consume items from the crafting grid and creates a new item. It is not possible to place items into the output slot.= +A description on how to craft an item is called a “crafting recipe”. These crafting recipes can be found in the crafting guide which you can access from the inventory menu.= +Crafting recipes consist of at least one input item and exactly one stack of output items. When performing a single craft, it will consume exactly one item from each stack of the crafting grid, unless the crafting recipe defines replacements.= +In some crafting recipes, some input items do not need to be a concrete item, instead they need to be a member of a group (see “Basics > Groups”). These recipes offer a bit more freedom in the input items. Images 6-8 show the same group-based recipe. Here, 8 items of the “stone” group are required, which is true for all of the shown items.= +Rarely, crafting recipes have replacements. This means, whenever you perform a craft, some items in the crafting grid will not be consumed, but instead will be replaced by another item.= +Cooking= +Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a furnace, an cookable item, a fuel item and time in order to yield a new item.= +Each fuel item has a burning time. This is the time a single item of the fuel keeps a furnace burning.= +Each cookable item requires time to be cooked. This time is specific to the item type and the item must be “on fire” for the whole cooking time to actually yield the result.= +Hotbar= +At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the lowest row of items in the player inventory.= +You can change the selected item with the mouse wheel or the number keys.= +• Select previous item in hotbar: [Mouse wheel up]= +• Select next item in hotbar: [Mouse wheel down]= +• Select item in hotbar directly: [0]-[9]= +The selected item is also your wielded item.= +Minimap= +If you have a map item in any of your hotbar slots, you can use the minimap.= +Press [F9] to make a minimap appear on the top right. The minimap helps you to find your way around the world. Press it again to select different minimap modes and zoom levels. The minimap also shows the positions of other players.= +There are 2 minimap modes and 3 zoom levels.= +Surface mode (image 1) is a top-down view of the world, roughly resembling the colors of the blocks this world is made of. It only shows the topmost blocks, everything below is hidden, like a satellite photo. Surface mode is useful if you got lost.= +Radar mode (image 2) is more complicated. It displays the “denseness” of the area around you and changes with your height. Roughly, the more green an area is, the less “dense” it is. Black areas have many blocks. Use the radar to find caverns, hidden areas, walls and more. The rectangular shapes in image 2 clearly expose the position of a dungeon. Radar mode is only available in Creative Mode= +There are also two different rotation modes. In “square mode”, the rotation of the minimap is fixed. If you press [Shift]+[F9] to switch to “circle mode”, the minimap will instead rotate with your looking direction, so “up” is always your looking direction.= +In other games, the minimap may be disabled.= +• Toggle minimap mode: [F9]= +• Toggle minimap rotation mode: [Shift]+[F9]= +Inventories are used to store item stacks. There are other uses, such as crafting. An inventory consists of a rectangular grid of item slots. Each item slot can either be empty or hold one item stack. Item stacks can be moved freely between most slots.= +You have your own inventory which is called your “player inventory”, you can open it with the inventory key (default: [I]). The first inventory slots are also used as slots in your hotbar.= +Blocks can also have their own inventory, e.g. chests and furnaces.= +Inventory controls:= +Taking: You can take items from an occupied slot if the cursor holds nothing.= +• Left click: take entire item stack= +• Right click: take half from the item stack (rounded up)= +• Middle click: take 10 items from the item stack= +Putting: You can put items onto a slot if the cursor holds 1 or more items and the slot is either empty or contains an item stack of the same item type.= +• Left click: put entire item stack= +• Right click: put 1 item of the item stack= +• Middle click: put 10 items of the item stack= +Exchanging: You can exchange items if the cursor holds 1 or more items and the destination slot is occupied by a different item type.= +• Click: exchange item stacks= +Throwing away: If you hold an item stack and click with it somewhere outside the menu, the item stack gets thrown away into the environment.= +Quick transfer: You can quickly transfer an item stack to/from the player inventory to/from another item's inventory slot like a furnace, chest, or any other item with an inventory slot when that item's inventory is accessed. The target inventory is generally the most relevant inventory in this context.= +• Sneak+Left click: Automatically transfer item stack= +Online help= +You may want to check out these online resources related to MineClone 2.= +MineClone 2 download and forum discussion: = +Here you find the most recent version of MineClone 2 and can discuss it.= +Bug tracker: = +Report bugs here.= +Minetest links:= +Official homepage of Minetest: = +The main place to find the most recent version of Minetest, the engine used by MineClone 2.= +Community wiki: = +A community-based documentation website for Minetest. Anyone with an account can edit it.= +Minetest forums: = +A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and games are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.= +Chat: = +A generic Internet Relay Chat channel for everything related to Minetest where people can meet to discuss in real-time. If you do not understand IRC, see the Community Wiki for help.= +Groups= +Items, players and objects (animate and inanimate) can be members of any number of groups. Groups serve multiple purposes:= +• Crafting recipes: Slots in a crafting recipe may not require a specific item, but instead an item which is a member of a particular group, or multiple groups= +• Digging times: Diggable blocks belong to groups which are used to determine digging times. Mining tools are capable of digging blocks belonging to certain groups= +• Block behavior: Blocks may show a special behaviour and interact with other blocks when they belong to a particular group= +• Damage and armor: Objects and players have armor groups, weapons have damage groups. These groups determine damage. See also: “Basics > Weapons”= +• Other uses= +In the item help, many important groups are usually mentioned and explained.= +Glossary= +This is a list of commonly used terms:= +Controls:= +• Wielding: Holding an item in hand= +• Pointing: Looking with the crosshair at something in range= +• Dropping: Throwing an item or item stack to the ground= +• Punching: Attacking with left-click, is also used on blocks= +• Sneaking: Walking slowly while (usually) avoiding to fall over edges= +• Climbing: Moving up or down a climbable block= +Blocks:= +• Block: Cubes that the worlds are made of= +• Mining/digging: Using a mining tool to break a block= +• Building/placing: Putting a block somewhere= +• Drop: Items you get after mining a block= +• Using a block: Right-clicking a block to access its special function= +Items:= +• Item: A single thing that players can possess= +• Item stack: A collection of items of the same kind= +• Maximum stack size: Maximum amount of items in an item stack= +• Slot / inventory slot: Can hold one item stack= +• Inventory: Provides several inventory slots for storage= +• Player inventory: The main inventory of a player= +• Tool: An item which you can use to do special things with when wielding= +• Range: How far away things can be to be pointed by an item= +• Mining tool: A tool which allows to break blocks= +• Craftitem: An item which is (primarily or only) used for crafting= +Gameplay:= +• “heart”: A single health symbol, indicates 2 HP= +• “bubble”: A single breath symbol, indicates 1 BP= +• HP: Hit point (equals a half “heart”)= +• BP: Breath point, indicates breath when diving= +• Mob: Computer-controlled enemy= +• Crafting: Combining multiple items to create new ones= +• Crafting guide: A helper which shows available crafting recipes= +• Spawning: Appearing in the world= +• Respawning: Appearing again in the world after death= +• Group: Puts similar things together, often affects gameplay= +• noclip: Allows to fly through walls= +Interface= +• Hotbar: Inventory slots at the bottom= +• Statbar: Indicator made out of half-symbols, used for health and breath= +• Minimap: The map or radar at the top right= +• Crosshair: Seen in the middle, used to point at things= +Online multiplayer:= +• PvP: Player vs Player. If active, players can deal damage to each other= +• Griefing: Destroying the buildings of other players against their will= +• Protection: Mechanism to own areas of the world, which only allows the owners to modify blocks inside= +Technical terms:= +• Minetest: This game engine= +• MineClone 2: What you play right now= +• Minetest Game: A game for Minetest by the Minetest developers= +• Game: A complete playing experience to be used in Minetest; such as a game or sandbox or similar= +• Mod: A single subsystem which adds or modifies functionality; is the basic building block of games and can be used to further enhance or modify them= +• Privilege: Allows a player to do something= +• Node: Other word for “block”= +Settings= +There is a large variety of settings to configure Minetest. Pretty much every aspect can be changed that way.= +These are a few of the most important gameplay settings:= +• Damage enabled (enable_damage): Enables the health and breath attributes for all players. If disabled, players are immortal= +• Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. Changes include: Instant digging, easy access to almost all items, tools never wear off, etc.= +• PvP (enable_pvp): Short for “Player vs Player”. If enabled, players can deal damage to each other= +For a full list of all available settings, use the “Advanced settings” dialog in the main menu.= +Movement modes= +If you have the required privileges, you can use up to three special movement modes. Using these may be considered cheating.= +Fast mode:= +• Description: Allows you to move much faster. Hold down the the “Use” key [E] to move faster. In the client configuration, you can further customize fast mode.= +• Default key: [J]= +• Required privilege: fast= +Fly mode:= +• Description: Gravity doesn't affect you and you can move freely in all directions. Use the jump key to rise and the sneak key to sink.= +• Default key: [K]= +• Required privilege: fly= +Noclip mode:= +• Description: Allows you to move through walls. Only works when fly mode is enabled, too.= +• Default key: [H]= +• Required privilege: noclip= +Console= +With [F10] you can open and close the console. The main use of the console is to show the chat log and enter chat messages or server commands.= +Using the chat or server command key also opens the console, but it is smaller and will be closed after you sent a message.= +Use the chat to communicate with other players. This requires you to have the “shout” privilege.= +Just type in the message and hit [Enter]. Public chat messages can not begin with “/”.= +You can send private messages: Say “/msg ” in chat to send “” which can only be seen by .= +There are some special controls for the console:= +• [F10] Open/close console= +• [Enter]: Send message or command= +• [Tab]: Try to auto-complete a partially-entered player name= +• [Ctrl]+[Left]: Move cursor to the beginning of the previous word= +• [Ctrl]+[Right]: Move cursor to the beginning of the next word= +• [Ctrl]+[Backspace]: Delete previous word= +• [Ctrl]+[Delete]: Delete next word= +• [Ctrl]+[U]: Delete all text before the cursor= +• [Ctrl]+[K]: Delete all text after the cursor= +• [Page up]: Scroll up= +• [Page down]: Scroll down= +There is also an input history. Minetest saves your previous console inputs which you can quickly access later:= +• [Up]: Go to previous entry in history= +• [Down]: Go to next entry in history= +Server commands= +Server commands (also called “chat commands”) are little helpers for advanced users. You don't need to use these commands when playing. But they might come in handy to perform some more technical tasks. Server commands work both in multi-player and single-player mode.= +Server commands can be entered by players using the chat to perform a special server action. There are a few commands which can be issued by everyone, but some commands only work if you have certain privileges granted on the server. There is a small set of basic commands which are always available, other commands can be added by mods.= +To issue a command, simply type it like a chat message or press Minetest's command key (default: [/]). All commands have to begin with “/”, for example “/mods”. The Minetest command key does the same as the chat key, except that the slash is already entered.= +Commands may or may not give a response in the chat log, but errors will generally be shown in the chat. Try it for yourselves: Close this window and type in the “/mods” command. This will give you the list of available mods on this server.= +“/help all” is a very important command: You get a list of all available commands on the server, a short explanation and the allowed parameters. This command is also important because the available commands often differ per server.= +Commands are followed by zero or more parameters.= +In the command reference, you see some placeholders which you need to replace with an actual value. Here's an explanation:= +• Text in greater-than and lower-than signs (e.g. “”): Placeholder for a parameter= +• Anything in square brackets (e.g. “[text]”) is optional and can be omitted= +• Pipe or slash (e.g. “text1 | text2 | text3”): Alternation. One of multiple texts must be used (e.g. “text2”)= +• Parenthesis: (e.g. “(word1 word2) | word3”): Groups multiple words together, used for alternations= +• Everything else is to be read as literal text= +Here are some examples to illustrate the command syntax:= +• /mods: No parameters. Just enter “/mods”= +• /me : 1 parameter. You have to enter “/me ” followed by any text, e.g. “/me orders pizza”= +• /give : Two parameters. Example: “/give Player default:apple”= +• /help [all|privs|]: Valid inputs are “/help”, “/help all”, “/help privs”, or “/help ” followed by a command name, like “/help time”= +• /spawnentity [,,]: Valid inputs include “/spawnentity boats:boat” and “/spawnentity boats:boat 0,0,0”= +Some final remarks:= +• For /give and /giveme, you need an itemstring. This is an internally used unique item identifier which you may find in the item help if you have the “give” or “debug” privilege= +• For /spawnentity you need an entity name, which is another identifier= +Privileges= +Each player has a set of privileges, which differs from server to server. Your privileges determine what you can and can't do. Privileges can be granted and revoked from other players by any player who has the privilege called “privs”.= +On a multiplayer server with the default configuration, new players start with the privileges called “interact” and “shout”. The “interact” privilege is required for the most basic gameplay actions such as building, mining, using, etc. The “shout” privilege allows to chat.= +There is a small set of core privileges which you'll find on every server, other privileges might be added by mods.= +To view your own privileges, issue the server command “/privs”.= +Here are a few basic privilege-related commands:= +• /privs: Lists your privileges= +• /privs : Lists the privileges of = +• /help privs: Shows a list and description about all privileges= +Players with the “privs” privilege can modify privileges at will:= +• /grant : Grant to = +• /revoke : Revoke from = +In single-player mode, you can use “/grant singleplayer all” to unlock all abilities (which is often considered cheating).= +Light= +As the world is entirely block-based, so is the light in the world. Each block has its own brightness. The brightness of a block is expressed in a “light level” which ranges from 0 (total darkness) to 15 (as bright as the sun).= +There are two types of light: Sunlight and artificial light.= +Artificial light is emitted by luminous blocks. Artificial light has a light level from 1-14.= +Sunlight is the brightest light and always goes perfectly straight down from the sky at each time of the day. blocks. At night, the sunlight will become moonlight instead, which still provides a small amount of light. The light level of sunlight is 15.= +Blocks have 3 levels of transparency:= +• Transparent: Sunlight goes through limitless, artificial light goes through with losses= +• Semi-transparent: Sunlight and artificial light go through with losses= +• Opaque: No light passes through= +Artificial light will lose one level of brightness for each transparent or semi-transparent block it passes through, until only darkness remains (image 1).= +Sunlight will preserve its brightness as long it only passes fully transparent blocks. When it passes through a semi-transparent block, it turns to artificial light. Image 2 shows the difference.= +Note that “transparency” here only means that the block is able to carry brightness from its neighboring blocks. It is possible for a block to be transparent to light but you can't see trough the other side.= +Coordinates= +The 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.= +Like this: (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.= +The values for X, Y and Z work like this:= +• If you go up, Y increases= +• If you go down, Y decreases= +• If you follow the sun, X increases= +• If you go to the reverse direction, X decreases= +• Follow the sun, then go right: Z increases= +• Follow the sun, then go left: Z decreases= +• The side length of a full cube is 1= +You can view your current position in the debug screen (open with [F5]). This is considered cheating in some games.= +Creative Mode= +Enabling Creative Mode in MineClone 2 applies the following changes:= +• You keep the things you've placed= +• Creative inventory is available to obtain most items easily= +• Hand breaks all default blocks instantly= +• Greatly increased hand pointing range= +• Mined blocks don't drop items= +• Items don't get used up= +• Tools don't wear off= +• You can eat food whenever you want= +• You can always use the minimap (including radar mode)= +Damage is not affected by Creative Mode, it needs to be disabled seperately.= +Mobs= +Mobs are the living beings in the world. This includes animals and monsters.= +Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some blocks only spawn on particular blocks (like grass blocks).= +Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.= +Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.= +Animals= +Animals are peaceful beings which roam the world aimlessly. You can feed, tame and breed them.= +Feeding:= +Each animal has its own taste for food and doesn't just accept any food. To feed, hold an item in your hand and rightclick the animal.= +Animals are attraced to the food they like and follow you as long you hold the food item in hand.= +Feeding an animal has three uses: Taming, healing and breeding.= +Feeding heals animals instantly, depending on the quality of the food item.= +Taming:= +A few animals can be tamed. You can generally do more things with tamed animals and use other items on them. For example, tame horses can be saddled and tame wolves fight on your side.= +Breeding:= +When you have fed an animal up to its maximum health, then feed it again, you will activate “Love Mode” and many hearts appear around the animal.= +Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.= +Baby animals:= +Baby animals are just like their adult couterparts, but they can't be fed, tamed or bred and don't drop anything when they die. They grow to adults after a short time.= +Hunger= +Hunger affects your health and your ability to sprint. Hunger is not in effect when damage is disabled.= +Core hunger rules:= +• You start with 20/20 hunger points (more points @= less hungry)= +• Actions like combat, jumping, sprinting, etc. decrease hunger points= +• Food restores hunger points= +• If your hunger bar decreases, you're hungry= +• At 18-20 hunger points, you regenerate 1 HP every 4 seconds= +• At 6 hunger points or less, you can't sprint= +• At 0 hunger points, you lose 1 HP every 4 seconds (down to 1 HP)= +• Poisonous food decreases your health= +Details:= +You have 0-20 hunger points, indicated by 20 drumstick half-icons above the hotbar. You also have an invisible attribute: Saturation.= +Hunger points reflect how full you are while saturation points reflect how long it takes until you're hungry again.= +Each food item increases both your hunger level as well your saturation.= +Food with a high saturation boost has the advantage that it will take longer until you get hungry again.= +A few food items might induce food poisoning by chance. When you're poisoned, the health and hunger symbols turn sickly green. Food poisoning drains your health by 1 HP per second, down to 1 HP. Food poisoning also drains your saturation. Food poisoning goes away after a while or when you drink milk.= +You start with 5 saturation points. The maximum saturation is equal to your current hunger level. So with 20 hunger points your maximum saturation is 20. What this means is that food items which restore many saturation points are more effective the more hunger points you have. This is because at low hunger levels, a lot of the saturation boost will be lost due to the low saturation cap.= +If your saturation reaches 0, you're hungry and start to lose hunger points. Whenever you see the hunger bar decrease, it is a good time to eat.= +Saturation decreases by doing things which exhaust you (highest exhaustion first):= +• Regenerating 1 HP= +• Suffering food poisoning= +• Sprint-jumping= +• Sprinting= +• Attacking= +• Taking damage= +• Swimming= +• Jumping= +• Mining a block= +Other actions, like walking, do not exaust you.= diff --git a/mods/HUD/mcl_death_messages/locale/template.txt b/mods/HUD/mcl_death_messages/locale/template.txt new file mode 100644 index 000000000..654b4c66e --- /dev/null +++ b/mods/HUD/mcl_death_messages/locale/template.txt @@ -0,0 +1,53 @@ +# textdomain: mcl_death_messages +%s was fatally hit by an arrow.= +%s has been killed with an arrow.= +%s was shot by an arrow from %s.= +%s forgot to breathe.= +%s drowned.= +%s ran out of oxygen.= +%s was killed by %s.= +%s was killed by a mob.= +%s was burned to death by a blaze's fireball.= +%s was killed by a fireball from a blaze.= +%s was burned by a fire charge.= +A ghast scared %s to death.= +%s has been fireballed by a ghast.= +%s fell from a high cliff.= +%s took fatal fall damage.= +%s fell victim to gravity.= +%s died.= +%s was killed by a zombie.= +%s was killed by a baby zombie.= +%s was killed by a blaze.= +%s was killed by a slime.= +%s was killed by a witch.= +%s was killed by a magma cube.= +%s was killed by a wolf.= +%s was killed by a cat.= +%s was killed by an ocelot.= +%s was killed by an ender dragon.= +%s was killed by a wither.= +%s was killed by an enderman.= +%s was killed by an endermite.= +%s was killed by a ghast.= +%s was killed by an elder guardian.= +%s was killed by a guardian.= +%s was killed by an iron golem.= +%s was killed by a polar_bear.= +%s was killed by a killer bunny.= +%s was killed by a shulker.= +%s was killed by a silverfish.= +%s was killed by a skeleton.= +%s was killed by a stray.= +%s was killed by a slime.= +%s was killed by a spider.= +%s was killed by a cave spider.= +%s was killed by a vex.= +%s was killed by an evoker.= +%s was killed by an illusioner.= +%s was killed by a vindicator.= +%s was killed by a zombie villager.= +%s was killed by a husk.= +%s was killed by a baby husk.= +%s was killed by a zombie pigman.= +%s was killed by a baby zombie pigman.= diff --git a/mods/HUD/mcl_inventory/locale/template.txt b/mods/HUD/mcl_inventory/locale/template.txt new file mode 100644 index 000000000..ed721afb5 --- /dev/null +++ b/mods/HUD/mcl_inventory/locale/template.txt @@ -0,0 +1 @@ +# textdomain: mcl_inventory diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/locale/template.txt b/mods/ITEMS/REDSTONE/mcl_comparators/locale/template.txt new file mode 100644 index 000000000..7934a4cb8 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_comparators/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: mcl_comparators +Redstone comparators are multi-purpose redstone components.= +They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.= +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.= +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.= +The side inputs are only powered by normal redstone power. The redstone can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by a rightclick.= +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.= +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.= +Redstone Comparator= diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/template.txt b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/template.txt new file mode 100644 index 000000000..a7a7fb0e0 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/template.txt @@ -0,0 +1,7 @@ +# textdomain: mcl_dispensers +Dispenser= +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.= +Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Rightclick the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a single random item.= +The dispenser will do different things, depending on the dispensed item:= +Downwards-Facing Dispenser= +Upwards-Facing Dispenser= diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/locale/template.txt b/mods/ITEMS/REDSTONE/mcl_droppers/locale/template.txt new file mode 100644 index 000000000..312e96cb3 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_droppers/locale/template.txt @@ -0,0 +1,6 @@ +# textdomain: mcl_droppers +Dropper= +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.= +Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Rightclick the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.= +Downwards-Facing Dropper= +Upwards-Facing Dropper= diff --git a/mods/ITEMS/REDSTONE/mcl_observers/locale/template.txt b/mods/ITEMS/REDSTONE/mcl_observers/locale/template.txt new file mode 100644 index 000000000..6f8259f8c --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_observers/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mcl_observers +Observer= +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.= +Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow shows you the side of the output, which is at the opposite side of the “face”. The arrow points to it. You need to place your redstone wire or any other component you want to power here.= diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt new file mode 100644 index 000000000..e69de29bb diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt new file mode 100644 index 000000000..27b496b66 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt @@ -0,0 +1,14 @@ +# textdomain: mesecons_commandblock +Command Block= +Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power.= +To use an already existing command block, just supply it with redstone power and see what happens. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.= +To place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Rightclick the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how they work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.= +All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.= +Command blocks support placeholders, insert one of these placerholders and they will be replaced by a player name:= +• “@c”: commander of this command block= +• “@n” or “@p”: nearest player from the command block= +• “@f” farthest player from the command block= +• “@r”: random player currently in the world= +• “@@”: literal “@” sign= +Example 1:@n time 12000@nSets the game clock to 12:00= +Example 2:@n give @n mcl_core:apple 5@n→ Gives the nearest player 5 apples= diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/template.txt new file mode 100644 index 000000000..daad51adf --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/template.txt @@ -0,0 +1,8 @@ +# 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.= +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, rightclick 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.= +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.= +Redstone Repeater= +Redstone Repeater (Powered)= +Redstone Repeater (Locked)= +Redstone Repeater (Locked, Powered)= diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/template.txt new file mode 100644 index 000000000..e69de29bb diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/template.txt new file mode 100644 index 000000000..ea26974b9 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/template.txt @@ -0,0 +1,10 @@ +# textdomain: mesecons_noteblock +Note Block= +A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power.= +Rightclick the note block to choose the next musical note (there are 24 half notes, or 2 octaves). The intrument played depends on the material of the block below the note block:= +• Glass: Sticks= +• Wood: Bass guitar= +• Stone: Bass drum= +• Sand or gravel: Snare drum= +• Anything else: Piano= +The note block will only play a note when it is below air, otherwise, it stays silent.= diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/template.txt new file mode 100644 index 000000000..93a4de14d --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/template.txt @@ -0,0 +1,6 @@ +# textdomain: mesecons_pistons +This block can have one of 6 possible orientations. On placement, the pusher will face you.= +Piston= +A piston is a redstone component with a pusher which pushes the block or blocks in front of it when it is supplied with redstone power. Not all blocks can be pushed, however.= +Sticky Piston= +A sticky piston is a redstone component with a sticky pusher which can be extended and retracted. It extends when it is supplied with redstone power. When the pusher extends, it pushes the block or blocks in front of it. When it retracts, it pulls back the single block in front of it. Note that not all blocks can be pushed or pulled.= diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/template.txt new file mode 100644 index 000000000..0927706c1 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/template.txt @@ -0,0 +1,11 @@ +# 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.= +Oak Pressure Plate= +Acacia Pressure Plate= +Birch Pressure Plate= +Dark Oak Pressure Plate= +Spruce Pressure Plate= +Jungle Pressure Plate= +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.= +Stone Pressure Plate= +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.= diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/template.txt new file mode 100644 index 000000000..15de4f822 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mesecons_solarpanel +Daylight Sensor= +Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.= +Inverted Daylight Sensor= +An inverted daylight sensor is a variant of the daylight sensor. It is a redstone component which provides redstone power when it in moonlight and no power otherwise. It can turned back into an ordinary daylight sensor.= diff --git a/mods/ITEMS/REDSTONE/mesecons_torch/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_torch/locale/template.txt new file mode 100644 index 000000000..b3e5b7be0 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_torch/locale/template.txt @@ -0,0 +1,10 @@ +# textdomain: mesecons_torch +Redstone Torch= +A redstone torch is a redstone component which can be used to invert a redstone signal. It supplies its surrounding blocks with redstone power, except for the block it is attached to. A redstone torch is normally lit, but it can also be turned off by powering the block it is attached to. While unlit, a redstone torch does not power anything.= +Redstone torches can generally be placed at the side and on the top of full solid opaque blocks. The following exceptions apply:= +• Glass, fence, wall, hopper: Can only be placed on top= +• Upside-down slab/stair: Can only be placed on top= +• Soul sand, mob spawner: Placement possible= +• Glowstone and pistons: No placement possible= +Block of Redstone= +A block of redstone permanently supplies redstone power to its surrounding blocks.= diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/template.txt new file mode 100644 index 000000000..afdabf1bf --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mesecons_wallever +Lever= +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.= +Lever= diff --git a/mods/ITEMS/REDSTONE/mesecons_wires/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_wires/locale/template.txt new file mode 100644 index 000000000..632a3eefc --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_wires/locale/template.txt @@ -0,0 +1,10 @@ +# textdomain: mesecons_wires +Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on the ground as a trail.= +A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components.= +Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.= +Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills. An easy way to power a redstone trail is by placing a redstone torch.= +Read the help entries on the other redstone components to learn how redstone components interact.= +Redstone= +Powered Redstone Spot (@1)= +Redstone Trail (@1)= +Powered Redstone Trail (@1)= diff --git a/mods/ITEMS/mcl_anvils/locale/template.txt b/mods/ITEMS/mcl_anvils/locale/template.txt new file mode 100644 index 000000000..268f3480b --- /dev/null +++ b/mods/ITEMS/mcl_anvils/locale/template.txt @@ -0,0 +1,13 @@ +# textdomain: mcl_anvils +Set Name= +Anvil= +The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!= +To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.= +To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.= +There are two possibilities to repair tools (and armor):= +• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.= +• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.= +Armor counts as a tool. It is possible to repair and rename a tool in a single step.= +The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.= +Slightly Damaged Anvil= +Very Damaged Anvil= diff --git a/mods/ITEMS/mcl_banners/locale/template.txt b/mods/ITEMS/mcl_banners/locale/template.txt new file mode 100644 index 000000000..868ae20b8 --- /dev/null +++ b/mods/ITEMS/mcl_banners/locale/template.txt @@ -0,0 +1,60 @@ +# textdomain: mcl_banners +White Banner= +Grey Banner= +Light Grey Banner= +Black Banner= +Red Banner= +Yellow Banner= +Green Banner= +Cyan Banner= +Blue Banner= +Magenta Banner= +Orange Banner= +Purple Banner= +Brown Banner= +Pink Banner= +Lime Banner= +Light Blue Banner= +Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.= +Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible.= +You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.= +%s Bordure= +%s Bricks= +%s Roundel= +%s Creeper Charge= +%s Saltire= +%s Bordure Indented= +%s Per Bend Inverted= +%s Per Bend Sinister Inverted= +%s Per Bend= +%s Per Bend Sinister= +%s Flower Charge= +%s Gradient= +%s Base Gradient= +%s Per Fess Inverted= +%s Per Fess= +%s Per Pale= +%s Per Pale Inverted= +%s Thing Charge= +%s Lozenge= +%s Skull Charge= +%s Paly= +%s Base Dexter Canton= +%s Base Sinister Canton= +%s Chief Dexter Canton= +%s Chief Sinister Canton= +%s Cross= +%s Base= +%s Pale= +%s Bend Sinister= +%s Bend= +%s Pale Dexter= +%s Fess= +%s Pale Sinister= +%s Chief= +%s Chevron= +%s Chevron Inverted= +%s Base Indented= +%s Chief Indented= +And one addional layer= +And %d addional layers= diff --git a/mods/ITEMS/mcl_beds/locale/template.txt b/mods/ITEMS/mcl_beds/locale/template.txt new file mode 100644 index 000000000..191489e39 --- /dev/null +++ b/mods/ITEMS/mcl_beds/locale/template.txt @@ -0,0 +1,32 @@ +# textdomain: mcl_beds +Beds allow you to sleep at night and make the time pass faster.= +To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.= +In local folklore, legends are told of other worlds where setting the start point for your next life would be possible. But this world is not one of them.= +By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.= +In this strange world, going to bed won't skip the night, but you can skip thunderstorms.= +Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.= +Red Bed= +Blue Bed= +Cyan Bed= +Grey Bed= +Light Grey Bed= +Black Bed= +Yellow Bed= +Green Bed= +Magenta Bed= +Orange Bed= +Purple Bed= +Brown Bed= +Pink Bed= +Lime Bed= +Light Blue Bed= +White Bed= +You can't sleep, the bed's too far away!= +This bed is already occupied!= +You have to stop moving before going to bed!= +You can't sleep now, monsters are nearby!= +You can't sleep, the bed is obstructed!= +It's too dangerous to sleep here!= +New respawn position set! But you can only sleep at night or during a thunderstorm.= +You can only sleep at night or during a thunderstorm.= +New respawn position set!= diff --git a/mods/ITEMS/mcl_books/locale/template.txt b/mods/ITEMS/mcl_books/locale/template.txt new file mode 100644 index 000000000..1d7ee963c --- /dev/null +++ b/mods/ITEMS/mcl_books/locale/template.txt @@ -0,0 +1,25 @@ +# textdomain: mcl_books +Book= +Books are used to make bookshelves and book and quills.= +“@1”= +Copy of “@1”= +Copy of Copy of “@1”= +Tattered Book= +by @1= +Sign= +Done= +This item can be used to write down some notes.= +Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.= +A book can hold up to 4500 characters. The title length is limited to 64 characters.= +Enter book title:= +by @1= +Note: The book will no longer@nbe editable after signing.= +Sign and Close= +Cancel= +Nameless Book= +Written Book= +Written books contain some text written by someone. They can be read and copied, but not edited.= +Hold it in your hand, then rightclick to read the book.= +To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.= +Bookshelf= +Bookshelves are used for decoration.= diff --git a/mods/ITEMS/mcl_bows/locale/template.txt b/mods/ITEMS/mcl_bows/locale/template.txt new file mode 100644 index 000000000..c6c91b444 --- /dev/null +++ b/mods/ITEMS/mcl_bows/locale/template.txt @@ -0,0 +1,11 @@ +# textdomain: mcl_bows +Arrow= +Arrows are ammunition for bows and dispensers.= +An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.= +Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.= +To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.= +Bow= +Bows are ranged weapons to shoot arrows at your foes.= +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.= +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.= +Bow= diff --git a/mods/ITEMS/mcl_buckets/locale/template.txt b/mods/ITEMS/mcl_buckets/locale/template.txt new file mode 100644 index 000000000..f9a23d400 --- /dev/null +++ b/mods/ITEMS/mcl_buckets/locale/template.txt @@ -0,0 +1,13 @@ +# textdomain: mcl_buckets +Empty Bucket= +A bucket can be used to collect and release liquids.= +Punch a liquid source to collect the liquid. With the filled bucket, you can right-click somewhere to empty the bucket which will create a liquid source at the position you've clicked at.= +Lava Bucket= +A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution.= +Choose a place where you want to empty the bucket, then get in a safe spot somewhere above it. Be prepared to run away when something goes wrong as the lava will soon start to flow after placing. To empty the bucket (which places a lava source), right-click on your chosen place.= +Water Bucket= +A bucket can be used to collect and release liquids. This one is filled with water.= +Right-click on any block to empty the bucket and put a water source on this spot.= +River Water Bucket= +A bucket can be used to collect and release liquids. This one is filled with river water.= +Right-click on any block to empty the bucket and put a river water source on this spot.= diff --git a/mods/ITEMS/mcl_cake/locale/template.txt b/mods/ITEMS/mcl_cake/locale/template.txt new file mode 100644 index 000000000..921f9612b --- /dev/null +++ b/mods/ITEMS/mcl_cake/locale/template.txt @@ -0,0 +1,10 @@ +# textdomain: mcl_cake +Cake= +Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.= +Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.= +Cake (6 Slices Left)= +Cake (5 Slices Left)= +Cake (4 Slices Left)= +Cake (3 Slices Left)= +Cake (2 Slices Left)= +Cake (1 Slice Left)= diff --git a/mods/ITEMS/mcl_cauldrons/locale/template.txt b/mods/ITEMS/mcl_cauldrons/locale/template.txt new file mode 100644 index 000000000..426d7d69c --- /dev/null +++ b/mods/ITEMS/mcl_cauldrons/locale/template.txt @@ -0,0 +1,10 @@ +# textdomain: mcl_cauldron +Cauldron= +Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.= +Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.= +Cauldron (1/3 Water)= +Cauldron (2/3 Water)= +Cauldron (3/3 Water)= +Cauldron (1/3 River Water)= +Cauldron (2/3 River Water)= +Cauldron (3/3 River Water)= diff --git a/mods/ITEMS/mcl_chests/locale/template.txt b/mods/ITEMS/mcl_chests/locale/template.txt new file mode 100644 index 000000000..682795bca --- /dev/null +++ b/mods/ITEMS/mcl_chests/locale/template.txt @@ -0,0 +1,28 @@ +# textdomain: mcl_chests +Chest= +Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.= +To access the chest's inventory, rightclick the chest. When broken, the items of the chest will drop out.= +Trapped Chest= +A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.= +To access the inventory of a trapped chest, rightclick it. When broken, the items will drop out.= +Ender Chest= +Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.= +Rightclick the ender chest to access your personal interdimensional inventory.= +White Shulker Box= +Light Grey Shulker Box= +Orange Shulker Box= +Cyan Shulker Box= +Magenta Shulker Box= +Purple Shulker Box= +Light Blue Shulker Box= +Blue Shulker Box= +Yellow Shulker Box= +Brown Shulker Box= +Lime Shulker Box= +Green Shulker Box= +Pink Shulker Box= +Red Shulker Box= +Grey Shulker Box= +Black Shulker Box= +A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.= +To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.= diff --git a/mods/ITEMS/mcl_clock/locale/template.txt b/mods/ITEMS/mcl_clock/locale/template.txt new file mode 100644 index 000000000..07ff8cabc --- /dev/null +++ b/mods/ITEMS/mcl_clock/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mcl_clock +Clocks are tools which shows the current time of day in the Overworld.= +The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol.= +Clock= diff --git a/mods/ITEMS/mcl_cocoas/locale/template.txt b/mods/ITEMS/mcl_cocoas/locale/template.txt new file mode 100644 index 000000000..ff9fb5889 --- /dev/null +++ b/mods/ITEMS/mcl_cocoas/locale/template.txt @@ -0,0 +1,6 @@ +# textdomain: mcl_cocoas +Premature Cocoa= +Cocoas are plants which grow on the side of jungle trees in 3 stages.= +Medium Cocoa= +Mature Cocoa= +A mature cocoa is a plant which grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.= diff --git a/mods/ITEMS/mcl_colorblocks/locale/template.txt b/mods/ITEMS/mcl_colorblocks/locale/template.txt new file mode 100644 index 000000000..e69de29bb diff --git a/mods/ITEMS/mcl_compass/locale/template.txt b/mods/ITEMS/mcl_compass/locale/template.txt new file mode 100644 index 000000000..2db3584f2 --- /dev/null +++ b/mods/ITEMS/mcl_compass/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_compass +Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.= +Compass= diff --git a/mods/ITEMS/mcl_crafting_table/locale/template.txt b/mods/ITEMS/mcl_crafting_table/locale/template.txt new file mode 100644 index 000000000..bd0e5879a --- /dev/null +++ b/mods/ITEMS/mcl_crafting_table/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mcl_crafting_table +Crafting Table= +A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts.= +Rightclick the crafting table to access the 3×3 crafting grid.= diff --git a/mods/ITEMS/mcl_doors/locale/template.txt b/mods/ITEMS/mcl_doors/locale/template.txt new file mode 100644 index 000000000..5b9f788a0 --- /dev/null +++ b/mods/ITEMS/mcl_doors/locale/template.txt @@ -0,0 +1,22 @@ +# textdomain: mcl_doors +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.= +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.= +Oak Door= +Acacia Door= +Birch Door= +Dark Oak Door= +Jungle Door= +Spruce Door= +Iron Door= +Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.= +To open or close an iron door, supply its lower half with a redstone signal.= +Oak Trapdoor= +Acacia Trapdoor= +Birch Trapdoor= +Spruce Trapdoor= +Dark Oak Trapdoor= +Jungle Trapdoor= +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.= +To open or close the trapdoor, rightclick it or send a redstone signal to it.= +Iron Trapdoor= +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.= diff --git a/mods/ITEMS/mcl_dye/locale/template.txt b/mods/ITEMS/mcl_dye/locale/template.txt new file mode 100644 index 000000000..f99638e4c --- /dev/null +++ b/mods/ITEMS/mcl_dye/locale/template.txt @@ -0,0 +1,25 @@ +# textdomain: mcl_dye +Bone Meal= +Light Grey Dye= +Grey Dye= +Ink Sac= +Purple Dye= +Lapis Lazuli= +Light Blue Dye= +Cyan Dye= +Cactus Green= +Lime Dye= +Dandelion Yellow= +Cocoa Beans= +Orange Dye= +Rose Red= +Magenta Dye= +Pink Dye= +This item is a dye which is used for dyeing and crafting.= +Rightclick on a sheep to dye its wool. Other things are dyed by crafting.= +Bone Meal= +Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.= +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.= +Cocoa beans are a brown dye and can be used to plant cocoas.= +Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.= +Cocoa Beans= diff --git a/mods/ITEMS/mcl_end/locale/template.txt b/mods/ITEMS/mcl_end/locale/template.txt new file mode 100644 index 000000000..1d74608a5 --- /dev/null +++ b/mods/ITEMS/mcl_end/locale/template.txt @@ -0,0 +1,23 @@ +# textdomain: mcl_end +End Stone= +End Stone Bricks= +Purpur Block= +Purpur Pillar= +End Rod= +End rods are decorative light sources.= +Dragon Egg= +A dragon egg is a decorative item which can be placed.= +Chorus Flower= +A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow.= +Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly one chorus plant stem.= +Dead Chorus Flower= +This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again.= +Chorus Plant Stem= +A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers.= +Chorus Fruit= +A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to.= +Popped Chorus Fruit= +Eye of Ender= +This item is used to locate End portal shrines in the Overworld and to activate End portals.= +Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.= +To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.= diff --git a/mods/ITEMS/mcl_farming/locale/template.txt b/mods/ITEMS/mcl_farming/locale/template.txt new file mode 100644 index 000000000..36ac6733f --- /dev/null +++ b/mods/ITEMS/mcl_farming/locale/template.txt @@ -0,0 +1,93 @@ +# textdomain: mcl_farming +Beetroot Seeds= +Grows into a beetroot plant. Chickens like beetroot seeds.= +Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.= +Premature Beetroot Plant (Stage 1)= +Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.= +Premature Beetroot Plant= +Premature Beetroot Plant (Stage 2)= +Premature Beetroot Plant (Stage 3)= +Mature Beetroot Plant= +A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.= +Beetroot= +Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.= +Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.= +Beetroot Soup= +Beetroot soup is a food item.= +Premature Carrot Plant= +Carrot plants are plants which grow on farmland under sunlight in 8 stages, of which only 4 are actually visible. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.= +Premature Carrot Plant (Stage @1)= +Mature Carrot Plant= +Mature carrot plants are ready to be harvested for carrots. They won't grow any further.= +Carrot= +Carrots can be eaten and planted. Pigs and rabbits like carrots.= +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.= +Golden Carrot= +A golden carrot is a precious food item which can be eaten. It is really, really filling!= +Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.= +Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.= +Wood Hoe= +Stone Hoe= +Iron Hoe= +Golden Hoe= +Diamond Hoe= +Melon Seeds= +Grows into a melon. Chickens like melon seeds.= +Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melons grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it melon seeds.= +Melon= +A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.= +Premature Melon Stem= +Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.= +Premature Melon Stem (Stage @1)= +Mature Melon Stem= +A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.= +Melon Slice= +This is a food item which can be eaten.= +Premature Potato Plant= +Potato plants are plants which grow on farmland under sunlight in 8 stages, of which only 4 are actually visible. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.= +Premature Potato Plant (Stage @1)= +Mature Potato Plant= +Mature potato plants are ready to be harvested for potatoes. They won't grow any further.= +Potato= +Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.= +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.= +Baked Potato= +Baked potatoes are food items which are more filling than the unbaked ones.= +Poisonous Potato= +This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.= +Pumpkin Seeds= +Grows into a pumpkin. Chickens like pumpkin seeds.= +Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkins grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it pumpkin seeds.= +Premature Pumpkin Stem= +Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.= +Premature Pumpkin Stem (Stage @1)= +Mature Pumpkin Stem= +A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.= +Faceless Pumpkin= +A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.= +Pumpkin= +A pumpkin can be worn as a helmet for fun, but it doesn't offer any protection. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.= +Jack o'Lantern= +A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.= +Pumpkin Pie= +A pumpkin pie is a tasty food item which can be eaten.= +Farmland= +Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.= +Hydrated Farmland= +Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmlands is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.= +Wheat Seeds= +Grows into a wheat plant. Chickens like wheat seeds.= +Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.= +Premature Wheat Plant= +Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.= +Premature Wheat Plant (Stage @1)= +Mature Wheat Plant= +Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.= +Wheat= +Wheat is used in crafting. Some animals like wheat.= +Cookie= +This is a food item which can be eaten.= +Bread= +This is a food item which can be eaten.= +Hay Bale= +Hay bales are decorative blocks made from wheat.= diff --git a/mods/ITEMS/mcl_fences/locale/template.txt b/mods/ITEMS/mcl_fences/locale/template.txt new file mode 100644 index 000000000..9eaee4e40 --- /dev/null +++ b/mods/ITEMS/mcl_fences/locale/template.txt @@ -0,0 +1,16 @@ +# 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.= +Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.= +Right-click the fence gate to open or close it.= +Oak Fence= +Oak Fence Gate= +Spruce Fence= +Spruce Fence Gate= +Birch Fence= +Birch Fence Gate= +Jungle Fence= +Jungle Fence Gate= +Dark Oak Fence= +Dark Oak Fence Gate= +Acacia Fence= +Acacia Fence Gate= diff --git a/mods/ITEMS/mcl_fire/locale/template.txt b/mods/ITEMS/mcl_fire/locale/template.txt new file mode 100644 index 000000000..d691bf22f --- /dev/null +++ b/mods/ITEMS/mcl_fire/locale/template.txt @@ -0,0 +1,15 @@ +# textdomain: mcl_fire +Fire Charge= +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.= +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.= +Flint and Steel= +Flint and steel is a tool to start fires and ignite blocks.= +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.= +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.= +Eternal fire is a damaging and destructive block. 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.= +%s has been cooked crisp.= +%s felt the burn.= +%s died in the flames.= +%s died in a fire.= +Fire= +Eternal Fire= diff --git a/mods/ITEMS/mcl_fishing/locale/template.txt b/mods/ITEMS/mcl_fishing/locale/template.txt new file mode 100644 index 000000000..c958e0b40 --- /dev/null +++ b/mods/ITEMS/mcl_fishing/locale/template.txt @@ -0,0 +1,16 @@ +# textdomain: mcl_fishing +Fishing Rod= +Fishing rods can be used to catch fish.= +Rightclick a water source to try to go fishing. Who knows what you're going to catch?= +Raw Fish= +Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.= +Cooked Fish= +Mmh, fish! This is a healthy food item.= +Raw Salmon= +Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.= +Cooked Salmon= +This is a healthy food item which can be eaten.= +Clownfish= +Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely.= +Pufferfish= +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).= diff --git a/mods/ITEMS/mcl_flowerpots/locale/template.txt b/mods/ITEMS/mcl_flowerpots/locale/template.txt new file mode 100644 index 000000000..75c6b7a2e --- /dev/null +++ b/mods/ITEMS/mcl_flowerpots/locale/template.txt @@ -0,0 +1,24 @@ +# textdomain: mcl_flowerpots +Dandelion Flower Pot= +Poppy Floer Pot= +Blue Orchid Flower Pot= +Allium Flower Pot= +Azure Bluet Flower Pot= +Red Tulip Flower Pot= +Pink Tulip Flower Pot= +White Tulip Flower Pot= +Orange Tulip Flower Pot= +Oxeye Daisy Flower Pot= +Brown Mushroom Flower Pot= +Red Mushroom Flower Pot= +Oak Sapling Flower Pot= +Acacia Sapling Flower Pot= +Jungle Sapling Flower Pot= +Dark Oak Sapling Flower Pot= +Spruce Sapling Flower Pot= +Birch Sapling Flower Pot= +Dead Bush Flower Pot= +Fern Flower Pot= +Flower Pot= +Flower pots are decorative blocks in which flowers and other small plants can be placed.= +Rightclick an empty flower pot while you wield a plant to place the plant. 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.= diff --git a/mods/ITEMS/mcl_flowers/locale/template.txt b/mods/ITEMS/mcl_flowers/locale/template.txt new file mode 100644 index 000000000..f89e74cd3 --- /dev/null +++ b/mods/ITEMS/mcl_flowers/locale/template.txt @@ -0,0 +1,32 @@ +# textdomain: mcl_flowers +This is a small flower. Small flowers are mainly used for dye production and can also be potted.= +It can only be placed on a block on which it would also survive.= +Poppy= +Dandelion= +Oxeye Daisy= +Orange Tulip= +Pink Tulip= +Red Tulip= +White Tulip= +Allium= +Azure Bluet= +Blue Orchid= +Tall Grass= +Tall grass is a small plant which often occours 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.= +Fern= +Ferns are small plants which occour naturally in grasslands. 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.= +(Top Part)= +Peony= +A peony is a large plant which occupies two blocks. It is mainly used in dye protection.= +Rose Bush= +A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye protection.= +Lilac= +A lilac is a large plant which occupies two blocks. It is mainly used in dye production.= +Sunflower= +A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.= +Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.= +Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.= +Double Tallgrass= +Large Fern= +Lily Pad= +A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.= diff --git a/mods/ITEMS/mcl_furnaces/locale/template.txt b/mods/ITEMS/mcl_furnaces/locale/template.txt new file mode 100644 index 000000000..bdea900a7 --- /dev/null +++ b/mods/ITEMS/mcl_furnaces/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mcl_furnaces +Furnace= +Furnaces cook or smelt several items, using a furnace fuel, into something else.= +Right-click the furnace to view it. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.= +Burning Furnace= diff --git a/mods/ITEMS/mcl_heads/locale/template.txt b/mods/ITEMS/mcl_heads/locale/template.txt new file mode 100644 index 000000000..213fbf5c6 --- /dev/null +++ b/mods/ITEMS/mcl_heads/locale/template.txt @@ -0,0 +1,11 @@ +# textdomain: mcl_heads +Zombie Head= +A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet for fun, but does not offer any protection.= +Creeper Head= +A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet for fun, but does not offer any protection.= +Human Head= +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.= +Skeleton Skull= +A skeleton skull is a small decorative block which resembles the head of a skeleton. It can also be worn as a helmet for fun, but does not offer any protection.= +Wither Skeleton Skull= +A wither skeleton skull is a small decorative block which resembles the head of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.= diff --git a/mods/ITEMS/mcl_hoppers/locale/template.txt b/mods/ITEMS/mcl_hoppers/locale/template.txt new file mode 100644 index 000000000..080193b6c --- /dev/null +++ b/mods/ITEMS/mcl_hoppers/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: mcl_hoppers +Hopper= +Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempts 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.= +Hoppers can be disabled by supplying them with redstone power. Disabled hoppers don't move items.= +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. Remember you can place at usable blocks (such as chests) with sneak + right-click. The hopper will keep its orientation when the blocks around it are changed. To access the hopper's inventory, rightclick it.= +Disabled Hopper= +Side Hopper= +Disabled Side Hopper= diff --git a/mods/ITEMS/mcl_itemframes/locale/template.txt b/mods/ITEMS/mcl_itemframes/locale/template.txt new file mode 100644 index 000000000..8a3ea6b94 --- /dev/null +++ b/mods/ITEMS/mcl_itemframes/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mcl_itemframes +Item Frame= +Item frames are decorative blocks in which items can be placed.= +Hold any item in your hand and right-click the item frame to place the item into the frame. Rightclick the item frame again to retrieve the item.= diff --git a/mods/ITEMS/mcl_jukebox/locale/template.txt b/mods/ITEMS/mcl_jukebox/locale/template.txt new file mode 100644 index 000000000..b2ad0d944 --- /dev/null +++ b/mods/ITEMS/mcl_jukebox/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: mcl_jukebox +Music Disc= +A music disc holds a single music track which can be used in a jukebox to play music.= +Rightclick an empty jukebox with the music disc in your hand to play the music. Rightclick the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players.= +Music Disc= +@1—@2= +Jukebox= +Jukeboxes play music when they're supplied with a music disc.= +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.= diff --git a/mods/ITEMS/mcl_maps/locale/template.txt b/mods/ITEMS/mcl_maps/locale/template.txt new file mode 100644 index 000000000..8fb561e86 --- /dev/null +++ b/mods/ITEMS/mcl_maps/locale/template.txt @@ -0,0 +1,7 @@ +# textdomain: mcl_maps +Empty Map= +Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.= +Rightclick to start using the map (which can't be stacked anymore).= +Map= +Maps show your surroundings as you explore the world.= +Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key ([F9] by default).@nIn Creative Mode, you don't need this item; the minimap is always available.= diff --git a/mods/ITEMS/mcl_mobitems/locale/template.txt b/mods/ITEMS/mcl_mobitems/locale/template.txt new file mode 100644 index 000000000..212497269 --- /dev/null +++ b/mods/ITEMS/mcl_mobitems/locale/template.txt @@ -0,0 +1,60 @@ +# textdomain: mcl_mobitems +Rotten Flesh= +Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.= +Raw Mutton= +Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.= +Cooked Mutton= +Cooked mutton is the cooked flesh from a sheep and is used as food.= +Raw Beef= +Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.= +Steak= +Steak is cooked beef from cows and can be eaten.= +Raw Chicken= +Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.= +Cooked Chicken= +A cooked chicken is a healthy food item which can be eaten.= +Raw Porkchop= +A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.= +Cooked Porkchop= +Cooked porkchop is the cooked flesh of a pig and is used as food.= +Raw Rabbit= +Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.= +Cooked Rabbit= +This is a food item which can be eaten.= +Milk= +Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning (in later versions: all status effects), but restores no hunger points.= +Spider Eye= +Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.= +Bone= +Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.= +String= +Strings are used in crafting.= +Blaze Rod= +This is a crafting component dropped from dead blazes.= +Blaze Powder= +This item is mainly used for crafting.= +Magma Cream= +Magma cream is a crafting component.= +Ghast Tear= +Place this item in an item frame as decoration.= +Nether Star= +A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.= +Leather= +Leather is a versatile crafting component.= +Feather= +Feathers are used in crafting and are dropped from chickens.= +Rabbit Hide= +Rabbit hide is used to create leather.= +Rabbit's Foot= +Must be your lucky day! Place this item in an item frame for decoration.= +Saddle= +Saddles can be put on some animals in order to mount them.= +Rabbit Stew= +Rabbit stew is a very nutricious food item.= +Shulker Shell= +Shulker shells are used in crafting. They are dropped from dead shulkers.= +Slimeball= +Slimeballs are used in crafting. They are dropped from slimes.= +Gunpowder= +Carrot on a Stick= +A carrot on a stick can be used on saddled pigs to ride them.= diff --git a/mods/ITEMS/mcl_mobspawners/locale/template.txt b/mods/ITEMS/mcl_mobspawners/locale/template.txt new file mode 100644 index 000000000..f6948377c --- /dev/null +++ b/mods/ITEMS/mcl_mobspawners/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mcl_mobspawners +Mob Spawner= +A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light.= +If you have a spawn egg, you use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level.= diff --git a/mods/ITEMS/mcl_monster_eggs/locale/template.txt b/mods/ITEMS/mcl_monster_eggs/locale/template.txt new file mode 100644 index 000000000..7e8b0c0cf --- /dev/null +++ b/mods/ITEMS/mcl_monster_eggs/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: mcl_mobspawners +An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.= +Infested Stone= +Infested Cobblestone= +Infested Stone Bricks= +Infested Cracked Stone Bricks= +Infested Mossy Stone Bricks= +Infested Chiseled Stone Bricks= diff --git a/mods/ITEMS/mcl_mushrooms/locale/template.txt b/mods/ITEMS/mcl_mushrooms/locale/template.txt new file mode 100644 index 000000000..77e0156e9 --- /dev/null +++ b/mods/ITEMS/mcl_mushrooms/locale/template.txt @@ -0,0 +1,21 @@ +# textdomain: mcl_mushrooms +This decorative block is like a huge mushroom stem, but with the stem texture on all sides.= +Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides.= +The stem part of a huge red mushroom.= +Huge Red Mushroom Block= +Huge Red Mushroom Stem= +Huge Red Mushroom All-Faces Stem= +Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides.= +The stem part of a huge brown mushroom.= +Huge Brown Mushroom Block= +Huge Brown Mushroom Stem= +Huge Brown Mushroom All-Faces Stem= +Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.= +Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.= +A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom.= +Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.= +This mushroom can be placed on mycelium and podzol at any light level. They can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.= +Brown Mushroom= +Red Mushroom= +Mushroom Stew= +Mushroom stew is a healthy soup which can be consumed to restore some hunger points.= diff --git a/mods/ITEMS/mcl_nether/locale/template.txt b/mods/ITEMS/mcl_nether/locale/template.txt new file mode 100644 index 000000000..215bd5110 --- /dev/null +++ b/mods/ITEMS/mcl_nether/locale/template.txt @@ -0,0 +1,27 @@ +# textdomain: mcl_nether +Glowstone= +Glowstone is a naturally-glowing block which is home to the Nether.= +Nether Quartz Ore= +Nether quartz ore is an ore containing nether quartz. It is commonly found around netherrack in the Nether.= +Netherrack= +Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire.= +Magma Block= +Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire.= +Soul Sand= +Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block.= +Nether Brick Block= +Red Nether Brick Block= +Nether Wart Block= +A nether wart block is a purely decorative block made from nether wart.= +Block of Quartz= +Chiseled Quartz Block= +Pillar Quartz Block= +Smooth Quartz= +Glowstone Dust= +Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting.= +Nether Quartz= +Nether quartz is a versatile crafting ingredient.= +Nether Brick= +Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences.= +Nether Lava Source= +Flowing Nether Lava= diff --git a/mods/ITEMS/mcl_ocean/locale/template.txt b/mods/ITEMS/mcl_ocean/locale/template.txt new file mode 100644 index 000000000..943e7daef --- /dev/null +++ b/mods/ITEMS/mcl_ocean/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: mcl_ocean +Sea Lantern= +Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.= +Prismarine= +Prismarine is used as a building block. It slowly changes its color.= +Prismarine Bricks= +Dark Prismarine= +Prismarine Crystals= +Prismarine Shard= diff --git a/mods/ITEMS/mcl_portals/locale/template.txt b/mods/ITEMS/mcl_portals/locale/template.txt new file mode 100644 index 000000000..3283da3f4 --- /dev/null +++ b/mods/ITEMS/mcl_portals/locale/template.txt @@ -0,0 +1,14 @@ +# textdomain: mcl_portals +End Portal= +An End portal teleports creatures and objects to the mysterious End dimension (and back!).= +Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.= +End Portal Frame= +End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.= +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.= +End Portal Frame with Eye of Ender= +Nether Portal= +A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!= +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.= +Obsidian is also used as the frame of Nether portals.= +To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.= diff --git a/mods/ITEMS/mcl_potions/locale/template.txt b/mods/ITEMS/mcl_potions/locale/template.txt new file mode 100644 index 000000000..850637b37 --- /dev/null +++ b/mods/ITEMS/mcl_potions/locale/template.txt @@ -0,0 +1,20 @@ +# textdomain: mcl_potions +Put this item in an item frame for decoration. It's useless otherwise.= +Fermented Spider Eye= +Glass Bottle= +A glass bottle is used as a container for liquids and can be used to collect water directly.= +To collect water, it on a cauldron with water (which removes a level of water) or any water source (which removes no water).= +Water Bottle= +Water bottles can be used to fill cauldrons. Drinking water has no effect.= +Rightclick to drink. Rightclick a cauldron to pour the water into the cauldron.= +River Water Bottle= +River water bottles can be used to fill cauldrons. Drinking it has no effect.= +Awkward Potion= +This potion has an awkward taste and is used for brewing more potions. Drinking it has no effect.= +Mundane Potion= +This potion has a clean taste and is used for brewing more potions. Drinking it has no effect.= +Thick Potion= +This potion has a bitter taste and is used for brewing more potions. Drinking it has no effect.= +Glistering Melon= +This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.= +Dragon's Breath= diff --git a/mods/ITEMS/mcl_signs/locale/template.txt b/mods/ITEMS/mcl_signs/locale/template.txt new file mode 100644 index 000000000..ae920e308 --- /dev/null +++ b/mods/ITEMS/mcl_signs/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mcl_signs +Sign= +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.= +Place the sign at the side to build a wall sign, place it on top of another block to build a sign with a sign post.@nAfter 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. The text can not be changed once it has been written; you have to break and place the sign again.= diff --git a/mods/ITEMS/mcl_sponges/locale/template.txt b/mods/ITEMS/mcl_sponges/locale/template.txt new file mode 100644 index 000000000..2de972267 --- /dev/null +++ b/mods/ITEMS/mcl_sponges/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: mcl_sponges +Sponge= +Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.= +Waterlogged Sponge= +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.= +Riverwaterlogged Sponge= +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.= +A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.= diff --git a/mods/ITEMS/mcl_stairs/locale/template.txt b/mods/ITEMS/mcl_stairs/locale/template.txt new file mode 100644 index 000000000..7a0e15db4 --- /dev/null +++ b/mods/ITEMS/mcl_stairs/locale/template.txt @@ -0,0 +1,101 @@ +# textdomain: mcl_stairs +Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the bottom or at the upper half of the side of a block will be placed upside down.= +Double @1= +Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.= +Upper @1= +Double slabs are full blocks which are created by placing two slabs of the same kind on each other.= +Oak Wood Stairs= +Oak Wood Slab= +Double Oak Wood Slab= +Jungle Wood Stairs= +Jungle Wood Slab= +Double Jungle Wood Slab= +Acacia Wood Stairs= +Acacia Wood Slab= +Double Acacia Wood Slab= +Spruce Wood Stairs= +Spruce Wood Slab= +Double Spruce Wood Slab= +Birch Wood Stairs= +Birch Wood Slab= +Double Birch Wood Slab= +Dark Oak Wood Stairs= +Dark Oak Wood Slab= +Double Dark Oak Wood Slab= +Stone Stairs= +Stone Slab= +Double Stone Slab= +Polished Stone Slab= +Double Polished Stone Slab= +Andesite Stairs= +Andesite Slab= +Double Andesite Slab= +Granite Stairs= +Granite Slab= +Double Granite Slab= +Diorite Stairs= +Diorite Slab= +Double Diorite Slab= +Cobblestone Stairs= +Cobblestone Slab= +Double Cobblestone Slab= +Moss Stone Stairs= +Moss Stone Slab= +Double Moss Stone Slab= +Brick Stairs= +Brick Slab= +Double Brick Slab= +Sandstone Stairs= +Sandstone Slab= +Double Sandstone Slab= +Smooth Sandstone Stairs= +Smooth Sandstone Slab= +Double Smooth Sandstone Slab= +Red Sandstone Stairs= +Red Sandstone Slab= +Double Red Sandstone Slab= +Smooth Red Sandstone Stairs= +Smooth Red Sandstone Slab= +Double Smooth Red Sandstone Slab= +Stone Bricks Stairs= +Stone Bricks Slab= +Double Stone Bricks Slab= +Quartz Stairs= +Quartz Slab= +Double Quartz Slab= +Smooth Quartz Stairs= +Smooth Quartz Slab= +Double Smooth Quartz Slab= +Nether Brick Stairs= +Nether Brick Slab= +Double Nether Brick Slab= +Red Nether Brick Stairs= +Red Nether Brick Slab= +Double Red Nether Brick Slab= +End Stone Brick Stairs= +End Stone Brick Slab= +Double End Stone Brick Slab= +Purpur Stairs= +Purpur Slab= +Double Purpur Slab= +Prismarine Stairs= +Prismarine Slab= +Double Prismarine Slab= +Prismarine Brick Stairs= +Prismarine Brick Slab= +Double Prismarine Brick Slab= +Dark Prismarine Stairs= +Dark Prismarine Slab= +Double Dark Prismarine Slab= +Polished Andesite Slab= +Double Polished Andesite Slab= +Polished Andesite Stairs= +Polished Granite Slab= +Double Polished Granite Slab= +Polished Granite Stairs= +Polished Diorite Slab= +Double Polished Diorite Slab= +Polished Diorite Stairs= +Mossy Stone Brick Stairs= +Mossy Stone Brick Slab= +Double Mossy Stone Brick Slab= diff --git a/mods/ITEMS/mcl_throwing/locale/template.txt b/mods/ITEMS/mcl_throwing/locale/template.txt new file mode 100644 index 000000000..126b3ff05 --- /dev/null +++ b/mods/ITEMS/mcl_throwing/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: mcl_throwing +@1 used the ender pearl too often.= +Hold it in your and and leftclick to throw.= +Snowball= +Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.= +Egg= +Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chickens will pop out of the egg when it hits the ground.= +Ender Pearl= +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, a plant or vines. Each teleportation hurts the user by 5 hit points.= diff --git a/mods/ITEMS/mcl_tnt/locale/template.txt b/mods/ITEMS/mcl_tnt/locale/template.txt new file mode 100644 index 000000000..c50fea38c --- /dev/null +++ b/mods/ITEMS/mcl_tnt/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mcl_tnt +@1 was caught in an explosion.= +TNT= +An explosive device. When it explodes, it will hurt living beings, destroy blocks around it, throw blocks affected by gravity all over the place and light fires. A single 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.= +Place the TNT on the ground and ignite it with one of the methods above. Quickly get in safe distance quickly. The TNT will start to be affected by gravity and explodes in 4 seconds.= diff --git a/mods/ITEMS/mcl_tools/locale/template.txt b/mods/ITEMS/mcl_tools/locale/template.txt new file mode 100644 index 000000000..8d90e42ca --- /dev/null +++ b/mods/ITEMS/mcl_tools/locale/template.txt @@ -0,0 +1,29 @@ +# textdomain: mcl_tools +You use your bare hand whenever you are not wielding any item. With your hand you can mine the weakest blocks and deal minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are better than the hand. 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. In Creative Mode, the hand is able to break all blocks instantly.= +Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.= +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.= +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.= +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.= +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.= +Shears are tools to shear sheep, carve pumpkins and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from a grass, leaves and similar blocks.= +Wooden Pickaxe= +Stone Pickaxe= +Iron Pickaxe= +Golden Pickaxe= +Diamond Pickaxe= +Wooden Shovel= +Stone Shovel= +Iron Shovel= +Golden Shovel= +Diamond Shovel= +Wooden Axe= +Stone Axe= +Iron Axe= +Golden Axe= +Diamond Axe= +Wooden Sword= +Stone Sword= +Iron Sword= +Golden Sword= +Diamond Sword= +Shears= diff --git a/mods/ITEMS/mcl_torches/locale/template.txt b/mods/ITEMS/mcl_torches/locale/template.txt new file mode 100644 index 000000000..447fba747 --- /dev/null +++ b/mods/ITEMS/mcl_torches/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_torches +Torch= +Torches are light sources which can be placed at the side or on the top of most blocks.= diff --git a/mods/ITEMS/mcl_totems/locale/template.txt b/mods/ITEMS/mcl_totems/locale/template.txt new file mode 100644 index 000000000..e69de29bb diff --git a/mods/ITEMS/mcl_walls/locale/template.txt b/mods/ITEMS/mcl_walls/locale/template.txt new file mode 100644 index 000000000..765365997 --- /dev/null +++ b/mods/ITEMS/mcl_walls/locale/template.txt @@ -0,0 +1,16 @@ +# 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.= +Cobblestone Wall= +Mossy Cobblestone Wall= +Andesite Wall= +Granite Wall= +Diorite Wall= +Brick Wall= +Sandstone Wall= +Red Sandstone Wall= +Stone Brick Wall= +Mossy Stone Brick Wall= +Prismarine Wall= +End Stone Brick Wall= +Nether Brick Wall= +Red Nether Brick Wall= diff --git a/mods/ITEMS/mcl_wool/locale/template.txt b/mods/ITEMS/mcl_wool/locale/template.txt new file mode 100644 index 000000000..0358fb503 --- /dev/null +++ b/mods/ITEMS/mcl_wool/locale/template.txt @@ -0,0 +1,35 @@ +# textdomain: mcl_wool +White Wool= +White Carpet= +Grey Wool= +Grey Carpet= +Light Grey Wool= +Light Grey Carpet= +Black Wool= +Black Carpet= +Red Wool= +Red Carpet= +Yellow Wool= +Yellow Carpet= +Green Wool= +Green Carpet= +Cyan Wool= +Cyan Carpet= +Blue Wool= +Blue Carpet= +Magenta Wool= +Magenta Carpet= +Orange Wool= +Orange Carpet= +Purple Wool= +Purple Carpet= +Brown Wool= +Brown Carpet= +Pink Wool= +Pink Carpet= +Lime Wool= +Lime Carpet= +Light Blue Wool= +Light Blue Carpet= +Wool is a decorative block which comes in many different colors.= +Carpets are thin floor covers which come in many different colors.= diff --git a/mods/ITEMS/mclx_core/locale/template.txt b/mods/ITEMS/mclx_core/locale/template.txt new file mode 100644 index 000000000..1486ee301 --- /dev/null +++ b/mods/ITEMS/mclx_core/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mclx_core +River Water Source= +River water has the same properties as water, but has a reduced flowing distance and is not renewable.= +River Water= +Flowing River Water= diff --git a/mods/ITEMS/mclx_fences/locale/template.txt b/mods/ITEMS/mclx_fences/locale/template.txt new file mode 100644 index 000000000..e6c05c7f7 --- /dev/null +++ b/mods/ITEMS/mclx_fences/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mclx_fences +Red Nether Brick Fence= +Red Nether Brick Fence Gate= +Nether Brick Fence Gate= diff --git a/mods/ITEMS/mclx_stairs/locale/template.txt b/mods/ITEMS/mclx_stairs/locale/template.txt new file mode 100644 index 000000000..8237d4161 --- /dev/null +++ b/mods/ITEMS/mclx_stairs/locale/template.txt @@ -0,0 +1,31 @@ +# textdomain: mclx_stairs +Oak Bark Stairs= +Oak Bark Slab= +Double Oak Bark Slab= +Acacia Bark Stairs= +Acacia Bark Slab= +Double Acacia Bark Slab= +Spruce Bark Stairs= +Spruce Bark Slab= +Double Spruce Bark Slab= +Birch Bark Stairs= +Birch Bark Slab= +Double Birch Bark Slab= +Jungle Bark Stairs= +Jungle Bark Slab= +Double Jungle Bark Slab= +Dark Oak Bark Stairs= +Dark Oak Bark Slab= +Double Dark Oak Bark Slab= +Lapis Lazuli Slab= +Double Lapis Lazuli Slab= +Lapis Lazuli Stairs= +Slab of Gold= +Double Slab of Gold= +Stairs of Gold= +Slab of Iron= +Double Slab of Iron= +Stairs of Iron= +Cracked Stone Brick Stairs= +Cracked Stone Brick Slab= +Double Cracked Stone Brick Slab= diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/locale/template.txt b/mods/ITEMS/minetest-3d_armor/3d_armor/locale/template.txt new file mode 100644 index 000000000..f0126bca9 --- /dev/null +++ b/mods/ITEMS/minetest-3d_armor/3d_armor/locale/template.txt @@ -0,0 +1,23 @@ +# textdomain: 3d_armor +This is a piece of equippable armor which reduces the amount of damage you receive.= +To equip it, put it on the corresponding armor slot in your inventory menu.= +Leather Cap= +Iron Helmet= +Golden Helmet= +Diamond Helmet= +Chain Helmet= +Leather Tunic= +Iron Chestplate= +Golden Chestplate= +Diamond Chestplate= +Chain Chestplate= +Leather Pants= +Iron Leggings= +Golden Leggings= +Diamond Leggings= +Chain Leggings= +Leather Boots= +Iron Boots= +Golden Boots= +Diamond Boots= +Chain Boots= diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/locale/template.txt b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/locale/template.txt new file mode 100644 index 000000000..d05dab07c --- /dev/null +++ b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: 3d_armor_stand +Armor Stand= +An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.= +Hold an armor item in your hand and rightclick the armor stand to put it on the armor stand. To take a piece of armor from the armor stand, select your hand and rightclick the armor stand. You'll retrieve the first armor item from above.= diff --git a/mods/ITEMS/xpanes/locale/template.txt b/mods/ITEMS/xpanes/locale/template.txt new file mode 100644 index 000000000..ad8c1b5ea --- /dev/null +++ b/mods/ITEMS/xpanes/locale/template.txt @@ -0,0 +1,21 @@ +# textdomain: xpanes +Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.= +Iron Bars= +Iron bars neatly connect to their neighbors as you build them.= +Glass Pane= +Red Stained Glass Pane= +Green Stained Glass Pane= +Blue Stained Glass Pane= +Light Blue Stained Glass Pane= +Black Stained Glass Pane= +White Stained Glass Pane= +Yellow Stained Glass Pane= +Brown Stained Glass Pane= +Orange Stained Glass Pane= +Pink Stained Glass Pane= +Grey Stained Glass Pane= +Lime Stained Glass Pane= +Light Grey Stained Glass Pane= +Magenta Stained Glass Pane= +Purple Stained Glass Pane= +Cyan Stained Glass Pane= diff --git a/mods/MISC/mcl_commands/locale/template.txt b/mods/MISC/mcl_commands/locale/template.txt new file mode 100644 index 000000000..d98db68a4 --- /dev/null +++ b/mods/MISC/mcl_commands/locale/template.txt @@ -0,0 +1,20 @@ +# textdomain: mcl_commands +Players can't be killed right now, damage has been disabled.= +Player @1 does not exist.= +You are already dead= +@1 is already dead= +@1 committed suicide.= +@1 was killed by @2.= +[]= +Kill player or yourself= +Can use /say= += +Send a message to every player= +Invalid usage, see /help say.= +,, = +Set node at given position= +Invalid node= +@1 spawned.= +Invalid parameters (see /help setblock)= +List bans= +Ban list: @1= diff --git a/mods/MISC/mcl_privs/locale/template.txt b/mods/MISC/mcl_privs/locale/template.txt new file mode 100644 index 000000000..11be33493 --- /dev/null +++ b/mods/MISC/mcl_privs/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain: mcl_privs +Can place and use advanced blocks like mob spawners, command blocks and barriers.= diff --git a/mods/MISC/mcl_wip/locale/template.txt b/mods/MISC/mcl_wip/locale/template.txt new file mode 100644 index 000000000..ab7fadde6 --- /dev/null +++ b/mods/MISC/mcl_wip/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_wip +(WIP)= +(Temporary)= diff --git a/mods/PLAYER/mcl_playerplus/locale/template.txt b/mods/PLAYER/mcl_playerplus/locale/template.txt new file mode 100644 index 000000000..49b1f96ac --- /dev/null +++ b/mods/PLAYER/mcl_playerplus/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_playerplus +@1 suffocated to death.= +@1 was prickled to death by a cactus.= From 04c2da63adbe6f2da94e625760ab1f289ea7579c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 00:00:10 +0100 Subject: [PATCH 163/379] mcl_mobs: Remove unused string --- mods/ENTITIES/mcl_mobs/api.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 335fd01f9..dfa34ec04 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -2355,7 +2355,6 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- is mob protected? if self.protected and hitter:is_player() and minetest.is_protected(self.object:get_pos(), hitter:get_player_name()) then - minetest.chat_send_player(hitter:get_player_name(), S("Mob has been protected!")) return end From 9ef6176958bf7db2ec3915306cd93e6b75d00383 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 00:09:09 +0100 Subject: [PATCH 164/379] Remove redundant translatability stuff in mobs_mc --- mods/ENTITIES/mobs_mc/1_items_default.lua | 137 +++++++++++----------- mods/ENTITIES/mobs_mc/2_throwing.lua | 23 ++-- mods/ENTITIES/mobs_mc/4_heads.lua | 11 +- mods/ENTITIES/mobs_mc/silverfish.lua | 10 +- 4 files changed, 95 insertions(+), 86 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/1_items_default.lua b/mods/ENTITIES/mobs_mc/1_items_default.lua index 37d54a076..3a58bd493 100644 --- a/mods/ENTITIES/mobs_mc/1_items_default.lua +++ b/mods/ENTITIES/mobs_mc/1_items_default.lua @@ -5,6 +5,9 @@ --THIS IS THE MASTER ITEM LIST TO USE WITH DEFAULT +-- NOTE: Most strings intentionally not marked for translation, other mods already have these items. +-- TODO: Remove this file eventually, most items are already outsourced in other mods. + local S = minetest.get_translator("mobs_mc") local c = mobs_mc.is_item_variable_overridden @@ -12,8 +15,8 @@ local c = mobs_mc.is_item_variable_overridden -- Blaze if c("blaze_rod") then minetest.register_craftitem("mobs_mc:blaze_rod", { - description = S("Blaze Rod"), - _doc_items_longdesc = S("This is a crafting component dropped from dead blazes."), + description = "Blaze Rod", + _doc_items_longdesc = "This is a crafting component dropped from dead blazes.", wield_image = "mcl_mobitems_blaze_rod.png", inventory_image = "mcl_mobitems_blaze_rod.png", }) @@ -39,8 +42,8 @@ end if c("blaze_powder") then minetest.register_craftitem("mobs_mc:blaze_powder", { - description = S("Blaze Powder"), - _doc_items_longdesc = S("This item is mainly used for brewing potions and crafting."), + description = "Blaze Powder", + _doc_items_longdesc = "This item is mainly used for brewing potions and crafting.", wield_image = "mcl_mobitems_blaze_powder.png", inventory_image = "mcl_mobitems_blaze_powder.png", }) @@ -56,8 +59,8 @@ end -- Chicken if c("chicken_raw") then minetest.register_craftitem("mobs_mc:chicken_raw", { - description = S("Raw Chicken"), - _doc_items_longdesc = S("Raw chicken is a food item and can be eaten safely. Cooking it will increase its nutritional value."), + description = "Raw Chicken", + _doc_items_longdesc = "Raw chicken is a food item and can be eaten safely. Cooking it will increase its nutritional value.", inventory_image = "mcl_mobitems_chicken_raw.png", groups = { food = 2, eatable = 2 }, on_use = minetest.item_eat(2), @@ -66,8 +69,8 @@ end if c("chicken_cooked") then minetest.register_craftitem("mobs_mc:chicken_cooked", { - description = S("Cooked Chicken"), - _doc_items_longdesc = S("A cooked chicken is a healthy food item which can be eaten."), + description = "Cooked Chicken", + _doc_items_longdesc = "A cooked chicken is a healthy food item which can be eaten.", inventory_image = "mcl_mobitems_chicken_cooked.png", groups = { food = 2, eatable = 6 }, on_use = minetest.item_eat(6), @@ -85,8 +88,8 @@ end if c("feather") then minetest.register_craftitem("mobs_mc:feather", { - description = S("Feather"), - _doc_items_longdesc = S("Feathers are used in crafting and are dropped from chickens."), + description = "Feather", + _doc_items_longdesc = "Feathers are used in crafting and are dropped from chickens.", inventory_image = "mcl_mobitems_feather.png", }) end @@ -94,8 +97,8 @@ end -- Cow and mooshroom if c("beef_raw") then minetest.register_craftitem("mobs_mc:beef_raw", { - description = S("Raw Beef"), - _doc_items_longdesc = S("Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value."), + description = "Raw Beef", + _doc_items_longdesc = "Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.", inventory_image = "mcl_mobitems_beef_raw.png", groups = { food = 2, eatable = 3 }, on_use = minetest.item_eat(3), @@ -104,8 +107,8 @@ end if c("beef_cooked") then minetest.register_craftitem("mobs_mc:beef_cooked", { - description = S("Steak"), - _doc_items_longdesc = S("Steak is cooked beef from cows and can be eaten."), + description = "Steak", + _doc_items_longdesc = "Steak is cooked beef from cows and can be eaten.", inventory_image = "mcl_mobitems_beef_cooked.png", groups = { food = 2, eatable = 8 }, on_use = minetest.item_eat(8), @@ -125,8 +128,8 @@ end if c("milk") then -- milk minetest.register_craftitem("mobs_mc:milk_bucket", { - description = S("Milk"), - _doc_items_longdesc = S("Milk is a food item obtained by using a bucket on a cow."), + description = "Milk", + _doc_items_longdesc = "Milk is a food item obtained by using a bucket on a cow.", inventory_image = "mobs_bucket_milk.png", groups = { food = 3, eatable = 1 }, on_use = minetest.item_eat(1, "bucket:bucket_empty"), @@ -136,8 +139,8 @@ end if c("bowl") then minetest.register_craftitem("mobs_mc:bowl", { - description = S("Bowl"), - _doc_items_longdesc = S("Bowls are mainly used to hold tasty soups."), + description = "Bowl", + _doc_items_longdesc = "Bowls are mainly used to hold tasty soups.", inventory_image = "mcl_core_bowl.png", }) @@ -158,8 +161,8 @@ end if c("mushroom_stew") then minetest.register_craftitem("mobs_mc:mushroom_stew", { - description = S("Mushroom Stew"), - _doc_items_longdesc = S("Mushroom stew is a healthy soup."), + description = "Mushroom Stew", + _doc_items_longdesc = "Mushroom stew is a healthy soup.", inventory_image = "farming_mushroom_stew.png", groups = { food = 3, eatable = 6 }, on_use = minetest.item_eat(6, "mobs_mc:bowl"), @@ -177,7 +180,7 @@ if c("dragon_egg") then --ender dragon minetest.register_node("mobs_mc:dragon_egg", { - description = S("Dragon Egg"), + description = "Dragon Egg", tiles = { "mcl_end_dragon_egg.png", "mcl_end_dragon_egg.png", @@ -221,7 +224,7 @@ end -- Enderman if c("ender_eye") then minetest.register_craftitem("mobs_mc:ender_eye", { - description = S("Eye of Ender"), + description = "Eye of Ender", _doc_items_longdesc = longdesc_craftitem, inventory_image = "mcl_end_ender_eye.png", groups = { craftitem = 1 }, @@ -239,8 +242,8 @@ end -- Ghast if c("ghast_tear") then minetest.register_craftitem("mobs_mc:ghast_tear", { - description = S("Ghast Tear"), - _doc_items_longdesc = S("A ghast tear is an item used in potion brewing. It is dropped from dead ghasts."), + description = "Ghast Tear", + _doc_items_longdesc = "A ghast tear is an item used in potion brewing. It is dropped from dead ghasts.", wield_image = "mcl_mobitems_ghast_tear.png", inventory_image = "mcl_mobitems_ghast_tear.png", groups = { brewitem = 1 }, @@ -251,9 +254,9 @@ end if c("saddle") then -- Overwrite the saddle from Mobs Redo minetest.register_craftitem(":mobs:saddle", { - description = S("Saddle"), - _doc_items_longdesc = S("Saddles can be put on horses, donkeys, mules and pigs in order to mount them."), - _doc_items_usagehelp = S("Rightclick an animal while holding a saddle to put on the saddle. You can now mount the animal by rightclicking it again."), + description = "Saddle", + _doc_items_longdesc = "Saddles can be put on horses, donkeys, mules and pigs in order to mount them.", + _doc_items_usagehelp = "Rightclick an animal while holding a saddle to put on the saddle. You can now mount the animal by rightclicking it again.", inventory_image = "mcl_mobitems_saddle.png", stack_max = 1, }) @@ -271,12 +274,12 @@ if c("saddle") and c("lether") and c("string") and c("iron_ingot") then end -- Horse Armor -local horse_armor_use = S("Rightclick a horse to put on the horse armor. Donkeys and mules can't wear horse armor.") +local horse_armor_use = "Rightclick a horse to put on the horse armor. Donkeys and mules can't wear horse armor." -- TODO: Balance the horse armor strength, compare with MC armor strength if c("iron_horse_armor") then minetest.register_craftitem("mobs_mc:iron_horse_armor", { - description = S("Iron Horse Armor"), - _doc_items_longdesc = S("Iron horse armor can be worn by horses to increase their protection from harm a bit."), + description = "Iron Horse Armor", + _doc_items_longdesc = "Iron horse armor can be worn by horses to increase their protection from harm a bit.", _doc_items_usagehelp = horse_armor_use, inventory_image = "mobs_mc_iron_horse_armor.png", _horse_overlay_image = "mobs_mc_horse_armor_iron.png", @@ -286,8 +289,8 @@ if c("iron_horse_armor") then end if c("gold_horse_armor") then minetest.register_craftitem("mobs_mc:gold_horse_armor", { - description = S("Golden Horse Armor"), - _doc_items_longdesc = S("Golden horse armor can be worn by horses to increase their protection from harm."), + description = "Golden Horse Armor", + _doc_items_longdesc = "Golden horse armor can be worn by horses to increase their protection from harm.", _doc_items_usagehelp = horse_armor_use, inventory_image = "mobs_mc_gold_horse_armor.png", _horse_overlay_image = "mobs_mc_horse_armor_gold.png", @@ -297,8 +300,8 @@ if c("gold_horse_armor") then end if c("diamond_horse_armor") then minetest.register_craftitem("mobs_mc:diamond_horse_armor", { - description = S("Diamond Horse Armor"), - _doc_items_longdesc = S("Diamond horse armor can be worn by horses to greatly increase their protection from harm."), + description = "Diamond Horse Armor", + _doc_items_longdesc = "Diamond horse armor can be worn by horses to greatly increase their protection from harm.", _doc_items_usagehelp = horse_armor_use, inventory_image = "mobs_mc_diamond_horse_armor.png", _horse_overlay_image = "mobs_mc_horse_armor_diamond.png", @@ -310,8 +313,8 @@ end -- Pig if c("porkchop_raw") then minetest.register_craftitem("mobs_mc:porkchop_raw", { - description = S("Raw Porkchop"), - _doc_items_longdesc = S("A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value."), + description = "Raw Porkchop", + _doc_items_longdesc = "A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.", inventory_image = "mcl_mobitems_porkchop_raw.png", groups = { food = 2, eatable = 3 }, on_use = minetest.item_eat(3), @@ -320,7 +323,7 @@ end if c("porkchop_cooked") then minetest.register_craftitem("mobs_mc:porkchop_cooked", { - description = S("Cooked Porkchop"), + description = "Cooked Porkchop", _doc_items_longdesc = "Cooked porkchop is the cooked flesh of a pig and is used as food.", inventory_image = "mcl_mobitems_porkchop_cooked.png", groups = { food = 2, eatable = 8 }, @@ -339,9 +342,9 @@ end if c("carrot_on_a_stick") then minetest.register_tool("mobs_mc:carrot_on_a_stick", { - description = S("Carrot on a Stick"), - _doc_items_longdesc = S("A carrot on a stick can be used on saddled pigs to ride them. Pigs will also follow anyone who holds a carrot on a stick near them."), - _doc_items_usagehelp = S("Rightclick a saddled pig with the carrot on a stick to mount it. You can now ride it like a horse."), + description = "Carrot on a Stick", + _doc_items_longdesc = "A carrot on a stick can be used on saddled pigs to ride them. Pigs will also follow anyone who holds a carrot on a stick near them.", + _doc_items_usagehelp = "Rightclick a saddled pig with the carrot on a stick to mount it. You can now ride it like a horse.", wield_image = "mcl_mobitems_carrot_on_a_stick.png", inventory_image = "mcl_mobitems_carrot_on_a_stick.png", sounds = { breaks = "default_tool_breaks" }, @@ -381,8 +384,8 @@ end -- Rabbit if c("rabbit_raw") then minetest.register_craftitem("mobs_mc:rabbit_raw", { - description = S("Raw Rabbit"), - _doc_items_longdesc = S("Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value."), + description = "Raw Rabbit", + _doc_items_longdesc = "Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.", inventory_image = "mcl_mobitems_rabbit_raw.png", groups = { food = 2, eatable = 3 }, on_use = minetest.item_eat(3), @@ -391,8 +394,8 @@ end if c("rabbit_cooked") then minetest.register_craftitem("mobs_mc:rabbit_cooked", { - description = S("Cooked Rabbit"), - _doc_items_longdesc = S("This is a food item which can be eaten."), + description = "Cooked Rabbit", + _doc_items_longdesc = "This is a food item which can be eaten.", inventory_image = "mcl_mobitems_rabbit_cooked.png", groups = { food = 2, eatable = 5 }, on_use = minetest.item_eat(5), @@ -410,8 +413,8 @@ end if c("rabbit_hide") then minetest.register_craftitem("mobs_mc:rabbit_hide", { - description = S("Rabbit Hide"), - _doc_items_longdesc = S("Rabbit hide is used to create leather."), + description = "Rabbit Hide", + _doc_items_longdesc = "Rabbit hide is used to create leather.", inventory_image = "mcl_mobitems_rabbit_hide.png" }) end @@ -428,8 +431,8 @@ end if c("rabbit_foot") then minetest.register_craftitem("mobs_mc:rabbit_foot", { - description = S("Rabbit's Foot"), - _doc_items_longdesc = S("This item is used in brewing."), + description = "Rabbit's Foot", + _doc_items_longdesc = "This item is used in brewing.", inventory_image = "mcl_mobitems_rabbit_foot.png" }) end @@ -437,8 +440,8 @@ end -- Sheep if c("mutton_raw") then minetest.register_craftitem("mobs_mc:mutton_raw", { - description = S("Raw Mutton"), - _doc_items_longdesc = S("Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value."), + description = "Raw Mutton", + _doc_items_longdesc = "Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.", inventory_image = "mcl_mobitems_mutton_raw.png", groups = { food = 2, eatable = 4 }, on_use = minetest.item_eat(4), @@ -447,8 +450,8 @@ end if c("mutton_cooked") then minetest.register_craftitem("mobs_mc:mutton_cooked", { - description = S("Cooked Mutton"), - _doc_items_longdesc = S("Cooked mutton is the cooked flesh from a sheep and is used as food."), + description = "Cooked Mutton", + _doc_items_longdesc = "Cooked mutton is the cooked flesh from a sheep and is used as food.", inventory_image = "mcl_mobitems_mutton_cooked.png", groups = { food = 2, eatable = 8 }, on_use = minetest.item_eat(8), @@ -467,8 +470,8 @@ end -- Shulker if c("shulker_shell") then minetest.register_craftitem("mobs_mc:shulker_shell", { - description = S("Shulker Shell"), - _doc_items_longdesc = S("Shulker shells are used in crafting. They are dropped from dead shulkers."), + description = "Shulker Shell", + _doc_items_longdesc = "Shulker shells are used in crafting. They are dropped from dead shulkers.", inventory_image = "mcl_mobitems_shulker_shell.png", groups = { craftitem = 1 }, }) @@ -477,8 +480,8 @@ end -- Magma cube if c("magma_cream") then minetest.register_craftitem("mobs_mc:magma_cream", { - description = S("Magma Cream"), - _doc_items_longdesc = S("Magma cream is a crafting component."), + description = "Magma Cream", + _doc_items_longdesc = "Magma cream is a crafting component.", wield_image = "mcl_mobitems_magma_cream.png", inventory_image = "mcl_mobitems_magma_cream.png", groups = { brewitem = 1 }, @@ -488,8 +491,8 @@ end -- Slime if c("slimeball") then minetest.register_craftitem("mobs_mc:slimeball", { - description = S("Slimeball"), - _doc_items_longdesc = S("Slimeballs are used in crafting. They are dropped from slimes."), + description = "Slimeball", + _doc_items_longdesc = "Slimeballs are used in crafting. They are dropped from slimes.", inventory_image = "mcl_mobitems_slimeball.png" }) if minetest.get_modpath("mesecons_materials") then @@ -503,8 +506,8 @@ end -- Spider if c("spider_eye") then minetest.register_craftitem("mobs_mc:spider_eye", { - description = S("Spider Eye"), - _doc_items_longdesc = S("Spider eyes are used mainly in crafting and brewing. Spider eyes can be eaten, but they poison you and reduce your health by 2 hit points."), + description = "Spider Eye", + _doc_items_longdesc = "Spider eyes are used mainly in crafting and brewing. Spider eyes can be eaten, but they poison you and reduce your health by 2 hit points.", inventory_image = "mcl_mobitems_spider_eye.png", wield_image = "mcl_mobitems_spider_eye.png", -- Simplified poisonous food @@ -589,8 +592,8 @@ end -- Rotten flesh if c("rotten_flesh") then minetest.register_craftitem("mobs_mc:rotten_flesh", { - description = S("Rotten Flesh"), - _doc_items_longdesc = S("Yuck! This piece of flesh clearly has seen better days. Eating it will only poison you and reduces your health by 4 hit points. But tamed wolves can eat it just fine."), + description = "Rotten Flesh", + _doc_items_longdesc = "Yuck! This piece of flesh clearly has seen better days. Eating it will only poison you and reduces your health by 4 hit points. But tamed wolves can eat it just fine.", inventory_image = "mcl_mobitems_rotten_flesh.png", -- Simplified poisonous food groups = { food = 2, eatable = -4 }, @@ -601,8 +604,8 @@ end -- Misc. if c("nether_star") then minetest.register_craftitem("mobs_mc:nether_star", { - description = S("Nether Star"), - _doc_items_longdesc = S("A nether star is a crafting component. It is dropped from the Wither."), + description = "Nether Star", + _doc_items_longdesc = "A nether star is a crafting component. It is dropped from the Wither.", inventory_image = "mcl_mobitems_nether_star.png" }) end @@ -630,9 +633,9 @@ end if c("bone") then minetest.register_craftitem("mobs_mc:bone", { - description = S("Bone"), - _doc_items_longdesc = S("Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient."), - _doc_items_usagehelp = S("Hold the bone in your hand near wolves to attract them. Rightclick the wolf to give it a bone and tame it."), + description = "Bone", + _doc_items_longdesc = "Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.", + _doc_items_usagehelp = "Hold the bone in your hand near wolves to attract them. Rightclick the wolf to give it a bone and tame it.", inventory_image = "mcl_mobitems_bone.png" }) if minetest.get_modpath("bones") then diff --git a/mods/ENTITIES/mobs_mc/2_throwing.lua b/mods/ENTITIES/mobs_mc/2_throwing.lua index 5173b5a96..59b03741b 100644 --- a/mods/ENTITIES/mobs_mc/2_throwing.lua +++ b/mods/ENTITIES/mobs_mc/2_throwing.lua @@ -3,6 +3,9 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes +-- NOTE: Strings intentionally not marked for translation, other mods already have these items. +-- TODO: Remove this file eventually, all items here are already outsourced in other mods. + local S = minetest.get_translator("mobs_mc") --maikerumines throwing code @@ -130,9 +133,9 @@ end if c("arrow") then minetest.register_craftitem("mobs_mc:arrow", { - description = S("Arrow"), - _doc_items_longdesc = S("Arrows are ammunition for bows."), - _doc_items_usagehelp = S("To use arrows as ammunition for a bow, put them in the inventory slot following the bow. Slots are counted left to right, top to bottom."), + description = "Arrow", + _doc_items_longdesc = "Arrows are ammunition for bows.", + _doc_items_usagehelp = "To use arrows as ammunition for a bow, put them in the inventory slot following the bow. Slots are counted left to right, top to bottom.", inventory_image = "mcl_bows_arrow_inv.png", }) end @@ -150,9 +153,9 @@ end if c("bow") then minetest.register_tool("mobs_mc:bow_wood", { - description = S("Bow"), - _doc_items_longdesc = S("Bows are ranged weapons to shoot arrows at your foes."), - _doc_items_usagehelp = S("To use the bow, you first need to have at least one arrow in slot following the bow. Leftclick to shoot. Each hit deals 3 damage."), + description = "Bow", + _doc_items_longdesc = "Bows are ranged weapons to shoot arrows at your foes.", + _doc_items_usagehelp = "To use the bow, you first need to have at least one arrow in slot following the bow. Leftclick to shoot. Each hit deals 3 damage.", inventory_image = "mcl_bows_bow.png", on_use = function(itemstack, user, pointed_thing) if throwing_shoot_arrow(itemstack, user, pointed_thing) then @@ -289,8 +292,8 @@ if c("egg") then end minetest.register_craftitem("mobs_mc:egg", { - description = S("Egg"), - _doc_items_longdesc = S("Eggs can be thrown and break on impact. There is a small chance that 1 or even 4 chicks will pop out"), + description = "Egg", + _doc_items_longdesc = "Eggs can be thrown and break on impact. There is a small chance that 1 or even 4 chicks will pop out", _doc_items_usagehelp = how_to_throw, inventory_image = "mobs_chicken_egg.png", on_use = mobs_shoot_egg, @@ -375,8 +378,8 @@ if c("snowball") then -- Snowball minetest.register_craftitem("mobs_mc:snowball", { - description = S("Snowball"), - _doc_items_longdesc = S("Snowballs can be thrown at your enemies. A snowball deals 3 damage to blazes, but is harmless to anything else."), + description = "Snowball", + _doc_items_longdesc = "Snowballs can be thrown at your enemies. A snowball deals 3 damage to blazes, but is harmless to anything else.", _doc_items_usagehelp = how_to_throw, inventory_image = "mcl_throwing_snowball.png", on_use = mobs_shoot_snowball, diff --git a/mods/ENTITIES/mobs_mc/4_heads.lua b/mods/ENTITIES/mobs_mc/4_heads.lua index b60cd168e..01b8ee577 100644 --- a/mods/ENTITIES/mobs_mc/4_heads.lua +++ b/mods/ENTITIES/mobs_mc/4_heads.lua @@ -1,6 +1,9 @@ --MC Heads for minetest --maikerumine +-- NOTE: Strings intentionally not marked for translation, other mods already have these items. +-- TODO: Remove this file eventually, all items here are already outsourced in other mods. + local S = minetest.get_translator("mobs_mc") -- Heads system @@ -53,7 +56,7 @@ local function addhead(mobname, desc, longdesc) end -- Add heads -addhead("zombie", S("Zombie Head"), S("A zombie head is a small decorative block which resembles the head of a zombie.")) -addhead("creeper", S("Creeper Head"), S("A creeper head is a small decorative block which resembles the head of a creeper.")) -addhead("skeleton", S("Skeleton Skull"), S("A skeleton skull is a small decorative block which resembles the skull of a skeleton.")) -addhead("wither_skeleton", S("Wither Skeleton Skull"), S("A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton.")) +addhead("zombie", "Zombie Head", "A zombie head is a small decorative block which resembles the head of a zombie.") +addhead("creeper", "Creeper Head", "A creeper head is a small decorative block which resembles the head of a creeper.") +addhead("skeleton", "Skeleton Skull", "A skeleton skull is a small decorative block which resembles the skull of a skeleton.") +addhead("wither_skeleton", "Wither Skeleton Skull", "A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton.") diff --git a/mods/ENTITIES/mobs_mc/silverfish.lua b/mods/ENTITIES/mobs_mc/silverfish.lua index 77415b400..7f19d9a2c 100644 --- a/mods/ENTITIES/mobs_mc/silverfish.lua +++ b/mods/ENTITIES/mobs_mc/silverfish.lua @@ -58,7 +58,7 @@ if minetest.get_modpath("default") and mobs_mc.create_monster_egg_nodes then end end minetest.register_node("mobs_mc:monster_egg_stone", { - description = S("Stone Monster Egg"), + description = "Stone Monster Egg", tiles = {"default_stone.png"}, groups = {oddly_breakable_by_hand = 2, spawns_silverfish = 1}, drop = '', @@ -68,7 +68,7 @@ if minetest.get_modpath("default") and mobs_mc.create_monster_egg_nodes then }) minetest.register_node("mobs_mc:monster_egg_cobble", { - description = S("Cobblestone Monster Egg"), + description = "Cobblestone Monster Egg", tiles = {"default_cobble.png"}, is_ground_content = false, groups = {oddly_breakable_by_hand = 2, spawns_silverfish = 1}, @@ -78,7 +78,7 @@ if minetest.get_modpath("default") and mobs_mc.create_monster_egg_nodes then }) minetest.register_node("mobs_mc:monster_egg_mossycobble", { - description = S("Mossy Cobblestone Monster Egg"), + description = "Mossy Cobblestone Monster Egg", tiles = {"default_mossycobble.png"}, is_ground_content = false, groups = {oddly_breakable_by_hand = 2, spawns_silverfish = 1}, @@ -88,7 +88,7 @@ if minetest.get_modpath("default") and mobs_mc.create_monster_egg_nodes then }) minetest.register_node("mobs_mc:monster_egg_stonebrick", { - description = S("Stone Brick Monster Egg"), + description = "Stone Brick Monster Egg", paramtype2 = "facedir", place_param2 = 0, tiles = {"default_stone_brick.png"}, @@ -100,7 +100,7 @@ if minetest.get_modpath("default") and mobs_mc.create_monster_egg_nodes then }) minetest.register_node("mobs_mc:monster_egg_stone_block", { - description = S("Stone Block Monster Egg"), + description = "Stone Block Monster Egg", tiles = {"default_stone_block.png"}, is_ground_content = false, groups = {oddly_breakable_by_hand = 2, spawns_silverfish = 1}, From 7c9126ace51eae0b545a93844d75287d38a30935 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 00:25:41 +0100 Subject: [PATCH 165/379] German translation: entities --- .../locale/mcl_falling_nodes.de.tr | 3 + .../mcl_minecarts/locale/mcl_minecarts.de.tr | 23 + mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr | 5 + mods/ENTITIES/mcl_mobs/locale/template.txt | 5 + mods/ENTITIES/mobs_mc/locale/de_DE.po | 742 ------------------ mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr | 54 ++ mods/ENTITIES/mobs_mc/locale/template.pot | 647 --------------- mods/ENTITIES/mobs_mc/locale/template.txt | 54 ++ 8 files changed, 144 insertions(+), 1389 deletions(-) create mode 100644 mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr create mode 100644 mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr create mode 100644 mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr create mode 100644 mods/ENTITIES/mcl_mobs/locale/template.txt delete mode 100644 mods/ENTITIES/mobs_mc/locale/de_DE.po create mode 100644 mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr delete mode 100644 mods/ENTITIES/mobs_mc/locale/template.pot create mode 100644 mods/ENTITIES/mobs_mc/locale/template.txt diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr new file mode 100644 index 000000000..66cf8a2ae --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +%s was smashed by a falling anvil.=%s wurde von einem fallenden Amboss zerschmettert. +%s was smashed by a falling block.=%s wurde von einem fallenden Block zerschmettert. diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr new file mode 100644 index 000000000..9eb3d1a8e --- /dev/null +++ b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_minecarts +Minecart=Lore +Minecarts can be used for a quick transportion on rails.=Loren können für eine schnelle Fahrt auf Schienen benutzt werden. +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.=Loren fahren nur auf Schienen und bleiben immer auf der Strecke. An einer Einmündung ohne einem Weg nach vorne fahren sie nach links. Die Geschwindigkeit hängt vom Schienentyp ab. +You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Sie können die Lore auf Schienen platzieren. Rechtsklicken, um einzusteigen. +To obtain the minecart, punch it while holding down the sneak key.=Um die Lore aufzusammeln, schlagen Sie sie, während Sie die Schleichen-Taste gedrückt halten. +Minecart with Chest=Lore mit Truhe +Minecart with Furnace=Lore mit Ofen +Minecart with Command Block=Lore mit Befehlsblock +Minecart with Hopper=Lore mit Trichter +Minecart with TNT=Lore mit 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.=Bauen Sie sie auf den Boden, um Ihre Schienennetzwerk zu errichten, die Schienen werden sich automatisch verbinden und sich nach Bedarf in Kurven, Einmündungen, Kreuzungen und Steigungen verwandeln. +Rail=Schiene +Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=Schienen können benutzt werden, um Strecken für Loren zu bauen. Normale Schienen werden Loren aufgrund von Reibung leicht verlangsamen. +Powered Rail=Antriebsschiene +Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Schienen können benutzt werden, um Strecken für Loren zu bauen. Antribsschienen können Loren beschleunigen und abbremsen. +Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Ohne Redstone-Energie wird die Schiene Loren abbremsen. Mit Redstone-Energie wird sie sie beschleunigen. +Activator Rail=Aktivierungsschiene +Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Schienen können benutzt werden, um Strecken für Loren zu bauen. Aktivierungsschienen werden benutzt, um besondere Loren zu aktivieren. +To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Wenn diese Schiene mit Redstone-Energie versorgt wird, werden alle Loren, die sie passieren, aktiviert. +Detector Rail=Sensorschiene +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.=Schienen können benutzt werden, um Strecken für Loren zu bauen. Eine Sensorschiene kann eine Lore erkennen und versorgt Redstone-Mechanismen. +To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Um eine Lore zu erkennen und die Redstone-Energie zu aktivieren, verbinden Sie die Schiene mit Redstonestaub oder Redstone-Mechanismen und schicken Sie eine beliebige Lore über die Schiene. diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr new file mode 100644 index 000000000..b5f4d702a --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_mobs +Peaceful mode active! No monsters will spawn.=Friedlicher Modus aktiv! Es werden keine Monster auftauchen. +This allows you to place a single mob.=Damit kann man eine Mob platzieren. +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.=Platzieren Sie dies einfach dort, wo der Mob auftauchen soll. Tiere werden zahm erscheinen, außer, wenn Sie beim Platzieren die Schlichtaste drücken. Platzieren Sie dies auf einem Mobspawner, um den Mob im Mobspawner zu wechseln. +You need the “maphack” privilege to change the mob spawner.=Sie brauchen das „maphack“-Privileg, um den Mobspawner ändern zu können. diff --git a/mods/ENTITIES/mcl_mobs/locale/template.txt b/mods/ENTITIES/mcl_mobs/locale/template.txt new file mode 100644 index 000000000..66565375d --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mcl_mobs +Peaceful mode active! No monsters will spawn.= +This allows you to place a single 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.= +You need the “maphack” privilege to change the mob spawner.= diff --git a/mods/ENTITIES/mobs_mc/locale/de_DE.po b/mods/ENTITIES/mobs_mc/locale/de_DE.po deleted file mode 100644 index 21ce7900d..000000000 --- a/mods/ENTITIES/mobs_mc/locale/de_DE.po +++ /dev/null @@ -1,742 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-01-25 18:45+0100\n" -"PO-Revision-Date: 2018-01-25 18:48+0100\n" -"Last-Translator: Wuzzy \n" -"Language-Team: \n" -"Language: de_DE\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.5\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: 1_items_default.lua -msgid "Blaze Rod" -msgstr "Lohenrute" - -#: 1_items_default.lua -msgid "This is a crafting component dropped from dead blazes." -msgstr "Dies ist eine Fertigungskomponente, welche von toten Lohen abfällt." - -#: 1_items_default.lua -msgid "Blaze Powder" -msgstr "Lohenstaub" - -#: 1_items_default.lua -msgid "This item is mainly used for brewing potions and crafting." -msgstr "" -"Dieser Gegenstand wird hauptsächlich für die Trankzubereitung und die " -"Fertigung benutzt." - -#: 1_items_default.lua -msgid "Raw Chicken" -msgstr "Rohes Hühnchen" - -#: 1_items_default.lua -msgid "" -"Raw chicken is a food item and can be eaten safely. Cooking it will increase " -"its nutritional value." -msgstr "" -"Rohes Hühnchen ist ein Lebensmittel und kann problemlos gegessen werden. Es " -"kann gegart werden, um den Nährwert zu erhöhen." - -#: 1_items_default.lua -msgid "Cooked Chicken" -msgstr "Gebratenes Hühnchen" - -#: 1_items_default.lua -msgid "A cooked chicken is a healthy food item which can be eaten." -msgstr "Ein gekochtes Hühnchen ist ein gesundes essbares Lebensmittel." - -#: 1_items_default.lua -msgid "Feather" -msgstr "Feder" - -#: 1_items_default.lua -msgid "Feathers are used in crafting and are dropped from chickens." -msgstr "" -"Federn werden für die Fertigung benutzt und werden von Hühnern fallen " -"gelassen." - -#: 1_items_default.lua -msgid "Raw Beef" -msgstr "Rohes Rindfleisch" - -#: 1_items_default.lua -msgid "" -"Raw beef is the flesh from cows and can be eaten safely. Cooking it will " -"greatly increase its nutritional value." -msgstr "" -"Rohes Rindfleisch ist das Fleisch von Kühen und kann problemlos gegessen " -"werden. Es kann gegart werden, um den Nährwert deutlich zu erhöhen." - -#: 1_items_default.lua -msgid "Steak" -msgstr "Steak" - -#: 1_items_default.lua -msgid "Steak is cooked beef from cows and can be eaten." -msgstr "Steak ist gebratenes Rindfleisch und kann gegessen werden." - -#: 1_items_default.lua -msgid "Milk" -msgstr "Milch" - -#: 1_items_default.lua -msgid "Milk is a food item obtained by using a bucket on a cow." -msgstr "" -"Milch ist ein Lebensmittel, das man erhält, wenn man einen Eimer an einer " -"Kuh benutzt." - -#: 1_items_default.lua -msgid "Bowl" -msgstr "Schale" - -#: 1_items_default.lua -msgid "Bowls are mainly used to hold tasty soups." -msgstr "Schüsseln werden benutzt, um leckere Suppen zu transportieren." - -#: 1_items_default.lua -msgid "Mushroom Stew" -msgstr "Pilzsuppe" - -#: 1_items_default.lua -msgid "Mushroom stew is a healthy soup." -msgstr "Pilzsuppe ist ein leckeres Gericht." - -#: 1_items_default.lua -msgid "Dragon Egg" -msgstr "Drachenei" - -#: 1_items_default.lua -msgid "Eye of Ender" -msgstr "Enderauge" - -#: 1_items_default.lua -msgid "Ghast Tear" -msgstr "Ghastträne" - -#: 1_items_default.lua -msgid "" -"A ghast tear is an item used in potion brewing. It is dropped from dead " -"ghasts." -msgstr "" -"Eine Ghastträne kann für die Trankzubereitung benutzt werden. Sie wird von " -"toten Ghasts abgeworfen." - -#: 1_items_default.lua -msgid "Saddle" -msgstr "Sattel" - -#: 1_items_default.lua -msgid "" -"Saddles can be put on horses, donkeys, mules and pigs in order to mount them." -msgstr "" -"Sattel können auf Pferden, Eseln, Maultieren und Schweinen platziert werden, " -"um sich aufzusatteln." - -#: 1_items_default.lua -msgid "" -"Rightclick an animal while holding a saddle to put on the saddle. You can " -"now mount the animal by rightclicking it again." -msgstr "" -"Rechtsklick auf ein Tier mit einem Sattel in der Hand, um den Sattel zu " -"platzieren. Sie können sich nun mit Rechtsklick auf das Tier setzen." - -#: 1_items_default.lua -msgid "" -"Rightclick a horse to put on the horse armor. Donkeys and mules can't wear " -"horse armor." -msgstr "" -"Rechts auf ein Pferd klicken, um die Pferderüstung zu benutzen. Das " -"funktioniert nicht mit Eseln und Maultieren." - -#: 1_items_default.lua -msgid "Iron Horse Armor" -msgstr "Eiserne Pferderüstung" - -#: 1_items_default.lua -msgid "" -"Iron horse armor can be worn by horses to increase their protection from " -"harm a bit." -msgstr "" -"Die Eisenpferderüstung kann von Pferden getragen werden, um sie etwas vor " -"Schaden zu schützen." - -#: 1_items_default.lua -msgid "Golden Horse Armor" -msgstr "Goldene Pferderüstung" - -#: 1_items_default.lua -msgid "" -"Golden horse armor can be worn by horses to increase their protection from " -"harm." -msgstr "" -"Die Goldpferderüstung kann von Pferden getragen werden, um sie vor Schaden " -"zu schützen." - -#: 1_items_default.lua -msgid "Diamond Horse Armor" -msgstr "Diamantene Pferderüstung" - -#: 1_items_default.lua -msgid "" -"Diamond horse armor can be worn by horses to greatly increase their " -"protection from harm." -msgstr "" -"Die Diamantpferderüstung kann von Pferden getragen werden, um ihre " -"Schadenstoleranz stark zu erhöhen." - -#: 1_items_default.lua -msgid "Raw Porkchop" -msgstr "Rohes Schweinefleisch" - -#: 1_items_default.lua -msgid "" -"A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it " -"will greatly increase its nutritional value." -msgstr "" -"Ein rohes Stück Schweinefleisch kann bedenkenlos gegessen werden. Man kann " -"es braten, um seinen Nährwert stark zu erhöhen." - -#: 1_items_default.lua -msgid "Cooked Porkchop" -msgstr "Gebratenes Schweinefleisch" - -#: 1_items_default.lua -msgid "Carrot on a Stick" -msgstr "Karottenrute" - -#: 1_items_default.lua -msgid "" -"A carrot on a stick can be used on saddled pigs to ride them. Pigs will also " -"follow anyone who holds a carrot on a stick near them." -msgstr "" -"Eine Karottenrute kann auf gesattelten Schweinen angewendet werden, um sie " -"zu reiten. Schweine folgen auch jeden, der eine Karottenrüte trägt." - -#: 1_items_default.lua -msgid "" -"Rightclick a saddled pig with the carrot on a stick to mount it. You can now " -"ride it like a horse." -msgstr "" -"Rechts auf ein gesatteltes Schwein klicken, um sich draufzusetzen. Jetzt " -"kann das Schwein wie ein Pferd geritten werden." - -#: 1_items_default.lua -msgid "Raw Rabbit" -msgstr "Rohes Kaninchen" - -#: 1_items_default.lua -msgid "" -"Raw rabbit is a food item from a dead rabbit. It can be eaten safely. " -"Cooking it will increase its nutritional value." -msgstr "" -"Rohes Kaninchenfleisch ist ein Lebensmittel, welches bedenkenlos verzehrt " -"werden kann. Es kann gebraten werden, um seinen Nährwert zu erhöhen." - -#: 1_items_default.lua -msgid "Cooked Rabbit" -msgstr "Gebratenes Kaninchen" - -#: 1_items_default.lua -msgid "This is a food item which can be eaten." -msgstr "Dies ist ein Lebensmittel." - -#: 1_items_default.lua -msgid "Rabbit Hide" -msgstr "Kaninchenfell" - -#: 1_items_default.lua -msgid "Rabbit hide is used to create leather." -msgstr "Aus Kaninchenfellen wird Leder gefertigt." - -#: 1_items_default.lua -msgid "Rabbit's Foot" -msgstr "Hasenpfote" - -#: 1_items_default.lua -msgid "This item is used in brewing." -msgstr "Dieser Gegenstand wird zum Brauen benutzt." - -#: 1_items_default.lua -msgid "Raw Mutton" -msgstr "Rohes Hammelfleisch" - -#: 1_items_default.lua -msgid "" -"Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it " -"will greatly increase its nutritional value." -msgstr "" -"Rohes Hammelfleisch ist das Fleisch eines Schafes und ein Lebensmittel, " -"welches bedenkenlos verzehrt werden kann. Es kann gebraten werden, um seinen " -"Nährwert deutlich zu erhöhen." - -#: 1_items_default.lua -msgid "Cooked Mutton" -msgstr "Gebratenes Hammelfleisch" - -#: 1_items_default.lua -msgid "Cooked mutton is the cooked flesh from a sheep and is used as food." -msgstr "" -"Gebratenes Hammelfleisch ist das gebratene Fleisch eines Schafs und dient " -"als Lebensmittel." - -#: 1_items_default.lua -msgid "Shulker Shell" -msgstr "Shulkerschale" - -#: 1_items_default.lua -msgid "" -"Shulker shells are used in crafting. They are dropped from dead shulkers." -msgstr "" -"Shulkerschalen werden für die Fertigung verwendet. Sie werden von toten " -"Shulkern fallen gelassen." - -#: 1_items_default.lua -msgid "Magma Cream" -msgstr "Magmacreme" - -#: 1_items_default.lua -msgid "Magma cream is a crafting component." -msgstr "Magmacreme wird zum Fertigen benutzt." - -#: 1_items_default.lua -msgid "Slimeball" -msgstr "Schleimkugel" - -#: 1_items_default.lua -msgid "Slimeballs are used in crafting. They are dropped from slimes." -msgstr "" -"Schleimkugeln werden in der Fertigung benutzt. Sie werden von Schleimen " -"fallen gelassen." - -#: 1_items_default.lua -msgid "Spider Eye" -msgstr "Spinnenauge" - -#: 1_items_default.lua -msgid "" -"Spider eyes are used mainly in crafting and brewing. Spider eyes can be " -"eaten, but they poison you and reduce your health by 2 hit points." -msgstr "" -"Spinnenaugen werden hauptsächlich für die Fertigung und die Trankzubereitung " -"benutzt. Spinnenaugen können gegessen werden, aber sie vergiften Sie und Sie " -"verlieren 2 Trefferpunkte." - -#: 1_items_default.lua -msgid "Totem of Undying" -msgstr "Totem der Unsterblichkeit" - -#: 1_items_default.lua -msgid "" -"A totem of undying is a rare artifact which may safe you from certain death." -msgstr "" -"Ein Totem der Unsterblichkeit ist ein seltenes Artefakt, welches Sie vor dem " -"sicheren Tod bewahren kann." - -#: 1_items_default.lua -msgid "" -"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." -msgstr "" -"Der Totem funktioniert nur, während Sie ihn in der Hand halten. Wenn sie " -"tödlichen Schaden erhalten, werden Sie vom Tod bewahrt und erhalten eine " -"zweite Lebenschance mit 1 HP. Der Totem geht dabei jedoch zu Bruch." - -#: 1_items_default.lua -msgid "Rotten Flesh" -msgstr "Verrottetes Fleisch" - -#: 1_items_default.lua -msgid "" -"Yuck! This piece of flesh clearly has seen better days. Eating it will only " -"poison you and reduces your health by 4 hit points. But tamed wolves can eat " -"it just fine." -msgstr "" -"Igitt! Dieses Stück Fleisch hat wohl bessere Tage gesehen. Wenn Sie es " -"essen, werden Sie sofort vergiftet und erleiden einen Schaden von 4 " -"Trefferpunkten. Aber gezähmte Wölfe können es problemlos fressen." - -#: 1_items_default.lua -msgid "Nether Star" -msgstr "Netherstern" - -#: 1_items_default.lua -msgid "A nether star is a crafting component. It is dropped from the Wither." -msgstr "" -"Ein Netherstern ist eine Fertigungskomponente. Er wird vom Wither abgeworfen." - -#: 1_items_default.lua -msgid "Bone" -msgstr "Knochen" - -#: 1_items_default.lua -msgid "" -"Bones can be used to tame wolves so they will protect you. They are also " -"useful as a crafting ingredient." -msgstr "" -"Knochen können benutzt werden, um Wölfe zu zähmen, damit sie einen " -"beschützen. Sie außerdem nützlich in der Fertigung." - -#: 1_items_default.lua -msgid "" -"Hold the bone in your hand near wolves to attract them. Rightclick the wolf " -"to give it a bone and tame it." -msgstr "" -"Halten Sie einen Knochen in der Nähe eines Wolfes, um ihn anzulocken. " -"Rechtsklick auf den Wolf, um ihn den Knochen zu geben un zu zähmen." - -#: 2_throwing.lua -msgid "Arrow" -msgstr "Pfeil" - -#: 2_throwing.lua -msgid "Arrows are ammunition for bows." -msgstr "Pfeile sind Munition für Bögen." - -#: 2_throwing.lua -msgid "" -"To use arrows as ammunition for a bow, put them in the inventory slot " -"following the bow. Slots are counted left to right, top to bottom." -msgstr "" -"Um Pfeile als Munition für einen Bogen zu benutzen, legen Sie sie in das " -"Inventarfeld, das dem des Bogens folgt. Inventarfelder werden von links nach " -"rechts, dann von oben nach unten gezählt." - -#: 2_throwing.lua -msgid "Bow" -msgstr "Bogen" - -#: 2_throwing.lua -msgid "Bows are ranged weapons to shoot arrows at your foes." -msgstr "Bögen sind Fernwaffen, um Pfeile auf Ihre Gegner zu schießen." - -#: 2_throwing.lua -msgid "" -"To use the bow, you first need to have at least one arrow in slot following " -"the bow. Leftclick to shoot. Each hit deals 3 damage." -msgstr "" -"Um den Bogen zu benutzen, brauchen Sie zuerest mindestens einen Pfeil in dem " -"Inventarfeld nach dem des Bogens. Linksklick zum Schießen. Jeder Treffer " -"richtet 3 Schaden an." - -#: 2_throwing.lua -msgid "Egg" -msgstr "Ei" - -#: 2_throwing.lua -msgid "" -"Eggs can be thrown and break on impact. There is a small chance that 1 or " -"even 4 chicks will pop out" -msgstr "" -"Eier können geworfen werden und zerbrechen bei einem Treffer. Es gibt eine " -"kleine Chance, dass 1 oder sogar 4 Küken auftauchen" - -#: 2_throwing.lua -msgid "Snowball" -msgstr "Schneeball" - -#: 2_throwing.lua -msgid "" -"Snowballs can be thrown at your enemies. A snowball deals 3 damage to " -"blazes, but is harmless to anything else." -msgstr "" -"Werfen Sie Schnebälle auf Ihre Feinde. Ein Schneeball richtet gegenüber " -"Lohen 3 Schaden an, ist aber harmlos für alles andere." - -#: 4_heads.lua -msgid "Zombie Head" -msgstr "Zombiekopf" - -#: 4_heads.lua -msgid "" -"A zombie head is a small decorative block which resembles the head of a " -"zombie." -msgstr "" -"Ein Zombiekopf ist ein kleiner dekorativer Block, der wie der Kopf eines " -"Zombies aussieht." - -#: 4_heads.lua -msgid "Creeper Head" -msgstr "Creeperkopf" - -#: 4_heads.lua -msgid "" -"A creeper head is a small decorative block which resembles the head of a " -"creeper." -msgstr "" -"Ein Creeperkopf ist ein kleiner dekorativer Block, der wie der Kopf eines " -"Creeper aussieht." - -#: 4_heads.lua -msgid "Skeleton Skull" -msgstr "Skelettschädel" - -#: 4_heads.lua -msgid "" -"A skeleton skull is a small decorative block which resembles the skull of a " -"skeleton." -msgstr "" -"Ein Skelettschädel ist ein kleiner dekorativer Block, der wie der Schädel " -"eines Skeletts aussieht." - -#: 4_heads.lua -msgid "Wither Skeleton Skull" -msgstr "Witherskelettschädel" - -#: 4_heads.lua -msgid "" -"A wither skeleton skull is a small decorative block which resembles the " -"skull of a wither skeleton." -msgstr "" -"Ein Witherskelettschädel ist ein kleiner dekorativer Block, der wie der " -"Schädel eines Witherskeletts aussieht." - -#: agent.lua -msgid "Agent" -msgstr "Agent" - -#: bat.lua -msgid "Bat" -msgstr "Fledermaus" - -#: blaze.lua -msgid "Blaze" -msgstr "Lohe" - -#: chicken.lua -msgid "Chicken" -msgstr "Huhn" - -#: cow+mooshroom.lua -msgid "Cow" -msgstr "Kuh" - -#: cow+mooshroom.lua -msgid "Mooshroom" -msgstr "Mooshroom" - -#: creeper.lua -msgid "Creeper" -msgstr "Creeper" - -#: ender_dragon.lua -msgid "Ender Dragon" -msgstr "Enderdrache" - -#: enderman.lua -msgid "Enderman" -msgstr "Enderman" - -#: endermite.lua -msgid "Endermite" -msgstr "Endermite" - -#: ghast.lua -msgid "Ghast" -msgstr "Ghast" - -#: guardian_elder.lua -msgid "Elder Guardian" -msgstr "Großer Wächter" - -#: guardian.lua -msgid "Guardian" -msgstr "Wächter" - -#: horse.lua -msgid "Horse" -msgstr "Pferd" - -#: horse.lua -msgid "Skeleton Horse" -msgstr "Skelettpferd" - -#: horse.lua -msgid "Zombie Horse" -msgstr "Zombiepferd" - -#: horse.lua -msgid "Donkey" -msgstr "Esel" - -#: horse.lua -msgid "Mule" -msgstr "Maultier" - -#: iron_golem.lua -msgid "Iron Golem" -msgstr "Eisengolem" - -#: llama.lua -msgid "Llama" -msgstr "Lama" - -#: ocelot.lua -msgid "Ocelot" -msgstr "Ozelot" - -#: parrot.lua -msgid "Parrot" -msgstr "Papagei" - -#: pig.lua -msgid "Pig" -msgstr "Schwein" - -#: polar_bear.lua -msgid "Polar Bear" -msgstr "Eisbär" - -#: rabbit.lua -msgid "Rabbit" -msgstr "Kaninchen" - -#: rabbit.lua -msgid "Killer Bunny" -msgstr "Killer-Kaninchen" - -#: sheep.lua -msgid "Sheep" -msgstr "Schaf" - -#: shulker.lua -msgid "Shulker" -msgstr "Shulker" - -#: silverfish.lua -msgid "Silverfish" -msgstr "Silberfischchen" - -#: silverfish.lua -msgid "Stone Monster Egg" -msgstr "Silberfischchen-Stein" - -#: silverfish.lua -msgid "Cobblestone Monster Egg" -msgstr "Silberfischchen-Bruchstein" - -#: silverfish.lua -msgid "Mossy Cobblestone Monster Egg" -msgstr "Bemooster Silberfischchen-Bruchstein" - -#: silverfish.lua -msgid "Stone Brick Monster Egg" -msgstr "Silberfischchen-Steinziegel" - -#: silverfish.lua -msgid "Stone Block Monster Egg" -msgstr "Silberfischchen-Steinblock" - -#: skeleton+stray.lua -msgid "Skeleton" -msgstr "Skelett" - -#: skeleton+stray.lua -msgid "Stray" -msgstr "Eiswanderer" - -#: skeleton_wither.lua -msgid "Wither Skeleton" -msgstr "Witherskelett" - -#: slime+magma_cube.lua -msgid "Magma Cube" -msgstr "Magmawürfel" - -#: slime+magma_cube.lua -msgid "Slime" -msgstr "Schleim" - -#: snowman.lua -msgid "Snow Golem" -msgstr "Schneegolem" - -#: spider.lua -msgid "Spider" -msgstr "Spinne" - -#: spider.lua -msgid "Cave Spider" -msgstr "Höhlenspinne" - -#: squid.lua -msgid "Squid" -msgstr "Tintenfisch" - -#: vex.lua -msgid "Vex" -msgstr "Plagegeist" - -#: villager_evoker.lua -msgid "Evoker" -msgstr "Magier" - -#: villager_illusioner.lua -msgid "Illusioner" -msgstr "Illusionist" - -#: villager.lua -msgid "Villager" -msgstr "Dorfbewohner" - -#: villager_vindicator.lua -msgid "Vindicator" -msgstr "Diener" - -#: villager_zombie.lua -msgid "Zombie Villager" -msgstr "Dorfbewohnerzombie" - -#: witch.lua -msgid "Witch" -msgstr "Hexe" - -#: wither.lua -msgid "Wither" -msgstr "Wither" - -#: wolf.lua -msgid "Wolf" -msgstr "Wolf" - -#: zombie.lua -msgid "Husk" -msgstr "Wüstenzombie" - -#: zombie.lua -msgid "Zombie" -msgstr "Zombie" - -#: zombiepig.lua -msgid "Zombie Pigman" -msgstr "Schweinezombie" - -#~ msgid "" -#~ "Hold it in your hand and punch once to instantly get back to full health. " -#~ "The totem gets destroyed in the process." -#~ msgstr "" -#~ "Halten Sie es in der Hand und schlagen Sie zu, um sofort auf die volle " -#~ "Gesundheit zu kommen. Das zerstört das Totem." - -#~ msgid "Enderman Head (WIP)" -#~ msgstr "Endermankopf (unfertig)" - -#~ msgid "Ghast Head (WIP)" -#~ msgstr "Ghastkopf (unfertig)" - -#~ msgid "Spider Head (WIP)" -#~ msgstr "Spinnenkopf (unfertig)" - -#~ msgid "Zombie Pigman Head (WIP)" -#~ msgstr "Schweinezombiekopf (unfertig)" diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr new file mode 100644 index 000000000..97ce2d4c9 --- /dev/null +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr @@ -0,0 +1,54 @@ +# textdomain: mobs_mc +Totem of Undying=Totem der Unsterblichkeit +A totem of undying is a rare artifact which may safe you from certain death.=Ein Totem der Unsterblichkeit ist ein seltenes Artefakt, dass Sie vor dem sicheren Tod bewahren kann. +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.=Der Totem funktioneirt nur, während Sie ihn halten. Wenn Sie normalerweise tödlich hohen Schaden erhalten, werden Sie vor dem Tod bewahrt und Sie erhalten eine zweite Chance mit 1 TP. Der Totem wird dabei zerstört. +Agent=Akteur +Bat=Fledermaus +Blaze=Lohe +Chicken=Huhn +Cow=Kuh +Mooshroom=Pilzkuh +Creeper=Creeper +Ender Dragon=Enderdrache +Enderman=Enderman +Endermite=Endermilbe +Ghast=Ghast +Elder Guardian=Großer Wächter +Guardian=Wächter +Horse=Pferd +Skeleton Horse=Skelettpferd +Zombie Horse=Zombiepferd +Donkey=Esel +Mule=Maultier +Iron Golem=Eisengolem +Llama=Lama +Ocelot=Ozelot +Parrot=Papagei +Pig=Schwein +Polar Bear=Eisbär +Rabbit=Kaninchen +Killer Bunny=Killerkaninchen +Sheep=Schaf +Shulker=Shulber +Silverfish=Silberfischchen +Skeleton=Skelett +Stray=Eiswanderer +Wither Skeleton=Witherskelett +Magma Cube=Magmakubus +Slime=Schleim +Snow Golem=Schneegolem +Spider=Spinne +Cave Spider=Höhlenspinne +Squid=Tintenfisch +Vex=Plagegeist +Evoker=Magier +Illusioner=Illusionist +Villager=Dorfbewohner +Vindicator=Diener +Zombie Villager=Dorfbewohnerzombie +Witch=Hexe +Wither=Wither +Wolf=Wolf +Husk=Wüstenzombie +Zombie=Zombie +Zombie Pigman=Schweinezombie diff --git a/mods/ENTITIES/mobs_mc/locale/template.pot b/mods/ENTITIES/mobs_mc/locale/template.pot deleted file mode 100644 index f89dc24a7..000000000 --- a/mods/ENTITIES/mobs_mc/locale/template.pot +++ /dev/null @@ -1,647 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-01-25 18:45+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: 1_items_default.lua -msgid "Blaze Rod" -msgstr "" - -#: 1_items_default.lua -msgid "This is a crafting component dropped from dead blazes." -msgstr "" - -#: 1_items_default.lua -msgid "Blaze Powder" -msgstr "" - -#: 1_items_default.lua -msgid "This item is mainly used for brewing potions and crafting." -msgstr "" - -#: 1_items_default.lua -msgid "Raw Chicken" -msgstr "" - -#: 1_items_default.lua -msgid "" -"Raw chicken is a food item and can be eaten safely. Cooking it will increase " -"its nutritional value." -msgstr "" - -#: 1_items_default.lua -msgid "Cooked Chicken" -msgstr "" - -#: 1_items_default.lua -msgid "A cooked chicken is a healthy food item which can be eaten." -msgstr "" - -#: 1_items_default.lua -msgid "Feather" -msgstr "" - -#: 1_items_default.lua -msgid "Feathers are used in crafting and are dropped from chickens." -msgstr "" - -#: 1_items_default.lua -msgid "Raw Beef" -msgstr "" - -#: 1_items_default.lua -msgid "" -"Raw beef is the flesh from cows and can be eaten safely. Cooking it will " -"greatly increase its nutritional value." -msgstr "" - -#: 1_items_default.lua -msgid "Steak" -msgstr "" - -#: 1_items_default.lua -msgid "Steak is cooked beef from cows and can be eaten." -msgstr "" - -#: 1_items_default.lua -msgid "Milk" -msgstr "" - -#: 1_items_default.lua -msgid "Milk is a food item obtained by using a bucket on a cow." -msgstr "" - -#: 1_items_default.lua -msgid "Bowl" -msgstr "" - -#: 1_items_default.lua -msgid "Bowls are mainly used to hold tasty soups." -msgstr "" - -#: 1_items_default.lua -msgid "Mushroom Stew" -msgstr "" - -#: 1_items_default.lua -msgid "Mushroom stew is a healthy soup." -msgstr "" - -#: 1_items_default.lua -msgid "Dragon Egg" -msgstr "" - -#: 1_items_default.lua -msgid "Eye of Ender" -msgstr "" - -#: 1_items_default.lua -msgid "Ghast Tear" -msgstr "" - -#: 1_items_default.lua -msgid "" -"A ghast tear is an item used in potion brewing. It is dropped from dead " -"ghasts." -msgstr "" - -#: 1_items_default.lua -msgid "Saddle" -msgstr "" - -#: 1_items_default.lua -msgid "" -"Saddles can be put on horses, donkeys, mules and pigs in order to mount them." -msgstr "" - -#: 1_items_default.lua -msgid "" -"Rightclick an animal while holding a saddle to put on the saddle. You can " -"now mount the animal by rightclicking it again." -msgstr "" - -#: 1_items_default.lua -msgid "" -"Rightclick a horse to put on the horse armor. Donkeys and mules can't wear " -"horse armor." -msgstr "" - -#: 1_items_default.lua -msgid "Iron Horse Armor" -msgstr "" - -#: 1_items_default.lua -msgid "" -"Iron horse armor can be worn by horses to increase their protection from " -"harm a bit." -msgstr "" - -#: 1_items_default.lua -msgid "Golden Horse Armor" -msgstr "" - -#: 1_items_default.lua -msgid "" -"Golden horse armor can be worn by horses to increase their protection from " -"harm." -msgstr "" - -#: 1_items_default.lua -msgid "Diamond Horse Armor" -msgstr "" - -#: 1_items_default.lua -msgid "" -"Diamond horse armor can be worn by horses to greatly increase their " -"protection from harm." -msgstr "" - -#: 1_items_default.lua -msgid "Raw Porkchop" -msgstr "" - -#: 1_items_default.lua -msgid "" -"A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it " -"will greatly increase its nutritional value." -msgstr "" - -#: 1_items_default.lua -msgid "Cooked Porkchop" -msgstr "" - -#: 1_items_default.lua -msgid "Carrot on a Stick" -msgstr "" - -#: 1_items_default.lua -msgid "" -"A carrot on a stick can be used on saddled pigs to ride them. Pigs will also " -"follow anyone who holds a carrot on a stick near them." -msgstr "" - -#: 1_items_default.lua -msgid "" -"Rightclick a saddled pig with the carrot on a stick to mount it. You can now " -"ride it like a horse." -msgstr "" - -#: 1_items_default.lua -msgid "Raw Rabbit" -msgstr "" - -#: 1_items_default.lua -msgid "" -"Raw rabbit is a food item from a dead rabbit. It can be eaten safely. " -"Cooking it will increase its nutritional value." -msgstr "" - -#: 1_items_default.lua -msgid "Cooked Rabbit" -msgstr "" - -#: 1_items_default.lua -msgid "This is a food item which can be eaten." -msgstr "" - -#: 1_items_default.lua -msgid "Rabbit Hide" -msgstr "" - -#: 1_items_default.lua -msgid "Rabbit hide is used to create leather." -msgstr "" - -#: 1_items_default.lua -msgid "Rabbit's Foot" -msgstr "" - -#: 1_items_default.lua -msgid "This item is used in brewing." -msgstr "" - -#: 1_items_default.lua -msgid "Raw Mutton" -msgstr "" - -#: 1_items_default.lua -msgid "" -"Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it " -"will greatly increase its nutritional value." -msgstr "" - -#: 1_items_default.lua -msgid "Cooked Mutton" -msgstr "" - -#: 1_items_default.lua -msgid "Cooked mutton is the cooked flesh from a sheep and is used as food." -msgstr "" - -#: 1_items_default.lua -msgid "Shulker Shell" -msgstr "" - -#: 1_items_default.lua -msgid "" -"Shulker shells are used in crafting. They are dropped from dead shulkers." -msgstr "" - -#: 1_items_default.lua -msgid "Magma Cream" -msgstr "" - -#: 1_items_default.lua -msgid "Magma cream is a crafting component." -msgstr "" - -#: 1_items_default.lua -msgid "Slimeball" -msgstr "" - -#: 1_items_default.lua -msgid "Slimeballs are used in crafting. They are dropped from slimes." -msgstr "" - -#: 1_items_default.lua -msgid "Spider Eye" -msgstr "" - -#: 1_items_default.lua -msgid "" -"Spider eyes are used mainly in crafting and brewing. Spider eyes can be " -"eaten, but they poison you and reduce your health by 2 hit points." -msgstr "" - -#: 1_items_default.lua -msgid "Totem of Undying" -msgstr "" - -#: 1_items_default.lua -msgid "" -"A totem of undying is a rare artifact which may safe you from certain death." -msgstr "" - -#: 1_items_default.lua -msgid "" -"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." -msgstr "" - -#: 1_items_default.lua -msgid "Rotten Flesh" -msgstr "" - -#: 1_items_default.lua -msgid "" -"Yuck! This piece of flesh clearly has seen better days. Eating it will only " -"poison you and reduces your health by 4 hit points. But tamed wolves can eat " -"it just fine." -msgstr "" - -#: 1_items_default.lua -msgid "Nether Star" -msgstr "" - -#: 1_items_default.lua -msgid "A nether star is a crafting component. It is dropped from the Wither." -msgstr "" - -#: 1_items_default.lua -msgid "Bone" -msgstr "" - -#: 1_items_default.lua -msgid "" -"Bones can be used to tame wolves so they will protect you. They are also " -"useful as a crafting ingredient." -msgstr "" - -#: 1_items_default.lua -msgid "" -"Hold the bone in your hand near wolves to attract them. Rightclick the wolf " -"to give it a bone and tame it." -msgstr "" - -#: 2_throwing.lua -msgid "Arrow" -msgstr "" - -#: 2_throwing.lua -msgid "Arrows are ammunition for bows." -msgstr "" - -#: 2_throwing.lua -msgid "" -"To use arrows as ammunition for a bow, put them in the inventory slot " -"following the bow. Slots are counted left to right, top to bottom." -msgstr "" - -#: 2_throwing.lua -msgid "Bow" -msgstr "" - -#: 2_throwing.lua -msgid "Bows are ranged weapons to shoot arrows at your foes." -msgstr "" - -#: 2_throwing.lua -msgid "" -"To use the bow, you first need to have at least one arrow in slot following " -"the bow. Leftclick to shoot. Each hit deals 3 damage." -msgstr "" - -#: 2_throwing.lua -msgid "Egg" -msgstr "" - -#: 2_throwing.lua -msgid "" -"Eggs can be thrown and break on impact. There is a small chance that 1 or " -"even 4 chicks will pop out" -msgstr "" - -#: 2_throwing.lua -msgid "Snowball" -msgstr "" - -#: 2_throwing.lua -msgid "" -"Snowballs can be thrown at your enemies. A snowball deals 3 damage to " -"blazes, but is harmless to anything else." -msgstr "" - -#: 4_heads.lua -msgid "Zombie Head" -msgstr "" - -#: 4_heads.lua -msgid "" -"A zombie head is a small decorative block which resembles the head of a " -"zombie." -msgstr "" - -#: 4_heads.lua -msgid "Creeper Head" -msgstr "" - -#: 4_heads.lua -msgid "" -"A creeper head is a small decorative block which resembles the head of a " -"creeper." -msgstr "" - -#: 4_heads.lua -msgid "Skeleton Skull" -msgstr "" - -#: 4_heads.lua -msgid "" -"A skeleton skull is a small decorative block which resembles the skull of a " -"skeleton." -msgstr "" - -#: 4_heads.lua -msgid "Wither Skeleton Skull" -msgstr "" - -#: 4_heads.lua -msgid "" -"A wither skeleton skull is a small decorative block which resembles the " -"skull of a wither skeleton." -msgstr "" - -#: agent.lua -msgid "Agent" -msgstr "" - -#: bat.lua -msgid "Bat" -msgstr "" - -#: blaze.lua -msgid "Blaze" -msgstr "" - -#: chicken.lua -msgid "Chicken" -msgstr "" - -#: cow+mooshroom.lua -msgid "Cow" -msgstr "" - -#: cow+mooshroom.lua -msgid "Mooshroom" -msgstr "" - -#: creeper.lua -msgid "Creeper" -msgstr "" - -#: ender_dragon.lua -msgid "Ender Dragon" -msgstr "" - -#: enderman.lua -msgid "Enderman" -msgstr "" - -#: endermite.lua -msgid "Endermite" -msgstr "" - -#: ghast.lua -msgid "Ghast" -msgstr "" - -#: guardian_elder.lua -msgid "Elder Guardian" -msgstr "" - -#: guardian.lua -msgid "Guardian" -msgstr "" - -#: horse.lua -msgid "Horse" -msgstr "" - -#: horse.lua -msgid "Skeleton Horse" -msgstr "" - -#: horse.lua -msgid "Zombie Horse" -msgstr "" - -#: horse.lua -msgid "Donkey" -msgstr "" - -#: horse.lua -msgid "Mule" -msgstr "" - -#: iron_golem.lua -msgid "Iron Golem" -msgstr "" - -#: llama.lua -msgid "Llama" -msgstr "" - -#: ocelot.lua -msgid "Ocelot" -msgstr "" - -#: parrot.lua -msgid "Parrot" -msgstr "" - -#: pig.lua -msgid "Pig" -msgstr "" - -#: polar_bear.lua -msgid "Polar Bear" -msgstr "" - -#: rabbit.lua -msgid "Rabbit" -msgstr "" - -#: rabbit.lua -msgid "Killer Bunny" -msgstr "" - -#: sheep.lua -msgid "Sheep" -msgstr "" - -#: shulker.lua -msgid "Shulker" -msgstr "" - -#: silverfish.lua -msgid "Silverfish" -msgstr "" - -#: silverfish.lua -msgid "Stone Monster Egg" -msgstr "" - -#: silverfish.lua -msgid "Cobblestone Monster Egg" -msgstr "" - -#: silverfish.lua -msgid "Mossy Cobblestone Monster Egg" -msgstr "" - -#: silverfish.lua -msgid "Stone Brick Monster Egg" -msgstr "" - -#: silverfish.lua -msgid "Stone Block Monster Egg" -msgstr "" - -#: skeleton+stray.lua -msgid "Skeleton" -msgstr "" - -#: skeleton+stray.lua -msgid "Stray" -msgstr "" - -#: skeleton_wither.lua -msgid "Wither Skeleton" -msgstr "" - -#: slime+magma_cube.lua -msgid "Magma Cube" -msgstr "" - -#: slime+magma_cube.lua -msgid "Slime" -msgstr "" - -#: snowman.lua -msgid "Snow Golem" -msgstr "" - -#: spider.lua -msgid "Spider" -msgstr "" - -#: spider.lua -msgid "Cave Spider" -msgstr "" - -#: squid.lua -msgid "Squid" -msgstr "" - -#: vex.lua -msgid "Vex" -msgstr "" - -#: villager_evoker.lua -msgid "Evoker" -msgstr "" - -#: villager_illusioner.lua -msgid "Illusioner" -msgstr "" - -#: villager.lua -msgid "Villager" -msgstr "" - -#: villager_vindicator.lua -msgid "Vindicator" -msgstr "" - -#: villager_zombie.lua -msgid "Zombie Villager" -msgstr "" - -#: witch.lua -msgid "Witch" -msgstr "" - -#: wither.lua -msgid "Wither" -msgstr "" - -#: wolf.lua -msgid "Wolf" -msgstr "" - -#: zombie.lua -msgid "Husk" -msgstr "" - -#: zombie.lua -msgid "Zombie" -msgstr "" - -#: zombiepig.lua -msgid "Zombie Pigman" -msgstr "" diff --git a/mods/ENTITIES/mobs_mc/locale/template.txt b/mods/ENTITIES/mobs_mc/locale/template.txt new file mode 100644 index 000000000..0b80aef62 --- /dev/null +++ b/mods/ENTITIES/mobs_mc/locale/template.txt @@ -0,0 +1,54 @@ +# textdomain: mobs_mc +Totem of Undying= +A totem of undying is a rare artifact which may safe you from certain death.= +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.= +Agent= +Bat= +Blaze= +Chicken= +Cow= +Mooshroom= +Creeper= +Ender Dragon= +Enderman= +Endermite= +Ghast= +Elder Guardian= +Guardian= +Horse= +Skeleton Horse= +Zombie Horse= +Donkey= +Mule= +Iron Golem= +Llama= +Ocelot= +Parrot= +Pig= +Polar Bear= +Rabbit= +Killer Bunny= +Sheep= +Shulker= +Silverfish= +Skeleton= +Stray= +Wither Skeleton= +Magma Cube= +Slime= +Snow Golem= +Spider= +Cave Spider= +Squid= +Vex= +Evoker= +Illusioner= +Villager= +Vindicator= +Zombie Villager= +Witch= +Wither= +Wolf= +Husk= +Zombie= +Zombie Pigman= From 63d630a208e18c159734b63c97d2d8ab75fe4b46 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 00:32:22 +0100 Subject: [PATCH 166/379] German translation: environment --- mods/ENVIRONMENT/lightning/locale/lightning.de.tr | 4 ++++ .../mcl_void_damage/locale/mcl_void_damage.de.tr | 3 +++ mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.de.tr | 8 ++++++++ mods/ENVIRONMENT/mcl_weather/locale/template.txt | 8 ++++++++ mods/ENVIRONMENT/mcl_weather/weather_core.lua | 2 +- 5 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 mods/ENVIRONMENT/lightning/locale/lightning.de.tr create mode 100644 mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.de.tr create mode 100644 mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.de.tr create mode 100644 mods/ENVIRONMENT/mcl_weather/locale/template.txt diff --git a/mods/ENVIRONMENT/lightning/locale/lightning.de.tr b/mods/ENVIRONMENT/lightning/locale/lightning.de.tr new file mode 100644 index 000000000..a76c6809e --- /dev/null +++ b/mods/ENVIRONMENT/lightning/locale/lightning.de.tr @@ -0,0 +1,4 @@ +# textdomain: lightning +@1 was struck by lightning.=@1 wurde vom Blitz getroffen. +Let lightning strike at the specified position or yourself=Lassen Sie einen Blitz an die gegebene Position oder auf sich selbst einschlagen. +No position specified and unknown player=Keine Position angegeben und Spieler nicht bekannt diff --git a/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.de.tr b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.de.tr new file mode 100644 index 000000000..19ef90653 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.de.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_void_damage +The void is off-limits to you!=Die Leere ist für Sie tabu! +@1 fell into the endless void.=@1 fiel in die endlose Leere. diff --git a/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.de.tr b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.de.tr new file mode 100644 index 000000000..0fc8330ad --- /dev/null +++ b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.de.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_weather +Gives ability to control weather=Fähigkeit, das Wetter zu beeinflussen +Changes the weather to the specified parameter.=Ändert das Wetter. +Error: No weather specified.=Fehler: Kein Wetter angegeben. +Error: Invalid parameters.=Fehler: Ungültige Parameter. +Error: Duration can't be less than 1 second.=Fehler: Dauer darf nicht weniger als 1 Sekunde sein. +Error: Invalid weather specified. Use “clear”, “rain”, “snow” or “thunder”.=Fehler. Ungültiges Wetter. Benutzen Sie „clear“ (klar), „rain“ (Regen), „snow“ (Schnee) oder „thunder“ (Gewittersturm). +Toggles between clear weather and weather with downfall (randomly rain, thunderstorm or snow)=Wechselt das Wetter zwischem klaren Wetter und Wetter mit Niederschlag (zufällig Regen, Gewittersturm oder Schnee) diff --git a/mods/ENVIRONMENT/mcl_weather/locale/template.txt b/mods/ENVIRONMENT/mcl_weather/locale/template.txt new file mode 100644 index 000000000..03555e473 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_weather/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: mcl_weather +Gives ability to control weather= +Changes the weather to the specified parameter.= +Error: No weather specified.= +Error: Invalid parameters.= +Error: Duration can't be less than 1 second.= +Error: Invalid weather specified. Use “clear”, “rain”, “snow” or “thunder”.= +Toggles between clear weather and weather with downfall (randomly rain, thunderstorm or snow)= diff --git a/mods/ENVIRONMENT/mcl_weather/weather_core.lua b/mods/ENVIRONMENT/mcl_weather/weather_core.lua index 507040f10..29da968f8 100644 --- a/mods/ENVIRONMENT/mcl_weather/weather_core.lua +++ b/mods/ENVIRONMENT/mcl_weather/weather_core.lua @@ -190,7 +190,7 @@ minetest.register_privilege("weather_manager", { -- Weather command definition. Set minetest.register_chatcommand("weather", { - params = S("(clear | rain | snow | thunder) []"), + params = "(clear | rain | snow | thunder) []", description = S("Changes the weather to the specified parameter."), privs = {weather_manager = true}, func = function(name, param) From 2f1c2010762608b406146c4e7f571e32e13c5823 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 00:42:17 +0100 Subject: [PATCH 167/379] Update craftguide translations --- mods/HELP/mcl_craftguide/init.lua | 43 ++++++++++--------- .../locale/mcl_craftguide.de.tr | 32 +++++++++----- .../locale/mcl_craftguide.fr.tr | 31 +++++++++---- .../locale/mcl_craftguide.ru.tr | 31 +++++++++---- mods/HELP/mcl_craftguide/locale/template | 25 ----------- mods/HELP/mcl_craftguide/locale/template.txt | 37 ++++++++++++++++ 6 files changed, 125 insertions(+), 74 deletions(-) delete mode 100644 mods/HELP/mcl_craftguide/locale/template create mode 100644 mods/HELP/mcl_craftguide/locale/template.txt diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 4785c93b7..37087de0c 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -78,25 +78,25 @@ local group_stereotypes = { } local group_names = { - shulker_box = "Any shulker box", - wool = "Any wool", - wood = "Any wood planks", - tree = "Any wood", - sand = "Any sand", - normal_sandstone = "Any normal sandstone", - red_sandstone = "Any red sandstone", - carpet = "Any carpet", - dye = "Any dye", - water_bucket = "Any water bucket", - flower = "Any flower", - mushroom = "Any mushroom", - wood_slab = "Any wooden slab", - wood_stairs = "Any wooden stairs", - coal = "Any coal", - quartz_block = "Any kind of quartz block", - purpur_block = "Any kind of purpur block", - stonebrick = "Any stone bricks", - stick = "Any stick", + shulker_box = S("Any shulker box"), + wool = S("Any wool"), + wood = S("Any wood planks"), + tree = S("Any wood"), + sand = S("Any sand"), + normal_sandstone = S("Any normal sandstone"), + red_sandstone = S("Any red sandstone"), + carpet = S("Any carpet"), + dye = S("Any dye"), + water_bucket = S("Any water bucket"), + flower = S("Any flower"), + mushroom = S("Any mushroom"), + wood_slab = S("Any wooden slab"), + wood_stairs = S("Any wooden stairs"), + coal = S("Any coal"), + quartz_block = S("Any kind of quartz block"), + purpur_block = S("Any kind of purpur block"), + stonebrick = S("Any stone bricks"), + stick = S("Any stick"), } @@ -493,7 +493,7 @@ local function get_recipe_fs(data, iY) fs[#fs + 1] = fmt(FMT.label, (data.iX / 2) - 2, iY + 2.2, - ESC(S("Recipe is too big to be displayed (@1x@2)", width, rows))) + ESC(S("Recipe is too big to be displayed (@1×@2)", width, rows))) return concat(fs) end @@ -979,9 +979,10 @@ M.register_on_leaveplayer(function(player) player_data[name] = nil end) +-- TODO: Remove sfinv support if sfinv_only then sfinv.register_page("craftguide:craftguide", { - title = S("Craft Guide"), + title = "Craft Guide", get = function(self, player, context) local name = player:get_player_name() diff --git a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.de.tr b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.de.tr index f97ba9b02..022271948 100644 --- a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.de.tr +++ b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.de.tr @@ -1,8 +1,25 @@ # textdomain: mcl_craftguide - -Craft Guide=Rezeptbuch -Crafting Guide=Rezeptbuch -Crafting Guide Sign=Rezepttafel +Any shulker box=Beliebige Shulkerbox +Any wool=Beliebige Wolle +Any wood planks=Beliebige Holzplanken +Any wood=Beliebiges Holz +Any sand=Beliebiger Sand +Any normal sandstone=Beliebiger normaler Sandstein +Any red sandstone=Beliebiger roter Sandstein +Any carpet=Beliebiger Teppich +Any dye=Beliebiger Farbstoff +Any water bucket=Beliebiger Wassereimer +Any flower=Beliebige Blume +Any mushroom=Beliebiger Pilz +Any wooden slab=Beliebige Holzplatte +Any wooden stairs=Beliebgie Holztreppe +Any coal=Beliebige Kohle +Any kind of quartz block=Beliebiger Quarzblock +Any kind of purpur block=Beliebiger Purpurblock +Any stone bricks=Beliebige Steinziegel +Any stick=Beliebiger Stock +Any item belonging to the @1 group=Beliebiger Gegenstand aus Gruppe: @1 +Any item belonging to the groups: @1=Beliebiger Gegenstand aus den Gruppen: @1 Search=Suche Reset=Zurücksetzen Previous page=Vorherige Seite @@ -11,15 +28,10 @@ Usage @1 of @2=Verwendung @1 von @2 Recipe @1 of @2=Rezept @1 von @2 Burning time: @1=Brennzeit: @1 Cooking time: @1=Kochzeit: @1 -Any item belonging to the group(s): @1=Beliebiger Gegenstand aus Gruppe(n): @1 -Recipe is too big to be displayed (@1x@2)=Rezept ist zu groß für die Anzeige (@1×@2) +Recipe is too big to be displayed (@1×@2)=Rezept ist zu groß für die Anzeige (@1×@2) Shapeless=Formlos Cooking=Kochen Increase window size=Fenster vergrößern Decrease window size=Fenster verkleinern No item to show=Nichts anzuzeigen Collect items to reveal more recipes=Gegenstände aufsammeln, um mehr Rezepte aufzudecken -Show recipe(s) of the pointed node=Rezept(e) des gezeigten Blocks anzeigen -No node pointed=Auf keinen Block gezeigt -You don't know a recipe for this node=Sie kennen kein Rezept für diesen Block -No recipe for this node=Kein Rezept für diesen Block diff --git a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.fr.tr b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.fr.tr index 94de87fbd..59800119e 100644 --- a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.fr.tr +++ b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.fr.tr @@ -1,7 +1,25 @@ # textdomain: mcl_craftguide - -Craft Guide=Guide de recettes -Crafting Guide=Guide de recettes +Any shulker box= +Any wool= +Any wood planks= +Any wood= +Any sand= +Any normal sandstone= +Any red sandstone= +Any carpet= +Any dye= +Any water bucket= +Any flower= +Any mushroom= +Any wooden slab= +Any wooden stairs= +Any coal= +Any kind of quartz block= +Any kind of purpur block= +Any stone bricks= +Any stick= +Any item belonging to the @1 group= +Any item belonging to the groups: @1= Search=Rechercher Reset=Réinitialiser Previous page=Page précédente @@ -10,15 +28,10 @@ Usage @1 of @2=Usage @1 de @2 Recipe @1 of @2=Recette @1 de @2 Burning time: @1=Temps de combustion : @1 Cooking time: @1=Temps de cuisson : @1 -Any item belonging to the group(s): @1=Tout item appartenant au(x) groupe(s) : @1 -Recipe is too big to be displayed (@1x@2)=La recette est trop grande pour être affichée (@1x@2) +Recipe is too big to be displayed (@1×@2)=La recette est trop grande pour être affichée (@1×@2) Shapeless=Sans forme Cooking=Cuisson Increase window size=Agrandir la fenêtre Decrease window size=Réduire la fenêtre No item to show=Aucun item à afficher Collect items to reveal more recipes=Collecte des items pour révéler plus de recettes -Show recipe(s) of the pointed node=Affiche les recettes du bloc visé -No node pointed=Aucun bloc visé -You don't know a recipe for this node=Tu ne connais aucune recette pour ce bloc -No recipe for this node=Aucune recette pour ce bloc diff --git a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr index 04723dbea..b3c148a6d 100644 --- a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr +++ b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr @@ -1,8 +1,25 @@ # textdomain: mcl_craftguide - -Craft Guide=книга рецептов крафта -Crafting Guide=книга рецептов крафта -Crafting Guide Sign=Знак с книгой рецептов +Any shulker box= +Any wool= +Any wood planks= +Any wood= +Any sand= +Any normal sandstone= +Any red sandstone= +Any carpet= +Any dye= +Any water bucket= +Any flower= +Any mushroom= +Any wooden slab= +Any wooden stairs= +Any coal= +Any kind of quartz block= +Any kind of purpur block= +Any stone bricks= +Any stick= +Any item belonging to the @1 group= +Any item belonging to the groups: @1= Search=Поиск Reset=Сброс Previous page=Предыдущая страница @@ -12,14 +29,10 @@ Recipe @1 of @2=Рецепт @1 из @2 Burning time: @1=Время горения: @1 Cooking time: @1=Время преготовления: @1 Any item belonging to the group(s): @1=Любой элемент из группы: @1 -Recipe is too big to be displayed (@1x@2)=Рецепт слишком большой для показа (@1x@2) +Recipe is too big to be displayed (@1×@2)=Рецепт слишком большой для показа (@1×@2) Shapeless=Бесформенный Cooking=Приготовление Increase window size=Увеличить окно Decrease window size=Уменьшить окно No item to show=Нет элемента для показа Collect items to reveal more recipes=Собирайте предметы, чтобы раскрыть больше рецептов -Show recipe(s) of the pointed node=Показать рецепт(ы) выбранной ноды -No node pointed=Не указана нода -You don't know a recipe for this node=Вы не знаете рецепт для этой ноды -No recipe for this node=Нет рецептов для этой ноды diff --git a/mods/HELP/mcl_craftguide/locale/template b/mods/HELP/mcl_craftguide/locale/template deleted file mode 100644 index d051c275c..000000000 --- a/mods/HELP/mcl_craftguide/locale/template +++ /dev/null @@ -1,25 +0,0 @@ -# textdomain: craftguide - -Craft Guide= -Crafting Guide= -Crafting Guide Sign= -Search= -Reset= -Previous page= -Next page= -Usage @1 of @2= -Recipe @1 of @2= -Burning time: @1= -Cooking time: @1= -Any item belonging to the group(s): @1= -Recipe is too big to be displayed (@1x@2)= -Shapeless= -Cooking= -Increase window size= -Decrease window size= -No item to show= -Collect items to reveal more recipes= -Show recipe(s) of the pointed node= -No node pointed= -You don't know a recipe for this node= -No recipe for this node= diff --git a/mods/HELP/mcl_craftguide/locale/template.txt b/mods/HELP/mcl_craftguide/locale/template.txt new file mode 100644 index 000000000..f59e97af6 --- /dev/null +++ b/mods/HELP/mcl_craftguide/locale/template.txt @@ -0,0 +1,37 @@ +# textdomain: craftguide +Any shulker box= +Any wool= +Any wood planks= +Any wood= +Any sand= +Any normal sandstone= +Any red sandstone= +Any carpet= +Any dye= +Any water bucket= +Any flower= +Any mushroom= +Any wooden slab= +Any wooden stairs= +Any coal= +Any kind of quartz block= +Any kind of purpur block= +Any stone bricks= +Any stick= +Any item belonging to the @1 group= +Any item belonging to the groups: @1= +Search= +Reset= +Previous page= +Next page= +Usage @1 of @2= +Recipe @1 of @2= +Burning time: @1= +Cooking time: @1= +Recipe is too big to be displayed (@1x@2)= +Shapeless= +Cooking= +Increase window size= +Decrease window size= +No item to show= +Collect items to reveal more recipes= From 3c8e2634c0baa1026c997adb4774c5b5d9c891a2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 01:08:32 +0100 Subject: [PATCH 168/379] German translation: help (partial) --- mods/HELP/mcl_doc/locale/mcl_doc.de.tr | 54 ++ .../locale/mcl_doc_basics.de.tr | 465 ++++++++++++++++++ 2 files changed, 519 insertions(+) create mode 100644 mods/HELP/mcl_doc/locale/mcl_doc.de.tr create mode 100644 mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr diff --git a/mods/HELP/mcl_doc/locale/mcl_doc.de.tr b/mods/HELP/mcl_doc/locale/mcl_doc.de.tr new file mode 100644 index 000000000..f0143cab4 --- /dev/null +++ b/mods/HELP/mcl_doc/locale/mcl_doc.de.tr @@ -0,0 +1,54 @@ +# textdomain: mcl_doc +Water can flow into this block and cause it to drop as an item.=Wasser kann in diesen Block fließen und ihn als Gegenstand fallen lassen. +This block can be turned into dirt with a hoe.=Dieser Block kann mit einer Hacke zu Erde gemacht werden. +This block can be turned into farmland with a hoe.=Dieser Block kann mit einer Hacke zu Ackerboden gemacht werden. +This block acts as a soil for all saplings.=Dieser Block eignet sich als Nährboden für alle Setzlinge. +This block acts as a soil for some saplings.=Dieser Block eignet sich als Nährboden für einige Setzlinge. +Sugar canes will grow on this block.=Zuckerrohr wird auf diesem Block wachsen. +Nether wart will grow on this block.=Netherwurz wird auf diesem Block wachsen. +This block quickly decays when there is no wood block of any species within a distance of @1. When decaying, it disappears and may drop one of its regular drops. The block does not decay when the block has been placed by a player.=Dieser Block wird rasch absterben, wenn sich kein Holzblock irgendeiner Art innerhalb einer Entfernung von @1 befindet. Beim Absterben wird er verschwinden und wirft dabei vielleicht etwas ab. Der Block wird nicht absterben, wenn er von einem Spieler platziert wurde. +This block quickly decays and disappears when there is no wood block of any species within a distance of @1. The block does not decay when the block has been placed by a player.=Dieser Block wird schnell absterben und verschwinden, wenn sich kein Holzblock irgendeiner Art innerhalb einer Entfernung von @1 befindet. Der Block wird nicht absterben, wenn er von einem Spieler platziert wurde. +This plant can only grow on grass blocks and dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Diese Pflanze kann nur auf Grasblöcken und Erde wachsen. Zum Überleben muss sie sich direkt unter dem Himmel befinden oder einer Lichtstärke von 8 oder höher ausgesetzt sein. +This plant can grow on grass blocks, podzol, dirt and coarse dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Diese Pflanze wächst auf Grasblöcken, Podsol, Erde und grobe Erde. Zum Überleben muss sie sich direkt unter dem Himmel befinden oder einer Lichtstärke von mindestens 8 ausgesetzt sein. +This block is flammable.=Dieser Block ist entzündlich. +This block destroys any item it touches.=Dieser Block zerstört jeden Gegenstand, der in ihn fällt. +To eat it, wield it, then rightclick.=Um dies zu essen, halten Sie es in der Hand und rechtsklicken Sie. +You can eat this even when your hunger bar is full.=Sie können dies essen, auch wenn Ihre Hungerleiste voll ist. +You cannot eat this when your hunger bar is full.=Sie können dies nicht essen, wenn Ihre Hungerleiste voll ist. +To drink it, wield it, then rightclick.=Um dies zu trinken, halten Sie es, dann rechtklicken Sie. +You cannot drink this when your hunger bar is full.=Sie können dies nicht trinken, wenn Ihre Hungerleiste voll ist. +To consume it, wield it, then rightclick.=Um dies zu konsumieren, halten Sie es, dann rechtsklicken Sie. +You cannot consume this when your hunger bar is full.=Sie können dies nicht konsumieren, wenn Ihre Hungerleiste voll ist. +You have to wait for about 2 seconds before you can eat or drink again.=Sie müssen für etwa 2 Sekunden warten, bevor Sie erneut essen oder trinken können- +Hunger points restored: @1=Erhaltene Hungerpunkte: @1 +Saturation points restored: @1%.1f=Erhaltene Sättigungspunkte: @1 +This item can be repaired at an anvil with: @1.=Dieser Gegenstand kann an einem Amboss repariert werden mit: @1 +This item can be repaired at an anvil with any wooden planks.=Dieser Gegenstand kann an einem Amboss mit beliebigen Holzplanken repariert werden. +This item can be repaired at an anvil with any item in the “@1” group.=Dieser Gegenstand kann an einem Amboss in der „@1“-Gruppe repariert werden. +This item cannot be renamed at an anvil.=Dieser Gegenstand kann an einem Amboss nicht umbenannt werden. +This block crushes any block it falls into.=Dieser Block zertrümmert jeden Block, in den er hereinfällt. +When this block falls deeper than 1 block, it causes damage to any player it hits. The damage dealt is B×2−2 hit points with B @= number of blocks fallen. The damage can never be more than 40 HP.=Wenn dieser Block um mehr als 1 Block tief fällt, richtet er für jeden Spieler, den er trifft, Schaden an. Der Schaden ist B×2-2 Trefferpunkte, wobei B = die Anahl der gefallenen Blöcke. Der Schaden ist nie größer als 40 TP. +Diamond Pickaxe=Diamantspitzhacke +Iron Pickaxe=Eisenspitzhacke +Stone Pickaxe=Steinspitzhacke +Golden Pickaxe=Goldspitzhacke +Wooden Pickaxe=Holzspitzhacke +Diamond Axe=Diamantaxt +Iron Axe=Eisenaxt +Stone Axe=Steinaxt +Golden Axe=Goldaxt +Wooden Axe=Holzaxt +Diamond Shovel=Diamantschaufen +Iron Shovel=Eisenschaufel +Stone Shovel=Steinschaufel +Golden Shovel=Goldschaufel +Wooden Shovel=Holzschaufel +This block can be mined by any tool instantly.=Dieser Block kann mit jedem Werkzeug sofort abgebaut werden. +This block can be mined by:=Dieser Block kann abgebaut werden mit: +Hardness: ∞=Härte: ∞ +Hardness: @1=Härte: @1 +This block will not be destroyed by TNT explosions.=Dieser Block wird von TNT-Explosionen nicht zerstört. +This block drops itself when mined by shears.=Dieser Block wirft sich selbst ab, wenn er mit einer Schere abgebaut wird. +@1×@2=@1×@2 +This blocks drops the following when mined by shears: @1=Dieser Block wird folgendes abwerfen, wenn er mit einer Schere abgebaut wird: @ +, =, diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr new file mode 100644 index 000000000..42ea11ecf --- /dev/null +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr @@ -0,0 +1,465 @@ +# textdomain: mcl_doc_basics +Basics=Grundlagen +Everything you need to know about MineClone 2 to get started with playing=Alles, was Sie über MineClone 2 wissen sollten, um zu spielen +Advanced usage=Fortgeschrittenes +Advanced information about Minetest which may be nice to know, but is not crucial to gameplay=Fortgeschrittene Infos über Minetest, die nett zu wissen sind, aber nicht unbedingt kritisch für das Spiel +Quick start=Schnellstart +This is a very brief introduction to the basic gameplay:=Dies ist eine sehr kurze Einleitung ins Spiel: +Basic controls:=Grundsteuerung: +• Move mouse to look=• Maus bewegen zum Umsehen +• [W], [A], [S] and [D] to move=• [W], [A], [S] und [D] zum Bewegen +• [E] to sprint=[E] zum Sprinten +• [Space] to jump or move upwards=[Leertaste] zum Springen oder Aufwärtsbewegung +• [Shift] to sneak or move downwards=• [Umschalt] zum Schleichen oder Abwärtsbewegung +• Mouse wheel or [1]-[9] to select item=Mausrad oder [1]-[9] zur Gegenstandsauswahl +• Left-click to mine blocks or attack=• Linksklick, um Blöcke abzubauen oder anzugreifen +• Recover from swings to deal full damage=• Warten Sie Schwünge von Angriffen ab, um vollen Schaden anzurichten +• Right-click to build blocks and use things=• Rechtsklick, um Blöcke zu bauen und Dinge zu benutzen +• [I] for the inventory=• [I] für das Inventar +• Lowest row in inventory appears in hotbar below=• Unterste Inventarzeile erscheint in Schnellleiste +• [Esc] to close this window=• [Esc], um dieses Fenster zu schließen +How to play:=Spielanleitung +• Punch a tree trunk until it breaks and collect wood=• Hauen Sie einen Baumstamm, bis er bricht und sammeln Sie Holz auf +• Place the wood into the 2×2 grid (your “crafting grid”) in your inventory menu and craft 4 wood planks=• Platzieren Sie das Holz in das 2×2-Gitter (Ihr „Fertigungsgitter) in Ihrem Inventar und fertigen Sie 4 Holzplanken +• Place them in a 2×2 shape in the crafting grid to craft a crafting table=• Platzieren Sie sie in eine 2×2-Form im Fertigungsgitter, um eine Werkbank zu errichten +• Place the crafting table on the ground=• Platzieren Sie die Werkbank auf den Boden +• Rightclick it for a 3×3 crafting grid=Rechtsklicken Sie sie für ein 3×3-Fertigungsgitter +• Use the crafting guide (book icon) to learn all the possible crafting recipes=• Benutzen Sie die Bauanleitung (Buchsymbol) um alle möglichen Fertigungsrezepte zu lernen +• Craft a wooden pickaxe so you can dig stone=• Fertigen Sie eine Holzspitzhacke, damit Sie Stein graben können +• Different tools break different kinds of blocks. Try them out!=• Verschiedene Werkzeuge können verschiedene Blöcke brechen. Probieren Sie einfach! +• Read entries in this help to learn the rest=• Lesen Sie Einträge in dieser Hilfe, um den Rest zu lernen +• Continue playing as you wish. There's no goal. Have fun!=• Spielen Sie weiter, so wie sie wollen. Es gibt kein Ziel. Viel Spaß! +Minetest= +Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).= +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 can, however, be much more complex than this.= +A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorative blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.= +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 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 as well as Minetest Game are both unfinished at the moment, so please forgive us when not everything works out perfectly.= +Sneaking= +Sneaking makes you walk slower and prevents you from falling off the edge of a block.= +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!= +• Sneak: [Shift]= +Sneaking only works when you stand on solid ground, are not in a liquid and don't climb.= +If you jump while holding the sneak key, you also jump slightly higher than usual.= +Sneaking might be disabled by mods. In this case, you still walk slower by sneaking, but you will no longer be stopped at ledges.= +Controls= +These are the default controls:= +Basic movement:= +• Moving the mouse around: Look around= +• W: Move forwards= +• A: Move to the left= +• D: Move to the right= +• S: Move backwards= +• E: Sprint= +While standing on solid ground:= +• Space: Jump= +• Shift: Sneak= +While on a ladder, swimming in a liquid or fly mode is active= +• Space: Move up= +• Shift: Move down= +Extended movement (requires privileges):= +• J: Toggle fast mode, makes you run or fly fast (requires “fast” privilege)= +• K: Toggle fly mode, makes you move freely in all directions (requires “fly” privilege)= +• H: Toggle noclip mode, makes you go through walls in fly mode (requires “noclip” privilege)= +• E: Move even faster when in fast mode= +World interaction:= +• Left mouse button: Punch / mine blocks / take items= +• Right mouse button: Build or use pointed block= +• Shift+Right mouse button: Build= +• Roll mouse wheel: Select next/previous item in hotbar= +• 1-9: Select item in hotbar directly= +• Q: Drop item stack= +• Shift+Q: Drop 1 item= +• I: Show/hide inventory menu= +Inventory interaction:= +See the entry “Basics > Inventory”.= +Camera:= +• Z: Zoom (requires “zoom” privilege)= +• F7: Toggle camera mode= +• F8: Toggle cinematic mode= +Interface:= +• Esc: Open menu window (pauses in single-player mode) or close window= +• F1: Show/hide HUD= +• F2: Show/hide chat= +• F9: Toggle minimap (only works if have a map)= +• Shift+F9: Toggle minimap rotation mode= +• F10: Open/close console/chat log= +• F12: Take a screenshot= +Server interaction:= +• T: Open chat window (chat requires the “shout” privilege)= +• /: Start issuing a server command)= +Technical:= +• R: Toggle far view (disables all fog and allows viewing far away, can make game very slow)= +• +: Increase minimal viewing distance= +• -: Decrease minimal viewing distance= +• F3: Enable/disable fog= +• F5: Enable/disable debug screen which also shows your coordinates= +• F6: Only useful for developers. Enables/disables profiler= +• P: Only useful for developers. Writes current stack traces= +Players= +Players (actually: “player characters”) are the characters which users control.= +Players are living beings which occupy a space of about 1×2×1 cubes. They start with 20 health points (HP) and 10 breath points (BP).= +Players are capable of walking, sneaking, jumping, climbing, swimming, diving, mining, building, fighting and using tools and blocks.= +At a health of 0, the player dies and loses all items in the inventory. The player can just respawn in the world.= +Some blocks reduce breath. While being with the head in a block which causes drowning, the breath points are reduced by 1 for every 2 seconds. When all breath is gone, the player starts to suffer drowning damage. Breath is quickly restored in any other block.= +Damage can be disabled on any world. Without damage, players are immortal and health and breath are unimportant.= +In multi-player mode, the name of other players is written above their head.= +Items= +Items are things you can carry along and store in inventories. They can be used for crafting, smelting, building, mining, and more. Types of items include blocks, tools, weapons and items only used for crafting.= +An item stack is a collection of items of the same type which fits into a single item slot. Item stacks can be dropped on the ground. Items which drop into the same coordinates will form an item stack.= +Dropped item stacks will be collected automatically when you stand close to them.= +Tools= +Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.= +Mining tools are important to break all kinds of blocks. Weapons are another kind of tool. There are some other more specialized tools. Special actions of tools are usually done by right-click.= +When nothing is wielded, players use their hand which may act as tool and weapon. The hand is capable of punching and deals minimum damage.= +Many tools will wear off when using them and may eventually get destroyed. The damage is displayed in a damage bar below the tool icon. If no damage bar is shown, the tool is in mint condition. Tools may be repairable by crafting, see “Basics > Crafting”.= +Weapons= +Some items are usable as a melee weapon when wielded. Weapons share most of the properties of tools.= +Melee weapons deal damage by punching players and other animate objects. There are two ways to attack:= +• Single punch: Left-click once to deal a single punch= +• Quick punching: Hold down the left mouse button to deal quick repeated punches= +There are two core attributes of melee weapons:= +• Maximum damage: Damage which is dealt after a hit when the weapon was fully recovered)= +• Full punch interval: Time it takes for fully recovering from a punch= +A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.= +There is a rule which sometimes makes attacks impossible: Players, animate objects and weapons belong to damage groups. A weapon only deals damage to those who share at least one damage group with it. So if you're using the wrong weapon, you might not deal any damage at all.= +Pointing= +“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, dropped items, players, computer enemies and objects.= +To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.= +A few things can not be pointed. Most blocks are pointable. A few blocks, like air, can never be pointed. Other blocks, like liquids can only be pointed by special items.= +Camera= +You can change the camera mode by pressing [F7].= +There is also Cinematic Mode which can be toggled with [F8]. With Cinematic Mode enabled, the camera movements become more smooth. Some players don't like it, it is a matter of taste.= +By holding down [Z], you can zoom the view at your crosshair. You need the “zoom” privilege to do this.= +• Switch camera mode: [F7]= +• Toggle Cinematic Mode: [F8]= +• Zoom: [Z]= +Blocks= +The world of MineClone 2 is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.= +Blocks can have a wide range of different properties which determine mining times, behavior, looks, shape, and much more. Their properties include:= +• Collidable: Collidable blocks can not be passed through; players can walk on them. Non-collidable blocks can be passed through freely= +• Pointable: Pointable blocks show a wireframe or a halo box when pointed. But you will just point through non-pointable blocks. Liquids are usually non-pointable but they can be pointed at by some special tools= +• Mining properties: By which tools it can be mined, how fast and how much it wears off tools= +• Climbable: While you are at a climbable block, you won't fall and you can move up and down with the jump and sneak keys= +• Drowning damage: See the entry “Basics > Player”= +• Liquids: See the entry “Basics > Liquids”= +• Group memberships: Group memberships are used to determine mining properties, crafting, interactions between blocks and more= +Mining= +Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.= +Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in hardness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining will drop on the ground, ready to be collected.= +After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:= +• Always drops itself (the usual case)= +• Always drops the same items= +• Drops items based on probability= +• Drops nothing= +Building= +Almost all blocks can be built (or placed). Building is very simple and has no delay.= +To build your wielded block, point at a block in the world and right-click. If this is not possible because the pointed block has a special right-click action, hold down the sneak key before right-clicking.= +Blocks can almost always be built at pointable blocks. One exception are blocks attached to the floor; these can only be built on the floor.= +Normally, blocks are built in front of the pointed side of the pointed block. A few blocks are different: When you try to build at them, they are replaced.= +Liquids= +Liquids are special dynamic blocks. Liquids like to spread and flow to their surrounding blocks. Players can swim and drown in them.= +Liquids usually come in two forms: In source form (S) and in flowing form (F).= +Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. A long it is left alone, a liquid source will normally keep its place and does not drain out.= +Flowing liquids take a sloped form. Flowing liquids spread around the world until they drain. A flowing liquid can not sustain itself and always comes from a liquid source, either directly or indirectly. Without a liquid source, a flowing liquid will eventually drain out and disappear.= +All liquids share the following properties:= +• All properties of blocks (including drowning damage= +• Renewability: Renewable liquids can create new sources= +• Flowing range: How many flowing liquids are created at maximum per liquid source, it determines how far the liquid will spread. Possible are ranges from 0 to 8. At 0, no flowing liquids will be created. Image 5 shows a liquid of flowing range 2= +• Viscosity: How slow players move through it and how slow the liquid spreads= +When those criteria are met, the open space is filled with a new liquid source of the same type (image 3).= +Swimming in a liquid is fairly straightforward: The usual direction keys for basic movement, the jump key for rising and the sneak key for sinking.= +The physics for swimming and diving in a liquid are:= +• The higher the viscosity, the slower you move= +• If you rest, you'll slowly sink= +• There is no fall damage for falling into a liquid as such= +• If you fall into a liquid, you will be slowed down on impact (but don't stop instantly). Your impact depth is determined by your speed and the liquid viscosity. For a safe high drop into a liquid, make sure there is enough liquid above the ground, otherwise you might hit the ground and take fall damage= +Liquids are often not pointable. But some special items are able to point all liquids.= +Crafting= +Crafting is the task of combining several items to form a new item.= +To craft something, you need one or more items, a crafting grid (C) and a crafting recipe. A crafting grid is like a normal inventory which can also be used for crafting. Items need to be put in a certain pattern into the crafting grid. Next to the crafting grid is an output slot (O). Here the result will appear when you placed items correctly. This is just a preview, not the actual item. Crafting grids can come in different sizes which limits the possible recipes you can craft.= +To complete the craft, take the result item from the output slot, which will consume items from the crafting grid and creates a new item. It is not possible to place items into the output slot.= +A description on how to craft an item is called a “crafting recipe”. These crafting recipes can be found in the crafting guide which you can access from the inventory menu.= +Crafting recipes consist of at least one input item and exactly one stack of output items. When performing a single craft, it will consume exactly one item from each stack of the crafting grid, unless the crafting recipe defines replacements.= +In some crafting recipes, some input items do not need to be a concrete item, instead they need to be a member of a group (see “Basics > Groups”). These recipes offer a bit more freedom in the input items. Images 6-8 show the same group-based recipe. Here, 8 items of the “stone” group are required, which is true for all of the shown items.= +Rarely, crafting recipes have replacements. This means, whenever you perform a craft, some items in the crafting grid will not be consumed, but instead will be replaced by another item.= +Cooking= +Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a furnace, an cookable item, a fuel item and time in order to yield a new item.= +Each fuel item has a burning time. This is the time a single item of the fuel keeps a furnace burning.= +Each cookable item requires time to be cooked. This time is specific to the item type and the item must be “on fire” for the whole cooking time to actually yield the result.= +Hotbar= +At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the lowest row of items in the player inventory.= +You can change the selected item with the mouse wheel or the number keys.= +• Select previous item in hotbar: [Mouse wheel up]= +• Select next item in hotbar: [Mouse wheel down]= +• Select item in hotbar directly: [0]-[9]= +The selected item is also your wielded item.= +Minimap= +If you have a map item in any of your hotbar slots, you can use the minimap.= +Press [F9] to make a minimap appear on the top right. The minimap helps you to find your way around the world. Press it again to select different minimap modes and zoom levels. The minimap also shows the positions of other players.= +There are 2 minimap modes and 3 zoom levels.= +Surface mode (image 1) is a top-down view of the world, roughly resembling the colors of the blocks this world is made of. It only shows the topmost blocks, everything below is hidden, like a satellite photo. Surface mode is useful if you got lost.= +Radar mode (image 2) is more complicated. It displays the “denseness” of the area around you and changes with your height. Roughly, the more green an area is, the less “dense” it is. Black areas have many blocks. Use the radar to find caverns, hidden areas, walls and more. The rectangular shapes in image 2 clearly expose the position of a dungeon. Radar mode is only available in Creative Mode= +There are also two different rotation modes. In “square mode”, the rotation of the minimap is fixed. If you press [Shift]+[F9] to switch to “circle mode”, the minimap will instead rotate with your looking direction, so “up” is always your looking direction.= +In other games, the minimap may be disabled.= +• Toggle minimap mode: [F9]= +• Toggle minimap rotation mode: [Shift]+[F9]= +Inventories are used to store item stacks. There are other uses, such as crafting. An inventory consists of a rectangular grid of item slots. Each item slot can either be empty or hold one item stack. Item stacks can be moved freely between most slots.= +You have your own inventory which is called your “player inventory”, you can open it with the inventory key (default: [I]). The first inventory slots are also used as slots in your hotbar.= +Blocks can also have their own inventory, e.g. chests and furnaces.= +Inventory controls:= +Taking: You can take items from an occupied slot if the cursor holds nothing.= +• Left click: take entire item stack= +• Right click: take half from the item stack (rounded up)= +• Middle click: take 10 items from the item stack= +Putting: You can put items onto a slot if the cursor holds 1 or more items and the slot is either empty or contains an item stack of the same item type.= +• Left click: put entire item stack= +• Right click: put 1 item of the item stack= +• Middle click: put 10 items of the item stack= +Exchanging: You can exchange items if the cursor holds 1 or more items and the destination slot is occupied by a different item type.= +• Click: exchange item stacks= +Throwing away: If you hold an item stack and click with it somewhere outside the menu, the item stack gets thrown away into the environment.= +Quick transfer: You can quickly transfer an item stack to/from the player inventory to/from another item's inventory slot like a furnace, chest, or any other item with an inventory slot when that item's inventory is accessed. The target inventory is generally the most relevant inventory in this context.= +• Sneak+Left click: Automatically transfer item stack= +Online help= +You may want to check out these online resources related to MineClone 2.= +MineClone 2 download and forum discussion: = +Here you find the most recent version of MineClone 2 and can discuss it.= +Bug tracker: = +Report bugs here.= +Minetest links:= +Official homepage of Minetest: = +The main place to find the most recent version of Minetest, the engine used by MineClone 2.= +Community wiki: = +A community-based documentation website for Minetest. Anyone with an account can edit it.= +Minetest forums: = +A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and games are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.= +Chat: = +A generic Internet Relay Chat channel for everything related to Minetest where people can meet to discuss in real-time. If you do not understand IRC, see the Community Wiki for help.= +Groups= +Items, players and objects (animate and inanimate) can be members of any number of groups. Groups serve multiple purposes:= +• Crafting recipes: Slots in a crafting recipe may not require a specific item, but instead an item which is a member of a particular group, or multiple groups= +• Digging times: Diggable blocks belong to groups which are used to determine digging times. Mining tools are capable of digging blocks belonging to certain groups= +• Block behavior: Blocks may show a special behaviour and interact with other blocks when they belong to a particular group= +• Damage and armor: Objects and players have armor groups, weapons have damage groups. These groups determine damage. See also: “Basics > Weapons”= +• Other uses= +In the item help, many important groups are usually mentioned and explained.= +Glossary= +This is a list of commonly used terms:= +Controls:= +• Wielding: Holding an item in hand= +• Pointing: Looking with the crosshair at something in range= +• Dropping: Throwing an item or item stack to the ground= +• Punching: Attacking with left-click, is also used on blocks= +• Sneaking: Walking slowly while (usually) avoiding to fall over edges= +• Climbing: Moving up or down a climbable block= +Blocks:= +• Block: Cubes that the worlds are made of= +• Mining/digging: Using a mining tool to break a block= +• Building/placing: Putting a block somewhere= +• Drop: Items you get after mining a block= +• Using a block: Right-clicking a block to access its special function= +Items:= +• Item: A single thing that players can possess= +• Item stack: A collection of items of the same kind= +• Maximum stack size: Maximum amount of items in an item stack= +• Slot / inventory slot: Can hold one item stack= +• Inventory: Provides several inventory slots for storage= +• Player inventory: The main inventory of a player= +• Tool: An item which you can use to do special things with when wielding= +• Range: How far away things can be to be pointed by an item= +• Mining tool: A tool which allows to break blocks= +• Craftitem: An item which is (primarily or only) used for crafting= +Gameplay:= +• “heart”: A single health symbol, indicates 2 HP= +• “bubble”: A single breath symbol, indicates 1 BP= +• HP: Hit point (equals a half “heart”)= +• BP: Breath point, indicates breath when diving= +• Mob: Computer-controlled enemy= +• Crafting: Combining multiple items to create new ones= +• Crafting guide: A helper which shows available crafting recipes= +• Spawning: Appearing in the world= +• Respawning: Appearing again in the world after death= +• Group: Puts similar things together, often affects gameplay= +• noclip: Allows to fly through walls= +Interface= +• Hotbar: Inventory slots at the bottom= +• Statbar: Indicator made out of half-symbols, used for health and breath= +• Minimap: The map or radar at the top right= +• Crosshair: Seen in the middle, used to point at things= +Online multiplayer:= +• PvP: Player vs Player. If active, players can deal damage to each other= +• Griefing: Destroying the buildings of other players against their will= +• Protection: Mechanism to own areas of the world, which only allows the owners to modify blocks inside= +Technical terms:= +• Minetest: This game engine= +• MineClone 2: What you play right now= +• Minetest Game: A game for Minetest by the Minetest developers= +• Game: A complete playing experience to be used in Minetest; such as a game or sandbox or similar= +• Mod: A single subsystem which adds or modifies functionality; is the basic building block of games and can be used to further enhance or modify them= +• Privilege: Allows a player to do something= +• Node: Other word for “block”= +Settings= +There is a large variety of settings to configure Minetest. Pretty much every aspect can be changed that way.= +These are a few of the most important gameplay settings:= +• Damage enabled (enable_damage): Enables the health and breath attributes for all players. If disabled, players are immortal= +• Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. Changes include: Instant digging, easy access to almost all items, tools never wear off, etc.= +• PvP (enable_pvp): Short for “Player vs Player”. If enabled, players can deal damage to each other= +For a full list of all available settings, use the “Advanced settings” dialog in the main menu.= +Movement modes= +If you have the required privileges, you can use up to three special movement modes. Using these may be considered cheating.= +Fast mode:= +• Description: Allows you to move much faster. Hold down the the “Use” key [E] to move faster. In the client configuration, you can further customize fast mode.= +• Default key: [J]= +• Required privilege: fast= +Fly mode:= +• Description: Gravity doesn't affect you and you can move freely in all directions. Use the jump key to rise and the sneak key to sink.= +• Default key: [K]= +• Required privilege: fly= +Noclip mode:= +• Description: Allows you to move through walls. Only works when fly mode is enabled, too.= +• Default key: [H]= +• Required privilege: noclip= +Console= +With [F10] you can open and close the console. The main use of the console is to show the chat log and enter chat messages or server commands.= +Using the chat or server command key also opens the console, but it is smaller and will be closed after you sent a message.= +Use the chat to communicate with other players. This requires you to have the “shout” privilege.= +Just type in the message and hit [Enter]. Public chat messages can not begin with “/”.= +You can send private messages: Say “/msg ” in chat to send “” which can only be seen by .= +There are some special controls for the console:= +• [F10] Open/close console= +• [Enter]: Send message or command= +• [Tab]: Try to auto-complete a partially-entered player name= +• [Ctrl]+[Left]: Move cursor to the beginning of the previous word= +• [Ctrl]+[Right]: Move cursor to the beginning of the next word= +• [Ctrl]+[Backspace]: Delete previous word= +• [Ctrl]+[Delete]: Delete next word= +• [Ctrl]+[U]: Delete all text before the cursor= +• [Ctrl]+[K]: Delete all text after the cursor= +• [Page up]: Scroll up= +• [Page down]: Scroll down= +There is also an input history. Minetest saves your previous console inputs which you can quickly access later:= +• [Up]: Go to previous entry in history= +• [Down]: Go to next entry in history= +Server commands= +Server commands (also called “chat commands”) are little helpers for advanced users. You don't need to use these commands when playing. But they might come in handy to perform some more technical tasks. Server commands work both in multi-player and single-player mode.= +Server commands can be entered by players using the chat to perform a special server action. There are a few commands which can be issued by everyone, but some commands only work if you have certain privileges granted on the server. There is a small set of basic commands which are always available, other commands can be added by mods.= +To issue a command, simply type it like a chat message or press Minetest's command key (default: [/]). All commands have to begin with “/”, for example “/mods”. The Minetest command key does the same as the chat key, except that the slash is already entered.= +Commands may or may not give a response in the chat log, but errors will generally be shown in the chat. Try it for yourselves: Close this window and type in the “/mods” command. This will give you the list of available mods on this server.= +“/help all” is a very important command: You get a list of all available commands on the server, a short explanation and the allowed parameters. This command is also important because the available commands often differ per server.= +Commands are followed by zero or more parameters.= +In the command reference, you see some placeholders which you need to replace with an actual value. Here's an explanation:= +• Text in greater-than and lower-than signs (e.g. “”): Placeholder for a parameter= +• Anything in square brackets (e.g. “[text]”) is optional and can be omitted= +• Pipe or slash (e.g. “text1 | text2 | text3”): Alternation. One of multiple texts must be used (e.g. “text2”)= +• Parenthesis: (e.g. “(word1 word2) | word3”): Groups multiple words together, used for alternations= +• Everything else is to be read as literal text= +Here are some examples to illustrate the command syntax:= +• /mods: No parameters. Just enter “/mods”= +• /me : 1 parameter. You have to enter “/me ” followed by any text, e.g. “/me orders pizza”= +• /give : Two parameters. Example: “/give Player default:apple”= +• /help [all|privs|]: Valid inputs are “/help”, “/help all”, “/help privs”, or “/help ” followed by a command name, like “/help time”= +• /spawnentity [,,]: Valid inputs include “/spawnentity boats:boat” and “/spawnentity boats:boat 0,0,0”= +Some final remarks:= +• For /give and /giveme, you need an itemstring. This is an internally used unique item identifier which you may find in the item help if you have the “give” or “debug” privilege= +• For /spawnentity you need an entity name, which is another identifier= +Privileges= +Each player has a set of privileges, which differs from server to server. Your privileges determine what you can and can't do. Privileges can be granted and revoked from other players by any player who has the privilege called “privs”.= +On a multiplayer server with the default configuration, new players start with the privileges called “interact” and “shout”. The “interact” privilege is required for the most basic gameplay actions such as building, mining, using, etc. The “shout” privilege allows to chat.= +There is a small set of core privileges which you'll find on every server, other privileges might be added by mods.= +To view your own privileges, issue the server command “/privs”.= +Here are a few basic privilege-related commands:= +• /privs: Lists your privileges= +• /privs : Lists the privileges of = +• /help privs: Shows a list and description about all privileges= +Players with the “privs” privilege can modify privileges at will:= +• /grant : Grant to = +• /revoke : Revoke from = +In single-player mode, you can use “/grant singleplayer all” to unlock all abilities (which is often considered cheating).= +Light= +As the world is entirely block-based, so is the light in the world. Each block has its own brightness. The brightness of a block is expressed in a “light level” which ranges from 0 (total darkness) to 15 (as bright as the sun).= +There are two types of light: Sunlight and artificial light.= +Artificial light is emitted by luminous blocks. Artificial light has a light level from 1-14.= +Sunlight is the brightest light and always goes perfectly straight down from the sky at each time of the day. blocks. At night, the sunlight will become moonlight instead, which still provides a small amount of light. The light level of sunlight is 15.= +Blocks have 3 levels of transparency:= +• Transparent: Sunlight goes through limitless, artificial light goes through with losses= +• Semi-transparent: Sunlight and artificial light go through with losses= +• Opaque: No light passes through= +Artificial light will lose one level of brightness for each transparent or semi-transparent block it passes through, until only darkness remains (image 1).= +Sunlight will preserve its brightness as long it only passes fully transparent blocks. When it passes through a semi-transparent block, it turns to artificial light. Image 2 shows the difference.= +Note that “transparency” here only means that the block is able to carry brightness from its neighboring blocks. It is possible for a block to be transparent to light but you can't see trough the other side.= +Coordinates= +The 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.= +Like this: (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.= +The values for X, Y and Z work like this:= +• If you go up, Y increases= +• If you go down, Y decreases= +• If you follow the sun, X increases= +• If you go to the reverse direction, X decreases= +• Follow the sun, then go right: Z increases= +• Follow the sun, then go left: Z decreases= +• The side length of a full cube is 1= +You can view your current position in the debug screen (open with [F5]). This is considered cheating in some games.= +Creative Mode= +Enabling Creative Mode in MineClone 2 applies the following changes:= +• You keep the things you've placed= +• Creative inventory is available to obtain most items easily= +• Hand breaks all default blocks instantly= +• Greatly increased hand pointing range= +• Mined blocks don't drop items= +• Items don't get used up= +• Tools don't wear off= +• You can eat food whenever you want= +• You can always use the minimap (including radar mode)= +Damage is not affected by Creative Mode, it needs to be disabled seperately.= +Mobs= +Mobs are the living beings in the world. This includes animals and monsters.= +Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some blocks only spawn on particular blocks (like grass blocks).= +Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.= +Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.= +Animals= +Animals are peaceful beings which roam the world aimlessly. You can feed, tame and breed them.= +Feeding:= +Each animal has its own taste for food and doesn't just accept any food. To feed, hold an item in your hand and rightclick the animal.= +Animals are attraced to the food they like and follow you as long you hold the food item in hand.= +Feeding an animal has three uses: Taming, healing and breeding.= +Feeding heals animals instantly, depending on the quality of the food item.= +Taming:= +A few animals can be tamed. You can generally do more things with tamed animals and use other items on them. For example, tame horses can be saddled and tame wolves fight on your side.= +Breeding:= +When you have fed an animal up to its maximum health, then feed it again, you will activate “Love Mode” and many hearts appear around the animal.= +Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.= +Baby animals:= +Baby animals are just like their adult couterparts, but they can't be fed, tamed or bred and don't drop anything when they die. They grow to adults after a short time.= +Hunger= +Hunger affects your health and your ability to sprint. Hunger is not in effect when damage is disabled.= +Core hunger rules:= +• You start with 20/20 hunger points (more points @= less hungry)= +• Actions like combat, jumping, sprinting, etc. decrease hunger points= +• Food restores hunger points= +• If your hunger bar decreases, you're hungry= +• At 18-20 hunger points, you regenerate 1 HP every 4 seconds= +• At 6 hunger points or less, you can't sprint= +• At 0 hunger points, you lose 1 HP every 4 seconds (down to 1 HP)= +• Poisonous food decreases your health= +Details:= +You have 0-20 hunger points, indicated by 20 drumstick half-icons above the hotbar. You also have an invisible attribute: Saturation.= +Hunger points reflect how full you are while saturation points reflect how long it takes until you're hungry again.= +Each food item increases both your hunger level as well your saturation.= +Food with a high saturation boost has the advantage that it will take longer until you get hungry again.= +A few food items might induce food poisoning by chance. When you're poisoned, the health and hunger symbols turn sickly green. Food poisoning drains your health by 1 HP per second, down to 1 HP. Food poisoning also drains your saturation. Food poisoning goes away after a while or when you drink milk.= +You start with 5 saturation points. The maximum saturation is equal to your current hunger level. So with 20 hunger points your maximum saturation is 20. What this means is that food items which restore many saturation points are more effective the more hunger points you have. This is because at low hunger levels, a lot of the saturation boost will be lost due to the low saturation cap.= +If your saturation reaches 0, you're hungry and start to lose hunger points. Whenever you see the hunger bar decrease, it is a good time to eat.= +Saturation decreases by doing things which exhaust you (highest exhaustion first):= +• Regenerating 1 HP= +• Suffering food poisoning= +• Sprint-jumping= +• Sprinting= +• Attacking= +• Taking damage= +• Swimming= +• Jumping= +• Mining a block= +Other actions, like walking, do not exaust you.= From 9405232fef06f35f4abaa03c554e6bc4012694b6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 01:14:39 +0100 Subject: [PATCH 169/379] Clean up awards mod translation --- mods/HUD/awards/locale/awards.de.tr | 248 ++++++---------------------- mods/HUD/awards/locale/template.txt | 247 ++++++--------------------- 2 files changed, 101 insertions(+), 394 deletions(-) diff --git a/mods/HUD/awards/locale/awards.de.tr b/mods/HUD/awards/locale/awards.de.tr index 3396a34f0..4334a0b69 100644 --- a/mods/HUD/awards/locale/awards.de.tr +++ b/mods/HUD/awards/locale/awards.de.tr @@ -1,198 +1,50 @@ -A Cat in a Pop-Tart?! = Eine Katze im Pop-Tart?! -Aspiring Farmer = Aufstrebender Bauer -Backpacker = Rucksacktourist -Bankier = Bankier -Bricker = Ziegler -Build a Cave = Höhlenbauer -Castorama = Gießmeister -Craft 10 furnaces. = Fertigen Sie 10 Öfen. -Craft 10 mese lamps. = Fertigen Sie 10 Meselampen. -Craft 100 obsidian bricks. = Fertigen Sie 100 Obsidianziegel. -Craft 100 sandstone bricks. = Fertigen Sie 100 Sandsteinziegel. -Craft 100 sticks. = Fertigen Sie 100 Stöcke. -Craft 100 white dyes. = Fertigen Sie 100 weiße Farbstoffe. -Craft 14 vessels shelves. = Fertigen Sie 14 Gefäßregale. -Craft 15 chests. = Fertigen Sie 15 Truhen. -Craft 15 fancy beds. = Fertigen Sie 15 schicke Betten. -Craft 200 brick blocks. = Fertigen Sie 200 Ziegelblöcke. -Craft 200 stone bricks. = Fertigen Sie 200 Steinziegel. -Craft 24 gold block stairs. = Fertigen Sie 24 Goldblockstufen. -Craft 250 white wool. = Fertigen Sie 250 weiße Wolle. -Craft 3,200 stone bricks. = Fertigen Sie 3200 Steinziegel. -Craft 30 locked chests. = Fertigen Sie 30 abgeschlossene Truhen. -Craft 4 large bags. = Fertigen Sie 4 große Taschen. -Craft 400 blue dyes. = Fertigen Sie 400 blaue Farbstoffe. -Craft 400 desert stone bricks. = Fertigen Sie 400 Wüstensteinziegel. -Craft 400 red dyes. = Fertigen Sie 400 rote Farbstoffe. -Craft 400 yellow dyes. = Fertigen Sie 400 gelbe Farbstoffe. -Craft 7 bookshelves. = Fertigen Sie 7 Bücherregale. -Craft 8 times flint and steel. = Fertigen Sie 8 mal einen Feuerstein und Stahl an. -Craft 800 stone bricks. = Fertigen Sie 800 Steinziegel an. -Craft a diamond block. = Fertigen Sie einen Diamantblock an. -Crafter of Sticks = Stockmacher -Dandelions are Yellow = Löwenzahn ist gelb -Desert Discoverer = Wüstenerkunder -Desert Dweller = Wüstenbewohner -Dig 1,000 copper ores. = Bauen Sie 1000 Kupfererze ab. -Dig 1,000 jungle tree blocks. = Bauen Sie 1000 Dschungelbaumblöcke ab. -Dig 1,000 sand. = Bauen Sie 1000 Sand ab. -Dig 1,000 stone blocks. = Bauen Sie 1000 Steine ab. -Dig 1,296 tree blocks. = Bauen Sie 1296 Baumblöcke ab. -Dig 10,000 stone blocks. = Bauen Sie 10000 Steine ab. -Dig 100 jungle tree blocks. = Bauen Sie 100 Dschungelbaumblöcke ab. -Dig 100 stone blocks. = Bauen Sie 100 Steinblöcke ab. -Dig 216 tree blocks. = Bauen Sie 216 Baumblöcke ab. -Dig 36 tree blocks. = Bauen Sie 36 Baumblöcke ab. -Dig 6 tree blocks. = Bauen Sie 6 Baumblöcke ab. -Far Lands = Ferne Lande -Farming Skills Aquired = Landwirtschaft erlernt -Field Worker = Feldarbeiter -Filthy Rich = Stinkreich -Firefighter = Feuerwehr -First Day in the Woods = Erster Tag im Wald -First Gold Find = Erster Goldfund -First Mese Find = Erster Mesefund -Fortress = Burg -Geraniums are Blue = Geranien sind blau -Girl's Best Friend = Bester Freund der Mädchen -Glacier Discoverer = Gletschererkunder -Glasser = Glasmacher -Gold Rush = Goldrausch -Grasslands Discoverer = Prärieerkunder -Hardened Miner = Abhehärteter Bergarbeiter -Hardest Block on Earth = Härtester Block der Welt -Harvest 125 fully grown wheat plants. = Ernten Sie 125 voll ausgewachsene Getreidepflanzen. -Harvest 25 fully grown wheat plants. = Ernten Sie 25 voll ausgewachsene Getreidepflanzen. -Harvest 625 fully grown wheat plants. = Ernten Sie 625 voll ausgewachsene Getreidepflanzen. -Harvest a fully grown wheat plant. = Ernten Sie eine voll ausgewachsene Getreidepflanze. -Hotelier = Hotelier -House of Obsidian = Haus aus Obsidian -In the Dungeon = Im Verlies -Industrial Age = Industriezeitalter -Jungle Discoverer = Dschungelerkunder -Junglebaby = Dschungelbaby -Jungleman = Dschungelmann -Lava Miner = Lavagräber -Lava and Water = Lava und Wasser -Light It Up = Licht an! -Little Library = Kleine Bücherei -Long Ladder = Lange Leiter -Lumberjack = Holzfäller -Marchand De Sable = -Master Miner = Profibergarbeiter -Mese Mastery = Mesemeister -Mine 18 diamond ores. = Bauen Sie 18 Diamanterze ab. -Mine 45 gold ores. = Bauen Sie 18 Diamanterze ab. -Mine 50 obsidian. = Bauen Sie 50 Obsidian ab. -Mine a mese block. = Bauen Sie einen Meseblock ab. -Mine a mossy cobblestone. = Bauen Sie ein bemoostes Kopfsteinpflaster ab. -Mine a nyan cat. = Bauen Sie eine Nyan Cat ab. -Mine any block while being very close to lava. = Bauen Sie einen beliebigen Block ab, während Sie sehr nahe an der Lava stehen. -Mine some dry grass. = Bauen Sie etwas trockenes Gras ab. -Mine some grass. = Bauen Sie etwas Gras ab. -Mine your first cactus. = Bauen Sie Ihren ersten Kaktus ab. -Mine your first diamond ore. = Bauen Sie Ihr erstes Diamanterz ab. -Mine your first dry shrub. = Bauen Sie Ihren ersten vertrockneten Strauch ab. -Mine your first gold ore. = Bauen Sie Ihr erstes Golderz ab. -Mine your first ice. = Bauen Sie Ihr erstes Eis ab. -Mine your first jungle grass. = Bauen Sie Ihr erstes Dschungelgras ab. -Mine your first mese ore. = Bauen Sie Ihr erstes Meseerz ab. -Mine your first obsidian. = Bauen Sie Ihr erstes Obsidian ab. -Mini Miner = Berganfänger -Obsessed with Obsidian = Von Obsidian besessen -On The Way = Auf dem Weg -Outpost = Außenposten -Pharaoh = Pharao -Place 1,000 torches. = Platzieren Sie 1000 Fackeln. -Place 100 rails. = Platzieren Sie 100 Gleise. -Place 100 stone. = Platzieren Sie 100 Steine. -Place 100 torches. = Platzieren Sie 100 Fackeln. -Place 2 trap stones. = Platzieren Sie 2 Fallensteine. -Place 20 coal checkers. = Platzieren Sie 20 Kohlenschachbrettmuster. -Place 20 iron checkers. = Platzieren Sie 20 Eisenschachbrettmuster. -Place 40 steel ladders. = Platzieren Sie 40 Stahlleitern. -Place 400 wooden ladders. = Platzieren Sie 400 Holzleitern. -Place two snow blocks. = Platzieren Sie zwei Schneeblöcke. -Professional Lumberjack = Profiholzfäller -Put out 1000 fires. = Löschen Sie 1000 Flammen. -Pyromaniac = Pyromane -Really Well Lit = Sehr gute Beleuchtung -Roses Are Red = Rosen sind rot -Saint-Maclou = Saint-Maclou -Sam the Trapper = Sam der Fallensteller -Savannah Discoverer = Savannenerkunder -Semi-pro Lumberjack = Fortgeschrittener Holzfäller -Smelter = Schmelzer -Treasurer = Schatzmeister -Very Simple Snow Man = Sehr simpler Schneemann -Watchtower = Wachturm -Well Lit = Gut ausgeleuchtet -Wheat Magnate = Getreidemagnat -White Color Stock = Weißer Farbstoffvorrat -Wool Over Your Eyes = Wollige Augen -Wow, I am Diamonds! = Wow, ich bin Diamanten! -You’re a copper = Du Kupfer! -%s: %s = %s: %s -%s (got) = %s (erhalten) -%s’s awards: = %ss Auszeichnungen: -(Secret Award) = (Geheime Auszeichnung) -Achievement gotten! = Auszeichnung erhalten! -Achievement gotten: = Auszeichnung erhalten: -Achievement gotten: %s = Auszeichnung erhalten: %s -Secret achievement gotten! = Geheime Auszeichnung erhalten! -Secret achievement gotten: = Geheime Auszeichnung erhalten: -Secret achievement gotten: %s = Geheime Auszeichnung erhalten: %s -Get this achievement to find out what it is. = Verdienen Sie sich diese Auszeichnung, um herauszufinden, was sie ist. -You have not gotten any awards. = Sie haben noch keine Auszeichnungen. -You've disabled awards. Type /awards enable to reenable. = Sie haben die Auszeichnungen deaktiviert. Geben Sie »/awards enable« ein, um sie wieder zu aktivieren. - = - = -Achievement not found. = Auszeichnung nicht gefunden. -All your awards and statistics have been cleared. You can now start again. = All Ihre Auszeichnugen und Statistiken wurden zurückgesetzt. Sie können nun von vorne anfangen. -Get the achievements statistics for the given player or yourself = Die Statistik der Auszeichnungen eines Spielers zeigen -List awards in chat (deprecated) = Auszeichnungen im Chat anzeigen (veraltet) -Show, clear, disable or enable your achievements = Zeigen, löschen, deaktivieren oder aktivieren Sie Ihre Auszeichnungen -You have disabled your achievements. = Sie haben Ihre Auszeichnungen deaktiviert. -You have enabled your achievements. = Sie haben Ihre Auszeichnungen aktiviert. -[c|clear|disable|enable] = [c|clear|disable|enable] -Awards = Auszeichnungen -%d/%d crafted = %d/%d gefertigt -%d/%d deaths = %d/%d Tode -%d/%d dug = %d/%d abgebaut -%d/%d game joins = %d/%d Spielen beigetreten -%d/%d lines of chat = %d/%d Chatzeilen -%d/%d placed = %d/%d platziert -Die %d times. = Sterben Sie %d mal. -Die. = Sterben Sie. -Craft: %d×%s = Fertigen Sie an: %d×%s -Craft: %s = Fertigen Sie an: %s -Mine a block: %s = Bauen Sie einen Block ab: %s -Mine blocks: %d×%s = Bauen Sie Blöcke ab: %d×%s -Place a block: %s = Platzieren Sie einen Block: %s -Place blocks: %d×%s = Platzieren Sie Blöcke: %d×%s -Join the game. = Treten Sie dem Spiel bei. -Join the game %d times. = Treten Sie dem Spiel %d mal bei. -Show details of an achievement = Details einer Auszeichnung anzeigen -OK = OK -Error: No awards available. = Fehler: Keine Auszeichnungen vorhanden. -Eat: %d×%s = Essen Sie: %d×%s -Eat: %s = Essen Sie: %s -%d/%d eaten = %d/%d gegessen -Yummy! = Lecker! -Baker = Bäcker -Eat 10 loaves of bread. = Essen Sie 10 Brote. -Eat 80 apples. = Essen Sie 80 Äpfel. -Tasty Mushrooms = Leckere Pilze -Mushroom Lover = Pilzfreund -Underground Mushroom Farmer = Unterirdischer Pilzbauer -Eat 3 brown mushrooms. = Essen Sie 3 braune Pilze. -Eat 33 brown mushrooms. = Essen Sie 33 braune Pilze. -Eat 333 brown mushrooms. = Essen Sie 333 braune Pilze. -Builder = Bauarbeiter -Constructor = Konstrukteur -Architect = Architekt -Master Architect = Meisterarchitekt -Place %d block(s). = Platzieren Sie %d Blöcke. -Dig %d block(s). = Bauen Sie %d Blöcke ab. -Eat %d item(s). = Essen Sie %d Dinge. -Craft %d item(s). = Fertigen Sie %d Gegenstände. +%s: %s=%s: %s +%s (got)=%s (erhalten) +%s’s awards:=%ss Auszeichnungen: +(Secret Award)=(Geheime Auszeichnung) +Achievement gotten!=Auszeichnung erhalten! +Achievement gotten:=Auszeichnung erhalten: +Achievement gotten: %s=Auszeichnung erhalten: %s +Secret achievement gotten!=Geheime Auszeichnung erhalten! +Secret achievement gotten:=Geheime Auszeichnung erhalten: +Secret achievement gotten: %s=Geheime Auszeichnung erhalten: %s +Get this achievement to find out what it is.=Verdienen Sie sich diese Auszeichnung, um herauszufinden, was sie ist. +You have not gotten any awards.=Sie haben noch keine Auszeichnungen. +You've disabled awards. Type /awards enable to reenable.=Sie haben die Auszeichnungen deaktiviert. Geben Sie »/awards enable« ein, um sie wieder zu aktivieren. += += +Achievement not found.=Auszeichnung nicht gefunden. +All your awards and statistics have been cleared. You can now start again.=All Ihre Auszeichnugen und Statistiken wurden zurückgesetzt. Sie können nun von vorne anfangen. +Get the achievements statistics for the given player or yourself=Die Statistik der Auszeichnungen eines Spielers zeigen +List awards in chat (deprecated)=Auszeichnungen im Chat anzeigen (veraltet) +Show, clear, disable or enable your achievements=Zeigen, löschen, deaktivieren oder aktivieren Sie Ihre Auszeichnungen +You have disabled your achievements.=Sie haben Ihre Auszeichnungen deaktiviert. +You have enabled your achievements.=Sie haben Ihre Auszeichnungen aktiviert. +[c|clear|disable|enable]=[c|clear|disable|enable] +Awards=Auszeichnungen +%d/%d crafted=%d/%d gefertigt +%d/%d deaths=%d/%d Tode +%d/%d dug=%d/%d abgebaut +%d/%d game joins=%d/%d Spielen beigetreten +%d/%d lines of chat=%d/%d Chatzeilen +%d/%d placed=%d/%d platziert +Die %d times.=Sterben Sie %d mal. +Die.=Sterben Sie. +Craft: %d×%s=Fertigen Sie an: %d×%s +Craft: %s=Fertigen Sie an: %s +Mine a block: %s=Bauen Sie einen Block ab: %s +Mine blocks: %d×%s=Bauen Sie Blöcke ab: %d×%s +Place a block: %s=Platzieren Sie einen Block: %s +Place blocks: %d×%s=Platzieren Sie Blöcke: %d×%s +Join the game.=Treten Sie dem Spiel bei. +Join the game %d times.=Treten Sie dem Spiel %d mal bei. +Show details of an achievement=Details einer Auszeichnung anzeigen +OK=OK +Error: No awards available.=Fehler: Keine Auszeichnungen vorhanden. +Eat: %d×%s=Essen Sie: %d×%s +Eat: %s=Essen Sie: %s +%d/%d eaten=%d/%d gegessen +Place %d block(s).=Platzieren Sie %d Blöcke. +Dig %d block(s).=Bauen Sie %d Blöcke ab. +Eat %d item(s).=Essen Sie %d Dinge. +Craft %d item(s).=Fertigen Sie %d Gegenstände. diff --git a/mods/HUD/awards/locale/template.txt b/mods/HUD/awards/locale/template.txt index eecb0c5f8..c5ca6ab69 100644 --- a/mods/HUD/awards/locale/template.txt +++ b/mods/HUD/awards/locale/template.txt @@ -1,196 +1,51 @@ -%d/%d chat messages = -%d/%d crafted = -%d/%d deaths = -%d/%d dug = -%d/%d game joins = -%d/%d placed = -%s (got) = -%s: %s = -%s’s awards: = -(Secret Award) = - = - = -A Cat in a Pop-Tart?! = -Achievement gotten! = -Achievement gotten: = -Achievement gotten: %s = -Achievement not found. = -All your awards and statistics have been cleared. You can now start again. = -Aspiring Farmer = -Awards = -Backpacker = -Bankier = -Bricker = -Build a Cave = -Castorama = -Craft 10 furnaces. = -Craft 10 mese lamps. = -Craft 100 obsidian bricks. = -Craft 100 sandstone bricks. = -Craft 100 sticks. = -Craft 100 white dyes. = -Craft 14 vessels shelves. = -Craft 15 chests. = -Craft 15 fancy beds. = -Craft 200 brick blocks. = -Craft 200 stone bricks. = -Craft 24 gold block stairs. = -Craft 250 white wool. = -Craft 3,200 stone bricks. = -Craft 30 locked chests. = -Craft 4 large bags. = -Craft 400 blue dyes. = -Craft 400 desert stone bricks. = -Craft 400 red dyes. = -Craft 400 yellow dyes. = -Craft 7 bookshelves. = -Craft 8 times flint and steel. = -Craft 800 stone bricks. = -Craft a diamond block. = -Craft: %d×%s = -Craft: %s = -Crafter of Sticks = -Dandelions are Yellow = -Desert Discoverer = -Desert Dweller = -Die %d times. = -Die. = -Dig 1,000 copper ores. = -Dig 1,000 jungle tree blocks. = -Dig 1,000 sand. = -Dig 1,000 stone blocks. = -Dig 1,296 tree blocks. = -Dig 10,000 stone blocks. = -Dig 100 jungle tree blocks. = -Dig 100 stone blocks. = -Dig 216 tree blocks. = -Dig 36 tree blocks. = -Dig 6 tree blocks. = -Far Lands = -Farming Skills Aquired = -Field Worker = -Filthy Rich = -Firefighter = -First Day in the Woods = -First Gold Find = -First Mese Find = -Fortress = -Geraniums are Blue = -Get the achievements statistics for the given player or yourself = -Girl's Best Friend = -Glacier Discoverer = -Glasser = -Gold Rush = -Grasslands Discoverer = -Hardened Miner = -Hardest Block on Earth = -Harvest 125 fully grown wheat plants. = -Harvest 25 fully grown wheat plants. = -Harvest 625 fully grown wheat plants. = -Harvest a fully grown wheat plant. = -Hotelier = -House of Obsidian = -In the Dungeon = -Industrial Age = -Join the game %d times. = -Join the game. = -Jungle Discoverer = -Junglebaby = -Jungleman = -Lava Miner = -Lava and Water = -Light It Up = -List awards in chat (deprecated) = -Little Library = -Long Ladder = -Lumberjack = -Marchand De Sable = -Master Miner = -Mese Mastery = -Mine 18 diamond ores. = -Mine 45 gold ores. = -Mine 50 obsidian. = -Mine a block: %s = -Mine a mese block. = -Mine a mossy cobblestone. = -Mine a nyan cat. = -Mine any block while being very close to lava. = -Mine blocks: %d×%s = -Mine some dry grass. = -Mine some grass. = -Mine your first cactus. = -Mine your first diamond ore. = -Mine your first dry shrub. = -Mine your first gold ore. = -Mine your first ice. = -Mine your first jungle grass. = -Mine your first mese ore. = -Mine your first obsidian. = -Mini Miner = -Obsessed with Obsidian = -On The Way = -Outpost = -Pharaoh = -Place 1,000 torches. = -Place 100 rails. = -Place 100 stone. = -Place 100 torches. = -Place 2 trap stones. = -Place 20 coal checkers. = -Place 20 iron checkers. = -Place 40 steel ladders. = -Place 400 wooden ladders. = -Place a block: %s = -Place blocks: %d×%s = -Place two snow blocks. = -Professional Lumberjack = -Put out 1000 fires. = -Pyromaniac = -Really Well Lit = -Roses Are Red = -Saint-Maclou = -Sam the Trapper = -Savannah Discoverer = -Secret Achievement gotten! = -Secret Achievement gotten: = -Secret Achievement gotten: %s = -Semi-pro Lumberjack = -Show details of an achievement = -Show, clear, disable or enable your achievements = -Smelter = -Treasurer = -Get this achievement to find out what it is. = -Very Simple Snow Man = -Watchtower = -Well Lit = -Wheat Magnate = -White Color Stock = -Wool Over Your Eyes = -Wow, I am Diamonds! = -Write %d chat messages. = -Write something in chat. = -You have disabled your achievements. = -You have enabled your achievements. = -You have not gotten any awards. = -You've disabled awards. Type /awards enable to reenable. = -You’re a copper = -[c|clear|disable|enable] = -OK = -Error: No awards available. = -Eat: %d×%s = -Eat: %s = -%d/%d eaten = -Place %d block(s). = -Dig %d block(s). = -Eat %d item(s). = -Craft %d item(s). = -Yummy! = -Baker = -Eat 10 loaves of bread. = -Eat 80 apples. = -Tasty Mushrooms = -Mushroom Lover = -Underground Mushroom Farmer = -Eat 3 brown mushrooms. = -Eat 33 brown mushrooms. = -Eat 333 brown mushrooms. = +%d/%d chat messages= +%d/%d crafted= +%d/%d deaths= +%d/%d dug= +%d/%d game joins= +%d/%d placed= +%s (got)= +%s: %s= +%s’s awards:= +(Secret Award)= += += +A Cat in a Pop-Tart?!= +Achievement gotten!= +Achievement gotten:= +Achievement gotten: %s= +Achievement not found.= +All your awards and statistics have been cleared. You can now start again.= +Awards= +Craft: %d×%s= +Craft: %s= +Die %d times.= +Die.= +Get the achievements statistics for the given player or yourself= +Join the game %d times.= +Join the game.= +List awards in chat (deprecated)= +Place a block: %s= +Place blocks: %d×%s= +Secret Achievement gotten!= +Secret Achievement gotten:= +Secret Achievement gotten: %s= +Show details of an achievement= +Show, clear, disable or enable your achievements= +Get this achievement to find out what it is.= +Write %d chat messages.= +Write something in chat.= +You have disabled your achievements.= +You have enabled your achievements.= +You have not gotten any awards.= +You've disabled awards. Type /awards enable to reenable.= +[c|clear|disable|enable]= +OK= +Error: No awards available.= +Eat: %d×%s= +Eat: %s= +%d/%d eaten= +Place %d block(s).= +Dig %d block(s).= +Eat %d item(s).= +Craft %d item(s).= From 293dd036f84fcdb8bf2627507c8664b2510cfff9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 01:50:29 +0100 Subject: [PATCH 170/379] German translations: HUD --- mods/HUD/awards/locale/awards.de.tr | 2 +- .../locale/mcl_achievements.de.tr | 49 +++++++++++++++++ .../locale/mcl_death_messages.de.tr | 53 +++++++++++++++++++ mods/HUD/mcl_inventory/creative.lua | 36 ++++++------- mods/HUD/mcl_inventory/init.lua | 10 ++-- .../mcl_inventory/locale/mcl_inventory.de.tr | 17 ++++++ mods/HUD/mcl_inventory/locale/template.txt | 16 ++++++ 7 files changed, 159 insertions(+), 24 deletions(-) create mode 100644 mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr create mode 100644 mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr create mode 100644 mods/HUD/mcl_inventory/locale/mcl_inventory.de.tr diff --git a/mods/HUD/awards/locale/awards.de.tr b/mods/HUD/awards/locale/awards.de.tr index 4334a0b69..6fd3661aa 100644 --- a/mods/HUD/awards/locale/awards.de.tr +++ b/mods/HUD/awards/locale/awards.de.tr @@ -1,6 +1,6 @@ %s: %s=%s: %s %s (got)=%s (erhalten) -%s’s awards:=%ss Auszeichnungen: +%s’s awards:=Auszeichnungen von %s: (Secret Award)=(Geheime Auszeichnung) Achievement gotten!=Auszeichnung erhalten! Achievement gotten:=Auszeichnung erhalten: diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr new file mode 100644 index 000000000..28f982726 --- /dev/null +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr @@ -0,0 +1,49 @@ +# textdomain: mcl_achievements +Aquire Hardware=Schmied +Bake Bread=Brot backen +Benchmarking=Tischler +Cow Tipper=Kuhschubser +Craft a bookshelf.=Fertigen Sie ein Bücherregal +Craft a cake using wheat, sugar, milk and an egg.=Fertigen Sie einen Kuchen mit Weizen, Zucker, Milch und einem Ei. +Craft a crafting table from 4 wooden planks.=Fertigen Sie eine Werkbank aus 4 Holzplanken. +Craft a stone pickaxe using sticks and cobblestone.=Fertigen Sie eine Steinspitzhacke mit Stöcken und Kopfsteinpflaster. +Craft a wooden sword using wooden planks and sticks on a crafting table.=Fertigen Sie ein Holzschwert mit Holzplanken und Stöcken an einer Werkbank. +DIAMONDS!=DIAMANTEN! +Delicious Fish=Leckerer Fisch +Dispense With This=Ein Auge darauf werfen +Eat a cooked porkchop.=Essen Sie ein gekochtes Schweinekotelett +Eat a cooked rabbit.=Essen Sie ein gekochtes Kaninchen +Get really desperate and eat rotten flesh.=Verzweifeln Sie und essen Sie Gammelfleisch. +Getting Wood=Holzhacker +Getting an Upgrade=Aufwertung +Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.=Treffen Sie ein Skelett, Witherskelett oder einen Eiswanderer mit Bogen und Pfeil aus einer Entfernung von mindestens 20 Metern. +Hot Topic=Heißes Eisen +Into Fire=In das Feuer +Into the Nether=In den Nether +Iron Belly=Eiserner Magen +Librarian=Bibliothekar +Mine emerald ore.=Bauen Sie Smaragderz ab. +On A Rail=Auf der Schiene +Pick up a blaze rod from the floor.=Sammeln Sie eine Lohenrute vom Boden auf. +Pick up a diamond from the floor.=Sammeln Sie einen Diamanten vom Boden auf. +Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.=Sammeln Sie ein Holz vom Boden auf.@nTipp: Hauen Sie einen Baumstamm, bis er als Gegenstand herausploppt. +Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.=Sammeln Sie Leder vom Boden auf.@nTipp: Kühe und einige andere Tiere werfen vielleicht Leder ab, wenn sie sterben. +Place a dispenser.=Platzieren Sie einen Werfer +Place a flower pot.=Platzieren Sie einen Blumentopf +Pork Chop=Kassler +Pot Planter=Topfpflanzer +Rabbit Season=Kaninchensaison +Sniper Duel=Scharfschützenduell +Take a cooked fish from a furnace.@nHint: Use a fishing rod to catch a fish and cook it in a furnace.=Nehmen Sie einen gekochten Fisch aus einem Ofen.@nTipp: Benutzen Sie eine Angel, um einen Fisch zu fangen und kochen Sie ihn in einem Ofen. +Take an iron ingot from a furnace's output slot.@nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace.=Nehmen Sie einen Eisenbarren aus dem Ausgabeschlitz eines Ofens.@nTipp: Um einen Eisenbarren zu erhalten, platzieren Sie einen Brennstoff (wie Kohle) und Eisenerz in einen Ofen. +The Haggler=Der Sammler +The Lie=Die Lüge +Time to Farm!=Bauernzeit +Time to Mine!=Zeit zum Graben! +Time to Strike!=Zuschlagen! +Travel by minecart for at least 1000 meters from your starting point in a single ride.=Reisen Sie mit einer Lore für mindestens 1000 Meter vom Startpunkt in einer einzigen Fahrt. +Use 8 cobblestones to craft a furnace.=Benutzen Sie 8 Kopfsteinpflaster, um einen Ofen zu fertigen. +Use a crafting table to craft a wooden hoe from wooden planks and sticks.=Benutzen Sie eine Werkbank, um eine Holzhacke aus Holzplanken und Stöcken zu fertigen. +Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.=Benutzen Sie eine Werkbank, um eine Holzspitzhacke aus Holzplanken und Stöcken zu fertigen. +Use obsidian and a fire starter to construct a Nether portal.=Benutzen Sie Obsidian und ein Feuerzeug, um ein Netherportal zu errichten. +Use wheat to craft a bread.=Benutzen Sie Weizen, um ein Brot zu machen. diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr new file mode 100644 index 000000000..4a65a08cd --- /dev/null +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr @@ -0,0 +1,53 @@ +# textdomain: mcl_death_messages +%s was fatally hit by an arrow.=%s wurde tödlich von einem Pfeil getroffen. +%s has been killed with an arrow.=%s wurde mit einem Pfeil getötet. +%s was shot by an arrow from %s.=%s wurde mit einem Pfeil von %s abgeschossen. +%s forgot to breathe.=%s vergaß, zu atmen. +%s drowned.=%s ertrank. +%s ran out of oxygen.=%s ging die Luft aus. +%s was killed by %s.=%s wurde von %s getötet. +%s was killed by a mob.=%s wurde von einem Mob getötet. +%s was burned to death by a blaze's fireball.=%s wurde von einem Feuerball einer Lohe zu Tode verbrannt. +%s was killed by a fireball from a blaze.=%s wurde von einem Feuerball einer Lohe getötet. +%s was burned by a fire charge.=%s wurde von einer Feuerkugel verbrannt. +A ghast scared %s to death.=Ein Ghast hat %s zu Tode erschrocken. +%s has been fireballed by a ghast.=%s wurde von einem Ghast mit einer Feuerkugel abgeschossen. +%s fell from a high cliff.=%s stürzte von einer hohen Klippe. +%s took fatal fall damage.=%s nahm tödlichen Fallschaden. +%s fell victim to gravity.=%s fiel der Schwerkraft zum Opfer. +%s died.=%s starb. +%s was killed by a zombie.=%s wurde von einem Zombie getötet. +%s was killed by a baby zombie.=%s wurde von einem Zombiebaby getötet. +%s was killed by a blaze.=%s wurde von einer Lohe getötet. +%s was killed by a slime.=%s wurde von einem Schleim getötet. +%s was killed by a witch.=%s wurde von einer Hexe getötet. +%s was killed by a magma cube.=%s wurde von einem Magmakubus getötet. +%s was killed by a wolf.=%s wurde von einem Wolf getötet. +%s was killed by a cat.=%s wurde von einer Katze getötet. +%s was killed by an ocelot.=%s wurde von einem Ozelot getötet. +%s was killed by an ender dragon.=%s wurde von einem Enderdrachen getötet. +%s was killed by a wither.=%s wurde von einem Wither getötet. +%s was killed by an enderman.=%s wurde von einem Enderman getötet. +%s was killed by an endermite.=%s wurde von einer Endermilbe getötet. +%s was killed by a ghast.=%s wurde von einem Ghast getötet. +%s was killed by an elder guardian.=%s wurde von einem Großen Wächter getötet. +%s was killed by a guardian.=%s wurde von einem Wächter getötet. +%s was killed by an iron golem.=%s wurde von einem Eisengolem getötet. +%s was killed by a polar_bear.=%s wurde von einem Eisbären getötet. +%s was killed by a killer bunny.=%s wurde von einem Killerkaninchen getötet. +%s was killed by a shulker.=%s wurde von einem Shulker getötet. +%s was killed by a silverfish.=%s wurde von einem Silberfischchen getötet. +%s was killed by a skeleton.=%s wurde von einem Skelett getötet. +%s was killed by a stray.=%s wurde von einem Eiswanderer getötet. +%s was killed by a slime.=%s wurde von einem Schleim getötet. +%s was killed by a spider.=%s wurde von einer Spinne getötet. +%s was killed by a cave spider.=%s wurde von einer Höhlenspinne getötet. +%s was killed by a vex.=%s wurde von einem Plagegeist getötet. +%s was killed by an evoker.=%s wurde von einem Magier getötet. +%s was killed by an illusioner.=%s wurde von einem Illusionisten getötet. +%s was killed by a vindicator.=%s wurde von einem Diener getötet. +%s was killed by a zombie villager.=%s wurde von einem Dorfbewohnerzombie getötet. +%s was killed by a husk.=%s wurde von einem Wüstenzombie getötet. +%s was killed by a baby husk.=%s wurde von einem Wüstenzombiebaby getötet. +%s was killed by a zombie pigman.=%s wurde von einem Schweinezombie getötet. +%s was killed by a baby zombie pigman.=%s wurde von einem Schweinezombiebaby getötet. diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 8b3eef709..1df142388 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -1,5 +1,5 @@ local S = minetest.get_translator("mcl_inventory") -local F = function(s) return minetest.formspec_escape(S(s)) end +local F = minetest.formspec_escape -- Prepare player info table local players = {} @@ -323,16 +323,16 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz player_preview.. -- crafting guide button "image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]".. - "tooltip[__mcl_craftguide;"..F("Recipe book").."]".. + "tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]".. -- help button "image_button[9,2;1,1;doc_button_icon_lores.png;__mcl_doc;]".. - "tooltip[__mcl_doc;"..F("Help").."]".. + "tooltip[__mcl_doc;"..F(S("Help")).."]".. -- skins button "image_button[9,3;1,1;mcl_skins_button.png;__mcl_skins;]".. - "tooltip[__mcl_skins;"..F("Select player skin").."]".. + "tooltip[__mcl_skins;"..F(S("Select player skin")).."]".. -- achievements button "image_button[9,4;1,1;mcl_achievements_button.png;__mcl_achievements;]".. - "tooltip[__mcl_achievements;"..F("Achievements").."]" + "tooltip[__mcl_achievements;"..F(S("Achievements")).."]" -- For shortcuts listrings = listrings .. @@ -385,35 +385,35 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz "background[-0.19,-0.25;10.5,9.87;"..inv_bg.."]".. "label[-5,-5;"..name.."]".. tab(name, "blocks") .. - "tooltip[blocks;"..F("Building Blocks").."]".. + "tooltip[blocks;"..F(S("Building Blocks")).."]".. tab(name, "deco") .. - "tooltip[deco;"..F("Decoration Blocks").."]".. + "tooltip[deco;"..F(S("Decoration Blocks")).."]".. tab(name, "redstone") .. - "tooltip[redstone;"..F("Redstone").."]".. + "tooltip[redstone;"..F(S("Redstone")).."]".. tab(name, "rail") .. - "tooltip[rail;"..F("Transportation").."]".. + "tooltip[rail;"..F(S("Transportation")).."]".. tab(name, "misc") .. - "tooltip[misc;"..F("Miscellaneous").."]".. + "tooltip[misc;"..F(S("Miscellaneous")).."]".. tab(name, "nix") .. - "tooltip[nix;"..F("Search Items").."]".. + "tooltip[nix;"..F(S("Search Items")).."]".. fnt.. "list[current_player;main;0,7;9,1;]".. main_list.. tab(name, "food") .. - "tooltip[food;"..F("Foodstuffs").."]".. + "tooltip[food;"..F(S("Foodstuffs")).."]".. tab(name, "tools") .. - "tooltip[tools;"..F("Tools").."]".. + "tooltip[tools;"..F(S("Tools")).."]".. tab(name, "combat") .. - "tooltip[combat;"..F("Combat").."]".. + "tooltip[combat;"..F(S("Combat")).."]".. tab(name, "mobs") .. - "tooltip[mobs;"..F("Mobs").."]".. + "tooltip[mobs;"..F(S("Mobs")).."]".. -- TODO: Add brew --tab(name, "brew") .. - --"tooltip[brew;"..F("Brewing").."]".. + --"tooltip[brew;"..F(S("Brewing")).."]".. tab(name, "matr") .. - "tooltip[matr;"..F("Materials").."]".. + "tooltip[matr;"..F(S("Materials")).."]".. tab(name, "inv") .. - "tooltip[inv;"..F("Survival Inventory").."]".. + "tooltip[inv;"..F(S("Survival Inventory")).."]".. "list[detached:trash;main;9,7;1,1;]".. "image[9,7;1,1;crafting_creative_trash.png]".. listrings diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 9738cd4db..2ca876bf4 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -1,5 +1,5 @@ local S = minetest.get_translator("mcl_inventory") -local F = function(s) return minetest.formspec_escape(S(s)) end +local F = minetest.formspec_escape mcl_inventory = {} @@ -105,16 +105,16 @@ local function set_inventory(player, armor_change_only) "list[current_player;craftpreview;7,1.5;1,1;]".. -- crafting guide button "image_button[4.5,3;1,1;craftguide_book.png;__mcl_craftguide;]".. - "tooltip[__mcl_craftguide;"..F("Recipe book").."]".. + "tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]".. -- help button "image_button[8,3;1,1;doc_button_icon_lores.png;__mcl_doc;]".. - "tooltip[__mcl_doc;"..F("Help").."]".. + "tooltip[__mcl_doc;"..F(S("Help")).."]".. -- skins button "image_button[3,3;1,1;mcl_skins_button.png;__mcl_skins;]".. - "tooltip[__mcl_skins;"..F("Select player skin").."]".. + "tooltip[__mcl_skins;"..F(S("Select player skin")).."]".. -- achievements button "image_button[7,3;1,1;mcl_achievements_button.png;__mcl_achievements;]".. - "tooltip[__mcl_achievements;"..F("Achievements").."]".. + "tooltip[__mcl_achievements;"..F(S("Achievements")).."]".. -- for shortcuts "listring[current_player;main]".. "listring[current_player;craft]".. diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.de.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.de.tr new file mode 100644 index 000000000..e14220e77 --- /dev/null +++ b/mods/HUD/mcl_inventory/locale/mcl_inventory.de.tr @@ -0,0 +1,17 @@ +# textdomain: mcl_inventory +Recipe book=Fertigungsbuch +Help=Hilfe +Select player skin=Spieleraussehen ändern +Achievements=Errungenschaften +Building Blocks=Baublöcke +Decoration Blocks=Dekoblöcke +Redstone=Redstone +Transportation=Transport +Miscellaneous=Sonstiges +Search Items=Gegenstände durchsuchen +Foodstuffs=Lebensmittel +Tools=Werkzeuge +Combat=Kampf +Mobs=Mobs +Materials=Materialien +Survival Inventory=Überlebensinventar diff --git a/mods/HUD/mcl_inventory/locale/template.txt b/mods/HUD/mcl_inventory/locale/template.txt index ed721afb5..27920490f 100644 --- a/mods/HUD/mcl_inventory/locale/template.txt +++ b/mods/HUD/mcl_inventory/locale/template.txt @@ -1 +1,17 @@ # textdomain: mcl_inventory +Recipe book= +Help= +Select player skin= +Achievements= +Building Blocks= +Decoration Blocks= +Redstone= +Transportation= +Miscellaneous= +Search Items= +Foodstuffs= +Tools= +Combat= +Mobs= +Materials= +Survival Inventory= From 45d09754d0edf809bc7c024d9625b5ca419cabb5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 01:59:31 +0100 Subject: [PATCH 171/379] German translation: mcl_structures --- mods/MAPGEN/mcl_structures/init.lua | 23 +++++++------------ .../locale/mcl_structures.de.tr | 7 ++++++ .../MAPGEN/mcl_structures/locale/template.txt | 7 ++++++ 3 files changed, 22 insertions(+), 15 deletions(-) create mode 100644 mods/MAPGEN/mcl_structures/locale/mcl_structures.de.tr create mode 100644 mods/MAPGEN/mcl_structures/locale/template.txt diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index 737722f2a..26fd7b2cc 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -1,4 +1,5 @@ local init = os.clock() +local S = minetest.get_translator("mcl_structures") mcl_structures ={} mcl_structures.get_struct = function(file) @@ -459,7 +460,7 @@ end -- Debug command minetest.register_chatcommand("spawnstruct", { params = "desert_temple | desert_well | igloo | village | witch_hut | boulder | ice_spike_small | ice_spike_large | fossil | end_exit_portal | end_portal_shrine", - description = "Generate a pre-defined structure near your position.", + description = S("Generate a pre-defined structure near your position."), privs = {debug = true}, func = function(name, param) local pos= minetest.get_player_by_name(name):get_pos() @@ -467,48 +468,40 @@ minetest.register_chatcommand("spawnstruct", { return end local errord = false + local message = S("Structure placed.") if param == "village" then mcl_structures.generate_village(pos) - minetest.chat_send_player(name, "Village built. WARNING: Villages are experimental and might have bugs.") + message = S("Village built. WARNING: Villages are experimental and might have bugs.") elseif param == "desert_temple" then mcl_structures.generate_desert_temple(pos) - minetest.chat_send_player(name, "Desert temple built.") elseif param == "desert_well" then mcl_structures.generate_desert_well(pos) - minetest.chat_send_player(name, "Desert well built.") elseif param == "igloo" then mcl_structures.generate_igloo_top(pos) - minetest.chat_send_player(name, "Igloo built.") elseif param == "witch_hut" then mcl_structures.generate_witch_hut(pos) - minetest.chat_send_player(name, "Witch hut built.") elseif param == "boulder" then mcl_structures.generate_boulder(pos) - minetest.chat_send_player(name, "Moss stone boulder placed.") elseif param == "fossil" then mcl_structures.generate_fossil(pos) - minetest.chat_send_player(name, "Fossil placed.") elseif param == "ice_spike_small" then mcl_structures.generate_ice_spike_small(pos) - minetest.chat_send_player(name, "Small ice spike placed.") elseif param == "ice_spike_large" then mcl_structures.generate_ice_spike_large(pos) - minetest.chat_send_player(name, "Large ice spike placed.") elseif param == "end_exit_portal" then mcl_structures.generate_end_exit_portal(pos) - minetest.chat_send_player(name, "End exit portal placed.") elseif param == "end_portal_shrine" then mcl_structures.generate_end_portal_shrine(pos) - minetest.chat_send_player(name, "End portal shrine placed.") elseif param == "" then - minetest.chat_send_player(name, "Error: No structure type given. Please use “/spawnstruct ”.") + message = S("Error: No structure type given. Please use “/spawnstruct ”.") errord = true else - minetest.chat_send_player(name, "Error: Unknown structure type. Please use “/spawnstruct ”.") + message = S("Error: Unknown structure type. Please use “/spawnstruct ”.") errord = true end + minetest.chat_send_player(name, message) if errord then - minetest.chat_send_player(name, "Use /help spawnstruct to see a list of avaiable types.") + minetest.chat_send_player(name, S("Use /help spawnstruct to see a list of avaiable types.")) end end }) diff --git a/mods/MAPGEN/mcl_structures/locale/mcl_structures.de.tr b/mods/MAPGEN/mcl_structures/locale/mcl_structures.de.tr new file mode 100644 index 000000000..e701b7879 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/locale/mcl_structures.de.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_structures +Generate a pre-defined structure near your position.=Erzeugt ein vordefiniertes Gebäude in Ihrer Nähe. +Structure placed.=Gebäude platziert. +Village built. WARNING: Villages are experimental and might have bugs.=Dorf gebaut. ACHTUNG: Dörfer sind experimentell und können fehlerhaft sein. +Error: No structure type given. Please use “/spawnstruct ”.=Fehler: Kein Gebäudetyp angegeben. Bitte benutzen Sie „/spawnstruct “. +Error: Unknown structure type. Please use “/spawnstruct ”.=Fehler: Unbekannter Gebäudetyp. Bitte benutzen Sie „/spawnstruct “. +Use /help spawnstruct to see a list of avaiable types.=Benutzen Sie „/help spawnstruct“, um eine Liste der vorhandenen Typen zu sehen. diff --git a/mods/MAPGEN/mcl_structures/locale/template.txt b/mods/MAPGEN/mcl_structures/locale/template.txt new file mode 100644 index 000000000..76f85c4c9 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/locale/template.txt @@ -0,0 +1,7 @@ +# textdomain: mcl_structures +Generate a pre-defined structure near your position.= +Structure placed.= +Village built. WARNING: Villages are experimental and might have bugs.= +Error: No structure type given. Please use “/spawnstruct ”.= +Error: Unknown structure type. Please use “/spawnstruct ”.= +Use /help spawnstruct to see a list of avaiable types.= From b72afa7e62fa459f314fd3aa2b4550f200967676 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 02:32:35 +0100 Subject: [PATCH 172/379] German translation: Player and Misc --- .../locale/mcl_doc_basics.de.tr | 437 +----------------- .../mcl_commands/locale/mcl_commands.de.tr | 20 + mods/MISC/mcl_privs/locale/mcl_privs.de.tr | 2 + mods/MISC/mcl_wip/description.txt | 2 +- mods/MISC/mcl_wip/init.lua | 2 + mods/MISC/mcl_wip/locale/mcl_wip.de.tr | 3 + mods/MISC/mcl_wip/locale/template.txt | 1 + mods/PLAYER/mcl_hunger/locale/de.txt | 1 - .../PLAYER/mcl_hunger/locale/mcl_hunger.de.tr | 8 + mods/PLAYER/mcl_hunger/locale/pt.txt | 1 - mods/PLAYER/mcl_hunger/locale/template.txt | 9 +- .../locale/mcl_playerplus.de.tr | 3 + mods/PLAYER/mcl_skins/init.lua | 2 +- mods/PLAYER/mcl_skins/locale/fr.po | 51 -- mods/PLAYER/mcl_skins/locale/it.po | 52 --- mods/PLAYER/mcl_skins/locale/mcl_skins.de.tr | 13 + mods/PLAYER/mcl_skins/locale/mcl_skins.fr.tr | 16 + mods/PLAYER/mcl_skins/locale/mcl_skins.ms.tr | 16 + mods/PLAYER/mcl_skins/locale/ms.po | 51 -- mods/PLAYER/mcl_skins/locale/template.pot | 50 -- mods/PLAYER/mcl_skins/locale/template.txt | 13 + mods/PLAYER/mcl_spawn/locale/mcl_spawn.de.tr | 4 + 22 files changed, 114 insertions(+), 643 deletions(-) create mode 100644 mods/MISC/mcl_commands/locale/mcl_commands.de.tr create mode 100644 mods/MISC/mcl_privs/locale/mcl_privs.de.tr create mode 100644 mods/MISC/mcl_wip/locale/mcl_wip.de.tr delete mode 100644 mods/PLAYER/mcl_hunger/locale/de.txt create mode 100644 mods/PLAYER/mcl_hunger/locale/mcl_hunger.de.tr delete mode 100644 mods/PLAYER/mcl_hunger/locale/pt.txt create mode 100644 mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.de.tr delete mode 100644 mods/PLAYER/mcl_skins/locale/fr.po delete mode 100644 mods/PLAYER/mcl_skins/locale/it.po create mode 100644 mods/PLAYER/mcl_skins/locale/mcl_skins.de.tr create mode 100644 mods/PLAYER/mcl_skins/locale/mcl_skins.fr.tr create mode 100644 mods/PLAYER/mcl_skins/locale/mcl_skins.ms.tr delete mode 100644 mods/PLAYER/mcl_skins/locale/ms.po delete mode 100644 mods/PLAYER/mcl_skins/locale/template.pot create mode 100644 mods/PLAYER/mcl_skins/locale/template.txt create mode 100644 mods/PLAYER/mcl_spawn/locale/mcl_spawn.de.tr diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr index 42ea11ecf..8a17951d6 100644 --- a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr @@ -1,4 +1,7 @@ # textdomain: mcl_doc_basics +# UNFINISHED translation! +# TODO: Add the missing strings from template.txt and complete the translation + Basics=Grundlagen Everything you need to know about MineClone 2 to get started with playing=Alles, was Sie über MineClone 2 wissen sollten, um zu spielen Advanced usage=Fortgeschrittenes @@ -29,437 +32,3 @@ How to play:=Spielanleitung • Different tools break different kinds of blocks. Try them out!=• Verschiedene Werkzeuge können verschiedene Blöcke brechen. Probieren Sie einfach! • Read entries in this help to learn the rest=• Lesen Sie Einträge in dieser Hilfe, um den Rest zu lernen • Continue playing as you wish. There's no goal. Have fun!=• Spielen Sie weiter, so wie sie wollen. Es gibt kein Ziel. Viel Spaß! -Minetest= -Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).= -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 can, however, be much more complex than this.= -A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorative blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.= -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 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 as well as Minetest Game are both unfinished at the moment, so please forgive us when not everything works out perfectly.= -Sneaking= -Sneaking makes you walk slower and prevents you from falling off the edge of a block.= -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!= -• Sneak: [Shift]= -Sneaking only works when you stand on solid ground, are not in a liquid and don't climb.= -If you jump while holding the sneak key, you also jump slightly higher than usual.= -Sneaking might be disabled by mods. In this case, you still walk slower by sneaking, but you will no longer be stopped at ledges.= -Controls= -These are the default controls:= -Basic movement:= -• Moving the mouse around: Look around= -• W: Move forwards= -• A: Move to the left= -• D: Move to the right= -• S: Move backwards= -• E: Sprint= -While standing on solid ground:= -• Space: Jump= -• Shift: Sneak= -While on a ladder, swimming in a liquid or fly mode is active= -• Space: Move up= -• Shift: Move down= -Extended movement (requires privileges):= -• J: Toggle fast mode, makes you run or fly fast (requires “fast” privilege)= -• K: Toggle fly mode, makes you move freely in all directions (requires “fly” privilege)= -• H: Toggle noclip mode, makes you go through walls in fly mode (requires “noclip” privilege)= -• E: Move even faster when in fast mode= -World interaction:= -• Left mouse button: Punch / mine blocks / take items= -• Right mouse button: Build or use pointed block= -• Shift+Right mouse button: Build= -• Roll mouse wheel: Select next/previous item in hotbar= -• 1-9: Select item in hotbar directly= -• Q: Drop item stack= -• Shift+Q: Drop 1 item= -• I: Show/hide inventory menu= -Inventory interaction:= -See the entry “Basics > Inventory”.= -Camera:= -• Z: Zoom (requires “zoom” privilege)= -• F7: Toggle camera mode= -• F8: Toggle cinematic mode= -Interface:= -• Esc: Open menu window (pauses in single-player mode) or close window= -• F1: Show/hide HUD= -• F2: Show/hide chat= -• F9: Toggle minimap (only works if have a map)= -• Shift+F9: Toggle minimap rotation mode= -• F10: Open/close console/chat log= -• F12: Take a screenshot= -Server interaction:= -• T: Open chat window (chat requires the “shout” privilege)= -• /: Start issuing a server command)= -Technical:= -• R: Toggle far view (disables all fog and allows viewing far away, can make game very slow)= -• +: Increase minimal viewing distance= -• -: Decrease minimal viewing distance= -• F3: Enable/disable fog= -• F5: Enable/disable debug screen which also shows your coordinates= -• F6: Only useful for developers. Enables/disables profiler= -• P: Only useful for developers. Writes current stack traces= -Players= -Players (actually: “player characters”) are the characters which users control.= -Players are living beings which occupy a space of about 1×2×1 cubes. They start with 20 health points (HP) and 10 breath points (BP).= -Players are capable of walking, sneaking, jumping, climbing, swimming, diving, mining, building, fighting and using tools and blocks.= -At a health of 0, the player dies and loses all items in the inventory. The player can just respawn in the world.= -Some blocks reduce breath. While being with the head in a block which causes drowning, the breath points are reduced by 1 for every 2 seconds. When all breath is gone, the player starts to suffer drowning damage. Breath is quickly restored in any other block.= -Damage can be disabled on any world. Without damage, players are immortal and health and breath are unimportant.= -In multi-player mode, the name of other players is written above their head.= -Items= -Items are things you can carry along and store in inventories. They can be used for crafting, smelting, building, mining, and more. Types of items include blocks, tools, weapons and items only used for crafting.= -An item stack is a collection of items of the same type which fits into a single item slot. Item stacks can be dropped on the ground. Items which drop into the same coordinates will form an item stack.= -Dropped item stacks will be collected automatically when you stand close to them.= -Tools= -Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.= -Mining tools are important to break all kinds of blocks. Weapons are another kind of tool. There are some other more specialized tools. Special actions of tools are usually done by right-click.= -When nothing is wielded, players use their hand which may act as tool and weapon. The hand is capable of punching and deals minimum damage.= -Many tools will wear off when using them and may eventually get destroyed. The damage is displayed in a damage bar below the tool icon. If no damage bar is shown, the tool is in mint condition. Tools may be repairable by crafting, see “Basics > Crafting”.= -Weapons= -Some items are usable as a melee weapon when wielded. Weapons share most of the properties of tools.= -Melee weapons deal damage by punching players and other animate objects. There are two ways to attack:= -• Single punch: Left-click once to deal a single punch= -• Quick punching: Hold down the left mouse button to deal quick repeated punches= -There are two core attributes of melee weapons:= -• Maximum damage: Damage which is dealt after a hit when the weapon was fully recovered)= -• Full punch interval: Time it takes for fully recovering from a punch= -A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.= -There is a rule which sometimes makes attacks impossible: Players, animate objects and weapons belong to damage groups. A weapon only deals damage to those who share at least one damage group with it. So if you're using the wrong weapon, you might not deal any damage at all.= -Pointing= -“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, dropped items, players, computer enemies and objects.= -To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.= -A few things can not be pointed. Most blocks are pointable. A few blocks, like air, can never be pointed. Other blocks, like liquids can only be pointed by special items.= -Camera= -You can change the camera mode by pressing [F7].= -There is also Cinematic Mode which can be toggled with [F8]. With Cinematic Mode enabled, the camera movements become more smooth. Some players don't like it, it is a matter of taste.= -By holding down [Z], you can zoom the view at your crosshair. You need the “zoom” privilege to do this.= -• Switch camera mode: [F7]= -• Toggle Cinematic Mode: [F8]= -• Zoom: [Z]= -Blocks= -The world of MineClone 2 is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.= -Blocks can have a wide range of different properties which determine mining times, behavior, looks, shape, and much more. Their properties include:= -• Collidable: Collidable blocks can not be passed through; players can walk on them. Non-collidable blocks can be passed through freely= -• Pointable: Pointable blocks show a wireframe or a halo box when pointed. But you will just point through non-pointable blocks. Liquids are usually non-pointable but they can be pointed at by some special tools= -• Mining properties: By which tools it can be mined, how fast and how much it wears off tools= -• Climbable: While you are at a climbable block, you won't fall and you can move up and down with the jump and sneak keys= -• Drowning damage: See the entry “Basics > Player”= -• Liquids: See the entry “Basics > Liquids”= -• Group memberships: Group memberships are used to determine mining properties, crafting, interactions between blocks and more= -Mining= -Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.= -Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in hardness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining will drop on the ground, ready to be collected.= -After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:= -• Always drops itself (the usual case)= -• Always drops the same items= -• Drops items based on probability= -• Drops nothing= -Building= -Almost all blocks can be built (or placed). Building is very simple and has no delay.= -To build your wielded block, point at a block in the world and right-click. If this is not possible because the pointed block has a special right-click action, hold down the sneak key before right-clicking.= -Blocks can almost always be built at pointable blocks. One exception are blocks attached to the floor; these can only be built on the floor.= -Normally, blocks are built in front of the pointed side of the pointed block. A few blocks are different: When you try to build at them, they are replaced.= -Liquids= -Liquids are special dynamic blocks. Liquids like to spread and flow to their surrounding blocks. Players can swim and drown in them.= -Liquids usually come in two forms: In source form (S) and in flowing form (F).= -Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. A long it is left alone, a liquid source will normally keep its place and does not drain out.= -Flowing liquids take a sloped form. Flowing liquids spread around the world until they drain. A flowing liquid can not sustain itself and always comes from a liquid source, either directly or indirectly. Without a liquid source, a flowing liquid will eventually drain out and disappear.= -All liquids share the following properties:= -• All properties of blocks (including drowning damage= -• Renewability: Renewable liquids can create new sources= -• Flowing range: How many flowing liquids are created at maximum per liquid source, it determines how far the liquid will spread. Possible are ranges from 0 to 8. At 0, no flowing liquids will be created. Image 5 shows a liquid of flowing range 2= -• Viscosity: How slow players move through it and how slow the liquid spreads= -When those criteria are met, the open space is filled with a new liquid source of the same type (image 3).= -Swimming in a liquid is fairly straightforward: The usual direction keys for basic movement, the jump key for rising and the sneak key for sinking.= -The physics for swimming and diving in a liquid are:= -• The higher the viscosity, the slower you move= -• If you rest, you'll slowly sink= -• There is no fall damage for falling into a liquid as such= -• If you fall into a liquid, you will be slowed down on impact (but don't stop instantly). Your impact depth is determined by your speed and the liquid viscosity. For a safe high drop into a liquid, make sure there is enough liquid above the ground, otherwise you might hit the ground and take fall damage= -Liquids are often not pointable. But some special items are able to point all liquids.= -Crafting= -Crafting is the task of combining several items to form a new item.= -To craft something, you need one or more items, a crafting grid (C) and a crafting recipe. A crafting grid is like a normal inventory which can also be used for crafting. Items need to be put in a certain pattern into the crafting grid. Next to the crafting grid is an output slot (O). Here the result will appear when you placed items correctly. This is just a preview, not the actual item. Crafting grids can come in different sizes which limits the possible recipes you can craft.= -To complete the craft, take the result item from the output slot, which will consume items from the crafting grid and creates a new item. It is not possible to place items into the output slot.= -A description on how to craft an item is called a “crafting recipe”. These crafting recipes can be found in the crafting guide which you can access from the inventory menu.= -Crafting recipes consist of at least one input item and exactly one stack of output items. When performing a single craft, it will consume exactly one item from each stack of the crafting grid, unless the crafting recipe defines replacements.= -In some crafting recipes, some input items do not need to be a concrete item, instead they need to be a member of a group (see “Basics > Groups”). These recipes offer a bit more freedom in the input items. Images 6-8 show the same group-based recipe. Here, 8 items of the “stone” group are required, which is true for all of the shown items.= -Rarely, crafting recipes have replacements. This means, whenever you perform a craft, some items in the crafting grid will not be consumed, but instead will be replaced by another item.= -Cooking= -Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a furnace, an cookable item, a fuel item and time in order to yield a new item.= -Each fuel item has a burning time. This is the time a single item of the fuel keeps a furnace burning.= -Each cookable item requires time to be cooked. This time is specific to the item type and the item must be “on fire” for the whole cooking time to actually yield the result.= -Hotbar= -At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the lowest row of items in the player inventory.= -You can change the selected item with the mouse wheel or the number keys.= -• Select previous item in hotbar: [Mouse wheel up]= -• Select next item in hotbar: [Mouse wheel down]= -• Select item in hotbar directly: [0]-[9]= -The selected item is also your wielded item.= -Minimap= -If you have a map item in any of your hotbar slots, you can use the minimap.= -Press [F9] to make a minimap appear on the top right. The minimap helps you to find your way around the world. Press it again to select different minimap modes and zoom levels. The minimap also shows the positions of other players.= -There are 2 minimap modes and 3 zoom levels.= -Surface mode (image 1) is a top-down view of the world, roughly resembling the colors of the blocks this world is made of. It only shows the topmost blocks, everything below is hidden, like a satellite photo. Surface mode is useful if you got lost.= -Radar mode (image 2) is more complicated. It displays the “denseness” of the area around you and changes with your height. Roughly, the more green an area is, the less “dense” it is. Black areas have many blocks. Use the radar to find caverns, hidden areas, walls and more. The rectangular shapes in image 2 clearly expose the position of a dungeon. Radar mode is only available in Creative Mode= -There are also two different rotation modes. In “square mode”, the rotation of the minimap is fixed. If you press [Shift]+[F9] to switch to “circle mode”, the minimap will instead rotate with your looking direction, so “up” is always your looking direction.= -In other games, the minimap may be disabled.= -• Toggle minimap mode: [F9]= -• Toggle minimap rotation mode: [Shift]+[F9]= -Inventories are used to store item stacks. There are other uses, such as crafting. An inventory consists of a rectangular grid of item slots. Each item slot can either be empty or hold one item stack. Item stacks can be moved freely between most slots.= -You have your own inventory which is called your “player inventory”, you can open it with the inventory key (default: [I]). The first inventory slots are also used as slots in your hotbar.= -Blocks can also have their own inventory, e.g. chests and furnaces.= -Inventory controls:= -Taking: You can take items from an occupied slot if the cursor holds nothing.= -• Left click: take entire item stack= -• Right click: take half from the item stack (rounded up)= -• Middle click: take 10 items from the item stack= -Putting: You can put items onto a slot if the cursor holds 1 or more items and the slot is either empty or contains an item stack of the same item type.= -• Left click: put entire item stack= -• Right click: put 1 item of the item stack= -• Middle click: put 10 items of the item stack= -Exchanging: You can exchange items if the cursor holds 1 or more items and the destination slot is occupied by a different item type.= -• Click: exchange item stacks= -Throwing away: If you hold an item stack and click with it somewhere outside the menu, the item stack gets thrown away into the environment.= -Quick transfer: You can quickly transfer an item stack to/from the player inventory to/from another item's inventory slot like a furnace, chest, or any other item with an inventory slot when that item's inventory is accessed. The target inventory is generally the most relevant inventory in this context.= -• Sneak+Left click: Automatically transfer item stack= -Online help= -You may want to check out these online resources related to MineClone 2.= -MineClone 2 download and forum discussion: = -Here you find the most recent version of MineClone 2 and can discuss it.= -Bug tracker: = -Report bugs here.= -Minetest links:= -Official homepage of Minetest: = -The main place to find the most recent version of Minetest, the engine used by MineClone 2.= -Community wiki: = -A community-based documentation website for Minetest. Anyone with an account can edit it.= -Minetest forums: = -A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and games are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.= -Chat: = -A generic Internet Relay Chat channel for everything related to Minetest where people can meet to discuss in real-time. If you do not understand IRC, see the Community Wiki for help.= -Groups= -Items, players and objects (animate and inanimate) can be members of any number of groups. Groups serve multiple purposes:= -• Crafting recipes: Slots in a crafting recipe may not require a specific item, but instead an item which is a member of a particular group, or multiple groups= -• Digging times: Diggable blocks belong to groups which are used to determine digging times. Mining tools are capable of digging blocks belonging to certain groups= -• Block behavior: Blocks may show a special behaviour and interact with other blocks when they belong to a particular group= -• Damage and armor: Objects and players have armor groups, weapons have damage groups. These groups determine damage. See also: “Basics > Weapons”= -• Other uses= -In the item help, many important groups are usually mentioned and explained.= -Glossary= -This is a list of commonly used terms:= -Controls:= -• Wielding: Holding an item in hand= -• Pointing: Looking with the crosshair at something in range= -• Dropping: Throwing an item or item stack to the ground= -• Punching: Attacking with left-click, is also used on blocks= -• Sneaking: Walking slowly while (usually) avoiding to fall over edges= -• Climbing: Moving up or down a climbable block= -Blocks:= -• Block: Cubes that the worlds are made of= -• Mining/digging: Using a mining tool to break a block= -• Building/placing: Putting a block somewhere= -• Drop: Items you get after mining a block= -• Using a block: Right-clicking a block to access its special function= -Items:= -• Item: A single thing that players can possess= -• Item stack: A collection of items of the same kind= -• Maximum stack size: Maximum amount of items in an item stack= -• Slot / inventory slot: Can hold one item stack= -• Inventory: Provides several inventory slots for storage= -• Player inventory: The main inventory of a player= -• Tool: An item which you can use to do special things with when wielding= -• Range: How far away things can be to be pointed by an item= -• Mining tool: A tool which allows to break blocks= -• Craftitem: An item which is (primarily or only) used for crafting= -Gameplay:= -• “heart”: A single health symbol, indicates 2 HP= -• “bubble”: A single breath symbol, indicates 1 BP= -• HP: Hit point (equals a half “heart”)= -• BP: Breath point, indicates breath when diving= -• Mob: Computer-controlled enemy= -• Crafting: Combining multiple items to create new ones= -• Crafting guide: A helper which shows available crafting recipes= -• Spawning: Appearing in the world= -• Respawning: Appearing again in the world after death= -• Group: Puts similar things together, often affects gameplay= -• noclip: Allows to fly through walls= -Interface= -• Hotbar: Inventory slots at the bottom= -• Statbar: Indicator made out of half-symbols, used for health and breath= -• Minimap: The map or radar at the top right= -• Crosshair: Seen in the middle, used to point at things= -Online multiplayer:= -• PvP: Player vs Player. If active, players can deal damage to each other= -• Griefing: Destroying the buildings of other players against their will= -• Protection: Mechanism to own areas of the world, which only allows the owners to modify blocks inside= -Technical terms:= -• Minetest: This game engine= -• MineClone 2: What you play right now= -• Minetest Game: A game for Minetest by the Minetest developers= -• Game: A complete playing experience to be used in Minetest; such as a game or sandbox or similar= -• Mod: A single subsystem which adds or modifies functionality; is the basic building block of games and can be used to further enhance or modify them= -• Privilege: Allows a player to do something= -• Node: Other word for “block”= -Settings= -There is a large variety of settings to configure Minetest. Pretty much every aspect can be changed that way.= -These are a few of the most important gameplay settings:= -• Damage enabled (enable_damage): Enables the health and breath attributes for all players. If disabled, players are immortal= -• Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. Changes include: Instant digging, easy access to almost all items, tools never wear off, etc.= -• PvP (enable_pvp): Short for “Player vs Player”. If enabled, players can deal damage to each other= -For a full list of all available settings, use the “Advanced settings” dialog in the main menu.= -Movement modes= -If you have the required privileges, you can use up to three special movement modes. Using these may be considered cheating.= -Fast mode:= -• Description: Allows you to move much faster. Hold down the the “Use” key [E] to move faster. In the client configuration, you can further customize fast mode.= -• Default key: [J]= -• Required privilege: fast= -Fly mode:= -• Description: Gravity doesn't affect you and you can move freely in all directions. Use the jump key to rise and the sneak key to sink.= -• Default key: [K]= -• Required privilege: fly= -Noclip mode:= -• Description: Allows you to move through walls. Only works when fly mode is enabled, too.= -• Default key: [H]= -• Required privilege: noclip= -Console= -With [F10] you can open and close the console. The main use of the console is to show the chat log and enter chat messages or server commands.= -Using the chat or server command key also opens the console, but it is smaller and will be closed after you sent a message.= -Use the chat to communicate with other players. This requires you to have the “shout” privilege.= -Just type in the message and hit [Enter]. Public chat messages can not begin with “/”.= -You can send private messages: Say “/msg ” in chat to send “” which can only be seen by .= -There are some special controls for the console:= -• [F10] Open/close console= -• [Enter]: Send message or command= -• [Tab]: Try to auto-complete a partially-entered player name= -• [Ctrl]+[Left]: Move cursor to the beginning of the previous word= -• [Ctrl]+[Right]: Move cursor to the beginning of the next word= -• [Ctrl]+[Backspace]: Delete previous word= -• [Ctrl]+[Delete]: Delete next word= -• [Ctrl]+[U]: Delete all text before the cursor= -• [Ctrl]+[K]: Delete all text after the cursor= -• [Page up]: Scroll up= -• [Page down]: Scroll down= -There is also an input history. Minetest saves your previous console inputs which you can quickly access later:= -• [Up]: Go to previous entry in history= -• [Down]: Go to next entry in history= -Server commands= -Server commands (also called “chat commands”) are little helpers for advanced users. You don't need to use these commands when playing. But they might come in handy to perform some more technical tasks. Server commands work both in multi-player and single-player mode.= -Server commands can be entered by players using the chat to perform a special server action. There are a few commands which can be issued by everyone, but some commands only work if you have certain privileges granted on the server. There is a small set of basic commands which are always available, other commands can be added by mods.= -To issue a command, simply type it like a chat message or press Minetest's command key (default: [/]). All commands have to begin with “/”, for example “/mods”. The Minetest command key does the same as the chat key, except that the slash is already entered.= -Commands may or may not give a response in the chat log, but errors will generally be shown in the chat. Try it for yourselves: Close this window and type in the “/mods” command. This will give you the list of available mods on this server.= -“/help all” is a very important command: You get a list of all available commands on the server, a short explanation and the allowed parameters. This command is also important because the available commands often differ per server.= -Commands are followed by zero or more parameters.= -In the command reference, you see some placeholders which you need to replace with an actual value. Here's an explanation:= -• Text in greater-than and lower-than signs (e.g. “”): Placeholder for a parameter= -• Anything in square brackets (e.g. “[text]”) is optional and can be omitted= -• Pipe or slash (e.g. “text1 | text2 | text3”): Alternation. One of multiple texts must be used (e.g. “text2”)= -• Parenthesis: (e.g. “(word1 word2) | word3”): Groups multiple words together, used for alternations= -• Everything else is to be read as literal text= -Here are some examples to illustrate the command syntax:= -• /mods: No parameters. Just enter “/mods”= -• /me : 1 parameter. You have to enter “/me ” followed by any text, e.g. “/me orders pizza”= -• /give : Two parameters. Example: “/give Player default:apple”= -• /help [all|privs|]: Valid inputs are “/help”, “/help all”, “/help privs”, or “/help ” followed by a command name, like “/help time”= -• /spawnentity [,,]: Valid inputs include “/spawnentity boats:boat” and “/spawnentity boats:boat 0,0,0”= -Some final remarks:= -• For /give and /giveme, you need an itemstring. This is an internally used unique item identifier which you may find in the item help if you have the “give” or “debug” privilege= -• For /spawnentity you need an entity name, which is another identifier= -Privileges= -Each player has a set of privileges, which differs from server to server. Your privileges determine what you can and can't do. Privileges can be granted and revoked from other players by any player who has the privilege called “privs”.= -On a multiplayer server with the default configuration, new players start with the privileges called “interact” and “shout”. The “interact” privilege is required for the most basic gameplay actions such as building, mining, using, etc. The “shout” privilege allows to chat.= -There is a small set of core privileges which you'll find on every server, other privileges might be added by mods.= -To view your own privileges, issue the server command “/privs”.= -Here are a few basic privilege-related commands:= -• /privs: Lists your privileges= -• /privs : Lists the privileges of = -• /help privs: Shows a list and description about all privileges= -Players with the “privs” privilege can modify privileges at will:= -• /grant : Grant to = -• /revoke : Revoke from = -In single-player mode, you can use “/grant singleplayer all” to unlock all abilities (which is often considered cheating).= -Light= -As the world is entirely block-based, so is the light in the world. Each block has its own brightness. The brightness of a block is expressed in a “light level” which ranges from 0 (total darkness) to 15 (as bright as the sun).= -There are two types of light: Sunlight and artificial light.= -Artificial light is emitted by luminous blocks. Artificial light has a light level from 1-14.= -Sunlight is the brightest light and always goes perfectly straight down from the sky at each time of the day. blocks. At night, the sunlight will become moonlight instead, which still provides a small amount of light. The light level of sunlight is 15.= -Blocks have 3 levels of transparency:= -• Transparent: Sunlight goes through limitless, artificial light goes through with losses= -• Semi-transparent: Sunlight and artificial light go through with losses= -• Opaque: No light passes through= -Artificial light will lose one level of brightness for each transparent or semi-transparent block it passes through, until only darkness remains (image 1).= -Sunlight will preserve its brightness as long it only passes fully transparent blocks. When it passes through a semi-transparent block, it turns to artificial light. Image 2 shows the difference.= -Note that “transparency” here only means that the block is able to carry brightness from its neighboring blocks. It is possible for a block to be transparent to light but you can't see trough the other side.= -Coordinates= -The 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.= -Like this: (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.= -The values for X, Y and Z work like this:= -• If you go up, Y increases= -• If you go down, Y decreases= -• If you follow the sun, X increases= -• If you go to the reverse direction, X decreases= -• Follow the sun, then go right: Z increases= -• Follow the sun, then go left: Z decreases= -• The side length of a full cube is 1= -You can view your current position in the debug screen (open with [F5]). This is considered cheating in some games.= -Creative Mode= -Enabling Creative Mode in MineClone 2 applies the following changes:= -• You keep the things you've placed= -• Creative inventory is available to obtain most items easily= -• Hand breaks all default blocks instantly= -• Greatly increased hand pointing range= -• Mined blocks don't drop items= -• Items don't get used up= -• Tools don't wear off= -• You can eat food whenever you want= -• You can always use the minimap (including radar mode)= -Damage is not affected by Creative Mode, it needs to be disabled seperately.= -Mobs= -Mobs are the living beings in the world. This includes animals and monsters.= -Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some blocks only spawn on particular blocks (like grass blocks).= -Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.= -Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.= -Animals= -Animals are peaceful beings which roam the world aimlessly. You can feed, tame and breed them.= -Feeding:= -Each animal has its own taste for food and doesn't just accept any food. To feed, hold an item in your hand and rightclick the animal.= -Animals are attraced to the food they like and follow you as long you hold the food item in hand.= -Feeding an animal has three uses: Taming, healing and breeding.= -Feeding heals animals instantly, depending on the quality of the food item.= -Taming:= -A few animals can be tamed. You can generally do more things with tamed animals and use other items on them. For example, tame horses can be saddled and tame wolves fight on your side.= -Breeding:= -When you have fed an animal up to its maximum health, then feed it again, you will activate “Love Mode” and many hearts appear around the animal.= -Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.= -Baby animals:= -Baby animals are just like their adult couterparts, but they can't be fed, tamed or bred and don't drop anything when they die. They grow to adults after a short time.= -Hunger= -Hunger affects your health and your ability to sprint. Hunger is not in effect when damage is disabled.= -Core hunger rules:= -• You start with 20/20 hunger points (more points @= less hungry)= -• Actions like combat, jumping, sprinting, etc. decrease hunger points= -• Food restores hunger points= -• If your hunger bar decreases, you're hungry= -• At 18-20 hunger points, you regenerate 1 HP every 4 seconds= -• At 6 hunger points or less, you can't sprint= -• At 0 hunger points, you lose 1 HP every 4 seconds (down to 1 HP)= -• Poisonous food decreases your health= -Details:= -You have 0-20 hunger points, indicated by 20 drumstick half-icons above the hotbar. You also have an invisible attribute: Saturation.= -Hunger points reflect how full you are while saturation points reflect how long it takes until you're hungry again.= -Each food item increases both your hunger level as well your saturation.= -Food with a high saturation boost has the advantage that it will take longer until you get hungry again.= -A few food items might induce food poisoning by chance. When you're poisoned, the health and hunger symbols turn sickly green. Food poisoning drains your health by 1 HP per second, down to 1 HP. Food poisoning also drains your saturation. Food poisoning goes away after a while or when you drink milk.= -You start with 5 saturation points. The maximum saturation is equal to your current hunger level. So with 20 hunger points your maximum saturation is 20. What this means is that food items which restore many saturation points are more effective the more hunger points you have. This is because at low hunger levels, a lot of the saturation boost will be lost due to the low saturation cap.= -If your saturation reaches 0, you're hungry and start to lose hunger points. Whenever you see the hunger bar decrease, it is a good time to eat.= -Saturation decreases by doing things which exhaust you (highest exhaustion first):= -• Regenerating 1 HP= -• Suffering food poisoning= -• Sprint-jumping= -• Sprinting= -• Attacking= -• Taking damage= -• Swimming= -• Jumping= -• Mining a block= -Other actions, like walking, do not exaust you.= diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.de.tr b/mods/MISC/mcl_commands/locale/mcl_commands.de.tr new file mode 100644 index 000000000..a29371fa1 --- /dev/null +++ b/mods/MISC/mcl_commands/locale/mcl_commands.de.tr @@ -0,0 +1,20 @@ +# textdomain: mcl_commands +Players can't be killed right now, damage has been disabled.=Spieler können jetzt nicht getötet werden, der Schaden wurde deaktiviert. +Player @1 does not exist.=Spieler @1 existiert nicht. +You are already dead=Sie sind schon tot +@1 is already dead=@1 ist schon tot +@1 committed suicide.=@1 beging Selbstmord. +@1 was killed by @2.=@1 wurde von @2 getötet. +[]=[] +Kill player or yourself=Spieler oder sich selbst töten +Can use /say=Kann „/say“ benutzen += +Send a message to every player=Nachricht an alle Spieler senden +Invalid usage, see /help say.=Falsche Benutzung, siehe „/help say“. +,, =,, +Set node at given position=Node (Block) an der gegebenen Position platzieren +Invalid node=Unültiger Node +@1 spawned.=@1 gespawnt. +Invalid parameters (see /help setblock)=Ungültige Parameter (siehe „/help setblock”) +List bans=Bannliste anzeigen +Ban list: @1=Bannliste: @1 diff --git a/mods/MISC/mcl_privs/locale/mcl_privs.de.tr b/mods/MISC/mcl_privs/locale/mcl_privs.de.tr new file mode 100644 index 000000000..c5b799767 --- /dev/null +++ b/mods/MISC/mcl_privs/locale/mcl_privs.de.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_privs +Can place and use advanced blocks like mob spawners, command blocks and barriers.=Kann fortgeschrittene Blöcke wie Mobspawner, Befehlsblöcke und Barrieren platzieren und benutzen. diff --git a/mods/MISC/mcl_wip/description.txt b/mods/MISC/mcl_wip/description.txt index 581de9981..d90115acf 100644 --- a/mods/MISC/mcl_wip/description.txt +++ b/mods/MISC/mcl_wip/description.txt @@ -1 +1 @@ -Development mod for MineClone 2 which add a “WIP” comment to items which are considered to be very unfinished. +Development mod for MineClone 2 which add a “WIP” (Work In Progress) comment to items which are considered to be very unfinished. diff --git a/mods/MISC/mcl_wip/init.lua b/mods/MISC/mcl_wip/init.lua index 640cc3766..0b042e212 100644 --- a/mods/MISC/mcl_wip/init.lua +++ b/mods/MISC/mcl_wip/init.lua @@ -1,3 +1,5 @@ +-- Mod to mark WIP (Work In Progress) content + local S = minetest.get_translator("mcl_wip") local wip_items = { diff --git a/mods/MISC/mcl_wip/locale/mcl_wip.de.tr b/mods/MISC/mcl_wip/locale/mcl_wip.de.tr new file mode 100644 index 000000000..9cf3b6f01 --- /dev/null +++ b/mods/MISC/mcl_wip/locale/mcl_wip.de.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_wip +(WIP)=(in Arbeit) +(Temporary)=(temporär) diff --git a/mods/MISC/mcl_wip/locale/template.txt b/mods/MISC/mcl_wip/locale/template.txt index ab7fadde6..b74273642 100644 --- a/mods/MISC/mcl_wip/locale/template.txt +++ b/mods/MISC/mcl_wip/locale/template.txt @@ -1,3 +1,4 @@ # textdomain: mcl_wip +# WIP means “Work in Progress” (WIP)= (Temporary)= diff --git a/mods/PLAYER/mcl_hunger/locale/de.txt b/mods/PLAYER/mcl_hunger/locale/de.txt deleted file mode 100644 index 3a06d93f4..000000000 --- a/mods/PLAYER/mcl_hunger/locale/de.txt +++ /dev/null @@ -1 +0,0 @@ -Satiation = Sättigung diff --git a/mods/PLAYER/mcl_hunger/locale/mcl_hunger.de.tr b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.de.tr new file mode 100644 index 000000000..7a04e091b --- /dev/null +++ b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.de.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_hunger +@1 succumbed to the poison.=@1 erlag dem Gift. +Food=Nahrung +Saturation=Sättigung +%s: %.1f/%d=%s: %.1f +Exhaust.=Erschöpf. +%s: %d/%d=%s: %d/%d +@1 starved to death.=%1 verhungerte. diff --git a/mods/PLAYER/mcl_hunger/locale/pt.txt b/mods/PLAYER/mcl_hunger/locale/pt.txt deleted file mode 100644 index 44fe45217..000000000 --- a/mods/PLAYER/mcl_hunger/locale/pt.txt +++ /dev/null @@ -1 +0,0 @@ -Satiation = Saciedade diff --git a/mods/PLAYER/mcl_hunger/locale/template.txt b/mods/PLAYER/mcl_hunger/locale/template.txt index 37a578dcd..d745ab08a 100644 --- a/mods/PLAYER/mcl_hunger/locale/template.txt +++ b/mods/PLAYER/mcl_hunger/locale/template.txt @@ -1 +1,8 @@ -Satiation +# textdomain: mcl_hunger +@1 succumbed to the poison.= +Food= +Saturation= +%s: %.1f/%d= +Exhaust.= +%s: %d/%d= +@1 starved to death.= diff --git a/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.de.tr b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.de.tr new file mode 100644 index 000000000..44d486d08 --- /dev/null +++ b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.de.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_playerplus +@1 suffocated to death.=@1 erstickte zu Tode. +@1 was prickled to death by a cactus.=@1 wurde von einem Kaktus zu Tode gepiekst. diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index fac543e3c..401ba1600 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -157,7 +157,7 @@ end -- command to set player skin (usually for custom skins) minetest.register_chatcommand("setskin", { - params = "[] []", + params = S("[] []"), description = S("Select player skin of yourself or another player"), privs = {}, func = function(name, param) diff --git a/mods/PLAYER/mcl_skins/locale/fr.po b/mods/PLAYER/mcl_skins/locale/fr.po deleted file mode 100644 index 30d8e36e7..000000000 --- a/mods/PLAYER/mcl_skins/locale/fr.po +++ /dev/null @@ -1,51 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-29 07:11+0200\n" -"PO-Revision-Date: 2017-07-29 07:17+0200\n" -"Last-Translator: fat115 \n" -"Language-Team: \n" -"Language: fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.12\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#: init.lua -msgid "Select Player Skin:" -msgstr "Sélectionner l'apparence du joueur :" - -#: init.lua -msgid "Name: " -msgstr "Nom : " - -#: init.lua -msgid "Author: " -msgstr "Auteur : " - -#: init.lua -msgid "Admin command to set player skin" -msgstr "Commande admin pour définir l'apparence du joueur" - -#: init.lua -msgid "'s skin set to" -msgstr ", apparence définie pour" - -#: init.lua -msgid "Set player skin" -msgstr "Définir l'apparence du joueur" - -#: init.lua -msgid "Close" -msgstr "Fermer" - -#: init.lua -msgid "[MOD] Simple Skins loaded" -msgstr "[MOD] Simple Skins chargé" diff --git a/mods/PLAYER/mcl_skins/locale/it.po b/mods/PLAYER/mcl_skins/locale/it.po deleted file mode 100644 index d4701316d..000000000 --- a/mods/PLAYER/mcl_skins/locale/it.po +++ /dev/null @@ -1,52 +0,0 @@ -# simple_skin . -# Copyright (C) 2018 -# This file is distributed under the same license as the PACKAGE package. -# Stefano Peris , 2018. -# Github: -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-21 07:29+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Stefano Peris \n" -"Language-Team: \n" -"Language: it\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.12\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#: init.lua -msgid "Select Player Skin:" -msgstr "Seleziona la skin del giocatore" - -#: init.lua -msgid "Name: " -msgstr "Nome" - -#: init.lua -msgid "Author: " -msgstr "Autore" - -#: init.lua -msgid "Admin command to set player skin" -msgstr "Comando di admin per impostare la skin del giocatore" - -#: init.lua -msgid "'s skin set to" -msgstr ", la skin è impostata su" - -#: init.lua -msgid "Set player skin" -msgstr "Imposta la skin del giocatore" - -#: init.lua -msgid "Close" -msgstr "Chiudi" - -#: init.lua -msgid "[MOD] Simple Skins loaded" -msgstr "[MOD] Skins semplici caricate" diff --git a/mods/PLAYER/mcl_skins/locale/mcl_skins.de.tr b/mods/PLAYER/mcl_skins/locale/mcl_skins.de.tr new file mode 100644 index 000000000..8f9b488db --- /dev/null +++ b/mods/PLAYER/mcl_skins/locale/mcl_skins.de.tr @@ -0,0 +1,13 @@ +# textdomain: mcl_skins +[] []=[] [] +Select player skin of yourself or another player=Spieleraussehen von Ihnen oder einem anderen Spieler auswählen +Insufficient or wrong parameters=Unzureichende oder falsche Parameter +Player @1 not online!=Spieler @1 ist nicht online! +You need the “server” privilege to change the skin of other players!=Sie brauchen das „server“-Privileg, um das Aussehen anderer Spieler zu ändern! +Invalid skin number! Valid numbers: 0 to @1=Ungültige Aussehens-Nummer! Gültige Nummern: 0 bis @1 +Your skin has been set to: @1=Ihr Aussehen wurde geändert auf: @1 +Your skin has been set to: @1 (@2)=Ihr Aussehen wurde geändert auf: @1 (@2) +Skin of @1 set to: @2 (@3)=Aussehen von @1 gesetzt auf: @2 (@3) +Select player skin:=Spieleraussehen wählen: +@1 (@2)=@1 (@2) +Name: @1=Name: @1 diff --git a/mods/PLAYER/mcl_skins/locale/mcl_skins.fr.tr b/mods/PLAYER/mcl_skins/locale/mcl_skins.fr.tr new file mode 100644 index 000000000..fe321cfbf --- /dev/null +++ b/mods/PLAYER/mcl_skins/locale/mcl_skins.fr.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_skins +# UNFINISHED translation! +# TODO: Remove the # sign from the translations below and add the missing translations. + +#[] []= +#Select player skin of yourself or another player= +#Insufficient or wrong parameters= +#Player @1 not online!= +#You need the “server” privilege to change the skin of other players!= +#Invalid skin number! Valid numbers: 0 to @1= +#Your skin has been set to: @1= +#Your skin has been set to: @1 (@2)= +#Skin of @1 set to: @2 (@3)= +Select player skin:=Sélectionner l'apparence du joueur : +#@1 (@2)= +Name: @1=Nom : @1 diff --git a/mods/PLAYER/mcl_skins/locale/mcl_skins.ms.tr b/mods/PLAYER/mcl_skins/locale/mcl_skins.ms.tr new file mode 100644 index 000000000..58946f605 --- /dev/null +++ b/mods/PLAYER/mcl_skins/locale/mcl_skins.ms.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_skins +# UNFINISHED translation! +# TODO: Remove the # sign from the translations below and add the missing translations. + +[] []= +Select player skin of yourself or another player= +Insufficient or wrong parameters= +Player @1 not online!= +You need the “server” privilege to change the skin of other players!= +Invalid skin number! Valid numbers: 0 to @1= +Your skin has been set to: @1= +Your skin has been set to: @1 (@2)= +Skin of @1 set to: @2 (@3)= +Select player skin:=Pilih Kulit Pemain: +@1 (@2)= +Name: @1=Nama: @1 diff --git a/mods/PLAYER/mcl_skins/locale/ms.po b/mods/PLAYER/mcl_skins/locale/ms.po deleted file mode 100644 index bba5982d4..000000000 --- a/mods/PLAYER/mcl_skins/locale/ms.po +++ /dev/null @@ -1,51 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-29 07:11+0200\n" -"PO-Revision-Date: 2018-02-14 01:23+0800\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.6\n" -"Last-Translator: MuhdNurHidayat (MNH48) \n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Language: ms\n" - -#: init.lua -msgid "Select Player Skin:" -msgstr "Pilih Kulit Pemain:" - -#: init.lua -msgid "Name: " -msgstr "Nama: " - -#: init.lua -msgid "Author: " -msgstr "Pencipta: " - -#: init.lua -msgid "Admin command to set player skin" -msgstr "Perintah pentadbir untuk menetapkan kulit pemain" - -#: init.lua -msgid "'s skin set to" -msgstr " telah ditukarkan kulitnya kepada" - -#: init.lua -msgid "Set player skin" -msgstr "Tetapkan kulit pemain" - -#: init.lua -msgid "Close" -msgstr "Tutup" - -#: init.lua -msgid "[MOD] Simple Skins loaded" -msgstr "[MODS] Simple Skins telah dimuatkan" diff --git a/mods/PLAYER/mcl_skins/locale/template.pot b/mods/PLAYER/mcl_skins/locale/template.pot deleted file mode 100644 index 36282e43c..000000000 --- a/mods/PLAYER/mcl_skins/locale/template.pot +++ /dev/null @@ -1,50 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-29 07:11+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: init.lua -msgid "Select Player Skin:" -msgstr "" - -#: init.lua -msgid "Name: " -msgstr "" - -#: init.lua -msgid "Author: " -msgstr "" - -#: init.lua -msgid "Admin command to set player skin" -msgstr "" - -#: init.lua -msgid "'s skin set to" -msgstr "" - -#: init.lua -msgid "Set player skin" -msgstr "" - -#: init.lua -msgid "Close" -msgstr "" - -#: init.lua -msgid "[MOD] Simple Skins loaded" -msgstr "" diff --git a/mods/PLAYER/mcl_skins/locale/template.txt b/mods/PLAYER/mcl_skins/locale/template.txt new file mode 100644 index 000000000..c683fa4e4 --- /dev/null +++ b/mods/PLAYER/mcl_skins/locale/template.txt @@ -0,0 +1,13 @@ +# textdomain: mcl_skins +[] []= +Select player skin of yourself or another player= +Insufficient or wrong parameters= +Player @1 not online!= +You need the “server” privilege to change the skin of other players!= +Invalid skin number! Valid numbers: 0 to @1= +Your skin has been set to: @1= +Your skin has been set to: @1 (@2)= +Skin of @1 set to: @2 (@3)= +Select player skin:= +@1 (@2)= +Name: @1= diff --git a/mods/PLAYER/mcl_spawn/locale/mcl_spawn.de.tr b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.de.tr new file mode 100644 index 000000000..e30a71650 --- /dev/null +++ b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.de.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_spawn +New respawn position set!=Neue Wiedereinstiegsposition gesetzt! +Respawn position cleared!=Wiedereinstiegsposition gelöscht! +Your spawn bed was missing or blocked.=Ihr Startbett fehlte oder war blockiert. From 7be98bfce0f5ba035df8ea916075edeb85673cf8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 04:47:56 +0100 Subject: [PATCH 173/379] German translation: Anvils, banners --- mods/ITEMS/mcl_anvils/locale/mcl_anvils.de.tr | 13 +++ mods/ITEMS/mcl_banners/init.lua | 33 +++---- .../mcl_banners/locale/mcl_banners.de.tr | 76 +++++++++++++++ mods/ITEMS/mcl_banners/locale/template.txt | 96 +++++++++++-------- mods/ITEMS/mcl_banners/patterncraft.lua | 86 +++++++++-------- 5 files changed, 206 insertions(+), 98 deletions(-) create mode 100644 mods/ITEMS/mcl_anvils/locale/mcl_anvils.de.tr create mode 100644 mods/ITEMS/mcl_banners/locale/mcl_banners.de.tr diff --git a/mods/ITEMS/mcl_anvils/locale/mcl_anvils.de.tr b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.de.tr new file mode 100644 index 000000000..0142414c5 --- /dev/null +++ b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.de.tr @@ -0,0 +1,13 @@ +# textdomain: mcl_anvils +Set Name=Name setzen +Anvil=Amboss +The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=Der Amboss ermöglicht es, Werkzeuge und Rüstung zu reparieren und Gegenstände zu benennen. Er hat jedoch eine begrenzte Lebensdauer. Lassen Sie ihn nicht auf Ihren Kopf fallen, das könnte ziemlich schmerzhaft sein! +To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.=Um einen Amboss zu benutzen, rechtsklicken Sie auf ihn. Ein Amboss hat 2 Eingabeplätze (links) und einen Ausgabeplatz (rechts). +To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.=Um Gegenstände umzubenennen, platzieren Sie einen Gegenstand in einen der Eingangsplätze und lassen Sie den anderen frei. Geben Sie einen Namen ein und drücken Sie die Eingabetaste oder „Name setzen”, dann nehmen Sie den umbenannten Gegenstand an sich. +There are two possibilities to repair tools (and armor):=Es gibt zwei Möglichkeiten, Werkzeuge (und Rüstung) zu reparieren: +• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.=• Werkzeug + Werkzeug: Platzieren sie zwei gleiche Werkzeuge in die Eingangsplätze. Der Zustand des reparierten Werkzeugs ist die Summe des Zustands beider Eingangswerkzeuge, plus einem Bonus von 12%. +• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.=• Werkzeug + Material: Einige Werkzeuge können auch repariert werden, indem man sie mit einem Gegenstand, aus dem sie gemacht worden sind, kombiniert. Zum Beispiel können Eisenspitzhacken mit Eisenbarren repariert werden. Dadurch wird das Werkzeug um 25% repariert. +Armor counts as a tool. It is possible to repair and rename a tool in a single step.=Rüstung zählt als Werkzeug. Es ist möglich, ein Werkzeug in einem Arbeitsschritt zu reparieren und zu benennen. +The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.=Der Amboss hat begrenze Lebensdauer und 3 Schadensstufen: Kein Schaden, leicht beschädigt, und stark beschädigt. Jedes mal, wenn Sie etwas reparieren oder umbenennen, gibt es eine 12%-ige Chance, dass der Amboss Schaden nimmt. Ambosse können auch beschädigt werden, wenn sie um mehr als 1 Block fallen. Wenn ein sehr beschädigter Amboss erneut beschädigt wird, wird er zerstört. +Slightly Damaged Anvil=Leicht beschädigter Amboss +Very Damaged Anvil=Stark beschädigter Amboss diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index e908db9de..fc871511e 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("mcl_banners") +local N = function(s) return s end local node_sounds if minetest.get_modpath("mcl_sounds") then @@ -16,22 +17,22 @@ mcl_banners = {} mcl_banners.colors = { -- Format: -- [ID] = { banner description, wool, unified dyes color group, overlay color, dye, color name for emblazonings } - ["unicolor_white"] = {"white", S("White Banner"), "mcl_wool:white", "#FFFFFF", "mcl_dye:white", "White" }, - ["unicolor_darkgrey"] = {"grey", S("Grey Banner"), "mcl_wool:grey", "#303030", "mcl_dye:dark_grey", "Grey" }, - ["unicolor_grey"] = {"silver", S("Light Grey Banner"), "mcl_wool:silver", "#5B5B5B", "mcl_dye:grey", "Light Grey" }, - ["unicolor_black"] = {"black", S("Black Banner"), "mcl_wool:black", "#000000", "mcl_dye:black", "Black" }, - ["unicolor_red"] = {"red", S("Red Banner"), "mcl_wool:red", "#BC0000", "mcl_dye:red", "Red" }, - ["unicolor_yellow"] = {"yellow", S("Yellow Banner"), "mcl_wool:yellow", "#E6CD00", "mcl_dye:yellow", "Yellow" }, - ["unicolor_dark_green"] = {"green", S("Green Banner"), "mcl_wool:green", "#006000", "mcl_dye:dark_green", "Green" }, - ["unicolor_cyan"] = {"cyan", S("Cyan Banner"), "mcl_wool:cyan", "#00ACAC", "mcl_dye:cyan", "Cyan" }, - ["unicolor_blue"] = {"blue", S("Blue Banner"), "mcl_wool:blue", "#0000AC", "mcl_dye:blue", "Blue" }, - ["unicolor_red_violet"] = {"magenta", S("Magenta Banner"), "mcl_wool:magenta", "#AC007C", "mcl_dye:magenta", "Magenta"}, - ["unicolor_orange"] = {"orange", S("Orange Banner"), "mcl_wool:orange", "#E67300", "mcl_dye:orange", "Orange" }, - ["unicolor_violet"] = {"purple", S("Purple Banner"), "mcl_wool:purple", "#6400AC", "mcl_dye:violet", "Violet" }, - ["unicolor_brown"] = {"brown", S("Brown Banner"), "mcl_wool:brown", "#603000", "mcl_dye:brown", "Brown" }, - ["unicolor_pink"] = {"pink", S("Pink Banner"), "mcl_wool:pink", "#DE557C", "mcl_dye:pink", "Pink" }, - ["unicolor_lime"] = {"lime", S("Lime Banner"), "mcl_wool:lime", "#30AC00", "mcl_dye:green", "Lime" }, - ["unicolor_light_blue"] = {"light_blue", S("Light Blue Banner"), "mcl_wool:light_blue", "#4040CF", "mcl_dye:lightblue", "Light Blue" }, + ["unicolor_white"] = {"white", S("White Banner"), "mcl_wool:white", "#FFFFFF", "mcl_dye:white", N("White") }, + ["unicolor_darkgrey"] = {"grey", S("Grey Banner"), "mcl_wool:grey", "#303030", "mcl_dye:dark_grey", N("Grey") }, + ["unicolor_grey"] = {"silver", S("Light Grey Banner"), "mcl_wool:silver", "#5B5B5B", "mcl_dye:grey", N("Light Grey") }, + ["unicolor_black"] = {"black", S("Black Banner"), "mcl_wool:black", "#000000", "mcl_dye:black", N("Black") }, + ["unicolor_red"] = {"red", S("Red Banner"), "mcl_wool:red", "#BC0000", "mcl_dye:red", N("Red") }, + ["unicolor_yellow"] = {"yellow", S("Yellow Banner"), "mcl_wool:yellow", "#E6CD00", "mcl_dye:yellow", N("Yellow") }, + ["unicolor_dark_green"] = {"green", S("Green Banner"), "mcl_wool:green", "#006000", "mcl_dye:dark_green", N("Green") }, + ["unicolor_cyan"] = {"cyan", S("Cyan Banner"), "mcl_wool:cyan", "#00ACAC", "mcl_dye:cyan", N("Cyan") }, + ["unicolor_blue"] = {"blue", S("Blue Banner"), "mcl_wool:blue", "#0000AC", "mcl_dye:blue", N("Blue") }, + ["unicolor_red_violet"] = {"magenta", S("Magenta Banner"), "mcl_wool:magenta", "#AC007C", "mcl_dye:magenta", N("Magenta")}, + ["unicolor_orange"] = {"orange", S("Orange Banner"), "mcl_wool:orange", "#E67300", "mcl_dye:orange", N("Orange") }, + ["unicolor_violet"] = {"purple", S("Purple Banner"), "mcl_wool:purple", "#6400AC", "mcl_dye:violet", N("Violet") }, + ["unicolor_brown"] = {"brown", S("Brown Banner"), "mcl_wool:brown", "#603000", "mcl_dye:brown", N("Brown") }, + ["unicolor_pink"] = {"pink", S("Pink Banner"), "mcl_wool:pink", "#DE557C", "mcl_dye:pink", N("Pink") }, + ["unicolor_lime"] = {"lime", S("Lime Banner"), "mcl_wool:lime", "#30AC00", "mcl_dye:green", N("Lime") }, + ["unicolor_light_blue"] = {"light_blue", S("Light Blue Banner"), "mcl_wool:light_blue", "#4040CF", "mcl_dye:lightblue", N("Light Blue") }, } local colors_reverse = {} diff --git a/mods/ITEMS/mcl_banners/locale/mcl_banners.de.tr b/mods/ITEMS/mcl_banners/locale/mcl_banners.de.tr new file mode 100644 index 000000000..6e8812c8d --- /dev/null +++ b/mods/ITEMS/mcl_banners/locale/mcl_banners.de.tr @@ -0,0 +1,76 @@ +# textdomain: mcl_banners +White Banner=Weißes Banner +White=weiß +Grey Banner=Graues Banner +Grey=grau +Light Grey Banner=Hellgraues Banner +Light Grey=hellgrau +Black Banner=Schwarzes Banner +Black=schwarz +Red Banner=Rotes Banner +Red=rot +Yellow Banner=Gelbes Banner +Yellow=gelb +Green Banner=Grünes Banner +Green=grün +Cyan Banner=Türkises Banner +Cyan=türkis +Blue Banner=Blaues Banner +Blue=blau +Magenta Banner=Magenta Banner +Magenta=magenta +Orange Banner=Orange Banner +Orange=orange +Purple Banner=Violettes Banner +Purple=violett +Brown Banner=Braunes Banner +Brown=braun +Pink Banner=Rosanes Banner +Pink=rosa +Lime Banner=Lindgrünes Banner +Lime=lindgrün +Light Blue Banner=Hellblaues Banner +Light Blue=hellblau +Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.=Banner sind hohe farbige dekorative Blöcke. Sie können auf dem Boden und an Wände platziert werden. Banner können mit einer Vielzahl von Mustern mit Hilfe von Farbstoffen in der Fertigung bemalt werden. +Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible.=Benutzen Sie die Fertigung, um ein Muster auf einem Banner zu malen. Bemalte Banner können erneut bemalt werden, um verschiedene Muster zu ergeben. Sie können bis zu 12 Schichten auf einen Banner malen. Wenn ein Banner einen Farbverlauf hat, sind nur 3 Schichten möglich. +You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.=Sie können ein Muster eines Banners kopieren, indem Sie zwei Banner der selben Grundfarbe in das Fertigungsgitter platzieren: Das eine muss bemalt sein, das andere leer. Außerdem können Sie ein Banner an einem Kessel mit Wasser benutzen, um seine oberste Schicht abzuwaschen. +@1 Bordure=Bord (@1) +@1 Bricks=Ziegel (@1) +@1 Roundel=Kugel (@1) +@1 Creeper Charge=Creeper-Figur (@1) +@1 Saltire=Andreaskreuz (@1) +@1 Bordure Indented=Gewellter Bord (@1) +@1 Per Bend Inverted=Schräglinke umgekehrte Teilung (@1) +@1 Per Bend Sinister Inverted=Schrägrechte umgekehrte Teilung (@1) +@1 Per Bend=Schräglinke Teilung (@1) +@1 Per Bend Sinister=Schrägrechte Teilung (@1) +@1 Flower Charge=Blumenfigur (@1) +@1 Gradient=Farbverlauf (@1) +@1 Base Gradient=Fußfarbverlauf (@1) +@1 Per Fess Inverted=Umgekehrte Teilung (@1) +@1 Per Fess=Teilung (@1) +@1 Per Pale=Spaltung (@1) +@1 Per Pale Inverted=Umgekehrte Spaltung (@1) +@1 Thing Charge=Dingsfigur (@1) +@1 Lozenge=Raute (@1) +@1 Skull Charge=Totenkopffigur (@1) +@1 Paly=Pfähle (@1) +@1 Base Dexter Canton=Rechtes Untereck (@1) +@1 Base Sinister Canton=Linkes Untereck (@1) +@1 Chief Dexter Canton=Rechtes Obereck (@1) +@1 Chief Sinister Canton=Linkes Obereck (@1) +@1 Cross=Kreuz (@1) +@1 Base=Fuß (@1) +@1 Pale=Pfahl (@1) +@1 Bend Sinister=Schräglinksbalken (@1) +@1 Bend=Schrägbalken (@1) +@1 Pale Dexter=Rechte Flanke (@1) +@1 Fess=Balken (@1) +@1 Pale Sinister=Linke Flanke (@1) +@1 Chief=Haupt (@1) +@1 Chevron=Sparren (@1) +@1 Chevron Inverted=Gegensparren (@1) +@1 Base Indented=Gezackter Fuß (@1) +@1 Chief Indented=Gezacktes Haupt (@1) +And one additional layer=Und eine zusätzliche Schicht +And @1 additional layers=Und @1 zusätzliche Schichten diff --git a/mods/ITEMS/mcl_banners/locale/template.txt b/mods/ITEMS/mcl_banners/locale/template.txt index 868ae20b8..e69629d9c 100644 --- a/mods/ITEMS/mcl_banners/locale/template.txt +++ b/mods/ITEMS/mcl_banners/locale/template.txt @@ -1,60 +1,76 @@ # textdomain: mcl_banners White Banner= +White= Grey Banner= +Grey= Light Grey Banner= +Light Grey= Black Banner= +Black= Red Banner= +Red= Yellow Banner= +Yellow= Green Banner= +Green= Cyan Banner= +Cyan= Blue Banner= +Blue= Magenta Banner= +Magenta= Orange Banner= +Orange= Purple Banner= +Violet= Brown Banner= +Brown= Pink Banner= +Pink= Lime Banner= +Lime= Light Blue Banner= +Light Blue= Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.= Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible.= You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.= -%s Bordure= -%s Bricks= -%s Roundel= -%s Creeper Charge= -%s Saltire= -%s Bordure Indented= -%s Per Bend Inverted= -%s Per Bend Sinister Inverted= -%s Per Bend= -%s Per Bend Sinister= -%s Flower Charge= -%s Gradient= -%s Base Gradient= -%s Per Fess Inverted= -%s Per Fess= -%s Per Pale= -%s Per Pale Inverted= -%s Thing Charge= -%s Lozenge= -%s Skull Charge= -%s Paly= -%s Base Dexter Canton= -%s Base Sinister Canton= -%s Chief Dexter Canton= -%s Chief Sinister Canton= -%s Cross= -%s Base= -%s Pale= -%s Bend Sinister= -%s Bend= -%s Pale Dexter= -%s Fess= -%s Pale Sinister= -%s Chief= -%s Chevron= -%s Chevron Inverted= -%s Base Indented= -%s Chief Indented= -And one addional layer= -And %d addional layers= +@1 Bordure= +@1 Bricks= +@1 Roundel= +@1 Creeper Charge= +@1 Saltire= +@1 Bordure Indented= +@1 Per Bend Inverted= +@1 Per Bend Sinister Inverted= +@1 Per Bend= +@1 Per Bend Sinister= +@1 Flower Charge= +@1 Gradient= +@1 Base Gradient= +@1 Per Fess Inverted= +@1 Per Fess= +@1 Per Pale= +@1 Per Pale Inverted= +@1 Thing Charge= +@1 Lozenge= +@1 Skull Charge= +@1 Paly= +@1 Base Dexter Canton= +@1 Base Sinister Canton= +@1 Chief Dexter Canton= +@1 Chief Sinister Canton= +@1 Cross= +@1 Base= +@1 Pale= +@1 Bend Sinister= +@1 Bend= +@1 Pale Dexter= +@1 Fess= +@1 Pale Sinister= +@1 Chief= +@1 Chevron= +@1 Chevron Inverted= +@1 Base Indented= +@1 Chief Indented= +And one additional layer= +And @1 additional layer(s)= diff --git a/mods/ITEMS/mcl_banners/patterncraft.lua b/mods/ITEMS/mcl_banners/patterncraft.lua index 5518f883f..3f161267d 100644 --- a/mods/ITEMS/mcl_banners/patterncraft.lua +++ b/mods/ITEMS/mcl_banners/patterncraft.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("mcl_banners") +local N = function(s) return s end -- Pattern crafting. This file contains the code for crafting all the -- emblazonings you can put on the banners. It's quite complicated; @@ -19,99 +20,99 @@ local d = "group:dye" -- dye local e = "" -- empty slot (one of them must contain the banner) local patterns = { ["border"] = { - name = S("%s Bordure"), + name = N("@1 Bordure"), { d, d, d }, { d, e, d }, { d, d, d }, }, ["bricks"] = { - name = S("%s Bricks"), + name = N("@1 Bricks"), type = "shapeless", { e, "mcl_core:brick_block", d }, }, ["circle"] = { - name = S("%s Roundel"), + name = N("@1 Roundel"), { e, e, e }, { e, d, e }, { e, e, e }, }, ["creeper"] = { - name = S("%s Creeper Charge"), + name = N("@1 Creeper Charge"), type = "shapeless", { e, "mcl_heads:creeper", d }, }, ["cross"] = { - name = S("%s Saltire"), + name = N("@1 Saltire"), { d, e, d }, { e, d, e }, { d, e, d }, }, ["curly_border"] = { - name = S("%s Bordure Indented"), + name = N("@1 Bordure Indented"), type = "shapeless", { e, "mcl_core:vine", d }, }, ["diagonal_up_left"] = { - name = S("%s Per Bend Inverted"), + name = N("@1 Per Bend Inverted"), { e, e, e }, { d, e, e }, { d, d, e }, }, ["diagonal_up_right"] = { - name = S("%s Per Bend Sinister Inverted"), + name = N("@1 Per Bend Sinister Inverted"), { e, e, e }, { e, e, d }, { e, d, d }, }, ["diagonal_right"] = { - name = S("%s Per Bend"), + name = N("@1 Per Bend"), { e, d, d }, { e, e, d }, { e, e, e }, }, ["diagonal_left"] = { - name = S("%s Per Bend Sinister"), + name = N("@1 Per Bend Sinister"), { d, d, e }, { d, e, e }, { e, e, e }, }, ["flower"] = { - name = S("%s Flower Charge"), + name = N("@1 Flower Charge"), type = "shapeless", { e, "mcl_flowers:oxeye_daisy", d }, }, ["gradient"] = { - name = S("%s Gradient"), + name = N("@1 Gradient"), { d, e, d }, { e, d, e }, { e, d, e }, }, ["gradient_up"] = { - name = S("%s Base Gradient"), + name = N("@1 Base Gradient"), { e, d, e }, { e, d, e }, { d, e, d }, }, ["half_horizontal_bottom"] = { - name = S("%s Per Fess Inverted"), + name = N("@1 Per Fess Inverted"), { e, e, e }, { d, d, d }, { d, d, d }, }, ["half_horizontal"] = { - name = S("%s Per Fess"), + name = N("@1 Per Fess"), { d, d, d }, { d, d, d }, { e, e, e }, }, ["half_vertical"] = { - name = S("%s Per Pale"), + name = N("@1 Per Pale"), { d, d, e }, { d, d, e }, { d, d, e }, }, ["half_vertical_right"] = { - name = S("%s Per Pale Inverted"), + name = N("@1 Per Pale Inverted"), { e, d, d }, { e, d, d }, { e, d, d }, @@ -119,126 +120,126 @@ local patterns = { ["thing"] = { -- Symbol used for the “Thing”: U+1F65D 🙝 - name = S("%s Thing Charge"), + name = N("@1 Thing Charge"), type = "shapeless", -- TODO: Replace with enchanted golden apple { e, "mcl_core:apple_gold", d }, }, ["rhombus"] = { - name = S("%s Lozenge"), + name = N("@1 Lozenge"), { e, d, e }, { d, e, d }, { e, d, e }, }, ["skull"] = { - name = S("%s Skull Charge"), + name = N("@1 Skull Charge"), type = "shapeless", { e, "mcl_heads:wither_skeleton", d }, }, ["small_stripes"] = { - name = S("%s Paly"), + name = N("@1 Paly"), { d, e, d }, { d, e, d }, { e, e, e }, }, ["square_bottom_left"] = { - name = S("%s Base Dexter Canton"), + name = N("@1 Base Dexter Canton"), { e, e, e }, { e, e, e }, { d, e, e }, }, ["square_bottom_right"] = { - name = S("%s Base Sinister Canton"), + name = N("@1 Base Sinister Canton"), { e, e, e }, { e, e, e }, { e, e, d }, }, ["square_top_left"] = { - name = S("%s Chief Dexter Canton"), + name = N("@1 Chief Dexter Canton"), { d, e, e }, { e, e, e }, { e, e, e }, }, ["square_top_right"] = { - name = S("%s Chief Sinister Canton"), + name = N("@1 Chief Sinister Canton"), { e, e, d }, { e, e, e }, { e, e, e }, }, ["straight_cross"] = { - name = S("%s Cross"), + name = N("@1 Cross"), { e, d, e }, { d, d, d }, { e, d, e }, }, ["stripe_bottom"] = { - name = S("%s Base"), + name = N("@1 Base"), { e, e, e }, { e, e, e }, { d, d, d }, }, ["stripe_center"] = { - name = S("%s Pale"), + name = N("@1 Pale"), { e, d, e }, { e, d, e }, { e, d, e }, }, ["stripe_downleft"] = { - name = S("%s Bend Sinister"), + name = N("@1 Bend Sinister"), { e, e, d }, { e, d, e }, { d, e, e }, }, ["stripe_downright"] = { - name = S("%s Bend"), + name = N("@1 Bend"), { d, e, e }, { e, d, e }, { e, e, d }, }, ["stripe_left"] = { - name = S("%s Pale Dexter"), + name = N("@1 Pale Dexter"), { d, e, e }, { d, e, e }, { d, e, e }, }, ["stripe_middle"] = { - name = S("%s Fess"), + name = N("@1 Fess"), { e, e, e }, { d, d, d }, { e, e, e }, }, ["stripe_right"] = { - name = S("%s Pale Sinister"), + name = N("@1 Pale Sinister"), { e, e, d }, { e, e, d }, { e, e, d }, }, ["stripe_top"] = { - name = S("%s Chief"), + name = N("@1 Chief"), { d, d, d }, { e, e, e }, { e, e, e }, }, ["triangle_bottom"] = { - name = S("%s Chevron"), + name = N("@1 Chevron"), { e, e, e }, { e, d, e }, { d, e, d }, }, ["triangle_top"] = { - name = S("%s Chevron Inverted"), + name = N("@1 Chevron Inverted"), { d, e, d }, { e, d, e }, { e, e, e }, }, ["triangles_bottom"] = { - name = S("%s Base Indented"), + name = N("@1 Base Indented"), { e, e, e }, { d, e, d }, { e, d, e }, }, ["triangles_top"] = { - name = S("%s Chief Indented"), + name = N("@1 Chief Indented"), { e, d, e }, { d, e, d }, { e, e, e }, @@ -267,14 +268,15 @@ mcl_banners.make_advanced_banner_description = function(description, layers) -- Layer text line. local color = mcl_banners.colors[layers[l].color][6] local pattern_name = patterns[layers[l].pattern].name - -- The pattern name is a format string (e.g. “%s Base”) - table.insert(layerstrings, string.format(pattern_name, color)) + -- The pattern name is a format string + -- (e.g. “@1 Base” → “Yellow Base”) + table.insert(layerstrings, S(pattern_name, S(color))) end -- Warn about missing information if #layers == max_layer_lines + 1 then - table.insert(layerstrings, S("And one addional layer")) + table.insert(layerstrings, S("And one additional layer")) elseif #layers > max_layer_lines + 1 then - table.insert(layerstrings, string.format(S("And %d addional layers"), #layers - max_layer_lines)) + table.insert(layerstrings, S("And @1 additional layers", #layers - max_layer_lines)) end -- Final string concatenations: Just a list of strings From e01ed8ab2413191444165edd479fee8f76711bd4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 06:20:05 +0100 Subject: [PATCH 174/379] German translation: mcl_beds to mcl_chests --- mods/ITEMS/mcl_beds/api.lua | 8 ++--- mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr | 32 +++++++++++++++++++ mods/ITEMS/mcl_beds/locale/template.txt | 4 +-- mods/ITEMS/mcl_books/init.lua | 2 +- mods/ITEMS/mcl_books/locale/mcl_books.de.tr | 25 +++++++++++++++ mods/ITEMS/mcl_books/locale/template.txt | 2 ++ mods/ITEMS/mcl_bows/locale/mcl_bows.de.tr | 11 +++++++ mods/ITEMS/mcl_buckets/init.lua | 8 ++--- .../mcl_buckets/locale/mcl_buckets.de.tr | 13 ++++++++ mods/ITEMS/mcl_buckets/locale/template.txt | 8 ++--- mods/ITEMS/mcl_cake/locale/mcl_cake.de.tr | 10 ++++++ mods/ITEMS/mcl_cauldrons/init.lua | 4 +-- .../mcl_cauldrons/locale/mcl_cauldrons.de.tr | 10 ++++++ mods/ITEMS/mcl_chests/init.lua | 8 +++-- mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr | 28 ++++++++++++++++ mods/ITEMS/mcl_chests/locale/template.txt | 3 +- 16 files changed, 154 insertions(+), 22 deletions(-) create mode 100644 mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr create mode 100644 mods/ITEMS/mcl_books/locale/mcl_books.de.tr create mode 100644 mods/ITEMS/mcl_bows/locale/mcl_bows.de.tr create mode 100644 mods/ITEMS/mcl_buckets/locale/mcl_buckets.de.tr create mode 100644 mods/ITEMS/mcl_cake/locale/mcl_cake.de.tr create mode 100644 mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr create mode 100644 mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index 6c94121b3..7d76b76eb 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -35,13 +35,13 @@ end local beddesc = S("Beds allow you to sleep at night and make the time pass faster.") local beduse = S("To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.") -if minetest.settings:get_bool("enable_bed_respawn") == false then - beddesc = beddesc .. "\n" .. S("In local folklore, legends are told of other worlds where setting the start point for your next life would be possible. But this world is not one of them.") +if true or minetest.settings:get_bool("enable_bed_respawn") == false then + beddesc = beddesc .. "\n" .. S("You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.") else beddesc = beddesc .. "\n" .. S("By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.") end -if minetest.settings:get_bool("enable_bed_night_skip") == false then - beddesc = beddesc .. "\n" .. S("In this strange world, going to bed won't skip the night, but you can skip thunderstorms.") +if true or minetest.settings:get_bool("enable_bed_night_skip") == false then + beddesc = beddesc .. "\n" .. S("In this world, going to bed won't skip the night, but it will skip thunderstorms.") else beddesc = beddesc .. "\n" .. S("Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.") end diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr new file mode 100644 index 000000000..c496249b4 --- /dev/null +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr @@ -0,0 +1,32 @@ +# textdomain: mcl_beds +Beds allow you to sleep at night and make the time pass faster.=Mit Betten können Sie in der Nacht schlafen und die Zeit schneller verstreichen lassen. +To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.=Um ein Bett zu benutzen, stellen Sie sich direkt davor und rechtsklicken Sie darauf, um darin zu schlafen. Schlafen funktioniert nur, wenn die Sonne untergeht, in der Nacht oder während eines Gewittersturms. Das Bett muss außerdem fern von Gefahren sein. +You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.=Sie hörten von anderen Welten, in denen ein Bett den Startpunkt für Ihr nächstes Leben setzen würde. Aber diese Welt ist keine solche. +By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.=Indem Sie ein Bett benutzen, setzen Sie den Startpunkt Ihres nächsten Lebens. Wenn Sie sterben, werden Sie Ihr nächstes Leben auf diesem Bett beginnen, es sei denn, es ist blockiert oder zerstört. +In this world, going to bed won't skip the night, but it will skip thunderstorms.=In dieser Welt können mit dem Bett Nächte nicht übersprungen werden, nur Gewitterstürme. +Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=Mit Schlaf können Sie die Nacht überspringen. Die Nacht wird übersprungen, wenn alle Spieler in dieser Welt sich schlafen gelegt haben. Die Nacht wird dann nach ein paar Sekunden übersprungen. Gewitterstürme werden auf die gleiche Weise übersprungen. +Red Bed=Rotes Bett +Blue Bed=Blaues Bett +Cyan Bed=Türkises Bett +Grey Bed=Graues Bett +Light Grey Bed=Hellgraues Bett +Black Bed=Schwarzes Bett +Yellow Bed=Gelbes Bett +Green Bed=Grünes Bett +Magenta Bed=Magenta Bett +Orange Bed=Orange Bett +Purple Bed=Violettes Bett +Brown Bed=Braunes Bett +Pink Bed=Rosanes Bett +Lime Bed=Lindgrünes Bett +Light Blue Bed=Hellblaues Bett +White Bed=Weißes Bett +You can't sleep, the bed's too far away!=Sie können nicht schlafen, das Bett ist zu weit weg! +This bed is already occupied!=Dieses Bett ist schon belegt! +You have to stop moving before going to bed!=Sie müssen anhalten, bevor Sie zu Bett gehen! +You can't sleep now, monsters are nearby!=Sie können jetzt nicht schlafen, Monster sind in der Nähe! +You can't sleep, the bed is obstructed!=Sie können nicht schlafen, das Bett ist blockiert! +It's too dangerous to sleep here!=Es ist zu gefährlich, hier zu schlafen! +New respawn position set! But you can only sleep at night or during a thunderstorm.=Neue Wiedereinstiegsposition gesetzt! Aber Sie können nur nachts oder während eines Gewittersturms schlafen. +You can only sleep at night or during a thunderstorm.=Sie können nur nachts oder während eines Gewittersturms schlafen. +New respawn position set!=Neue Wiedereinstiegsposition gesetzt! diff --git a/mods/ITEMS/mcl_beds/locale/template.txt b/mods/ITEMS/mcl_beds/locale/template.txt index 191489e39..13901c198 100644 --- a/mods/ITEMS/mcl_beds/locale/template.txt +++ b/mods/ITEMS/mcl_beds/locale/template.txt @@ -1,9 +1,9 @@ # textdomain: mcl_beds Beds allow you to sleep at night and make the time pass faster.= To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.= -In local folklore, legends are told of other worlds where setting the start point for your next life would be possible. But this world is not one of them.= +You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them. By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.= -In this strange world, going to bed won't skip the night, but you can skip thunderstorms.= +In this world, going to bed won't skip the night, but it will skip thunderstorms.= Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.= Red Bed= Blue Bed= diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index 2c8d4afc0..645033b8c 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -109,7 +109,7 @@ end -- Book and Quill minetest.register_craftitem("mcl_books:writable_book", { - description = "Book and Quill", + description = S("Book and Quill"), _doc_items_longdesc = S("This item can be used to write down some notes."), _doc_items_usagehelp = S("Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.").."\n".. S("A book can hold up to 4500 characters. The title length is limited to 64 characters."), diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.de.tr b/mods/ITEMS/mcl_books/locale/mcl_books.de.tr new file mode 100644 index 000000000..261c099a4 --- /dev/null +++ b/mods/ITEMS/mcl_books/locale/mcl_books.de.tr @@ -0,0 +1,25 @@ +# textdomain: mcl_books +Book=Buch +Books are used to make bookshelves and book and quills.=Bücher werden zur Herstellung von Bücherregalen und Büchern mit Federkiel gebraucht. +“@1”=„@1“ +Copy of “@1”=Kopie von „@1“ +Copy of Copy of “@1”=Kopie von Kopie von „@1“ +Tattered Book=Zerfleddertes Buch +by @1=von @1 +Sign=Signieren +Done=Fertig +This item can be used to write down some notes.=Dies kann benutzt werden, um ein paar Notizen aufzuschreiben. +Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Halten Sie es in der Hand, dann rechtsklicken Sie, um die Notizen zu sehen zu zu ändern. Sie können den Text beliebig ändern. Sie können das Buch auch signieren und in ein geschriebenes Buch verwandeln, das gestapelt, aber nicht mehr geändert werden kann. +A book can hold up to 4500 characters. The title length is limited to 64 characters.=Ein Buch kann bis zu 4500 Zeichen enthalten. Die Titellänge ist begrenzt auf 64 Zeichen. +Enter book title:=Buchtitel eingeben: +Note: The book will no longer@nbe editable after signing.=Anmerkung: Das Buch kann nach@nder Signierung nicht länger@nbearbeitet werden. +Sign and Close=Signieren und schließen +Cancel=Abbrechen +Nameless Book=Namenloses Buch +Written Book=Geschriebenes Buch +Written books contain some text written by someone. They can be read and copied, but not edited.=Geschriebene Bücher enthalten etwas Text, den jemand geschrieben hat. Sie können gelesen und kopiert, aber nicht geändert werden. +Hold it in your hand, then rightclick to read the book.=Halten Sie es in Ihrer Hand und rechtsklicken Sie, um das Buch zu lesen. +To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.=Um den Text zu kopieren, platzieren Sie es ins Fertigungsgitter mit einem Buch mit Federkiel (oder mehreren) und fertigen Sie die Kopie an. Das geschriebene Buch bleibt. Kopien von Kopien können nicht kopiert werden. +Bookshelf=Bücherregal +Bookshelves are used for decoration.=Bücherregale werden zur Dekoration benutzt. +Book and Quill=Buch und Federkiel diff --git a/mods/ITEMS/mcl_books/locale/template.txt b/mods/ITEMS/mcl_books/locale/template.txt index 1d7ee963c..acf614cdb 100644 --- a/mods/ITEMS/mcl_books/locale/template.txt +++ b/mods/ITEMS/mcl_books/locale/template.txt @@ -6,6 +6,7 @@ Copy of “@1”= Copy of Copy of “@1”= Tattered Book= by @1= +# as in “to sign a book” Sign= Done= This item can be used to write down some notes.= @@ -23,3 +24,4 @@ Hold it in your hand, then rightclick to read the book.= To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.= Bookshelf= Bookshelves are used for decoration.= +Book and Quill= diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.de.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.de.tr new file mode 100644 index 000000000..4ca45c0e1 --- /dev/null +++ b/mods/ITEMS/mcl_bows/locale/mcl_bows.de.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_bows +Arrow=Pfeil +Arrows are ammunition for bows and dispensers.=Pfeile sind Munition für Bögen und Werfer. +An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=Ein Bogen von einem Pfeil richtet regulär 1-9 Schaden an. Mit voller Zugkraft gibt es eine 20%-ige Chance auf einen kritischen Treffer mit 10 Schaden. Ein Pfeil aus einem Werfer richtet immer 3 Schaden an. +Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=Pfeile können in festen Blöcken stecken bleiben und wieder aufgesammelt werden. Sie können auf Holzknöpfe drücken. +To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=Um Pfeile als Munition für dne Bogen zu benutzen, platzieren Sie sie einfach irgendwo im Inventar, sie werden automatisch benutzt. Um Pfeile als Munition für Werfer zu benutzen, platzieren Sie sie ins Inventar eines Werferr. Um einen steckengebliebenen Pfeil aufzusammeln, gehen Sie einfach zu ihm hin. +Bow=Bogen +Bows are ranged weapons to shoot arrows at your foes.=Bogen sind Fernwaffen, um Pfeile auf Ihre Feinde zu schießen. +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.=Die Geschwindigkeit und der Schaden des Bogens erhöht sich, je länger sie den Bogen spannen. Der reguläre Schaden des Pfeiles ist zwischen 1 und 9. Ist der Bogen voll gespannt, gibt es eine 20%-ig Change für einen kritischen Treffer, der 10 Schaden anrichtet. +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.=Um den Bogen zu benutzen, muss sich im Inventar mindestens ein Pfeil befinden (außer im Kreativmodus). Halten sie die rechte Maustaste gedrückt zum Spannen, lassen Sie sie los zum Schießen. +Bow=Bogen diff --git a/mods/ITEMS/mcl_buckets/init.lua b/mods/ITEMS/mcl_buckets/init.lua index e17a98632..9b25c21a5 100644 --- a/mods/ITEMS/mcl_buckets/init.lua +++ b/mods/ITEMS/mcl_buckets/init.lua @@ -186,7 +186,7 @@ end minetest.register_craftitem("mcl_buckets:bucket_empty", { description = S("Empty Bucket"), _doc_items_longdesc = S("A bucket can be used to collect and release liquids."), - _doc_items_usagehelp = S("Punch a liquid source to collect the liquid. With the filled bucket, you can right-click somewhere to empty the bucket which will create a liquid source at the position you've clicked at."), + _doc_items_usagehelp = S("Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else."), inventory_image = "bucket.png", stack_max = 16, @@ -306,7 +306,7 @@ if mod_mcl_core then "bucket_lava.png", S("Lava Bucket"), S("A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution."), - S("Choose a place where you want to empty the bucket, then get in a safe spot somewhere above it. Be prepared to run away when something goes wrong as the lava will soon start to flow after placing. To empty the bucket (which places a lava source), right-click on your chosen place.") + S("Get in a safe distance and place the bucket to empty it and create a lava source at this spot. Don't burn yourself!") ) -- Water bucket @@ -317,7 +317,7 @@ if mod_mcl_core then "bucket_water.png", S("Water Bucket"), S("A bucket can be used to collect and release liquids. This one is filled with water."), - S("Right-click on any block to empty the bucket and put a water source on this spot."), + S("Place it to empty the bucket and create a water source."), function(pos, placer) -- Check protection local placer_name = "" @@ -359,7 +359,7 @@ if mod_mclx_core then "bucket_river_water.png", S("River Water Bucket"), S("A bucket can be used to collect and release liquids. This one is filled with river water."), - S("Right-click on any block to empty the bucket and put a river water source on this spot."), + S("Place it to empty the bucket and create a river water source."), function(pos, placer) -- Check protection local placer_name = "" diff --git a/mods/ITEMS/mcl_buckets/locale/mcl_buckets.de.tr b/mods/ITEMS/mcl_buckets/locale/mcl_buckets.de.tr new file mode 100644 index 000000000..26bb4ca4c --- /dev/null +++ b/mods/ITEMS/mcl_buckets/locale/mcl_buckets.de.tr @@ -0,0 +1,13 @@ +# textdomain: mcl_buckets +Empty Bucket=Leerer Eimer +A bucket can be used to collect and release liquids.=Ein Eimer kann benutzt werden, um Flüssigkeiten aufzusammeln und wieder freizulassen. +Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else.=Hauen Sie auf eine Flüssigkeitsquelle, um sie aufzusammeln. Sie können den vollen Eimer dann benutzen, um die Flüssigkeit woanders zu platzieren. +Lava Bucket=Lavaeimer +A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution.=Ein Eimer kann benutzt werden, um Flüssigkeiten aufzusammeln und wieder freizulassen. Dieser hier ist voller heißer Lava, die sicher in ihm verstaut ist. Mit Vorsicht zu handhaben. +Get in a safe distance and place the bucket to empty it and create a lava source at this spot. Don't burn yourself!=Gehen Sie zu einer sicheren Stelle und platzieren Sie den Eimer, um ihn zu leeren und eine Lavaquelle an dieser Stelle zu erzeugen. Verbrennen Sie sich nicht! +Water Bucket=Wassereimer +A bucket can be used to collect and release liquids. This one is filled with water.=Ein Eimer kann benutzt werden, um Flüssigkeiten aufzusammeln und wieder freizulassen. Dieser hier ist mit Wasser gefüllt. +Place it to empty the bucket and create a water source.=Platzieren Sie ihn, um den Eimer zu leeren und eine Wasserquelle zu erzeugen. +River Water Bucket=Flusswassereimer +A bucket can be used to collect and release liquids. This one is filled with river water.=Ein Eimer kann benutzt werden, um Flüssigkeiten aufzusammeln und wieder freizulassen. Dieser hier ist mit Flusswasser gefüllt. +Place it to empty the bucket and create a river water source.=Platzieren Sie ihn, um den Eimer zu leeren und eine Flusswasserquelle zu erzeugen. diff --git a/mods/ITEMS/mcl_buckets/locale/template.txt b/mods/ITEMS/mcl_buckets/locale/template.txt index f9a23d400..6ad479fee 100644 --- a/mods/ITEMS/mcl_buckets/locale/template.txt +++ b/mods/ITEMS/mcl_buckets/locale/template.txt @@ -1,13 +1,13 @@ # textdomain: mcl_buckets Empty Bucket= A bucket can be used to collect and release liquids.= -Punch a liquid source to collect the liquid. With the filled bucket, you can right-click somewhere to empty the bucket which will create a liquid source at the position you've clicked at.= +Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else.= Lava Bucket= A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution.= -Choose a place where you want to empty the bucket, then get in a safe spot somewhere above it. Be prepared to run away when something goes wrong as the lava will soon start to flow after placing. To empty the bucket (which places a lava source), right-click on your chosen place.= +Get in a safe distance and place the bucket to empty it and create a lava source at this spot. Don't burn yourself!= Water Bucket= A bucket can be used to collect and release liquids. This one is filled with water.= -Right-click on any block to empty the bucket and put a water source on this spot.= +Place it to empty the bucket and create a water source.= River Water Bucket= A bucket can be used to collect and release liquids. This one is filled with river water.= -Right-click on any block to empty the bucket and put a river water source on this spot.= +Place it to empty the bucket and create a river water source.= diff --git a/mods/ITEMS/mcl_cake/locale/mcl_cake.de.tr b/mods/ITEMS/mcl_cake/locale/mcl_cake.de.tr new file mode 100644 index 000000000..204f0d4a2 --- /dev/null +++ b/mods/ITEMS/mcl_cake/locale/mcl_cake.de.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_cake +Cake=Kuchen +Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.=Kuchen können platziert und gegessen werden, um Hungerpunkte wiederherzustellen. Ein Kuchen hat 7 Stücke. Jedes Stück stellt 2 Hungerpunkte und 0,4 Sättigungspunkte wieder her. Kuchen werden zerstört, wenn sie abgebaut werden oder der Block unter ihnen bricht. +Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.=Platzieren Sie ihn irgendwo, dann rechtsklicken Sie auf ihn, um ein Stück zu essen. Sie können nicht vom Kuchen naschen, wenn ihre Hungerleiste voll ist. +Cake (6 Slices Left)=Kuchen (6 Stücke übrig) +Cake (5 Slices Left)=Kuchen (5 Stücke übrig) +Cake (4 Slices Left)=Kuchen (4 Stücke übrig) +Cake (3 Slices Left)=Kuchen (3 Stücke übrig) +Cake (2 Slices Left)=Kuchen (2 Stücke übrig) +Cake (1 Slice Left)=Kuchen (1 Stück übrig) diff --git a/mods/ITEMS/mcl_cauldrons/init.lua b/mods/ITEMS/mcl_cauldrons/init.lua index aee2a314a..68c507ce7 100644 --- a/mods/ITEMS/mcl_cauldrons/init.lua +++ b/mods/ITEMS/mcl_cauldrons/init.lua @@ -45,8 +45,8 @@ end -- Empty cauldron minetest.register_node("mcl_cauldrons:cauldron", { description = S("Cauldron"), - _doc_items_longdesc = S("Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners."), - _doc_items_usagehelp = S("Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer."), + _doc_items_longdesc = S("Cauldrons are used to store water and slowly fill up under rain."), + _doc_items_usagehelp = S("Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water."), wield_image = "mcl_cauldrons_cauldron.png", inventory_image = "mcl_cauldrons_cauldron.png", drawtype = "nodebox", diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr new file mode 100644 index 000000000..0e3a4c41d --- /dev/null +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_cauldron +Cauldron=Kessel +Cauldrons are used to store water and slowly fill up under rain.=Kessel werden benutzt, um Wasser zu lagern, im Regen werden sie langsam aufgefüllt. +Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water.=Platzieren Sie einen Wassereinmer in den Kessel, um ihn mit Wasser zu füllen. Platzieren Sie einen leeren Eimer auf einen vollen Kessel, um das Wasser aufzusammeln. Platzieren Sie eine Wasserflasche in den Kessel, um ihn zu einem Drittel mit Wasser zu füllen. +Cauldron (1/3 Water)=Kessel (1/3 Wasser) +Cauldron (2/3 Water)=Kessel (2/3 Wasser) +Cauldron (3/3 Water)=Kessel (3/3 Wasser) +Cauldron (1/3 River Water)=Kessel (1/3 Wasser) +Cauldron (2/3 River Water)=Kessel (2/3 Flusswasser) +Cauldron (3/3 River Water)=Kessel (3/3 Flusswasser) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 6f3c0ceb2..a63ed08b2 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -480,10 +480,12 @@ end -- END OF register_chest FUNCTION BODY end +local chestusage = S("To access its inventory, rightclick it. When broken, the items will drop out.") + register_chest("chest", S("Chest"), S("Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other."), - S("To access the chest's inventory, rightclick the chest. When broken, the items of the chest will drop out."), + chestusage, { small = {"default_chest_top.png", "mcl_chests_chest_bottom.png", "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", @@ -513,7 +515,7 @@ local traptiles = { register_chest("trapped_chest", S("Trapped Chest"), S("A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other."), - S("To access the inventory of a trapped chest, rightclick it. When broken, the items will drop out."), + chestusage, traptiles, nil, {receptor = { @@ -725,7 +727,7 @@ for color, desc in pairs(boxtypes) do minetest.register_node("mcl_chests:"..color.."_shulker_box", { description = desc, _doc_items_longdesc = S("A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors."), - _doc_items_usagehelp = S("To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents."), + _doc_items_usagehelp = S("To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out."), tiles = { "mcl_chests_"..color.."_shulker_box_top.png", -- top "[combine:16x16:-32,-28="..mob_texture, -- bottom diff --git a/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr b/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr new file mode 100644 index 000000000..06bc376de --- /dev/null +++ b/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr @@ -0,0 +1,28 @@ +# textdomain: mcl_chests +Chest=Truhe +Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.=Truhen sind Behälter, die 27 Inventarplätze Platz bieten. Truhen verwandeln sich in große Truhen mit der doppelten Kapazität, wenn zwei Truhen nebeneinander platziert werden. +To access its inventory, rightclick it. When broken, the items will drop out.=Um auf das Inventar zuzugreifen, rechtsklicken Sie darauf. Wenn abgebaut, wird der Inhalt hinausfallen. +Trapped Chest=Mechanismustruhe +A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.= +Mechanismustruhen sind Behälter, die 27 Inventarplätze Platz bieten. Wenn sie geöffnet wird, sendet sie ein Redstone-Signal zu benachbarten Blöcken, solange sie geöffnet bleibt. Mechanismustruhen verwandeln sich in große Mechanismustruhen mit der doppelten Kapazität, wenn zwei Mechanismustruhen nebeneinander platziert werden. +Ender Chest=Endertruhe +Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.=Endertruhen gewähren Ihnen Zugriff zu einem einzigartigen persönlichem interdimensionalem Inventar mit 27 Plätzen. Dieses Inventar ist das gleiche, egal, welche Endertruhe sie benutzen. Wenn Sie einen Gegenstand in eine Endertruhe platzieren, werden Sie sie in allen anderen Endertruhen vorhinden. Jeder Spieler wird nur seine eigenen Gegenstände sehen, aber nicht die der anderen Spieler. +Rightclick the ender chest to access your personal interdimensional inventory.=Rechtsklicken Sie die Endertruhe, um auf Ihr persönliches interdimensionales Inventar zuzugreifen. +White Shulker Box=Weiße Shulkerkiste +Light Grey Shulker Box=Hellgraue Shulkerkiste +Orange Shulker Box=Orange Shulkerkiste +Cyan Shulker Box=Türkise Shulkerkiste +Magenta Shulker Box=Magenta Shulkerkiste +Purple Shulker Box=Violette Shulkerkiste +Light Blue Shulker Box=Hellblaue Shulkerkiste +Blue Shulker Box=Blaue Shulkerkiste +Yellow Shulker Box=Gelbe Shulkerkiste +Brown Shulker Box=Braune Shulkerkiste +Lime Shulker Box=Lindgrüne Shulkerkiste +Green Shulker Box=Grüne Shulkerkiste +Pink Shulker Box=Rosane Shulkerkiste +Red Shulker Box=Rote Shulkerkiste +Grey Shulker Box=Graue Shulkerkiste +Black Shulker Box=Schwarze Shulkerkiste +A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.=Eine Shulkerkiste ist ein tragbarer Behälter der 27 Inventarplätze für alle Gegenstände außer Shulkerkisten bietet. Shulkerkisten behalten ihr Inventar, wenn sie abgebaut werden, also können Shulkerkisten so wie ihr Inhalt als einzelne Gegenstände mitgenommen werden. Shulkerkisten gibt es in vielen verschiedenen Farben. +To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out.=Um auf das Inventar einer Shulkerkiste zuzugreifen, platzieren Sie sie und rechtsklicken sie auf ihr. Um eine Shulkerkiste und ihren Inhalt mitzunehmen, bauen Sie sie einfach ab und sammeln Sie sie auf, der Inhalt will nicht hinausfallen. diff --git a/mods/ITEMS/mcl_chests/locale/template.txt b/mods/ITEMS/mcl_chests/locale/template.txt index 682795bca..e4d8c0134 100644 --- a/mods/ITEMS/mcl_chests/locale/template.txt +++ b/mods/ITEMS/mcl_chests/locale/template.txt @@ -1,10 +1,9 @@ # textdomain: mcl_chests Chest= Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.= -To access the chest's inventory, rightclick the chest. When broken, the items of the chest will drop out.= +To access its inventory, rightclick it. When broken, the items will drop out.= Trapped Chest= A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.= -To access the inventory of a trapped chest, rightclick it. When broken, the items will drop out.= Ender Chest= Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.= Rightclick the ender chest to access your personal interdimensional inventory.= From 2cde0476c7d987b352e87d3e690c702691304ded Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 07:06:45 +0100 Subject: [PATCH 175/379] German translation: mcl_clock to mcl_end but ... no mcl_colorblocks --- mods/ITEMS/mcl_clock/locale/mcl_clock.de.tr | 4 +++ .../ITEMS/mcl_colorblocks/locale/template.txt | 0 .../mcl_compass/locale/mcl_compass.de.tr | 3 +++ .../locale/mcl_crafting_table.de.tr | 4 +++ mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr | 23 +++++++++++++++++ mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr | 25 +++++++++++++++++++ mods/ITEMS/mcl_end/locale/mcl_end.de.tr | 23 +++++++++++++++++ 7 files changed, 82 insertions(+) create mode 100644 mods/ITEMS/mcl_clock/locale/mcl_clock.de.tr delete mode 100644 mods/ITEMS/mcl_colorblocks/locale/template.txt create mode 100644 mods/ITEMS/mcl_compass/locale/mcl_compass.de.tr create mode 100644 mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.de.tr create mode 100644 mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr create mode 100644 mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr create mode 100644 mods/ITEMS/mcl_end/locale/mcl_end.de.tr diff --git a/mods/ITEMS/mcl_clock/locale/mcl_clock.de.tr b/mods/ITEMS/mcl_clock/locale/mcl_clock.de.tr new file mode 100644 index 000000000..f80daa416 --- /dev/null +++ b/mods/ITEMS/mcl_clock/locale/mcl_clock.de.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_clock +Clocks are tools which shows the current time of day in the Overworld.=Uhren sind Werkzeuge, die die Tageszeit in der Oberwelt anzeigen. +The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol.=Die Uhr enthält eine rotierende Scheibe mit einem Sonnensymbol (gelbe Scheibe) und einem Mondsymbol, und sie hat einem kleinen „Pfeil“, der die jetzige Tageszeit anzeigt, indem die reale Position von Sonne und Mond im Himmel abgeschätzt wird. Die Sonne repräsentiert die Mittagszeit und der Mond repräsentiert Mitternacht. +Clock=Uhr diff --git a/mods/ITEMS/mcl_colorblocks/locale/template.txt b/mods/ITEMS/mcl_colorblocks/locale/template.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/mods/ITEMS/mcl_compass/locale/mcl_compass.de.tr b/mods/ITEMS/mcl_compass/locale/mcl_compass.de.tr new file mode 100644 index 000000000..e20b0e524 --- /dev/null +++ b/mods/ITEMS/mcl_compass/locale/mcl_compass.de.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_compass +Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Kompasse sind Werkzeuge, die zum Ursprungspunkt der Welt (X@=0, Z@=0) oder den Einstiegspunkt der Welt zeigen. +Compass=Kompass diff --git a/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.de.tr b/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.de.tr new file mode 100644 index 000000000..5831b881c --- /dev/null +++ b/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.de.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_crafting_table +Crafting Table=Werkbank +A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts.=Die Werkbank ist ein Block, mit dem Sie Zugriff auf ein 3×3-Fertigungsgitter erhalten, wodurch sie fortgeschrittene Dinge herstellen können. +Rightclick the crafting table to access the 3×3 crafting grid.=Rechtsklicken Sie auf die Werkbank, um auf das 3×3-Fertigungsgitter zuzugreifen. diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr new file mode 100644 index 000000000..dfa0a3ab4 --- /dev/null +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_doors +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Holztüren sind 2-Block hohe Barrieren, die von Hand oder mit einem Redstone-Signal geöffnet oder geschlossen werden können. +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Um die Holztür zu öffnen oder zu schließen, rechtsklicken Sie sie oder versorgen Sie sie mit einem Redstone-Signal. +Oak Door=Eichentür +Acacia Door=Akazientür +Birch Door=Birkentür +Dark Oak Door=Dunkeleichentür +Jungle Door=Dschungeltür +Spruce Door=Fichtentür +Iron Door=Eisentür +Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.=Eisentüren sind 2-Block hohe Barrieren, die nur von einem Redstone-Signal geöffnet oder geschlossen werden können. +To open or close an iron door, supply its lower half with a redstone signal.=Um eine Eisentür zu öffnen oder zu schließen, versorgen Sie die untere Hälfte mit einem Redstone-Signal. +Oak Trapdoor=Eichenfalltür +Acacia Trapdoor=Akazienfalltür +Birch Trapdoor=Birkenfalltür +Spruce Trapdoor=Fichtenfalltür +Dark Oak Trapdoor=Dunkeleichenfalltür +Jungle Trapdoor=Dschungelfalltür +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.=Holzfalltüren sind horizontale Barrieren, die von Hand oder mit einem Redstone-Signal geöffnet oder geschlossen werden können. Sie belegen den oberen oder unteren Teil eines Blocks, je nach dem, wie sie platziert wurden. Wenn geöffnet, können sie wie eine Leiter erklommen werden. +To open or close the trapdoor, rightclick it or send a redstone signal to it.=Um die Falltür zu öffnen oder zu schließen, rechtsklicken Sie sie oder schicken Sie ein Redstone-Signal zu ihr. +Iron Trapdoor=Eisenfalltür. +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.=Eisenfalltüren sind horizontale Barrieren, die nur mit einem Redstone-Signal geöffnet oder geschlossen werden können, nicht von Hand. Sie belegen den oberen oder unteren Teil eines Blocks, je nach dem, wie sie platziert wurden. Wenn geöffnet, können sie wie eine Leiter erklommen werden. + diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr new file mode 100644 index 000000000..a846d4e63 --- /dev/null +++ b/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr @@ -0,0 +1,25 @@ +# textdomain: mcl_dye +Bone Meal=Knochenmehl +Light Grey Dye=Hellgrauer Farbstoff +Grey Dye=Grauer Farbstoff +Ink Sac=Tintensack +Purple Dye=Violetter Farbstoff +Lapis Lazuli=Lapislazuli +Light Blue Dye=Hellblauer Farbstoff +Cyan Dye=Türkiser Farbstoff +Cactus Green=Kaktusgrün +Lime Dye=Lindgrüner Farbstoff +Dandelion Yellow=Löwenzahngelb +Cocoa Beans=Kakaobohnen +Orange Dye=Orange Farbstoff +Rose Red=Rosenrot +Magenta Dye=Magenta Farbstoff +Pink Dye=Rosaner Farbstoff +This item is a dye which is used for dyeing and crafting.=Dieser Gegenstand ist ein Farbstoff, der zum Einfärben und in der Herstellung benutzt werden kann. +Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Rechtsklicken Sie auf ein Schaf, um seine Wolle zu färben. Andere Dinge werden mit der Fertigung eingefärbt. +Bone Meal=Knochenmehl +Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=Knochenmehl ist ein weißer Farbstoff und auch nützlich als Dünger, um das Wachstum vieler Pflanzen zu beschleunigen. +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.=Rechtsklicken Sie auf ein Schaf, um die Wolle weiß einzufärben. Rechtsklicken Sie auf eine Pflanze, um ihr Wachstum zu beschleunigen. Beachten Sie, dass nicht alle Pflanzen darauf ansprechen. Benutzen Sie es auf einem Grasblock, wächst viel hohes Gras und vielleicht auch ein paar Blumen. +Cocoa beans are a brown dye and can be used to plant cocoas.=Kakaobohnen sind ein brauner Farbstoff und werden benutzt, um Kakao anzupflanzen. +Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Rechtsklicken Sie auf ein Schaf, um die Wolle braun einzufärben. Rechtsklicken Sie an die Seite eines Dschungelbaumstamms (Dschungelholz), um eine junge Kakaoschote zu pflanzen. +Cocoa Beans=Kakaobohnen diff --git a/mods/ITEMS/mcl_end/locale/mcl_end.de.tr b/mods/ITEMS/mcl_end/locale/mcl_end.de.tr new file mode 100644 index 000000000..7577559ae --- /dev/null +++ b/mods/ITEMS/mcl_end/locale/mcl_end.de.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_end +End Stone=Endstein +End Stone Bricks=Endsteinziegel +Purpur Block=Purpurblock +Purpur Pillar=Purpursäule +End Rod=Endstab +End rods are decorative light sources.=Endstäbe sind dekorative Lichtquellen. +Dragon Egg=Drachenei. +A dragon egg is a decorative item which can be placed.=Ein Drahenei ist ein dekorativer, platzierbarer Gegenstand. +Chorus Flower=Chorusblume +A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow.=Eine Chorusblume ist der lebendige Teil einer Choruspflanze. Sie kann zu einer großen Choruspflanze heranwachsen, Schritt für Schritt. Wenn sie wächst, wird sie irgendwann am Alter absterben. Sie stirbt auch ab, wenn sie nicht weiterwachsen kann. +Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly one chorus plant stem.=Platzieren Sie sie und warten Sie darauf, dass sie wächst. Sie kann nur auf Endstein, auf einen anderen Choruspflanzenstängel oder an der Seite von genau einem Choruspflanzenstängel platziert werden. +Dead Chorus Flower=Tote Chorusblume +This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again.=Dies ist ein Teil einer Choruspflanze. Er wächst nicht. Choruspflanzen werden mit der Zeit alt und sterben ab, sie sterben auch ab, wenn sie nicht weiterwachsen können. Eine tote Chorusblume kann geerntet werden, um eine frische neue Choruspflanze zu erhalten, die wieder wachsen kann. +Chorus Plant Stem=Choruspflanzenstängel +A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers.=Ein Choruspflanzenstängel ist der Teil einer Choruspflanze, der die gesamte Pflanze zusammenhält. Sie braucht Endstein als Unterground. Stängel wachsen aus Chorusblumen. +Chorus Fruit=Chorusfrucht +A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to.=Eine Chorusfrucht ist eine essbare Frucht von der Choruspflanze, die im Ende beheimatet ist. Wenn man sie isst, wird man auf einen zufälligen festen Block in der Nähe teleportiert, solange man nicht in eine Flüssigkeit, einen festen oder gefährlichen Block landen würde. Die Teleportation könnte fehlschlagen, wenn es sehr wenige oder keine Orte gibt, zu denen sie einen hinteleportieren könnte. +Popped Chorus Fruit=Aufgeploppte Chorusfrucht +Eye of Ender=Enderauge +This item is used to locate End portal shrines in the Overworld and to activate End portals.=Dieser Gegenstand wird benutzt, um Endportalschreine in der Oberwelt zu finden und Endportale zu aktivieren. +Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.=Benutzen Sie die Angriffstaste, um das Enderauge loszulassen. Er wird aufsteigen und in einer horizontalen Richtung zum nächsten Endportalschrein fliegen. Wenn Sie sehr nah dran sind, wird das Enderauge stattdessen den direkten Weg zum Endportalschrein nehmen. Nach ein paar Sekunden hält er an. Es könnte als Gegenstand wieder herunterfalle, aber er wird mit einer 20%-Chance zerbrechen. +To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.=Um ein Endportal zu aktivieren, müssen Enderaugen in jeden Block eines intakten Endportalrahmens platziert werden. From 1740ccc2b275237e6a52d8e4ae5c439113d99883 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 07:25:14 +0100 Subject: [PATCH 176/379] Fix translation file error in mcl_chests --- mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr b/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr index 06bc376de..63f8dd4c1 100644 --- a/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr +++ b/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr @@ -3,8 +3,7 @@ Chest=Truhe Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.=Truhen sind Behälter, die 27 Inventarplätze Platz bieten. Truhen verwandeln sich in große Truhen mit der doppelten Kapazität, wenn zwei Truhen nebeneinander platziert werden. To access its inventory, rightclick it. When broken, the items will drop out.=Um auf das Inventar zuzugreifen, rechtsklicken Sie darauf. Wenn abgebaut, wird der Inhalt hinausfallen. Trapped Chest=Mechanismustruhe -A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.= -Mechanismustruhen sind Behälter, die 27 Inventarplätze Platz bieten. Wenn sie geöffnet wird, sendet sie ein Redstone-Signal zu benachbarten Blöcken, solange sie geöffnet bleibt. Mechanismustruhen verwandeln sich in große Mechanismustruhen mit der doppelten Kapazität, wenn zwei Mechanismustruhen nebeneinander platziert werden. +A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.=Mechanismustruhen sind Behälter, die 27 Inventarplätze Platz bieten. Wenn sie geöffnet wird, sendet sie ein Redstone-Signal zu benachbarten Blöcken, solange sie geöffnet bleibt. Mechanismustruhen verwandeln sich in große Mechanismustruhen mit der doppelten Kapazität, wenn zwei Mechanismustruhen nebeneinander platziert werden. Ender Chest=Endertruhe Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.=Endertruhen gewähren Ihnen Zugriff zu einem einzigartigen persönlichem interdimensionalem Inventar mit 27 Plätzen. Dieses Inventar ist das gleiche, egal, welche Endertruhe sie benutzen. Wenn Sie einen Gegenstand in eine Endertruhe platzieren, werden Sie sie in allen anderen Endertruhen vorhinden. Jeder Spieler wird nur seine eigenen Gegenstände sehen, aber nicht die der anderen Spieler. Rightclick the ender chest to access your personal interdimensional inventory.=Rechtsklicken Sie die Endertruhe, um auf Ihr persönliches interdimensionales Inventar zuzugreifen. From 28c0c9d1963765174ddf465abf174c5a4f9f394f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 08:13:54 +0100 Subject: [PATCH 177/379] Workaround for concrete powder hardening ABM crash --- mods/ITEMS/mcl_colorblocks/init.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_colorblocks/init.lua b/mods/ITEMS/mcl_colorblocks/init.lua index 18faee845..8a3f971d6 100644 --- a/mods/ITEMS/mcl_colorblocks/init.lua +++ b/mods/ITEMS/mcl_colorblocks/init.lua @@ -169,7 +169,12 @@ minetest.register_abm({ neighbors = {"group:water"}, action = function(pos, node) local harden_to = minetest.registered_nodes[node.name]._mcl_colorblocks_harden_to - minetest.swap_node(pos, { name = harden_to, param = node.param, param2 = node.param2 }) + -- It should be impossible for harden_to to be nil, but a Minetest bug might call + -- the ABM on the new concrete node, which isn't part of this ABM! + if harden_to then + node.name = harden_to + minetest.set_node(pos, node) + end end, }) From 41842c73c6a0a02ecb5135cf583195349367a9dd Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 08:33:28 +0100 Subject: [PATCH 178/379] Fix translations in mcl_death_messages not working --- mods/HUD/mcl_death_messages/init.lua | 119 +++++++++--------- .../locale/mcl_death_messages.de.tr | 104 +++++++-------- .../mcl_death_messages/locale/template.txt | 104 +++++++-------- 3 files changed, 164 insertions(+), 163 deletions(-) diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index f0f6285ce..90943ecbf 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -1,100 +1,101 @@ local S = minetest.get_translator("mcl_death_messages") +local N = function(s) return s end mcl_death_messages = {} -- Death messages local msgs = { ["arrow"] = { - S("%s was fatally hit by an arrow."), - S("%s has been killed with an arrow."), + N("@1 was fatally hit by an arrow."), + N("@1 has been killed with an arrow."), }, ["arrow_name"] = { - S("%s was shot by an arrow from %s."), + N("@1 was shot by an arrow from %s."), }, ["drown"] = { - S("%s forgot to breathe."), - S("%s drowned."), - S("%s ran out of oxygen."), + N("@1 forgot to breathe."), + N("@1 drowned."), + N("@1 ran out of oxygen."), }, ["murder"] = { - S("%s was killed by %s."), + N("@1 was killed by %s."), }, ["mob_kill"] = { - S("%s was killed by a mob."), + N("@1 was killed by a mob."), }, ["blaze_fireball"] = { - S("%s was burned to death by a blaze's fireball."), - S("%s was killed by a fireball from a blaze."), + N("@1 was burned to death by a blaze's fireball."), + N("@1 was killed by a fireball from a blaze."), }, ["fire_charge"] = { - S("%s was burned by a fire charge."), + N("@1 was burned by a fire charge."), }, ["ghast_fireball"] = { - S("A ghast scared %s to death."), - S("%s has been fireballed by a ghast."), + N("A ghast scared @1 to death."), + N("@1 has been fireballed by a ghast."), }, ["fall"] = { - S("%s fell from a high cliff."), - S("%s took fatal fall damage."), - S("%s fell victim to gravity."), + N("@1 fell from a high cliff."), + N("@1 took fatal fall damage."), + N("@1 fell victim to gravity."), }, ["other"] = { - S("%s died."), + N("@1 died."), } } local mobkills = { - ["mobs_mc:zombie"] = S("%s was killed by a zombie."), - ["mobs_mc:baby_zombie"] = S("%s was killed by a baby zombie."), - ["mobs_mc:blaze"] = S("%s was killed by a blaze."), - ["mobs_mc:slime"] = S("%s was killed by a slime."), - ["mobs_mc:witch"] = S("%s was killed by a witch."), - ["mobs_mc:magma_cube_tiny"] = S("%s was killed by a magma cube."), - ["mobs_mc:magma_cube_small"] = S("%s was killed by a magma cube."), - ["mobs_mc:magma_cube_big"] = S("%s was killed by a magma cube."), - ["mobs_mc:wolf"] = S("%s was killed by a wolf."), - ["mobs_mc:cat"] = S("%s was killed by a cat."), - ["mobs_mc:ocelot"] = S("%s was killed by an ocelot."), - ["mobs_mc:ender_dragon"] = S("%s was killed by an ender dragon."), - ["mobs_mc:wither"] = S("%s was killed by a wither."), - ["mobs_mc:enderman"] = S("%s was killed by an enderman."), - ["mobs_mc:endermite"] = S("%s was killed by an endermite."), - ["mobs_mc:ghast"] = S("%s was killed by a ghast."), - ["mobs_mc:guardian_elder"] = S("%s was killed by an elder guardian."), - ["mobs_mc:guardian"] = S("%s was killed by a guardian."), - ["mobs_mc:iron_golem"] = S("%s was killed by an iron golem."), - ["mobs_mc:polar_bear"] = S("%s was killed by a polar_bear."), - ["mobs_mc:killer_bunny"] = S("%s was killed by a killer bunny."), - ["mobs_mc:shulker"] = S("%s was killed by a shulker."), - ["mobs_mc:silverfish"] = S("%s was killed by a silverfish."), - ["mobs_mc:skeleton"] = S("%s was killed by a skeleton."), - ["mobs_mc:stray"] = S("%s was killed by a stray."), - ["mobs_mc:slime_tiny"] = S("%s was killed by a slime."), - ["mobs_mc:slime_small"] = S("%s was killed by a slime."), - ["mobs_mc:slime_big"] = S("%s was killed by a slime."), - ["mobs_mc:spider"] = S("%s was killed by a spider."), - ["mobs_mc:cave_spider"] = S("%s was killed by a cave spider."), - ["mobs_mc:vex"] = S("%s was killed by a vex."), - ["mobs_mc:evoker"] = S("%s was killed by an evoker."), - ["mobs_mc:illusioner"] = S("%s was killed by an illusioner."), - ["mobs_mc:vindicator"] = S("%s was killed by a vindicator."), - ["mobs_mc:villager_zombie"] = S("%s was killed by a zombie villager."), - ["mobs_mc:husk"] = S("%s was killed by a husk."), - ["mobs_mc:baby_husk"] = S("%s was killed by a baby husk."), - ["mobs_mc:pigman"] = S("%s was killed by a zombie pigman."), - ["mobs_mc:baby_pigman"] = S("%s was killed by a baby zombie pigman."), + ["mobs_mc:zombie"] = N("@1 was killed by a zombie."), + ["mobs_mc:baby_zombie"] = N("@1 was killed by a baby zombie."), + ["mobs_mc:blaze"] = N("@1 was killed by a blaze."), + ["mobs_mc:slime"] = N("@1 was killed by a slime."), + ["mobs_mc:witch"] = N("@1 was killed by a witch."), + ["mobs_mc:magma_cube_tiny"] = N("@1 was killed by a magma cube."), + ["mobs_mc:magma_cube_small"] = N("@1 was killed by a magma cube."), + ["mobs_mc:magma_cube_big"] = N("@1 was killed by a magma cube."), + ["mobs_mc:wolf"] = N("@1 was killed by a wolf."), + ["mobs_mc:cat"] = N("@1 was killed by a cat."), + ["mobs_mc:ocelot"] = N("@1 was killed by an ocelot."), + ["mobs_mc:ender_dragon"] = N("@1 was killed by an ender dragon."), + ["mobs_mc:wither"] = N("@1 was killed by a wither."), + ["mobs_mc:enderman"] = N("@1 was killed by an enderman."), + ["mobs_mc:endermite"] = N("@1 was killed by an endermite."), + ["mobs_mc:ghast"] = N("@1 was killed by a ghast."), + ["mobs_mc:guardian_elder"] = N("@1 was killed by an elder guardian."), + ["mobs_mc:guardian"] = N("@1 was killed by a guardian."), + ["mobs_mc:iron_golem"] = N("@1 was killed by an iron golem."), + ["mobs_mc:polar_bear"] = N("@1 was killed by a polar_bear."), + ["mobs_mc:killer_bunny"] = N("@1 was killed by a killer bunny."), + ["mobs_mc:shulker"] = N("@1 was killed by a shulker."), + ["mobs_mc:silverfish"] = N("@1 was killed by a silverfish."), + ["mobs_mc:skeleton"] = N("@1 was killed by a skeleton."), + ["mobs_mc:stray"] = N("@1 was killed by a stray."), + ["mobs_mc:slime_tiny"] = N("@1 was killed by a slime."), + ["mobs_mc:slime_small"] = N("@1 was killed by a slime."), + ["mobs_mc:slime_big"] = N("@1 was killed by a slime."), + ["mobs_mc:spider"] = N("@1 was killed by a spider."), + ["mobs_mc:cave_spider"] = N("@1 was killed by a cave spider."), + ["mobs_mc:vex"] = N("@1 was killed by a vex."), + ["mobs_mc:evoker"] = N("@1 was killed by an evoker."), + ["mobs_mc:illusioner"] = N("@1 was killed by an illusioner."), + ["mobs_mc:vindicator"] = N("@1 was killed by a vindicator."), + ["mobs_mc:villager_zombie"] = N("@1 was killed by a zombie villager."), + ["mobs_mc:husk"] = N("@1 was killed by a husk."), + ["mobs_mc:baby_husk"] = N("@1 was killed by a baby husk."), + ["mobs_mc:pigman"] = N("@1 was killed by a zombie pigman."), + ["mobs_mc:baby_pigman"] = N("@1 was killed by a baby zombie pigman."), } -- Select death message local dmsg = function(mtype, ...) local r = math.random(1, #msgs[mtype]) - return string.format(msgs[mtype][r], ...) + return S(msgs[mtype][r], ...) end -- Select death message for death by mob local mmsg = function(mtype, ...) if mobkills[mtype] then - return string.format(mobkills[mtype], ...) + return S(mobkills[mtype], ...) else return dmsg("mob_kill", ...) end @@ -139,7 +140,7 @@ minetest.register_on_dieplayer(function(player, reason) else field_msg = field end - msg = string.format(field_msg, name) + msg = S(field_msg, name) end elseif reason.type == "drown" then msg = dmsg("drown", name) diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr index 4a65a08cd..11b0eb3da 100644 --- a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr @@ -1,53 +1,53 @@ # textdomain: mcl_death_messages -%s was fatally hit by an arrow.=%s wurde tödlich von einem Pfeil getroffen. -%s has been killed with an arrow.=%s wurde mit einem Pfeil getötet. -%s was shot by an arrow from %s.=%s wurde mit einem Pfeil von %s abgeschossen. -%s forgot to breathe.=%s vergaß, zu atmen. -%s drowned.=%s ertrank. -%s ran out of oxygen.=%s ging die Luft aus. -%s was killed by %s.=%s wurde von %s getötet. -%s was killed by a mob.=%s wurde von einem Mob getötet. -%s was burned to death by a blaze's fireball.=%s wurde von einem Feuerball einer Lohe zu Tode verbrannt. -%s was killed by a fireball from a blaze.=%s wurde von einem Feuerball einer Lohe getötet. -%s was burned by a fire charge.=%s wurde von einer Feuerkugel verbrannt. -A ghast scared %s to death.=Ein Ghast hat %s zu Tode erschrocken. -%s has been fireballed by a ghast.=%s wurde von einem Ghast mit einer Feuerkugel abgeschossen. -%s fell from a high cliff.=%s stürzte von einer hohen Klippe. -%s took fatal fall damage.=%s nahm tödlichen Fallschaden. -%s fell victim to gravity.=%s fiel der Schwerkraft zum Opfer. -%s died.=%s starb. -%s was killed by a zombie.=%s wurde von einem Zombie getötet. -%s was killed by a baby zombie.=%s wurde von einem Zombiebaby getötet. -%s was killed by a blaze.=%s wurde von einer Lohe getötet. -%s was killed by a slime.=%s wurde von einem Schleim getötet. -%s was killed by a witch.=%s wurde von einer Hexe getötet. -%s was killed by a magma cube.=%s wurde von einem Magmakubus getötet. -%s was killed by a wolf.=%s wurde von einem Wolf getötet. -%s was killed by a cat.=%s wurde von einer Katze getötet. -%s was killed by an ocelot.=%s wurde von einem Ozelot getötet. -%s was killed by an ender dragon.=%s wurde von einem Enderdrachen getötet. -%s was killed by a wither.=%s wurde von einem Wither getötet. -%s was killed by an enderman.=%s wurde von einem Enderman getötet. -%s was killed by an endermite.=%s wurde von einer Endermilbe getötet. -%s was killed by a ghast.=%s wurde von einem Ghast getötet. -%s was killed by an elder guardian.=%s wurde von einem Großen Wächter getötet. -%s was killed by a guardian.=%s wurde von einem Wächter getötet. -%s was killed by an iron golem.=%s wurde von einem Eisengolem getötet. -%s was killed by a polar_bear.=%s wurde von einem Eisbären getötet. -%s was killed by a killer bunny.=%s wurde von einem Killerkaninchen getötet. -%s was killed by a shulker.=%s wurde von einem Shulker getötet. -%s was killed by a silverfish.=%s wurde von einem Silberfischchen getötet. -%s was killed by a skeleton.=%s wurde von einem Skelett getötet. -%s was killed by a stray.=%s wurde von einem Eiswanderer getötet. -%s was killed by a slime.=%s wurde von einem Schleim getötet. -%s was killed by a spider.=%s wurde von einer Spinne getötet. -%s was killed by a cave spider.=%s wurde von einer Höhlenspinne getötet. -%s was killed by a vex.=%s wurde von einem Plagegeist getötet. -%s was killed by an evoker.=%s wurde von einem Magier getötet. -%s was killed by an illusioner.=%s wurde von einem Illusionisten getötet. -%s was killed by a vindicator.=%s wurde von einem Diener getötet. -%s was killed by a zombie villager.=%s wurde von einem Dorfbewohnerzombie getötet. -%s was killed by a husk.=%s wurde von einem Wüstenzombie getötet. -%s was killed by a baby husk.=%s wurde von einem Wüstenzombiebaby getötet. -%s was killed by a zombie pigman.=%s wurde von einem Schweinezombie getötet. -%s was killed by a baby zombie pigman.=%s wurde von einem Schweinezombiebaby getötet. +@1 was fatally hit by an arrow.=@1 wurde tödlich von einem Pfeil getroffen. +@1 has been killed with an arrow.=@1 wurde mit einem Pfeil getötet. +@1 was shot by an arrow from @1.=@1 wurde mit einem Pfeil von @1 abgeschossen. +@1 forgot to breathe.=@1 vergaß, zu atmen. +@1 drowned.=@1 ertrank. +@1 ran out of oxygen.=@1 ging die Luft aus. +@1 was killed by @1.=@1 wurde von @1 getötet. +@1 was killed by a mob.=@1 wurde von einem Mob getötet. +@1 was burned to death by a blaze's fireball.=@1 wurde von einem Feuerball einer Lohe zu Tode verbrannt. +@1 was killed by a fireball from a blaze.=@1 wurde von einem Feuerball einer Lohe getötet. +@1 was burned by a fire charge.=@1 wurde von einer Feuerkugel verbrannt. +A ghast scared @1 to death.=Ein Ghast hat @1 zu Tode erschrocken. +@1 has been fireballed by a ghast.=@1 wurde von einem Ghast mit einer Feuerkugel abgeschossen. +@1 fell from a high cliff.=@1 stürzte von einer hohen Klippe. +@1 took fatal fall damage.=@1 nahm tödlichen Fallschaden. +@1 fell victim to gravity.=@1 fiel der Schwerkraft zum Opfer. +@1 died.=@1 starb. +@1 was killed by a zombie.=@1 wurde von einem Zombie getötet. +@1 was killed by a baby zombie.=@1 wurde von einem Zombiebaby getötet. +@1 was killed by a blaze.=@1 wurde von einer Lohe getötet. +@1 was killed by a slime.=@1 wurde von einem Schleim getötet. +@1 was killed by a witch.=@1 wurde von einer Hexe getötet. +@1 was killed by a magma cube.=@1 wurde von einem Magmakubus getötet. +@1 was killed by a wolf.=@1 wurde von einem Wolf getötet. +@1 was killed by a cat.=@1 wurde von einer Katze getötet. +@1 was killed by an ocelot.=@1 wurde von einem Ozelot getötet. +@1 was killed by an ender dragon.=@1 wurde von einem Enderdrachen getötet. +@1 was killed by a wither.=@1 wurde von einem Wither getötet. +@1 was killed by an enderman.=@1 wurde von einem Enderman getötet. +@1 was killed by an endermite.=@1 wurde von einer Endermilbe getötet. +@1 was killed by a ghast.=@1 wurde von einem Ghast getötet. +@1 was killed by an elder guardian.=@1 wurde von einem Großen Wächter getötet. +@1 was killed by a guardian.=@1 wurde von einem Wächter getötet. +@1 was killed by an iron golem.=@1 wurde von einem Eisengolem getötet. +@1 was killed by a polar_bear.=@1 wurde von einem Eisbären getötet. +@1 was killed by a killer bunny.=@1 wurde von einem Killerkaninchen getötet. +@1 was killed by a shulker.=@1 wurde von einem Shulker getötet. +@1 was killed by a silverfish.=@1 wurde von einem Silberfischchen getötet. +@1 was killed by a skeleton.=@1 wurde von einem Skelett getötet. +@1 was killed by a stray.=@1 wurde von einem Eiswanderer getötet. +@1 was killed by a slime.=@1 wurde von einem Schleim getötet. +@1 was killed by a spider.=@1 wurde von einer Spinne getötet. +@1 was killed by a cave spider.=@1 wurde von einer Höhlenspinne getötet. +@1 was killed by a vex.=@1 wurde von einem Plagegeist getötet. +@1 was killed by an evoker.=@1 wurde von einem Magier getötet. +@1 was killed by an illusioner.=@1 wurde von einem Illusionisten getötet. +@1 was killed by a vindicator.=@1 wurde von einem Diener getötet. +@1 was killed by a zombie villager.=@1 wurde von einem Dorfbewohnerzombie getötet. +@1 was killed by a husk.=@1 wurde von einem Wüstenzombie getötet. +@1 was killed by a baby husk.=@1 wurde von einem Wüstenzombiebaby getötet. +@1 was killed by a zombie pigman.=@1 wurde von einem Schweinezombie getötet. +@1 was killed by a baby zombie pigman.=@1 wurde von einem Schweinezombiebaby getötet. diff --git a/mods/HUD/mcl_death_messages/locale/template.txt b/mods/HUD/mcl_death_messages/locale/template.txt index 654b4c66e..ce809b353 100644 --- a/mods/HUD/mcl_death_messages/locale/template.txt +++ b/mods/HUD/mcl_death_messages/locale/template.txt @@ -1,53 +1,53 @@ # textdomain: mcl_death_messages -%s was fatally hit by an arrow.= -%s has been killed with an arrow.= -%s was shot by an arrow from %s.= -%s forgot to breathe.= -%s drowned.= -%s ran out of oxygen.= -%s was killed by %s.= -%s was killed by a mob.= -%s was burned to death by a blaze's fireball.= -%s was killed by a fireball from a blaze.= -%s was burned by a fire charge.= -A ghast scared %s to death.= -%s has been fireballed by a ghast.= -%s fell from a high cliff.= -%s took fatal fall damage.= -%s fell victim to gravity.= -%s died.= -%s was killed by a zombie.= -%s was killed by a baby zombie.= -%s was killed by a blaze.= -%s was killed by a slime.= -%s was killed by a witch.= -%s was killed by a magma cube.= -%s was killed by a wolf.= -%s was killed by a cat.= -%s was killed by an ocelot.= -%s was killed by an ender dragon.= -%s was killed by a wither.= -%s was killed by an enderman.= -%s was killed by an endermite.= -%s was killed by a ghast.= -%s was killed by an elder guardian.= -%s was killed by a guardian.= -%s was killed by an iron golem.= -%s was killed by a polar_bear.= -%s was killed by a killer bunny.= -%s was killed by a shulker.= -%s was killed by a silverfish.= -%s was killed by a skeleton.= -%s was killed by a stray.= -%s was killed by a slime.= -%s was killed by a spider.= -%s was killed by a cave spider.= -%s was killed by a vex.= -%s was killed by an evoker.= -%s was killed by an illusioner.= -%s was killed by a vindicator.= -%s was killed by a zombie villager.= -%s was killed by a husk.= -%s was killed by a baby husk.= -%s was killed by a zombie pigman.= -%s was killed by a baby zombie pigman.= +@1 was fatally hit by an arrow.= +@1 has been killed with an arrow.= +@1 was shot by an arrow from @1.= +@1 forgot to breathe.= +@1 drowned.= +@1 ran out of oxygen.= +@1 was killed by @1.= +@1 was killed by a mob.= +@1 was burned to death by a blaze's fireball.= +@1 was killed by a fireball from a blaze.= +@1 was burned by a fire charge.= +A ghast scared @1 to death.= +@1 has been fireballed by a ghast.= +@1 fell from a high cliff.= +@1 took fatal fall damage.= +@1 fell victim to gravity.= +@1 died.= +@1 was killed by a zombie.= +@1 was killed by a baby zombie.= +@1 was killed by a blaze.= +@1 was killed by a slime.= +@1 was killed by a witch.= +@1 was killed by a magma cube.= +@1 was killed by a wolf.= +@1 was killed by a cat.= +@1 was killed by an ocelot.= +@1 was killed by an ender dragon.= +@1 was killed by a wither.= +@1 was killed by an enderman.= +@1 was killed by an endermite.= +@1 was killed by a ghast.= +@1 was killed by an elder guardian.= +@1 was killed by a guardian.= +@1 was killed by an iron golem.= +@1 was killed by a polar_bear.= +@1 was killed by a killer bunny.= +@1 was killed by a shulker.= +@1 was killed by a silverfish.= +@1 was killed by a skeleton.= +@1 was killed by a stray.= +@1 was killed by a slime.= +@1 was killed by a spider.= +@1 was killed by a cave spider.= +@1 was killed by a vex.= +@1 was killed by an evoker.= +@1 was killed by an illusioner.= +@1 was killed by a vindicator.= +@1 was killed by a zombie villager.= +@1 was killed by a husk.= +@1 was killed by a baby husk.= +@1 was killed by a zombie pigman.= +@1 was killed by a baby zombie pigman.= From 0c8db3e556944222b830d60e9edc61c411c24c4b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 12:08:11 +0100 Subject: [PATCH 179/379] Fix crash in craftguide when player leaves --- mods/HELP/mcl_craftguide/init.lua | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 37087de0c..9fed76422 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -969,16 +969,6 @@ end M.register_on_mods_loaded(get_init_items) -M.register_on_joinplayer(function(player) - local name = player:get_player_name() - init_data(name) -end) - -M.register_on_leaveplayer(function(player) - local name = player:get_player_name() - player_data[name] = nil -end) - -- TODO: Remove sfinv support if sfinv_only then sfinv.register_page("craftguide:craftguide", { @@ -1106,6 +1096,8 @@ if progressive_mode then mcl_craftguide.add_recipe_filter("Default progressive filter", progressive_filter) M.register_on_joinplayer(function(player) + local name = player:get_player_name() + init_data(name) local meta = player:get_meta() local name = player:get_player_name() local data = player_data[name] @@ -1121,7 +1113,11 @@ if progressive_mode then meta:set_string("inv_items", serialize(data.inv_items)) end - M.register_on_leaveplayer(save_meta) + M.register_on_leaveplayer(function(player) + save_meta(player) + local name = player:get_player_name() + player_data[name] = nil + end) M.register_on_shutdown(function() local players = M.get_connected_players() @@ -1130,6 +1126,16 @@ if progressive_mode then save_meta(player) end end) +else + M.register_on_joinplayer(function(player) + local name = player:get_player_name() + init_data(name) + end) + + M.register_on_leaveplayer(function(player) + local name = player:get_player_name() + player_data[name] = nil + end) end function mcl_craftguide.show(name) From daeb04485e6e103fb4e4e39899c8eda0ab417b8c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 14 Mar 2019 23:37:03 +0100 Subject: [PATCH 180/379] Version 0.51.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8345b5f4e..fe71d6d4a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.50.1 +Version: 0.51.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 702755b99e8ba94faaeb2a4743e5563dfbefa058 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Mar 2019 00:10:07 +0100 Subject: [PATCH 181/379] Fix crash in mcl_dye when converting unicolor --- mods/ITEMS/mcl_dye/init.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua index 90e98ac4a..e90f51875 100644 --- a/mods/ITEMS/mcl_dye/init.lua +++ b/mods/ITEMS/mcl_dye/init.lua @@ -93,7 +93,12 @@ end -- Takes an unicolor group name (e.g. “unicolor_white”) and returns a corresponding dye name (if it exists), nil otherwise. mcl_dye.unicolor_to_dye = function(unicolor_group) - return "mcl_dye:" .. dyelocal.unicolor_to_dye_id[unicolor_group] + local color = dyelocal.unicolor_to_dye_id[unicolor_group] + if color then + return "mcl_dye:" .. color + else + return nil + end end -- Define items From a51bcff1b9ffa8bced8a590f1a0dd11752449bb0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Mar 2019 00:26:06 +0100 Subject: [PATCH 182/379] Fix crash if breeding sheep that spawned as child --- mods/ENTITIES/mobs_mc/sheep.lua | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index c734cfe28..bf321bcc7 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -30,6 +30,9 @@ if minetest.get_modpath("mcl_wool") ~= nil then end local sheep_texture = function(color_group) + if not color_group then + color_group = "unicolor_white" + end return { "mobs_mc_sheep_fur.png^[colorize:"..colors[color_group][2], "mobs_mc_sheep.png", @@ -227,6 +230,7 @@ mobs:register_mob("mobs_mc:sheep", { local groups = minetest.registered_items[new_dye].groups for k, v in pairs(groups) do if string.sub(k, 1, 9) == "unicolor_" then + ent_c.color = k ent_c.base_texture = sheep_texture(k) mixed = true break @@ -238,11 +242,12 @@ mobs:register_mob("mobs_mc:sheep", { if not mixed then -- Choose color randomly from one of the parents local p = math.random(1, 2) - if p == 1 then - ent_c.base_texture = sheep_texture(color1) + if p == 1 and color1 then + ent_c.color = color1 else - ent_c.base_texture = sheep_texture(color2) + ent_c.color = color2 end + ent_c.base_texture = sheep_texture(ent_c.color) end child:set_properties({textures = ent_c.base_texture}) ent_c.initial_color_set = true From 62e11868276c9ffbf2119712dd8b7685843bf81b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Mar 2019 00:27:17 +0100 Subject: [PATCH 183/379] Version 0.51.1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fe71d6d4a..037f2b185 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.51.0 +Version: 0.51.1 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 93e34d1d0310ac8e24bef10917b4e57621f9f7f8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Mar 2019 02:05:10 +0100 Subject: [PATCH 184/379] Make mcl_colorblocks translatable --- mods/ITEMS/mcl_colorblocks/init.lua | 62 +++++++++++++++-------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/mods/ITEMS/mcl_colorblocks/init.lua b/mods/ITEMS/mcl_colorblocks/init.lua index 8a3f971d6..a4471fe47 100644 --- a/mods/ITEMS/mcl_colorblocks/init.lua +++ b/mods/ITEMS/mcl_colorblocks/init.lua @@ -1,34 +1,35 @@ local init = os.clock() +local S = minetest.get_translator("mcl_colorblocks") local block = {} block.dyes = { - {"white", "White", "white"}, - {"grey", "Grey", "dark_grey"}, - {"silver", "Light Grey", "grey"}, - {"black", "Black", "black"}, - {"red", "Red", "red"}, - {"yellow", "Yellow", "yellow"}, - {"green", "Green", "dark_green"}, - {"cyan", "Cyan", "cyan"}, - {"blue", "Blue", "blue"}, - {"magenta", "Magenta", "magenta"}, - {"orange", "Orange", "orange"}, - {"purple", "Purple", "violet"}, - {"brown", "Brown", "brown"}, - {"pink", "Pink", "pink"}, - {"lime", "Lime", "green"}, - {"light_blue", "Light Blue", "lightblue"}, + {"white", S("White Terracotta"), S("White Glazed Terracotta"), S("White Concrete Powder"), S("White Concrete"), "white"}, + {"grey", S("Grey Terracotta"), S("Grey Glazed Terracotta"), S("Grey Concrete Powder"), S("Grey Concrete"), "dark_grey"}, + {"silver", S("Light Grey Terracotta"), S("Light Grey Glazed Terracotta"), S("Light Grey Concrete Powder"), S("Light Grey Concrete"), "grey"}, + {"black", S("Black Terracotta"), S("Black Glazed Terracotta"), S("Black Concrete Powder"), S("Black Concrete"), "black"}, + {"red", S("Red Terracotta"), S("Red Glazed Terracotta"), S("Red Concrete Powder"), S("Red Concrete"), "red"}, + {"yellow", S("Yellow Terracotta"), S("Yellow Glazed Terracotta"), S("Yellow Concrete Powder"), S("Yellow Concrete"), "yellow"}, + {"green", S("Green Terracotta"), S("Green Glazed Terracotta"), S("Green Concrete Powder"), S("Green Concrete"), "dark_green"}, + {"cyan", S("Cyan Terracotta"), S("Cyan Glazed Terracotta"), S("Cyan Concrete Powder"), S("Cyan Concrete"), "cyan"}, + {"blue", S("Blue Terracotta"), S("Blue Glazed Terracotta"), S("Blue Concrete Powder"), S("Blue Concrete"), "blue"}, + {"magenta", S("Magenta Terracotta"), S("Magenta Glazed Terracotta"), S("Magenta Concrete Powder"), S("Magenta Concrete"), "magenta"}, + {"orange", S("Orange Terracotta"), S("Orange Glazed Terracotta"), S("Orange Concrete Powder"), S("Orange Concrete"), "orange"}, + {"purple", S("Purple Terracotta"), S("Purple Glazed Terracotta"), S("Purple Concrete Powder"), S("Purple Concrete"), "violet"}, + {"brown", S("Brown Terracotta"), S("Brown Glazed Terracotta"), S("Brown Concrete Powder"), S("Brown Concrete"), "brown"}, + {"pink", S("Pink Terracotta"), S("Pink Glazed Terracotta"), S("Pink Concrete Powder"), S("Pink Concrete"), "pink"}, + {"lime", S("Lime Terracotta"), S("Lime Glazed Terracotta"), S("Lime Concrete Powder"), S("Lime Concrete"), "green"}, + {"light_blue", S("Light Blue Terracotta"), S("Light Blue Glazed Terracotta"), S("Light Blue Concrete Powder"), S("Light Blue Concrete"), "lightblue"}, } -local hc_desc = "Terracotta is a basic building material. It comes in many different colors." -local gt_desc = "Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions." -local cp_desc = "Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water." -local conc_desc = "Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.", +local hc_desc = S("Terracotta is a basic building material. It comes in many different colors.") +local gt_desc = S("Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.") +local cp_desc = S("Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.") +local c_desc = S("Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.") minetest.register_node("mcl_colorblocks:hardened_clay", { - description = "Terracotta", - _doc_items_longdesc = "Terracotta is a basic building material.", + description = S("Terracotta"), + _doc_items_longdesc = S("Terracotta is a basic building material which comes in many different colors. This particular block is uncolored."), tiles = {"hardened_clay.png"}, stack_max = 64, groups = {pickaxey=1, hardened_clay=1,building_block=1, material_stone=1}, @@ -51,11 +52,14 @@ end for _, row in ipairs(block.dyes) do local name = row[1] - local desc = row[2] - local craft_color_group = row[3] + local sdesc_hc = row[2] + local sdesc_gt = row[3] + local sdesc_cp = row[4] + local sdesc_c = row[5] + local craft_color_group = row[6] -- Node Definition minetest.register_node("mcl_colorblocks:hardened_clay_"..name, { - description = desc.." Terracotta", + description = sdesc_hc, _doc_items_longdesc = hc_desc, tiles = {"hardened_clay_stained_"..name..".png"}, groups = {pickaxey=1, hardened_clay=1,building_block=1, material_stone=1}, @@ -66,7 +70,7 @@ for _, row in ipairs(block.dyes) do }) minetest.register_node("mcl_colorblocks:concrete_powder_"..name, { - description = desc.." Concrete Powder", + description = sdesc_cp, _doc_items_longdesc = cp_desc, tiles = {"mcl_colorblocks_concrete_powder_"..name..".png"}, groups = {handy=1,shovely=1, concrete_powder=1,building_block=1,falling_node=1, material_sand=1}, @@ -104,8 +108,8 @@ for _, row in ipairs(block.dyes) do }) minetest.register_node("mcl_colorblocks:concrete_"..name, { - description = desc.." Concrete", - _doc_items_longdesc = conc_desc, + description = sdesc_c, + _doc_items_longdesc = c_desc, tiles = {"mcl_colorblocks_concrete_"..name..".png"}, groups = {handy=1,pickaxey=1, concrete=1,building_block=1, material_stone=1}, stack_max = 64, @@ -118,7 +122,7 @@ for _, row in ipairs(block.dyes) do local tex = "mcl_colorblocks_glazed_terracotta_"..name..".png" local texes = { tex, tex, tex.."^[transformR180", tex, tex.."^[transformR270", tex.."^[transformR90" } minetest.register_node("mcl_colorblocks:glazed_terracotta_"..name, { - description = desc.." Glazed Terracotta", + description = sdesc_gt, _doc_items_longdesc = gt_desc, tiles = texes, groups = {handy=1,pickaxey=1, glazed_terracotta=1,building_block=1, material_stone=1}, From a5fb218afe7848ed2c9b730cdebe26b97bec8ea5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Mar 2019 02:26:59 +0100 Subject: [PATCH 185/379] German translation: mcl_colorblocks --- .../locale/mcl_colorblocks.de.tr | 71 +++++++++++++++++++ .../ITEMS/mcl_colorblocks/locale/template.txt | 71 +++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr create mode 100644 mods/ITEMS/mcl_colorblocks/locale/template.txt diff --git a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr new file mode 100644 index 000000000..1c66d6b5e --- /dev/null +++ b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr @@ -0,0 +1,71 @@ +# textdomain: mcl_colorblocks +White Terracotta=Weiße Terrakotta +White Glazed Terracotta=Weiße glasierte Terrakotta +White Concrete Powder=Weißes Betonpulver +White Concrete=Weißer Beton +Grey Terracotta=Graue Terrakotta +Grey Glazed Terracotta=Graue glasierte Terrakotta +Grey Concrete Powder=Graues Betonpulver +Grey Concrete=Grauer Beton +Light Grey Terracotta=Hellgraue Terrakotta +Light Grey Glazed Terracotta=Hellgraue glasierte Terrakotta +Light Grey Concrete Powder=Hellgraues Betonpulver +Light Grey Concrete=Hellgrauer Beton +Black Terracotta=Schwarze Terrakotta +Black Glazed Terracotta=Schwarze glasierte Terrakotta +Black Concrete Powder=Schwarzes Betonpulver +Black Concrete=Schwarzer Beton +Red Terracotta=Rote Terrakotta +Red Glazed Terracotta=Rote glasierte Terrakotta +Red Concrete Powder=Rotes Betonpulver +Red Concrete=Roter Beton +Yellow Terracotta=Gelbe Terrakotta +Yellow Glazed Terracotta=Gelbe glasierte Terrakotta +Yellow Concrete Powder=Gelbes Betonpulver +Yellow Concrete=Gelber Beton +Green Terracotta=Grüne Terrakotta +Green Glazed Terracotta=Grüne glasierte Terrakotta +Green Concrete Powder=Grünes Betonpulver +Green Concrete=Grüner Beton +Cyan Terracotta=Türkise Terrakotta +Cyan Glazed Terracotta=Türkise glasierte Terrakotta +Cyan Concrete Powder=Türkises Betonpulver +Cyan Concrete=Türkiser Beton +Blue Terracotta=Blaue Terrakotta +Blue Glazed Terracotta=Blaue glasierte Terrakotta +Blue Concrete Powder=Blaues Betonpulver +Blue Concrete=Blauer Beton +Magenta Terracotta=Magenta Terrakotta +Magenta Glazed Terracotta=Magenta glasierte Terrakotta +Magenta Concrete Powder=Magenta Betonpulver +Magenta Concrete=Magenta Beton +Orange Terracotta=Orange Terrakotta +Orange Glazed Terracotta=Orange glasierte Terrakotta +Orange Concrete Powder=Orange Betonpulver +Orange Concrete=Orange Beton +Purple Terracotta=Violette Terrakotta +Purple Glazed Terracotta=Violette glasierte Terrakotta +Purple Concrete Powder=Violettes Betonpulver +Purple Concrete=Violetter Beton +Brown Terracotta=Braune Terrakotta +Brown Glazed Terracotta=Braune glasierte Terrakotta +Brown Concrete Powder=Braunes Betonpulver +Brown Concrete=Brauner Beton +Pink Terracotta=Rosane Terrakotta +Pink Glazed Terracotta=Rosane glasierte Terrakotta +Pink Concrete Powder=Rosanes Betonpulver +Pink Concrete=Rosaner Beton +Lime Terracotta=Lindgrüne Terrakotta +Lime Glazed Terracotta=Lindgrüne glasierte Terrakotta +Lime Concrete Powder=Lindgrünes Betonpulver +Lime Concrete=Lindgrüner Beton +Light Blue Terracotta=Hellbaue Terrakotta +Light Blue Glazed Terracotta=Hellblaue glasierte Terrakotta +Light Blue Concrete Powder=Hellblaues Betonpulver +Light Blue Concrete=Hellblauer Beton +Terracotta is a basic building material. It comes in many different colors.=Terrakotta ist ein Baumaterial. Es gibt es in vielen verschiedenen Farben. +Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.=Glasierte Terrakotta ist ein dekorativer Block mit einem komplexen Muster. Sie kann rotiert werden, indem man sie in verschiedene Richtungen platziert. +Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=Betonpulver wird benutzt, um Beton herzustellen, aber es kann auch selbst als Dekoration benutzt werden. Es kommt in verschiedenen Farben daher. Betonpulver verwandelt sich in Beton der selben Farbe, wenn es mit Wasser in Berührung kommt. +Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.=Beton ist ein dekorativer Block, der in verschiedenen Farben daherkommt. Er hat eine besonders kräftige und klare Farbe. +Terracotta=Terrakotta +Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.=Terrakotta ist ein Baumaterial, welches in vielen verschiedenen Farben vorkommt. Dieser Block ist farblos. diff --git a/mods/ITEMS/mcl_colorblocks/locale/template.txt b/mods/ITEMS/mcl_colorblocks/locale/template.txt new file mode 100644 index 000000000..2736a54bd --- /dev/null +++ b/mods/ITEMS/mcl_colorblocks/locale/template.txt @@ -0,0 +1,71 @@ +# textdomain: mcl_colorblocks +White Terracotta= +White Glazed Terracotta= +White Concrete Powder= +White Concrete= +Grey Terracotta= +Grey Glazed Terracotta= +Grey Concrete Powder= +Grey Concrete= +Light Grey Terracotta= +Light Grey Glazed Terracotta= +Light Grey Concrete Powder= +Light Grey Concrete= +Black Terracotta= +Black Glazed Terracotta= +Black Concrete Powder= +Black Concrete= +Red Terracotta= +Red Glazed Terracotta= +Red Concrete Powder= +Red Concrete= +Yellow Terracotta= +Yellow Glazed Terracotta= +Yellow Concrete Powder= +Yellow Concrete= +Green Terracotta= +Green Glazed Terracotta= +Green Concrete Powder= +Green Concrete= +Cyan Terracotta= +Cyan Glazed Terracotta= +Cyan Concrete Powder= +Cyan Concrete= +Blue Terracotta= +Blue Glazed Terracotta= +Blue Concrete Powder= +Blue Concrete= +Magenta Terracotta= +Magenta Glazed Terracotta= +Magenta Concrete Powder= +Magenta Concrete= +Orange Terracotta= +Orange Glazed Terracotta= +Orange Concrete Powder= +Orange Concrete= +Purple Terracotta= +Purple Glazed Terracotta= +Purple Concrete Powder= +Purple Concrete= +Brown Terracotta= +Brown Glazed Terracotta= +Brown Concrete Powder= +Brown Concrete= +Pink Terracotta= +Pink Glazed Terracotta= +Pink Concrete Powder= +Pink Concrete= +Lime Terracotta= +Lime Glazed Terracotta= +Lime Concrete Powder= +Lime Concrete= +Light Blue Terracotta= +Light Blue Glazed Terracotta= +Light Blue Concrete Powder= +Light Blue Concrete= +Terracotta is a basic building material. It comes in many different colors.= +Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.= +Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.= +Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.= +Terracotta= +Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.= From 53eabf37373a4aa30701881a78182f67f4894076 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Mar 2019 03:41:24 +0100 Subject: [PATCH 186/379] German translation: mcl_farming --- mods/ITEMS/mcl_farming/carrots.lua | 2 +- .../mcl_farming/locale/mcl_farming.de.tr | 91 +++++++++++++++++++ mods/ITEMS/mcl_farming/locale/template.txt | 16 ++-- mods/ITEMS/mcl_farming/melon.lua | 4 +- mods/ITEMS/mcl_farming/potatoes.lua | 2 +- mods/ITEMS/mcl_farming/pumpkin.lua | 4 +- mods/ITEMS/mcl_farming/soil.lua | 2 +- 7 files changed, 105 insertions(+), 16 deletions(-) create mode 100644 mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr diff --git a/mods/ITEMS/mcl_farming/carrots.lua b/mods/ITEMS/mcl_farming/carrots.lua index d8c759ffd..341bbeb07 100644 --- a/mods/ITEMS/mcl_farming/carrots.lua +++ b/mods/ITEMS/mcl_farming/carrots.lua @@ -17,7 +17,7 @@ for i=1, 7 do if i == 1 then create = true name = S("Premature Carrot Plant") - longdesc = S("Carrot plants are plants which grow on farmland under sunlight in 8 stages, of which only 4 are actually visible. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.") + longdesc = S("Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.") else create = false end diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr new file mode 100644 index 000000000..4d05bf80f --- /dev/null +++ b/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr @@ -0,0 +1,91 @@ +# textdomain: mcl_farming +Beetroot Seeds=Rote-Beete-Samen +Grows into a beetroot plant. Chickens like beetroot seeds.=Wachsen zu Rote Beete heran. Hühner mögen Rote-Beete-Samen. +Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.=Platzieren Sie die Rote-Beete-Samen auf Ackerboden (der mit einer Hacke gemacht werden kann), um Rote Beete zu pflanzen. Sie wächst im Sonnenlicht und wächst auf bewässertem Ackerboden schneller. Rechtsklicken Sie auf ein Tier, um es mit Rote-Beete-Samen zu füttern. +Premature Beetroot Plant (Stage 1)=Junge Rote Beete (1. Stufe) +Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Rote Beete ist eine Pflanze, die auf Ackerboden im Sonnenlicht in 4 Stufen wächst. Auf bewässertem Ackerboden wächst sie etwas schneller. Sie kann jederzeit abgeerntet werden, aber wird nur einen Ertrag abwerfen, wenn sie ausgewachsen ist. +Premature Beetroot Plant=Junge Rote Beete +Premature Beetroot Plant (Stage 2)=Junge Rote Beete (2. Stufe) +Premature Beetroot Plant (Stage 3)=Junge Rote Beete (3. Stufe) +Mature Beetroot Plant=Ausgewachsene Rote Beete +A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=Eine ausgewachsene Rote Beete ist eine erntereife Pflanze, die für eine Rote-Beete-Rübe und ein paar Rote-Beete-Samen abgeerntet werden kann. Sie wächst nicht weiter. +Beetroot=Rote-Beete-Rübe +Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.=Rote-Beete-Rüben sind eine Speise und nützlich zur Herstellung von Farbstoffen. Schweine mögen sie auch. +Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=Halten Sie es in der Hand und rechtsklicken Sie, um es zu essen. Rechtsklicken Sie auf ein Tier, um es zu füttern. +Beetroot Soup=Rote-Beete-Suppe +Beetroot soup is a food item.=Rote-Beete-Suppe ist ein Lebensmittel +Premature Carrot Plant=Junge Karottenpflanze +Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Karottenpflanzen sind Pflanzen, die auf Ackerboden im Sonnenlicht in 8 Stufen wachsen, aber es gibt nur 4 sichtbar unterscheidbare Stufen. Auf bewässertem Ackerboden wachsen sie etwas schneller. Sie können jederzeit abgeerntet werden, aber werden nur einen Ertrag abwerfen, wenn sie ausgewachsen sind. +Premature Carrot Plant (Stage @1)=Junge Karottenpflanze (@1. Stufe) +Mature Carrot Plant=Ausgewachsene Karottenpflanze +Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=Ausgewachsene Karottenpflanze können für Karotten abgeerntet werden. Sie werden nicht weiter wachsen. +Carrot=Karotte +Carrots can be eaten and planted. Pigs and rabbits like carrots.=Karotten können gegessen und gepflanzt werden. Schweine und Kaninchen mögen Karotten. +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Halten Sie es in ihrer Hand und rechtsklicken Sie, um es zu essen. Platzieren Sie sie auf Ackerboden, um sie einzupflanzen. Sie wächst im Sonnenlicht und wächst auf bewässertem Ackerboden schneller. Rechtsklicken Sie auf ein Tier, um es zu füttern. +Golden Carrot=Goldene Karotte +A golden carrot is a precious food item which can be eaten. It is really, really filling!=Eine goldene Karotte ist ein kostbares Lebensmittel. Es ist sehr, sehr sättigend! +Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.=Hacken sind unerlässliche Werkzeuge für die Zucht von Feldpflanzen. Sie können benutzt werden, um einen Ackerboden zu machen, auf dem Samen gepflanzt werden können. Hacken können zur Not auch als sehr schwache Waffen benutzt werden. +Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=Benutzen Sie die Hacke auf einen beackerbaren Block (indem Sie ihn rechtsklicken), um ihn zu Ackerboden in verwandeln. Erde, Grasblöcke und Graspfade können beackert werden. Grobe Erde wird zu Erde. +Wood Hoe=Holzhacke +Stone Hoe=Steinhacke +Iron Hoe=Eisenhacke +Golden Hoe=Goldhacke +Diamond Hoe=Diamanthacke +Melon Seeds=Melonensamen +Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=Platzieren Sie die Melonensamen auf Ackerboden (der mit einer Hacke gemacht werden kann), um einen Melonenstängel zu pflanzen. Melonenstängel wachsen im Sonnenlicht und wachen auf bewässertem Ackerboden schneller. Ausgewachsen wird der Melonenstängel versuchen, an der Seite eine Melone wachsen zu lassen. Rechtsklicken Sie auf ein Tier, um es mit Melonensamen zu füttern. +Melon=Melone +Grows into a melon stem which in turn is able to grow melons. Chickens like melon seeds.=Wächst zu einem Melonenstängel heran, aus dem wiederum Melonen wachsen können. Hühner mögen Melonensamen. +A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=Eine Melone ist ein Block, der von Melonenstängeln wächst, der wiederum aus Melonensamen wächst. Er kann für Melonenstücke abgeerntet werden. +Premature Melon Stem=Junger Melonenstängel +Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=Melonenstängel wachsen auf Ackerboden in 8 Stufen. Auf bewässertem Ackerboden ist das Wachstum etwas schneller. Aus ausgewachsenen Melonenstängeln können Melonen wachsen. +Premature Melon Stem (Stage @1)=Junger Melonenstängel (@1. Stufe) +Mature Melon Stem=Ausgewachsener Melonenstängel +A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=Ein ausgewachsener Melonenstängel versucht, auf einem seiner vier benachbarten Blöcke eine Melone wachsen zu lassen. Eine Melone kann nur auf Ackerboden, Erde oder einem Grasblock wachsen. Wenn sich eine Melone neben einem Melonenstängel befindet, verbiegt sich der Melonenstängel und verbindet sich mit der Melone. Solange der Stängel verbunden ist, kann aus ihm keine neue Melone wachsen. Wenn alle Melonen um den Melonenstängel entfernt wurden, verliert er die Verbindung und aus ihm kann eine weitere Melone wachsen. +Melon Slice=Melonenstück +This is a food item which can be eaten.=Ein essbares Lebensmittel. +Premature Potato Plant=Junge Kartoffelpflanze +Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Kartoffelpflanzen sind Pflanzen, die auf Ackerboden im Sonnenlicht in 8 Stufen wachsen, aber es gibt nur 4 sichtbar unterscheidbare Stufen. Auf bewässertem Ackerboden wachsen sie etwas schneller. Sie können jederzeit abgeerntet werden, aber werden nur einen Ertrag abwerfen, wenn sie ausgewachsen sind. +Premature Potato Plant (Stage @1)=Junge Kartoffelpflanze (@1. Stufe) +Mature Potato Plant=Ausgewachsene Kartoffelpflanze +Mature potato plants are ready to be harvested for potatoes. They won't grow any further.=Ausgewachsene Kartoffelpflanzen können für Kartoffeln abgeerntet werden. Sie wachsen nicht weiter. +Potato=Kartoffel +Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=Kartoffeln sind essbare Lebensmittel, können im Ofen gebacken und eingepflanzt werden. Schweine mögen Kartoffeln. +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Halten Sie sie in der Hand und rechtsklicken Sie zum Essen. Platzieren Sie sie auf Ackerboden, um sie zu pflanzen. Sie wächst im Sonnenlicht und wächst auf bewässertem Ackerboden schneller. Rechtsklicken Sie auf ein Tier, um es zu füttern. +Baked Potato=Ofenkartoffel +Baked potatoes are food items which are more filling than the unbaked ones.=Ofenkartoffeln sind Lebensmittel, die etwas nahrhafter als rohe Kartoffeln sind. +Poisonous Potato=Giftige Kartoffel +This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=Diese Kartoffel sieht nicht gerade gesund aus. Sie kann gegessen werden, um Hungerpunkte zu erhalten, aber es gibt eine Chance von 60%, dass das Sie kurz vergiften wird. +Pumpkin Seeds=Kürbissamen +Grows into a pumpkin stem which in turn is able to grow pumpkins. Chickens like pumpkin seeds.=Wächst zu einem Kürbisstängel heran, aus dem wiederum Kürbisse wachsen können. Hühner mögen Kürbissamen. +Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=Platzieren Sie die Kürbissamen auf Ackerboden (der mit einer Hacke gemacht werden kann), um einen Kürbisstängel zu pflanzen. Kürbisstängel wachsen im Sonnenlicht und wachsen auf bewässertem Ackerboden schneller. Ausgewachsen wird der Kürbisstängel versuchen, einen Kürbis an einem benachbartem Feld wachsen zu lassen. Rechtsklicken Sie auf ein Tier, um es mit Kürbissamen zu füttern. +Premature Pumpkin Stem=Junger Kürbisstängel +Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.=Kürbisstängel wachsen auf Ackerboden in 8 Stufen. Auf bewässertem Ackerboden ist das Wachstum etwas schneller. Aus ausgewachsenen Kürbisstängeln können Kürbisse wachsen. +Premature Pumpkin Stem (Stage @1)=Junger Kürbisstängel (@1. Stufe) +Mature Pumpkin Stem=Ausgewachsener Kürbisstängel +A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.=Ein ausgewachsener Kürbisstängel versucht, auf einem seiner vier benachbarten Blöcke einen Kürbis wachsen zu lassen. Ein Kürbis kann nur auf Ackerboden, Erde oder einem Grasblock wachsen. Wenn sich ein Kürbis neben einem Kürbisstängel befindet, verbiegt sich der Kürbisstängel und verbindet sich mit dem Kürbis. Solange der Stängel verbunden ist, kann aus ihm kein neuer Kürbis wachsen. Wenn alle Kürbisse um den Kürbisstängel entfernt wurden, verliert er die Verbindung und aus ihm kann ein weiterer Kürbis wachsen. +Faceless Pumpkin=Gesichtsloser Kürbis +A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=Ein gesichtsloser Kürbis ist ein dekorativer Block. Mit einer Schere kann man in ihm ein Muster schnitzen, um Kürbissamen zu erhalten. +Pumpkin=Kürbis +A pumpkin can be worn as a helmet for fun, but it doesn't offer any protection. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=Einen Kürbis kann zum Spaß als Helm getragen werden, aber er bietet keinen Schutz. Kürbisse wachsen aus Kürbisstängeln, welche wiederum aus Kürbissamen wachsen. +Jack o'Lantern=Halloweenkürbis +A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=Ein Halloweenkürbis ist eine traditionelle Dekoration für Halloween. Er leuchtet hell. +Pumpkin Pie=Kürbiskuchen +A pumpkin pie is a tasty food item which can be eaten.=Ein Kürbiskuchen ist ein leckeres essbares Lebensmittel. +Farmland=Ackerboden +Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Ackerboden wird für den Ackerbau genutzt, ein unerlässlicher Boden zum Anbau von Nutzpflanzen. Er wird erstellt, wenn eine Hacke auf Erde oder einem ähnlichen Block benutzt wird. Pflanzen können auf Ackerboden wachsen, aber nur langsam. Ackerboden wird zu bewässertem Ackerboden (auf dem Pflanzen schneller wachsen), wenn es regnet oder sich eine Wasserquelle in der Nähe befindet. Dieser Block wird sich zurück zu Erde verwandeln, wenn über ihn ein fester Block auftaucht oder sich über ihn ein Kolbenarm ausbreitet. +Hydrated Farmland=Bewässerter Ackerboden +Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Bewässerter Ackerboden wird für den Ackerbau benutzt, auf ihm kann man Nutzpflanzen züchten. Er entsteht, wenn sich Ackerboden unter Regen oder in der Nähe von Wasser befindet. Ohne Wasser wird dieser Block irgendwann austrocknen. Dieser Block verwandelt sich zurück zu Erde, wenn über ihm ein fester Block auftaucht, oder ein Kolbenarm sich über ihn bewegt. +Wheat Seeds=Weizensamen +Grows into a wheat plant. Chickens like wheat seeds.=Wachsen zu einer Weizenpflanze heran +Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=Platzieren Sie die Weizensamen auf Ackerboden (welcher mit einer Hacke gemacht werden kann), um eine Weizenpflanze zu pflanzen. Sie wächst im Sonnenlicht und wächst schneller auf bewässertem Ackerboden. Rechtsklicken Sie auf ein Tier, um es mit Weizensamen zu füttern. +Premature Wheat Plant=Junge Weizenpflanze +Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.=Junge Weizenpflanzen wachsen auf Ackerboden im Sonnenlicht in 8 Stufen. Auf bewässertem Ackerboden wachsen sie schneller. Sie können jederzeit abgeerntet werden, aber werden nur ertragreich sein, wenn sie ausgewachsen sind. +Premature Wheat Plant (Stage @1)=Junge Weizenpflanze (@1. Stufe) +Mature Wheat Plant=Ausgewachsene Weizenpflanze +Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.=Ausgewachsene Weizenpflanzen können für Weizen und Weizensamen abgeerntet werden. Sie wachsen nicht weiter. +Wheat=Weizen +Wheat is used in crafting. Some animals like wheat.=Weizen wird in der Herstellung gebraucht. Einige Tiere mögen Weizen. +Cookie=Keks +Bread=Brot +Hay Bale=Heuballen +Hay bales are decorative blocks made from wheat.=Heuballen sind dekorative Blöcke, die aus Weizen gemacht sind. diff --git a/mods/ITEMS/mcl_farming/locale/template.txt b/mods/ITEMS/mcl_farming/locale/template.txt index 36ac6733f..089fd5069 100644 --- a/mods/ITEMS/mcl_farming/locale/template.txt +++ b/mods/ITEMS/mcl_farming/locale/template.txt @@ -15,7 +15,7 @@ Hold it in your hand and right-click to eat it. Rightclick an animal to feed it. Beetroot Soup= Beetroot soup is a food item.= Premature Carrot Plant= -Carrot plants are plants which grow on farmland under sunlight in 8 stages, of which only 4 are actually visible. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.= +Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.= Premature Carrot Plant (Stage @1)= Mature Carrot Plant= Mature carrot plants are ready to be harvested for carrots. They won't grow any further.= @@ -32,8 +32,8 @@ Iron Hoe= Golden Hoe= Diamond Hoe= Melon Seeds= -Grows into a melon. Chickens like melon seeds.= -Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melons grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it melon seeds.= +Grows into a melon stem which in turn is able to grow melons. Chickens like melon seeds.= +Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.= Melon= A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.= Premature Melon Stem= @@ -44,7 +44,7 @@ A mature melon stem attempts to grow a melon at one of its four adjacent blocks. Melon Slice= This is a food item which can be eaten.= Premature Potato Plant= -Potato plants are plants which grow on farmland under sunlight in 8 stages, of which only 4 are actually visible. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.= +Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.= Premature Potato Plant (Stage @1)= Mature Potato Plant= Mature potato plants are ready to be harvested for potatoes. They won't grow any further.= @@ -56,8 +56,8 @@ Baked potatoes are food items which are more filling than the unbaked ones.= Poisonous Potato= This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.= Pumpkin Seeds= -Grows into a pumpkin. Chickens like pumpkin seeds.= -Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkins grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it pumpkin seeds.= +Grows into a pumpkin stem which in turn is able to grow pumpkins. Chickens like pumpkin seeds.= +Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.= Premature Pumpkin Stem= Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.= Premature Pumpkin Stem (Stage @1)= @@ -74,7 +74,7 @@ A pumpkin pie is a tasty food item which can be eaten.= Farmland= Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.= Hydrated Farmland= -Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmlands is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.= +Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.= Wheat Seeds= Grows into a wheat plant. Chickens like wheat seeds.= Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.= @@ -86,8 +86,6 @@ Mature wheat plants are ready to be harvested for wheat and wheat seeds. They wo Wheat= Wheat is used in crafting. Some animals like wheat.= Cookie= -This is a food item which can be eaten.= Bread= -This is a food item which can be eaten.= Hay Bale= Hay bales are decorative blocks made from wheat.= diff --git a/mods/ITEMS/mcl_farming/melon.lua b/mods/ITEMS/mcl_farming/melon.lua index fab744747..809cc01c1 100644 --- a/mods/ITEMS/mcl_farming/melon.lua +++ b/mods/ITEMS/mcl_farming/melon.lua @@ -3,8 +3,8 @@ local S = minetest.get_translator("mcl_farming") -- Seeds minetest.register_craftitem("mcl_farming:melon_seeds", { description = S("Melon Seeds"), - _doc_items_longdesc = S("Grows into a melon. Chickens like melon seeds."), - _doc_items_usagehelp = S("Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melons grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it melon seeds."), + _doc_items_longdesc = S("Grows into a melon stem which in turn grows melons. Chickens like melon seeds."), + _doc_items_usagehelp = S("Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds."), stack_max = 64, groups = { craftitem=1 }, inventory_image = "mcl_farming_melon_seeds.png", diff --git a/mods/ITEMS/mcl_farming/potatoes.lua b/mods/ITEMS/mcl_farming/potatoes.lua index 7c795b477..0ffbd1fad 100644 --- a/mods/ITEMS/mcl_farming/potatoes.lua +++ b/mods/ITEMS/mcl_farming/potatoes.lua @@ -19,7 +19,7 @@ for i=1, 7 do if i==1 then create = true name = S("Premature Potato Plant") - longdesc = S("Potato plants are plants which grow on farmland under sunlight in 8 stages, of which only 4 are actually visible. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.") + longdesc = S("Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.") else create = false if minetest.get_modpath("doc") then diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua index 128f36149..acab756ff 100644 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ b/mods/ITEMS/mcl_farming/pumpkin.lua @@ -3,8 +3,8 @@ local S = minetest.get_translator("mcl_farming") -- Seeds minetest.register_craftitem("mcl_farming:pumpkin_seeds", { description = S("Pumpkin Seeds"), - _doc_items_longdesc = S("Grows into a pumpkin. Chickens like pumpkin seeds."), - _doc_items_usagehelp = S("Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkins grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it pumpkin seeds."), + _doc_items_longdesc = S("Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds."), + _doc_items_usagehelp = S("Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds."), stack_max = 64, inventory_image = "mcl_farming_pumpkin_seeds.png", groups = { craftitem=1 }, diff --git a/mods/ITEMS/mcl_farming/soil.lua b/mods/ITEMS/mcl_farming/soil.lua index d8e591ec8..012a9659b 100644 --- a/mods/ITEMS/mcl_farming/soil.lua +++ b/mods/ITEMS/mcl_farming/soil.lua @@ -27,7 +27,7 @@ minetest.register_node("mcl_farming:soil", { minetest.register_node("mcl_farming:soil_wet", { tiles = {"mcl_farming_farmland_wet.png", "default_dirt.png"}, description = S("Hydrated Farmland"), - _doc_items_longdesc = S("Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmlands is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it."), + _doc_items_longdesc = S("Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it."), drop = "mcl_core:dirt", drawtype = "nodebox", paramtype = "light", From e7648517750aaaf3d2e8941be797cdd93b44b558 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Mar 2019 03:47:16 +0100 Subject: [PATCH 187/379] =?UTF-8?q?German=20translation:=20Dunkeleiche=20?= =?UTF-8?q?=E2=86=92=20Schwarzeiche?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 16 ++++++++-------- mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr | 4 ++-- mods/ITEMS/mcl_fences/locale/mcl_fences.de.tr | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 mods/ITEMS/mcl_fences/locale/mcl_fences.de.tr diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index 8657503ac..477d64e52 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -75,13 +75,13 @@ Cut Sandstone=Geschliffener Sandstein Cut red sandstone is a decorative building block.=Geschliffener roter Sandstein ist ein dekorativer Block zum Bauen. Cut sandstone is a decorative building block.=Geschliffener Sandstein ist ein dekorativer Block zum Bauen. Cyan Stained Glass=Türkises Glas -Dark Oak Bark=Dunkeleichenrinde -Dark Oak Leaves=Dunkeleichenblätter -Dark Oak Sapling=Dunkeleichensetzling -Dark Oak Wood=Dunkeleichenholz -Dark Oak Wood Planks=Dunkeleichenholzplanken -Dark oak leaves are grown from dark oak trees.=Dunkeleichenblätter wachsen an Dunkeleichen. -Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.=Dunkeleichensetzlinge können zu Dunkeleichen heranwachsen, aber nur in Gruppen. Ein einsamer Dunkeleichensetzling wird nicht wachsen. Eine Gruppe aus vier Dunkeleichensetzlingen werden nach etwas Zeit zu einer Dunkeleiche heranwachen, wenn sie auf einem Erdboden (wie Erde) in einem 2×2-Quadrat platziert wurden und genügend Licht ausgesetzt sind. +Dark Oak Bark=Schwarzeichenrinde +Dark Oak Leaves=Schwarzeichenblätter +Dark Oak Sapling=Schwarzeichensetzling +Dark Oak Wood=Schwarzeichenholz +Dark Oak Wood Planks=Schwarzeichenholzplanken +Dark oak leaves are grown from dark oak trees.=Schwarzeichenblätter wachsen an Schwarzeichen. +Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.=Schwarzeichensetzlinge können zu Schwarzeichen heranwachsen, aber nur in Gruppen. Ein einsamer Schwarzeichensetzling wird nicht wachsen. Eine Gruppe aus vier Schwarzeichensetzlingen werden nach etwas Zeit zu einer Schwarzeiche heranwachen, wenn sie auf einem Erdboden (wie Erde) in einem 2×2-Quadrat platziert wurden und genügend Licht ausgesetzt sind. Dead Bush=Toter Busch Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks.=Tote Büsche sind uninteressante Pflanzen, die oft in trockenen Gebieten vorkommen. Diamond=Diamant @@ -210,7 +210,7 @@ Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.=Zuckerrohr kann nur auf Zuckerrohr platziert werden und auf Blöcken, auf denen Zuckerrohr wachsen würde. Sugar comes from sugar canes and is used to make sweet foods.=Zucker kommt von Zuckerrohr und wird benutzt, um süße Lebensmittel zu machen. The trunk of a birch tree.=Der Baumstamm einer Birke. -The trunk of a dark oak tree.=Der Baumstamm einer Dunkeleiche. +The trunk of a dark oak tree.=Der Baumstamm einer Schwarzeiche. The trunk of a jungle tree.=Der Baumstamm eines Dschungelbaums. The trunk of a spruce tree.=Der Baumstamm einer Fichte. The trunk of an acacia.=Der Baumstamm einer Akazie. diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr index dfa0a3ab4..b46760229 100644 --- a/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr @@ -4,7 +4,7 @@ To open or close a wooden door, rightclick it or supply its lower half with a re Oak Door=Eichentür Acacia Door=Akazientür Birch Door=Birkentür -Dark Oak Door=Dunkeleichentür +Dark Oak Door=Schwarzeichentür Jungle Door=Dschungeltür Spruce Door=Fichtentür Iron Door=Eisentür @@ -14,7 +14,7 @@ Oak Trapdoor=Eichenfalltür Acacia Trapdoor=Akazienfalltür Birch Trapdoor=Birkenfalltür Spruce Trapdoor=Fichtenfalltür -Dark Oak Trapdoor=Dunkeleichenfalltür +Dark Oak Trapdoor=Schwarzeichenfalltür Jungle Trapdoor=Dschungelfalltür 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.=Holzfalltüren sind horizontale Barrieren, die von Hand oder mit einem Redstone-Signal geöffnet oder geschlossen werden können. Sie belegen den oberen oder unteren Teil eines Blocks, je nach dem, wie sie platziert wurden. Wenn geöffnet, können sie wie eine Leiter erklommen werden. To open or close the trapdoor, rightclick it or send a redstone signal to it.=Um die Falltür zu öffnen oder zu schließen, rechtsklicken Sie sie oder schicken Sie ein Redstone-Signal zu ihr. diff --git a/mods/ITEMS/mcl_fences/locale/mcl_fences.de.tr b/mods/ITEMS/mcl_fences/locale/mcl_fences.de.tr new file mode 100644 index 000000000..1b77e8a35 --- /dev/null +++ b/mods/ITEMS/mcl_fences/locale/mcl_fences.de.tr @@ -0,0 +1,16 @@ +# 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.=Zäune sind Gebäude, die den Weg blockieren. Sie verbinden sich gegenseitig und anderen festen Blöcken. Man kann sie nicht mit normalen Sprüngen überspringen. +Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.=Zauntore können geöffnet und geschlossen werden und können nicht übersprungen werden. Zäune werden sich gut mit Zauntoren verbinden. +Right-click the fence gate to open or close it.=Rechtsklicken Sie auf ein Zauntor, um es zu öffnen oder zu schließen. +Oak Fence=Eichenzaun +Oak Fence Gate=Eichenzauntor +Spruce Fence=Fichtenzaun +Spruce Fence Gate=Fichtenzauntor +Birch Fence=Birkenzaun +Birch Fence Gate=Birkenzauntor +Jungle Fence=Dschungelzaun +Jungle Fence Gate=Dschungelzauntor +Dark Oak Fence=Schwarzeichenzaun +Dark Oak Fence Gate=Schwarzeichenzauntor +Acacia Fence=Akazienzaun +Acacia Fence Gate=Akazienzauntor From f5c1e19781c8cb721efb5d7b528a5c8eb6f9dd37 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Mar 2019 04:25:54 +0100 Subject: [PATCH 188/379] Add help for disabled fire and translate --- mods/ITEMS/mcl_fire/init.lua | 43 +++++++++++++++-------- mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr | 16 +++++++++ mods/ITEMS/mcl_fire/locale/template.txt | 3 +- settingtypes.txt | 10 +++--- 4 files changed, 51 insertions(+), 21 deletions(-) create mode 100644 mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index 0ffaf7752..fa0646218 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -10,8 +10,34 @@ local S = minetest.get_translator("mcl_fire") -- Flame nodes -local fire_help = S("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.") -local eternal_fire_help = S("Eternal fire is a damaging and destructive block. 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.") +-- Fire settings + +-- When enabled, fire destroys other blocks. +local fire_enabled = minetest.settings:get_bool("enable_fire") +if fire_enabled == nil then + -- New setting not specified, check for old setting. + -- If old setting is also not specified, 'not nil' is true. + fire_enabled = not minetest.settings:get_bool("disable_fire") +end + +-- Enable sound +local flame_sound = minetest.settings:get_bool("flame_sound") +if flame_sound == nil then + -- Enable if no setting present + flame_sound = true +end + + +-- Help texts +local fire_help +if fire_enabled then + fire_help = S("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.") +else + fire_help = S("Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is flammable block around. Fire does neither spread nor 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.") +end + +local eternal_fire_help = S("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.") + local fire_death_messages = { S("%s has been cooked crisp."), S("%s felt the burn."), @@ -191,12 +217,6 @@ minetest.override_item("mcl_core:lava_source", { -- Sound -- -local flame_sound = minetest.settings:get_bool("flame_sound") -if flame_sound == nil then - -- Enable if no setting present - flame_sound = true -end - if flame_sound then local handles = {} @@ -327,13 +347,6 @@ minetest.register_abm({ -- Enable the following ABMs according to 'enable fire' setting -local fire_enabled = minetest.settings:get_bool("enable_fire") -if fire_enabled == nil then - -- New setting not specified, check for old setting. - -- If old setting is also not specified, 'not nil' is true. - fire_enabled = not minetest.settings:get_bool("disable_fire") -end - if not fire_enabled then -- Remove fire only if fire disabled diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr new file mode 100644 index 000000000..29adafc94 --- /dev/null +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_fire +Fire Charge=Feuerkugel +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.=Feuerkugeln sind hauptsächlich Projektile, die von Werfern geworfen werden können, sie werden in einer geraden Linie fliegen und gehen beim Einschlag in Flammen auf. Alternativ können sie benutzt werden, um direkt ein Feuer zu entfachen. +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.=Legen Sie die Feuerkugel in den Werfer und versorgen Sie ihn mit Redstone-Energie, um sie abzufeuern. Um ein Feuer zu entfachen, platzieren Sie die Feuerkugel auf den Boden, was die Kugel verbraucht. +Flint and Steel=Feuerzeug +Flint and steel is a tool to start fires and ignite blocks.=Ein Feuerzeug ist ein Werkzeug, um Feuer zu entfachen und Blöcke anzuzünden. +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.=Rechtsklicken Sie auf die Oberfläche eines Blocks, um zu versuchen, ein Feuer auf ihm zu entfachen, oder den Block selbst anzuzünden. Ein paar Blocke reagieren besonders, wenn sie angezündet werden. +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.=Feuer ist ein schädlicher und destruktiver aber kurzlebiger Block. Es wird sich zu entzündlichen Blöcken ausbreiten und sie zerstören, aber Feuer wird verschwinden, wenn es nichts brennbares mehr gibt. Es wird von Wasser und Regen gelöscht. Feuer kann sicher mit einem Schlag zerstört werden, aber es tut weh, wenn man direkt in ihm steht. Wird ein Feuer über Netherrack oder einem Magmablock entfacht, wird er sich sofort zu einem ewigen Feuer verwandeln. +Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is flammable block around. Fire does neither spread nor 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.=Feuer ist ein schädlicher aber nicht-destruktiver kurzlebiger Block. Es wird verschwinden, wenn keine entzündlichen Blöcke da sind. Feuer breitet sich nicht aus und zerstört keine Blöcke, zumindest nicht in dieser Welt. Es wird von Wasser und Regen gelöscht. Feuer kann sicher mit einem Schlag zerstört werden, aber es tut weh, wenn man direkt in ihm steht. Wird ein Feuer über Netherrack oder einem Magmablock entfacht, wird er sich sofort zu einem ewigen Feuer verwandeln. +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.=Ewiges Feuer ist ein schädlicher Block, der mehr Feuer machen kann. Er wird um sich Feuer machen, wenn entflammbare Blöcke in der Nähe sind. Ewiges Feuer kann von Schlägen und Wasserblöcken in der Nähe gelöscht werden. Anders als (normales) Feuer geht ein ewiges Fuer nicht von alleine aus, auf nicht unter Regen. Es ist sicher, ein ewiges Feuer zu schlagen, aber es tut weh, wenn man direkt in einem steht. +%s has been cooked crisp.=%s wurde knusprig gebraten. +%s felt the burn.=%s ist völlig verbrannt. +%s died in the flames.=%s starb in den Flammen. +%s died in a fire.=%s starb in einem Feuer. +Fire=Feuer +Eternal Fire=Ewiges Feuer diff --git a/mods/ITEMS/mcl_fire/locale/template.txt b/mods/ITEMS/mcl_fire/locale/template.txt index d691bf22f..bda1a8920 100644 --- a/mods/ITEMS/mcl_fire/locale/template.txt +++ b/mods/ITEMS/mcl_fire/locale/template.txt @@ -6,7 +6,8 @@ Flint and Steel= Flint and steel is a tool to start fires and ignite blocks.= 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.= 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.= -Eternal fire is a damaging and destructive block. 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.= +Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is flammable block around. Fire does neither spread nor 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.= +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.= %s has been cooked crisp.= %s felt the burn.= %s died in the flames.= diff --git a/settingtypes.txt b/settingtypes.txt index ae31f9304..d39f33794 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -11,11 +11,11 @@ # per-player Creative Mode. creative_mode (Creative mode) bool false -# Fire spreads and flammable nodes will be ignited by nearby fire. -# Spreading fire may cause severe destruction. -# Spreading fire blocks will disappear when fire is disabled, but -# eternal fire is unaffected. -enable_fire (Fire) bool true +# Fire spreads and flammable blocks might be destroyed by nearby fire. +# Destructive fire may cause severe destruction. +# Fire blocks will be non-destructive when this setting is disabled, but they +# still deal damage to creatures. Eternal fire is unaffected. +enable_fire (Destructive fire) bool true # If enabled, the weather will change naturally over time. mcl_doWeatherCycle (Change weather) bool true From 86e5eb748f1adc168043a831edfb1f6905d96c0d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Mar 2019 04:36:17 +0100 Subject: [PATCH 189/379] More fire fixes --- mods/ITEMS/mcl_fire/init.lua | 4 ++-- mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr | 2 +- mods/ITEMS/mcl_fire/locale/template.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index fa0646218..73c2e9733 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -33,7 +33,7 @@ local fire_help if fire_enabled then fire_help = S("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.") else - fire_help = S("Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is flammable block around. Fire does neither spread nor 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.") + fire_help = S("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.") end local eternal_fire_help = S("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.") @@ -354,7 +354,7 @@ if not fire_enabled then label = "Remove disabled fire", nodenames = {"mcl_fire:fire"}, interval = 7, - chance = 1, + chance = 3, catch_up = false, action = minetest.remove_node, }) diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr index 29adafc94..1d50cc918 100644 --- a/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr @@ -6,7 +6,7 @@ Flint and Steel=Feuerzeug Flint and steel is a tool to start fires and ignite blocks.=Ein Feuerzeug ist ein Werkzeug, um Feuer zu entfachen und Blöcke anzuzünden. 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.=Rechtsklicken Sie auf die Oberfläche eines Blocks, um zu versuchen, ein Feuer auf ihm zu entfachen, oder den Block selbst anzuzünden. Ein paar Blocke reagieren besonders, wenn sie angezündet werden. 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.=Feuer ist ein schädlicher und destruktiver aber kurzlebiger Block. Es wird sich zu entzündlichen Blöcken ausbreiten und sie zerstören, aber Feuer wird verschwinden, wenn es nichts brennbares mehr gibt. Es wird von Wasser und Regen gelöscht. Feuer kann sicher mit einem Schlag zerstört werden, aber es tut weh, wenn man direkt in ihm steht. Wird ein Feuer über Netherrack oder einem Magmablock entfacht, wird er sich sofort zu einem ewigen Feuer verwandeln. -Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is flammable block around. Fire does neither spread nor 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.=Feuer ist ein schädlicher aber nicht-destruktiver kurzlebiger Block. Es wird verschwinden, wenn keine entzündlichen Blöcke da sind. Feuer breitet sich nicht aus und zerstört keine Blöcke, zumindest nicht in dieser Welt. Es wird von Wasser und Regen gelöscht. Feuer kann sicher mit einem Schlag zerstört werden, aber es tut weh, wenn man direkt in ihm steht. Wird ein Feuer über Netherrack oder einem Magmablock entfacht, wird er sich sofort zu einem ewigen Feuer verwandeln. +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.=Feuer ist ein schädlicher aber nicht-destruktiver kurzlebiger Block. Es wird verschwinden, wenn sich keine entzündlichen Blöcke in der Nähe befinden. Feuer breitet sich nicht aus und zerstört keine Blöcke, zumindest nicht in dieser Welt. Es wird von Wasser und Regen gelöscht. Feuer kann sicher mit einem Schlag zerstört werden, aber es tut weh, wenn man direkt in ihm steht. Wird ein Feuer über Netherrack oder einem Magmablock entfacht, wird er sich sofort zu einem ewigen Feuer verwandeln. 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.=Ewiges Feuer ist ein schädlicher Block, der mehr Feuer machen kann. Er wird um sich Feuer machen, wenn entflammbare Blöcke in der Nähe sind. Ewiges Feuer kann von Schlägen und Wasserblöcken in der Nähe gelöscht werden. Anders als (normales) Feuer geht ein ewiges Fuer nicht von alleine aus, auf nicht unter Regen. Es ist sicher, ein ewiges Feuer zu schlagen, aber es tut weh, wenn man direkt in einem steht. %s has been cooked crisp.=%s wurde knusprig gebraten. %s felt the burn.=%s ist völlig verbrannt. diff --git a/mods/ITEMS/mcl_fire/locale/template.txt b/mods/ITEMS/mcl_fire/locale/template.txt index bda1a8920..b7fdd9963 100644 --- a/mods/ITEMS/mcl_fire/locale/template.txt +++ b/mods/ITEMS/mcl_fire/locale/template.txt @@ -6,7 +6,7 @@ Flint and Steel= Flint and steel is a tool to start fires and ignite blocks.= 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.= 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.= -Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is flammable block around. Fire does neither spread nor 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.= +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.= 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.= %s has been cooked crisp.= %s felt the burn.= From 77ab44217afdecacb05e5f409a38e8f69670d819 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Mar 2019 06:12:03 +0100 Subject: [PATCH 190/379] German transl.: mcl_fishing to mcl_maps + fixes --- .../mcl_banners/locale/mcl_banners.de.tr | 2 +- mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr | 2 +- mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr | 2 +- .../locale/mcl_colorblocks.de.tr | 8 ++--- mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr | 2 +- .../mcl_fishing/locale/mcl_fishing.de.tr | 16 +++++++++ mods/ITEMS/mcl_flowerpots/init.lua | 6 ++-- .../locale/mcl_flowerpots.de.tr | 25 ++++++++++++++ mods/ITEMS/mcl_flowerpots/locale/template.txt | 5 +-- mods/ITEMS/mcl_flowers/init.lua | 4 +-- .../mcl_flowers/locale/mcl_flowers.de.tr | 33 +++++++++++++++++++ mods/ITEMS/mcl_flowers/locale/template.txt | 4 +-- mods/ITEMS/mcl_furnaces/init.lua | 4 ++- .../mcl_furnaces/locale/mcl_furnaces.de.tr | 6 ++++ mods/ITEMS/mcl_furnaces/locale/template.txt | 3 +- mods/ITEMS/mcl_heads/init.lua | 4 +-- mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr | 11 +++++++ mods/ITEMS/mcl_heads/locale/template.txt | 4 +-- mods/ITEMS/mcl_hoppers/init.lua | 14 ++++---- .../mcl_hoppers/locale/mcl_hoppers.de.tr | 12 +++++++ mods/ITEMS/mcl_hoppers/locale/template.txt | 10 ++++-- mods/ITEMS/mcl_itemframes/init.lua | 2 +- .../locale/mcl_itemframes.de.tr | 5 +++ mods/ITEMS/mcl_itemframes/locale/template.txt | 2 +- mods/ITEMS/mcl_jukebox/init.lua | 2 +- .../mcl_jukebox/locale/mcl_jukebox.de.tr | 9 +++++ mods/ITEMS/mcl_jukebox/locale/template.txt | 2 +- mods/ITEMS/mcl_maps/init.lua | 3 +- mods/ITEMS/mcl_maps/locale/mcl_maps.de.tr | 8 +++++ mods/ITEMS/mcl_maps/locale/template.txt | 3 +- 30 files changed, 174 insertions(+), 39 deletions(-) create mode 100644 mods/ITEMS/mcl_fishing/locale/mcl_fishing.de.tr create mode 100644 mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr create mode 100644 mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr create mode 100644 mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.de.tr create mode 100644 mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr create mode 100644 mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.de.tr create mode 100644 mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.de.tr create mode 100644 mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.de.tr create mode 100644 mods/ITEMS/mcl_maps/locale/mcl_maps.de.tr diff --git a/mods/ITEMS/mcl_banners/locale/mcl_banners.de.tr b/mods/ITEMS/mcl_banners/locale/mcl_banners.de.tr index 6e8812c8d..958192ba7 100644 --- a/mods/ITEMS/mcl_banners/locale/mcl_banners.de.tr +++ b/mods/ITEMS/mcl_banners/locale/mcl_banners.de.tr @@ -25,7 +25,7 @@ Purple Banner=Violettes Banner Purple=violett Brown Banner=Braunes Banner Brown=braun -Pink Banner=Rosanes Banner +Pink Banner=Rosa Banner Pink=rosa Lime Banner=Lindgrünes Banner Lime=lindgrün diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr index c496249b4..1404bbf84 100644 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr @@ -17,7 +17,7 @@ Magenta Bed=Magenta Bett Orange Bed=Orange Bett Purple Bed=Violettes Bett Brown Bed=Braunes Bett -Pink Bed=Rosanes Bett +Pink Bed=Rosa Bett Lime Bed=Lindgrünes Bett Light Blue Bed=Hellblaues Bett White Bed=Weißes Bett diff --git a/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr b/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr index 63f8dd4c1..d6f5f4c42 100644 --- a/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr +++ b/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr @@ -19,7 +19,7 @@ Yellow Shulker Box=Gelbe Shulkerkiste Brown Shulker Box=Braune Shulkerkiste Lime Shulker Box=Lindgrüne Shulkerkiste Green Shulker Box=Grüne Shulkerkiste -Pink Shulker Box=Rosane Shulkerkiste +Pink Shulker Box=Rosa Shulkerkiste Red Shulker Box=Rote Shulkerkiste Grey Shulker Box=Graue Shulkerkiste Black Shulker Box=Schwarze Shulkerkiste diff --git a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr index 1c66d6b5e..372bd3462 100644 --- a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr +++ b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr @@ -51,10 +51,10 @@ Brown Terracotta=Braune Terrakotta Brown Glazed Terracotta=Braune glasierte Terrakotta Brown Concrete Powder=Braunes Betonpulver Brown Concrete=Brauner Beton -Pink Terracotta=Rosane Terrakotta -Pink Glazed Terracotta=Rosane glasierte Terrakotta -Pink Concrete Powder=Rosanes Betonpulver -Pink Concrete=Rosaner Beton +Pink Terracotta=Rosa Terrakotta +Pink Glazed Terracotta=Rosa glasierte Terrakotta +Pink Concrete Powder=Rosa Betonpulver +Pink Concrete=Rosa Beton Lime Terracotta=Lindgrüne Terrakotta Lime Glazed Terracotta=Lindgrüne glasierte Terrakotta Lime Concrete Powder=Lindgrünes Betonpulver diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr index a846d4e63..55ec038fd 100644 --- a/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr +++ b/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr @@ -14,7 +14,7 @@ Cocoa Beans=Kakaobohnen Orange Dye=Orange Farbstoff Rose Red=Rosenrot Magenta Dye=Magenta Farbstoff -Pink Dye=Rosaner Farbstoff +Pink Dye=Rosa Farbstoff This item is a dye which is used for dyeing and crafting.=Dieser Gegenstand ist ein Farbstoff, der zum Einfärben und in der Herstellung benutzt werden kann. Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Rechtsklicken Sie auf ein Schaf, um seine Wolle zu färben. Andere Dinge werden mit der Fertigung eingefärbt. Bone Meal=Knochenmehl diff --git a/mods/ITEMS/mcl_fishing/locale/mcl_fishing.de.tr b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.de.tr new file mode 100644 index 000000000..32500e0b7 --- /dev/null +++ b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.de.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_fishing +Fishing Rod=Angel +Fishing rods can be used to catch fish.=Mit Angeln fängt man Fische. +Rightclick a water source to try to go fishing. Who knows what you're going to catch?=Rechtsklicken sie auf eine Wasserquelle, um zu angeln. Wer weiß, was Sie wohl fangen werfen? +Raw Fish=Roher Fisch +Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Rohen Fisch kann man mit Angeln fangen. Er ist ein Lebensmittel, den man sicher verzehren kann. Er kann gekocht werden, um seinen Nährwert zu erhöhen. +Cooked Fish=Gekochter Fisch +Mmh, fish! This is a healthy food item.=Mhh, Fisch! Ein gesundes Lebensmittel. +Raw Salmon=Roher Lachs +Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Lohen Lachs erhält man beim Angeln. Er ist ein Lebensmittel, der sicher verzehrt werden kann. +Cooked Salmon=Gekochter Lachs +This is a healthy food item which can be eaten.=Ein gesundes essbares Lebensmittel. +Clownfish=Clownfisch +Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely.=Einen Clownfisch kann man beim Angeln mit etwas Glück fangen. Er ist ein Lebensmittel, der sicher verzehrt werden kann. +Pufferfish=Kugelfisch +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).=Kugelfische sind eine verbreitete Fischart, die geangelt werden können. Sie können theoretisch gegessen werden, aber sie sind sehr schlecht für Menschen. Es gibt nur 1 Hungerpunkt und es wird Sie schwer vergiften (was Ihre Gesundheit verringert, aber nicht bis zum Tod) und Ihr Hungerpegel wird aufgrund der schweren Lebensmittelvergiftung stark ansteigen. diff --git a/mods/ITEMS/mcl_flowerpots/init.lua b/mods/ITEMS/mcl_flowerpots/init.lua index d0d74da88..3131abd16 100644 --- a/mods/ITEMS/mcl_flowerpots/init.lua +++ b/mods/ITEMS/mcl_flowerpots/init.lua @@ -2,7 +2,7 @@ local S = minetest.get_translator("mcl_flowerpots") local flowers = { {"dandelion", "mcl_flowers:dandelion", S("Dandelion Flower Pot")}, - {"poppy", "mcl_flowers:poppy", S("Poppy Floer Pot")}, + {"poppy", "mcl_flowers:poppy", S("Poppy Flower Pot")}, {"blue_orchid", "mcl_flowers:blue_orchid", S("Blue Orchid Flower Pot")}, {"allium", "mcl_flowers:allium", S("Allium Flower Pot")}, {"azure_bluet", "mcl_flowers:azure_bluet", S("Azure Bluet Flower Pot")}, @@ -24,13 +24,13 @@ local flowers = { } local cubes = { - {"cactus", "mcl_core:cactus", "Cactus Flower Pot"}, + {"cactus", "mcl_core:cactus", S("Cactus Flower Pot")}, } minetest.register_node("mcl_flowerpots:flower_pot", { description = S("Flower Pot"), _doc_items_longdesc = S("Flower pots are decorative blocks in which flowers and other small plants can be placed."), - _doc_items_usagehelp = S("Rightclick an empty flower pot while you wield a plant to place the plant. 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."), + _doc_items_usagehelp = S("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."), drawtype = "mesh", mesh = "flowerpot.obj", tiles = { diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr new file mode 100644 index 000000000..321725abd --- /dev/null +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr @@ -0,0 +1,25 @@ +# textdomain: mcl_flowerpots +Dandelion Flower Pot=Blumentopf mit Löwenzahn +Poppy Floer Pot=Blumentopf mit Mohn +Blue Orchid Flower Pot=Blumentopf mit blauer Orchidee +Allium Flower Pot=Blumentopf mit Sternlauch +Azure Bluet Flower Pot=Blumentopf mit Porzellansternchen +Red Tulip Flower Pot=Blumentopf mit roter Tulpe +Pink Tulip Flower Pot=Blumentopf mit rosa Tulpe +White Tulip Flower Pot=Blumentopf mit weißer Tulpe +Orange Tulip Flower Pot=Blumentopf mit orange Tulpe +Oxeye Daisy Flower Pot=Bluemtopf mit Margerite +Brown Mushroom Flower Pot=Blumentopf mit braunem Pilz +Red Mushroom Flower Pot=Blumentopf mit rotem Pilz +Oak Sapling Flower Pot=Blumentopf mit Eichensetzling +Acacia Sapling Flower Pot=Blumentopf mit Akaziensetzling +Jungle Sapling Flower Pot=Blumentopf mit Dschungelsetzling +Dark Oak Sapling Flower Pot=Blumentopf mit Schwarzeichensetzling +Spruce Sapling Flower Pot=Blumentopf mit Fichtensetzling +Birch Sapling Flower Pot=Blumentopf mit Birkensetzling +Dead Bush Flower Pot=Blumentopf mit totem Busch +Fern Flower Pot=Blumentopf mit Farn +Cactus Flower Pot=Blumentopf mit Kaktus +Flower Pot=Blumentopf +Flower pots are decorative blocks in which flowers and other small plants can be placed.=Blumentöpfe sind dekorative Blöcke, in die Blumen und andere kleine Pflanzen platziert werden können. +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.=Platzieren Sie einfach eine Pflanze auf den Blumentopf. Blumentöpfe können kleine Blumen (nicht höher als 1 Block), Setzlinge, Farne, tote Büsche, Pilze und Kakteen halten. Rechtsklicken Sie auf eine Topfpflanze, um sie zurück zu erhalten. diff --git a/mods/ITEMS/mcl_flowerpots/locale/template.txt b/mods/ITEMS/mcl_flowerpots/locale/template.txt index 75c6b7a2e..c68a07e7d 100644 --- a/mods/ITEMS/mcl_flowerpots/locale/template.txt +++ b/mods/ITEMS/mcl_flowerpots/locale/template.txt @@ -1,6 +1,6 @@ # textdomain: mcl_flowerpots Dandelion Flower Pot= -Poppy Floer Pot= +Poppy Flower Pot= Blue Orchid Flower Pot= Allium Flower Pot= Azure Bluet Flower Pot= @@ -19,6 +19,7 @@ Spruce Sapling Flower Pot= Birch Sapling Flower Pot= Dead Bush Flower Pot= Fern Flower Pot= +Cactus Flower Pot= Flower Pot= Flower pots are decorative blocks in which flowers and other small plants can be placed.= -Rightclick an empty flower pot while you wield a plant to place the plant. 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.= +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.= diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index 8fb8dc800..c2708500f 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -92,7 +92,7 @@ local wheat_seed_drop = { local def_tallgrass = { description = S("Tall Grass"), drawtype = "plantlike", - _doc_items_longdesc = S("Tall grass is a small plant which often occours 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."), + _doc_items_longdesc = S("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."), _doc_items_usagehelp = plant_usage_help, _doc_items_hidden = false, waving = 1, @@ -125,7 +125,7 @@ minetest.register_node("mcl_flowers:tallgrass", def_tallgrass) -- The fern is very similar to tall grass, so we can copy a lot from it. local def_fern = table.copy(def_tallgrass) def_fern.description = S("Fern") -def_fern._doc_items_longdesc = S("Ferns are small plants which occour naturally in grasslands. 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.") +def_fern._doc_items_longdesc = S("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.") def_fern.tiles = { "mcl_flowers_fern.png" } def_fern.inventory_image = "mcl_flowers_fern_inv.png" def_fern.wield_image = "mcl_flowers_fern_inv.png" diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr new file mode 100644 index 000000000..2a4424b8c --- /dev/null +++ b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr @@ -0,0 +1,33 @@ +# textdomain: mcl_flowers +This is a small flower. Small flowers are mainly used for dye production and can also be potted.=Dies ist eine kleine Blume. Kleine Blumen werden hauptsächlich in der Farbenproduktion benutzt, können aber auch in Blumentöpfen platziert werden. +It can only be placed on a block on which it would also survive.=Diese Pflanze kann nur auf einem Block platziert werden, auf dem sie auch überleben würde. +Poppy=Mohn +Dandelion=Löwenzahn +Oxeye Daisy=Margerite +Orange Tulip=Orange Tulpe +Pink Tulip=Rosa Tulpe +Red Tulip=Rote Tulpe +White Tulip=Weiße Tulpe +Allium=Sternlauch +Azure Bluet=Porzellansternchen +Blue Orchid=Blaue Orchidee +Tall Grass=Hohes Gras +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.=Hohes Gras ist eine kleine Pflanze, die oft auf Wiesenflächen wächst. Es kann für Weizensamen abgeerntet werden. Mit Knochenmehl wird sich hohes Gras zu doppelhohem Gras verwandeln. +Fern=Farn +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.= +Farne sind kleine Pflanzen, die oft in Dschungeln und Taigas vorkommen. Sie können für Weizensamen abgeerntet werden. Mit Knochenmehl wird sich ein Farn zu einem großen Farn, der zwei Blöcke hoch ist, verwandeln. +(Top Part)=(Oberseite) +Peony=Pfingstrose +A peony is a large plant which occupies two blocks. It is mainly used in dye protection.=Eine Pfingstrose ist eine große Pflanze, die zwei Blöcke hoch ist. Sie wird hauptsächlich für die Farbenproduktion gebraucht. +Rose Bush=Rosenbusch +A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye protection.=Ein Rosenbusch ist eine große Pflanze, die zwei Blöcke hoch ist. Es ist sicher, durch ihn hindurch zu gehen. Er wird hauptsächlich für die Farbenproduktion gebraucht. +Lilac=Flieder +A lilac is a large plant which occupies two blocks. It is mainly used in dye production.=Ein Flieder ist eine große Pflanze, die zwei Blöcke hoch ist. Er wird hauptsächlich für die Farbenproduktion gebraucht. +Sunflower=Sonnenblume +A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.=Eine Sonnenblume ist eine große Pflanze, die zwei Blöcke hoch ist. Sie wird hauptsächlich für die Farbenproduktion gebraucht. +Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.=Doppelhohes Gras ist eine Variante von hohem Gras und nimmt zwei Blöcke an Platz ein. Er kann für Weizensamen abgeerntet werden. +Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=Ein großer Farn ist eine Variante von Farn und nimmt zwei Blöcke an Platz ein. Er kann für Weizensamen abgeerntet werden. +Double Tallgrass=Doppelhohes Gras +Large Fern=Großer Farn +Lily Pad=Seerosenblatt +A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Ein Seerosenblatt ist eine flache Pflanze, die eine stabile begehbare Oberfläche sind. Sie können auf Wasserquellen, auf Eis und brüchigem Eis platziert werden. diff --git a/mods/ITEMS/mcl_flowers/locale/template.txt b/mods/ITEMS/mcl_flowers/locale/template.txt index f89e74cd3..dcf762796 100644 --- a/mods/ITEMS/mcl_flowers/locale/template.txt +++ b/mods/ITEMS/mcl_flowers/locale/template.txt @@ -12,9 +12,9 @@ Allium= Azure Bluet= Blue Orchid= Tall Grass= -Tall grass is a small plant which often occours 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.= +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.= Fern= -Ferns are small plants which occour naturally in grasslands. 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.= +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.= (Top Part)= Peony= A peony is a large plant which occupies two blocks. It is mainly used in dye protection.= diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index 3e1b9c3b6..d96bdf881 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -292,7 +292,9 @@ end minetest.register_node("mcl_furnaces:furnace", { description = S("Furnace"), _doc_items_longdesc = S("Furnaces cook or smelt several items, using a furnace fuel, into something else."), - _doc_items_usagehelp = S("Right-click the furnace to view it. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side."), + _doc_items_usagehelp = + S("Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.").."\n".. + S("Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn."), _doc_items_hidden = false, tiles = { "default_furnace_top.png", "default_furnace_bottom.png", diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.de.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.de.tr new file mode 100644 index 000000000..34ea30b86 --- /dev/null +++ b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.de.tr @@ -0,0 +1,6 @@ +# textdomain: mcl_furnaces +Furnace=Ofen +Furnaces cook or smelt several items, using a furnace fuel, into something else.=Ofen kochen oder schmelzen diverse Gegenstände, unter Zuhilfenahme eines Brennstoffs, zu etwas anderem. +Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=Benutzen Sie den Ofen, um das Ofenmenü zu öffnen. Platzieren Sie einen Brennstoff in den unteren Platz und das Quellmaterial in den oberen Platz. Der Ofen wird langsam seinen Brennstoff benutzen, um den Gegenstand zu schmelzen. Das Ergebnis landet im Ausgabeplatz rechts. +Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Benutzen Sie das Rezeptbuch, um zu sehen, was Sie schmelzen können und was Sie als Brennstoff benutzen können und wie lange dieser brennt. +Burning Furnace=Aktiver Ofen diff --git a/mods/ITEMS/mcl_furnaces/locale/template.txt b/mods/ITEMS/mcl_furnaces/locale/template.txt index bdea900a7..fee08e5a2 100644 --- a/mods/ITEMS/mcl_furnaces/locale/template.txt +++ b/mods/ITEMS/mcl_furnaces/locale/template.txt @@ -1,5 +1,6 @@ # textdomain: mcl_furnaces Furnace= Furnaces cook or smelt several items, using a furnace fuel, into something else.= -Right-click the furnace to view it. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.= +Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.= +Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.= Burning Furnace= diff --git a/mods/ITEMS/mcl_heads/init.lua b/mods/ITEMS/mcl_heads/init.lua index 90114a0f2..ba3654403 100644 --- a/mods/ITEMS/mcl_heads/init.lua +++ b/mods/ITEMS/mcl_heads/init.lua @@ -54,5 +54,5 @@ addhead("zombie", "mcl_heads_zombie_node.png", S("Zombie Head"), S("A zombie hea addhead("creeper", "mcl_heads_creeper_node.png", S("Creeper Head"), S("A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet for fun, but does not offer any protection.")) -- Original Minecraft name: “Head” addhead("steve", "mcl_heads_steve_node.png", S("Human Head"), S("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.")) -addhead("skeleton", "mcl_heads_skeleton_node.png", S("Skeleton Skull"), S("A skeleton skull is a small decorative block which resembles the head of a skeleton. It can also be worn as a helmet for fun, but does not offer any protection.")) -addhead("wither_skeleton", "mcl_heads_wither_skeleton_node.png", S("Wither Skeleton Skull"), S("A wither skeleton skull is a small decorative block which resembles the head of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.")) +addhead("skeleton", "mcl_heads_skeleton_node.png", S("Skeleton Skull"), S("A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet for fun, but does not offer any protection.")) +addhead("wither_skeleton", "mcl_heads_wither_skeleton_node.png", S("Wither Skeleton Skull"), S("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.")) diff --git a/mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr b/mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr new file mode 100644 index 000000000..2c5491dd3 --- /dev/null +++ b/mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_heads +Zombie Head=Zombiekopf +A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet for fun, but does not offer any protection.=Ein Zombiekopf ist ein kleiner dekorativer Block, der so wie ein Kopf eines Zombies aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. +Creeper Head=Creeper-Kopf +A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet for fun, but does not offer any protection.= +Ein Creeper-Kopf ist ein kleiner dekorativer Block, der so wie ein Kopf eines Creepers aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. +Human Head=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.=Ein Menschenkopf ist ein kleiner dekorativer Block, der so wie der Kopf eines Menschen (das heißt, einer Spielerfigur) aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. +Skeleton Skull=Skelettschädel +A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet for fun, but does not offer any protection.=Ein Skelettschädel ist ein kleiner dekorativer Block, der so wie ein Schädel eines Skeletts aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. +Wither Skeleton Skull=Witherskelettschädel +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.=Ein Witherskelettschädel ist ein kleiner dekorativer Block, der so wie ein Schädel eines Witherskeletts aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. diff --git a/mods/ITEMS/mcl_heads/locale/template.txt b/mods/ITEMS/mcl_heads/locale/template.txt index 213fbf5c6..7ff69df44 100644 --- a/mods/ITEMS/mcl_heads/locale/template.txt +++ b/mods/ITEMS/mcl_heads/locale/template.txt @@ -6,6 +6,6 @@ A creeper head is a small decorative block which resembles the head of a creeper Human Head= 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.= Skeleton Skull= -A skeleton skull is a small decorative block which resembles the head of a skeleton. It can also be worn as a helmet for fun, but does not offer any protection.= +A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet for fun, but does not offer any protection.= Wither Skeleton Skull= -A wither skeleton skull is a small decorative block which resembles the head of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.= +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.= diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index 64588eadd..f46a7884c 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -123,15 +123,15 @@ local def_hopper = { -- Enabled downwards hopper local def_hopper_enabled = table.copy(def_hopper) def_hopper_enabled.description = S("Hopper") -def_hopper_enabled._doc_items_longdesc = S("Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempts 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.").."\n\n".. +def_hopper_enabled._doc_items_longdesc = S("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.").."\n\n".. -S([[Hoppers interact with containers the following way: -• 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 put items into the fuel slot -• Ender chests: Hoppers don't interact with ender chests -• Other containers: Hoppers interact with them normally]]).."\n\n".. +S("Hoppers interact with containers the following way:").."\n".. +S("• 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").."\n".. +S("• Ender chests: No interaction.").."\n".. +S("• Other containers: Normal interaction.").."\n\n".. -S("Hoppers can be disabled by supplying them with redstone power. Disabled hoppers don't move items.") -def_hopper_enabled._doc_items_usagehelp = S("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. Remember you can place at usable blocks (such as chests) with sneak + right-click. The hopper will keep its orientation when the blocks around it are changed. To access the hopper's inventory, rightclick it.") +S("Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.") +def_hopper_enabled._doc_items_usagehelp = S("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.") def_hopper_enabled.on_place = function(itemstack, placer, pointed_thing) local upos = pointed_thing.under local apos = pointed_thing.above diff --git a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.de.tr b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.de.tr new file mode 100644 index 000000000..2a373db54 --- /dev/null +++ b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.de.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_hoppers +Hopper=Trichter +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.=Trichter sind Behälter mit 5 Inventarplätzen. Sie sammeln fallengelassene Gegenstände oberhalb auf, nehmen sich Gegenstände von einem Behälter oberhalb auf und versuchen, ihren Inhalt in einen benachbarten Behälter zu befördern. Trichter können entweder nach unten oder zur Seite zeigen. Trichter interagieren mit Truhen, Spendern, Werfern, Shulkerkisten, Öfen und Trichtern. +Hoppers interact with containers the following way:=Trichter interagieren mit Behältern auf diese Weise: +• 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=• Öfen: Trichter von oberhalb werden Gegenstände in den Quellplatz befördern. Trichter von unterhalb werden Gegenstände aus dem Ausgabeplatz nehmen. Sie werden Gegenstände auch aus dem Brennstoffplatz nehmen, wenn sie als Brennstoff ungeeignet sind. Seitwärtstrichter, die zum Ofen zeigen, befördern Gegenstände in den Brennstoffplatz. +• Ender chests: No interaction.=• Endertruhen: Keine Interaktion. +• Other containers: Normal interaction.=• Andere Behälter: Normale Interaktion. +Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.=Trichter können deaktiviert werden, wenn sie mit Redstone-Energie versorgt werden. Deaktivierte Trichter bewegen keine Gegenstände. +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.=Um einen Trichter vertikal zu platzieren, platzieren Sie ihn auf den Boden oder an die Decke. Um ihn seitwärts zu platzieren, platzieren Sie in an die Seite eines Blocks. Der Trichter wird seine Ausrichtung behalten. Benutzen Sie den Trichter, um auf sein Inventar zuzugreifen. +Disabled Hopper=Deaktivierter Trichter +Side Hopper=Seitwärtstrichter +Disabled Side Hopper=Deaktivierter Seitwärtstrichter diff --git a/mods/ITEMS/mcl_hoppers/locale/template.txt b/mods/ITEMS/mcl_hoppers/locale/template.txt index 080193b6c..8aea09201 100644 --- a/mods/ITEMS/mcl_hoppers/locale/template.txt +++ b/mods/ITEMS/mcl_hoppers/locale/template.txt @@ -1,8 +1,12 @@ # textdomain: mcl_hoppers Hopper= -Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempts 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.= -Hoppers can be disabled by supplying them with redstone power. Disabled hoppers don't move items.= -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. Remember you can place at usable blocks (such as chests) with sneak + right-click. The hopper will keep its orientation when the blocks around it are changed. To access the hopper's inventory, rightclick it.= +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.= +Hoppers interact with containers the following way:= +• 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= +• Ender chests: No interaction.= +• Other containers: Normal interaction.= +Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.= +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.= Disabled Hopper= Side Hopper= Disabled Side Hopper= diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index e4e3f5cb0..e844e95de 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -104,7 +104,7 @@ end minetest.register_node("mcl_itemframes:item_frame",{ description = S("Item Frame"), _doc_items_longdesc = S("Item frames are decorative blocks in which items can be placed."), - _doc_items_usagehelp = S("Hold any item in your hand and right-click the item frame to place the item into the frame. Rightclick the item frame again to retrieve the item."), + _doc_items_usagehelp = S("Just place any item on the item frame. Use the item frame again to retrieve the item."), drawtype = "mesh", is_ground_content = false, mesh = "mcl_itemframes_itemframe1facedir.obj", diff --git a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.de.tr b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.de.tr new file mode 100644 index 000000000..81a3f75bd --- /dev/null +++ b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.de.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_itemframes +Item Frame=Rahmen +Item frames are decorative blocks in which items can be placed.=Rahmen sind dekorative Blöcke, in denen man Gegenstände platzieren kann. +Just place any item on the item frame. Use the item frame again to retrieve the item.=Platzieren Sie einfach einen beliebigen Gegenstand in den Rahmen. Benutzen Sie den Rahmen erneut, um den Gegenstand zurück zu erhalten. + diff --git a/mods/ITEMS/mcl_itemframes/locale/template.txt b/mods/ITEMS/mcl_itemframes/locale/template.txt index 8a3ea6b94..55ff580fe 100644 --- a/mods/ITEMS/mcl_itemframes/locale/template.txt +++ b/mods/ITEMS/mcl_itemframes/locale/template.txt @@ -1,4 +1,4 @@ # textdomain: mcl_itemframes Item Frame= Item frames are decorative blocks in which items can be placed.= -Hold any item in your hand and right-click the item frame to place the item into the frame. Rightclick the item frame again to retrieve the item.= +Just place any item on the item frame. Use the item frame again to retrieve the item.= diff --git a/mods/ITEMS/mcl_jukebox/init.lua b/mods/ITEMS/mcl_jukebox/init.lua index 3b3b918b6..e714c79de 100644 --- a/mods/ITEMS/mcl_jukebox/init.lua +++ b/mods/ITEMS/mcl_jukebox/init.lua @@ -31,7 +31,7 @@ for r=1, records do doc = true entryname = S("Music Disc") longdesc = S("A music disc holds a single music track which can be used in a jukebox to play music.") - usagehelp = S("Rightclick an empty jukebox with the music disc in your hand to play the music. Rightclick the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players.") + usagehelp = S("Place a music dict 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.") end minetest.register_craftitem("mcl_jukebox:record_"..r, { description = diff --git a/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.de.tr b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.de.tr new file mode 100644 index 000000000..9655e5005 --- /dev/null +++ b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.de.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_jukebox +Music Disc=Musikplatte +A music disc holds a single music track which can be used in a jukebox to play music.=Eine Musikplatte enthält eine einzelnes Musikstück, die in einer Musikbox benutzt werden kann, um Musik zu spielen. +Place a music dict 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.=Platzieren Sie eine Musikplatte in eine leere Musikbox, um die Musik abzuspielen. Benutzen Sie die Musikbox erneut, um die Musikplatte zu erhalten. Die Musik kann nur von Ihnen gehört werden, nicht von anderen Spielern. +Music Disc=Musikplatte +@1—@2=@1 – @2 +Jukebox=Musikbox +Jukeboxes play music when they're supplied with a music disc.=Musikboxen spielen Musik, wenn man ihnen eine Musikplatte gibt. +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.=Platzieren Sie eine Musikplatte in eine leere Musikbox, um die Musikplatte einzulegen und Musik zu spielen. Wenn die Musikbox schon eine Musikplatte hat, werden Sie zuerst diese Musikplatte erhalten. Die Musik kann nur von Ihnen gehört werden, aber nicht von anderen Spielern. diff --git a/mods/ITEMS/mcl_jukebox/locale/template.txt b/mods/ITEMS/mcl_jukebox/locale/template.txt index b2ad0d944..b2923e905 100644 --- a/mods/ITEMS/mcl_jukebox/locale/template.txt +++ b/mods/ITEMS/mcl_jukebox/locale/template.txt @@ -1,7 +1,7 @@ # textdomain: mcl_jukebox Music Disc= A music disc holds a single music track which can be used in a jukebox to play music.= -Rightclick an empty jukebox with the music disc in your hand to play the music. Rightclick the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players.= +Place a music dict 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.= Music Disc= @1—@2= Jukebox= diff --git a/mods/ITEMS/mcl_maps/init.lua b/mods/ITEMS/mcl_maps/init.lua index e48ae58a4..ceca739b0 100644 --- a/mods/ITEMS/mcl_maps/init.lua +++ b/mods/ITEMS/mcl_maps/init.lua @@ -35,7 +35,8 @@ minetest.register_craftitem("mcl_maps:empty_map", { minetest.register_craftitem("mcl_maps:filled_map", { description = S("Map"), _doc_items_longdesc = S("Maps show your surroundings as you explore the world."), - _doc_items_usagehelp = S("Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key ([F9] by default).\nIn Creative Mode, you don't need this item; the minimap is always available."), + _doc_items_usagehelp = S("Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key (see controls settings).").."\n".. + S("In Creative Mode, you don't need this item; the minimap is always available."), groups = { tool = 1 }, inventory_image = "mcl_maps_map_filled.png^(mcl_maps_map_filled_markings.png^[colorize:#000000)", stack_max = 1, diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.de.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.de.tr new file mode 100644 index 000000000..3e7071e69 --- /dev/null +++ b/mods/ITEMS/mcl_maps/locale/mcl_maps.de.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_maps +Empty Map=Leere Karte +Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Leere Karten sind als Karten nicht nützlich, aber sie können gestapelt werden und zu benutzbaren Karten umgewandelt werden. +Rightclick to start using the map (which can't be stacked anymore).=Rechtsklick, um zu beginnen, die Karte zu benutzen. Sie kann dann nicht mehr gestapelt werden. +Map=Karte +Maps show your surroundings as you explore the world.=Karten zeigen Ihre Umgebung, während Sie die Welt erkunden. +Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key (see controls settings).=Halten Sie die Karte in einen beliebigen Platz in der Schnellleiste. Damit können Sie jetzt die Übersichtskarte aktivieren, indem Sie die Taste zum Umschalten der Karte drücken (siehe Tastenbelegung). +In Creative Mode, you don't need this item; the minimap is always available.=Im Kreativmodus brauchen Sie diesen Gegenstand nicht; die Übersichtskarte ist immer verfügbar. diff --git a/mods/ITEMS/mcl_maps/locale/template.txt b/mods/ITEMS/mcl_maps/locale/template.txt index 8fb561e86..1db127f43 100644 --- a/mods/ITEMS/mcl_maps/locale/template.txt +++ b/mods/ITEMS/mcl_maps/locale/template.txt @@ -4,4 +4,5 @@ Empty maps are not useful as maps, but they can be stacked and turned to maps wh Rightclick to start using the map (which can't be stacked anymore).= Map= Maps show your surroundings as you explore the world.= -Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key ([F9] by default).@nIn Creative Mode, you don't need this item; the minimap is always available.= +Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key (see controls settings).= +In Creative Mode, you don't need this item; the minimap is always available.= From 81ca79e85c095494662ff01d30ff43d34dedb479 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Mar 2019 06:48:12 +0100 Subject: [PATCH 191/379] Open-source command blocks ;-) --- .../REDSTONE/mesecons_commandblock/init.lua | 54 ++++++++++++------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index 0b2cbaac6..dc143167b 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("mesecons_commandblock") +local F = minetest.formspec_escape local function construct(pos) local meta = minetest.get_meta(pos) @@ -128,19 +129,18 @@ local function commandblock_action_off(pos, node) end local on_rightclick = function(pos, node, player, itemstack, pointed_thing) - -- Only allow access in Creative Mode + local can_edit = true + -- Only allow write access in Creative Mode if not minetest.settings:get_bool("creative_mode") then - return + can_edit = false end local pname = player:get_player_name() if minetest.is_protected(pos, pname) then - minetest.record_protection_violation(pos, pname) - return + can_edit = false end local privs = minetest.get_player_privs(pname) if not privs.maphack then - minetest.chat_send_player(pname, "Access denied. You need the “maphack” privilege to edit command blocks.") - return + can_edit = false end local meta = minetest.get_meta(pos) @@ -148,16 +148,31 @@ local on_rightclick = function(pos, node, player, itemstack, pointed_thing) local commander = meta:get_string("commander") local commanderstr if commander == "" or commander == nil then - commanderstr = "Error: No commander! Block must be replaced." + commanderstr = S("Error: No commander! Block must be replaced.") else - commanderstr = "Commander: "..commander + commanderstr = S("Commander: @1", commander) + end + local textrea_name, submit, textarea + -- If editing is not allowed, only allow read-only access. + -- Player can still view the contents of the command block. + if can_edit then + textarea_name = "commands" + submit = "button_exit[3.3,4.5;2,1;submit;"..F(S("Submit")).."]" + else + textarea_name = "" + submit = "" + end + if commands == "" then + textarea = "label[0.5,0.5;"..F(S("No commands.")).."]" + else + textarea = "textarea[0.5,0.5;8.5,4;"..textarea_name..";"..F(S("Commands:"))..";"..F(commands).."]" end local formspec = "invsize[9,5;]" .. - "textarea[0.5,0.5;8.5,4;commands;Commands;"..commands.."]" .. - "button_exit[3.3,4.5;2,1;submit;Submit]" .. + textarea .. + submit .. "image_button[8,4.5;1,1;doc_button_icon_lores.png;doc;]" .. - "label[0,4;"..minetest.formspec_escape(commanderstr).."]" .. - "tooltip[doc;Help]" + "tooltip[doc;"..F(S("Help")).."]" .. + "label[0,4;"..F(commanderstr).."]" minetest.show_formspec(pname, "commandblock_"..pos.x.."_"..pos.y.."_"..pos.z, formspec) end @@ -176,7 +191,7 @@ local on_place = function(itemstack, placer, pointed_thing) local privs = minetest.get_player_privs(placer:get_player_name()) if not privs.maphack then - minetest.chat_send_player(placer:get_player_name(), "Placement denied. You need the “maphack” privilege to place command blocks.") + minetest.chat_send_player(placer:get_player_name(), S("Placement denied. You need the “maphack” privilege to place command blocks.")) return itemstack end @@ -189,9 +204,12 @@ minetest.register_node("mesecons_commandblock:commandblock_off", { _doc_items_longdesc = S("Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power."), _doc_items_usagehelp = -S("To use an already existing command block, just supply it with redstone power and see what happens. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.").."\n\n".. +S("Everyone can activate a command block and look at its commands, but not everyone can edit and place them.").."\n\n".. -S("To place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Rightclick the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how they work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.").."\n\n".. +S("To view the commands in a command block, use it. To activate the command block, just supply it with redstone power. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.").. +"\n\n".. + +S("To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how they work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.").."\n\n".. S("All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.").."\n\n".. @@ -250,7 +268,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end local privs = minetest.get_player_privs(player:get_player_name()) if not privs.maphack then - minetest.chat_send_player(player:get_player_name(), "Access denied. You need the “maphack” privilege to edit command blocks.") + minetest.chat_send_player(player:get_player_name(), S("Access denied. You need the “maphack” privilege to edit command blocks.")) return end @@ -263,7 +281,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local pos = {x=tonumber(x), y=tonumber(y), z=tonumber(z)} local meta = minetest.get_meta(pos) if not minetest.settings:get_bool("creative_mode") then - minetest.chat_send_player(player:get_player_name(), "Editing the command block has failed! You can only change the command block in Creative Mode!") + minetest.chat_send_player(player:get_player_name(), S("Editing the command block has failed! You can only change the command block in Creative Mode!")) return end local check, error_message = check_commands(fields.commands, player:get_player_name()) @@ -275,7 +293,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) meta:set_string("commands", fields.commands) end else - minetest.chat_send_player(player:get_player_name(), "Editing the command block has failed! The command block is gone.") + minetest.chat_send_player(player:get_player_name(), S("Editing the command block has failed! The command block is gone.")) end end end) From 661e10e99298365fa6486efe3e3ac4bbc2f0554b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Mar 2019 07:10:18 +0100 Subject: [PATCH 192/379] Fix crash when dying cuz fire, lava or magmablock --- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 8 ++++---- mods/ITEMS/mcl_core/locale/template.tr | 8 ++++---- mods/ITEMS/mcl_core/nodes_liquid.lua | 9 +++++---- mods/ITEMS/mcl_fire/init.lua | 9 +++++---- mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr | 8 ++++---- mods/ITEMS/mcl_fire/locale/template.txt | 8 ++++---- mods/ITEMS/mcl_nether/init.lua | 2 +- mods/ITEMS/mcl_nether/locale/template.txt | 1 + 8 files changed, 28 insertions(+), 25 deletions(-) diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index 477d64e52..1a49c6704 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -1,8 +1,8 @@ # textdomain: mcl_core -%s could not survive in lava.=%s konnte nicht in Lava überleben. -%s died in lava.=%s starb in Lava. -%s melted in lava.=%s schmolz in der Lava. -%s took a bath in a hot lava tub.=%s nahm ein Bad in einer heißen Lavawanne. +@1 could not survive in lava.=@1 konnte nicht in Lava überleben. +@1 died in lava.=@1 starb in Lava. +@1 melted in lava.=@1 schmolz in der Lava. +@1 took a bath in a hot lava tub.=@1 nahm ein Bad in einer heißen Lavawanne. A block of diamond is mostly a shiny decorative block but also useful as a compact storage of diamonds.=Ein Diamantblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Diamanten. A block of emerald is mostly a shiny decorative block but also useful as a compact storage of emeralds.=Ein Smaragdblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Smaragden. A block of gold is mostly a shiny decorative block but also useful as a compact storage of gold ingots.=Ein Goldblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Goldbarren. diff --git a/mods/ITEMS/mcl_core/locale/template.tr b/mods/ITEMS/mcl_core/locale/template.tr index 6bb6474a3..b68ee8a49 100644 --- a/mods/ITEMS/mcl_core/locale/template.tr +++ b/mods/ITEMS/mcl_core/locale/template.tr @@ -1,8 +1,8 @@ # textdomain: mcl_core -%s could not survive in lava.= -%s died in lava.= -%s melted in lava.= -%s took a bath in a hot lava tub.= +@1 could not survive in lava.= +@1 died in lava.= +@1 melted in lava.= +@1 took a bath in a hot lava tub.= A block of diamond is mostly a shiny decorative block but also useful as a compact storage of diamonds.= A block of emerald is mostly a shiny decorative block but also useful as a compact storage of emeralds.= A block of gold is mostly a shiny decorative block but also useful as a compact storage of gold ingots.= diff --git a/mods/ITEMS/mcl_core/nodes_liquid.lua b/mods/ITEMS/mcl_core/nodes_liquid.lua index 2fdcb1ba1..cdcae4b97 100644 --- a/mods/ITEMS/mcl_core/nodes_liquid.lua +++ b/mods/ITEMS/mcl_core/nodes_liquid.lua @@ -1,16 +1,17 @@ -- Liquids: Water and lava local S = minetest.get_translator("mcl_core") +local N = function(s) return s end local WATER_ALPHA = 179 local WATER_VISC = 1 local LAVA_VISC = 7 local lava_death_messages = { - S("%s melted in lava."), - S("%s took a bath in a hot lava tub."), - S("%s died in lava."), - S("%s could not survive in lava."), + N("@1 melted in lava."), + N("@1 took a bath in a hot lava tub."), + N("@1 died in lava."), + N("@1 could not survive in lava."), } minetest.register_node("mcl_core:water_flowing", { diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index 73c2e9733..bbf1e4cdb 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -3,6 +3,7 @@ mcl_fire = {} local S = minetest.get_translator("mcl_fire") +local N = function(s) return s end -- -- Items @@ -39,10 +40,10 @@ end local eternal_fire_help = S("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.") local fire_death_messages = { - S("%s has been cooked crisp."), - S("%s felt the burn."), - S("%s died in the flames."), - S("%s died in a fire."), + N("@1 has been cooked crisp."), + N("@1 felt the burn."), + N("@1 died in the flames."), + N("@1 died in a fire."), } minetest.register_node("mcl_fire:fire", { diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr index 1d50cc918..6185ad46a 100644 --- a/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr @@ -8,9 +8,9 @@ Rightclick the surface of a block to attempt to light a fire in front of it or i 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.=Feuer ist ein schädlicher und destruktiver aber kurzlebiger Block. Es wird sich zu entzündlichen Blöcken ausbreiten und sie zerstören, aber Feuer wird verschwinden, wenn es nichts brennbares mehr gibt. Es wird von Wasser und Regen gelöscht. Feuer kann sicher mit einem Schlag zerstört werden, aber es tut weh, wenn man direkt in ihm steht. Wird ein Feuer über Netherrack oder einem Magmablock entfacht, wird er sich sofort zu einem ewigen Feuer verwandeln. 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.=Feuer ist ein schädlicher aber nicht-destruktiver kurzlebiger Block. Es wird verschwinden, wenn sich keine entzündlichen Blöcke in der Nähe befinden. Feuer breitet sich nicht aus und zerstört keine Blöcke, zumindest nicht in dieser Welt. Es wird von Wasser und Regen gelöscht. Feuer kann sicher mit einem Schlag zerstört werden, aber es tut weh, wenn man direkt in ihm steht. Wird ein Feuer über Netherrack oder einem Magmablock entfacht, wird er sich sofort zu einem ewigen Feuer verwandeln. 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.=Ewiges Feuer ist ein schädlicher Block, der mehr Feuer machen kann. Er wird um sich Feuer machen, wenn entflammbare Blöcke in der Nähe sind. Ewiges Feuer kann von Schlägen und Wasserblöcken in der Nähe gelöscht werden. Anders als (normales) Feuer geht ein ewiges Fuer nicht von alleine aus, auf nicht unter Regen. Es ist sicher, ein ewiges Feuer zu schlagen, aber es tut weh, wenn man direkt in einem steht. -%s has been cooked crisp.=%s wurde knusprig gebraten. -%s felt the burn.=%s ist völlig verbrannt. -%s died in the flames.=%s starb in den Flammen. -%s died in a fire.=%s starb in einem Feuer. +@1 has been cooked crisp.=@1 wurde knusprig gebraten. +@1 felt the burn.=@1 ist völlig verbrannt. +@1 died in the flames.=@1 starb in den Flammen. +@1 died in a fire.=@1 starb in einem Feuer. Fire=Feuer Eternal Fire=Ewiges Feuer diff --git a/mods/ITEMS/mcl_fire/locale/template.txt b/mods/ITEMS/mcl_fire/locale/template.txt index b7fdd9963..035834a37 100644 --- a/mods/ITEMS/mcl_fire/locale/template.txt +++ b/mods/ITEMS/mcl_fire/locale/template.txt @@ -8,9 +8,9 @@ Rightclick the surface of a block to attempt to light a fire in front of it or i 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.= 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.= 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.= -%s has been cooked crisp.= -%s felt the burn.= -%s died in the flames.= -%s died in a fire.= +@1 has been cooked crisp.= +@1 felt the burn.= +@1 died in the flames.= +@1 died in a fire.= Fire= Eternal Fire= diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index d12b5a418..116fe789c 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -94,7 +94,7 @@ minetest.register_node("mcl_nether:magma", { -- Hurt players standing on top of this block if player:get_hp() > 0 then if mod_death_messages then - mcl_death_messages.player_damage(player, string.format("%s stood too long on a magma block.", player:get_player_name())) + mcl_death_messages.player_damage(player, S("@1 stood too long on a magma block.", player:get_player_name())) end player:set_hp(player:get_hp() - 1) end diff --git a/mods/ITEMS/mcl_nether/locale/template.txt b/mods/ITEMS/mcl_nether/locale/template.txt index 215bd5110..de9328474 100644 --- a/mods/ITEMS/mcl_nether/locale/template.txt +++ b/mods/ITEMS/mcl_nether/locale/template.txt @@ -25,3 +25,4 @@ Nether Brick= Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences.= Nether Lava Source= Flowing Nether Lava= +@1 stood too long on a magma block.= From f5cd9e3b98f38817f0a831aa6206cc784aea040c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Mar 2019 07:12:10 +0100 Subject: [PATCH 193/379] Fix malformed translations --- mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr | 3 +-- mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr index 2a4424b8c..58634ad1c 100644 --- a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr +++ b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr @@ -14,8 +14,7 @@ Blue Orchid=Blaue Orchidee Tall Grass=Hohes Gras 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.=Hohes Gras ist eine kleine Pflanze, die oft auf Wiesenflächen wächst. Es kann für Weizensamen abgeerntet werden. Mit Knochenmehl wird sich hohes Gras zu doppelhohem Gras verwandeln. Fern=Farn -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.= -Farne sind kleine Pflanzen, die oft in Dschungeln und Taigas vorkommen. Sie können für Weizensamen abgeerntet werden. Mit Knochenmehl wird sich ein Farn zu einem großen Farn, der zwei Blöcke hoch ist, verwandeln. +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.=Farne sind kleine Pflanzen, die oft in Dschungeln und Taigas vorkommen. Sie können für Weizensamen abgeerntet werden. Mit Knochenmehl wird sich ein Farn zu einem großen Farn, der zwei Blöcke hoch ist, verwandeln. (Top Part)=(Oberseite) Peony=Pfingstrose A peony is a large plant which occupies two blocks. It is mainly used in dye protection.=Eine Pfingstrose ist eine große Pflanze, die zwei Blöcke hoch ist. Sie wird hauptsächlich für die Farbenproduktion gebraucht. diff --git a/mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr b/mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr index 2c5491dd3..0237e1390 100644 --- a/mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr +++ b/mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr @@ -2,8 +2,7 @@ Zombie Head=Zombiekopf A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet for fun, but does not offer any protection.=Ein Zombiekopf ist ein kleiner dekorativer Block, der so wie ein Kopf eines Zombies aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. Creeper Head=Creeper-Kopf -A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet for fun, but does not offer any protection.= -Ein Creeper-Kopf ist ein kleiner dekorativer Block, der so wie ein Kopf eines Creepers aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. +A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet for fun, but does not offer any protection.=Ein Creeper-Kopf ist ein kleiner dekorativer Block, der so wie ein Kopf eines Creepers aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. Human Head=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.=Ein Menschenkopf ist ein kleiner dekorativer Block, der so wie der Kopf eines Menschen (das heißt, einer Spielerfigur) aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. Skeleton Skull=Skelettschädel A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet for fun, but does not offer any protection.=Ein Skelettschädel ist ein kleiner dekorativer Block, der so wie ein Schädel eines Skeletts aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. From 3f85e1c0da464bd67cd872dad33fe3fb29463a68 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Mar 2019 07:23:36 +0100 Subject: [PATCH 194/379] Fix lava/fire/magmablock death message not transl. --- mods/HUD/mcl_death_messages/init.lua | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index 90943ecbf..dc294e8da 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -140,7 +140,15 @@ minetest.register_on_dieplayer(function(player, reason) else field_msg = field end - msg = S(field_msg, name) + local textdomain + if highest_damage_def.mod_origin then + textdomain = highest_damage_def.mod_origin + else + textdomain = "mcl_death_messages" + end + -- We assume the textdomain of the death message in the node definition + -- equals the modname. + msg = minetest.translate(textdomain, field_msg, name) end elseif reason.type == "drown" then msg = dmsg("drown", name) From 1c27cbe4f6fce8e272366ced27be15bc6a6159af Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Mar 2019 09:50:32 +0100 Subject: [PATCH 195/379] German translation: mcl_mobitems to mcl_potions --- .../ENTITIES/mcl_boats/locale/mcl_boats.de.tr | 2 +- mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 11 ++-- mods/ITEMS/mcl_core/locale/template.tr | 1 + mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr | 2 +- mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr | 3 +- mods/ITEMS/mcl_mobitems/init.lua | 2 +- .../mcl_mobitems/locale/mcl_mobitems.de.tr | 60 +++++++++++++++++++ mods/ITEMS/mcl_mobitems/locale/template.txt | 2 +- mods/ITEMS/mcl_mobspawners/init.lua | 2 +- .../locale/mcl_mobspawners.de.tr | 4 ++ .../ITEMS/mcl_mobspawners/locale/template.txt | 2 +- mods/ITEMS/mcl_monster_eggs/init.lua | 2 +- .../locale/mcl_monster_eggs.de.tr | 8 +++ .../mcl_monster_eggs/locale/template.txt | 2 +- .../mcl_mushrooms/locale/mcl_mushrooms.de.tr | 21 +++++++ mods/ITEMS/mcl_mushrooms/locale/template.txt | 2 +- mods/ITEMS/mcl_mushrooms/small.lua | 2 +- mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr | 36 +++++++++++ mods/ITEMS/mcl_nether/locale/template.txt | 10 +++- mods/ITEMS/mcl_nether/nether_wart.lua | 18 +++--- mods/ITEMS/mcl_ocean/locale/mcl_ocean.de.tr | 9 +++ .../mcl_portals/locale/mcl_portals.de.tr | 14 +++++ .../mcl_potions/locale/mcl_potions.de.tr | 20 +++++++ 24 files changed, 211 insertions(+), 26 deletions(-) create mode 100644 mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr create mode 100644 mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.de.tr create mode 100644 mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.de.tr create mode 100644 mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.de.tr create mode 100644 mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr create mode 100644 mods/ITEMS/mcl_ocean/locale/mcl_ocean.de.tr create mode 100644 mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr create mode 100644 mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr index d18b3526c..3c97cf5ec 100644 --- a/mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr @@ -3,7 +3,7 @@ Acacia Boat=Akazienboot Birch Boat=Birkenboot Boat=Boot Boats are used to travel on the surface of water.=Boote werden benutzt, um sich auf der Wasseroberfläche zu bewegen. -Dark Oak Boat=Dunkeleichenboot +Dark Oak Boat=Schwarzeichenboot Jungle Boat=Dschungelboot Oak Boat=Eichenboot 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. Rightclick the boat again to leave it, punch the boat to make it drop as an item.=Rechtsklicken Sie auf eine Wasserquelle, um das Boot zu platzieren. Rechtsklicken Sie auf das Boot, um es zu betreten. Mit [Links] und [Rechts] lenken, mit [Vorwärts] und [Rückwärts] Geschwindigkeit regeln oder rückwärts fahren. Rechtsklicken Sie erneut auf das Boot, um es zu verlassen, schlagen Sie das Boot, um es als Gegenstand fallen zu lassen. diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr index 97ce2d4c9..c5b6e73c9 100644 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr @@ -29,7 +29,7 @@ Polar Bear=Eisbär Rabbit=Kaninchen Killer Bunny=Killerkaninchen Sheep=Schaf -Shulker=Shulber +Shulker=Shulker Silverfish=Silberfischchen Skeleton=Skelett Stray=Eiswanderer diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index 1a49c6704..54d1f4165 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -53,6 +53,7 @@ Brown Stained Glass=Braunes Glas Cactus=Kaktus Charcoal=Holzkohle Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.=Holzkohle ist ein alternativer Brennstoff. Er entsteht, wenn Holz im Ofen verkohlt wird. Er brennt genau so lange wie Kohle und hat fast identische Herstellungsrezepte, aber es können keine Kohleblöcke damit gemacht werden. +Chiseled Stone Bricks=Gemeißelte Steinziegel Chiseled Red Sandstone=Gemeißelter roter Sandstein Chiseled Sandstone=Gemeißelter Sandstein Chiseled Stone Bricks=Gemeißelte Steinziegel @@ -69,7 +70,7 @@ Coarse dirt acts as a soil for some plants and is similar to dirt, but it will n Cobblestone=Kopfsteinpflaster Cobweb=Spinnennetz Cobwebs can be walked through, but significantly slow you down.=Spinnennetze können passiert werden, aber sie verlangsamen Sie beträchtlich. -Cracked Stone Bricks=Brüchige Steinziegel +Cracked Stone Bricks=Rissige Steinziegel Cut Red Sandstone=Geschliffener roter Sandstein Cut Sandstone=Geschliffener Sandstein Cut red sandstone is a decorative building block.=Geschliffener roter Sandstein ist ein dekorativer Block zum Bauen. @@ -186,10 +187,10 @@ Sandstone=Sandstein Sandstone is compressed sand and is a rather soft kind of stone.=Sandstein ist komprimierter Sand und ein relativ weiches Gestein. Slime Block=Schleimblock Slime blocks are very bouncy and prevent fall damage.=Schleimblöcke sind sehr sprunghaft und verhindern Fallschaden. -Smooth Red Sandstone=Weicher roter Sandstein -Smooth Sandstone=Weicher Sandstein -Smooth red sandstone is a decorative building block.=Weicher roter Sandstein ist ein decorativer Block zum Bauen. -Smooth sandstone is compressed sand and is a rather soft kind of stone.=Weicher Sandstein ist komprimierter Sand und ein relativ weiches Gestein. +Smooth Red Sandstone=Glatter roter Sandstein +Smooth Sandstone=Glatter Sandstein +Smooth red sandstone is a decorative building block.=Glatter roter Sandstein ist ein decorativer Block zum Bauen. +Smooth sandstone is compressed sand and is a rather soft kind of stone.=Glatter Sandstein ist komprimierter Sand und ein relativ weiches Gestein. Snow=Schnee Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=Etwas Kohle im Stein, es kommt sehr häufig vor und kann in mittelgroßen bis großen Ansammlungen im Stein bei fast jeder Höhe gefunden werden. Some iron contained in stone, it is prety common and can be found below sea level.=Etwas Eisen umschlossen von Stein, es ist recht verbreitet und kann unter der Meeresoberfläche gefunden werden. diff --git a/mods/ITEMS/mcl_core/locale/template.tr b/mods/ITEMS/mcl_core/locale/template.tr index b68ee8a49..8976d3cfe 100644 --- a/mods/ITEMS/mcl_core/locale/template.tr +++ b/mods/ITEMS/mcl_core/locale/template.tr @@ -53,6 +53,7 @@ Brown Stained Glass= Cactus= Charcoal= Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.= +Chiseled Stone Bricks= Chiseled Red Sandstone= Chiseled Sandstone= Chiseled Stone Bricks= diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr index b46760229..6b9273b75 100644 --- a/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr @@ -18,6 +18,6 @@ Dark Oak Trapdoor=Schwarzeichenfalltür Jungle Trapdoor=Dschungelfalltür 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.=Holzfalltüren sind horizontale Barrieren, die von Hand oder mit einem Redstone-Signal geöffnet oder geschlossen werden können. Sie belegen den oberen oder unteren Teil eines Blocks, je nach dem, wie sie platziert wurden. Wenn geöffnet, können sie wie eine Leiter erklommen werden. To open or close the trapdoor, rightclick it or send a redstone signal to it.=Um die Falltür zu öffnen oder zu schließen, rechtsklicken Sie sie oder schicken Sie ein Redstone-Signal zu ihr. -Iron Trapdoor=Eisenfalltür. +Iron Trapdoor=Eisenfalltür 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.=Eisenfalltüren sind horizontale Barrieren, die nur mit einem Redstone-Signal geöffnet oder geschlossen werden können, nicht von Hand. Sie belegen den oberen oder unteren Teil eines Blocks, je nach dem, wie sie platziert wurden. Wenn geöffnet, können sie wie eine Leiter erklommen werden. diff --git a/mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr b/mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr index 0237e1390..0adb187da 100644 --- a/mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr +++ b/mods/ITEMS/mcl_heads/locale/mcl_heads.de.tr @@ -3,7 +3,8 @@ Zombie Head=Zombiekopf A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet for fun, but does not offer any protection.=Ein Zombiekopf ist ein kleiner dekorativer Block, der so wie ein Kopf eines Zombies aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. Creeper Head=Creeper-Kopf A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet for fun, but does not offer any protection.=Ein Creeper-Kopf ist ein kleiner dekorativer Block, der so wie ein Kopf eines Creepers aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. -Human Head=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.=Ein Menschenkopf ist ein kleiner dekorativer Block, der so wie der Kopf eines Menschen (das heißt, einer Spielerfigur) aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. +Human Head=Menschenkopf +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.=Ein Menschenkopf ist ein kleiner dekorativer Block, der so wie der Kopf eines Menschen (das heißt, einer Spielerfigur) aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. Skeleton Skull=Skelettschädel A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet for fun, but does not offer any protection.=Ein Skelettschädel ist ein kleiner dekorativer Block, der so wie ein Schädel eines Skeletts aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. Wither Skeleton Skull=Witherskelettschädel diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index 27acbb61a..27c2a538b 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -146,7 +146,7 @@ end -- TODO: Clear *all* status effects minetest.register_craftitem("mcl_mobitems:milk_bucket", { description = S("Milk"), - _doc_items_longdesc = S("Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning (in later versions: all status effects), but restores no hunger points."), + _doc_items_longdesc = S("Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning, but restores no hunger points."), _doc_items_usagehelp = "Rightclick to drink the milk.", inventory_image = "mcl_mobitems_bucket_milk.png", wield_image = "mcl_mobitems_bucket_milk.png", diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr new file mode 100644 index 000000000..15f826529 --- /dev/null +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr @@ -0,0 +1,60 @@ +# textdomain: mcl_mobitems +Rotten Flesh=Gammelfleisch +Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.=Igitt! Dieses Stück Fleisch hat wohl bessere Tage gesehen. Wenn Sie es essen, werden Sie sofort vergiftet und erleiden einen Schaden von 4 Trefferpunkten. Aber gezähmte Wölfe können es problemlos fressen. +Raw Mutton=Rohes Hammelfleisch +Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.=Rohes Hammelfleisch ist das Fleisch eines Schafes und ein Lebensmittel, welches bedenkenlos verzehrt werden kann. Es kann gebraten werden, um seinen Nährwert deutlich zu erhöhen. +Cooked Mutton=Gebratenes Hammelfleisch +Cooked mutton is the cooked flesh from a sheep and is used as food.=Gebratenes Hammelfleisch ist das gebratene Fleisch eines Schafs und dient als Lebensmittel. +Raw Beef=Rohes Rindfleisch +Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.=Rohes Rindfleisch ist das Fleisch von Kühen und kann problemlos gegessen werden. Es kann gegart werden, um den Nährwert deutlich zu erhöhen. +Steak=Steak +Steak is cooked beef from cows and can be eaten.=Steak ist gebratenes Rindfleisch und kann gegessen werden. +Raw Chicken=Rohes Hühnchen +Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.=Rohes Hühnchen ist ein Lebensmittel, das nicht sicher für den Verzehr ist. Sie können es essen, um ein paar Hungerpunkte zu erhalten, aber mit einer Wahrscheinlichkeit von 30% erleiden Sie eine Lebensmittelvergiftung, die Ihre Hungerrate für eine Weile erhöht. Braten Sie ein rohes Hühnchen, um es sicher zuzubereiten und den Nährwert zu erhöhen. +Cooked Chicken=Gebratenes Hühnchen +A cooked chicken is a healthy food item which can be eaten.=Ein gebratenes Hühnchen ist ein gesundes essbares Lebensmittel. +Raw Porkchop=Rohes Schweinefleisch +A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.=Ein rohes Stück Schweinefleisch kann bedenkenlos gegessen werden. Man kann es braten, um seinen Nährwert stark zu erhöhen. +Cooked Porkchop=Gebratenes Schweinefleisch +Cooked porkchop is the cooked flesh of a pig and is used as food.=Ein gebratenes Stück Schweinefleisch ist ein gutes Lebensmittel. +Raw Rabbit=Rohes Kaninchen +Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.=Rohes Kaninchenfleisch ist ein Lebensmittel, welches bedenkenlos verzehrt werden kann. Es kann gebraten werden, um seinen Nährwert zu erhöhen. +Cooked Rabbit=Gebratenes Kaninchen +This is a food item which can be eaten.=Dies ist ein essbares Lebensmittel. +Milk=Milch +Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning, but restores no hunger points.=Milch ist sehr erfrischend und wird erhalten, wenn ein Eimer an einer Kuh benutzt wird. Wenn es getrunken wird, werden alle Vergiftungserscheinungen kuriert, aber es werden keine Hungerpunkte wiederhergestellt. +Spider Eye=Spinnenauge +Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.=Spinnenaugen werden hauptsächlich in der Fertigung benutzt. Wenn Sie wirklich verzweifelt sind, können sie es essen, aber das wird Sie kurz vergiften. +Bone=Knochen +Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.=Knochen können benutzt werden, um Wölfe zu zähmen, damit sie einen beschützen. Sie außerdem nützlich in der Fertigung. +String=Faden +Strings are used in crafting.=Fäden sind nützlich in der Fertigung. +Blaze Rod=Lohenrute +This is a crafting component dropped from dead blazes.=Dies ist eine Fertigungskomponente, die von toten Lohen abgeworfen wird. +Blaze Powder=Lohenstaub +This item is mainly used for crafting.=Dieser Gegenstand wird hauptsächlich in der Fertigung benutzt. +Magma Cream=Magmacreme +Magma cream is a crafting component.=Magmacreme ist eine Fertigungskomponente. +Ghast Tear=Ghast-Träne +Place this item in an item frame as decoration.=Platzieren Sie diesen Gegenstand in einem Rahmel als Deko. +Nether Star=Nether-Stern +A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.=Ein Netherstern wird abgeworfen, wenn der Wither stirbt. Platzieren Sie ihn in einen Rahmen, um der Welt zu zeigen, wie großartig Sie sind! +Leather=Leder +Leather is a versatile crafting component.=Leder ist eine vielseitige Fertigungskomponente. +Feather=Feder +Feathers are used in crafting and are dropped from chickens.=Federn werden in der Fertigung benutzt und werden von Hühnern abgeworfen. +Rabbit Hide=Kaninchenfell +Rabbit hide is used to create leather.=Kaninchenfell wird zur Herstellung von Leder benutzt. +Rabbit's Foot=Hasenpfote +Must be your lucky day! Place this item in an item frame for decoration.=Muss wohl Ihr Glückstag sein! Platzieren Sie diesen Gegenstand in einen Rahmen zur Dekoration. +Saddle=Sattel +Saddles can be put on some animals in order to mount them.=Sattel können auf einigen Tieren platziert werden, um sich aufzusatteln. +Rabbit Stew=Kaninchenragout +Rabbit stew is a very nutricious food item.=Kaninchenragout ist ein sehr nahrhaftes Lebensmittel. +Shulker Shell=Shulkerschale +Shulker shells are used in crafting. They are dropped from dead shulkers.=Shulkerschalen werden für die Fertigung verwendet. Sie werden von toten Shulkern fallen gelassen. +Slimeball=Schleimkugel +Slimeballs are used in crafting. They are dropped from slimes.=Schleimkugeln werden in der Fertigung verwendet. Sie werden von Schleimen fallen gelassen. +Gunpowder=Schießpulver +Carrot on a Stick=Karottenrute +A carrot on a stick can be used on saddled pigs to ride them.=Eine Karottenrute kann auf gesattelten Schweinen angewendet werden, um sie zu reiten. diff --git a/mods/ITEMS/mcl_mobitems/locale/template.txt b/mods/ITEMS/mcl_mobitems/locale/template.txt index 212497269..aa28e6b03 100644 --- a/mods/ITEMS/mcl_mobitems/locale/template.txt +++ b/mods/ITEMS/mcl_mobitems/locale/template.txt @@ -22,7 +22,7 @@ Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it Cooked Rabbit= This is a food item which can be eaten.= Milk= -Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning (in later versions: all status effects), but restores no hunger points.= +Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will cure all forms of poisoning, but restores no hunger points.= Spider Eye= Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.= Bone= diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index 70d4cdad1..632e4fa75 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -267,7 +267,7 @@ minetest.register_node("mcl_mobspawners:spawner", { walkable = true, description = S("Mob Spawner"), _doc_items_longdesc = S("A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light."), - _doc_items_usagehelp = S("If you have a spawn egg, you use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level."), + _doc_items_usagehelp = S("If you have a spawn egg, you can use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level."), groups = {pickaxey=1, material_stone=1, deco_block=1}, is_ground_content = false, drop = "", diff --git a/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.de.tr b/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.de.tr new file mode 100644 index 000000000..84a849ed7 --- /dev/null +++ b/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.de.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_mobspawners +Mob Spawner=Mobspawner +A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light.=Ein Mobspawner lässt regelmäßig Mobs um ihn herum auftauchen, wenn sich ein Spieler in der Nähe befindet. Einige Mobspawner werden inaktiv, wenn sie sich im Licht befinden. +If you have a spawn egg, you can use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level.=Wenn Sie ein Spawn-Ei haben, können Sie es benutzen, um den Mobtyp, der erzeugt wird, zu ändern. Platzieren Sie den Gegenstand einfach auf dem Mobspawner. Von Spielern manipulierte Mobspawner erzeugen immer Mobs, unabhängig von der Helligkeit. diff --git a/mods/ITEMS/mcl_mobspawners/locale/template.txt b/mods/ITEMS/mcl_mobspawners/locale/template.txt index f6948377c..6a660585f 100644 --- a/mods/ITEMS/mcl_mobspawners/locale/template.txt +++ b/mods/ITEMS/mcl_mobspawners/locale/template.txt @@ -1,4 +1,4 @@ # textdomain: mcl_mobspawners Mob Spawner= A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light.= -If you have a spawn egg, you use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level.= +If you have a spawn egg, you can use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level.= diff --git a/mods/ITEMS/mcl_monster_eggs/init.lua b/mods/ITEMS/mcl_monster_eggs/init.lua index e693db00c..1f7244cb0 100644 --- a/mods/ITEMS/mcl_monster_eggs/init.lua +++ b/mods/ITEMS/mcl_monster_eggs/init.lua @@ -1,7 +1,7 @@ -- Monster eggs! -- Blocks which spawn silverfish when destroyed. -local S = minetest.get_translator("mcl_mobspawners") +local S = minetest.get_translator("mcl_monster_eggs") local spawn_silverfish = function(pos, oldnode, oldmetadata, digger) if not minetest.settings:get_bool("creative_mode") then diff --git a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.de.tr b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.de.tr new file mode 100644 index 000000000..61145497a --- /dev/null +++ b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.de.tr @@ -0,0 +1,8 @@ +# 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.=Ein verseuchter Block ist ein Block, aus dem ein Silberfischchen hinausfallen wird, wenn er zerbrochen wird. Er sieht identisch zu seinem normalen Pendant aus. +Infested Stone=Verseuchter Stein +Infested Cobblestone=Verseuchtes Kopfsteinpflaster +Infested Stone Bricks=Verseuchte Steinziegel +Infested Cracked Stone Bricks=Verseuchte rissige Steinziegel +Infested Mossy Stone Bricks=Verseuchte moosige Steinziegel +Infested Chiseled Stone Bricks=Verseuchte gemeißelte Steinziegel diff --git a/mods/ITEMS/mcl_monster_eggs/locale/template.txt b/mods/ITEMS/mcl_monster_eggs/locale/template.txt index 7e8b0c0cf..ce40fa8b1 100644 --- a/mods/ITEMS/mcl_monster_eggs/locale/template.txt +++ b/mods/ITEMS/mcl_monster_eggs/locale/template.txt @@ -1,4 +1,4 @@ -# textdomain: mcl_mobspawners +# 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.= Infested Stone= Infested Cobblestone= diff --git a/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.de.tr b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.de.tr new file mode 100644 index 000000000..442b46fca --- /dev/null +++ b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.de.tr @@ -0,0 +1,21 @@ +# textdomain: mcl_mushrooms +This decorative block is like a huge mushroom stem, but with the stem texture on all sides.=Dieser dekorative Block ist wie ein Riesenpilzstängel, aber mit der Stängeltextur auf allen Seiten. +Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides.=Rote Riesenpilzblöcke sind die Kappenteile von roten Riesenpilzen. Sie bestehen aus einer roten Haut und können Poren an jede ihrer Seiten haben. +The stem part of a huge red mushroom.=Der Stängelteil eines roten Riesenpilzes. +Huge Red Mushroom Block=Roter Riesenpilzblock +Huge Red Mushroom Stem=Roter Riesenpilzstängel +Huge Red Mushroom All-Faces Stem=Roter allseitiger Riesenpilzstängel +Huge brown mushroom blocks are the cap parts of huge red mushrooms. It consists of a brown skin and can have pores on each of its sides.=Braune Riesenpilzblöcke sind die Kappenteile von braunen Riesenpilzen. Sie bestehen aus einer braunen Haut und können Poren an jede ihrer Seiten haben. +The stem part of a huge brown mushroom.=Der Stängelteil eines braunen Riesenpilzes. +Huge Brown Mushroom Block=Brauner Riesenpilzblock +Huge Brown Mushroom Stem=Brauner Riesenpilzstängel +Huge Brown Mushroom All-Faces Stem=Brauner allseitiger Riesenpilzstängel +Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Braune Pilze wachsen und breiten sich in der Dunkelheit aus, aber sie sind Lichtempfindlich. Als solche sind sie ungenießbar, aber sie können benutzt werden, um Lebensmittel herzustellen. +Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Rote Pilze wachsen und breiten sich in der Dunkelheit aus, aber sie sind Lichtempfindlich. Als solche sind sie ungenießbar, aber sie können benutzt werden, um Lebensmittel herzustellen. +A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom.=Ein einzelner Pilz dieser Art wird sich im Laufe der Zeit zu einem zufälligen festem undurchsichtigem Block mit einer Lichtstärke von 12 oder weniger in einem 3×3×3-Würfel um den Pilz hin ausbreiten. Er wird sich nicht weiter ausbreiten, wenn sich 5 oder mehr Pilze der gleichen Art innerhalb eines Bereichs von 9×3×9 Blöcken um den Pilz befinden. +Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.=Pilze werden sich bei einer Lichtstärke von mindestens 12 irgendwann selbst entwurzeln. Auf Myzel oder Podsol überleben sie und breiten sich bei jeder Lichtstärke aus. +This mushroom can be placed on mycelium and podzol at any light level. It can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.=Diser Pilz kann auf Myzel und Podsol in jeder Lichtstärke platziert werden. Er kann auch auf Blöcken platziert werden, die sowohl fest als auch undurchsichtig sind, solange die Lichtstärke des Tageslichts nicht höher als 12 ist. +Brown Mushroom=Brauner Pilz +Red Mushroom=Roter Pilz +Mushroom Stew=Pilzsuppe +Mushroom stew is a healthy soup which can be consumed to restore some hunger points.=Pilzsuppe ist eine gesunde Suppe, die für ein paar Hungerpunkte konsumiert werden kann. diff --git a/mods/ITEMS/mcl_mushrooms/locale/template.txt b/mods/ITEMS/mcl_mushrooms/locale/template.txt index 77e0156e9..2c4c3ba63 100644 --- a/mods/ITEMS/mcl_mushrooms/locale/template.txt +++ b/mods/ITEMS/mcl_mushrooms/locale/template.txt @@ -14,7 +14,7 @@ Brown mushrooms are fungi which grow and spread in darkness, but are sensitive t Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.= A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom.= Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.= -This mushroom can be placed on mycelium and podzol at any light level. They can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.= +This mushroom can be placed on mycelium and podzol at any light level. It can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.= Brown Mushroom= Red Mushroom= Mushroom Stew= diff --git a/mods/ITEMS/mcl_mushrooms/small.lua b/mods/ITEMS/mcl_mushrooms/small.lua index 7b4466040..75bdeeecf 100644 --- a/mods/ITEMS/mcl_mushrooms/small.lua +++ b/mods/ITEMS/mcl_mushrooms/small.lua @@ -23,7 +23,7 @@ local longdesc_intro_red = S("Red mushrooms are fungi which grow and spread in d local longdesc_append = S("A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom.").."\n".. S("Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.") -local usagehelp = S("This mushroom can be placed on mycelium and podzol at any light level. They can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.") +local usagehelp = S("This mushroom can be placed on mycelium and podzol at any light level. It can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.") minetest.register_node("mcl_mushrooms:mushroom_brown", { description = S("Brown Mushroom"), diff --git a/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr b/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr new file mode 100644 index 000000000..c114f8f3c --- /dev/null +++ b/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr @@ -0,0 +1,36 @@ +# textdomain: mcl_nether +Glowstone=Leuchtstein +Glowstone is a naturally-glowing block which is home to the Nether.=Leuchtstein ist ein Block aus dem Nether. Er leuchtet von Natur aus hell. +Nether Quartz Ore=Nether-Quarzerz +Nether quartz ore is an ore containing nether quartz. It is commonly found around netherrack in the Nether.=Nether-Quarzerz ist ein Erz, das Nethererz enthält. Es wird oft zwischen Netherrack im Nether gefunden. +Netherrack=Netherrack +Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire.=Netherrack ist ein gesteinsartiger Block aus dem Nether. Auf diesem Block wird ein Feuer immer ein ewiges Feuer sein. +Magma Block=Magmablock +Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire.=Magmablöcke sind heiße feste Blöcke, die jeden, der auf ihm steht, verletzen, es sei denn, sie sind gegen Feuer immun. Auf diesem Block wird ein Feuer immer ein ewiges Feuer sein. +Soul Sand=Seelensand +Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block.=Seelensand ist ein Block aus dem Nether. Man kann auf ihm nur langsam gehen. Die Verlangsamung ist verstärkt, wenn sich der Seelensand auf Eis, Packeis oder einem Schleimblock befindet. +Nether Brick Block=Netherziegelblock +Red Nether Brick Block=Roter Netherziegelblock +Nether Wart Block=Netherwurzblock +A nether wart block is a purely decorative block made from nether wart.=Ein Netherwurzblock ist ein rein dekorativer Block aus Netherwurz. +Block of Quartz=Quarzblock +Chiseled Quartz Block=Gemeißelter Quarzblock +Pillar Quartz Block=Quarzsäulenblock +Smooth Quartz=Glatter Quarz +Glowstone Dust=Leuchtsteinstaub +Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting.=Leuchtsteinstaub ist das Staub aus zerbrochenen Leuchtsteinen. +Nether Quartz=Netherquarz +Nether quartz is a versatile crafting ingredient.=Netherquarz ist eine vielseitige Fertigungskomponente. +Nether Brick=Netherziegel +Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences.=Netherziegel werden hauptsächlich zur Fertigung von Netherziegelblöcken und Netherzäunen benutzt. +Nether Lava Source=Netherlavaquelle +Flowing Nether Lava=Fließende Netherlava +@1 stood too long on a magma block.=@1 stand zu lange auf einem Magmablock. +Premature Nether Wart (Stage 1)=Junger Netherwurz (1. Stufe) +A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension.=Ein junger Netherwurz wurde erst kürzlich auf Seelensand gepflanzt. Netherwurz wächst langsam auf Seelensand in 4 Stufen (die 2. und 3. Stufe sehen identisch aus). Obwohl Netherwurz im Nether beheimatet ist, wächst er in jeder Dimension. +Premature Nether Wart (Stage 2)=Junger Netherwurz (2. Stufe) +Premature Nether Wart (Stage 3)=Junger Netherwurz (3. Stufe) +Mature Nether Wart=Ausgewachsener Netherwurz +The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items.=Der ausgewachsene Netherwurz ist eine Pflanze aus dem Nether. Er hat seine volle Größe erreicht, ist erntereif und wächst nicht weiter. +Nether Wart=Netherwurz +Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages.=Netherwurze sind Pflanzen, die im Nether beheimatet sind. Sie können auf Seelensand gepflanzt werden und wachsen in 4 Stufen. diff --git a/mods/ITEMS/mcl_nether/locale/template.txt b/mods/ITEMS/mcl_nether/locale/template.txt index de9328474..7ad879fd3 100644 --- a/mods/ITEMS/mcl_nether/locale/template.txt +++ b/mods/ITEMS/mcl_nether/locale/template.txt @@ -7,6 +7,7 @@ Netherrack= Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire.= Magma Block= Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire.= +@1 stood too long on a magma block.= Soul Sand= Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block.= Nether Brick Block= @@ -25,4 +26,11 @@ Nether Brick= Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences.= Nether Lava Source= Flowing Nether Lava= -@1 stood too long on a magma block.= +Premature Nether Wart (Stage 1)= +A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension.= +Premature Nether Wart (Stage 2)= +Premature Nether Wart (Stage 3)= +Mature Nether Wart= +The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items.= +Nether Wart= +Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages.= diff --git a/mods/ITEMS/mcl_nether/nether_wart.lua b/mods/ITEMS/mcl_nether/nether_wart.lua index fbe6653a2..6e9b21c90 100644 --- a/mods/ITEMS/mcl_nether/nether_wart.lua +++ b/mods/ITEMS/mcl_nether/nether_wart.lua @@ -1,6 +1,8 @@ +local S = minetest.get_translator("mcl_nether") + minetest.register_node("mcl_nether:nether_wart_0", { - description = "Premature Nether Wart (Stage 1)", - _doc_items_longdesc = "A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension.", + description = S("Premature Nether Wart (Stage 1)"), + _doc_items_longdesc = S("A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension."), paramtype = "light", paramtype2 = "meshoptions", place_param2 = 3, @@ -21,7 +23,7 @@ minetest.register_node("mcl_nether:nether_wart_0", { }) minetest.register_node("mcl_nether:nether_wart_1", { - description = "Premature Nether Wart (Stage 2)", + description = S("Premature Nether Wart (Stage 2)"), _doc_items_create_entry = false, paramtype = "light", paramtype2 = "meshoptions", @@ -43,7 +45,7 @@ minetest.register_node("mcl_nether:nether_wart_1", { }) minetest.register_node("mcl_nether:nether_wart_2", { - description = "Premature Nether Wart (Stage 3)", + description = S("Premature Nether Wart (Stage 3)"), _doc_items_create_entry = false, paramtype = "light", paramtype2 = "meshoptions", @@ -65,8 +67,8 @@ minetest.register_node("mcl_nether:nether_wart_2", { }) minetest.register_node("mcl_nether:nether_wart", { - description = "Mature Nether Wart", - _doc_items_longdesc = "The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items.", + description = S("Mature Nether Wart"), + _doc_items_longdesc = S("The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items."), paramtype = "light", paramtype2 = "meshoptions", place_param2 = 3, @@ -94,8 +96,8 @@ minetest.register_node("mcl_nether:nether_wart", { }) minetest.register_craftitem("mcl_nether:nether_wart_item", { - description = "Nether Wart", - _doc_items_longdesc = "Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 3 stages.", + description = S("Nether Wart"), + _doc_items_longdesc = S("Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages."), _doc_items_usagehelp = "Place this item on soul sand to plant it and watch it grow.", inventory_image = "mcl_nether_nether_wart.png", wield_image = "mcl_nether_nether_wart.png", diff --git a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.de.tr b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.de.tr new file mode 100644 index 000000000..02cdd777e --- /dev/null +++ b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.de.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_ocean +Sea Lantern=Seelaterne +Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Seelaternen sind dekorative Lichtquellen, die im Wasser schick aussehen, aber sie können überall platziert werden. +Prismarine=Prismarin +Prismarine is used as a building block. It slowly changes its color.=Prismarin wird aus Baumaterial benutzt. Er verändert langsam seine Farbe. +Prismarine Bricks=Prismarinziegel +Dark Prismarine=Dunkelprismarin +Prismarine Crystals=Prismarinkristalle +Prismarine Shard=Prismarinsplitter diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr new file mode 100644 index 000000000..237740624 --- /dev/null +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr @@ -0,0 +1,14 @@ +# textdomain: mcl_portals +End Portal=Endportal +An End portal teleports creatures and objects to the mysterious End dimension (and back!).=Ein Endportal teleportiert Kreaturen und Objekte zur mysteriösen Ende-Dimension (und wieder zurück!). +Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=Springen Sie ins Portal, um sich zu teleportieren. Von der Oberwelt aus werden Sie zu einer festen Position im Ende hin teleportiert. Eine 5×5-Obsidianplattform wird am Zielort erzeugt. Im Ende werden Sie zurück zu Ihrem Startpunkt in der Oberwelt teleportiert. +End Portal Frame=Endportalrahmen +End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=Endportalrahmen werden in der Konstruktion von Endportalen benutzt. Jeder Block hat einen Sockel für ein Enderauge. +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.=Um ein Endportal zu pauen, brauchen sie 12 Endportalrahmen und 12 Enderaugen. Die Endportalrahmenblöcke muss um ein horizontales Feld von 3×3 platziert sein, wobei jeder von ihnen nach innen zeigt. Jede andere Anordnung wird nicht funktionieren. +Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.=Platzieren Sie ein Enderauge in jeden Block. Das Endportal wird sich in der Mitte öffnen, wenn das letzte Auge platziert wurde. +End Portal Frame with Eye of Ender=Endportalrahmen mit Enderauge +Nether Portal=Netherportal +A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Ein Netherportal teleportiert Kreaturen und Objekte zur heißen und gefährlichen Nether-Dimension (und zurück!). Betreten auf eigene Gefahr! +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.=Stellen Sie sich ins Portal für einen Moment, um sich zu teleportieren. Beim ersten Mal wird auch ein Portal in der anderen Dimension erschaffen. Wenn ein Netherportal im Nether gebaut wird, wird es zurück zur Oberwelt führen. Ein Netherportal wird zerstört, wenn das Obsidian, das ihn umgibt, zerstört wird, oder, wenn es einer Explosion ausgesetzt war. +Obsidian is also used as the frame of Nether portals.=Obsidian wird auch als Rahmen von Netherportalen benutzt. +To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Um ein Netherportal zu öffnen, platzieren Sie einen aufrechten Rahmen aus Obsidian mit einer Breite von 4 Blöcken und einer Höhe von 5 Blöcken, nur mit Luft in der Mitte. Nachdem Sie den Rahmen gebaut haben, entfachen Sie ein Feuer im Obsidianrahmen. Netherportale funktionieren nur in der Oberwelt und im Nether. diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr new file mode 100644 index 000000000..efe6688cb --- /dev/null +++ b/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr @@ -0,0 +1,20 @@ +# textdomain: mcl_potions +Put this item in an item frame for decoration. It's useless otherwise.=Platizeren Sie diesen Gegenstand in einen Rahmen als Deko. Ansonsten ist er nutzlos. +Fermented Spider Eye=Fermentiertes Spinnenauge +Glass Bottle=Glasflasche +A glass bottle is used as a container for liquids and can be used to collect water directly.=Eine Glasflasche wird als Behälter von Flüssigkeiten benutzt und kann Wasser direkt aufsammeln. +To collect water, it on a cauldron with water (which removes a level of water) or any water source (which removes no water).=Um Wasser aufzusammen, benutzen Sie sie an einem Kessel mit Wasser (was etwas Wasser entfernt) oder einer Wasserquelle (was kein Wasser entfernt). +Water Bottle=Wasserflasche +Water bottles can be used to fill cauldrons. Drinking water has no effect.=Wasserflaschen können benutzt werden, um Kessel aufzufüllen. Trinken hat keine Wirkung. +Rightclick to drink. Rightclick a cauldron to pour the water into the cauldron.=Rechtsklicken zum Trinken. Auf einem Kessel rechtsklicken, um das Wasser in den Kessen zu schütten. +River Water Bottle=Flusswasserflasche +River water bottles can be used to fill cauldrons. Drinking it has no effect.=Flusswasserflaschen können benutzt werden, um Kessel aufzufüllen. Trinken hat keine Wirkung. +Awkward Potion=Seltsamer Trank +This potion has an awkward taste and is used for brewing more potions. Drinking it has no effect.=Dieser Trank schmeckt komisch. Er wird zum Brauen von Tränken benutzt. Trinken hat keine Wirkung. +Mundane Potion=Klarer Trank +This potion has a clean taste and is used for brewing more potions. Drinking it has no effect.=Dieser Trank hat einen klaren Geschmack und wird zum Brauen von Tränken benutzt. Trinken hat keine Wirkung. +Thick Potion=Bitterer Trank +This potion has a bitter taste and is used for brewing more potions. Drinking it has no effect.=Dieser Trank hat einen bitteren Geschmack und wird zum Brauen von Tränken benutzt. Trinken hat keine Wirkung. +Glistering Melon=Glitzermelone +This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.=Diese glänzende Melone ist voller winziger Goldnuggets und sähe ganz nett in einem Rahmen aus. Er ist nicht essbar und auch sonst zu nichts zu gebrauchen. +Dragon's Breath=Drachenatem From c12a4b795ea358d7ec288b6aaddbf56ae4072966 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Mar 2019 09:52:13 +0100 Subject: [PATCH 196/379] =?UTF-8?q?Make=20=E2=80=9Cnow=20playing=E2=80=9D?= =?UTF-8?q?=20translatable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/ITEMS/mcl_jukebox/init.lua | 2 +- mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.de.tr | 1 + mods/ITEMS/mcl_jukebox/locale/template.txt | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_jukebox/init.lua b/mods/ITEMS/mcl_jukebox/init.lua index e714c79de..fb495e78a 100644 --- a/mods/ITEMS/mcl_jukebox/init.lua +++ b/mods/ITEMS/mcl_jukebox/init.lua @@ -50,7 +50,7 @@ end local function now_playing(player, track_id) local playername = player:get_player_name() local hud = active_huds[playername] - local text = "Now playing: " .. recorddata[track_id][2] .. "—" .. recorddata[track_id][1] + local text = S("Now playing: @1—@2", recorddata[track_id][2], recorddata[track_id][1]) if not hud_sequence_numbers[playername] then hud_sequence_numbers[playername] = 1 diff --git a/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.de.tr b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.de.tr index 9655e5005..60dea78d0 100644 --- a/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.de.tr +++ b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.de.tr @@ -7,3 +7,4 @@ Music Disc=Musikplatte Jukebox=Musikbox Jukeboxes play music when they're supplied with a music disc.=Musikboxen spielen Musik, wenn man ihnen eine Musikplatte gibt. 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.=Platzieren Sie eine Musikplatte in eine leere Musikbox, um die Musikplatte einzulegen und Musik zu spielen. Wenn die Musikbox schon eine Musikplatte hat, werden Sie zuerst diese Musikplatte erhalten. Die Musik kann nur von Ihnen gehört werden, aber nicht von anderen Spielern. +Now playing: @1—@2=Sie hören: @1 – @2 diff --git a/mods/ITEMS/mcl_jukebox/locale/template.txt b/mods/ITEMS/mcl_jukebox/locale/template.txt index b2923e905..5b46ce08a 100644 --- a/mods/ITEMS/mcl_jukebox/locale/template.txt +++ b/mods/ITEMS/mcl_jukebox/locale/template.txt @@ -7,3 +7,4 @@ Music Disc= Jukebox= Jukeboxes play music when they're supplied with a music disc.= 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.= +Now playing: @1—@2= From 9385458632139e75675fb65a33fe6ccbf373e2d9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 16 Mar 2019 00:07:44 +0100 Subject: [PATCH 197/379] German translation: mcl_signs to xpanes --- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 32 +++--- mods/ITEMS/mcl_signs/init.lua | 2 +- mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr | 4 + mods/ITEMS/mcl_signs/locale/template.txt | 2 +- mods/ITEMS/mcl_sponges/locale/template.txt | 14 +-- mods/ITEMS/mcl_stairs/api.lua | 2 +- mods/ITEMS/mcl_stairs/locale/mcl_stairs.de.tr | 101 ++++++++++++++++++ mods/ITEMS/mcl_stairs/locale/template.txt | 2 +- mods/ITEMS/mcl_throwing/init.lua | 6 +- .../mcl_throwing/locale/mcl_throwing.de.tr | 9 ++ mods/ITEMS/mcl_throwing/locale/template.txt | 6 +- mods/ITEMS/mcl_tnt/init.lua | 4 +- mods/ITEMS/mcl_tnt/locale/mcl_tnt.de.tr | 5 + mods/ITEMS/mcl_tnt/locale/template.txt | 4 +- mods/ITEMS/mcl_tools/init.lua | 6 +- mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr | 31 ++++++ mods/ITEMS/mcl_tools/locale/template.txt | 6 +- .../mcl_torches/locale/mcl_torches.de.tr | 3 + mods/ITEMS/mcl_totems/locale/template.txt | 0 mods/ITEMS/mcl_walls/locale/mcl_walls.de.tr | 16 +++ mods/ITEMS/mcl_wool/locale/mcl_wool.de.tr | 35 ++++++ .../mclx_fences/locale/mclx_fences.de.tr | 4 + .../mclx_stairs/locale/mclx_stairs.de.tr | 31 ++++++ .../3d_armor/locale/3d_armor.de.tr | 23 ++++ .../minetest-3d_armor/3d_armor_stand/init.lua | 2 +- .../locale/3d_armor_stand.de.tr | 4 + .../3d_armor_stand/locale/template.txt | 2 +- mods/ITEMS/xpanes/locale/xpanes.de.tr | 21 ++++ 28 files changed, 334 insertions(+), 43 deletions(-) create mode 100644 mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr create mode 100644 mods/ITEMS/mcl_stairs/locale/mcl_stairs.de.tr create mode 100644 mods/ITEMS/mcl_throwing/locale/mcl_throwing.de.tr create mode 100644 mods/ITEMS/mcl_tnt/locale/mcl_tnt.de.tr create mode 100644 mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr create mode 100644 mods/ITEMS/mcl_torches/locale/mcl_torches.de.tr delete mode 100644 mods/ITEMS/mcl_totems/locale/template.txt create mode 100644 mods/ITEMS/mcl_walls/locale/mcl_walls.de.tr create mode 100644 mods/ITEMS/mcl_wool/locale/mcl_wool.de.tr create mode 100644 mods/ITEMS/mclx_fences/locale/mclx_fences.de.tr create mode 100644 mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr create mode 100644 mods/ITEMS/minetest-3d_armor/3d_armor/locale/3d_armor.de.tr create mode 100644 mods/ITEMS/minetest-3d_armor/3d_armor_stand/locale/3d_armor_stand.de.tr create mode 100644 mods/ITEMS/xpanes/locale/xpanes.de.tr diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index 54d1f4165..b2c77e444 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -33,14 +33,14 @@ Birch Sapling=Birkensetzling Birch Wood=Birkenholz Birch Wood Planks=Birkenholzplanken Birch leaves are grown from birch trees.=Birkenblätter wachsen an Birken. -Black Stained Glass=Schwarzes Glas +Black Stained Glass=Schwarzes Buntglas Block of Coal=Kohleblock Block of Diamond=Diamantblock Block of Emerald=Smaragdblock Block of Gold=Goldblock Block of Iron=Eisenblock Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.=Kohleblöcke sind für eine kompakte Aufbewahrung von Kohle nützlich und sehr nützlich als Ofenbrennstoff. Ein Kohleblock ist so effizient wie 10 mal Kohle. -Blue Stained Glass=Blaues Glas +Blue Stained Glass=Blaues Buntglas Bone Block=Knockenblock Bone blocks are decorative blocks and a compact storage of bone meal.=Knochenblöcke sind Deko-Blöcke und geeignet zur kompakten Aufbewahrung von Knochenmehl. Bowl=Schale @@ -49,7 +49,7 @@ Brick=Ziegel Brick Block=Ziegelblock Brick blocks are a good building material for building solid houses and can take quite a punch.=Ziegelblöcke sind ein gutes Baumaterial für den Bau stabiler Gebäude und halten einiges aus. Bricks are used to craft brick blocks.=Ziegel werden zur Herstellung von Ziegelblöcken benötigt. -Brown Stained Glass=Braunes Glas +Brown Stained Glass=Braunes Buntglas Cactus=Kaktus Charcoal=Holzkohle Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.=Holzkohle ist ein alternativer Brennstoff. Er entsteht, wenn Holz im Ofen verkohlt wird. Er brennt genau so lange wie Kohle und hat fast identische Herstellungsrezepte, aber es können keine Kohleblöcke damit gemacht werden. @@ -75,7 +75,7 @@ Cut Red Sandstone=Geschliffener roter Sandstein Cut Sandstone=Geschliffener Sandstein Cut red sandstone is a decorative building block.=Geschliffener roter Sandstein ist ein dekorativer Block zum Bauen. Cut sandstone is a decorative building block.=Geschliffener Sandstein ist ein dekorativer Block zum Bauen. -Cyan Stained Glass=Türkises Glas +Cyan Stained Glass=Türkises Buntglas Dark Oak Bark=Schwarzeichenrinde Dark Oak Leaves=Schwarzeichenblätter Dark Oak Sapling=Schwarzeichensetzling @@ -115,8 +115,8 @@ Grass Block=Grasblock Grass Path=Graspfad Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Graspfade sind eine dekorative Variante von Grasblöcken. Ihre Oberseite hat eine andere Farbe und sie sind etwas niedriger als Grasblöcke, wodurch sie nützlich sind, um Fußwege zu errichten. Graspfade werden mit einer Schaufel errichtet. Ein Grasphad verwandelt sich in Erde, wenn er sich unter einem festen Block befindet. Gravel=Kies -Green Stained Glass=Grünes Glas -Grey Stained Glass=Graues Glas +Green Stained Glass=Grünes Buntglas +Grey Stained Glass=Graues Buntglas Ice=Eis Ice is a translucent solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.=Eis ist ein durchscheinender fester Block, der oft in kalten Gebieten gefunden werden kann. Er schmitzt in der nähe von Block-Lichtquellen bei einer Helligkeit von 12 oder höher. Wenn es schmilzt oder abgeaut wird, und darunter ein anderer Block war, wird er sich in eine Wasserquelle verwandeln. In the End dimension, starting a fire on this block will create an eternal fire.=In der Ende-Dimension wird Feuer auf diesem Block ewig brennen. @@ -136,11 +136,11 @@ Lapis Lazuli Ore=Lapislazulierz Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world.=Lapislazulierz ist das Erz von Lapislazuli. Es kann relativ selten in Ansammlungen in der Nähe des Weltbodens gefunden werden. Lava Source=Lavaquelle Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.=Lava ist heiß und ziemlich gefährlich. Berühren Sie sie nicht, es wird Sie verletzen und es ist schwierig, ihr zu entkommen. -Light Blue Stained Glass=Hellblaues Glas -Light Grey Stained Glass=Hellgraues Glas -Lime Stained Glass=Lindgrünes Glas +Light Blue Stained Glass=Hellblaues Buntglas +Light Grey Stained Glass=Hellgraues Buntglas +Lime Stained Glass=Lindgrünes Buntglas Lit Redstone Ore=Leuchtendes Redstoneerz -Magenta Stained Glass=Magenta Glas +Magenta Stained Glass=Magenta Buntglas Molten gold. It is used to craft armor, tools, and whatnot.=Geschmolzenes Gold. Es wird benutzt, um Rüstungen, Werkzeuge, und anderes herzustellen. Molten iron. It is used to craft armor, tools, and whatnot.=Geschmolzenes Eisen. Es wird benutzt, um Rüstungen, Werkzeuge, und vieles mehr herzustellen. @@ -157,12 +157,12 @@ Oak leaves are grown from oak trees.=Eichenblätter wachsen von Eichen. Obsidian=Obsidian Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava.=Obsidian ist ein extrem hartes Mineral mit einem enormen Sprengwiderstand. One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.=Eines der häufigsten Blöcke der Welt, fast der ganze Untergrund besteht aus stein. Er enthält manchmal Erze. Stein kann entstehen, wenn Wasser auf Lava trifft. -Orange Stained Glass=Orange Glas +Orange Stained Glass=Orange Buntglas Packed Ice=Packeis Packed ice is a compressed form of ice. It is opaque and solid.=Packeis ist eine kompakte Eisform. Es ist undurchsichtig und fest. Paper=Papier Paper is used to craft books and maps.=Papier wird benutzt, um Bücher und Karten herzustellen. -Pink Stained Glass=Rosa Glas +Pink Stained Glass=Rosa Buntglas Podzol=Podsol Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.=Podsol ist eine Art Erde, die man in Taigawäldern finden kann. Nur wenige Pflanzen können hierauf wachsen. Polished Andesite=Polierter Andesit @@ -172,11 +172,11 @@ Polished Stone=Polierter Stein Polished andesite is a decorative building block made from andesite.=Polierter Andesit ist ein dekorativer Block zum Bauen, der aus Andesit gemacht wurde. Polished diorite is a decorative building block made from diorite.=Polierter Diorit ist ein dekorativer Block zum Bauen, der aus Diorit gemacht wurde. Polished granite is a decorative building block made from granite.=Polierter Granit ist ein dekorativer Block zum Bauen, der aus Granit gemacht wurde. -Purple Stained Glass=Violettes Glas +Purple Stained Glass=Violettes Buntglas Realm Barrier=Reichsbarriere Red Sand=Roter Sand Red Sandstone=Roter Sandstein -Red Stained Glass=Rotes Glas +Red Stained Glass=Rotes Buntglas Red sand is found in large quantities in mesa biomes.=Roter Sand kommt in großen Mengen bei Tafelbergbiomen vor. Red sandstone is compressed red sand and is a rather soft kind of stone.=Roter Sandstein ist komprimierter roter Sand und ein relativ weiches Gestein. Redstone Ore=Redstone-Erz @@ -235,6 +235,6 @@ When placed on soil (such as dirt) and exposed to light, a spruce sapling will g When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.=Wird er auf einem Nährboden (wie Erde) platziert und ist er dem Licht ausgesetzt, wird ein Akaziensetzling langsam zu einer Akazie nach etwas Zeit heranwachsen. When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time.=Wird er auf einem Nährboden (wie Erde) platziert und ist er dem Licht ausgesetzt, wird ein Eichensetzling langsam zu einer Eiche nach etwas Zeit heranwachsen. When you hold a barrier in hand, you reveal all placed barriers in a short distance around you.=Wenn Sie eine Barriere in der Hand halten, legen Sie alle Barrieren in Ihrer Nähe offen. -White Stained Glass=Weißes Glas -Yellow Stained Glass=Gelbes Glas +White Stained Glass=Weißes Buntglas +Yellow Stained Glass=Gelbes Buntglas “Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.=„Kohle“ meint Kohleklumpen, die herausfallen, wenn Kohleerz gegraben wird, was im Untergrund gefunden werden kann. Kohle ist der klassische Brennstoff für den Ofen, aber er kann auch benutzt werden, um Fackeln, Kohleblöcke und einige andere Dinge herzustellen. diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index 2fada201a..8ae79a520 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -253,7 +253,7 @@ end minetest.register_node("mcl_signs:wall_sign", { description = S("Sign"), _doc_items_longdesc = S("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."), - _doc_items_usagehelp = S("Place the sign at the side to build a wall sign, place it on top of another block to build a sign with a sign post.\nAfter 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. The text can not be changed once it has been written; you have to break and place the sign again."), + _doc_items_usagehelp = S("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."), inventory_image = "default_sign.png", walkable = false, is_ground_content = false, diff --git a/mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr b/mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr new file mode 100644 index 000000000..27f06a9f8 --- /dev/null +++ b/mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_signs +Sign=Schild +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.=Schilder können beschrieben werden und kommen in zwei Varianten: Wandschild und stehendes Schild. Sie können auf und an den Seiten von anderen Blöclen platziert werden, aber nicht unter ihnen. +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.=Nachdem das Schild platziert wurde, kann man etwas darauf schreiben. 4 Zeilen mit je 15 Zeichen pro Zeile sind verfügbar, alles darüber geht verloren. Es werden nicht alle Zeichen unterstützt. Der Text kann nicht geändert werden, sobald er geschrieben wurde; man muss das Schild erneut platzieren. diff --git a/mods/ITEMS/mcl_signs/locale/template.txt b/mods/ITEMS/mcl_signs/locale/template.txt index ae920e308..2cf0ef998 100644 --- a/mods/ITEMS/mcl_signs/locale/template.txt +++ b/mods/ITEMS/mcl_signs/locale/template.txt @@ -1,4 +1,4 @@ # textdomain: mcl_signs Sign= 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.= -Place the sign at the side to build a wall sign, place it on top of another block to build a sign with a sign post.@nAfter 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. The text can not be changed once it has been written; you have to break and place the sign again.= +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.= diff --git a/mods/ITEMS/mcl_sponges/locale/template.txt b/mods/ITEMS/mcl_sponges/locale/template.txt index 2de972267..d226e8d1f 100644 --- a/mods/ITEMS/mcl_sponges/locale/template.txt +++ b/mods/ITEMS/mcl_sponges/locale/template.txt @@ -1,8 +1,8 @@ # textdomain: mcl_sponges -Sponge= -Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.= -Waterlogged Sponge= -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.= -Riverwaterlogged Sponge= -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.= -A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.= +Sponge=Schwamm +Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.=Schwämme sind Blöcke, die Wasser um sie herum entfernen, wenn sie platziert wurden oder in Berührung mit Wasser kommen, was sie in einen nassen Schwamm verwandelt. +Waterlogged Sponge=Wassergetränkter Schwamm +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.=Ein wassergetränkter Schwamm kann in einem Ofen getrocknet werden, um ihn zu einem (trockenem) Schwamm zu verwandeln. Wenn es einen leeren Eimer im Brennstoffplatz des Ofens gibt, wird das Wasser in den Eimer fließen. +Riverwaterlogged Sponge=Flusswassergetränkter Schwamm +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.=Dies ist ein Schwamm, der triefend nass und voller Flusswasser ist. Er kann in einem Ofen getrocknet werden, um ihn zu einem (trockenem) Schwamm zu verwandeln. Wenn es einen leeren Eimer im Brennstoffplatz des Ofens gibt, wird das Flusswasser in den Eimer fließen. +A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.=Ein Schwamm wird flusswassergetränkt (statt wassergetränkt), wenn er mehr Flusswasser als (normales) Wasser aufsaugt. diff --git a/mods/ITEMS/mcl_stairs/api.lua b/mods/ITEMS/mcl_stairs/api.lua index 059121263..5c892f61b 100644 --- a/mods/ITEMS/mcl_stairs/api.lua +++ b/mods/ITEMS/mcl_stairs/api.lua @@ -102,7 +102,7 @@ function mcl_stairs.register_stair(subname, recipeitem, groups, images, descript minetest.register_node(":mcl_stairs:stair_" .. subname, { description = description, - _doc_items_longdesc = S("Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the bottom or at the upper half of the side of a block will be placed upside down."), + _doc_items_longdesc = S("Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down."), drawtype = "mesh", mesh = "stairs_stair.obj", tiles = images, diff --git a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.de.tr b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.de.tr new file mode 100644 index 000000000..495aa577b --- /dev/null +++ b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.de.tr @@ -0,0 +1,101 @@ +# textdomain: mcl_stairs +Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.=Treppen sind nützlich, um auf höheres Gelände nur mit Gehen zu kommen, man muss nicht springen. Wenn Treppen in einem Eckmuster platziert werden, werden Ecktreppen erzeugt. Treppen, die an die Decke oder der oberen Hälfte eines Blocks platziert werden, werden verkehrt herum platziert. +Double @1=@1 (doppelt) +Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.=Eine Platte ist halb so hoch wie ihr Vollblock-Gegenstück und belegt entweder den unteren oder unteren Teil eines Blocks, je nach dem, wie er platziert wurde. Platten können leicht betreten werden, ohne springen zu müssen. Wird eine Platte auf einer anderen gleichen Platte platziert, ergibt das eine Doppelplatte. +Upper @1=@1 (oben) +Double slabs are full blocks which are created by placing two slabs of the same kind on each other.=Doppelplatten sind ganze Blöcke, die entstehen, wenn zwei gleiche Platten aufeinander gestapelt werden. +Oak Wood Stairs=Eichenholztreppe +Oak Wood Slab=Eichenholzplatte +Double Oak Wood Slab=Doppeleichenholzplatte +Jungle Wood Stairs=Dschungelholztreppe +Jungle Wood Slab=Dschungelholzplatte +Double Jungle Wood Slab=Doppeldschungelholzplatte +Acacia Wood Stairs=Akazienholztreppe +Acacia Wood Slab=Akazienholzplatte +Double Acacia Wood Slab=Doppelakazienholzplatte +Spruce Wood Stairs=Fichtenholztreppe +Spruce Wood Slab=Fichtenholzplatte +Double Spruce Wood Slab=Doppelfichtenholzplatte +Birch Wood Stairs=Birkenholztreppe +Birch Wood Slab=Birkenholzplatte +Double Birch Wood Slab=Doppelbirkenholzplatte +Dark Oak Wood Stairs=Schwarzeichenholzstreppe +Dark Oak Wood Slab=Schwarzeichenholzplatte +Double Dark Oak Wood Slab=Doppelschwarzeichenholzplatte +Stone Stairs=Steintreppe +Stone Slab=Steinplatte +Double Stone Slab=Doppelsteinplatte +Polished Stone Slab=Polierte Steinplatte +Double Polished Stone Slab=Doppelte polierte Steinplatte +Andesite Stairs=Andesittreppe +Andesite Slab=Andesitplatte +Double Andesite Slab=Doppelandesitplatte +Granite Stairs=Granittreppe +Granite Slab=Granitplatte +Double Granite Slab=Doppelgranitplatte +Diorite Stairs=Diorittreppe +Diorite Slab=Dioritplatte +Double Diorite Slab=Doppeldioritplatte +Cobblestone Stairs=Kopfsteinpflastertreppe +Cobblestone Slab=Kopfsteinpflasterplatte +Double Cobblestone Slab=Doppelkopfsteinpflasterplatte +Moss Stone Stairs=Moossteintreppe +Moss Stone Slab=Moossteinplatte +Double Moss Stone Slab=Doppelmoossteinplatte +Brick Stairs=Ziegeltreppe +Brick Slab=Ziegelplatte +Double Brick Slab=Doppelziegelplatte +Sandstone Stairs=Sandsteintreppe +Sandstone Slab=Sandsteinplatte +Double Sandstone Slab=Doppelsandsteinplatte +Smooth Sandstone Stairs=Glatte Sandsteintreppe +Smooth Sandstone Slab=Glatte Sandsteinplatte +Double Smooth Sandstone Slab=Doppelte glatte Sandsteinplatte +Red Sandstone Stairs=Rote Sandsteintreppe +Red Sandstone Slab=Rote Sandsteinplatte +Double Red Sandstone Slab=Doppelte rote Sandsteinplatte +Smooth Red Sandstone Stairs=Glatte rote Sandsteintreppe +Smooth Red Sandstone Slab=Glatte rote Sandsteinplatte +Double Smooth Red Sandstone Slab=Doppelte glatte rote Sandsteinplatte +Stone Bricks Stairs=Steinziegeltreppe +Stone Bricks Slab=Steinziegelplatte +Double Stone Bricks Slab=Doppelsteinziegelplatte +Quartz Stairs=Quarztreppe +Quartz Slab=Quarzplatte +Double Quartz Slab=Doppelquarzplatte +Smooth Quartz Stairs=Glatte Quarztreppe +Smooth Quartz Slab=Glatte Quarzplatte +Double Smooth Quartz Slab=Doppelte glatte Quarzplatte +Nether Brick Stairs=Netherziegeltreppe +Nether Brick Slab=Netherziegelplatte +Double Nether Brick Slab=Doppelte Netherziegelplatte +Red Nether Brick Stairs=Rote Netherbricktreppe +Red Nether Brick Slab=Rote Netherbrickplatte +Double Red Nether Brick Slab=Doppelte rote Netherbricktreppe +End Stone Brick Stairs=Endsteinziegeltreppe +End Stone Brick Slab=Endsteinziegelplatte +Double End Stone Brick Slab=Doppelte Endsteinziegelplatte +Purpur Stairs=Purpurtreppe +Purpur Slab=Purpurplatte +Double Purpur Slab=Doppelte Purpurplatte +Prismarine Stairs=Prismarintreppe +Prismarine Slab=Prismarinplatte +Double Prismarine Slab=Doppelte Prismarinplatte +Prismarine Brick Stairs=Prismarinziegeltreppe +Prismarine Brick Slab=Prismarinziegelplatte +Double Prismarine Brick Slab=Doppelte Prismarinziegelplatte +Dark Prismarine Stairs=Dunkelprismarintreppe +Dark Prismarine Slab=Dunkelprismarinplatte +Double Dark Prismarine Slab=Doppeldunkelprismarinplatte +Polished Andesite Slab=Polierte Andesitplatte +Double Polished Andesite Slab=Doppelte polierte Andesitplatte +Polished Andesite Stairs=Polierte Andesittreppe +Polished Granite Slab=Polierte Granitplatte +Double Polished Granite Slab=Doppelte polierte Granitplatte +Polished Granite Stairs=Polierte Granittreppe +Polished Diorite Slab=Polierte Dioritplatte +Double Polished Diorite Slab=Doppelte polierte Dioritplatte +Polished Diorite Stairs=Polierte Diorittreppe +Mossy Stone Brick Stairs=Moosige Steinziegeltreppe +Mossy Stone Brick Slab=Moosige Steinziegelplatte +Double Mossy Stone Brick Slab=Doppelte Steinziegelplatte diff --git a/mods/ITEMS/mcl_stairs/locale/template.txt b/mods/ITEMS/mcl_stairs/locale/template.txt index 7a0e15db4..bec58b3ae 100644 --- a/mods/ITEMS/mcl_stairs/locale/template.txt +++ b/mods/ITEMS/mcl_stairs/locale/template.txt @@ -1,5 +1,5 @@ # textdomain: mcl_stairs -Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the bottom or at the upper half of the side of a block will be placed upside down.= +Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.= Double @1= Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.= Upper @1= diff --git a/mods/ITEMS/mcl_throwing/init.lua b/mods/ITEMS/mcl_throwing/init.lua index 8d3915c3a..d7e236600 100644 --- a/mods/ITEMS/mcl_throwing/init.lua +++ b/mods/ITEMS/mcl_throwing/init.lua @@ -296,7 +296,7 @@ minetest.register_entity("mcl_throwing:snowball_entity", snowball_ENTITY) minetest.register_entity("mcl_throwing:egg_entity", egg_ENTITY) minetest.register_entity("mcl_throwing:ender_pearl_entity", pearl_ENTITY) -local how_to_throw = S("Hold it in your and and leftclick to throw.") +local how_to_throw = S("Use the punch key to throw.") -- Snowball minetest.register_craftitem("mcl_throwing:snowball", { @@ -313,7 +313,7 @@ minetest.register_craftitem("mcl_throwing:snowball", { -- Egg minetest.register_craftitem("mcl_throwing:egg", { description = S("Egg"), - _doc_items_longdesc = S("Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chickens will pop out of the egg when it hits the ground."), + _doc_items_longdesc = S("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."), _doc_items_usagehelp = how_to_throw, inventory_image = "mcl_throwing_egg.png", stack_max = 16, @@ -325,7 +325,7 @@ minetest.register_craftitem("mcl_throwing:egg", { -- Ender Pearl minetest.register_craftitem("mcl_throwing:ender_pearl", { description = S("Ender Pearl"), - _doc_items_longdesc = S("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, a plant or vines. Each teleportation hurts the user by 5 hit points."), + _doc_items_longdesc = S("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."), _doc_items_usagehelp = how_to_throw, wield_image = "mcl_throwing_ender_pearl.png", inventory_image = "mcl_throwing_ender_pearl.png", diff --git a/mods/ITEMS/mcl_throwing/locale/mcl_throwing.de.tr b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.de.tr new file mode 100644 index 000000000..04eb6be25 --- /dev/null +++ b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.de.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_throwing +@1 used the ender pearl too often.=@1 benutzte die Enderperle zu oft. +Use the punch key to throw.=Benutzen Sie die Schlagtaste zum Werfen. +Snowball=Schneeball +Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.=Schneebälle können geworfen werden oder zum Spaß aus einem Werfer abgefeuert werden. Bei einem Treffer mit einem Schneeball passiert nichts. +Egg=Ei +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.=Eier können geworfen werden oder aus einem Werfer abgefeuert werden. Sie zerbrechen beim Einschlag. Mit etwas Glück werden aus dem Ei eines oder sogar 4 Küken hinausfallen. +Ender Pearl=Enderperle +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.=Eine Enderperle ist eine Gegenstand, der zur Teleportation benutzt werden kann auf Kosten der Gesundheit. Sie kann geworfen werden und teleportiert den Werfer zur Einschlagsstelle, wenn sie einen Block oder eine Pflanze trifft. Jede Teleportation verletzt den Werfer um 5 Trefferpunkte. diff --git a/mods/ITEMS/mcl_throwing/locale/template.txt b/mods/ITEMS/mcl_throwing/locale/template.txt index 126b3ff05..c6c9313f2 100644 --- a/mods/ITEMS/mcl_throwing/locale/template.txt +++ b/mods/ITEMS/mcl_throwing/locale/template.txt @@ -1,9 +1,9 @@ # textdomain: mcl_throwing @1 used the ender pearl too often.= -Hold it in your and and leftclick to throw.= +Use the punch key to throw.= Snowball= Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.= Egg= -Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chickens will pop out of the egg when it hits the ground.= +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.= Ender Pearl= -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, a plant or vines. Each teleportation hurts the user by 5 hit points.= +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.= diff --git a/mods/ITEMS/mcl_tnt/init.lua b/mods/ITEMS/mcl_tnt/init.lua index f18f64b5d..738d6b085 100644 --- a/mods/ITEMS/mcl_tnt/init.lua +++ b/mods/ITEMS/mcl_tnt/init.lua @@ -63,8 +63,8 @@ minetest.register_node("mcl_tnt:tnt", { description = S("TNT"), paramtype = "light", sunlight_propagates = true, - _doc_items_longdesc = S("An explosive device. When it explodes, it will hurt living beings, destroy blocks around it, throw blocks affected by gravity all over the place and light fires. A single 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.", TNT_RANGE), - _doc_items_usagehelp = S("Place the TNT on the ground and ignite it with one of the methods above. Quickly get in safe distance quickly. The TNT will start to be affected by gravity and explodes in 4 seconds."), + _doc_items_longdesc = S("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.", TNT_RANGE), + _doc_items_usagehelp = S("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."), groups = { dig_immediate = 3, tnt = 1, enderman_takable=1 }, mesecons = {effector = { action_on = tnt.ignite, diff --git a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.de.tr b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.de.tr new file mode 100644 index 000000000..51a8ffabc --- /dev/null +++ b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.de.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_tnt +@1 was caught in an explosion.=@1 wurde Opfer einer Explosion. +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.=Ein Sprengstoff. Wenn er explodiert, wird er Lebewesen verletzen und Blöcke in der Nähe zerstören. TNT hat einen Explosionsradius von @1. Mit einer geringen Wahrscheinlichkeit werden Blöcke als Gegenstand abfallen (als ob sie abgebaut worden wären), anstatt völlig zerstört zu werden. +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.=Platizeren sie das TNT und zünden Sie es mit einer der obigen Methoden ab. Begeben Sie sich rasch in eine sichere Entfernung. Das TNT wird anfangen, von der Schwerkraft beeinflusst zu sein und explodiert in 4 Sekunden. diff --git a/mods/ITEMS/mcl_tnt/locale/template.txt b/mods/ITEMS/mcl_tnt/locale/template.txt index c50fea38c..fc3ae612c 100644 --- a/mods/ITEMS/mcl_tnt/locale/template.txt +++ b/mods/ITEMS/mcl_tnt/locale/template.txt @@ -1,5 +1,5 @@ # textdomain: mcl_tnt @1 was caught in an explosion.= TNT= -An explosive device. When it explodes, it will hurt living beings, destroy blocks around it, throw blocks affected by gravity all over the place and light fires. A single 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.= -Place the TNT on the ground and ignite it with one of the methods above. Quickly get in safe distance quickly. The TNT will start to be affected by gravity and explodes in 4 seconds.= +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. +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.= diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index 1a39ff8c0..0a568cb75 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -37,7 +37,9 @@ else end minetest.register_item(":", { type = "none", - _doc_items_longdesc = S("You use your bare hand whenever you are not wielding any item. With your hand you can mine the weakest blocks and deal minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are better than the hand. 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. In Creative Mode, the hand is able to break all blocks instantly."), + _doc_items_longdesc = S("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.").."\n".. + S("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.").."\n".. + S("In Creative Mode, the hand is able to break all blocks instantly."), wield_image = "wieldhand.png", wield_scale = {x=1.0,y=1.0,z=2.0}, -- According to Minecraft Wiki, the exact range is 3.975. @@ -57,7 +59,7 @@ local axe_longdesc = S("An axe is your tool of choice to cut down trees, wood-ba local sword_longdesc = S("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.") local shovel_longdesc = S("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.") local shovel_use = S("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.") -local shears_longdesc = S("Shears are tools to shear sheep, carve pumpkins and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from a grass, leaves and similar blocks.") +local shears_longdesc = S("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.") local shears_use = "To shear a sheep and obtain its wool, rightclick it. To carve a face into a pumpkin and obtain 4 pumpkin seeds, rightclick it on one of its sides. Mining works are usual, but the drops are different for a few blocks." -- Picks diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr new file mode 100644 index 000000000..adb73a23e --- /dev/null +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr @@ -0,0 +1,31 @@ +# 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.=Sie benutzen Ihre nackte Hand, wenn Sie keinen Gegenstand halten. Mit Ihrer Hand können Sie die meisten Blöcke abbauen, aber dies ist die langsamste Methode und nur aus den schwächsten Blöcken werden ihren brauchbaren Gegenstände hinausfallen. Die Hand richtet auch geringfügigen Schaden mit Schlägen an. Die Hand ist oft die letzte Wahl, da richtige Grabewerkzeuge und Waffen viel besser sind. +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.=Wenn Sie einen Gegenstand tragen, der kein Grabewerkzeug oder eine Waffe ist, wird sie sich verhalten, als ob Sie die Hand benutzen würden, wenn Sie etwas abbauen oder schlagen. +In Creative Mode, the hand is able to break all blocks instantly.=Im Kreativmodus kann die Hand alle Blöcke sofort zerstören. +Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.=Spitzhacken sind Grabewerkzeuge, um harte Blöcke wie Stein abzubauen. Eine Spitzhacke kann auch als Waffe benutzt werden, aber das ist recht ineffizient. +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.=Eine Axt ist das Werkzeug zum Abbauen von Bäumen, holzbasieren Blöcken und anderen Blöcken. Äxte richten auch viel Schaden an, aber sie sind ziemlich langsam. +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.=Schwerter sind großartig im Nahkampf, da sie schnell sind, hohen Schaden anrichten und viele Schlachten schlagen können. Schwerter können auch benutzt werden, um bestimmte Blöcke abzuschneiden, so wie Spinnenweben. +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.=Schaufeln sind Werkzeuge zum Ausgraben von groben Blöcken, wie Erde, Sand und Kies. Sie können auch benutzt werden, um Grasblöcke zu Graspfaden zu verwandeln. Schaufeln können als Waffen benutzt werden, aber sie sind sehr schwach. +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.=Um einen Grasblock in einen Graspfad zu verwandeln, benutzen Sie sie auf der Oberseite oder einer Seite eines Grasblocks. Das funktioniert nur, wenn sich Luft über dem Grasblock befindet. +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.=Eine Schere ist ein Werkzeug, um Schafe zu scheren und ein paar Blocktypen abzubauen. Sie ist ein besonderes Grabewerkzeug, das benutzt werden kann, um den ursprünglichen Gegenstand von Gras, Blättern und ähnlichen Blöcken, die abgeschnitten werden müssen, zu erhalten. +Wooden Pickaxe=Holzspitzhacke +Stone Pickaxe=Steinspitzhacke +Iron Pickaxe=Eisenspitzhacke +Golden Pickaxe=Goldspitzhacke +Diamond Pickaxe=Diamantspitzhacke +Wooden Shovel=Holzschaufel +Stone Shovel=Steinschaufel +Iron Shovel=Eisenschaufel +Golden Shovel=Goldschaufel +Diamond Shovel=Diamantschaufel +Wooden Axe=Holzaxt +Stone Axe=Steinaxt +Iron Axe=Eisenaxt +Golden Axe=Goldaxt +Diamond Axe=Diamantaxt +Wooden Sword=Holzschwert +Stone Sword=Steinschwert +Iron Sword=Eisenschwert +Golden Sword=Goldschwert +Diamond Sword=Diamantschwert +Shears=Schere diff --git a/mods/ITEMS/mcl_tools/locale/template.txt b/mods/ITEMS/mcl_tools/locale/template.txt index 8d90e42ca..8e3fa90e6 100644 --- a/mods/ITEMS/mcl_tools/locale/template.txt +++ b/mods/ITEMS/mcl_tools/locale/template.txt @@ -1,11 +1,13 @@ # textdomain: mcl_tools -You use your bare hand whenever you are not wielding any item. With your hand you can mine the weakest blocks and deal minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are better than the hand. 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. In Creative Mode, the hand is able to break all blocks instantly.= +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.= +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.= +In Creative Mode, the hand is able to break all blocks instantly.= Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.= 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.= 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.= 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.= 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.= -Shears are tools to shear sheep, carve pumpkins and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from a grass, leaves and similar blocks.= +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.= Wooden Pickaxe= Stone Pickaxe= Iron Pickaxe= diff --git a/mods/ITEMS/mcl_torches/locale/mcl_torches.de.tr b/mods/ITEMS/mcl_torches/locale/mcl_torches.de.tr new file mode 100644 index 000000000..224106abf --- /dev/null +++ b/mods/ITEMS/mcl_torches/locale/mcl_torches.de.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_torches +Torch=Fackel +Torches are light sources which can be placed at the side or on the top of most blocks.=Fackeln sind Lichtquellen, die an der Seite oder der Oberseite der meisten Blöcke platziert werden können. diff --git a/mods/ITEMS/mcl_totems/locale/template.txt b/mods/ITEMS/mcl_totems/locale/template.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.de.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.de.tr new file mode 100644 index 000000000..d4e7a6400 --- /dev/null +++ b/mods/ITEMS/mcl_walls/locale/mcl_walls.de.tr @@ -0,0 +1,16 @@ +# 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.=Ein Stück Mauer. Mit einem einfachen Sprung kann es nicht übersprungen werden. Wenn mehrere von diesen Blöcken nebeneinander platziert werden, werden sie automatisch ein nettes Mauerbauwerk ergeben. +Cobblestone Wall=Kopfsteinpflastermauer +Mossy Cobblestone Wall=Moosige Kopfsteinpflastermauer +Andesite Wall=Andesitmauer +Granite Wall=Granitmauer +Diorite Wall=Dioritmauer +Brick Wall=Ziegelmauer +Sandstone Wall=Sandsteinmauer +Red Sandstone Wall=Rote Sandsteinmauer +Stone Brick Wall=Steinziegelmauer +Mossy Stone Brick Wall=Moosige Steinziegelmauer +Prismarine Wall=Prismarinmauer +End Stone Brick Wall=Endsteinziegelmauer +Nether Brick Wall=Netherziegelmauer +Red Nether Brick Wall=Rote Netherziegelmauer diff --git a/mods/ITEMS/mcl_wool/locale/mcl_wool.de.tr b/mods/ITEMS/mcl_wool/locale/mcl_wool.de.tr new file mode 100644 index 000000000..de758d1e0 --- /dev/null +++ b/mods/ITEMS/mcl_wool/locale/mcl_wool.de.tr @@ -0,0 +1,35 @@ +# textdomain: mcl_wool +White Wool=Weiße Wolle +White Carpet=Weißer Teppich +Grey Wool=Graue Wolle +Grey Carpet=Grauer Teppich +Light Grey Wool=Hellgraue Wolle +Light Grey Carpet=Hellgrauer Teppich +Black Wool=Schwarze Wolle +Black Carpet=Schwarzer Teppich +Red Wool=Rote Wolle +Red Carpet=Roter Teppich +Yellow Wool=Gelbe Wolle +Yellow Carpet=Gelber Teppich +Green Wool=Grüne Wolle +Green Carpet=Grüner Teppich +Cyan Wool=Türkise Wolle +Cyan Carpet=Türkiser Teppich +Blue Wool=Blaue Wolle +Blue Carpet=Blauer Teppich +Magenta Wool=Magenta Wolle +Magenta Carpet=Magenta Teppich +Orange Wool=Orange Wolle +Orange Carpet=Orange Teppich +Purple Wool=Violette Wolle +Purple Carpet=Violetter Teppich +Brown Wool=Braune Wolle +Brown Carpet=Brauner Teppich +Pink Wool=Rosa Wolle +Pink Carpet=Rosa Teppich +Lime Wool=Lindgrüne Wolle +Lime Carpet=Lindgrüner Teppich +Light Blue Wool=Hellblaue Wolle +Light Blue Carpet=Hellblauer Teppich +Wool is a decorative block which comes in many different colors.=Wolle ist ein dekorativer Block, den es in vielen verschiedenen Farben gibt. +Carpets are thin floor covers which come in many different colors.=Teppiche sind dünne Bodenbeläge, die es in vielen verschiedenen Farben gibt. diff --git a/mods/ITEMS/mclx_fences/locale/mclx_fences.de.tr b/mods/ITEMS/mclx_fences/locale/mclx_fences.de.tr new file mode 100644 index 000000000..9aab02648 --- /dev/null +++ b/mods/ITEMS/mclx_fences/locale/mclx_fences.de.tr @@ -0,0 +1,4 @@ +# textdomain: mclx_fences +Red Nether Brick Fence=Roter Netherziegelzaun +Red Nether Brick Fence Gate=Rotes Netherziegelzauntor +Nether Brick Fence Gate=Netherziegelzauntor diff --git a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr new file mode 100644 index 000000000..b2c11ed67 --- /dev/null +++ b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr @@ -0,0 +1,31 @@ +# textdomain: mclx_stairs +Oak Bark Stairs=Eichenrindentreppe +Oak Bark Slab=Eichenrindenplatte +Double Oak Bark Slab=Doppeleichenrindenplatte +Acacia Bark Stairs=Akazienrindentreppe +Acacia Bark Slab=Akazienrindenplatte +Double Acacia Bark Slab=Doppelakazienrindenplatte +Spruce Bark Stairs=Fichtenrindentreppe +Spruce Bark Slab=Fichtenrindenplatte +Double Spruce Bark Slab=Doppelfichtenrindenplatte +Birch Bark Stairs=Birkenrindentreppe +Birch Bark Slab=Birkenrindenplatte +Double Birch Bark Slab=Doppelbirkenrindenplatte +Jungle Bark Stairs=Dschungelrindentreppe +Jungle Bark Slab=Dschungelrindenplatte +Double Jungle Bark Slab=Doppelschungelbirkenplatte +Dark Oak Bark Stairs=Schwarzeichenrindentreppe +Dark Oak Bark Slab=Schwarzeichenrindenplatte +Double Dark Oak Bark Slab=Doppelschwarzeichenrindenplatte +Lapis Lazuli Slab=Lapislazuliplatte +Double Lapis Lazuli Slab=Doppellapislazuliplatte +Lapis Lazuli Stairs=Lapislazulitreppe +Slab of Gold=Goldplatte +Double Slab of Gold=Doppelgoldplatte +Stairs of Gold=Goldtreppe +Slab of Iron=Eisenplatte +Double Slab of Iron=Doppeleisenplatte +Stairs of Iron=Eisentreppe +Cracked Stone Brick Stairs=Rissige Steinziegeltreppe +Cracked Stone Brick Slab=Rissige Steinziegelplatte +Double Cracked Stone Brick Slab=Doppelte rissige Steinziegelplatte diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/locale/3d_armor.de.tr b/mods/ITEMS/minetest-3d_armor/3d_armor/locale/3d_armor.de.tr new file mode 100644 index 000000000..12c7c09eb --- /dev/null +++ b/mods/ITEMS/minetest-3d_armor/3d_armor/locale/3d_armor.de.tr @@ -0,0 +1,23 @@ +# textdomain: 3d_armor +This is a piece of equippable armor which reduces the amount of damage you receive.=Dies ist ein Teil einer tragbaren Rüstung, die die Menge an Schaden, den Sie erleiden, reduziert. +To equip it, put it on the corresponding armor slot in your inventory menu.=Um es zu tragen, legen Sie es in den passenden Rüstungsplatz in ihrem Inventarmenü. +Leather Cap=Lederkappe +Iron Helmet=Eisenhelm +Golden Helmet=Goldhelm +Diamond Helmet=Diamanthelm +Chain Helmet=Kettenhelm +Leather Tunic=Ledertunika +Iron Chestplate=Eisenbrustpanzer +Golden Chestplate=Goldbrustpanzer +Diamond Chestplate=Diamantbrustpanzer +Chain Chestplate=Kettenbrustpanzer +Leather Pants=Lederhose +Iron Leggings=Eisenbeinlinge +Golden Leggings=Goldbeinlinge +Diamond Leggings=Diamantbeinlinge +Chain Leggings=Kettenbeinlinge +Leather Boots=Lederstiefel +Iron Boots=Eisenstiefel +Golden Boots=Goldstiefel +Diamond Boots=Diamantstiefel +Chain Boots=Kettenstiefel diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua index 332970b31..c2282f2ca 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua @@ -92,7 +92,7 @@ end minetest.register_node("3d_armor_stand:armor_stand", { description = S("Armor Stand"), _doc_items_longdesc = S("An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand."), - _doc_items_usagehelp = S("Hold an armor item in your hand and rightclick the armor stand to put it on the armor stand. To take a piece of armor from the armor stand, select your hand and rightclick the armor stand. You'll retrieve the first armor item from above."), + _doc_items_usagehelp = S("Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand."), drawtype = "mesh", mesh = "3d_armor_stand.obj", inventory_image = "3d_armor_stand_item.png", diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/locale/3d_armor_stand.de.tr b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/locale/3d_armor_stand.de.tr new file mode 100644 index 000000000..b947719bb --- /dev/null +++ b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/locale/3d_armor_stand.de.tr @@ -0,0 +1,4 @@ +# textdomain: 3d_armor_stand +Armor Stand=Rüstungsständer +An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=Ein Rüstungsständer ist ein dekoratives Objekt, welches verschiedene Teile einer Rüstung präsentiert. Alles, was Spieler als Rüstung tragen kann, kann auch an einem Rüstungsständer platziert werden. +Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=Platzieren Sie einfach einen Rüstungsgegenstand auf den Rüstungsständer. Um das oberte Rüstungsteil zu nehmen, wählen Sie Ihre Hand aus und benutzen Sie die Platzieren-Taste auf dem Rüstungsständer. diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/locale/template.txt b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/locale/template.txt index d05dab07c..9f7d0ca4c 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/locale/template.txt +++ b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/locale/template.txt @@ -1,4 +1,4 @@ # textdomain: 3d_armor_stand Armor Stand= An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.= -Hold an armor item in your hand and rightclick the armor stand to put it on the armor stand. To take a piece of armor from the armor stand, select your hand and rightclick the armor stand. You'll retrieve the first armor item from above.= +Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.= diff --git a/mods/ITEMS/xpanes/locale/xpanes.de.tr b/mods/ITEMS/xpanes/locale/xpanes.de.tr new file mode 100644 index 000000000..7c3c430ef --- /dev/null +++ b/mods/ITEMS/xpanes/locale/xpanes.de.tr @@ -0,0 +1,21 @@ +# textdomain: xpanes +Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.=Glasscheiben sind dünne Glasschichten, die sich mit ihren Nachbarn automatisch verbinden. +Iron Bars=Eisenstangen +Iron bars neatly connect to their neighbors as you build them.=Eisenstangen verbinden sich mit den Nachbarn, wenn sie gebaut werden. +Glass Pane=Glasscheibe +Red Stained Glass Pane=Rot gefärbtes Buntglas +Green Stained Glass Pane=Grün gefärbtes Buntglas +Blue Stained Glass Pane=Blau gefärbtes Buntglas +Light Blue Stained Glass Pane=Hellblau gefärbtes Buntglas +Black Stained Glass Pane=Schwarz gefärbtes Buntglas +White Stained Glass Pane=Weiß gefärbtes Buntglas +Yellow Stained Glass Pane=Gelb gefärbtes Buntglas +Brown Stained Glass Pane=Braun gefärbtes Buntglas +Orange Stained Glass Pane=Orange gefärbtes Buntglas +Pink Stained Glass Pane=Rosa gefärbtes Buntglas +Grey Stained Glass Pane=Grau gefärbtes Buntglas +Lime Stained Glass Pane=Lindgrün gefärbtes Buntglas +Light Grey Stained Glass Pane=Hellgrau gefärbtes Buntglas +Magenta Stained Glass Pane=Magenta gefärbtes Buntglas +Purple Stained Glass Pane=Violett gefärbtes Buntglas +Cyan Stained Glass Pane=Türkis gefärbtes Buntglas From af4aa6c2ecd5882dbe6175805592dc99b9528109 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 16 Mar 2019 00:21:17 +0100 Subject: [PATCH 198/379] Change German translation of Shulker --- mods/ENTITIES/mobs_mc/shulker.lua | 2 +- .../locale/mcl_death_messages.de.tr | 2 +- mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr | 36 +++++++++---------- .../mcl_hoppers/locale/mcl_hoppers.de.tr | 2 +- .../mcl_mobitems/locale/mcl_mobitems.de.tr | 4 +-- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 9eff2132d..b3cd3c6e4 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -78,7 +78,7 @@ mobs:register_arrow("mobs_mc:shulkerbullet", { }) -mobs:register_egg("mobs_mc:shulker", S("Shulker"), "mobs_mc_spawn_icon_shulker.png", 0) +mobs:register_egg("mobs_mc:shulker", S("Schulker"), "mobs_mc_spawn_icon_shulker.png", 0) mobs:spawn_specific("mobs_mc:shulker", mobs_mc.spawn.end_city, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 5000, 2, mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max) diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr index 11b0eb3da..665f6f688 100644 --- a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr @@ -35,7 +35,7 @@ A ghast scared @1 to death.=Ein Ghast hat @1 zu Tode erschrocken. @1 was killed by an iron golem.=@1 wurde von einem Eisengolem getötet. @1 was killed by a polar_bear.=@1 wurde von einem Eisbären getötet. @1 was killed by a killer bunny.=@1 wurde von einem Killerkaninchen getötet. -@1 was killed by a shulker.=@1 wurde von einem Shulker getötet. +@1 was killed by a shulker.=@1 wurde von einem Schulker getötet. @1 was killed by a silverfish.=@1 wurde von einem Silberfischchen getötet. @1 was killed by a skeleton.=@1 wurde von einem Skelett getötet. @1 was killed by a stray.=@1 wurde von einem Eiswanderer getötet. diff --git a/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr b/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr index d6f5f4c42..9bf54489b 100644 --- a/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr +++ b/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr @@ -7,21 +7,21 @@ A trapped chest is a container which provides 27 inventory slots. When it is ope Ender Chest=Endertruhe Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.=Endertruhen gewähren Ihnen Zugriff zu einem einzigartigen persönlichem interdimensionalem Inventar mit 27 Plätzen. Dieses Inventar ist das gleiche, egal, welche Endertruhe sie benutzen. Wenn Sie einen Gegenstand in eine Endertruhe platzieren, werden Sie sie in allen anderen Endertruhen vorhinden. Jeder Spieler wird nur seine eigenen Gegenstände sehen, aber nicht die der anderen Spieler. Rightclick the ender chest to access your personal interdimensional inventory.=Rechtsklicken Sie die Endertruhe, um auf Ihr persönliches interdimensionales Inventar zuzugreifen. -White Shulker Box=Weiße Shulkerkiste -Light Grey Shulker Box=Hellgraue Shulkerkiste -Orange Shulker Box=Orange Shulkerkiste -Cyan Shulker Box=Türkise Shulkerkiste -Magenta Shulker Box=Magenta Shulkerkiste -Purple Shulker Box=Violette Shulkerkiste -Light Blue Shulker Box=Hellblaue Shulkerkiste -Blue Shulker Box=Blaue Shulkerkiste -Yellow Shulker Box=Gelbe Shulkerkiste -Brown Shulker Box=Braune Shulkerkiste -Lime Shulker Box=Lindgrüne Shulkerkiste -Green Shulker Box=Grüne Shulkerkiste -Pink Shulker Box=Rosa Shulkerkiste -Red Shulker Box=Rote Shulkerkiste -Grey Shulker Box=Graue Shulkerkiste -Black Shulker Box=Schwarze Shulkerkiste -A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.=Eine Shulkerkiste ist ein tragbarer Behälter der 27 Inventarplätze für alle Gegenstände außer Shulkerkisten bietet. Shulkerkisten behalten ihr Inventar, wenn sie abgebaut werden, also können Shulkerkisten so wie ihr Inhalt als einzelne Gegenstände mitgenommen werden. Shulkerkisten gibt es in vielen verschiedenen Farben. -To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out.=Um auf das Inventar einer Shulkerkiste zuzugreifen, platzieren Sie sie und rechtsklicken sie auf ihr. Um eine Shulkerkiste und ihren Inhalt mitzunehmen, bauen Sie sie einfach ab und sammeln Sie sie auf, der Inhalt will nicht hinausfallen. +White Shulker Box=Weiße Schulkerkiste +Light Grey Shulker Box=Hellgraue Schulkerkiste +Orange Shulker Box=Orange Schulkerkiste +Cyan Shulker Box=Türkise Schulkerkiste +Magenta Shulker Box=Magenta Schulkerkiste +Purple Shulker Box=Violette Schulkerkiste +Light Blue Shulker Box=Hellblaue Schulkerkiste +Blue Shulker Box=Blaue Schulkerkiste +Yellow Shulker Box=Gelbe Schulkerkiste +Brown Shulker Box=Braune Schulkerkiste +Lime Shulker Box=Lindgrüne Schulkerkiste +Green Shulker Box=Grüne Schulkerkiste +Pink Shulker Box=Rosa Schulkerkiste +Red Shulker Box=Rote Schulkerkiste +Grey Shulker Box=Graue Schulkerkiste +Black Shulker Box=Schwarze Schulkerkiste +A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.=Eine Schulkerkiste ist ein tragbarer Behälter der 27 Inventarplätze für alle Gegenstände außer Schulkerkisten bietet. Schulkerkisten behalten ihr Inventar, wenn sie abgebaut werden, also können Schulkerkisten so wie ihr Inhalt als einzelne Gegenstände mitgenommen werden. Schulkerkisten gibt es in vielen verschiedenen Farben. +To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out.=Um auf das Inventar einer Schulkerkiste zuzugreifen, platzieren Sie sie und rechtsklicken sie auf ihr. Um eine Schulkerkiste und ihren Inhalt mitzunehmen, bauen Sie sie einfach ab und sammeln Sie sie auf, der Inhalt will nicht hinausfallen. diff --git a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.de.tr b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.de.tr index 2a373db54..f3e2d2ac0 100644 --- a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.de.tr +++ b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.de.tr @@ -1,6 +1,6 @@ # textdomain: mcl_hoppers Hopper=Trichter -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.=Trichter sind Behälter mit 5 Inventarplätzen. Sie sammeln fallengelassene Gegenstände oberhalb auf, nehmen sich Gegenstände von einem Behälter oberhalb auf und versuchen, ihren Inhalt in einen benachbarten Behälter zu befördern. Trichter können entweder nach unten oder zur Seite zeigen. Trichter interagieren mit Truhen, Spendern, Werfern, Shulkerkisten, Öfen und Trichtern. +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.=Trichter sind Behälter mit 5 Inventarplätzen. Sie sammeln fallengelassene Gegenstände oberhalb auf, nehmen sich Gegenstände von einem Behälter oberhalb auf und versuchen, ihren Inhalt in einen benachbarten Behälter zu befördern. Trichter können entweder nach unten oder zur Seite zeigen. Trichter interagieren mit Truhen, Spendern, Werfern, Schulkerkisten, Öfen und Trichtern. Hoppers interact with containers the following way:=Trichter interagieren mit Behältern auf diese Weise: • 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=• Öfen: Trichter von oberhalb werden Gegenstände in den Quellplatz befördern. Trichter von unterhalb werden Gegenstände aus dem Ausgabeplatz nehmen. Sie werden Gegenstände auch aus dem Brennstoffplatz nehmen, wenn sie als Brennstoff ungeeignet sind. Seitwärtstrichter, die zum Ofen zeigen, befördern Gegenstände in den Brennstoffplatz. • Ender chests: No interaction.=• Endertruhen: Keine Interaktion. diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr index 15f826529..95e91814d 100644 --- a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr @@ -51,8 +51,8 @@ Saddle=Sattel Saddles can be put on some animals in order to mount them.=Sattel können auf einigen Tieren platziert werden, um sich aufzusatteln. Rabbit Stew=Kaninchenragout Rabbit stew is a very nutricious food item.=Kaninchenragout ist ein sehr nahrhaftes Lebensmittel. -Shulker Shell=Shulkerschale -Shulker shells are used in crafting. They are dropped from dead shulkers.=Shulkerschalen werden für die Fertigung verwendet. Sie werden von toten Shulkern fallen gelassen. +Shulker Shell=Schulkerschale +Shulker shells are used in crafting. They are dropped from dead shulkers.=Schulkerschalen werden für die Fertigung verwendet. Sie werden von toten Schulkern fallen gelassen. Slimeball=Schleimkugel Slimeballs are used in crafting. They are dropped from slimes.=Schleimkugeln werden in der Fertigung verwendet. Sie werden von Schleimen fallen gelassen. Gunpowder=Schießpulver From 03db150175918797a714825e4b4d993c7a6b297f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 16 Mar 2019 00:27:05 +0100 Subject: [PATCH 199/379] Add missing fence translation --- mods/ITEMS/mcl_fences/init.lua | 2 +- mods/ITEMS/mcl_fences/locale/mcl_fences.de.tr | 1 + mods/ITEMS/mcl_fences/locale/template.txt | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_fences/init.lua b/mods/ITEMS/mcl_fences/init.lua index 1e2539faa..c46997e7f 100644 --- a/mods/ITEMS/mcl_fences/init.lua +++ b/mods/ITEMS/mcl_fences/init.lua @@ -290,7 +290,7 @@ end -- Nether Brick Fence (without fence gate!) -mcl_fences.register_fence("nether_brick_fence", "Nether Brick Fence", "mcl_fences_fence_nether_brick.png", {pickaxey=1, deco_block=1, fence_nether_brick=1}, 2, 30, {"group:fence_nether_brick"}, mcl_sounds.node_sound_stone_defaults()) +mcl_fences.register_fence("nether_brick_fence", S("Nether Brick Fence"), "mcl_fences_fence_nether_brick.png", {pickaxey=1, deco_block=1, fence_nether_brick=1}, 2, 30, {"group:fence_nether_brick"}, mcl_sounds.node_sound_stone_defaults()) minetest.register_craft({ output = 'mcl_fences:nether_brick_fence 6', diff --git a/mods/ITEMS/mcl_fences/locale/mcl_fences.de.tr b/mods/ITEMS/mcl_fences/locale/mcl_fences.de.tr index 1b77e8a35..a55eaebfd 100644 --- a/mods/ITEMS/mcl_fences/locale/mcl_fences.de.tr +++ b/mods/ITEMS/mcl_fences/locale/mcl_fences.de.tr @@ -14,3 +14,4 @@ Dark Oak Fence=Schwarzeichenzaun Dark Oak Fence Gate=Schwarzeichenzauntor Acacia Fence=Akazienzaun Acacia Fence Gate=Akazienzauntor +Nether Brick Fence=Netherziegelzaun diff --git a/mods/ITEMS/mcl_fences/locale/template.txt b/mods/ITEMS/mcl_fences/locale/template.txt index 9eaee4e40..3a5c14ae3 100644 --- a/mods/ITEMS/mcl_fences/locale/template.txt +++ b/mods/ITEMS/mcl_fences/locale/template.txt @@ -14,3 +14,4 @@ Dark Oak Fence= Dark Oak Fence Gate= Acacia Fence= Acacia Fence Gate= +Nether Brick Fence= From d45d53e455ced5e3ecb8b169e6c6bb51274cc502 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 16 Mar 2019 02:00:48 +0100 Subject: [PATCH 200/379] German translation: Redstone --- mods/ITEMS/REDSTONE/mcl_comparators/init.lua | 2 +- .../locale/mcl_comparators.de.tr | 9 ++++++ .../mcl_comparators/locale/template.txt | 2 +- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 32 +++++++++---------- .../locale/mcl_dispensers.de.tr | 22 +++++++++++++ .../mcl_dispensers/locale/template.txt | 17 +++++++++- mods/ITEMS/REDSTONE/mcl_droppers/init.lua | 2 +- .../mcl_droppers/locale/mcl_droppers.de.tr | 6 ++++ .../REDSTONE/mcl_droppers/locale/template.txt | 2 +- mods/ITEMS/REDSTONE/mcl_observers/init.lua | 3 +- .../mcl_observers/locale/mcl_observers.de.tr | 4 +++ .../mcl_observers/locale/template.txt | 2 +- mods/ITEMS/REDSTONE/mesecons_button/init.lua | 25 ++++++++------- .../locale/mesecons_button.de.tr | 11 +++++++ .../mesecons_button/locale/template.txt | 11 +++++++ .../REDSTONE/mesecons_commandblock/init.lua | 10 +++--- .../locale/mesecons_commandblock.de.tr | 28 ++++++++++++++++ .../mesecons_commandblock/locale/template.txt | 22 ++++++++++--- mods/ITEMS/REDSTONE/mesecons_delayer/init.lua | 2 +- .../locale/mesecons_delayer.de.tr | 9 ++++++ .../mesecons_delayer/locale/template.txt | 2 +- .../REDSTONE/mesecons_lightstone/init.lua | 6 ++-- .../locale/mesecons_lightstone.de.tr | 3 ++ .../mesecons_lightstone/locale/template.txt | 3 ++ .../locale/mesecons_noteblock.de.tr | 10 ++++++ .../mesecons_noteblock/locale/template.txt | 2 +- mods/ITEMS/REDSTONE/mesecons_pistons/init.lua | 2 +- .../locale/mesecons_pistons.de.tr | 6 ++++ .../mesecons_pistons/locale/template.txt | 2 +- .../locale/mesecons_pressureplates.de.tr | 12 +++++++ .../REDSTONE/mesecons_solarpanel/init.lua | 4 +-- .../locale/mesecons_solarpanel.de.tr | 7 ++++ .../mesecons_solarpanel/locale/template.txt | 2 ++ mods/ITEMS/REDSTONE/mesecons_torch/init.lua | 6 +--- .../locale/mesecons_torch.de.tr | 6 ++++ .../mesecons_torch/locale/template.txt | 6 +--- .../REDSTONE/mesecons_walllever/init.lua | 2 +- .../locale/mesecons_walllever.de.tr | 4 +++ .../mesecons_walllever/locale/template.txt | 2 +- mods/ITEMS/REDSTONE/mesecons_wires/init.lua | 2 +- .../locale/mesecons_wires.de.tr | 10 ++++++ 41 files changed, 254 insertions(+), 66 deletions(-) create mode 100644 mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.de.tr create mode 100644 mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.de.tr create mode 100644 mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.de.tr create mode 100644 mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.de.tr create mode 100644 mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.de.tr create mode 100644 mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr create mode 100644 mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.de.tr create mode 100644 mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.de.tr create mode 100644 mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.de.tr create mode 100644 mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.de.tr create mode 100644 mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.de.tr create mode 100644 mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.de.tr create mode 100644 mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.de.tr create mode 100644 mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.de.tr create mode 100644 mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.de.tr diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua index bbd7410ef..f85586b50 100644 --- a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua @@ -230,7 +230,7 @@ for _, state in pairs{mesecon.state.on, mesecon.state.off} do usagehelp = S("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.").."\n".. S("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.").."\n".. - S("The side inputs are only powered by normal redstone power. The redstone can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by a rightclick.").."\n\n".. + S("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.").."\n\n".. S("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.").."\n".. S("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.") else diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.de.tr b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.de.tr new file mode 100644 index 000000000..2e378ef7b --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.de.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_comparators +Redstone comparators are multi-purpose redstone components.=Redstonekomparatoren sind Redstonekomponenten mit vielen Verwendungszwecken. +They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.=Sie können ein Redstonesignal übertragen, erkennen, ob ein Block Gegenstände enthält und mehrere Signale vergleichen. +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.=Ein Redstonekomparator hat 1 Haupteingang, 2 Seiteneingänge und 1 Ausgang. Der Ausgang ist in Pfeilrichtung, der Haupteingang ist in der gegenüberliegenden Richtung. Die anderen 2 Seiten sind die Seiteneingänge. +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.=Der Haupteingang kann auf 2 Weisen versorgt werden: Erstens, kann er direkt von Redstoneenergie wie bei jeder anderen Komponente versorgt werden. Zweitens wird er versorgt, wenn, und nur wenn ein Behälter (wie eine Truhe) vor dem Komporator platziert wurde und der Behälter mindestens einen Gegenstand enthält. +The side inputs are only powered by normal redstone power. The redstone 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.=Die Seiteneingänge akzeptieren nur normale Redstoneenergie. Der Redstonekomparator kann in zwei Modi agieren: Übertragungsmodus und Subtraktionsmodus. Er fängt im Übertragungsmodus an. Der Modus wird beim Benutzen des Blocks geändert. +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.=Übertragungsmodus:@nDie vordere Fackel ist eingefahren und leuchtet nicht auf. Die Ausgabe gibt ein Signal, wenn, nur nur wenn der Haupteingang bestromt wird. Die zwei Seiteneingänge werden ignoriert. +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.=Subtraktionsmodus:@nDie vordere Fackel leuchtet auf. Die Ausgabe gibt ein Signal wenn, nur nur wenn der Haupteingang versorgt wird und keiner der Seiteneingänge bestromt ist. +Redstone Comparator=Redstonekomparator diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/locale/template.txt b/mods/ITEMS/REDSTONE/mcl_comparators/locale/template.txt index 7934a4cb8..0f7cb9aba 100644 --- a/mods/ITEMS/REDSTONE/mcl_comparators/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mcl_comparators/locale/template.txt @@ -3,7 +3,7 @@ Redstone comparators are multi-purpose redstone components.= They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.= 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.= 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.= -The side inputs are only powered by normal redstone power. The redstone can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by a rightclick.= +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.= 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.= 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.= Redstone Comparator= diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index d24fc858f..02c6884d1 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -284,25 +284,25 @@ local dispenserdef = { local horizontal_def = table.copy(dispenserdef) horizontal_def.description = S("Dispenser") horizontal_def._doc_items_longdesc = S("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.") -horizontal_def._doc_items_usagehelp = S("Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Rightclick the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a single random item.").."\n\n".. +horizontal_def._doc_items_usagehelp = S("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.").."\n\n".. S("The dispenser will do different things, depending on the dispensed item:").."\n\n".. -S([[• Arrows: Are launched -• Eggs and snowballs: Are thrown -• Fire charges: Are fired in a straight line -• Armor: Will be equipped to players and armor stands -• Boats: Are placed on water or are dropped -• Minecart: Are placed on rails or are dropped -• Bone meal: Is applied on the block it is facint -• Empty buckets: Are used to collect a liquid source -• Filled buckets: Are used to place a liquid source -• Heads, pumpkins: Equipped to players and armor stands, or placed as a block -• Shulker boxes: Are placed as a block -• TNT: Is placed and ignited -• Flint and steel: Is used to ignite a fire in air and to ignite TNT -• Spawn eggs: Will summon the mob they contain -• Other items: Are simply dropped]]) +S("• Arrows: Are launched").."\n".. +S("• Eggs and snowballs: Are thrown").."\n".. +S("• Fire charges: Are fired in a straight line").."\n".. +S("• Armor: Will be equipped to players and armor stands").."\n".. +S("• Boats: Are placed on water or are dropped").."\n".. +S("• Minecart: Are placed on rails or are dropped").."\n".. +S("• Bone meal: Is applied on the block it is facing").."\n".. +S("• Empty buckets: Are used to collect a liquid source").."\n".. +S("• Filled buckets: Are used to place a liquid source").."\n".. +S("• Heads, pumpkins: Equipped to players and armor stands, or placed as a block").."\n".. +S("• Shulker boxes: Are placed as a block").."\n".. +S("• TNT: Is placed and ignited").."\n".. +S("• Flint and steel: Is used to ignite a fire in air and to ignite TNT").."\n".. +S("• Spawn eggs: Will summon the mob they contain").."\n".. +S("• Other items: Are simply dropped") horizontal_def.after_place_node = function(pos, placer, itemstack, pointed_thing) setup_dispenser(pos) diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.de.tr b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.de.tr new file mode 100644 index 000000000..936a18107 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.de.tr @@ -0,0 +1,22 @@ +# textdomain: mcl_dispensers +Dispenser=Werfer +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.=Ein Werfer ist eine Block, der als eine Redstonekomponente fungiert die, wenn sie mit Redstoneenergie versorgt ist, einen Gegenstand auswirft. Er hat einen Behälter mit 9 Inventarplätzen. +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.=Platzieren Sie den Werfer in einer von 6 möglichen Richtungen. Das „Loch“ ist die Stelle, aus der Gegenstände aus dem Werfer fliegen. Benutzen Sie den Werfer, um auf das Inventar zuzugreifen. +The dispenser will do different things, depending on the dispensed item:=Der Werfer wird, abhängig vom geworfenem Gegenstand, unterschiedliche Dinge tun: +• Arrows: Are launched=• Pfeile: Werden gefeuert +• Eggs and snowballs: Are thrown=• Eier und Schneebälle: Werden geworfen +• Fire charges: Are fired in a straight line=• Feuerkugeln: Werden schnurgerade abgefeuert +• Armor: Will be equipped to players and armor stands=• Rüstung: Spieler und Rüstungsständer werden ausgerüstet +• Boats: Are placed on water or are dropped=• Werden auf Wasser platziert oder abgeworfen +• Minecart: Are placed on rails or are dropped=• Werden auf Schienen platziert oder abgeworfen +• Bone meal: Is applied on the block it is facing=• Knochenmehl: Wird auf den Block, auf den er zeigt, angewandt +• Empty buckets: Are used to collect a liquid source=• Leere Eimer: Sammeln Flüssigkeitsquelle auf +• Filled buckets: Are used to place a liquid source=• Volle Eimer: Platzieren eine Flüssigkeitsquelle +• Heads, pumpkins: Equipped to players and armor stands, or placed as a block=• Köpfe, Kürbisse: Spieler und Rüstungsständer werden ausgerüstet, oder wird als Block platziert +• Shulker boxes: Are placed as a block=Schulkerkisten: Werden als Block platziert +• TNT: Is placed and ignited=• TNT: Wird platzierd unt angezündet +• Flint and steel: Is used to ignite a fire in air and to ignite TNT=• Endzündet ein Feuer in der Luft und zündet TNT an +• Spawn eggs: Will summon the mob they contain=• Spawn-Eier: Beschwören einen Mob +• Other items: Are simply dropped=• Andere Gegenstände: Werden fallen gelassen +Downwards-Facing Dispenser=Nach unten zeigender Werfer +Upwards-Facing Dispenser=Nach oben zeigender Werfer diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/template.txt b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/template.txt index a7a7fb0e0..f8262a814 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/template.txt @@ -1,7 +1,22 @@ # textdomain: mcl_dispensers Dispenser= 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.= -Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Rightclick the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a single random item.= +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.= The dispenser will do different things, depending on the dispensed item:= +• Arrows: Are launched= +• Eggs and snowballs: Are thrown= +• Fire charges: Are fired in a straight line= +• Armor: Will be equipped to players and armor stands= +• Boats: Are placed on water or are dropped= +• Minecart: Are placed on rails or are dropped= +• Bone meal: Is applied on the block it is facing= +• Empty buckets: Are used to collect a liquid source= +• Filled buckets: Are used to place a liquid source= +• Heads, pumpkins: Equipped to players and armor stands, or placed as a block= +• Shulker boxes: Are placed as a block= +• TNT: Is placed and ignited= +• Flint and steel: Is used to ignite a fire in air and to ignite TNT= +• Spawn eggs: Will summon the mob they contain= +• Other items: Are simply dropped= Downwards-Facing Dispenser= Upwards-Facing Dispenser= diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua index e53313aaa..2ac5aa329 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua @@ -148,7 +148,7 @@ local dropperdef = { local horizontal_def = table.copy(dropperdef) horizontal_def.description = S("Dropper") horizontal_def._doc_items_longdesc = S("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.") -horizontal_def._doc_items_usagehelp = S("Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Rightclick the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.") +horizontal_def._doc_items_usagehelp = S("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.") horizontal_def.after_place_node = function(pos, placer, itemstack, pointed_thing) setup_dropper(pos) orientate_dropper(pos, placer) diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.de.tr b/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.de.tr new file mode 100644 index 000000000..717bb580b --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.de.tr @@ -0,0 +1,6 @@ +# textdomain: mcl_droppers +Dropper=Spender +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.=Ein Spender ist eine Redstonekomponente und ein Behälter mit 9 Inventarplätzen. Er wird, wenn mit Redstoneenergie versorgt, einen Gegenstand abwerfen oder in einen Behälter, auf den er zeigt, ablegen. +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.=Spender können in 6 mögliche Richtungen platziert werden, Gegenstände fallen aus dem Loch hinaus. Benutzen Sie den Spender, um auf sein Inventar zuzugreifen. Versorgen Sie ihn mit Redstoneenergie, um den Spender einen Gegenstand abwerfen oder in einen Behälter ablegen zu lassen. +Downwards-Facing Dropper=Nach unten zeigender Spender +Upwards-Facing Dropper=Nach oben zeigender Spender diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/locale/template.txt b/mods/ITEMS/REDSTONE/mcl_droppers/locale/template.txt index 312e96cb3..b805c5809 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mcl_droppers/locale/template.txt @@ -1,6 +1,6 @@ # textdomain: mcl_droppers Dropper= 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.= -Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Rightclick the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.= +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.= Downwards-Facing Dropper= Upwards-Facing Dropper= diff --git a/mods/ITEMS/REDSTONE/mcl_observers/init.lua b/mods/ITEMS/REDSTONE/mcl_observers/init.lua index af230d80d..802e24509 100644 --- a/mods/ITEMS/REDSTONE/mcl_observers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_observers/init.lua @@ -88,7 +88,8 @@ mesecon.register_node("mcl_observers:observer", { description = S("Observer"), _doc_items_longdesc = S("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."), - _doc_items_usagehelp = S("Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow shows you the side of the output, which is at the opposite side of the “face”. The arrow points to it. You need to place your redstone wire or any other component you want to power here."), + _doc_items_usagehelp = S("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."), + groups = {pickaxey=1, material_stone=1, not_opaque=1, }, tiles = { "mcl_observers_observer_top.png^[transformR180", "default_furnace_bottom.png", diff --git a/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.de.tr b/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.de.tr new file mode 100644 index 000000000..ef23ad494 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.de.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_observers +Observer=Wächter +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.=Ein Wächter ist eine Redstonekomponente, die den Block vor ihm beobachtet und einen sehr kurzen Redstoneimpuls sendet, wenn sich dieser Block ändert. +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.=Platzieren Sie den Wächter direkt vor dem Block, den Sie beobachten wollen, so dass das „Gesicht“ zum Block schaut. Der Pfeil zeigt auf die Seite des Signalausgangs, der sich gegenüber vom „Gesicht“ befindet. Hier können Sie Ihren Restonestaub oder eine beliebige andere Komponente platzieren. diff --git a/mods/ITEMS/REDSTONE/mcl_observers/locale/template.txt b/mods/ITEMS/REDSTONE/mcl_observers/locale/template.txt index 6f8259f8c..40dbfd71f 100644 --- a/mods/ITEMS/REDSTONE/mcl_observers/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mcl_observers/locale/template.txt @@ -1,4 +1,4 @@ # textdomain: mcl_observers Observer= 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.= -Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow shows you the side of the output, which is at the opposite side of the “face”. The arrow points to it. You need to place your redstone wire or any other component you want to power here.= +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.= diff --git a/mods/ITEMS/REDSTONE/mesecons_button/init.lua b/mods/ITEMS/REDSTONE/mesecons_button/init.lua index 3e34670e0..9f6599831 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_button/init.lua @@ -1,6 +1,7 @@ -- WALL BUTTON --- A button that when pressed emits power for 1 second --- and then turns off again +-- A button that when pressed emits power for a short moment and then turns off again + +local S = minetest.get_translator("mesecons_button") local button_get_output_rules = mesecon.rules.wallmounted_get @@ -78,7 +79,7 @@ local on_button_place = function(itemstack, placer, pointed_thing) return itemstack end -local buttonuse = "Rightclick the button to push it." +local buttonuse = S("Use the button to push it.") mesecon.register_button = function(basename, description, texture, recipeitem, sounds, plusgroups, button_timer, push_by_arrow, longdesc) local groups_off = table.copy(plusgroups) @@ -191,22 +192,22 @@ end mesecon.register_button( "stone", - "Stone Button", + S("Stone Button"), "default_stone.png", "mcl_core:stone", mcl_sounds.node_sound_stone_defaults(), {material_stone=1,handy=1,pickaxey=1}, 1, false, - "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. It can only be placed on solid opaque full cubes (like cobblestone).") + S("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.")) local woods = { - { "wood", "mcl_core:wood", "default_wood.png", "Oak Button" }, - { "acaciawood", "mcl_core:acaciawood", "default_acacia_wood.png", "Acacia Button" }, - { "birchwood", "mcl_core:birchwood", "mcl_core_planks_birch.png", "Birch Button" }, - { "darkwood", "mcl_core:darkwood", "mcl_core_planks_big_oak.png", "Dark Oak Button" }, - { "sprucewood", "mcl_core:sprucewood", "mcl_core_planks_spruce.png", "Spruce Button" }, - { "junglewood", "mcl_core:junglewood", "default_junglewood.png", "Jungle Button" }, + { "wood", "mcl_core:wood", "default_wood.png", S("Oak Button") }, + { "acaciawood", "mcl_core:acaciawood", "default_acacia_wood.png", S("Acacia Button") }, + { "birchwood", "mcl_core:birchwood", "mcl_core_planks_birch.png", S("Birch Button") }, + { "darkwood", "mcl_core:darkwood", "mcl_core_planks_big_oak.png", S("Dark Oak Button") }, + { "sprucewood", "mcl_core:sprucewood", "mcl_core_planks_spruce.png", S("Spruce Button") }, + { "junglewood", "mcl_core:junglewood", "default_junglewood.png", S("Jungle Button") }, } for w=1, #woods do @@ -219,7 +220,7 @@ for w=1, #woods do {material_wood=1,handy=1,axey=1}, 1.5, true, - "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. It can only be placed on solid opaque full cubes (like cobblestone). Wooden buttons may also be pushed by arrows.") + 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.")) minetest.register_craft({ type = "fuel", diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.de.tr b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.de.tr new file mode 100644 index 000000000..da25ab73e --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.de.tr @@ -0,0 +1,11 @@ +# textdomain: mesecons_button +Use the button to push it.=Benutzen Sie den Knopf, um ihn zu drücken. +Stone Button=Steinknopf +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. =Ein Steinknopf ist eine Redstonekomponente aus Stein. Er kann gedrückt werden, um ein Redstonesignal zu senden. Im gedrückten Zustand versorgt er benachbarte Redstonekomponenten für 1 Sekunde mit Redstoneenergie. +Oak Button=Eichenknopf +Acacia Button=Akazienknopf +Birch Button=Birkenknopf +Dark Oak Button=Schwarzeichenknopf +Spruce Button=Fichtenknopf +Jungle Button=Dschungelknopf +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.=Ein Holzknopf ist eine Redstonekomponente aus Holz. Er kann gedrückt werden, um ein Redstonesignal zu senden. Im gedrückten Zustand versorgt er benachbarte Redstonekomponenten für 1,5 Sekunden mit Redstoneenergie. Holzknöpfe können auch von Pfeilen gedrückt werden. diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt index e69de29bb..5ae22b593 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt @@ -0,0 +1,11 @@ +# textdomain: mesecons_button +Use the button to push it.= +Stone Button= +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.= +Oak Button= +Acacia Button= +Birch Button= +Dark Oak Button= +Spruce Button= +Jungle Button= +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.= diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index dc143167b..281b97b10 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -74,9 +74,9 @@ local function check_commands(commands, player_name) local cmddef = minetest.chatcommands[cmd] if not cmddef then -- Invalid chat command - local msg = "Error: The command “"..cmd.."” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands." + local msg = S("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.", cmd) if string.sub(cmd, 1, 1) == "/" then - msg = msg .. " Hint: Try to remove the trailing slash." + msg = S("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.", cmd) end return false, minetest.colorize("#FF0000", msg) end @@ -85,7 +85,7 @@ local function check_commands(commands, player_name) for cmd_priv, _ in pairs(cmddef.privs) do if player_privs[cmd_priv] ~= true then - local msg = "Error: You have insufficient privileges to use the command “"..cmd.."” (missing privilege: "..cmd_priv..")! The command block has not been changed." + local msg = S("Error: You have insufficient privileges to use the command “@1” (missing privilege: @2)! The command block has not been changed.", cmd, cmd_priv) return false, minetest.colorize("#FF0000", msg) end end @@ -209,11 +209,11 @@ S("Everyone can activate a command block and look at its commands, but not every S("To view the commands in a command block, use it. To activate the command block, just supply it with redstone power. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.").. "\n\n".. -S("To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how they work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.").."\n\n".. +S("To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.").."\n\n".. S("All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.").."\n\n".. -S("Command blocks support placeholders, insert one of these placerholders and they will be replaced by a player name:").."\n".. +S("Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:").."\n".. S("• “@c”: commander of this command block").."\n".. S("• “@n” or “@p”: nearest player from the command block").."\n".. S("• “@f” farthest player from the command block").."\n".. diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr new file mode 100644 index 000000000..4517be9c2 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr @@ -0,0 +1,28 @@ +# 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.=Fehler: Der Befehl „@1“ existiert nicht; Ihr Befehlsblock bleibt unverändert. Benutzen Sie den Chatbefehl „help“ für eine Liste der verfügbaren Befehle. +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.=Fehler: Der Befehl „@1“ existiert nicht; Ihr Befehlsblock bleibt unverändert. Benutzen Sie den Chatbefehl „help“ für eine Liste der verfügbaren Befehle. Tipp: Versuchen Sie, den Schrägstrich am Anfang zu entfernen. +Error: You have insufficient privileges to use the command “@1” (missing privilege: @2)! The command block has not been changed.=Fehler: Sie haben nicht die ausreichenden Privilegien, um den Befehl „@1“ zu benutzen (fehlendes Privileg: @2)! Der Befehlsblock bleibt unverändert. +Error: No commander! Block must be replaced.=Fehler: Kein Kommandant! Block muss ersetzt werden. +Commander: @1=Kommandant: @1 +Submit=OK +No commands.=Keine Befehle. +Commands:=Befehle: +Help=Hilfe +Placement denied. You need the “maphack” privilege to place command blocks.=Platzierung fehlgeschlagen. Sie brauchen das „maphack“-Privileg, um Befehlsblöcke platzieren zu können. +Command Block=Befehlsblock +Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power.=Befehlsblöcke sind mächtige Redstonekomponenten, die das Gefüge der Realität selbst verändern können. Mit anderen Worten, sie lassen den Server Serverbefehle ausführen, wenn sie mit Redstoneenergie versorgt werden. +Everyone can activate a command block and look at its commands, but not everyone can edit and place them.=Jeder kann einen Befehlsblock aktivieren und sich seine Befehle ansehen, aber nicht jeder kann sie bearbeiten und platzieren. +To view the commands in a command block, use it. To activate the command block, just supply it with redstone power. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.=Um die Befehle in einem Befehlsblock zu betrachten, benutzen Sie ihn. Um ihn zu aktivieren, versorgen Sie ihn einfach mit Redstoneenergie. Das wird die Befehle einmalig ausführen. Um sie erneut auszuführen, schalten Sie die Redstoneenergie aus und wieder ein. +To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.=Um einen Befehlsblock platzieren und die Befehle ändern zu können, müssen Sie im Kreativmodus sein und das „maphack“-Privileg habe. Ein neuer Befehlsblock hat keine Befehle und tut gar nichts. Benutzen Sie den Befehlsblock (im Kreativmodus!), um seine Befehle zu bearbeiten. Lesen Sie den Hilfeeintrag „Fortgeschrittenes > Serverbefehle“, um zu verstehen, wie Befehle funktionieren. Jede Zeile enthält einen einzigen Befehl. Sie geben Sie wie in der Konsole ein, aber ohne den Schrägstrich am Anfang. +All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.=Alle Befehle werden im Namen des Spielers, der den Befehlsblock platziert hat, ausgeführt, als ob der Spieler die Befehle eingegeben hätte. Diesen Spieler nennen wir den „Kommandanten“ des Blocks. +Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:=Befehlsblöcke unterstützen Platzhalter, geben sie einen dieser Platzhalter ein und sie werden durch einen anderen Text ersetzt: +• “@c”: commander of this command block=• „@c“: Befehlshaber dieses Befehlsblocks +• “@n” or “@p”: nearest player from the command block=• „@n“ oder „@p“: Nächster Spieler am Befehlsblock +• “@f” farthest player from the command block=• Der vom Befehelsblock am weitesten entfernte Spieler +• “@r”: random player currently in the world=• „@r“: Zufälliger Spieler in der Welt +• “@@”: literal “@” sign=• Nur das „@“-Zeichen +Example 1:@n time 12000@nSets the game clock to 12:00=1. Beispiel:@n time 12000@nSetzt die Spieluhr auf 12:00 Uhr +Example 2:@n give @@n mcl_core:apple 5@n→ Gives the nearest player 5 apples=2. Beispiel:@n give @@n mcl_core:apple 5@n→ Gibt dem nächsten Spieler 5 Äpfel +Access denied. You need the “maphack” privilege to edit command blocks.=Zugriff verweigert. Sie brauchen das „maphack“-Privileg, um Befehlsblöcke zu bearbeiten. +Editing the command block has failed! You can only change the command block in Creative Mode!=Bearbeitung des Befehlsblocks fehlgeschlagen! Sie können den Befehlsblock nur im Kreativmodus ändern! +Editing the command block has failed! The command block is gone.=Bearbeiten des Befehlsblocks fehlgeschlagen! Der Befehlsblock ist verschwunden. diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt index 27b496b66..c20f5f08a 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt @@ -1,14 +1,28 @@ # 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: 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: You have insufficient privileges to use the command “@1” (missing privilege: @2)! The command block has not been changed.= +Error: No commander! Block must be replaced.= +Commander: @1= +Submit= +No commands.= +Commands:= +Help= +Placement denied. You need the “maphack” privilege to place command blocks.= Command Block= Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power.= -To use an already existing command block, just supply it with redstone power and see what happens. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.= -To place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Rightclick the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how they work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.= +Everyone can activate a command block and look at its commands, but not everyone can edit and place them.= +To view the commands in a command block, use it. To activate the command block, just supply it with redstone power. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.= +To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.= All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.= -Command blocks support placeholders, insert one of these placerholders and they will be replaced by a player name:= +Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:= • “@c”: commander of this command block= • “@n” or “@p”: nearest player from the command block= • “@f” farthest player from the command block= • “@r”: random player currently in the world= • “@@”: literal “@” sign= Example 1:@n time 12000@nSets the game clock to 12:00= -Example 2:@n give @n mcl_core:apple 5@n→ Gives the nearest player 5 apples= +Example 2:@n give @@n mcl_core:apple 5@n→ Gives the nearest player 5 apples= +Access denied. You need the “maphack” privilege to edit command blocks.= +Editing the command block has failed! You can only change the command block in Creative Mode!= +Editing the command block has failed! The command block is gone.= diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua b/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua index 504314c1b..01bd19018 100644 --- a/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua @@ -185,7 +185,7 @@ local help, longdesc, usagehelp, icon, on_construct if i == 1 then help = true longdesc = S("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.") - usagehelp = S("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, rightclick 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.").."\n".. + usagehelp = S("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.").."\n".. S("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.") icon = "mesecons_delayer_item.png" diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.de.tr b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.de.tr new file mode 100644 index 000000000..1f031c645 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.de.tr @@ -0,0 +1,9 @@ +# 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.=Redstoneverstärker sind vielseitige Komponenten mit den folgenden Verwendungszwecken: 1.: Sie lassen Signale nur in eine Richtung durch. 2.: Sie verzögern das Signal. 3.: Sie können optional ihr Ausgangssignal sperren +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, user 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.=Um einen Redstoneverstärker zu versorgen, senden Sie ein Signal in „Pfeilrichtung“ (dem Eingang). Das Signal geht aus der gegenüberliegenden Seite (dem Ausgang) mit einer Verzögerung hinaus. Um die Verzögerung zu ändern, benutzen Sie den Redstoneverstärker. Die Verzögerung ist zwischen 0,1 bis 0,4 Sekunden lang und kann in Schritten von 0,1 Sekunden geändert werden. Das wird mit der Position der verschiebbaren Redstonefackel angezeigt. +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.=Um einen Verstärker zu sperren, senden Sie ein Signal eines benachbarten Verstärkers in eines der Seiten. Im gesperrten Zustand verschwindet die verschiebbare Redstonefackel, die Ausgabe ändert sich nicht mehr und der Eingang wird ignoriert. +Redstone Repeater=Redstoneverstärker +Redstone Repeater (Powered)=Redstoneverstärker (bestromt) +Redstone Repeater (Locked)=Redstoneverstärker (gesperrt) +Redstone Repeater (Locked, Powered)=Redstoneverstärker (gesperrt, bestromt) + diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/template.txt index daad51adf..596a5b38d 100644 --- a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/template.txt @@ -1,6 +1,6 @@ # 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.= -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, rightclick 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.= +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, user 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.= 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.= Redstone Repeater= Redstone Repeater (Powered)= diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua b/mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua index 14a72acca..97ef544aa 100644 --- a/mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua @@ -1,9 +1,11 @@ +local S = minetest.get_translator("mesecons_lightstone") + minetest.register_node("mesecons_lightstone:lightstone_off", { tiles = {"jeija_lightstone_gray_off.png"}, groups = {handy=1, mesecon_effector_off = 1, mesecon = 2}, is_ground_content = false, - description= "Redstone Lamp", - _doc_items_longdesc = "Redstone lamps are simple redstone components which glow brightly (light level 14) when they receive redstone power.", + description= S("Redstone Lamp"), + _doc_items_longdesc = S("Redstone lamps are simple redstone components which glow brightly (light level 14) when they receive redstone power."), sounds = mcl_sounds.node_sound_glass_defaults(), mesecons = {effector = { action_on = function (pos, node) diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.de.tr b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.de.tr new file mode 100644 index 000000000..dd39b80d9 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.de.tr @@ -0,0 +1,3 @@ +# textdomain: mesecons_lightstone +Redstone Lamp=Redstonelampe +Redstone lamps are simple redstone components which glow brightly (light level 14) when they receive redstone power.=Redstonelampen sind einfache Redstonekomponenten, die hell aufleuchten (Helligkeitspegel von 14), wenn sie Redstoneenergie erhalten. diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/template.txt index e69de29bb..3261d768a 100644 --- a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mesecons_lightstone +Redstone Lamp= +Redstone lamps are simple redstone components which glow brightly (light level 14) when they receive redstone power.= diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.de.tr b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.de.tr new file mode 100644 index 000000000..c107bd5dc --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.de.tr @@ -0,0 +1,10 @@ +# textdomain: mesecons_noteblock +Note Block=Notenblock +A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power.=Ein Notenblock ist ein musikalischer Block, der eine von vielen Noten von verschiedenen Instrumenten spielt, wenn er geschlagen oder mit Redstoneenergie versorgt wird. +Use the note block to choose the next musical note (there are 24 half notes, or 2 octaves). The intrument played depends on the material of the block below the note block:=Benutzen Sie den Notenblock, um die nächste Note zu wählen (es gibt 24 halbe Noten bzw. 2 Oktaven). Das gespielte Intrument hängt vom Material des Blocks unter dem Notenblock ab: +• Glass: Sticks=• Glas: Stöcke +• Wood: Bass guitar=• Holz: Bassgitarre +• Stone: Bass drum=• Stein: Basstrommel +• Sand or gravel: Snare drum=• Sand oder Kies: Kleine Trommel +• Anything else: Piano=• Alles andere: Klavier +The note block will only play a note when it is below air, otherwise, it stays silent.=Der Notenblock wird nur eine Note spielen, wenn er sich unter Luft befindet, sonst bleibt er stumm. diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/template.txt index ea26974b9..95803f666 100644 --- a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/template.txt @@ -1,7 +1,7 @@ # textdomain: mesecons_noteblock Note Block= A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power.= -Rightclick the note block to choose the next musical note (there are 24 half notes, or 2 octaves). The intrument played depends on the material of the block below the note block:= +Use the note block to choose the next musical note (there are 24 half notes, or 2 octaves). The intrument played depends on the material of the block below the note block:= • Glass: Sticks= • Wood: Bass guitar= • Stone: Bass drum= diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua b/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua index 9c8181653..65b1e9bea 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua @@ -173,7 +173,7 @@ local pistonspec_normal = { piston_up = "mesecons_pistons:piston_up_normal_off", } -local usagehelp_piston = S("This block can have one of 6 possible orientations. On placement, the pusher will face you.") +local usagehelp_piston = S("This block can have one of 6 possible orientations.") local on_rotate if minetest.get_modpath("screwdriver") then diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.de.tr b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.de.tr new file mode 100644 index 000000000..cebf84615 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.de.tr @@ -0,0 +1,6 @@ +# textdomain: mesecons_pistons +This block can have one of 6 possible orientations.=Dieser Block kann eine von 6 möglichen Richtungen annehmen. +Piston=Kolben +A piston is a redstone component with a pusher which pushes the block or blocks in front of it when it is supplied with redstone power. Not all blocks can be pushed, however.=Ein Kolben ist eine Redstonekomponente mit einem Schieber den Block oder die Blöcke vor ihm schieben wird, wenn er mit Redstoneenergie versorgt wird. Allerdings können nicht alle Blöcke können geschoben werden. +Sticky Piston=Klebriger Kolben +A sticky piston is a redstone component with a sticky pusher which can be extended and retracted. It extends when it is supplied with redstone power. When the pusher extends, it pushes the block or blocks in front of it. When it retracts, it pulls back the single block in front of it. Note that not all blocks can be pushed or pulled.=Ein klebriger Kolben ist eine Redstonekomponente mit einem klebrigen Schieber, der ein- und ausgefahren werden kann. Er fährt aus, wenn er mit Redstoneenergie versorgt wird. Wenn der Schieber ausgefahren wird, schiebt er den Block oder die Blöcke vor ihm. Wird er eingefahren, zieht er den Block vor ihm zu sich. Nicht alle Blöcke können geschoben oder gezogen werden. diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/template.txt index 93a4de14d..2cdd65127 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pistons/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/template.txt @@ -1,5 +1,5 @@ # textdomain: mesecons_pistons -This block can have one of 6 possible orientations. On placement, the pusher will face you.= +This block can have one of 6 possible orientations.= Piston= A piston is a redstone component with a pusher which pushes the block or blocks in front of it when it is supplied with redstone power. Not all blocks can be pushed, however.= Sticky Piston= diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.de.tr b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.de.tr new file mode 100644 index 000000000..678e061c4 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.de.tr @@ -0,0 +1,12 @@ +# 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.=Eine Druckplatte ist eine Redstonekomponente, die ihre benachbarten Blöcke mit Redstoneenergie versorgt, wenn sich jemand oder etwas auf ihr befindet. +Oak Pressure Plate=Eichendruckplatte +Acacia Pressure Plate=Akaziendruckplatte +Birch Pressure Plate=Birkendruckplatte +Dark Oak Pressure Plate=Schwarzeichendruckplatte +Spruce Pressure Plate=Fichtendruckplatte +Jungle Pressure Plate=Dschungeldruckplatte +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.=Eine Holzdruckplatte ist eine Redstonekomponente, die ihre benachbarten Blöcke mit Redstoneenergie versorgt, solange sich ein beliebiges bewegliches Objekt (wie Gegenstände, Spieler und Mobs) auf ihm befindet. +Stone Pressure Plate=Steindruckplatte +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.=Eine Steindruckplatte ist eine Redstonekomponente, die ihre benachbarten Blöcke mit Redstoneenergie versorgt, solange sich ein Spieler oder Mob auf ihm befindet. Sie wird von nichts anderem ausgelöst. + diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua index d71f0cdd7..fa29e05c5 100644 --- a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua @@ -60,7 +60,7 @@ minetest.register_node("mesecons_solarpanel:solar_panel_off", { groups = {handy=1,axey=1, material_wood=1}, description=S("Daylight Sensor"), _doc_items_longdesc = S("Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted."), - _doc_items_usagehelp = "Rightclick the daylight sensor to turn it into an inverted daylight sensor, which supplies redstone energy when it is in moonlight.", + _doc_items_usagehelp = S("Use the daylight sensor to turn it into an inverted daylight sensor, which supplies redstone energy when it is in moonlight."), sounds = mcl_sounds.node_sound_glass_defaults(), mesecons = {receptor = { state = mesecon.state.off, @@ -178,7 +178,7 @@ minetest.register_node("mesecons_solarpanel:solar_panel_inverted_off", { groups = {handy=1,axey=1, not_in_creative_inventory=1, material_wood=1}, description=S("Inverted Daylight Sensor"), _doc_items_longdesc = S("An inverted daylight sensor is a variant of the daylight sensor. It is a redstone component which provides redstone power when it in moonlight and no power otherwise. It can turned back into an ordinary daylight sensor."), - _doc_items_usagehelp = "Rightclick the daylight sensor to turn it into a daylight sensor.", + _doc_items_usagehelp = S("Use the inverted daylight sensor to turn it into a daylight sensor."), sounds = mcl_sounds.node_sound_glass_defaults(), mesecons = {receptor = { state = mesecon.state.off, diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.de.tr b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.de.tr new file mode 100644 index 000000000..8b1a342c7 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.de.tr @@ -0,0 +1,7 @@ +# textdomain: mesecons_solarpanel +Daylight Sensor=Tageslichtsensor +Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.=Tageslichtsensoren sind Redstonekomponenten, die Redstoneenergie liefern, wenn sie im Sonnenlicht stehen, sonst nicht. +Use the daylight sensor to turn it into an inverted daylight sensor, which supplies redstone energy when it is in moonlight.=Benutzen Sie den Tageslichtsensor, um ihn zu einen invertierten Tageslichtsensor umzuwandeln, der Redstoneenergie liefert, wenn er sich im Mondlicht befindet. +Inverted Daylight Sensor=Invertierter Tageslichtsensor +An inverted daylight sensor is a variant of the daylight sensor. It is a redstone component which provides redstone power when it in moonlight and no power otherwise. It can turned back into an ordinary daylight sensor.=Ein invertierter Tageslichtsensor ist eine Variante des Tageslichtsensors. Er ist eine Redstonekomponente, die Redstoneenergie liefert, wenn er sich im Mondlicht befindet, sonst nicht. Er kann zurück zu einem gewöhnlichen Tageslichtsensor umgewandelt werden. +Use the inverted daylight sensor to turn it into a daylight sensor.=Benutzen Sie den Tageslichtsensor, um ihn zu einem Tageslichtsensor umzuwandeln. diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/template.txt index 15de4f822..4ad3b24c4 100644 --- a/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/template.txt @@ -1,5 +1,7 @@ # textdomain: mesecons_solarpanel Daylight Sensor= Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.= +Use the daylight sensor to turn it into an inverted daylight sensor, which supplies redstone energy when it is in moonlight.= Inverted Daylight Sensor= An inverted daylight sensor is a variant of the daylight sensor. It is a redstone component which provides redstone power when it in moonlight and no power otherwise. It can turned back into an ordinary daylight sensor.= +Use the inverted daylight sensor to turn it into a daylight sensor.= diff --git a/mods/ITEMS/REDSTONE/mesecons_torch/init.lua b/mods/ITEMS/REDSTONE/mesecons_torch/init.lua index 17b45e205..dabc292e6 100644 --- a/mods/ITEMS/REDSTONE/mesecons_torch/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_torch/init.lua @@ -168,11 +168,7 @@ mcl_torches.register_torch("mesecon_torch_overheated", "Redstone Torch (overheat mcl_torches.register_torch("mesecon_torch_on", S("Redstone Torch"), S("A redstone torch is a redstone component which can be used to invert a redstone signal. It supplies its surrounding blocks with redstone power, except for the block it is attached to. A redstone torch is normally lit, but it can also be turned off by powering the block it is attached to. While unlit, a redstone torch does not power anything."), - S("Redstone torches can generally be placed at the side and on the top of full solid opaque blocks. The following exceptions apply:").."\n".. -S("• Glass, fence, wall, hopper: Can only be placed on top").. -S("• Upside-down slab/stair: Can only be placed on top").. -S("• Soul sand, mob spawner: Placement possible").. -S("• Glowstone and pistons: No placement possible"), + S("Redstone torches can be placed at the side and on the top of full solid opaque blocks."), "jeija_torches_on.png", "mcl_torches_torch_floor.obj", "mcl_torches_torch_wall.obj", {"jeija_torches_on.png"}, diff --git a/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.de.tr b/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.de.tr new file mode 100644 index 000000000..2166ccdda --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.de.tr @@ -0,0 +1,6 @@ +# textdomain: mesecons_torch +Redstone Torch=Redstonefackel +A redstone torch is a redstone component which can be used to invert a redstone signal. It supplies its surrounding blocks with redstone power, except for the block it is attached to. A redstone torch is normally lit, but it can also be turned off by powering the block it is attached to. While unlit, a redstone torch does not power anything.=Eine Redstonefackel ist eine Redstonekomponente, die benutzt werden kann, um ein Redstonesignal zu invertieren. Sie versorgt die benachbarten Blöcke mit Redstoneenergie, ausgenommen den Block, an dem sie befestigt wurde. Eine Redstonefackel leuchtet normalerweise, aber sie kann auch ausgeschaltet werden, indem der Block, an dem sie befestigt ist, bestromt wird. Wenn sie aus ist, wird sie nichts mit Redstoneenergie versorgen. +Redstone torches can be placed at the side and on the top of full solid opaque blocks.=Redstonefackeln können an der Seite und auf der Oberseite der meisten undurchsichtigen ganzen Blöcke platziert werden. +Block of Redstone=Redstoneblock +A block of redstone permanently supplies redstone power to its surrounding blocks.=Ein Redstoneblock versorgt seine benachbarten Blöcke beständig mit Redstoneenergie. diff --git a/mods/ITEMS/REDSTONE/mesecons_torch/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_torch/locale/template.txt index b3e5b7be0..fb5ba71f0 100644 --- a/mods/ITEMS/REDSTONE/mesecons_torch/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_torch/locale/template.txt @@ -1,10 +1,6 @@ # textdomain: mesecons_torch Redstone Torch= A redstone torch is a redstone component which can be used to invert a redstone signal. It supplies its surrounding blocks with redstone power, except for the block it is attached to. A redstone torch is normally lit, but it can also be turned off by powering the block it is attached to. While unlit, a redstone torch does not power anything.= -Redstone torches can generally be placed at the side and on the top of full solid opaque blocks. The following exceptions apply:= -• Glass, fence, wall, hopper: Can only be placed on top= -• Upside-down slab/stair: Can only be placed on top= -• Soul sand, mob spawner: Placement possible= -• Glowstone and pistons: No placement possible= +Redstone torches can be placed at the side and on the top of full solid opaque blocks.= Block of Redstone= A block of redstone permanently supplies redstone power to its surrounding blocks.= diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/init.lua b/mods/ITEMS/REDSTONE/mesecons_walllever/init.lua index 5f8dbd490..3c04f72a2 100644 --- a/mods/ITEMS/REDSTONE/mesecons_walllever/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/init.lua @@ -24,7 +24,7 @@ minetest.register_node("mesecons_walllever:wall_lever_off", { is_ground_content = false, description=S("Lever"), _doc_items_longdesc = S("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."), - _doc_items_usagehelp = "Right-click the lever to flip it on or off.", + _doc_items_usagehelp = S("Use the lever to flip it on or off."), on_rightclick = function (pos, node) minetest.swap_node(pos, {name="mesecons_walllever:wall_lever_on", param2=node.param2}) mesecon.receptor_on(pos, lever_get_output_rules(node)) diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.de.tr b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.de.tr new file mode 100644 index 000000000..053f81917 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.de.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_wallever +Lever=Hebel +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.=Ein Hebel ist eine Redstonekomponente, die ein- und ausgeschaltet werden kann. Er versorgt seine benachbarten Blöcke mit Redstoneenergie, solange er sich im eingeschalteten Zustand befindet. +Use the lever to flip it on or off.=Benutzen Sie den Hebel, um ihn ein- oder auszuschalten. diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/template.txt index afdabf1bf..59988e905 100644 --- a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/template.txt @@ -1,4 +1,4 @@ # textdomain: mesecons_wallever Lever= 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.= -Lever= +Use the lever to flip it on or off.= diff --git a/mods/ITEMS/REDSTONE/mesecons_wires/init.lua b/mods/ITEMS/REDSTONE/mesecons_wires/init.lua index 49f048a1b..106f3fb6d 100644 --- a/mods/ITEMS/REDSTONE/mesecons_wires/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_wires/init.lua @@ -228,7 +228,7 @@ local function register_wires() longdesc = S("Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on the ground as a trail.").."\n".. S("A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components.").."\n".. S("Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.") - usagehelp = S("Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills. An easy way to power a redstone trail is by placing a redstone torch.").."\n\n".. + usagehelp = S("Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills.").."\n\n".. S("Read the help entries on the other redstone components to learn how redstone components interact.") img = "redstone_redstone_dust.png" diff --git a/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.de.tr b/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.de.tr new file mode 100644 index 000000000..0fa278361 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.de.tr @@ -0,0 +1,10 @@ +# textdomain: mesecons_wires +Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on the ground as a trail.=Redstone ist ein vielseitiges leitendes Mineral, der Redstoneenergie überträgt. Es kann auf dem Boden in Form einer Spur platziert werden. +A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components.=Eine Redstonespur kann einen von zwei Zuständen annehmen: Bestromt und unbestromt. Eine bestromte Redstonespur wird benachbarte Redstonekomponenten bestromen (und somit aktivieren). +Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.=Redstoneenergie kann von verschiedenen Redstonekomponenten erhalten werden, wie zum Beispiel einem Redstoneblock oder einem Knopf. Redstoneenergie wird benutzt, um verschiedene Mechanismen zu aktivieren, wie Redstonelampen oder Kolben. +Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills.=Platzieren Sie Redstone auf dem Boden, um eine Redstonespur auszulegen. Die Spuren werden sich automatisch miteinander verbinden und sie können auch über Hügel gehen. +Read the help entries on the other redstone components to learn how redstone components interact.=Lesen Sie die Hilfeeinträge über andere Redstonekomponenten, um zu erfahren, wie sie interagieren. +Redstone=Redstone +Powered Redstone Spot (@1)=Bestromter Redstoneklecks (@1) +Redstone Trail (@1)=Redstonespur (@1) +Powered Redstone Trail (@1)=Bestromte Redstonespur (@1) From cf9e440019728520fe4daa9ebdb0efffc98584a3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 16 Mar 2019 02:38:36 +0100 Subject: [PATCH 201/379] Translation: Add support for a few missing items --- mods/ENTITIES/mcl_mobs/api.lua | 4 +- mods/ENTITIES/mcl_mobs/crafts.lua | 4 +- mods/ENTITIES/mcl_mobs/intllib.lua | 45 ------ mods/ENTITIES/mcl_mobs/locale/de_DE.po | 131 ----------------- mods/ENTITIES/mcl_mobs/locale/es.po | 128 ----------------- mods/ENTITIES/mcl_mobs/locale/fr.po | 129 ----------------- mods/ENTITIES/mcl_mobs/locale/it.po | 131 ----------------- mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr | 3 + mods/ENTITIES/mcl_mobs/locale/ms.po | 131 ----------------- mods/ENTITIES/mcl_mobs/locale/pt.po | 133 ------------------ mods/ENTITIES/mcl_mobs/locale/ru.po | 129 ----------------- mods/ENTITIES/mcl_mobs/locale/template.pot | 128 ----------------- mods/ENTITIES/mcl_mobs/locale/template.txt | 3 + mods/ENTITIES/mcl_mobs/locale/tr.po | 133 ------------------ mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr | 2 +- .../mcl_sponges/locale/mcl_sponges.de.tr | 8 ++ mods/ITEMS/mcl_sponges/locale/template.txt | 14 +- mods/ITEMS/mclx_stairs/init.lua | 39 +++-- .../mclx_stairs/locale/mclx_stairs.de.tr | 48 +++++++ mods/ITEMS/mclx_stairs/locale/template.txt | 48 +++++++ mods/ITEMS/xpanes/locale/xpanes.de.tr | 32 ++--- 21 files changed, 156 insertions(+), 1267 deletions(-) delete mode 100644 mods/ENTITIES/mcl_mobs/intllib.lua delete mode 100644 mods/ENTITIES/mcl_mobs/locale/de_DE.po delete mode 100644 mods/ENTITIES/mcl_mobs/locale/es.po delete mode 100644 mods/ENTITIES/mcl_mobs/locale/fr.po delete mode 100644 mods/ENTITIES/mcl_mobs/locale/it.po delete mode 100644 mods/ENTITIES/mcl_mobs/locale/ms.po delete mode 100644 mods/ENTITIES/mcl_mobs/locale/pt.po delete mode 100644 mods/ENTITIES/mcl_mobs/locale/ru.po delete mode 100644 mods/ENTITIES/mcl_mobs/locale/template.pot delete mode 100644 mods/ENTITIES/mcl_mobs/locale/tr.po create mode 100644 mods/ITEMS/mcl_sponges/locale/mcl_sponges.de.tr diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index dfa34ec04..b7a8e22f3 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -7,11 +7,9 @@ mobs.version = "20180531" -- don't rely too much on this, rarely updated, if eve local MAX_MOB_NAME_LENGTH = 30 --- Intllib +-- Localize local MP = minetest.get_modpath(minetest.get_current_modname()) local S = minetest.get_translator("mcl_mobs") -mobs.intllib = S - -- CMI support check local use_cmi = minetest.global_exists("cmi") diff --git a/mods/ENTITIES/mcl_mobs/crafts.lua b/mods/ENTITIES/mcl_mobs/crafts.lua index 41243bf52..e9e6abf90 100644 --- a/mods/ENTITIES/mcl_mobs/crafts.lua +++ b/mods/ENTITIES/mcl_mobs/crafts.lua @@ -1,11 +1,11 @@ -local S = mobs.intllib +local S = minetest.get_translator("mcl_mobs") -- name tag minetest.register_craftitem("mcl_mobs:nametag", { description = S("Name Tag"), _doc_items_longdesc = S("A name tag is an item to name a mob."), - _doc_items_usagehelp = S("Before you use the name tag, you need to set a name at an anvil. Now you can use the name tag to name a mob with a rightclick. This uses up the name tag."), + _doc_items_usagehelp = S("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."), inventory_image = "mobs_nametag.png", wield_image = "mobs_nametag.png", stack_max = 64, diff --git a/mods/ENTITIES/mcl_mobs/intllib.lua b/mods/ENTITIES/mcl_mobs/intllib.lua deleted file mode 100644 index 6669d7202..000000000 --- a/mods/ENTITIES/mcl_mobs/intllib.lua +++ /dev/null @@ -1,45 +0,0 @@ - --- Fallback functions for when `intllib` is not installed. --- Code released under Unlicense . - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/mods/ENTITIES/mcl_mobs/locale/de_DE.po b/mods/ENTITIES/mcl_mobs/locale/de_DE.po deleted file mode 100644 index 210990d8f..000000000 --- a/mods/ENTITIES/mcl_mobs/locale/de_DE.po +++ /dev/null @@ -1,131 +0,0 @@ -# Mobs Redo translation. -# Copyright (C) 2017 TenPlus1 -# This file is distributed under the same license as the mobs package. -# Wuzzy , 2017 -# -msgid "" -msgstr "" -"Project-Id-Version: mobs\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 16:48+0200\n" -"PO-Revision-Date: 2017-07-02 14:27+0200\n" -"Last-Translator: Wuzzy \n" -"Language-Team: \n" -"Language: de_DE\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.2\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "" - -#: api.lua -msgid "Mob has been protected!" -msgstr "Kreatur wurde geschützt!" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "@1 (Gezähmt)" - -#: api.lua -msgid "Not tamed!" -msgstr "Nicht gezähmt!" - -#: api.lua -msgid "@1 is owner!" -msgstr "@1 ist der Besitzer!" - -#: api.lua -msgid "Missed!" -msgstr "Daneben!" - -#: api.lua -msgid "Already protected!" -msgstr "Bereits geschützt!" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 bei voller Gesundheit (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 wurde gezähmt!" - -#: api.lua -msgid "Enter name:" -msgstr "Namen eingeben:" - -#: api.lua -msgid "Rename" -msgstr "Umbenennen" - -#: crafts.lua -msgid "Name Tag" -msgstr "Namensschild" - -#: crafts.lua -msgid "Leather" -msgstr "Leder" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Rohes Fleisch" - -#: crafts.lua -msgid "Meat" -msgstr "Fleisch" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Lasso (Rechtsklick auf Tier, um es zu nehmen)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Netz (Rechtsklick auf Tier, um es zu nehmen)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Stahlschere (Rechtsklick zum Scheren)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "Kreaturschutzrune" - -#: crafts.lua -msgid "Saddle" -msgstr "Sattel" - -#: crafts.lua -msgid "Mob Fence" -msgstr "Kreaturen Zaun" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Kreaturenspawner" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Kreatur MinLicht MaxLicht Menge SpielerEntfng" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Nicht aktiv (Einstellungen eingeben)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Spawner aktiv (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Kreaturenspawner-Einstellungen gescheitert!" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" -"Syntax: „name min_licht[0-14] max_licht[0-14] max_mobs_im_gebiet[0 zum " -"Deaktivieren] distanz[1-20] y_versatz[-10 bis 10]“" diff --git a/mods/ENTITIES/mcl_mobs/locale/es.po b/mods/ENTITIES/mcl_mobs/locale/es.po deleted file mode 100644 index 849db6671..000000000 --- a/mods/ENTITIES/mcl_mobs/locale/es.po +++ /dev/null @@ -1,128 +0,0 @@ -# Mobs Redo translation. -# Copyright (C) 2017 TenPlus1 -# This file is distributed under the same license as the mobs package. -# Wuzzy , 2017 -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-16 16:48+0200\n" -"PO-Revision-Date: 2017-07-16 16:48+0200\n" -"Last-Translator: Aleks \n" -"Language-Team: \n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "" - -#: api.lua -msgid "Mob has been protected!" -msgstr "El mob ha sido protegido!" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "@1 (Domesticado)" - -#: api.lua -msgid "Not tamed!" -msgstr "No domesticado!" - -#: api.lua -msgid "@1 is owner!" -msgstr "@1 es el dueño!" - -#: api.lua -msgid "Missed!" -msgstr "Perdido!" - -#: api.lua -msgid "Already protected!" -msgstr "Ya está protegido!" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 con salud llena (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 ha sido domesticado!" - -#: api.lua -msgid "Enter name:" -msgstr "Ingrese nombre:" - -#: api.lua -msgid "Rename" -msgstr "Renombrar" - -#: crafts.lua -msgid "Name Tag" -msgstr "Nombrar etiqueta" - -#: crafts.lua -msgid "Leather" -msgstr "Cuero" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Carne cruda" - -#: crafts.lua -msgid "Meat" -msgstr "Carne" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Lazo (click derecho en animal para colocar en inventario)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Red (click derecho en animal para colocar en inventario)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Tijera de acero (click derecho para esquilar)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "Runa de protección de Mob" - -#: crafts.lua -msgid "Saddle" -msgstr "Montura" - -#: crafts.lua -msgid "Mob Fence" -msgstr "" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Generador de Mob" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Mob LuzMin LuzMax Cantidad DistJugador" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Generador no activo (ingrese config)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Generador activo (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Configuracion de generador de Mob falló!" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "Sintaxis: “nombre luz_min[0-14] luz_max[0-14] max_mobs_en_area[0 para deshabilitar] " -"distancia[1-20] compensacion[-10 a 10]”" diff --git a/mods/ENTITIES/mcl_mobs/locale/fr.po b/mods/ENTITIES/mcl_mobs/locale/fr.po deleted file mode 100644 index 25b920cd9..000000000 --- a/mods/ENTITIES/mcl_mobs/locale/fr.po +++ /dev/null @@ -1,129 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-29 09:13+0200\n" -"PO-Revision-Date: 2017-07-29 09:20+0200\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.12\n" -"Last-Translator: fat115 \n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Language: fr\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "** Mode pacifique activé - Aucun monstre ne sera généré" - -#: api.lua -msgid "Mob has been protected!" -msgstr "L'animal a été protégé !" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "@1 (apprivoisé)" - -#: api.lua -msgid "Not tamed!" -msgstr "Non-apprivoisé !" - -#: api.lua -msgid "@1 is owner!" -msgstr "Appartient à @1 !" - -#: api.lua -msgid "Missed!" -msgstr "Raté !" - -#: api.lua -msgid "Already protected!" -msgstr "Déjà protégé !" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 est en pleine forme (@2) " - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 a été apprivoisé ! " - -#: api.lua -msgid "Enter name:" -msgstr "Saisissez un nom :" - -#: api.lua -msgid "Rename" -msgstr "Renommer" - -#: crafts.lua -msgid "Name Tag" -msgstr "Étiquette pour collier" - -#: crafts.lua -msgid "Leather" -msgstr "Cuir" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Viande crue" - -#: crafts.lua -msgid "Meat" -msgstr "Viande" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Lasso (clic droit sur l'animal pour le mettre dans l'inventaire)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Filet (clic droit sur l'animal pour le mettre dans l'inventaire)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Ciseaux à laine (clic droit pour tondre)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "Rune de protection des animaux" - -#: crafts.lua -msgid "Saddle" -msgstr "Selle" - -#: crafts.lua -msgid "Mob Fence" -msgstr "Clôture à animaux" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Générateur de mob" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Mob MinLumière MaxLumière Quantité DistanceJoueur" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Générateur non actif (entrez les paramètres)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Générateur actif (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Echec des paramètres du générateur" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "Syntaxe : “nom min_lumière[0-14] max_lumière[0-14] max_mobs_dans_zone[0 pour désactiver] distance[1-20] décalage_y[-10 à 10]“" diff --git a/mods/ENTITIES/mcl_mobs/locale/it.po b/mods/ENTITIES/mcl_mobs/locale/it.po deleted file mode 100644 index a439f6dea..000000000 --- a/mods/ENTITIES/mcl_mobs/locale/it.po +++ /dev/null @@ -1,131 +0,0 @@ -# ITALIAN LOCALE FILE FOR THE MOBS REDO MODULE -# Copyright (c) 2014 Krupnov Pavel and 2016 TenPlus1 -# This file is distributed under the same license as the MOBS REDO package. -# Hamlet , 2017. -# -msgid "" -msgstr "" -"Project-Id-Version: Italian locale file for the Mobs Redo module\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 16:48+0200\n" -"PO-Revision-Date: 2017-08-18 12:18+0100\n" -"Last-Translator: H4mlet \n" -"Language-Team: \n" -"Language: it\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 1.6.10\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "" - -#: api.lua -msgid "Mob has been protected!" -msgstr "Il mob è stato protetto!" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "@1 (Addomesticat*)" - -#: api.lua -msgid "Not tamed!" -msgstr "Non addomesticat*!" - -#: api.lua -msgid "@1 is owner!" -msgstr "Proprietari* @1!" - -#: api.lua -msgid "Missed!" -msgstr "Mancat*!" - -#: api.lua -msgid "Already protected!" -msgstr "Già protett*!" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 in piena salute (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 è stat* addomesticat*!" - -#: api.lua -msgid "Enter name:" -msgstr "Inserire il nome:" - -#: api.lua -msgid "Rename" -msgstr "Rinominare" - -#: crafts.lua -msgid "Name Tag" -msgstr "Targhetta" - -#: crafts.lua -msgid "Leather" -msgstr "Pelle" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Carne cruda" - -#: crafts.lua -msgid "Meat" -msgstr "Carne" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Lazo (click di destro per mettere l'animale nell'inventario)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Rete (click destro per mettere l'animale nell'inventario)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Cesoie d'acciaio (click destro per tosare)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "Runa di protezione per mob" - -#: crafts.lua -msgid "Saddle" -msgstr "Sella" - -#: crafts.lua -msgid "Mob Fence" -msgstr "" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Generatore di mob" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Mob LuceMin LuceMax Ammontare DistGiocat." - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Generatore inattivo (inserire le impostazioni)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Generatore attivo (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Impostazioni del generatore di mob fallite!" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" -"Sintassi: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 per " -"disabilitare] distance[1-20] y_offset[-10 to 10]”" diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr index b5f4d702a..f423547b2 100644 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr @@ -3,3 +3,6 @@ Peaceful mode active! No monsters will spawn.=Friedlicher Modus aktiv! Es werden This allows you to place a single mob.=Damit kann man eine Mob platzieren. 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.=Platzieren Sie dies einfach dort, wo der Mob auftauchen soll. Tiere werden zahm erscheinen, außer, wenn Sie beim Platzieren die Schlichtaste drücken. Platzieren Sie dies auf einem Mobspawner, um den Mob im Mobspawner zu wechseln. You need the “maphack” privilege to change the mob spawner.=Sie brauchen das „maphack“-Privileg, um den Mobspawner ändern zu können. +Name Tag=Namensschild +A name tag is an item to name a mob.=Ein Namensschild ist ein Gegenstand, um einen Mob zu benennen. +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.=Bevor Sie ein Namensschild benutzen können, müssen Sie ihn an einem Amboss benennen. Dann können können Sie das Namensschild benutztn, um einen Mob zu benennen. Das wird das Namensschild verbrauchen. diff --git a/mods/ENTITIES/mcl_mobs/locale/ms.po b/mods/ENTITIES/mcl_mobs/locale/ms.po deleted file mode 100644 index a2a31f3f8..000000000 --- a/mods/ENTITIES/mcl_mobs/locale/ms.po +++ /dev/null @@ -1,131 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-05 23:40+0800\n" -"PO-Revision-Date: 2018-02-05 23:51+0800\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.6\n" -"Last-Translator: MuhdNurHidayat (MNH48) \n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Language: ms\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "** Mod Aman Diaktifkan - Tiada Raksasa Akan Muncul" - -#: api.lua -msgid "Mob has been protected!" -msgstr "Mob telah pun dilindungi!" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "@1 (Jinak)" - -#: api.lua -msgid "Not tamed!" -msgstr "Belum dijinakkan!" - -#: api.lua -msgid "@1 is owner!" -msgstr "Ini hak milik @1!" - -#: api.lua -msgid "Missed!" -msgstr "Terlepas!" - -#: api.lua -msgid "Already protected!" -msgstr "Telah dilindungi!" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "Mata kesihatan @1 telah penuh (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 telah dijinakkan!" - -#: api.lua -msgid "Enter name:" -msgstr "Masukkan nama:" - -#: api.lua -msgid "Rename" -msgstr "Namakan semula" - -#: crafts.lua -msgid "Name Tag" -msgstr "Tanda Nama" - -#: crafts.lua -msgid "Leather" -msgstr "Kulit" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Daging Mentah" - -#: crafts.lua -msgid "Meat" -msgstr "Daging Bakar" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Tanjul (klik-kanan haiwan untuk masukkan ke inventori)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Jaring (klik-kanan haiwan untuk masukkan ke inventori)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Ketam Keluli (klik-kanan untuk mengetam bulu biri-biri)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "Rune Perlindungan Mob" - -#: crafts.lua -msgid "Saddle" -msgstr "Pelana" - -#: crafts.lua -msgid "Mob Fence" -msgstr "Pagar Mob" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Pewujud Mob" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Mob CahayaMin CahayaMax Amaun JarakPemain" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Pewujud Mob Tidak Aktif (masukkan tetapan)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Pewujud Mob Aktif (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Penetapan Pewujud Mob gagal!" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" -"Sintaks: \"nama cahaya_minimum[0-14] cahaya_maksimum[0-14] " -"amaun_mob_maksimum[0 untuk lumpuhkan] jarak[1-20] ketinggian[-10 hingga 10]\"" diff --git a/mods/ENTITIES/mcl_mobs/locale/pt.po b/mods/ENTITIES/mcl_mobs/locale/pt.po deleted file mode 100644 index b52afd622..000000000 --- a/mods/ENTITIES/mcl_mobs/locale/pt.po +++ /dev/null @@ -1,133 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: mobs\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 16:48+0200\n" -"PO-Revision-Date: 2017-07-02 14:55+0200\n" -"Last-Translator: Wuzzy \n" -"Language-Team: \n" -"Language: pt\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.2\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "" - -#: api.lua -msgid "Mob has been protected!" -msgstr "" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "" - -#: api.lua -msgid "Not tamed!" -msgstr "Indomesticado!" - -#: api.lua -msgid "@1 is owner!" -msgstr "Dono @1!" - -#: api.lua -msgid "Missed!" -msgstr "Faltou!" - -#: api.lua -msgid "Already protected!" -msgstr "" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 em plena saude (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 foi domesticado!" - -#: api.lua -msgid "Enter name:" -msgstr "Insira um nome:" - -#: api.lua -msgid "Rename" -msgstr "Renomear" - -#: crafts.lua -msgid "Name Tag" -msgstr "Etiqueta" - -#: crafts.lua -msgid "Leather" -msgstr "Couro" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Carne crua" - -#: crafts.lua -msgid "Meat" -msgstr "Carne" - -#: crafts.lua -#, fuzzy -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Laço (clique-direito no animal para por no inventario)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Net (clique-direito no animal para por no inventario)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Tesoura de Aço (clique-direito para tosquiar)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "" - -#: crafts.lua -msgid "Saddle" -msgstr "" - -#: crafts.lua -msgid "Mob Fence" -msgstr "" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Spawnador de Mob" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Mob LuzMinima LuzMaxima Valor DistJogador" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Spawnador Inativo (configurar)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Spawnador Ativo (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Configuraçao de Spawnador do Mob falhou!" - -#: spawner.lua -#, fuzzy -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" -"> nome luz_min[0-14] luz_max[0-14] max_mobs_na_area[0 para desabilitar] " -"distancia[1-20] y_offset[-10 a 10]" diff --git a/mods/ENTITIES/mcl_mobs/locale/ru.po b/mods/ENTITIES/mcl_mobs/locale/ru.po deleted file mode 100644 index 6cde7ef91..000000000 --- a/mods/ENTITIES/mcl_mobs/locale/ru.po +++ /dev/null @@ -1,129 +0,0 @@ -# Russian translation for the mobs_redo mod. -# Copyright (C) 2018 TenPlus1 -# This file is distributed under the same license as the mobs_redo package. -# Oleg720 , 2017. -# CodeXP , 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-08-13 15:47+0200\n" -"PO-Revision-Date: 2018-03-23 22:22+0100\n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "** Мирный модус активирован - монстры не спаунятся" - -#: api.lua -msgid "Mob has been protected!" -msgstr "Моб защищен!" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "@1 (Прирученный)" - -#: api.lua -msgid "Not tamed!" -msgstr "Не прирученный" - -#: api.lua -msgid "@1 is owner!" -msgstr "@1 владелец" - -#: api.lua -msgid "Missed!" -msgstr "Промазал!" - -#: api.lua -msgid "Already protected!" -msgstr "Уже защищен!" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 при полном здоровье (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 приручен" - -#: api.lua -msgid "Enter name:" -msgstr "Введите имя:" - -#: api.lua -msgid "Rename" -msgstr "Переименовать" - -#: crafts.lua -msgid "Name Tag" -msgstr "Новый тэг" - -#: crafts.lua -msgid "Leather" -msgstr "Кожа" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Сырое мясо" - -#: crafts.lua -msgid "Meat" -msgstr "Мясо" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Лассо (Правый клик - положить животное в инвентарь)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Сеть (Правый клик - положить животное в инвентарь)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Ножницы (Правый клик - подстричь)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "Защитная руна мобов" - -#: crafts.lua -msgid "Saddle" -msgstr "Седло" - -#: crafts.lua -msgid "Mob Fence" -msgstr "Забор от мобов" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Спаунер моба" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Спаунер не активен (введите настройки)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Активные спаунер (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Настройки спаунера моба провалились" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" diff --git a/mods/ENTITIES/mcl_mobs/locale/template.pot b/mods/ENTITIES/mcl_mobs/locale/template.pot deleted file mode 100644 index af31440e2..000000000 --- a/mods/ENTITIES/mcl_mobs/locale/template.pot +++ /dev/null @@ -1,128 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 16:48+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "" - -#: api.lua -msgid "Mob has been protected!" -msgstr "" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "" - -#: api.lua -msgid "Not tamed!" -msgstr "" - -#: api.lua -msgid "@1 is owner!" -msgstr "" - -#: api.lua -msgid "Missed!" -msgstr "" - -#: api.lua -msgid "Already protected!" -msgstr "" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "" - -#: api.lua -msgid "Enter name:" -msgstr "" - -#: api.lua -msgid "Rename" -msgstr "" - -#: crafts.lua -msgid "Name Tag" -msgstr "" - -#: crafts.lua -msgid "Leather" -msgstr "" - -#: crafts.lua -msgid "Raw Meat" -msgstr "" - -#: crafts.lua -msgid "Meat" -msgstr "" - -#: crafts.lua -msgid "Lasso (right-click animal to put in inventory)" -msgstr "" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "" - -#: crafts.lua -msgid "Saddle" -msgstr "" - -#: crafts.lua -msgid "Mob Fence" -msgstr "" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "" - -#: spawner.lua -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" diff --git a/mods/ENTITIES/mcl_mobs/locale/template.txt b/mods/ENTITIES/mcl_mobs/locale/template.txt index 66565375d..db0c4d53a 100644 --- a/mods/ENTITIES/mcl_mobs/locale/template.txt +++ b/mods/ENTITIES/mcl_mobs/locale/template.txt @@ -3,3 +3,6 @@ Peaceful mode active! No monsters will spawn.= This allows you to place a single 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.= You need the “maphack” privilege to change the mob spawner.= +Name Tag= +A name tag is an item to name a 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.= diff --git a/mods/ENTITIES/mcl_mobs/locale/tr.po b/mods/ENTITIES/mcl_mobs/locale/tr.po deleted file mode 100644 index 10688e20d..000000000 --- a/mods/ENTITIES/mcl_mobs/locale/tr.po +++ /dev/null @@ -1,133 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: mobs\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-02 16:48+0200\n" -"PO-Revision-Date: 2017-07-02 14:56+0200\n" -"Last-Translator: Wuzzy \n" -"Language-Team: \n" -"Language: tr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.2\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: api.lua -msgid "** Peaceful Mode Active - No Monsters Will Spawn" -msgstr "" - -#: api.lua -msgid "Mob has been protected!" -msgstr "" - -#: api.lua -msgid "@1 (Tamed)" -msgstr "" - -#: api.lua -msgid "Not tamed!" -msgstr "Evcil değil!" - -#: api.lua -msgid "@1 is owner!" -msgstr "Sahibi @1!" - -#: api.lua -msgid "Missed!" -msgstr "Kaçırdın!" - -#: api.lua -msgid "Already protected!" -msgstr "" - -#: api.lua -msgid "@1 at full health (@2)" -msgstr "@1 tam canında (@2)" - -#: api.lua -msgid "@1 has been tamed!" -msgstr "@1 tamamen evcilleştirilmiştir!" - -#: api.lua -msgid "Enter name:" -msgstr "İsim gir:" - -#: api.lua -msgid "Rename" -msgstr "Yeniden adlandır" - -#: crafts.lua -msgid "Name Tag" -msgstr "İsim etiketi" - -#: crafts.lua -msgid "Leather" -msgstr "Deri" - -#: crafts.lua -msgid "Raw Meat" -msgstr "Çiğ et" - -#: crafts.lua -msgid "Meat" -msgstr "Et" - -#: crafts.lua -#, fuzzy -msgid "Lasso (right-click animal to put in inventory)" -msgstr "Kement (hayvana sağ tıklayarak envantere koy)" - -#: crafts.lua -msgid "Net (right-click animal to put in inventory)" -msgstr "Ağ (hayvana sağ tıklayarak envantere koy)" - -#: crafts.lua -msgid "Steel Shears (right-click to shear)" -msgstr "Çelik makas (sağ tıklayarak kes)" - -#: crafts.lua -msgid "Mob Protection Rune" -msgstr "" - -#: crafts.lua -msgid "Saddle" -msgstr "" - -#: crafts.lua -msgid "Mob Fence" -msgstr "Canavar Yaratıcı" - -#: spawner.lua -msgid "Mob Spawner" -msgstr "Canavar Yaratıcı" - -#: spawner.lua -msgid "Mob MinLight MaxLight Amount PlayerDist" -msgstr "Mob MinIşık MaxIşık Miktar OyuncuMesafesi" - -#: spawner.lua -msgid "Spawner Not Active (enter settings)" -msgstr "Yaratıcı aktif değil (ayarlara gir)" - -#: spawner.lua -msgid "Spawner Active (@1)" -msgstr "Yaratıcı aktif (@1)" - -#: spawner.lua -msgid "Mob Spawner settings failed!" -msgstr "Yaratıcı ayarları uygulanamadı." - -#: spawner.lua -#, fuzzy -msgid "" -"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " -"distance[1-20] y_offset[-10 to 10]”" -msgstr "" -"> isim min_isik[0-14] max_isik[0-14] alandaki_max_canavar_sayisi[kapatmak " -"icin 0] mesafe[1-20] y_cikinti[-10 ve 10 arası]" diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr index 55ec038fd..c12da5790 100644 --- a/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr +++ b/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr @@ -2,7 +2,7 @@ Bone Meal=Knochenmehl Light Grey Dye=Hellgrauer Farbstoff Grey Dye=Grauer Farbstoff -Ink Sac=Tintensack +Ink Sac=Tintenbeutel Purple Dye=Violetter Farbstoff Lapis Lazuli=Lapislazuli Light Blue Dye=Hellblauer Farbstoff diff --git a/mods/ITEMS/mcl_sponges/locale/mcl_sponges.de.tr b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.de.tr new file mode 100644 index 000000000..d226e8d1f --- /dev/null +++ b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.de.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_sponges +Sponge=Schwamm +Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.=Schwämme sind Blöcke, die Wasser um sie herum entfernen, wenn sie platziert wurden oder in Berührung mit Wasser kommen, was sie in einen nassen Schwamm verwandelt. +Waterlogged Sponge=Wassergetränkter Schwamm +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.=Ein wassergetränkter Schwamm kann in einem Ofen getrocknet werden, um ihn zu einem (trockenem) Schwamm zu verwandeln. Wenn es einen leeren Eimer im Brennstoffplatz des Ofens gibt, wird das Wasser in den Eimer fließen. +Riverwaterlogged Sponge=Flusswassergetränkter Schwamm +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.=Dies ist ein Schwamm, der triefend nass und voller Flusswasser ist. Er kann in einem Ofen getrocknet werden, um ihn zu einem (trockenem) Schwamm zu verwandeln. Wenn es einen leeren Eimer im Brennstoffplatz des Ofens gibt, wird das Flusswasser in den Eimer fließen. +A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.=Ein Schwamm wird flusswassergetränkt (statt wassergetränkt), wenn er mehr Flusswasser als (normales) Wasser aufsaugt. diff --git a/mods/ITEMS/mcl_sponges/locale/template.txt b/mods/ITEMS/mcl_sponges/locale/template.txt index d226e8d1f..2de972267 100644 --- a/mods/ITEMS/mcl_sponges/locale/template.txt +++ b/mods/ITEMS/mcl_sponges/locale/template.txt @@ -1,8 +1,8 @@ # textdomain: mcl_sponges -Sponge=Schwamm -Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.=Schwämme sind Blöcke, die Wasser um sie herum entfernen, wenn sie platziert wurden oder in Berührung mit Wasser kommen, was sie in einen nassen Schwamm verwandelt. -Waterlogged Sponge=Wassergetränkter Schwamm -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.=Ein wassergetränkter Schwamm kann in einem Ofen getrocknet werden, um ihn zu einem (trockenem) Schwamm zu verwandeln. Wenn es einen leeren Eimer im Brennstoffplatz des Ofens gibt, wird das Wasser in den Eimer fließen. -Riverwaterlogged Sponge=Flusswassergetränkter Schwamm -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.=Dies ist ein Schwamm, der triefend nass und voller Flusswasser ist. Er kann in einem Ofen getrocknet werden, um ihn zu einem (trockenem) Schwamm zu verwandeln. Wenn es einen leeren Eimer im Brennstoffplatz des Ofens gibt, wird das Flusswasser in den Eimer fließen. -A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.=Ein Schwamm wird flusswassergetränkt (statt wassergetränkt), wenn er mehr Flusswasser als (normales) Wasser aufsaugt. +Sponge= +Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.= +Waterlogged Sponge= +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.= +Riverwaterlogged Sponge= +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.= +A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.= diff --git a/mods/ITEMS/mclx_stairs/init.lua b/mods/ITEMS/mclx_stairs/init.lua index 9bd64d595..70ffdc33c 100644 --- a/mods/ITEMS/mclx_stairs/init.lua +++ b/mods/ITEMS/mclx_stairs/init.lua @@ -28,32 +28,31 @@ mcl_stairs.register_slab("stonebrickcracked", "mcl_core:stonebrickcracked", S("Cracked Stone Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 2, S("Double Cracked Stone Brick Slab"), "mcl_core:stonebrickcracked") --- TODO: Localize local block = {} block.dyes = { - {"white", "White", "white"}, - {"grey", "Grey", "dark_grey"}, - {"silver", "Light Grey", "grey"}, - {"black", "Black", "black"}, - {"red", "Red", "red"}, - {"yellow", "Yellow", "yellow"}, - {"green", "Green", "dark_green"}, - {"cyan", "Cyan", "cyan"}, - {"blue", "Blue", "blue"}, - {"magenta", "Magenta", "magenta"}, - {"orange", "Orange", "orange"}, - {"purple", "Purple", "violet"}, - {"brown", "Brown", "brown"}, - {"pink", "Pink", "pink"}, - {"lime", "Lime", "green"}, - {"light_blue", "Light Blue", "lightblue"}, + {"white", S("White Concrete Stairs"), S("White Concrete Slab"), S("Double White Concrete Slab"), "white"}, + {"grey", S("Grey Concrete Stairs"), S("Grey Concrete Slab"), S("Double Grey Concrete Slab"), "dark_grey"}, + {"silver", S("Light Grey Concrete Stairs"), S("Light Grey Concrete Slab"), S("Double Light Grey Concrete Slab"), "grey"}, + {"black", S("Black Concrete Stairs"), S("Black Concrete Slab"), S("Double Black Concrete Slab"), "black"}, + {"red", S("Red Concrete Stairs"), S("Red Concrete Slab"), S("Double Red Concrete Slab"), "red"}, + {"yellow", S("Yellow Concrete Stairs"), S("Yellow Concrete Slab"), S("Double Yellow Concrete Slab"), "yellow"}, + {"green", S("Green Concrete Stairs"), S("Green Concrete Slab"), S("Double Green Concrete Slab"), "dark_green"}, + {"cyan", S("Cyan Concrete Stairs"), S("Cyan Concrete Slab"), S("Double Cyan Concrete Slab"), "cyan"}, + {"blue", S("Blue Concrete Stairs"), S("Blue Concrete Slab"), S("Double Blue Concrete Slab"), "blue"}, + {"magenta", S("Magenta Concrete Stairs"), S("Magenta Concrete Slab"), S("Double Magenta Concrete Slab"), "magenta"}, + {"orange", S("Orange Concrete Stairs"), S("Orange Concrete Slab"), S("Double Orange Concrete Slab"), "orange"}, + {"purple", S("Purple Concrete Stairs"), S("Purple Concrete Slab"), S("Double Purple Concrete Slab"), "violet"}, + {"brown", S("Brown Concrete Stairs"), S("Brown Concrete Slab"), S("Double Brown Concrete Slab"), "brown"}, + {"pink", S("Pink Concrete Stairs"), S("Pink Concrete Slab"), S("Double Pink Concrete Slab"), "pink"}, + {"lime", S("Lime Concrete Stairs"), S("Lime Concrete Slab"), S("Double Lime Concrete Slab"), "green"}, + {"light_blue", S("Light Blue Concrete Stairs"), S("Light Blue Concrete Slab"), S("Double Light Blue Concrete Slab"), "lightblue"}, } for i=1, #block.dyes do local c = block.dyes[i][1] mcl_stairs.register_stair_and_slab_simple("concrete_"..c, "mcl_colorblocks:concrete_"..c, - block.dyes[i][2].." Concrete Stairs", - block.dyes[i][2].." Concrete Slab", - "Double "..block.dyes[i][2].." Concrete Slab") + block.dyes[i][2], + block.dyes[i][3], + block.dyes[i][4]) end diff --git a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr index b2c11ed67..a9973c77f 100644 --- a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr +++ b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr @@ -29,3 +29,51 @@ Stairs of Iron=Eisentreppe Cracked Stone Brick Stairs=Rissige Steinziegeltreppe Cracked Stone Brick Slab=Rissige Steinziegelplatte Double Cracked Stone Brick Slab=Doppelte rissige Steinziegelplatte +White Concrete Stairs=Weiße Betontreppe +White Concrete Slab=Weiße Betonplatte +Double White Concrete Slab=Doppelte weiße Betonplatte +Grey Concrete Stairs=Graue Betontreppe +Grey Concrete Slab=Graue Betonplatte +Double Grey Concrete Slab=Doppelte graue Betonplatte +Light Grey Concrete Stairs=Hellgraue Betontreppe +Light Grey Concrete Slab=Hellgraue Betonplatte +Double Light Grey Concrete Slab=Doppelte hellgraue Betonplatte +Black Concrete Stairs=Schwarze Betontreppe +Black Concrete Slab=Schwarze Betonplatte +Double Black Concrete Slab=Doppelte schwarze Betonplatte +Red Concrete Stairs=Rote Betontreppe +Red Concrete Slab=Rote Betonplatte +Double Red Concrete Slab=Doppelte rote Betonplatte +Yellow Concrete Stairs=Gelbe Betontreppe +Yellow Concrete Slab=Gelbe Betonplatte +Double Yellow Concrete Slab=Doppelte gelbe Betonplatte +Green Concrete Stairs=Grüne Betontreppe +Green Concrete Slab=Grüne Betonplatte +Double Green Concrete Slab=Doppelte grüne Betonplatte +Cyan Concrete Stairs=Türkise Betontreppe +Cyan Concrete Slab=Türkise Betonplatte +Double Cyan Concrete Slab=Doppelte Türkise Betonplatte +Blue Concrete Stairs=Blaue Betontreppe +Blue Concrete Slab=Blaue Betonplatte +Double Blue Concrete Slab=Doppelte blaue Betonplatte +Magenta Concrete Stairs=Magenta Betontreppe +Magenta Concrete Slab=Magenta Betonplatte +Double Magenta Concrete Slab=Doppelte magenta Betonplatte +Orange Concrete Stairs=Orange Betontreppe +Orange Concrete Slab=Orange Betonplatte +Double Orange Concrete Slab=Doppelte orange Betonplatte +Purple Concrete Stairs=Violette Betontreppe +Purple Concrete Slab=Violette Betonplatte +Double Purple Concrete Slab=Doppelte violette Betonplatte +Brown Concrete Stairs=Braune Betontreppe +Brown Concrete Slab=Braune Betonplatte +Double Brown Concrete Slab=Doppelte braune Betonplatte +Pink Concrete Stairs=Rosa Betontreppe +Pink Concrete Slab=Rosa Betonplatte +Double Pink Concrete Slab=Doppelte rosa Betonplatte +Lime Concrete Stairs=Lindgrüne Betontreppe +Lime Concrete Slab=Lindgrüne Betonplatte +Double Lime Concrete Slab=Doppelte Betonplatte +Light Blue Concrete Stairs=Hellblaue Betontreppe +Light Blue Concrete Slab=Hellblaue Betonplatte +Double Light Blue Concrete Slab=Doppelte hellblaue Betonplatte diff --git a/mods/ITEMS/mclx_stairs/locale/template.txt b/mods/ITEMS/mclx_stairs/locale/template.txt index 8237d4161..fcadd57ec 100644 --- a/mods/ITEMS/mclx_stairs/locale/template.txt +++ b/mods/ITEMS/mclx_stairs/locale/template.txt @@ -29,3 +29,51 @@ Stairs of Iron= Cracked Stone Brick Stairs= Cracked Stone Brick Slab= Double Cracked Stone Brick Slab= +White Concrete Stairs= +White Concrete Slab= +Double White Concrete Slab= +Grey Concrete Stairs= +Grey Concrete Slab= +Double Grey Concrete Slab= +Light Grey Concrete Stairs= +Light Grey Concrete Slab= +Double Light Grey Concrete Slab= +Black Concrete Stairs= +Black Concrete Slab= +Double Black Concrete Slab= +Red Concrete Stairs= +Red Concrete Slab= +Double Red Concrete Slab= +Yellow Concrete Stairs= +Yellow Concrete Slab= +Double Yellow Concrete Slab= +Green Concrete Stairs= +Green Concrete Slab= +Double Green Concrete Slab= +Cyan Concrete Stairs= +Cyan Concrete Slab= +Double Cyan Concrete Slab= +Blue Concrete Stairs= +Blue Concrete Slab= +Double Blue Concrete Slab= +Magenta Concrete Stairs= +Magenta Concrete Slab= +Double Magenta Concrete Slab= +Orange Concrete Stairs= +Orange Concrete Slab= +Double Orange Concrete Slab= +Purple Concrete Stairs= +Purple Concrete Slab= +Double Purple Concrete Slab= +Brown Concrete Stairs= +Brown Concrete Slab= +Double Brown Concrete Slab= +Pink Concrete Stairs= +Pink Concrete Slab= +Double Pink Concrete Slab= +Lime Concrete Stairs= +Lime Concrete Slab= +Double Lime Concrete Slab= +Light Blue Concrete Stairs= +Light Blue Concrete Slab= +Double Light Blue Concrete Slab= diff --git a/mods/ITEMS/xpanes/locale/xpanes.de.tr b/mods/ITEMS/xpanes/locale/xpanes.de.tr index 7c3c430ef..1a024e740 100644 --- a/mods/ITEMS/xpanes/locale/xpanes.de.tr +++ b/mods/ITEMS/xpanes/locale/xpanes.de.tr @@ -3,19 +3,19 @@ Glass panes are thin layers of glass which neatly connect to their neighbors as Iron Bars=Eisenstangen Iron bars neatly connect to their neighbors as you build them.=Eisenstangen verbinden sich mit den Nachbarn, wenn sie gebaut werden. Glass Pane=Glasscheibe -Red Stained Glass Pane=Rot gefärbtes Buntglas -Green Stained Glass Pane=Grün gefärbtes Buntglas -Blue Stained Glass Pane=Blau gefärbtes Buntglas -Light Blue Stained Glass Pane=Hellblau gefärbtes Buntglas -Black Stained Glass Pane=Schwarz gefärbtes Buntglas -White Stained Glass Pane=Weiß gefärbtes Buntglas -Yellow Stained Glass Pane=Gelb gefärbtes Buntglas -Brown Stained Glass Pane=Braun gefärbtes Buntglas -Orange Stained Glass Pane=Orange gefärbtes Buntglas -Pink Stained Glass Pane=Rosa gefärbtes Buntglas -Grey Stained Glass Pane=Grau gefärbtes Buntglas -Lime Stained Glass Pane=Lindgrün gefärbtes Buntglas -Light Grey Stained Glass Pane=Hellgrau gefärbtes Buntglas -Magenta Stained Glass Pane=Magenta gefärbtes Buntglas -Purple Stained Glass Pane=Violett gefärbtes Buntglas -Cyan Stained Glass Pane=Türkis gefärbtes Buntglas +Red Stained Glass Pane=Rote Buntglasscheibe +Green Stained Glass Pane=Grüne Buntglasscheibe +Blue Stained Glass Pane=Blaue Buntglasscheibe +Light Blue Stained Glass Pane=Hellblaue Buntglasscheibe +Black Stained Glass Pane=Schwarze Buntglasscheibe +White Stained Glass Pane=Weiße Buntglasscheibe +Yellow Stained Glass Pane=Gelbe Buntglasscheibe +Brown Stained Glass Pane=Braune Buntglasscheibe +Orange Stained Glass Pane=Orange Buntglasscheibe +Pink Stained Glass Pane=Rosa Buntglasscheibe +Grey Stained Glass Pane=Graue Buntglasscheibe +Lime Stained Glass Pane=Lindgrüne Buntglasscheibe +Light Grey Stained Glass Pane=Hellgraue Buntglasscheibe +Magenta Stained Glass Pane=Magenta Buntglasscheibe +Purple Stained Glass Pane=Violette Buntglasscheibe +Cyan Stained Glass Pane=Türkise Buntglasscheibe From 8ee1521f14bd85c65274f5a3340d835be66ed245 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 16 Mar 2019 02:44:52 +0100 Subject: [PATCH 202/379] Translation: Add support for horse armor --- mods/ENTITIES/mobs_mc/1_items_default.lua | 12 ++++++------ mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr | 6 ++++++ mods/ENTITIES/mobs_mc/locale/template.txt | 6 ++++++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/1_items_default.lua b/mods/ENTITIES/mobs_mc/1_items_default.lua index 3a58bd493..9a36256ac 100644 --- a/mods/ENTITIES/mobs_mc/1_items_default.lua +++ b/mods/ENTITIES/mobs_mc/1_items_default.lua @@ -278,8 +278,8 @@ local horse_armor_use = "Rightclick a horse to put on the horse armor. Donkeys a -- TODO: Balance the horse armor strength, compare with MC armor strength if c("iron_horse_armor") then minetest.register_craftitem("mobs_mc:iron_horse_armor", { - description = "Iron Horse Armor", - _doc_items_longdesc = "Iron horse armor can be worn by horses to increase their protection from harm a bit.", + description = S("Iron Horse Armor"), + _doc_items_longdesc = S("Iron horse armor can be worn by horses to increase their protection from harm a bit."), _doc_items_usagehelp = horse_armor_use, inventory_image = "mobs_mc_iron_horse_armor.png", _horse_overlay_image = "mobs_mc_horse_armor_iron.png", @@ -289,8 +289,8 @@ if c("iron_horse_armor") then end if c("gold_horse_armor") then minetest.register_craftitem("mobs_mc:gold_horse_armor", { - description = "Golden Horse Armor", - _doc_items_longdesc = "Golden horse armor can be worn by horses to increase their protection from harm.", + description = S("Golden Horse Armor"), + _doc_items_longdesc = S("Golden horse armor can be worn by horses to increase their protection from harm."), _doc_items_usagehelp = horse_armor_use, inventory_image = "mobs_mc_gold_horse_armor.png", _horse_overlay_image = "mobs_mc_horse_armor_gold.png", @@ -300,8 +300,8 @@ if c("gold_horse_armor") then end if c("diamond_horse_armor") then minetest.register_craftitem("mobs_mc:diamond_horse_armor", { - description = "Diamond Horse Armor", - _doc_items_longdesc = "Diamond horse armor can be worn by horses to greatly increase their protection from harm.", + description = S("Diamond Horse Armor"), + _doc_items_longdesc = S("Diamond horse armor can be worn by horses to greatly increase their protection from harm."), _doc_items_usagehelp = horse_armor_use, inventory_image = "mobs_mc_diamond_horse_armor.png", _horse_overlay_image = "mobs_mc_horse_armor_diamond.png", diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr index c5b6e73c9..ce21cf817 100644 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr @@ -52,3 +52,9 @@ Wolf=Wolf Husk=Wüstenzombie Zombie=Zombie Zombie Pigman=Schweinezombie +Iron Horse Armor=Eisenpferderüstung +Iron horse armor can be worn by horses to increase their protection from harm a bit.=Eine Eisenpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden etwas zu erhöhen. +Golden Horse Armor=Goldpferderüstung +Golden horse armor can be worn by horses to increase their protection from harm.=Eine Goldpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden zu erhöhen. +Diamond Horse Armor=Diamantpferderüstung +Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Eine Diamantpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden beträchtlich zu erhöhen. diff --git a/mods/ENTITIES/mobs_mc/locale/template.txt b/mods/ENTITIES/mobs_mc/locale/template.txt index 0b80aef62..6b36cc8fd 100644 --- a/mods/ENTITIES/mobs_mc/locale/template.txt +++ b/mods/ENTITIES/mobs_mc/locale/template.txt @@ -52,3 +52,9 @@ Wolf= Husk= Zombie= Zombie Pigman= +Iron Horse Armor= +Iron horse armor can be worn by horses to increase their protection from harm a bit.= +Golden Horse Armor= +Golden horse armor can be worn by horses to increase their protection from harm.= +Diamond Horse Armor= +Diamond horse armor can be worn by horses to greatly increase their protection from harm.= From 8cfcbea9cb6f0a7682f8fc370daa4cf56a60ed64 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 16 Mar 2019 03:09:51 +0100 Subject: [PATCH 203/379] Fix commandblock crash if opening empty one --- mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index 281b97b10..7cd7d6c5a 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -145,6 +145,9 @@ local on_rightclick = function(pos, node, player, itemstack, pointed_thing) local meta = minetest.get_meta(pos) local commands = meta:get_string("commands") + if not commands then + commands = "" + end local commander = meta:get_string("commander") local commanderstr if commander == "" or commander == nil then @@ -263,7 +266,7 @@ minetest.register_node("mesecons_commandblock:commandblock_on", { minetest.register_on_player_receive_fields(function(player, formname, fields) if string.sub(formname, 1, 13) == "commandblock_" then - if not fields.submit and not fields.key_enter and not fields.doc then + if (not fields.submit and not fields.key_enter and not fields.doc) or (not fields.commands) then return end local privs = minetest.get_player_privs(player:get_player_name()) From 7aaafdca03cea0bc42dc9f6256b3d6b3229071fb Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 16 Mar 2019 03:18:16 +0100 Subject: [PATCH 204/379] Translate a few missing formspec elements --- mods/ITEMS/mcl_beds/functions.lua | 21 ++++++++++--------- mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr | 7 +++++++ mods/ITEMS/mcl_beds/locale/template.txt | 7 +++++++ mods/ITEMS/mcl_crafting_table/init.lua | 2 +- .../locale/mcl_crafting_table.de.tr | 1 + .../mcl_crafting_table/locale/template.txt | 1 + mods/ITEMS/mcl_furnaces/init.lua | 4 ++-- .../mcl_furnaces/locale/mcl_furnaces.de.tr | 1 + mods/ITEMS/mcl_furnaces/locale/template.txt | 1 + 9 files changed, 32 insertions(+), 13 deletions(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 3a4877a68..73e1cebcb 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("mcl_beds") +local F = minetest.formspec_escape local pi = math.pi local player_in_bed = 0 @@ -201,8 +202,8 @@ local function update_formspecs(finished) local form_n = "size[8,15;true]" local all_in_bed = ges == player_in_bed local night_skip = is_night_skip_enabled() - local button_leave = "button_exit[2,12;4,0.75;leave;Leave bed]" - local button_abort = "button_exit[2,12;4,0.75;leave;Abort sleep]" + local button_leave = "button_exit[2,12;4,0.75;leave;"..F(S("Leave bed")).."]" + local button_abort = "button_exit[2,12;4,0.75;leave;"..F(S("Abort sleep")).."]" local bg_presleep = "bgcolor[#00000080;true]" local bg_sleep = "bgcolor[#000000FF;true]" @@ -212,33 +213,33 @@ local function update_formspecs(finished) end return elseif not is_sp then - local text = string.format("Players in bed: %d/%d", player_in_bed, ges) + local text = S("Players in bed: @1/@2", player_in_bed, ges) if not night_skip then - text = text .. "\n" .. "Note: Night skip is disabled." + text = text .. "\n" .. S("Note: Night skip is disabled.") form_n = form_n .. bg_presleep form_n = form_n .. button_leave elseif all_in_bed then - text = text .. "\n" .. "You're sleeping." + text = text .. "\n" .. S("You're sleeping.") form_n = form_n .. bg_sleep form_n = form_n .. button_abort else - text = text .. "\n" .. "You will fall asleep when all players are in bed." + text = text .. "\n" .. S("You will fall asleep when all players are in bed.") form_n = form_n .. bg_presleep form_n = form_n .. button_leave end - form_n = form_n .. "label[2.2,7.5;"..minetest.formspec_escape(text).."]" + form_n = form_n .. "label[2.2,7.5;"..F(text).."]" else local text if night_skip then - text = "You're sleeping." + text = S("You're sleeping.") form_n = form_n .. bg_sleep form_n = form_n .. button_abort else - text = "You're in bed." .. "\n" .. "Note: Night skip is disabled." + text = S("You're in bed.") .. "\n" .. S("Note: Night skip is disabled.") form_n = form_n .. bg_presleep form_n = form_n .. button_leave end - form_n = form_n .. "label[2.2,7.5;"..minetest.formspec_escape(text).."]" + form_n = form_n .. "label[2.2,7.5;"..F(text).."]" end for name,_ in pairs(mcl_beds.player) do diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr index 1404bbf84..bcf26fc3e 100644 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr @@ -30,3 +30,10 @@ It's too dangerous to sleep here!=Es ist zu gefährlich, hier zu schlafen! New respawn position set! But you can only sleep at night or during a thunderstorm.=Neue Wiedereinstiegsposition gesetzt! Aber Sie können nur nachts oder während eines Gewittersturms schlafen. You can only sleep at night or during a thunderstorm.=Sie können nur nachts oder während eines Gewittersturms schlafen. New respawn position set!=Neue Wiedereinstiegsposition gesetzt! +Leave bed=Bett verlassen +Abort sleep=Schlaf abbrechen +Players in bed: @1/@2=Spieler im Bett: @1/@2 +Note: Night skip is disabled.=Anmerkung: Überspringen der Nacht deaktiviert. +You're sleeping.=Sie schlafen. +You will fall asleep when all players are in bed.=Sie werden einschlafen, wenn alle Spieler im Bett sind. +You're in bed.=Sie sind im Bett. diff --git a/mods/ITEMS/mcl_beds/locale/template.txt b/mods/ITEMS/mcl_beds/locale/template.txt index 13901c198..0cba8424f 100644 --- a/mods/ITEMS/mcl_beds/locale/template.txt +++ b/mods/ITEMS/mcl_beds/locale/template.txt @@ -30,3 +30,10 @@ It's too dangerous to sleep here!= New respawn position set! But you can only sleep at night or during a thunderstorm.= You can only sleep at night or during a thunderstorm.= New respawn position set!= +Leave bed= +Abort sleep= +Players in bed: @1/@2= +Note: Night skip is disabled.= +You're sleeping.= +You will fall asleep when all players are in bed.= +You're in bed.= diff --git a/mods/ITEMS/mcl_crafting_table/init.lua b/mods/ITEMS/mcl_crafting_table/init.lua index cfe867c28..8cc51ac90 100644 --- a/mods/ITEMS/mcl_crafting_table/init.lua +++ b/mods/ITEMS/mcl_crafting_table/init.lua @@ -22,7 +22,7 @@ minetest.register_node("mcl_crafting_table:crafting_table", { "list[current_player;craft;1.75,0.5;3,3;]".. "list[current_player;craftpreview;6.1,1.5;1,1;]".. "image_button[0.75,1.5;1,1;craftguide_book.png;__mcl_craftguide;]".. - "tooltip[__mcl_craftguide;Recipe book]".. + "tooltip[__mcl_craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. "listring[current_player;main]".. "listring[current_player;craft]" diff --git a/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.de.tr b/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.de.tr index 5831b881c..3db0460b6 100644 --- a/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.de.tr +++ b/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.de.tr @@ -2,3 +2,4 @@ Crafting Table=Werkbank A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts.=Die Werkbank ist ein Block, mit dem Sie Zugriff auf ein 3×3-Fertigungsgitter erhalten, wodurch sie fortgeschrittene Dinge herstellen können. Rightclick the crafting table to access the 3×3 crafting grid.=Rechtsklicken Sie auf die Werkbank, um auf das 3×3-Fertigungsgitter zuzugreifen. +Recipe book=Fertigungsbuch diff --git a/mods/ITEMS/mcl_crafting_table/locale/template.txt b/mods/ITEMS/mcl_crafting_table/locale/template.txt index bd0e5879a..f08bf3a72 100644 --- a/mods/ITEMS/mcl_crafting_table/locale/template.txt +++ b/mods/ITEMS/mcl_crafting_table/locale/template.txt @@ -2,3 +2,4 @@ Crafting Table= A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts.= Rightclick the crafting table to access the 3×3 crafting grid.= +Recipe book= diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index d96bdf881..0d19a684e 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -19,7 +19,7 @@ local function active_formspec(fuel_percent, item_percent) "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:".. (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. "image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - "tooltip[craftguide;Recipe book]".. + "tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. "listring[current_name;dst]".. "listring[current_player;main]".. "listring[current_name;src]".. @@ -39,7 +39,7 @@ local inactive_formspec = "size[9,8.75]".. "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]".. "image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - "tooltip[craftguide;Recipe book]".. + "tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. "listring[current_name;dst]".. "listring[current_player;main]".. "listring[current_name;src]".. diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.de.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.de.tr index 34ea30b86..0480499c2 100644 --- a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.de.tr +++ b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.de.tr @@ -4,3 +4,4 @@ Furnaces cook or smelt several items, using a furnace fuel, into something else. Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=Benutzen Sie den Ofen, um das Ofenmenü zu öffnen. Platzieren Sie einen Brennstoff in den unteren Platz und das Quellmaterial in den oberen Platz. Der Ofen wird langsam seinen Brennstoff benutzen, um den Gegenstand zu schmelzen. Das Ergebnis landet im Ausgabeplatz rechts. Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Benutzen Sie das Rezeptbuch, um zu sehen, was Sie schmelzen können und was Sie als Brennstoff benutzen können und wie lange dieser brennt. Burning Furnace=Aktiver Ofen +Recipe book=Fertigungsbuch diff --git a/mods/ITEMS/mcl_furnaces/locale/template.txt b/mods/ITEMS/mcl_furnaces/locale/template.txt index fee08e5a2..7d75ec283 100644 --- a/mods/ITEMS/mcl_furnaces/locale/template.txt +++ b/mods/ITEMS/mcl_furnaces/locale/template.txt @@ -4,3 +4,4 @@ Furnaces cook or smelt several items, using a furnace fuel, into something else. Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.= Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.= Burning Furnace= +Recipe book= From 522a2b9a733af5d89aa8f3959b10981497594803 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 16 Mar 2019 03:19:54 +0100 Subject: [PATCH 205/379] Fix uneditable command block when empty --- mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index 7cd7d6c5a..e8749f026 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -165,7 +165,7 @@ local on_rightclick = function(pos, node, player, itemstack, pointed_thing) textarea_name = "" submit = "" end - if commands == "" then + if not can_edit and commands == "" then textarea = "label[0.5,0.5;"..F(S("No commands.")).."]" else textarea = "textarea[0.5,0.5;8.5,4;"..textarea_name..";"..F(S("Commands:"))..";"..F(commands).."]" From 550fa39d8633349b5a8efcfb5ff8a59530e74d28 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 16 Mar 2019 03:36:32 +0100 Subject: [PATCH 206/379] Make achievements translatable --- mods/HUD/awards/api.lua | 16 +++--- mods/HUD/awards/locale/awards.de.tr | 53 ++++++++++--------- mods/HUD/awards/locale/template.txt | 51 +++++++++--------- mods/HUD/awards/triggers.lua | 44 +++++++-------- mods/HUD/mcl_achievements/init.lua | 4 +- .../locale/mcl_achievements.de.tr | 14 ++--- mods/HUD/mcl_achievements/locale/template.txt | 2 +- 7 files changed, 93 insertions(+), 91 deletions(-) diff --git a/mods/HUD/awards/api.lua b/mods/HUD/awards/api.lua index d377f37ce..b25a2aaaf 100644 --- a/mods/HUD/awards/api.lua +++ b/mods/HUD/awards/api.lua @@ -274,9 +274,9 @@ function awards.unlock(name, award) elseif awards.show_mode == "chat" then local chat_announce if awdef.secret == true then - chat_announce = S("Secret achievement gotten: %s") + chat_announce = S("Secret achievement gotten: @1") else - chat_announce = S("Achievement gotten: %s") + chat_announce = S("Achievement gotten: @1") end -- use the chat console to send it minetest.chat_send_player(name, string.format(chat_announce, title)) @@ -386,12 +386,14 @@ function awards.getFormspec(name, to, sid) if def and def.title then title = def.title end - local status = "%s" + local status if item.got then - status = S("%s (got)") + status = S("@1 (got)", title) + else + status = title end formspec = formspec .. "label[1,2.75;" .. - string.format(status, minetest.formspec_escape(title)) .. + minetest.formspec_escape(status) .. "]" if def and def.icon then formspec = formspec .. "image[1,0;3,3;" .. def.icon .. "]" @@ -466,14 +468,14 @@ function awards.show_to(name, to, sid, text) minetest.chat_send_player(to, S("You have not gotten any awards.")) return end - minetest.chat_send_player(to, string.format(S("%s’s awards:"), name)) + minetest.chat_send_player(to, S("@1’s awards:"), name) for _, str in pairs(awards.players[name].unlocked) do local def = awards.def[str] if def then if def.title then if def.description then - minetest.chat_send_player(to, string.format(S("%s: %s"), def.title, def.description)) + minetest.chat_send_player(to, S("@1: @2", def.title, def.description)) else minetest.chat_send_player(to, def.title) end diff --git a/mods/HUD/awards/locale/awards.de.tr b/mods/HUD/awards/locale/awards.de.tr index 6fd3661aa..49663d119 100644 --- a/mods/HUD/awards/locale/awards.de.tr +++ b/mods/HUD/awards/locale/awards.de.tr @@ -1,13 +1,14 @@ -%s: %s=%s: %s -%s (got)=%s (erhalten) -%s’s awards:=Auszeichnungen von %s: +# textdomain:awards +@1: @2=@1: @2 +@1 (got)=@1 (erhalten) +@1’s awards:=Auszeichnungen von @1: (Secret Award)=(Geheime Auszeichnung) Achievement gotten!=Auszeichnung erhalten! Achievement gotten:=Auszeichnung erhalten: -Achievement gotten: %s=Auszeichnung erhalten: %s +Achievement gotten: @1=Auszeichnung erhalten: @1 Secret achievement gotten!=Geheime Auszeichnung erhalten! Secret achievement gotten:=Geheime Auszeichnung erhalten: -Secret achievement gotten: %s=Geheime Auszeichnung erhalten: %s +Secret achievement gotten: @1=Geheime Auszeichnung erhalten: @1 Get this achievement to find out what it is.=Verdienen Sie sich diese Auszeichnung, um herauszufinden, was sie ist. You have not gotten any awards.=Sie haben noch keine Auszeichnungen. You've disabled awards. Type /awards enable to reenable.=Sie haben die Auszeichnungen deaktiviert. Geben Sie »/awards enable« ein, um sie wieder zu aktivieren. @@ -22,29 +23,29 @@ You have disabled your achievements.=Sie haben Ihre Auszeichnungen deaktiviert. You have enabled your achievements.=Sie haben Ihre Auszeichnungen aktiviert. [c|clear|disable|enable]=[c|clear|disable|enable] Awards=Auszeichnungen -%d/%d crafted=%d/%d gefertigt -%d/%d deaths=%d/%d Tode -%d/%d dug=%d/%d abgebaut -%d/%d game joins=%d/%d Spielen beigetreten -%d/%d lines of chat=%d/%d Chatzeilen -%d/%d placed=%d/%d platziert -Die %d times.=Sterben Sie %d mal. +@1/@2 crafted=@1/@2 gefertigt +@1/@2 deaths=@1/@2 Tode +@1/@2 dug=@1/@2 abgebaut +@1/@2 game joins=@1/@2 Spielen beigetreten +@1/@2 lines of chat=@1/@2 Chatzeilen +@1/@2 placed=@1/@2 platziert +Die @1 times.=Sterben Sie @1 mal. Die.=Sterben Sie. -Craft: %d×%s=Fertigen Sie an: %d×%s -Craft: %s=Fertigen Sie an: %s -Mine a block: %s=Bauen Sie einen Block ab: %s -Mine blocks: %d×%s=Bauen Sie Blöcke ab: %d×%s -Place a block: %s=Platzieren Sie einen Block: %s -Place blocks: %d×%s=Platzieren Sie Blöcke: %d×%s +Craft: @1×@2=Fertigen Sie an: @1×@2 +Craft: @1=Fertigen Sie an: @1 +Mine a block: @1=Bauen Sie einen Block ab: @1 +Mine blocks: @1×@2=Bauen Sie Blöcke ab: @1×@2 +Place a block: @1=Platzieren Sie einen Block: @1 +Place blocks: @1×@2=Platzieren Sie Blöcke: @1×@2 Join the game.=Treten Sie dem Spiel bei. -Join the game %d times.=Treten Sie dem Spiel %d mal bei. +Join the game @1 times.=Treten Sie dem Spiel @1 mal bei. Show details of an achievement=Details einer Auszeichnung anzeigen OK=OK Error: No awards available.=Fehler: Keine Auszeichnungen vorhanden. -Eat: %d×%s=Essen Sie: %d×%s -Eat: %s=Essen Sie: %s -%d/%d eaten=%d/%d gegessen -Place %d block(s).=Platzieren Sie %d Blöcke. -Dig %d block(s).=Bauen Sie %d Blöcke ab. -Eat %d item(s).=Essen Sie %d Dinge. -Craft %d item(s).=Fertigen Sie %d Gegenstände. +Eat: @1×@2=Essen Sie: @1×@2 +Eat: @1=Essen Sie: @1 +@1/@2 eaten=@1/@2 gegessen +Place @1 block(s).=Platzieren Sie @1 Blöcke. +Dig @1 block(s).=Bauen Sie @1 Blöcke ab. +Eat @1 item(s).=Essen Sie @1 Dinge. +Craft @1 item(s).=Fertigen Sie @1 Gegenstände. diff --git a/mods/HUD/awards/locale/template.txt b/mods/HUD/awards/locale/template.txt index c5ca6ab69..bcfb67acd 100644 --- a/mods/HUD/awards/locale/template.txt +++ b/mods/HUD/awards/locale/template.txt @@ -1,39 +1,40 @@ -%d/%d chat messages= -%d/%d crafted= -%d/%d deaths= -%d/%d dug= -%d/%d game joins= -%d/%d placed= -%s (got)= -%s: %s= -%s’s awards:= +# textdomain:awards +@1/@2 chat messages= +@1/@2 crafted= +@1/@2 deaths= +@1/@2 dug= +@1/@2 game joins= +@1/@2 placed= +@1 (got)= +@1: @1= +@1’s awards:= (Secret Award)= = = A Cat in a Pop-Tart?!= Achievement gotten!= Achievement gotten:= -Achievement gotten: %s= +Achievement gotten: @1= Achievement not found.= All your awards and statistics have been cleared. You can now start again.= Awards= -Craft: %d×%s= -Craft: %s= -Die %d times.= +Craft: @1×@2= +Craft: @1= +Die @1 times.= Die.= Get the achievements statistics for the given player or yourself= -Join the game %d times.= +Join the game @1 times.= Join the game.= List awards in chat (deprecated)= -Place a block: %s= -Place blocks: %d×%s= +Place a block: @1= +Place blocks: @1×@2= Secret Achievement gotten!= Secret Achievement gotten:= -Secret Achievement gotten: %s= +Secret Achievement gotten: @1= Show details of an achievement= Show, clear, disable or enable your achievements= Get this achievement to find out what it is.= -Write %d chat messages.= +Write @1 chat messages.= Write something in chat.= You have disabled your achievements.= You have enabled your achievements.= @@ -42,10 +43,10 @@ You've disabled awards. Type /awards enable to reenable.= [c|clear|disable|enable]= OK= Error: No awards available.= -Eat: %d×%s= -Eat: %s= -%d/%d eaten= -Place %d block(s).= -Dig %d block(s).= -Eat %d item(s).= -Craft %d item(s).= +Eat: @1×@2= +Eat: @1= +@1/@2 eaten= +Place @1 block(s).= +Dig @1 block(s).= +Eat @1 item(s).= +Craft @1 item(s).= diff --git a/mods/HUD/awards/triggers.lua b/mods/HUD/awards/triggers.lua index 42e126bd4..318a4b281 100644 --- a/mods/HUD/awards/triggers.lua +++ b/mods/HUD/awards/triggers.lua @@ -32,7 +32,7 @@ awards.register_trigger("dig", function(def) end return { perc = itemcount / tmp.target, - label = string.format(S("%d/%d dug"), itemcount, tmp.target) + label = S("@1/@2 dug", itemcount, tmp.target) } end def.getDefaultDescription = function(self) @@ -42,12 +42,12 @@ awards.register_trigger("dig", function(def) nname = self.trigger.node end if self.trigger.target ~= 1 then - return string.format(S("Mine blocks: %d×%s"), self.trigger.target, nname) + return S("Mine blocks: @1×@2", self.trigger.target, nname) else - return string.format(S("Mine a block: %s"), nname) + return S("Mine a block: @1", nname) end else - return string.format(S("Mine %d block(s)."), self.trigger.target) + return S("Mine @1 block(s).", self.trigger.target) end end end) @@ -68,7 +68,7 @@ awards.register_trigger("place", function(def) end return { perc = itemcount / tmp.target, - label = string.format(S("%d/%d placed"), itemcount, tmp.target) + label = S("@1/@2 placed"), itemcount, tmp.target } end def.getDefaultDescription = function(self) @@ -78,12 +78,12 @@ awards.register_trigger("place", function(def) nname = self.trigger.node end if self.trigger.target ~= 1 then - return string.format(S("Place blocks: %d×%s"), self.trigger.target, nname) + return S("Place blocks: @1×@2", self.trigger.target, nname) else - return string.format(S("Place a block: %s"), nname) + return S("Place a block: @1", nname) end else - return string.format(S("Place %d block(s)."), self.trigger.target) + return S("Place @1 block(s).", self.trigger.target) end end end) @@ -104,7 +104,7 @@ awards.register_trigger("eat", function(def) end return { perc = itemcount / tmp.target, - label = string.format(S("%d/%d eaten"), itemcount, tmp.target) + label = S("@1/@2 eaten", itemcount, tmp.target) } end def.getDefaultDescription = function(self) @@ -114,12 +114,12 @@ awards.register_trigger("eat", function(def) iname = self.trigger.iode end if self.trigger.target ~= 1 then - return string.format(S("Eat: %d×%s"), self.trigger.target, iname) + return S("Eat: @1×@2", self.trigger.target, iname) else - return string.format(S("Eat: %s"), iname) + return S("Eat: @1", iname) end else - return string.format(S("Eat %d item(s)."), self.trigger.target) + return S("Eat @1 item(s).", self.trigger.target) end end end) @@ -134,12 +134,12 @@ awards.register_trigger("death", function(def) local itemcount = data.deaths or 0 return { perc = itemcount / tmp.target, - label = string.format(S("%d/%d deaths"), itemcount, tmp.target) + label = S("@1/@2 deaths", itemcount, tmp.target) } end def.getDefaultDescription = function(self) if self.trigger.target ~= 1 then - return string.format(S("Die %d times."), self.trigger.target) + return S("Die @1 times.", self.trigger.target) else return S("Die.") end @@ -156,12 +156,12 @@ awards.register_trigger("chat", function(def) local itemcount = data.chats or 0 return { perc = itemcount / tmp.target, - label = string.format(S("%d/%d chat messages"), itemcount, tmp.target) + label = S("@1/@2 chat messages", itemcount, tmp.target) } end def.getDefaultDescription = function(self) if self.trigger.target ~= 1 then - return string.format(S("Write %d chat messages."), self.trigger.target) + return S("Write @1 chat messages.", self.trigger.target) else return S("Write something in chat.") end @@ -178,12 +178,12 @@ awards.register_trigger("join", function(def) local itemcount = data.joins or 0 return { perc = itemcount / tmp.target, - label = string.format(S("%d/%d game joins"), itemcount, tmp.target) + label = S("@1/@2 game joins", itemcount, tmp.target) } end def.getDefaultDescription = function(self) if self.trigger.target ~= 1 then - return string.format(S("Join the game %d times."), self.trigger.target) + return S("Join the game @1 times.", self.trigger.target) else return S("Join the game.") end @@ -206,7 +206,7 @@ awards.register_trigger("craft", function(def) end return { perc = itemcount / tmp.target, - label = string.format(S("%d/%d crafted"), itemcount, tmp.target) + label = S("@1/@2 crafted", itemcount, tmp.target) } end def.getDefaultDescription = function(self) @@ -216,12 +216,12 @@ awards.register_trigger("craft", function(def) iname = self.trigger.item end if self.trigger.target ~= 1 then - return string.format(S("Craft: %d×%s"), self.trigger.target, iname) + return S("Craft: @1×@2", self.trigger.target, iname) else - return string.format(S("Craft: %s"), iname) + return S("Craft: @1", iname) end else - return string.format(S("Craft %d item(s)."), self.trigger.target) + return S("Craft @1 item(s).", self.trigger.target) end end end) diff --git a/mods/HUD/mcl_achievements/init.lua b/mods/HUD/mcl_achievements/init.lua index 8b4e1c488..cfeea18be 100644 --- a/mods/HUD/mcl_achievements/init.lua +++ b/mods/HUD/mcl_achievements/init.lua @@ -3,9 +3,7 @@ -- If true, activates achievements from other Minecraft editions (XBox, PS, etc.) local non_pc_achievements = false --- TODO: Enable translator when there's a translation --- local S = minetest.get_translator("mcl_achievements") -local S = function(s) return s end +local S = minetest.get_translator("mcl_achievements") -- Achievements from PC Edition diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr index 28f982726..49c486e48 100644 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr @@ -1,13 +1,13 @@ -# textdomain: mcl_achievements +# textdomain:mcl_achievements Aquire Hardware=Schmied Bake Bread=Brot backen Benchmarking=Tischler Cow Tipper=Kuhschubser -Craft a bookshelf.=Fertigen Sie ein Bücherregal -Craft a cake using wheat, sugar, milk and an egg.=Fertigen Sie einen Kuchen mit Weizen, Zucker, Milch und einem Ei. +Craft a bookshelf.=Fertigen Sie ein Bücherregal. +Craft a cake using wheat, sugar, milk and an egg.=Fertigen Sie einen Kuchen aus Weizen, Zucker, Milch und einem Ei. Craft a crafting table from 4 wooden planks.=Fertigen Sie eine Werkbank aus 4 Holzplanken. -Craft a stone pickaxe using sticks and cobblestone.=Fertigen Sie eine Steinspitzhacke mit Stöcken und Kopfsteinpflaster. -Craft a wooden sword using wooden planks and sticks on a crafting table.=Fertigen Sie ein Holzschwert mit Holzplanken und Stöcken an einer Werkbank. +Craft a stone pickaxe using sticks and cobblestone.=Fertigen Sie eine Steinspitzhacke aus Stöcken und Kopfsteinpflaster. +Craft a wooden sword using wooden planks and sticks on a crafting table.=Fertigen Sie ein Holzschwert aus Holzplanken und Stöcken an einer Werkbank. DIAMONDS!=DIAMANTEN! Delicious Fish=Leckerer Fisch Dispense With This=Ein Auge darauf werfen @@ -26,7 +26,7 @@ Mine emerald ore.=Bauen Sie Smaragderz ab. On A Rail=Auf der Schiene Pick up a blaze rod from the floor.=Sammeln Sie eine Lohenrute vom Boden auf. Pick up a diamond from the floor.=Sammeln Sie einen Diamanten vom Boden auf. -Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.=Sammeln Sie ein Holz vom Boden auf.@nTipp: Hauen Sie einen Baumstamm, bis er als Gegenstand herausploppt. +Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.=Sammeln Sie ein Stück Holz vom Boden auf.@nTipp: Hauen Sie einen Baumstamm, bis er als Gegenstand herausploppt. Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.=Sammeln Sie Leder vom Boden auf.@nTipp: Kühe und einige andere Tiere werfen vielleicht Leder ab, wenn sie sterben. Place a dispenser.=Platzieren Sie einen Werfer Place a flower pot.=Platzieren Sie einen Blumentopf @@ -41,7 +41,7 @@ The Lie=Die Lüge Time to Farm!=Bauernzeit Time to Mine!=Zeit zum Graben! Time to Strike!=Zuschlagen! -Travel by minecart for at least 1000 meters from your starting point in a single ride.=Reisen Sie mit einer Lore für mindestens 1000 Meter vom Startpunkt in einer einzigen Fahrt. +Travel by minecart for at least 1000 meters from your starting point in a single ride.=Reisen Sie mit einer Lore für mindestens 1000 Meter vom Startpunkt aus in einer einzigen Fahrt. Use 8 cobblestones to craft a furnace.=Benutzen Sie 8 Kopfsteinpflaster, um einen Ofen zu fertigen. Use a crafting table to craft a wooden hoe from wooden planks and sticks.=Benutzen Sie eine Werkbank, um eine Holzhacke aus Holzplanken und Stöcken zu fertigen. Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.=Benutzen Sie eine Werkbank, um eine Holzspitzhacke aus Holzplanken und Stöcken zu fertigen. diff --git a/mods/HUD/mcl_achievements/locale/template.txt b/mods/HUD/mcl_achievements/locale/template.txt index 3b6301620..ecdba2672 100644 --- a/mods/HUD/mcl_achievements/locale/template.txt +++ b/mods/HUD/mcl_achievements/locale/template.txt @@ -1,4 +1,4 @@ -# textdomain: mcl_achievements +# textdomain:mcl_achievements Aquire Hardware= Bake Bread= Benchmarking= From 805fa7628283e85459a5b4606166595f91d71b01 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 16 Mar 2019 04:04:41 +0100 Subject: [PATCH 207/379] Inventory: Translate tab captions --- mods/HUD/mcl_inventory/creative.lua | 50 ++++++++++++------ .../textures/mcl_inventory_fnt_blocks.png | Bin 227 -> 0 bytes .../textures/mcl_inventory_fnt_brew.png | Bin 169 -> 0 bytes .../textures/mcl_inventory_fnt_combat.png | Bin 182 -> 0 bytes .../textures/mcl_inventory_fnt_deco.png | Bin 225 -> 0 bytes .../textures/mcl_inventory_fnt_food.png | Bin 225 -> 0 bytes .../textures/mcl_inventory_fnt_matr.png | Bin 200 -> 0 bytes .../textures/mcl_inventory_fnt_misc.png | Bin 215 -> 0 bytes .../textures/mcl_inventory_fnt_mobs.png | Bin 158 -> 0 bytes .../textures/mcl_inventory_fnt_nix.png | Bin 221 -> 0 bytes .../textures/mcl_inventory_fnt_rail.png | Bin 223 -> 0 bytes .../textures/mcl_inventory_fnt_redstone.png | Bin 174 -> 0 bytes .../textures/mcl_inventory_fnt_tools.png | Bin 174 -> 0 bytes 13 files changed, 33 insertions(+), 17 deletions(-) delete mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_blocks.png delete mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_brew.png delete mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_combat.png delete mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_deco.png delete mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_food.png delete mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_matr.png delete mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_misc.png delete mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_mobs.png delete mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_nix.png delete mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_rail.png delete mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_redstone.png delete mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_tools.png diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 1df142388..f3074894a 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -162,6 +162,7 @@ local noffset = {} -- numeric tab offset local offset = {} -- string offset: local boffset = {} -- local hoch = {} +local filtername = {} local bg = {} local noffset_x_start = -0.24 @@ -216,6 +217,21 @@ hoch["mobs"] = "^[transformfy" hoch["matr"] = "^[transformfy" hoch["inv"] = "^[transformfy" +filtername = {} +filtername["blocks"] = S("Building Blocks") +filtername["deco"] = S("Decoration Blocks") +filtername["redstone"] = S("Redstone") +filtername["rail"] = S("Transportation") +filtername["misc"] = S("Miscellaneous") +filtername["nix"] = S("Search Items") +filtername["food"] = S("Foodstuffs") +filtername["tools"] = S("Tools") +filtername["combat"] = S("Combat") +filtername["mobs"] = S("Mobs") +--filtername["brew"] = S("Brewing") -- TODO: add brew +filtername["matr"] = S("Materials") +filtername["inv"] = S("Survival Inventory") + local dark_bg = "crafting_creative_bg_dark.png" local function reset_menu_item_bg() @@ -375,9 +391,9 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz "image[" .. offset[this_tab] .. ";1.5,1.44;" .. bg_img .. hoch[this_tab].. "]" .. "image[" .. boffset[this_tab] .. ";1,1;crafting_creative_marker.png]" end - local fnt = "" - if name ~= "inv" then - fnt = "image[0,1;5,0.75;mcl_inventory_fnt_"..name..".png]" + local caption = "" + if name ~= "inv" and filtername[name] then + caption = "label[0,1.1;"..F(minetest.colorize("#313131", filtername[name])).."]" end formspec = "size[10,9.3]".. @@ -385,35 +401,35 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz "background[-0.19,-0.25;10.5,9.87;"..inv_bg.."]".. "label[-5,-5;"..name.."]".. tab(name, "blocks") .. - "tooltip[blocks;"..F(S("Building Blocks")).."]".. + "tooltip[blocks;"..F(filtername["blocks"]).."]".. tab(name, "deco") .. - "tooltip[deco;"..F(S("Decoration Blocks")).."]".. + "tooltip[deco;"..F(filtername["deco"]).."]".. tab(name, "redstone") .. - "tooltip[redstone;"..F(S("Redstone")).."]".. + "tooltip[redstone;"..F(filtername["redstone"]).."]".. tab(name, "rail") .. - "tooltip[rail;"..F(S("Transportation")).."]".. + "tooltip[rail;"..F(filtername["rail"]).."]".. tab(name, "misc") .. - "tooltip[misc;"..F(S("Miscellaneous")).."]".. + "tooltip[misc;"..F(filtername["misc"]).."]".. tab(name, "nix") .. - "tooltip[nix;"..F(S("Search Items")).."]".. - fnt.. + "tooltip[nix;"..F(filtername["nix"]).."]".. + caption.. "list[current_player;main;0,7;9,1;]".. main_list.. tab(name, "food") .. - "tooltip[food;"..F(S("Foodstuffs")).."]".. + "tooltip[food;"..F(filtername["food"]).."]".. tab(name, "tools") .. - "tooltip[tools;"..F(S("Tools")).."]".. + "tooltip[tools;"..F(filtername["tools"]).."]".. tab(name, "combat") .. - "tooltip[combat;"..F(S("Combat")).."]".. + "tooltip[combat;"..F(filtername["combat"]).."]".. tab(name, "mobs") .. - "tooltip[mobs;"..F(S("Mobs")).."]".. + "tooltip[mobs;"..F(filtername["mobs"]).."]".. -- TODO: Add brew --tab(name, "brew") .. - --"tooltip[brew;"..F(S("Brewing")).."]".. + --"tooltip[brew;"..F(filtername["brew"]).."]".. tab(name, "matr") .. - "tooltip[matr;"..F(S("Materials")).."]".. + "tooltip[matr;"..F(filtername["matr"]).."]".. tab(name, "inv") .. - "tooltip[inv;"..F(S("Survival Inventory")).."]".. + "tooltip[inv;"..F(filtername["inv"]).."]".. "list[detached:trash;main;9,7;1,1;]".. "image[9,7;1,1;crafting_creative_trash.png]".. listrings diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_blocks.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_blocks.png deleted file mode 100644 index 7bd45b455126cc04093930b34c13df42fc017c9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmeAS@N?(olHy`uVBq!ia0y~yU~C7n&6${i{J7B=$@_jN8PUSv+v2UG6`_6Rleiu2f z^#V>DiR>av7z|k#8x}D51#Z!33)D_C5jz^``jFR3^oj((YIv>2qKv?R(`y@4^L~U^ z&(rtQT=bxC5kttwRwb@Q5wY82fVv)}`$>ze4cPkfBhM;f*Y>9DfDdzPT}2fCv`a_K XeY0@;M#ny&ix@mz{an^LB{Ts5Ua3(} diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_brew.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_brew.png deleted file mode 100644 index 9664aebb0c22daf9228b39e27de7b67b24989e77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmeAS@N?(olHy`uVBq!ia0y~yU~C7n%^8`2zopr0DbE`vH$=8 diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_combat.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_combat.png deleted file mode 100644 index 0d37d2885b4b6731eea388a96e0e5c8e873ea816..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0y~yU~C7n&6${i=U+l?3?(Gcc4*K5GHwMR~e7hEy=VJ{;FpTs_8=yVhQaJfP})W)Jd zd+pY1lSAxI&F!&pYjOL-)7T}nvO4ofqLPYd;abU$YK<%0=BR&q+h^gqB0w-IW12?pke`}uzGD#m&ZTgE*RP4s(^8AiZChpd%{JM199`g`Ke@4a{HQj5#oGA|quJ9AFj(x>M*~#h6POR^LEL|ZG%O$$|O;oc_>b&!o^`Eu=$W|Ad zXoR%rX+N13P}F*`_{!bY0ggd`LpPfJ4_@)$+p35w7ncS&?o^4l>5|uoxW7Ky)m}*{ ZKSMcY(+00YJwW#`c)I$ztaD0e0sty}Sm6Kw diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_matr.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_matr.png deleted file mode 100644 index ef426a2a7234c5e2dfdd108ae69bb96bc3bcb57f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmeAS@N?(olHy`uVBq!ia0y~yU~C7n&6${iT3FxENQYXSrPGNdJmUNz7?$_Io~f zxPR5ERdt-A;T1=Ieos_l`sr3Ny+a_-qJ6>dWekG+!khiBnIG7*K3#d807G%Y;$mi{ ybpkT4?@gYmC1}pkXj!`^`pNuK_d9D>z2dE6Tp@pPzVR-gwG5uFelF{r5}E+=14qgL diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_misc.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_misc.png deleted file mode 100644 index fafacc557d6300445578f46843edc2166276bceb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215 zcmeAS@N?(olHy`uVBq!ia0y~yU~C7n&6${irt4=#Gz|T0_ya%9dp$cq)6iQ+Jhq|s&hyZdQmX%yo@KAys(+$Mur{?_`#;bX N44$rjF6*2UngEOhPF4T_ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_mobs.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_mobs.png deleted file mode 100644 index 26308b6163c30b129c7c81cd56531138db75cbf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0y~yU~C7n%^8`2Ui==IH{HEm~4UFf)_!ZaOdB7>)^pUXO@ GgeCyyOEdET diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_nix.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_nix.png deleted file mode 100644 index 7ecf77613c0db20cd30c2cb6ed100664e05835df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmeAS@N?(olHy`uVBq!ia0y~yU~C7n&6${i=U+l?3?(Gcc4*K5GHwHF~-@hEy=Vy~4=W4E diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_rail.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_rail.png deleted file mode 100644 index f52fd1bf3eeffcfba51e662317d22e70161ecaf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmeAS@N?(olHy`uVBq!ia0y~yU~C7n&6${i{V|Em9{yq7<`sb;sM>`i;S+T40SI>-) zJ9h82xR>Tq5eAb6AB`1{{9WT_Ylj@&#Z+ilz?Z(Myv;^w^O6;hs@x)8c4l;3e>P?N z&A^a_%nj-5KL)?zTD2qe;S^)dQ?{?;Tt#>0HN08B=0~vA>Mq%%;TIYj7j>xzoRXfT Xk##5E>*-0LYZyFT{an^LB{Ts5va41$ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_redstone.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_redstone.png deleted file mode 100644 index e47fc8813bf27dfd45e20fb4681d7457608e468a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmeAS@N?(olHy`uVBq!ia0y~yU~C7n%^8`2 Date: Sat, 16 Mar 2019 04:14:21 +0100 Subject: [PATCH 208/379] Translate villager professions --- mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr | 13 ++++++++++ mods/ENTITIES/mobs_mc/locale/template.txt | 13 ++++++++++ mods/ENTITIES/mobs_mc/villager.lua | 29 +++++++++++----------- 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr index ce21cf817..ecf058b4a 100644 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr @@ -58,3 +58,16 @@ Golden Horse Armor=Goldpferderüstung Golden horse armor can be worn by horses to increase their protection from harm.=Eine Goldpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden zu erhöhen. Diamond Horse Armor=Diamantpferderüstung Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Eine Diamantpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden beträchtlich zu erhöhen. +Farmer=Bauer +Fisherman=Fischer +Fletcher=Pfeilmacher +Shepherd=Schäfer +Librarian=Bibliothekar +Cartographer=Kartograph +Armorer=Rüstungsschmied +Leatherworker=Lederarbeiter +Butcher=Metzger +Weapon Smith=Waffenschmied +Tool Smith=Werkzeugschmied +Cleric=Priester +Nitwit=Dorftrottel diff --git a/mods/ENTITIES/mobs_mc/locale/template.txt b/mods/ENTITIES/mobs_mc/locale/template.txt index 6b36cc8fd..d2c7c2393 100644 --- a/mods/ENTITIES/mobs_mc/locale/template.txt +++ b/mods/ENTITIES/mobs_mc/locale/template.txt @@ -58,3 +58,16 @@ Golden Horse Armor= Golden horse armor can be worn by horses to increase their protection from harm.= Diamond Horse Armor= Diamond horse armor can be worn by horses to greatly increase their protection from harm.= +Farmer= +Fisherman= +Fletcher= +Shepherd= +Librarian= +Cartographer= +Armorer= +Leatherworker= +Butcher= +Weapon Smith= +Tool Smith= +Cleric= +Nitwit= diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 4357cebcc..4c73524f9 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -20,6 +20,7 @@ -- TODO: Farm stuff local S = minetest.get_translator("mobs_mc") +local N = function(s) return s end -- playername-indexed table containing the previously used tradenum local player_tradenum = {} @@ -61,7 +62,7 @@ end local professions = { farmer = { - name = "Farmer", + name = N("Farmer"), texture = "mobs_mc_villager_farmer.png", trades = { { @@ -91,7 +92,7 @@ local professions = { } }, fisherman = { - name = "Fisherman", + name = N("Fisherman"), texture = "mobs_mc_villager_farmer.png", trades = { { @@ -103,7 +104,7 @@ local professions = { }, }, fletcher = { - name = "Fletcher", + name = N("Fletcher"), texture = "mobs_mc_villager_farmer.png", trades = { { @@ -118,7 +119,7 @@ local professions = { } }, shepherd ={ - name = "Shepherd", + name = N("Shepherd"), texture = "mobs_mc_villager_farmer.png", trades = { { @@ -147,7 +148,7 @@ local professions = { }, }, librarian = { - name = "Librarian", + name = N("Librarian"), texture = "mobs_mc_villager_librarian.png", trades = { { @@ -176,7 +177,7 @@ local professions = { }, }, cartographer = { - name = "Cartographer", + name = N("Cartographer"), texture = "mobs_mc_villager_librarian.png", trades = { { @@ -197,7 +198,7 @@ local professions = { }, }, armorer = { - name = "Armorer", + name = N("Armorer"), texture = "mobs_mc_villager_smith.png", trades = { { @@ -225,7 +226,7 @@ local professions = { }, }, leatherworker = { - name = "Leatherworker", + name = N("Leatherworker"), texture = "mobs_mc_villager_butcher.png", trades = { { @@ -244,7 +245,7 @@ local professions = { }, }, butcher = { - name = "Butcher", + name = N("Butcher"), texture = "mobs_mc_villager_butcher.png", trades = { { @@ -260,7 +261,7 @@ local professions = { }, }, weapon_smith = { - name = "Weapon Smith", + name = N("Weapon Smith"), texture = "mobs_mc_villager_smith.png", trades = { { @@ -284,7 +285,7 @@ local professions = { }, }, tool_smith = { - name = "Tool Smith", + name = N("Tool Smith"), texture = "mobs_mc_villager_smith.png", trades = { { @@ -307,7 +308,7 @@ local professions = { }, }, cleric = { - name = "Cleric", + name = N("Cleric"), texture = "mobs_mc_villager_priest.png", trades = { { @@ -330,7 +331,7 @@ local professions = { }, }, nitwit = { - name = "Nitwit", + name = N("Nitwit"), texture = "mobs_mc_villager.png", -- No trades for nitwit trades = nil, @@ -490,7 +491,7 @@ local function show_trade_formspec(playername, trader, tradenum) .."background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]" ..disabled_img ..mcl_vars.inventory_header - .."label[4,0;"..minetest.formspec_escape(profession).."]" + .."label[4,0;"..minetest.formspec_escape(minetest.colorize("#313131", S(profession))).."]" .."list[current_player;main;0,4.5;9,3;9]" .."list[current_player;main;0,7.74;9,1;]" ..b_prev..b_next From 9cef74c03b6bdbcbd21e64b492de37689cb1cb8c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 16 Mar 2019 05:21:27 +0100 Subject: [PATCH 209/379] Replace GUI image texts with translatable labels --- mods/HUD/mcl_inventory/creative.lua | 2 +- mods/HUD/mcl_inventory/init.lua | 2 ++ .../mcl_inventory/locale/mcl_inventory.de.tr | 2 ++ mods/HUD/mcl_inventory/locale/template.txt | 2 ++ .../textures/crafting_formspec_bg.png | Bin 1999 -> 1803 bytes .../textures/crafting_formspec_bg2.png | Bin 1597 -> 1422 bytes .../textures/crafting_inventory_9_slots.png | Bin 1748 -> 1645 bytes mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 3 ++- .../locale/mcl_dispensers.de.tr | 1 + .../mcl_dispensers/locale/template.txt | 1 + .../textures/mcl_dispensers_fnt_dispenser.png | Bin 513 -> 0 bytes mods/ITEMS/REDSTONE/mcl_droppers/init.lua | 3 ++- .../mcl_droppers/locale/mcl_droppers.de.tr | 1 + .../REDSTONE/mcl_droppers/locale/template.txt | 1 + .../textures/mcl_droppers_fnt_dropper.png | Bin 491 -> 0 bytes mods/ITEMS/mcl_anvils/init.lua | 2 ++ mods/ITEMS/mcl_anvils/locale/mcl_anvils.de.tr | 2 ++ mods/ITEMS/mcl_anvils/locale/template.txt | 2 ++ .../textures/mcl_anvils_inventory.png | Bin 1920 -> 1584 bytes mods/ITEMS/mcl_chests/init.lua | 13 ++++++++++--- mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr | 3 +++ mods/ITEMS/mcl_chests/locale/template.txt | 3 +++ .../textures/mcl_chests_fnt_chest.png | Bin 157 -> 0 bytes .../textures/mcl_chests_fnt_ender_chest.png | Bin 188 -> 0 bytes .../textures/mcl_chests_fnt_shulker_box.png | Bin 186 -> 0 bytes .../textures/mcl_chests_inventory_chest.png | Bin 2401 -> 1604 bytes .../mcl_chests_inventory_chest_large.png | Bin 2309 -> 1940 bytes mods/ITEMS/mcl_crafting_table/init.lua | 2 ++ .../locale/mcl_crafting_table.de.tr | 2 ++ .../mcl_crafting_table/locale/template.txt | 2 ++ .../textures/crafting_inventory_workbench.png | Bin 4251 -> 1605 bytes mods/ITEMS/mcl_furnaces/init.lua | 4 ++++ .../mcl_furnaces/locale/mcl_furnaces.de.tr | 1 + mods/ITEMS/mcl_furnaces/locale/template.txt | 1 + .../textures/crafting_inventory_furnace.png | Bin 2718 -> 1485 bytes mods/ITEMS/mcl_hoppers/init.lua | 2 ++ .../mcl_hoppers/locale/mcl_hoppers.de.tr | 1 + mods/ITEMS/mcl_hoppers/locale/template.txt | 1 + .../textures/mcl_hoppers_inventory.png | Bin 4853 -> 1363 bytes 39 files changed, 53 insertions(+), 6 deletions(-) delete mode 100644 mods/ITEMS/REDSTONE/mcl_dispensers/textures/mcl_dispensers_fnt_dispenser.png delete mode 100644 mods/ITEMS/REDSTONE/mcl_droppers/textures/mcl_droppers_fnt_dropper.png delete mode 100644 mods/ITEMS/mcl_chests/textures/mcl_chests_fnt_chest.png delete mode 100644 mods/ITEMS/mcl_chests/textures/mcl_chests_fnt_ender_chest.png delete mode 100644 mods/ITEMS/mcl_chests/textures/mcl_chests_fnt_shulker_box.png diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index f3074894a..bcca4772d 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -393,7 +393,7 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz end local caption = "" if name ~= "inv" and filtername[name] then - caption = "label[0,1.1;"..F(minetest.colorize("#313131", filtername[name])).."]" + caption = "label[0,1.2;"..F(minetest.colorize("#313131", filtername[name])).."]" end formspec = "size[10,9.3]".. diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 2ca876bf4..03227e85d 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -99,8 +99,10 @@ local function set_inventory(player, armor_change_only) "list[detached:"..player_name.."_armor;armor;0,3;1,1;4]".. armor_slot_imgs.. -- craft and inventory + "label[0,4;"..F(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. + "label[4,0.5;"..F(minetest.colorize("#313131", S("Crafting"))).."]".. "list[current_player;craft;4,1;2,2]".. "list[current_player;craftpreview;7,1.5;1,1;]".. -- crafting guide button diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.de.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.de.tr index e14220e77..2917e1625 100644 --- a/mods/HUD/mcl_inventory/locale/mcl_inventory.de.tr +++ b/mods/HUD/mcl_inventory/locale/mcl_inventory.de.tr @@ -15,3 +15,5 @@ Combat=Kampf Mobs=Mobs Materials=Materialien Survival Inventory=Überlebensinventar +Crafting=Fertigen +Inventory=Inventar diff --git a/mods/HUD/mcl_inventory/locale/template.txt b/mods/HUD/mcl_inventory/locale/template.txt index 27920490f..e0b729e08 100644 --- a/mods/HUD/mcl_inventory/locale/template.txt +++ b/mods/HUD/mcl_inventory/locale/template.txt @@ -15,3 +15,5 @@ Combat= Mobs= Materials= Survival Inventory= +Crafting= +Inventory= diff --git a/mods/HUD/mcl_inventory/textures/crafting_formspec_bg.png b/mods/HUD/mcl_inventory/textures/crafting_formspec_bg.png index 927d0d790118f2f5a7a0dd27e974c1ef76f7a7a7..8e6550236ac21a2fcfd36d1311de76dbe667ab46 100644 GIT binary patch literal 1803 zcmbVNe@qj16h8-n*vW=;8KF$OExJQ9wn4<)F-hx!VRiZy!M_O6ZJ?p;w(MFJx^xV6 zV>VGqtU+W~#i5>!0mCwvFhh~#*5;r%7GXuP{BnQq#oy?dYg zzV|-wecroTicwLDOd%r(B1Q9VVF^JbAo!*xCIBMJvhv`PS-fG(I=I4TdU|?bU?3C< zRaI3L6&1C%w%TmA5xXM|o-No}f=UT>V0Z^XBpufjuH90zV9eXmHmH7~{+E-9`?Bh; z%2GcRM(gTcT$Gb&m2bS-M0|a}OyOQ)bbRSg?0=D;dGzKJ{!b(cPH;V& z&fMZHSL(Wt$+@b3D$fTRPI?#AanSe&z>44?&4{Zm+l?ZxWlMwLLUEVDpFuXD>|^IT z91;h0E#*k*81gM8U2pfD5P2b7pDfGYg?u7!H|B%S2U!q3@xe!^<8 z0#zF(J~Qq0^wFkm`{2}#>L4$Sf5nLYa3jr3bSkjZb&^EK-@9b71_Pf$WTTg2Ca!Nr z?3(m%`VJG z)-DK5*mSZ~1`LV?W6$vz^Y|;>*o33t2ATnuEMiP=fFQz5Naz~I5^!K4kA@(X?r2D8 zC}7Zj&!K~Ke_&^yx%=WQSspf}eMzRV*&{qVbi?yjyt9*?#Dx56oZPT6%1=s**9~JY zW32PFC_gDJ78Wo%6=UVrCn>ot>Bq{C)^y9sNNx4(>t_@pear6t;hI_!Z9O~bsE_Yg zZs2>@Q?^CeBbC>TOUVsHI}LmC*phX51IsIX5gWB)`&`xW5WovAHUv@A+lyPAk@@pD zFC;gZQGdLq8OCeA$4d7!93L&q1;y`&JMM%K>;KdH)6APa#yHN58)~VZ-Dk8cm3{sP x)sc(+cK2;wYZ_ZLdaSWT#yvpW^_!=9H|fF$wtlNVbr=7qY1W~__IKXj`!^7}LK*-7 literal 1999 zcmb_ddrVVT7_Y&}-~)UBi((aU zS~eJ5_79sK*@DsOj1y$S1#Qql)*#9t-C8JVd2|B=0V(^=ZDpWaqRVb_AK&ks^PS)K z`+ldD?n0rqRx7PI9F8r2M{p#EV}andTWkS{+G?#Iyj*vM2}0lv*X-Rx;JG+uZ8zDodG~(nd$(OeN=mn9ElF>ja8MKzVP_+JF1hsQIPUL}$2%IQ zj|uwgCv}&dJL;9`j*kN#s*FSWv3Nlny520F{i-&1LZ_)Gs78iQ6H*yL+4Cs1J5n?J znLtyB3WFs!4jZ|L*7ML%j^@JevD6#O5KT~#a+oIN!hHP1$lQlL4xa`WjGy31K% zVV*u@&<*o?vQE<~5$PkW%*igsopDe<62*EBh>yf|dab&^?m{NgQPssgQwNPxiC1DJ zII~<&GzXN}m`KPQa$U#IJt)nz+Rf$_R18F)yR|HSIoi{6*hG}fE(O&_ zW29t9gqB(7JSU($svnp0-<~bH7+UM~fe;xQN;-d4dAqDH(=du7O)?L9rTj;NN}=^? zrUuGXs5T+`^;><=Tp^mYeP^VJc2(3=j`sarCKDdF3yE>Lx1H$E09e=y#opCTiY?W8+&D z7jWXI2MuXSKYW{b^psyXCLftk)?N7G;RDURlU(_SC9p+ID{*`&Ymdm|%6o26sZR3b zSHY9xpiFPT=aNqj#_=|^rL{Fp`JN?JxVICW#t2%kVfV+UdYIvF>AJqpxiH?*raETZ z%a`&_D6RHxsTF)L3f9cr^%FK1rrHz3gN&HB;>yKxQYh~=h)!FJfIrsHUCSu)38_Do z8ID*CP>4XVJ5reiWiL_pR^XXZe?TDurJ+lf>^eUa1}J0!VZ3UC`bR`jy}GYJ5Ch4B3j$&RGU<>&j#5V ftG>KDkfgD^Uo_qwE$Lf<|Cjk8D7g0Bj|%<*D>Jgf diff --git a/mods/HUD/mcl_inventory/textures/crafting_formspec_bg2.png b/mods/HUD/mcl_inventory/textures/crafting_formspec_bg2.png index f5d2d651570be1c3e6abe4faa7ea011300ecde17..fc70195b5630cfef906d8a27fdb7f0263c07f387 100644 GIT binary patch delta 482 zcmdnX)5kqQrCvI~C&ZNj4F3QBf8oM~FJHc7WMsIzyDwh6c<$V}w^!~H0?IO$1o;Is zI6S+N#=yX;=;`7ZQo;E4+Q!_w1|n^NUBVsn90WEsig_&5+}act@Gx*w<3l?SrF2H2 z^*fXve!f~?UcmV*WS76@(@d>bdw!P9dcNeI_IF#=uW|BmL4N_2q{&P(Jz#>1{mr)3$!Q@d$U)3?g#~3p3z6Nu{hD=e^09X>KmJjke2>u(WQ}oWu;nYs<2}dstA8(<+ScQI{N2m1 zf0U1OPPXV2RxfXY5Q zT=CHrxrz4`MR4g5e!4>3*bJ(pOICWfI?x-6OzJ?7a@kZJ%XnzgbM^lD?OR`Osj;kG w!WiUNU$^w!<@ev`uvuu-K9PR?%4YBKdfTroc`r;G_JJbO)78&qol`;+0G8wF2LJ#7 literal 1597 zcmeAS@N?(olHy`uVBq!ia0y~yVDM_)b&gj9drKhyJkto^=u%i8PzPX@=ytdGL0{vGkE|9=g<*^6-F*gkC~oi0QF>Wjw75U>QMvKUuOGjE zo%Xoc`x`LrP3@ojTpgqYln~GMUe;S&J2Ua{+xL^d@BLbG+~{!I`+fdJ{SQb@te~I= z8c0-3d^CuKSXpazwC5C`^fv!@g0QS{wr|k8=+NP|x09<|&@(m2>#&4@6cSjHC{XsU zHX@H=O|7V5#3P-THGj%`M5N%dEOYwBeP=d2{Pz9i?|W6dl7YcoeqVj3djX>Sp?a=g zUNK`G#7eulNp7iaytmcAb0CMrU2|f}vd)XEB-O+2-;=u@x;*s#7bz)^*dM~a7A diff --git a/mods/HUD/mcl_inventory/textures/crafting_inventory_9_slots.png b/mods/HUD/mcl_inventory/textures/crafting_inventory_9_slots.png index e58e0634fde87208de8969c99e5b66a2f6879150..145a1918b1ba317c95486acc7407b2aae82bb035 100644 GIT binary patch delta 658 zcmcb@`<7>d3Ws!nPlzi61H(ieiTc|s_Xz=+j3q&S!3+-1Zlp0VurYYLIEGX(zP-EA z_lSc)+r_0Vtbq*Gq6#j|B@PbUd5KXwHW@Pd<#X7)nRjpcgg+N;CjLm-xz(;VYptyf zpYOfX@2(vGQuu1^&+=LOPrqJ&`S=V=zrV*{eljbq`v2?6mafb5XB_dIW6?R;qELuS z-S3f#-y9Hs;&DT{M{o)CLZEo`B8&W*c)vLovH9lb*bN(~u(8M!7qG8&5lm0GOp0U9a< zbr#Uj&dE7!3OsNTutS{$L@jeW5A8_Xvrl;W>$h!%XD2JL*-u{2qU-nNeX`%NITn(| zM$e9%oFT04H>bz4uxsLp9VtMy>Oc4G26`Ie=n{XR{|weiu77{zWOLU3Y>DDWPiBEs z8$C-o(>d8tJ=xEF@@kf#$sw$gmdhnNd%Tamwl19Xes?$Af#08OQRR9(>*FuKIW{Z4 z?QSzv_gi-oWGmbaC6hB*EhcNTneaf|umkLd$r8*;Mxwy*f_On)U#`;sEKu9^Cor3V z?vN~g1mZCR-E-umDUfS5S%%FS=t(J_qaGgHsR&}-tb&D{(9}!AHO-b;^y0J%?~)gRDePKQNWAJqKb6Mw<&;$V5 CO(ymL delta 787 zcmaFMbA@+;3Wr>PPl#)UL)=6iiTcdUOz)q%`xzJ*7)yfuf*Bm1-AH3#U`z3IaSW+o ze0z6eudt)Y@rMgrSOXb~MHO5gOyT3mNQ|B#rnmpau2kI;JDHJ|B(mC0pP)NP-k&54=Bc5}w7`1_VGu3WzxJ_o3LN%epE(_0TNJ-_kC znDy|&zk~mEAmBh!DPeba+4ES%qL%AF_Bt%)dA$_u;NoQK#}VQ3Pg}| z_FkOK$Ske|cTT*`CtK5Gzd13JVJ;~&dX{o#LqiJ#!!Mvv!wUw6QUeBtR|yOZRx=nF#0%!^3bX-AFqH)P1v4;|O+IS@ z;w5>zyDi{Ax2KC^NX4zUH=?bP0l+XkKHLqiJ#!!Mvv!wUw6QUeBtR|yOZRx=nF#0%!^3bX-AFqH)P1v4;|O+IS@ z;w5>zyDO&$ zbJ4$b{%NsE8`r7bX)T`Tk?A&R_DhzPOhDBP4Uc!|tZv=+U3l*0()a8ORy~>E#3vbb z_5I8ZQzSPs|DE8-C;4Q;!rr_)&yW25n`G;pwbky{|Fu@^%jJzuC^pL&ZCN|J|GiNE z^RoJl>Cb-Ym-6}8r%Z5WvrM@$hrhPKc5{7N?aUkXO*aFU$_GI-ocI1y@vZ*iwO^j+ z{z?7*T=??k zOGZY9ySw}1#f#_8oqK!bJ|UnSV@Z%-FoVOh8)*y-tcN{a978G?-`-?QQ}LBJ{;+%& zgTYkco^N*(^gbl=3CuWsR#d8}!L4tTc?ZLZTX#Jypts?@H${J8$V|3blCR&T#ewD)_Y z;y34r=Nya9$rgn|>V-h=BTViQR9O(WQy8uo#uZWr>qX{*42LQP$-?Xc>P6;)twzYg zT|%70h;zx8^KjeY=9B5u<;l*=GjuK|r_?nQ;gl;7g@r=P zz4)Kswk?$iiCX?S{QiHRX|_LGA-Xuhx?cXBIr)?IOkwqEqvgBHqW1mzw>;1CW$n(p z#s4h}H>vOUn`3nBypB>TkoO7mgvh7Uaz#cKrbZs7 zCLX9J_?|_f*7T~2arcgUd^q!czj}3)xAVogV<6tQDfZNkOHj%{N^`J;0!@N2E;v=a zym8@V;r!%kssDS;uSd@b;>}T17p77L#O%p;EIk6F&_D(IG_xRlLZzgZ%UAr{l zaourH0IYlr%o|{5TbY#<-Fbdv-m&`kXTORaukCxA`MJiufYclW_8g`=v1OU%MJu20 z_`K1UclYwGCQo+U-)Q@^Kll|a0O$1a&IJd{$NSaAdyf`APps}T9tB3_%JUl^fBgOg6qQ!;*4xzY3xaYYa)eW{+*q=9&Z(tw z^OKK1et!}el>zsYkAHh&?Sx+95p?=CL#qO*W3Rs7e!S+2tlgZr*W_d`CBtH lsloAO>8_-;UiZBJFcxH=%KP|^`x~g>_jL7hS?83{1OTj;<{|(9 literal 1920 zcmcgt4NMbf7_R9yCkUd2WSEN1fCoXR5}4Qhfbug$ukpdd+IjlH;TEweDg;h=tX6A#d%MYGI&k2C zR4NS(4XvoCC@Cq~PR?_O@T`=rL?mx*f9HN4Z?;od@VcnaW}& zIGwxxs*Hc6^Yx{fM|YKtW(*~i$&QI9>@R8MPx42x?6b|)hXdZ0OHYMs632bRH903U z9CXS6qQ2o++Wm0KO7y0Unbm_`Sq6OgHj$Q7ra4ur*XIeaO*EsRaD@OP7hnYIPSB!Wv`lAlu3#H`ptOaPX=9mp1M;_dkqz$I+$W z%clGrUcbmno8-65YekDNg2u^U+neO(&2lfe z0fjX?s_(j1JU6C$ej~dvSY){nYkX9rLj7pjv-yv^^vadiE-%Nk2Xh}3Sl%3q6``a^ zt-WF4*!yyxY$~Mu*zbC9jeE|*&I9>)g!vwr9N0EtePqV?96h1}Hw26w_ zE_2bTUOJywTK=ySm?G{xZr6>Ux??RCCHy>S%CrOp@x`iD_gX6(&Yz_5hC+cd(%V`2 z7Dlv1&=MN=3nX(%*7@|i1NoZ`DfI&7K~G{eLEkUKn{hHOhjs2{DqV9UPY9Izxxfxv z;3x`s1p)t+E#>7uC5TD_UG~s;>K90m*`B~W6oz0n67N|bjn{o@@L!IN#)Cd;%Lt8| z#V~^ZkF5%-^jr_{UurQh>f|{%Y19fKTVAzuFT6)QG2*-9Z3;@?bsc2gSp=UF!wh9UG(JzVSSa!8*gq(_CFWIl|1^ipOK!1 zbx?}>j1N78bM`i!`ylI@PY&+KeF(9;;&;b9UzCTFLqh0Wv#lqpFo`v>+-BAdk;4z^ zmeJg1L_^$!@Yb1igH)(^v0(J3&X`!vEq&wzy8v>?36eVkrbfpmGdZ|-EJ`pB9N zdCLtco7UNN`L$eazcEYCeh$N(nk5}8b$5KLC_l%atulLI_R7z!Km!>(UHx3vIVCg! E00gTy0RR91 diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_fnt_ender_chest.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_fnt_ender_chest.png deleted file mode 100644 index b470cfd139a8eac23e1c10990273e8bc8be39dcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0y~yU~C7n%^8`2n*j(&o7O$A=Br96UH*RK(ohy)JCt zleKN;*E#I#6{TI5s?JJkba?dUrIcca+eV8+Ei47I4}>MMczWN}Xc2t!zd=W6ZPKqf knZey-U&Of%Y+Yy85}Sb4q9e0N}Ah5&!@I diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_fnt_shulker_box.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_fnt_shulker_box.png deleted file mode 100644 index aa2aad61b98991805dadc1a87ae66dda544b9146..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186 zcmeAS@N?(olHy`uVBq!ia0y~yU~C7n%^8`2pC?dK?Ni5F~%ejzhaX&L*H hQ+tmXKH8aE&3Hjpxa6bo={BHk44$rjF6*2UngCXIKqUYG diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_inventory_chest.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_inventory_chest.png index 01cac232137d43fcbc821bd542a6136b91e1bbda..eba521e90e1c4a9943b0c33f8ffc7d39fd83e640 100644 GIT binary patch literal 1604 zcmeAS@N?(olHy`uVBq!ia0y~yVD*T=??k zOGZY9ySw}1#f#_8oqK!bJ|UnSV@Z%-FoVOh8)*y-tk*qV978G?-`r(f_QXr%_`}PE z;uofhep#)vFh$YPEIga@UeG82b^kjpX=VXgcVf8{Gb-zbT z?BA;RJv!n!=Lk>`C{p+c!3C*7#Kkqs z_9Z8Oe zcQ4O;uUTZW`s9xDKi*YODrbTC9prMPpa6RW=vHXRz_{>WA_JEzkPzrN-0BC6 zGc>pE`#v+vRs0FIS_GxEyW^a;RzUD zlpsPK5;qLCfc=6)7bLVDeWtgyXv+n(u*-FZHt zBQMWy*HBPXckokCpCAmvCpe$5fN&8L2wOJJVE|$WzXl*iD1j)0Dq#dGgDHV1JHd%p z$p`)CC7ed*r|E{rmCaT7ow&X|BK-6;ZoS=pA5rx~Tw)2a0^$+{sAFMP;8B9pKMEi( z!3@HxDk|FPO5C=bo25;6UYoda2UXtOlzN@>(mH4uL4CK2W#;o!r>E)e_M7l`!*%C1 z*>6)%PfLa=A|fD(P=YrgA#R5#K??{+H@~&Iidp*6+um3?zAKel%(`+<&dp7)Su(Ff zBL}J>w&_gqQ=q$J)lbyjc&&JC>$gp*r`HJ|A=+Xh(gB*=2nIha(HSW$zcx)^n(lRA zIw^W+)qAliVp~k*%~B@&E|3zKGMs6X2qid^?@FU5C3j~|O8FP}zzXDG0Y|^nY2VMA zH$bhu-W)z(RQCV<%e$@L*Zkd5`Tw`Vbg0znbNBbojxj$T|3B;b56kPP*Z)tuZGGu~ z3sm}LeR|eSng4VD8$na{xA}j8s=v?Lt9k3=?;A4@lrjM&yc*_wd++>y-*%b%v)8e| ze2fsW$=KrH{QH}n(we?7lILiGnB!_jZslnE@xmhIFA*r zzbv8a0ZEV^yP*XSv{ZO0lrm2noT5_?ACBYSxbEvT-RQpk#FtL6GLGo9O+vzzwA{L_ zWyM}_9@}|6vqx;nCvZku5{p{Af=a%r({-cE=5BfjD*3Kg0ZWkM@x&Kvl$3n1Vj4$4 zH1*6uFZnWWZhE@mHH*trXtjW~FvglF^cfyr0lMqdo06IOBY;Hf~q`3-9Ua&JMO!;xR~ks%ewrv^BHW4e-+L?)KI>B z{rZ4-_xHQ|HS`xc!s{q< z-BBfvr~!Wcc|(0q{Eakt!T9#t!Opv00&N%f zbtPme?dX`^C{)4ix>96HlbCRqu|!&a&iz8ByBsk=2Y+7s|1QASU$^9U)NHx_3umjV zE%)x-x_f!W-QeBTv*zVy)mLw`UjC!3%BALL?d9L~|NYlGRax5pQPHyKoNQ4jq+a+) z#qZG(&pAhc+)iN(u8=y4EQqV(2UiT^dd{(UdEZKxd97vg<6qyO+@1aVtz~lZ_b2iT zPtOIK4YdlQ70w0OJO?3*><}W|rMayRV&S|#361icH}n1|!@OZ7yF7KlRg3aB^Iq+% zF5Z9Fq7qpa$=x77BXhxlLYzxcLh$7(i=)@hTcpSQpLgf7AhYE2zPpp_TVNr){P7l^ zEmA;_ancjx`QImRH_U3W-Llpwbd>F_y8uhZw)l=-K=f7#L46MX#L zNqZ-lPv(|Ku|@S3AAh&<-EQ;mw|k3^fn=v!Bk~KDREs4PNXSjWIe&X511)@GD{DBR z@YW66pY9#R`UEoyD02%+T+A~zEAyZJT>cc$P*x#tmS!|$|1_B){1)!OgR>Z;EH zS+Vo#Sr8=%v=BuuP_V@#j-n6ATd=%Q*tItP+>IUoY6Vhn6T>M($ d=PwukG3YG0a&nc~)BT{z)zj6_Wt~$(69BrkeIoz> literal 2309 zcmeAS@N?(olHy`uVBq!ia0y~yVD@8RVBut828uA3xV`{VasfUeu0R?H{{R1f;lhP4 zU%q5yWMpP$y1TnCUc7kj+_{m3{3<|c#*!evU2ee6 zyGy=k$L9a~cl-TpN82xNN*=3RY@TeV&p8&IlPwB`)C(V}_&ow~bIZRU zR=xG^*}L2KHdc0lR4)HtUcRe(Ms?BkoqNFiN17Sd_4DiJ)ql==mVEi}V}tO0n`)-N zy&diiHqiH{riQ)n-kSOI`{bnOPw5I5yMO+@@!r~6ML(b=^X7lr9Psb+{P_`>v=pMnGa#@mWqo_u~q)F%HqM>>N)uDtNv-y(S5@h3BrwElm| zn|D(5^3VUzOVf(xgA{l!4K94HIlthOy35W-=O(4w?QDJ;?sv50=Pn!d-#{;IIkR%l z<`Z@xF9Yr0wc+xukgzBGSLxsi-b&ipybM}WZqQX!-cawH^R(751mLde2{ z4Wby%1&1O^pk`YxO}0I3c=+%8$+cF?+jx%i-By3j0SoahH!|;EI9TvzL+z{YyUedy zOY+HW^FJpDG6vmI2sdUQ#gqlbC9zJvv@!0?hKK*YpR}7B?7Z-B+w}L75n=FXOa2Q1 z>zo^QU#ss*zn+`a#=Cx>e^K89ND2Wt3Ms+B+z3rSFfJ?{5l+S*tS=+<({2>}|D7`b z+{%R)5)YsL?uiJ4!dvDg9kOOQ^MCDq*ZbAa@NirBeRWIs0;FV%=_o921UU+Cup->J zykw2Ian6qawVV8(UkP}z;o;NYDu_68Iw#VxRynDdQSHmRNW_VT**)yaEh1Ra%qR8#gfIH}%!ciGZ3#Uc%uT*RT_n^_6>9V{J?k~p{R z-ue6C>)g+)_2#_+Wm*$kn|(DerRD;I1z0?-zx!N$@t^X#L%%G7|JeP1^SD~4A6zWG zOnkR;$NZe~@}JM&r++HG{`>y(mw)7@LnKw_2b?Wm^XGZ%V^Av2oHf7US^C25yU%97 z{XXZ9ocI5ytzfIB*t`F#C_h=geEHq%|E9(B>+Sug@BjZR*7qAIfoZ){`nmt))cWV0 z=hHt~KlwlR_O$Q1H-VnsQa8uOerx)CXyE$&ZsTi9ZhsrR|N7pI_f8gk*ic*4CxBG4 zz+;5CWI`x{mT!GDrSB^bJOAzFdEZ~okus98%9%gyIXnRfFRyiGKfLkqx0Ux_--~#k zVo`C!&eFYu*unx7?x^_-jf+tvT#hRAI$qV*3=D$pzf1ghCHZ8x`JXO^he0R3%izql z7N9ctATS7SL&{*D+soHIx*`X!_%QqcsSiM9VS+^&tSkhDF;dx$T-ssFv}DvNQQCel zBhG`8%&RhBS*QrCH@=;;bV7-N5MY`nlqS>*lS)pnlwMt5S1Vt7_3k-8`*yve`d`1# uJBHtjw>N8UeYIfz?DRGEB~SlK{9_gA(tCc2fA%F%YsS;n&t;ucLK6UGa!=j> diff --git a/mods/ITEMS/mcl_crafting_table/init.lua b/mods/ITEMS/mcl_crafting_table/init.lua index 8cc51ac90..2a02551e2 100644 --- a/mods/ITEMS/mcl_crafting_table/init.lua +++ b/mods/ITEMS/mcl_crafting_table/init.lua @@ -17,8 +17,10 @@ minetest.register_node("mcl_crafting_table:crafting_table", { local form = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png^crafting_inventory_workbench.png]".. mcl_vars.inventory_header.. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. + "label[1.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Crafting"))).."]".. "list[current_player;craft;1.75,0.5;3,3;]".. "list[current_player;craftpreview;6.1,1.5;1,1;]".. "image_button[0.75,1.5;1,1;craftguide_book.png;__mcl_craftguide;]".. diff --git a/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.de.tr b/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.de.tr index 3db0460b6..08b1a29ea 100644 --- a/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.de.tr +++ b/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.de.tr @@ -3,3 +3,5 @@ Crafting Table=Werkbank A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts.=Die Werkbank ist ein Block, mit dem Sie Zugriff auf ein 3×3-Fertigungsgitter erhalten, wodurch sie fortgeschrittene Dinge herstellen können. Rightclick the crafting table to access the 3×3 crafting grid.=Rechtsklicken Sie auf die Werkbank, um auf das 3×3-Fertigungsgitter zuzugreifen. Recipe book=Fertigungsbuch +Inventory=Inventar +Crafting=Fertigen diff --git a/mods/ITEMS/mcl_crafting_table/locale/template.txt b/mods/ITEMS/mcl_crafting_table/locale/template.txt index f08bf3a72..76070997f 100644 --- a/mods/ITEMS/mcl_crafting_table/locale/template.txt +++ b/mods/ITEMS/mcl_crafting_table/locale/template.txt @@ -3,3 +3,5 @@ Crafting Table= A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts.= Rightclick the crafting table to access the 3×3 crafting grid.= Recipe book= +Crafting= +Inventory= diff --git a/mods/ITEMS/mcl_crafting_table/textures/crafting_inventory_workbench.png b/mods/ITEMS/mcl_crafting_table/textures/crafting_inventory_workbench.png index 0ee301844ac0a0c104a928d2149d687f0302895e..957fa56ba9f64ec58581f4c4e12cc257b40d5f2e 100644 GIT binary patch literal 1605 zcmeAS@N?(olHy`uVBq!ia0y~yVD+}+(5FJ3%%?%dO&(;b0wj3q&S!3+-1Zlp0Vu-@==aSW+oe0yzU?j0|Ywu_N= z8kHCOv?2uFHSk&_FnZmQiB4F=BynQy4ra%VEVs3vA3DQzYxkUkKOfDO{quxJ^S#|t z6B)ip>-QC9R&tZS#o4{r%zV$g++<1p+)ML<>&mU3{F(H9_PhPH@KV|CMeQ$Ex$4%GL=5C9*7~22Va}LNo zFJFUwN`uF1O!V1{_E?_X=#IoT4Zsu-wh{p;hl z$If?7w*6_n^}UMUvm+3B3M)gq-xL|SKQVLgdhYopj{a1U}CF`$_Pv(npg=!2q5wTM7L8* z0aJC?5)(peyNfec0b_v$3sGs%H6K-MNs0l5nurMmAqfy-*!K}?x@)JMUB=lR|H!;| z@69>qp5OVMk5~2%HF5sDCG!9P^Eba8zYPF)D*Rh8*8|>ZS^KmSet0l9Q8oe4!1uQA znFFs^(BIxh0iY-t0N(om*x)VRBLMQl0C-FTAf^g{#W|vucQ?QXZW&35@nHHGU)~O{ zJo7eF5` zka@>r<24nDTqm0drhteIe7#m;`OJ6HG|_E*9k=UKQx9PWeX4*{Bp~~Na*NqEk!Ae@ zs5dF%44N}we|*;XZ9d}Pv>YnK( zaazvMnM8^5pu=p4$#jbqE4+Bi*lsHlMc@Wo_h+`z_8GnVca`qT4;jan+s3Y+;6tQQ z{q}YhowFRmkN9ig|1De%aywu#CiSqsw`=&W;at#hu9&Us#20BBqN!gyymu`UKJ#Zl z{<=w>@@*_LLOLXIaaSn{cbLcD&_1@jRoi>Y_g`cN4;-()U>`KCu^A=8BvZqoVSS(e z&3UJ9xOnrWte_RLg+l=WgKEK@#F{Kz+SWRLr1N^PSDpFPExIjU6QwSDh^L4L_RGEg zWMvRd#i(F2bsci4i3P_&ExKqdv4U)t?7c(D5o7s`R~!ru2G5M!PPAT@rO0B$@#>6h zD=1|VWz9lzhg(^fe^xHy&$__-_tc$vQ3p+>xkPv3#F4oe zQJ#+&d*QJEcf;WY{~%wNbE^eM`Vek4M5m<;hR|z!iE??j;I#=M%Fm+-woLmv$Ya72 z&5^4a8u6n=XqW>O*7#Fs($p6=t}a4o$#(l-sB8&plZWr|!((ZctrqWJfQqQ;P)00v zd`K;>N<#T?AN2T*VM%Cr@A2bcugms8{WeS|l?L^>Mzdn(g`VkMKVgFP^vttPV}Xsq2QbaFCoGCtjpBdxtme#qOvBM{ zF0H%053^CeH}k9lRW|rhWNXvz3HJ@*X5~3`k6<1_kpucU z=NaNS;>dcZiq;ykbg7X2Lskhwh4$d42M@!YK&{SQnjQkN(A zM)DCxJ1HaDO5)faN|akd$fu$$1N^j3OD%J+z9g3S5J|L|`_>fd%$nnA?a5;~x+&c0 zTL|Nw7Cn@rSJQUp8ErLnMLRf;g1F!ol7BP(B!t9?v5e!Z4fiB}p%+hSIw! z>IP^W$4ztTK+JWGJ=(5MG?EdaDz?k*+~K0)%Pva{KtZjpf*Ig)*Ua=m*oDn%jQQFb6yEuzV zuVBYPqfwCqmxZAM2k-&i@NiGjx9r1pkQ(lC~ccgxa391Q>OgtbMN{75{vL zc39jd7ti4(KtCt{znf4dG=&z4$QCg?VJJ~x72H$AcDU_rR3-?!0_pcuVtb{6G^9&H zL(9_XB==D>HeOZ>w;+y5zjD;4OHayZicFs!WO5rywp>Nez?zv QumIScK#jln7VYRi0Sk{*T=??k zOGZY9ySw}1#f#_8oqK!bJ|UnSV@Z%-FoVOh8)*y-tO=ejjv*C{Z|`pGz2YEp{NeU> z2i^xwn(E5FtbsdbsdACJ$b$!73!5)L<+!1&>|k6il-&RA_tF1vE^k)*EKvDN#4tv0 z1xG6uTSF z6s(Z6Ld8JWyk2xH_t@Y2ldErSR(ibbasU0vdz4{5eFRL265A!e*Zc3Q4&Hfo$Jrkr zswb7RU`@2J*vFPsNQj|RTjvzcF8u%f$-HlCPV9L3>I{2|zPCp~%CMf(WKb*{4&oErH49-}{rcZzCrb-X_b!CCNSO?pkd8_4S*{ zT&vjobK{(4O^%#@U-;?E<5UjztB&gr^Jd#uR(0OzT-J~m6Ckt~R4RMA`njxgN@xNA D0IsRG literal 2718 zcmeAS@N?(olHy`uVBq!ia0y~yVDLBZQ@pfqDikY6x^!?PP{AWo9Ey9-kqcTEbA z!(QU)>&pI+NtBU+gZWa4KLZ12fv1aONX4zUcOCPD*%{gbzjG{m#9*QBAZqE5KY>+! z!xZfcwdR}O_1(TUL1@m6W69q0X0ETC-}0!%KGDcuthw{))vUEgw@0n5tKNR`(C-b! zQRiy~tZuj8m3?*h4*SB*cWeJV{PO%x`=a=g?}dNQzI?~8yUTyRyaj7j(XQFQ4NBDf zdM!*JUFir`CXSK!`pb_yckZX#LX^L_=2u)_|9?8fjK!Mkl&YahW|k z|B5|^n7wRwU&YHWhhIEB{(bxU*!cW=VRNJkvyQC17~^-`eqVj)$D+^Ih<7T@1auYP& zkd!#-pm^F7lUJ!S&+Sgkd~_wl)6Ytl{!#Pg*2{k%qi<{PyYx47{?bBdZfL(Qczs^J z-}W9zuCaRhrNs8*kNa=m9(*s8*LU|;UH$tH*)J|ZGwNl(+t0rryJPpS@^{?t=vXO; zFG_Y^e*F3B;mYN2SFbqi4A+&=-62DpWCw)y0R8e|IyH z@V5r~w0h5;q3>aEM12$lmR(AZGmis#>!ss5G3t{SA3pAd#kib){!or#q?B26B=bhk ziHcjmbb8};TQ~_7DOy>z`0(@Wo(zL|Wxy=(?a$Cl^+;iYoQVl#1|nM>Xn}>IOZC^6 znZXO+`@Ozjp1?)FK#IZ0z|dURz)07~FvP&n3W$u&v_TAmvhR)hC>nC} gQ!>*k(KQ%Y8CXCxnBCA525MmNboFyt=akR{0GkN)xc~qF diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index f46a7884c..f798977b7 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -8,7 +8,9 @@ local mcl_hoppers_formspec = "size[9,7]".. "background[-0.19,-0.25;9.41,10.48;mcl_hoppers_inventory.png]".. mcl_vars.inventory_header.. + "label[2,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Hopper"))).."]".. "list[current_name;main;2,0.5;5,1;]".. + "label[0,2;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,2.5;9,3;9]".. "list[current_player;main;0,5.74;9,1;]".. "listring[current_name;main]".. diff --git a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.de.tr b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.de.tr index f3e2d2ac0..cd7521184 100644 --- a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.de.tr +++ b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.de.tr @@ -10,3 +10,4 @@ To place a hopper vertically, place it on the floor or a ceiling. To place it si Disabled Hopper=Deaktivierter Trichter Side Hopper=Seitwärtstrichter Disabled Side Hopper=Deaktivierter Seitwärtstrichter +Inventory=Inventar diff --git a/mods/ITEMS/mcl_hoppers/locale/template.txt b/mods/ITEMS/mcl_hoppers/locale/template.txt index 8aea09201..df66e4ce6 100644 --- a/mods/ITEMS/mcl_hoppers/locale/template.txt +++ b/mods/ITEMS/mcl_hoppers/locale/template.txt @@ -10,3 +10,4 @@ To place a hopper vertically, place it on the floor or a ceiling. To place it si Disabled Hopper= Side Hopper= Disabled Side Hopper= +Inventory= diff --git a/mods/ITEMS/mcl_hoppers/textures/mcl_hoppers_inventory.png b/mods/ITEMS/mcl_hoppers/textures/mcl_hoppers_inventory.png index f44510466f4d25216cd07d0d4385e07e97491d82..409cdb2722100b8f43dc550814953ae99a9a555a 100644 GIT binary patch literal 1363 zcmeAS@N?(olHy`uVBq!ia0y~yVD*T=??k zOGZY9ySw}1#f#_8oqK!bJ|UnSV@Z%-FoVOh8)*y-EYCb$978G?-`r(97VRx_>|yz{ zG)CjdgA;XAwx{bJjP)uPVC`BQuc=|cHF;)L9YfrMkLfKIs3*sI@D28!6FZ-A&F-Pz>n5sJ|)g6W0Y3*&YI z9R_p;G8g1dsJ$Rrn6o=4*Sz06e|P`!o$6DowROFhSH+lq>Jy-zr$}<+w@ujtl) zJG0}T(LCdOf9Kr^mXjFYVTAr-B{ao zQg1=Q0130O-*;ckEc}~llfLJ-?at*kMsMDL6rZ$qLXLJ=08J`nLO`@#9~oD_-5O&8_yYOu2Eh_j%vl$>lAuga~sH@gV^* z8Ri6V!bP|U#C;ij|M#2pW0L1(^Gp1-zK2Ck^ZU9Z>&yB*%3#I#^1vVd2jD;~eKT*{ z-T@6nl9Tw^QX%!L$>QpF_wBRqTQl#Kwe*r%^Y3q}*!6Gy%?As<=y{%hb<*%@cy)mS nsLV1rasQWGd?_2Kw4yn1FnihHZaQ1K6=ajAtDnm{r-UW|x6VSq literal 4853 zcmeHKYfw{16y6AmC_W-O+A7#VD}~mgMF(t95JMw$WNa!rs1>kPP^1I`i6DWDV<}(@ zZKaG-&;kNhgkUkCMII_6j$&v^kw*!U1dS4th?s;&61q1Gix)x~es+e;X71zc{m$9% zob%ni$vb^1^X9xg2LLe7dpns5fSE7+e>r;=yp#Qt&k=Ya(5VzpP{LdB9A3;i_$h@9 zhT$1-wvX$B2TR&^e>wnj7h!+GUxIiIylD~Ty~E3*i$EmKU;c3J?q>ijiuNXN-F3WO zCfG_9f3hsGD%AtsS1kXUFXA&y=o0s!_-1tpcS!ZRT=0Ju&SH3{!abzy7xaNz0j>z2s7Y)UM`vJ?-mj3v=#t%*;&azPwyFjh?}7lRyBEB15j&W4;K$^TLR$W z3SG>$hgV(j$#=5g$tgI4O@rPRVv~&75P<%<_>%D6)f^6|Xp8R2lS9ptB9>c)piu`v z*7w#p2aM+K)TS2FI{7__PZ8C<83y|cC8ggklw-zK@&4}Qyze)pRWs^CWws|0bj2Jo zS2e^R>|4oN3E0k&qBkS1Etwxte?)4NQ_M_xq|0D>Qn zcNMJJrqKT3b&adG$*OW6?sQKJt%+x50#LFkVw3=Ek%4;(Z;GQ7oHKPFhbm?Z2BVA0 z6mTkf&L) zW5J|<+IS0YI%g&0Glnk-oS$*!g14cX(wEXCHU$2kwTJ)=)G4x|f*q^ji8cgaS`%OZ zlQjq)94+R0PN#Y40iWlhwTyCSI9|49VL99tMf}XiVX2~F(>|y?uK6+NIkqIM)-IVu z(G*(}MKcMwNfhZPnUovTDe~|Wio6d51ngmH9y~a$Xs{U?)V|iv0FU|O8*hi)l~rXX zPPGDnw%Qk`Ppy6lr<@{XQV*72y%Wk%hO03)0BM#P%Ea7)1}Ogh|2=Yw%Fijk5tu7*OaLZd{x_^q^5!t6k21;%$?ZC zl|6R3>C_K9&(X`RG`IMQ5CSMYc3x6culMeVvf5hULbxL4EdsRzt~kBIXN$J~p^n+z zw88(xRv!mDyTqVUOb7J6u9t+45Xl9-nC|3jX42{-t_^ywmyD{xh-d_pTsm*u#cLhD z@KLK{(V5m&h-cJ|2I|q64G%C$jpG6E%;0SZz_dEXR%{?(d{B5cI(7^WQ z!y)?)8)>)oV(hh)n4ccm%gZV|1aUvlgs<(ZmcYvI=v<;`E+`XZ~i9Mxq;H0q`?eyA!F1N0#q;?Xo^B}17hIP$ydWIB~hwz?BIruCTY-{AAypXj%hx#8MVV%NQ_oU?Si zW|UUd%L~;x;h=?;_LjcBXcmM+d^<* zP7mN^p=uypq!f~OttZ08Q|wvlJ+CqJ+Cpsc)4yp3rWu$51N|=-ycf3O{E{KBKe4C0 My?n_fo`EO-1;LR;ga7~l From 6fbd47cde66195a102c6baddb1c2c4e12a3046fd Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 16 Mar 2019 05:29:28 +0100 Subject: [PATCH 210/379] Translate missing commands --- mods/MISC/mcl_commands/init.lua | 4 ++-- mods/MISC/mcl_commands/locale/mcl_commands.de.tr | 2 ++ mods/MISC/mcl_commands/locale/template.txt | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/mods/MISC/mcl_commands/init.lua b/mods/MISC/mcl_commands/init.lua index 1444abd73..c77b30816 100644 --- a/mods/MISC/mcl_commands/init.lua +++ b/mods/MISC/mcl_commands/init.lua @@ -100,7 +100,7 @@ minetest.register_chatcommand("setblock", { }) minetest.register_chatcommand("list", { - description = "Show who is logged on", + description = S("Show who is logged on"), params = "", privs = {}, func = function(name) @@ -113,7 +113,7 @@ minetest.register_chatcommand("list", { }) minetest.register_chatcommand("seed", { - description = "Displays the world seed", + description = S("Displays the world seed"), params = "", privs = {}, func = function(name) diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.de.tr b/mods/MISC/mcl_commands/locale/mcl_commands.de.tr index a29371fa1..98f1e6a0d 100644 --- a/mods/MISC/mcl_commands/locale/mcl_commands.de.tr +++ b/mods/MISC/mcl_commands/locale/mcl_commands.de.tr @@ -18,3 +18,5 @@ Invalid node=Unültiger Node Invalid parameters (see /help setblock)=Ungültige Parameter (siehe „/help setblock”) List bans=Bannliste anzeigen Ban list: @1=Bannliste: @1 +Show who is logged on=Anzeigen, wer eingeloggt ist +Displays the world seed=Den Seed der Welt anzeigen diff --git a/mods/MISC/mcl_commands/locale/template.txt b/mods/MISC/mcl_commands/locale/template.txt index d98db68a4..fc979be6f 100644 --- a/mods/MISC/mcl_commands/locale/template.txt +++ b/mods/MISC/mcl_commands/locale/template.txt @@ -18,3 +18,5 @@ Invalid node= Invalid parameters (see /help setblock)= List bans= Ban list: @1= +Show who is logged on= +Displays the world seed= From b0acd134cae1c1b43a45324d4e9096683746d646 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 16 Mar 2019 06:43:59 +0100 Subject: [PATCH 211/379] Remove sand solidification code Minetest does this now --- mods/MAPGEN/mcl_mapgen_core/init.lua | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 18be851ef..b537be2a0 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -64,8 +64,6 @@ local c_dirt_with_grass = minetest.get_content_id("mcl_core:dirt_with_grass") local c_dirt_with_grass_snow = minetest.get_content_id("mcl_core:dirt_with_grass_snow") local c_sand = minetest.get_content_id("mcl_core:sand") local c_sandstone = minetest.get_content_id("mcl_core:sandstone") -local c_redsand = minetest.get_content_id("mcl_core:redsand") -local c_redsandstone = minetest.get_content_id("mcl_core:redsandstone") local c_void = minetest.get_content_id("mcl_core:void") local c_lava = minetest.get_content_id("mcl_core:lava_source") local c_water = minetest.get_content_id("mcl_core:water_source") @@ -1793,9 +1791,8 @@ minetest.register_on_generated(function(minp, maxp, seed) -- Non-v6 mapgens: -- Clear snowy grass blocks without snow above to ensure consistency. - -- Solidify floating sand to sandstone (both colors). else - local nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:dirt_with_grass_snow", "mcl_core:sand", "mcl_core:redsand"}) + local nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:dirt_with_grass_snow"}) for n=1, #nodes do local p_pos = area:index(nodes[n].x, nodes[n].y, nodes[n].z) local p_pos_above = area:index(nodes[n].x, nodes[n].y+1, nodes[n].z) @@ -1803,14 +1800,6 @@ minetest.register_on_generated(function(minp, maxp, seed) if data[p_pos] == c_dirt_with_grass_snow and p_pos_above and data[p_pos_above] ~= c_top_snow and data[p_pos_above] ~= c_snow_block then data[p_pos] = c_dirt_with_grass lvm_used = true - elseif p_pos_below and data[p_pos_below] == c_air or data[p_pos_below] == c_water then - if data[p_pos] == c_sand then - data[p_pos] = c_sandstone - lvm_used = true - elseif data[p_pos] == c_redsand then - data[p_pos] = c_redsandstone - lvm_used = true - end end end end From 49f447ba645dbfb49f64d3241f35f1d8c4dffb03 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 17 Mar 2019 09:33:44 +0100 Subject: [PATCH 212/379] Fix missing depends in mcl_tnt --- mods/ITEMS/mcl_tnt/depends.txt | 1 + mods/ITEMS/mcl_tnt/init.lua | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_tnt/depends.txt b/mods/ITEMS/mcl_tnt/depends.txt index f02d2b054..548dace5d 100644 --- a/mods/ITEMS/mcl_tnt/depends.txt +++ b/mods/ITEMS/mcl_tnt/depends.txt @@ -2,3 +2,4 @@ mcl_sounds? mcl_mobitems? mcl_death_messages? doc_identifier? +mesecons? diff --git a/mods/ITEMS/mcl_tnt/init.lua b/mods/ITEMS/mcl_tnt/init.lua index 738d6b085..6fa0728fb 100644 --- a/mods/ITEMS/mcl_tnt/init.lua +++ b/mods/ITEMS/mcl_tnt/init.lua @@ -54,6 +54,13 @@ local sounds if minetest.get_modpath("mcl_sounds") then sounds = mcl_sounds.node_sound_wood_defaults() end +local tnt_mesecons +if minetest.get_modpath("mesecons") then + tnt_mesecons = {effector = { + action_on = tnt.ignite, + rules = mesecon.rules.alldirs, + }} +end minetest.register_node("mcl_tnt:tnt", { tiles = {"default_tnt_top.png", "default_tnt_bottom.png", "default_tnt_side.png", "default_tnt_side.png", @@ -66,10 +73,7 @@ minetest.register_node("mcl_tnt:tnt", { _doc_items_longdesc = S("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.", TNT_RANGE), _doc_items_usagehelp = S("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."), groups = { dig_immediate = 3, tnt = 1, enderman_takable=1 }, - mesecons = {effector = { - action_on = tnt.ignite, - rules = mesecon.rules.alldirs, - }}, + mesecons = tnt_mesecons, _on_ignite = function(player, pointed_thing) tnt.ignite(pointed_thing.under) return true From 058f46043f136e554913c73323656467df90177b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Mar 2019 12:05:33 +0100 Subject: [PATCH 213/379] Fix minor typo --- mods/ITEMS/mcl_end/locale/mcl_end.de.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_end/locale/mcl_end.de.tr b/mods/ITEMS/mcl_end/locale/mcl_end.de.tr index 7577559ae..08119ae77 100644 --- a/mods/ITEMS/mcl_end/locale/mcl_end.de.tr +++ b/mods/ITEMS/mcl_end/locale/mcl_end.de.tr @@ -5,7 +5,7 @@ Purpur Block=Purpurblock Purpur Pillar=Purpursäule End Rod=Endstab End rods are decorative light sources.=Endstäbe sind dekorative Lichtquellen. -Dragon Egg=Drachenei. +Dragon Egg=Drachenei A dragon egg is a decorative item which can be placed.=Ein Drahenei ist ein dekorativer, platzierbarer Gegenstand. Chorus Flower=Chorusblume A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow.=Eine Chorusblume ist der lebendige Teil einer Choruspflanze. Sie kann zu einer großen Choruspflanze heranwachsen, Schritt für Schritt. Wenn sie wächst, wird sie irgendwann am Alter absterben. Sie stirbt auch ab, wenn sie nicht weiterwachsen kann. From c3968209f6e98092ce6a6dca17367daea0f16ce7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Mar 2019 12:20:10 +0100 Subject: [PATCH 214/379] Add missing mcl_doc translations --- mods/HELP/mcl_doc/init.lua | 6 +++--- mods/HELP/mcl_doc/locale/mcl_doc.de.tr | 5 ++++- mods/HELP/mcl_doc/locale/template.txt | 3 +++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/mods/HELP/mcl_doc/init.lua b/mods/HELP/mcl_doc/init.lua index fc35f8e30..f5f2f88fe 100644 --- a/mods/HELP/mcl_doc/init.lua +++ b/mods/HELP/mcl_doc/init.lua @@ -202,15 +202,15 @@ doc.sub.items.register_factoid("nodes", "mining", function(itemstring, def) tool_minable = true end if groups.shearsy or groups.shearsy_wool then - datastring = datastring .. "• Shears" .. "\n" + datastring = datastring .. S("• Shears") .. "\n" tool_minable = true end if groups.swordy or groups.swordy_cobweb then - datastring = datastring .. "• Sword" .. "\n" + datastring = datastring .. S("• Sword") .. "\n" tool_minable = true end if groups.handy then - datastring = datastring .. "• Hand" .. "\n" + datastring = datastring .. S("• Hand") .. "\n" tool_minable = true end diff --git a/mods/HELP/mcl_doc/locale/mcl_doc.de.tr b/mods/HELP/mcl_doc/locale/mcl_doc.de.tr index f0143cab4..ff88f98a6 100644 --- a/mods/HELP/mcl_doc/locale/mcl_doc.de.tr +++ b/mods/HELP/mcl_doc/locale/mcl_doc.de.tr @@ -38,7 +38,7 @@ Iron Axe=Eisenaxt Stone Axe=Steinaxt Golden Axe=Goldaxt Wooden Axe=Holzaxt -Diamond Shovel=Diamantschaufen +Diamond Shovel=Diamantschaufel Iron Shovel=Eisenschaufel Stone Shovel=Steinschaufel Golden Shovel=Goldschaufel @@ -52,3 +52,6 @@ This block drops itself when mined by shears.=Dieser Block wirft sich selbst ab, @1×@2=@1×@2 This blocks drops the following when mined by shears: @1=Dieser Block wird folgendes abwerfen, wenn er mit einer Schere abgebaut wird: @ , =, +• Shears=• Schere +• Sword=• Schwert +• Hand=• Hand diff --git a/mods/HELP/mcl_doc/locale/template.txt b/mods/HELP/mcl_doc/locale/template.txt index da297a3e2..542d29403 100644 --- a/mods/HELP/mcl_doc/locale/template.txt +++ b/mods/HELP/mcl_doc/locale/template.txt @@ -52,3 +52,6 @@ This block drops itself when mined by shears.= @1×@2= This blocks drops the following when mined by shears: @1= , = +• Shears= +• Sword= +• Hand= From 2237aae6c360403d5b317eb1e30c3e8c075a0029 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Mar 2019 13:20:17 +0100 Subject: [PATCH 215/379] Update all help mods --- mods/HELP/doc/doc/API.md | 4 - mods/HELP/doc/doc/depends.txt | 5 - mods/HELP/doc/doc/description.txt | 1 - mods/HELP/doc/doc/init.lua | 109 ++------ mods/HELP/doc/doc/locale/de.txt | 42 --- mods/HELP/doc/doc/locale/doc.de.tr | 51 ++++ mods/HELP/doc/doc/locale/doc.pt.tr | 43 +++ mods/HELP/doc/doc/locale/doc.pt_BR.tr | 43 +++ mods/HELP/doc/doc/locale/template.txt | 93 +++--- mods/HELP/doc/doc/mod.conf | 2 + mods/HELP/doc/doc_identifier/depends.txt | 5 - mods/HELP/doc/doc_identifier/description.txt | 1 - mods/HELP/doc/doc_identifier/init.lua | 33 +-- mods/HELP/doc/doc_identifier/locale/de.txt | 13 - .../locale/doc_identifier.de.tr | 17 ++ .../locale/doc_identifier.pt.tr | 14 + .../locale/doc_identifier.pt_BR.tr | 14 + .../doc/doc_identifier/locale/template.txt | 30 +- mods/HELP/doc/doc_identifier/mod.conf | 3 + .../doc_identifier_identifier_liquid.png | Bin 414 -> 275 bytes mods/HELP/doc/doc_items/depends.txt | 2 - mods/HELP/doc/doc_items/description.txt | 1 - mods/HELP/doc/doc_items/init.lua | 45 +-- mods/HELP/doc/doc_items/locale/de.txt | 140 ---------- .../HELP/doc/doc_items/locale/doc_items.de.tr | 142 ++++++++++ .../HELP/doc/doc_items/locale/doc_items.pt.tr | 141 ++++++++++ .../doc/doc_items/locale/doc_items.pt_BR.tr | 141 ++++++++++ mods/HELP/doc/doc_items/locale/template.txt | 264 +++++++++--------- mods/HELP/doc/doc_items/mod.conf | 2 + 29 files changed, 876 insertions(+), 525 deletions(-) delete mode 100644 mods/HELP/doc/doc/depends.txt delete mode 100644 mods/HELP/doc/doc/description.txt delete mode 100644 mods/HELP/doc/doc/locale/de.txt create mode 100644 mods/HELP/doc/doc/locale/doc.de.tr create mode 100644 mods/HELP/doc/doc/locale/doc.pt.tr create mode 100644 mods/HELP/doc/doc/locale/doc.pt_BR.tr delete mode 100644 mods/HELP/doc/doc_identifier/depends.txt delete mode 100644 mods/HELP/doc/doc_identifier/description.txt delete mode 100644 mods/HELP/doc/doc_identifier/locale/de.txt create mode 100644 mods/HELP/doc/doc_identifier/locale/doc_identifier.de.tr create mode 100644 mods/HELP/doc/doc_identifier/locale/doc_identifier.pt.tr create mode 100644 mods/HELP/doc/doc_identifier/locale/doc_identifier.pt_BR.tr delete mode 100644 mods/HELP/doc/doc_items/depends.txt delete mode 100644 mods/HELP/doc/doc_items/description.txt delete mode 100644 mods/HELP/doc/doc_items/locale/de.txt create mode 100644 mods/HELP/doc/doc_items/locale/doc_items.de.tr create mode 100644 mods/HELP/doc/doc_items/locale/doc_items.pt.tr create mode 100644 mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr diff --git a/mods/HELP/doc/doc/API.md b/mods/HELP/doc/doc/API.md index 784a66685..49afeb3aa 100644 --- a/mods/HELP/doc/doc/API.md +++ b/mods/HELP/doc/doc/API.md @@ -454,10 +454,6 @@ viewed a category as well, both returned values are `nil`. This is a convenience function for creating a special formspec widget. It creates a widget in which you can insert scrollable multi-line text. -As of Minetest 0.4.14, this function is only provided because Minetest lacks -native support for such a widget. When Minetest supports such a widget natively, -this function may become just a simple wrapper. - #### Parameters * `data`: Text to be written inside the widget * `x`: Formspec X coordinate (optional) diff --git a/mods/HELP/doc/doc/depends.txt b/mods/HELP/doc/doc/depends.txt deleted file mode 100644 index 4907c641d..000000000 --- a/mods/HELP/doc/doc/depends.txt +++ /dev/null @@ -1,5 +0,0 @@ -intllib? -unified_inventory? -sfinv_buttons? -central_message? -inventory_plus? diff --git a/mods/HELP/doc/doc/description.txt b/mods/HELP/doc/doc/description.txt deleted file mode 100644 index 808a218b1..000000000 --- a/mods/HELP/doc/doc/description.txt +++ /dev/null @@ -1 +0,0 @@ -A simple in-game documentation system which enables mods to add help entries based on templates. diff --git a/mods/HELP/doc/doc/init.lua b/mods/HELP/doc/doc/init.lua index 7f4705ef5..dcb4c7857 100644 --- a/mods/HELP/doc/doc/init.lua +++ b/mods/HELP/doc/doc/init.lua @@ -1,16 +1,10 @@ --- Boilerplate to support localized strings if intllib mod is installed. -local S, F -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end -end -F = function(f) return minetest.formspec_escape(S(f)) end +local S = minetest.get_translator("doc") +local F = function(f) return minetest.formspec_escape(S(f)) end -- Compability for 0.4.14 or earlier local colorize -if core.colorize then - colorize = core.colorize +if minetest.colorize then + colorize = minetest.colorize else colorize = function(color, text) return text end end @@ -57,9 +51,6 @@ local CATEGORYFIELDSIZE = { HEIGHT = math.floor(doc.FORMSPEC.HEIGHT-1), } --- Maximum characters per line in the text widget -local TEXT_LINELENGTH = 80 - doc.data = {} doc.data.categories = {} doc.data.aliases = {} @@ -462,66 +453,9 @@ end -- Template function templates, to be used for build_formspec in doc.add_category doc.entry_builders = {} --- Inserts line breaks into a single paragraph and collapses all whitespace (including newlines) --- into spaces -local linebreaker_single = function(text, linelength) - if linelength == nil then - linelength = TEXT_LINELENGTH - end - local remain = linelength - local res = {} - local line = {} - local split = function(s) - local res = {} - for w in string.gmatch(s, "%S+") do - res[#res+1] = w - end - return res - end - - for _, word in ipairs(split(text)) do - if string.len(word) + 1 > remain then - table.insert(res, table.concat(line, " ")) - line = { word } - remain = linelength - string.len(word) - else - table.insert(line, word) - remain = remain - (string.len(word) + 1) - end - end - - table.insert(res, table.concat(line, " ")) - return table.concat(res, "\n") -end - --- Inserts automatic line breaks into an entire text and preserves existing newlines -local linebreaker = function(text, linelength) - local out = "" - for s in string.gmatch(text, "([^\n]*)") do - local l = linebreaker_single(s, linelength) - out = out .. l - if(string.len(l) == 0) then - out = out .. "\n" - end - end - -- Remove last newline - if string.len(out) >= 1 then - out = string.sub(out, 1, string.len(out) - 1) - end - return out -end - --- Inserts text suitable for a textlist (including automatic word-wrap) -local text_for_textlist = function(text, linelength) - text = linebreaker(text, linelength) - text = minetest.formspec_escape(text) - text = string.gsub(text, "\n", ",") - return text -end - -- Scrollable freeform text doc.entry_builders.text = function(data) - local formstring = doc.widgets.text(data, doc.FORMSPEC.ENTRY_START_X, doc.FORMSPEC.ENTRY_START_Y, doc.FORMSPEC.ENTRY_WIDTH - 0.2, doc.FORMSPEC.ENTRY_HEIGHT) + local formstring = doc.widgets.text(data, doc.FORMSPEC.ENTRY_START_X, doc.FORMSPEC.ENTRY_START_Y, doc.FORMSPEC.ENTRY_WIDTH - 0.4, doc.FORMSPEC.ENTRY_HEIGHT) return formstring end @@ -539,7 +473,7 @@ doc.entry_builders.text_and_gallery = function(data, playername) formstring = formstring .. doc.widgets.text(data.text, doc.FORMSPEC.ENTRY_START_X, doc.FORMSPEC.ENTRY_START_Y, - doc.FORMSPEC.ENTRY_WIDTH - 0.2, + doc.FORMSPEC.ENTRY_WIDTH - 0.4, doc.FORMSPEC.ENTRY_HEIGHT - stolen_height) return formstring @@ -547,12 +481,13 @@ end doc.widgets = {} -local text_id = 1 -- Scrollable freeform text doc.widgets.text = function(data, x, y, width, height) if x == nil then x = doc.FORMSPEC.ENTRY_START_X end + -- Offset to table[], which was used for this in a previous version + local xfix = x + 0.35 if y == nil then y = doc.FORMSPEC.ENTRY_START_Y end @@ -562,18 +497,13 @@ doc.widgets.text = function(data, x, y, width, height) if height == nil then height = doc.FORMSPEC.ENTRY_HEIGHT end - local baselength = TEXT_LINELENGTH - local widget_basewidth = doc.FORMSPEC.WIDTH - local linelength = math.max(20, math.floor(baselength * (width / widget_basewidth))) + -- Weird offset for textarea[] + local heightfix = height + 1 - local widget_id = "doc_widget_text"..text_id - text_id = text_id + 1 - -- TODO: Wait for Minetest to provide a native widget for scrollable read-only text with automatic line breaks. - -- Currently, all of this had to be hacked into this script manually by using/abusing the table widget - local formstring = "tablecolumns[text]".. - "tableoptions[background=#000000FF;highlight=#000000FF;border=false]".. - "table["..tostring(x)..","..tostring(y)..";"..tostring(width)..","..tostring(height)..";"..widget_id..";"..text_for_textlist(data, linelength).."]" - return formstring, widget_id + -- Also add background box + local formstring = "box["..tostring(x-0.175)..","..tostring(y)..";"..tostring(width)..","..tostring(height)..";#000000]" .. + "textarea["..tostring(xfix)..","..tostring(y)..";"..tostring(width)..","..tostring(heightfix)..";;;"..minetest.formspec_escape(data).."]" + return formstring end -- Image gallery @@ -731,12 +661,12 @@ function doc.formspec_core(tab) minetest.formspec_escape(S("Category list")) .. "," .. minetest.formspec_escape(S("Entry list")) .. "," .. minetest.formspec_escape(S("Entry")) .. ";" - ..tab..";true;true]" .. - "bgcolor[#343434FF]" + ..tab..";false;false]" + -- Let the Game decide on the style, such as background, etc. end function doc.formspec_main(playername) - local formstring = "label[0,0;"..minetest.formspec_escape(DOC_INTRO) .. "\n" + local formstring = "textarea[0.35,0;"..doc.FORMSPEC.WIDTH..",1;;;"..minetest.formspec_escape(DOC_INTRO) .. "\n" local notify_checkbox_x, notify_checkbox_y if doc.get_category_count() >= 1 then formstring = formstring .. F("Please select a category you wish to learn more about:").."]" @@ -806,7 +736,8 @@ function doc.formspec_error_no_categories() formstring = formstring .. minetest.formspec_escape( colorize(COLOR_ERROR, S("Error: No help available.")) .. "\n\n" .. -S("No categories have been registered, but they are required to provide help.\nThe Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again.")) .. "\n\n" .. +S("No categories have been registered, but they are required to provide help.").."\n".. +S("The Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again.")) .. "\n\n" .. S("Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia.") formstring = formstring .. ";]button_exit[3,5;2,1;okay;"..F("OK").."]" return formstring @@ -941,7 +872,7 @@ function doc.formspec_category(id, playername) if total >= 1 then local revealed = doc.get_revealed_count(playername, id) if revealed == 0 then - formstring = formstring .. "label[0,0.5;"..F("Currently all entries in this category are hidden from you.\nUnlock new entries by progressing in the game.").."]" + formstring = formstring .. "label[0,0.5;"..minetest.formspec_escape(S("Currently all entries in this category are hidden from you.").."\n"..S("Unlock new entries by progressing in the game.")).."]" formstring = formstring .. "button[0,1.5;3,1;doc_button_goto_main;"..F("Go to category list").."]" else formstring = formstring .. "label[0,0.5;"..F("This category has the following entries:").."]" diff --git a/mods/HELP/doc/doc/locale/de.txt b/mods/HELP/doc/doc/locale/de.txt deleted file mode 100644 index 113307ed5..000000000 --- a/mods/HELP/doc/doc/locale/de.txt +++ /dev/null @@ -1,42 +0,0 @@ -< = < -> = > -Access to the requested entry has been denied; this entry is secret. You may unlock access by progressing in the game. Figure out on your own how to unlock this entry. = Der Zugriff auf den angeforderten Eintrag wurde verweigert; dieser Eintrag ist geheim. Sie können durch weiteren Spielfortschritt den Zugriff freischalten. Finden Sie selbst heraus, wie Sie diesen Eintrag freischalten können. -All entries read. = Alle Einträge gelesen. -All help entries revealed! = Alle Hilfseinträge aufgedeckt! -All help entries are already revealed. = Alle Hilfseinträge sind schon aufgedeckt. -Allows you to reveal all hidden help entries with /help_reveal = Ermöglicht es Ihnen, alle verborgenen Hilfseinträge mit /help_reveal freizuschalten -Category list = Kategorienliste -Currently all entries in this category are hidden from you.\nUnlock new entries by progressing in the game. = Momentan sind alle Einträge in dieser Kategorie vor Ihnen verborgen.\nSchalten Sie neue Einträge frei, indem Sie im Spiel fortschreiten. -Help = Hilfe -Entry = Eintrag -Entry list = Eintragsliste -Error: Access denied. = Fehler: Zugriff verweigert. -Error: No help available. = Fehler: Keine Hilfe verfügbar. -Go to category list = Zur Kategorienliste -Go to entry list = Zur Eintragsliste -Help > (No Category) = Hilfe > (Keine Kategorie) -Help > @1 = Hilfe > @1 -Help > @1 > @2 = Hilfe > @1 > @2 -Help > @1 > (No Entry) = Hilfe > @1 > (Kein Eintrag) -Hidden entries: @1 = Verborgene Einträge: @1 -New entries: @1 = Neue Einträge: @1 -New help entry unlocked: @1 > @2 = Neuen Hilfseintrag freigeschaltet: @1 > @2 -No categories have been registered, but they are required to provide help.\nThe Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again. = Es wurden keine Kategorien registriert, aber sie werden benötigt, um die Hilfe anbieten zu können.\nDas Dokumentationssystem [doc] bringt von sich aus keine eigenen Hilfsinhalte mit, es benötigt zusätzliche Mods, um sie hinzuzufügen. Bitte stellen Sie sicher, dass solche Mods für diese Welt aktiviert sind und versuchen Sie es erneut. -Number of entries: @1 = Anzahl der Einträge: @1 -OK = OK -Open a window providing help entries about Minetest and more = Ein Fenster mit Hilfseinträgen über Minetest und mehr öffnen -Please select a category you wish to learn more about: = Bitte wählen Sie eine Kategorie, über die Sie mehr erfahren möchten, aus: -Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia. = Empfohlene Mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia. -Reveal all hidden help entries to you = Alle für Sie verborgenen Hilfseinträge freischalten -Show entry = Eintrag zeigen -Show category = Kategorie zeigen -Show next entry = Nächsten Eintrag zeigen -Show previous entry = Vorherigen Eintrag zeigen -This category does not have any entries. = Diese Kategorie hat keine Einträge. -This category has the following entries: = Diese Kategorie hat die folgenden Einträge: -This category is empty. = Diese Kategorie ist leer. -This is the help. = Dies ist die Hilfe. -You haven't chosen a category yet. Please choose one in the category list first. = Sie haben noch keine Kategorie gewählt. Bitte wählen Sie zuerst eine Kategorie in der Kategorienliste aus. -You haven't chosen an entry yet. Please choose one in the entry list first. = Sie haben noch keinen Eintrag gewählt. Bitte wählen Sie zuerst einen Eintrag in der Eintragsliste aus. -Nameless entry (@1) = Namenloser Eintrag (@1) -Collection of help texts = Sammlung von Hilfstexten diff --git a/mods/HELP/doc/doc/locale/doc.de.tr b/mods/HELP/doc/doc/locale/doc.de.tr new file mode 100644 index 000000000..39fc72514 --- /dev/null +++ b/mods/HELP/doc/doc/locale/doc.de.tr @@ -0,0 +1,51 @@ +# textdomain:doc +<=< +>=> +Access to the requested entry has been denied; this entry is secret. You may unlock access by progressing in the game. Figure out on your own how to unlock this entry.=Der Zugriff auf den angeforderten Eintrag wurde verweigert; dieser Eintrag ist geheim. Sie können durch weiteren Spielfortschritt den Zugriff freischalten. Finden Sie selbst heraus, wie Sie diesen Eintrag freischalten können. +All entries read.=Alle Einträge gelesen. +All help entries revealed!=Alle Hilfseinträge aufgedeckt! +All help entries are already revealed.=Alle Hilfseinträge sind schon aufgedeckt. +Allows you to reveal all hidden help entries with /help_reveal=Ermöglicht es Ihnen, alle verborgenen Hilfseinträge mit /help_reveal freizuschalten +Category list=Kategorienliste +Currently all entries in this category are hidden from you.=Momentan sind alle Einträge in dieser Kategorie vor Ihnen verborgen. +Unlock new entries by progressing in the game.=Schalten Sie neue Einträge frei, indem Sie im Spiel fortschreiten. +Help=Hilfe +Entry=Eintrag +Entry list=Eintragsliste +Error: Access denied.=Fehler: Zugriff verweigert. +Error: No help available.=Fehler: Keine Hilfe verfügbar. +Go to category list=Zur Kategorienliste +Go to entry list=Zur Eintragsliste +Help > (No Category)=Hilfe > (Keine Kategorie) +Help > @1=Hilfe > @1 +Help > @1 > @2=Hilfe > @1 > @2 +Help > @1 > (No Entry)=Hilfe > @1 > (Kein Eintrag) +Hidden entries: @1=Verborgene Einträge: @1 +New entries: @1=Neue Einträge: @1 +New help entry unlocked: @1 > @2=Neuen Hilfseintrag freigeschaltet: @1 > @2 +No categories have been registered, but they are required to provide help.=Es wurden keine Kategorien registriert, aber sie werden benötigt, um die Hilfe anbieten zu können. +The Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again.=Das Dokumentationssystem [doc] bringt von sich aus keine eigenen Hilfsinhalte mit, es benötigt zusätzliche Mods, um sie hinzuzufügen. Bitte stellen Sie sicher, dass solche Mods für diese Welt aktiviert sind und versuchen Sie es erneut. +Number of entries: @1=Anzahl der Einträge: @1 +OK=OK +Open a window providing help entries about Minetest and more=Ein Fenster mit Hilfseinträgen über Minetest und mehr öffnen +Please select a category you wish to learn more about:=Bitte wählen Sie eine Kategorie, über die Sie mehr erfahren möchten, aus: +Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia.=Empfohlene Mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia. +Reveal all hidden help entries to you=Alle für Sie verborgenen Hilfseinträge freischalten +Show entry=Eintrag zeigen +Show category=Kategorie zeigen +Show next entry=Nächsten Eintrag zeigen +Show previous entry=Vorherigen Eintrag zeigen +This category does not have any entries.=Diese Kategorie hat keine Einträge. +This category has the following entries:=Diese Kategorie hat die folgenden Einträge: +This category is empty.=Diese Kategorie ist leer. +This is the help.=Dies ist die Hilfe. +You haven't chosen a category yet. Please choose one in the category list first.=Sie haben noch keine Kategorie gewählt, Bitte wählen Sie zuerst eine aus. +You haven't chosen an entry yet. Please choose one in the entry list first.=Sie haben noch keinen Eintrag gewählt. Bitte wählen Sie zuerst einen aus. +Nameless entry (@1)=Namenloser Eintrag (@1) +Collection of help texts=Sammlung von Hilfstexten +Notify me when new help is available=Benachrichtigen, wenn neue Hilfe verfügbar ist +Play notification sound when new help is available=Toneffekt abspielen, wenn neue Hilfe verfügbar ist +Show previous image=Vorheriges Bild zeigen +Show previous gallery page=Vorherige Galerieseite zeigen +Show next image=Nächstes Bild zeigen +Show next gallery page=Nächste Galerieseite zeigen diff --git a/mods/HELP/doc/doc/locale/doc.pt.tr b/mods/HELP/doc/doc/locale/doc.pt.tr new file mode 100644 index 000000000..52d683632 --- /dev/null +++ b/mods/HELP/doc/doc/locale/doc.pt.tr @@ -0,0 +1,43 @@ +# textdomain:doc +<= +>= +Access to the requested entry has been denied; this entry is secret. You may unlock access by progressing in the game. Figure out on your own how to unlock this entry.=O acesso à entrada solicitada foi negado; essa entrada é secreta. Você pode desbloquear o acesso progredindo no jogo. Descobrir por conta própria como desbloquear essa entrada. +All entries read.=Todas as entradas lidas. +All help entries revealed!=Todas as entradas de ajuda reveladas! +All help entries are already revealed.=Todas as entradas de ajuda já foram reveladas. +Allows you to reveal all hidden help entries with /help_reveal=Permite revelar todas as entradas de ajuda ocultas com /help_reveal +Category list=Lista de Categorias +Currently all entries in this category are hidden from you.\\nUnlock new entries by progressing in the game.=Atualmente, todas as entradas nessa categoria estão ocultas a você.\\nDesbloqueie novas entradas progredindo no jogo. +Help=Ajuda +Entry=Entrada +Entry list=Lista de Entradas +Error: Access denied.=Erro: Acesso negado. +Error: No help available.=Erro: Nenhuma ajuda disponível. +Go to category list=Ver categorias +Go to entry list=Ir para a lista de entradas +Help > @1=Ajuda > @1 +Help > @1 > @2=Ajuda > @1 > @2 +Help > @1 > (No Entry)=Ajuda > @1 > (Nenhuma Entrada) +Help > (No Category)=Ajuda > (Nenhuma Categoria) +Hidden entries: @1=Entradas ocultas: @1 +Nameless entry (@1)=Entrada sem nome (@1) +New entries: @1=Novas entradas: (@1) +New help entry unlocked: @1 > @2=Nova entrada de ajuda desbloqueada: @1 > @2 +No categories have been registered, but they are required to provide help.\nThe Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again.=Nenhuma categoria foi registrada, mas é necessário fornecer ajuda.\nO Sistema de Documentação [doc] não vem com o conteúdo de ajuda, ele precisa de mods adicionais para adicionar conteúdo de ajuda. Por favor, certifique-se de que os mods estão habilitados para este mundo e tente novamente. +Number of entries: @1=Número de entradas: @1 +OK=OK +Open a window providing help entries about Minetest and more=Abra uma janela fornecendo entradas de ajuda sobre o Minetest e mais +Please select a category you wish to learn more about:=Por favor, selecione uma categoria sobre a qual você deseja saber mais: +Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia.=Mods recomendados: doc_basics, doc_items, doc_identifier, doc_encyclopedia. +Reveal all hidden help entries to you=Revela todas as entradas de ajuda ocultas para você +Show entry=Ver entrada +Show category=Ver categoria +Show next entry=Ver próxima entrada +Show previous entry=Ver entrada anterior +This category does not have any entries.=Essa categoria não possui entradas. +This category has the following entries:=Essa categoria tem as seguintes entradas: +This category is empty.=Essa categoria está vazia. +This is the help.=Essa é a ajuda. +You haven't chosen a category yet. Please choose one in the category list first.=Você ainda não escolheu uma categoria. Por favor, escolha uma na lista de categorias primeiro. +You haven't chosen an entry yet. Please choose one in the entry list first.=Você ainda não escolheu uma entrada. Por favor, escolha uma na lista de entrada primeiro. +Collection of help texts=Coleção de textos de ajuda diff --git a/mods/HELP/doc/doc/locale/doc.pt_BR.tr b/mods/HELP/doc/doc/locale/doc.pt_BR.tr new file mode 100644 index 000000000..52d683632 --- /dev/null +++ b/mods/HELP/doc/doc/locale/doc.pt_BR.tr @@ -0,0 +1,43 @@ +# textdomain:doc +<= +>= +Access to the requested entry has been denied; this entry is secret. You may unlock access by progressing in the game. Figure out on your own how to unlock this entry.=O acesso à entrada solicitada foi negado; essa entrada é secreta. Você pode desbloquear o acesso progredindo no jogo. Descobrir por conta própria como desbloquear essa entrada. +All entries read.=Todas as entradas lidas. +All help entries revealed!=Todas as entradas de ajuda reveladas! +All help entries are already revealed.=Todas as entradas de ajuda já foram reveladas. +Allows you to reveal all hidden help entries with /help_reveal=Permite revelar todas as entradas de ajuda ocultas com /help_reveal +Category list=Lista de Categorias +Currently all entries in this category are hidden from you.\\nUnlock new entries by progressing in the game.=Atualmente, todas as entradas nessa categoria estão ocultas a você.\\nDesbloqueie novas entradas progredindo no jogo. +Help=Ajuda +Entry=Entrada +Entry list=Lista de Entradas +Error: Access denied.=Erro: Acesso negado. +Error: No help available.=Erro: Nenhuma ajuda disponível. +Go to category list=Ver categorias +Go to entry list=Ir para a lista de entradas +Help > @1=Ajuda > @1 +Help > @1 > @2=Ajuda > @1 > @2 +Help > @1 > (No Entry)=Ajuda > @1 > (Nenhuma Entrada) +Help > (No Category)=Ajuda > (Nenhuma Categoria) +Hidden entries: @1=Entradas ocultas: @1 +Nameless entry (@1)=Entrada sem nome (@1) +New entries: @1=Novas entradas: (@1) +New help entry unlocked: @1 > @2=Nova entrada de ajuda desbloqueada: @1 > @2 +No categories have been registered, but they are required to provide help.\nThe Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again.=Nenhuma categoria foi registrada, mas é necessário fornecer ajuda.\nO Sistema de Documentação [doc] não vem com o conteúdo de ajuda, ele precisa de mods adicionais para adicionar conteúdo de ajuda. Por favor, certifique-se de que os mods estão habilitados para este mundo e tente novamente. +Number of entries: @1=Número de entradas: @1 +OK=OK +Open a window providing help entries about Minetest and more=Abra uma janela fornecendo entradas de ajuda sobre o Minetest e mais +Please select a category you wish to learn more about:=Por favor, selecione uma categoria sobre a qual você deseja saber mais: +Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia.=Mods recomendados: doc_basics, doc_items, doc_identifier, doc_encyclopedia. +Reveal all hidden help entries to you=Revela todas as entradas de ajuda ocultas para você +Show entry=Ver entrada +Show category=Ver categoria +Show next entry=Ver próxima entrada +Show previous entry=Ver entrada anterior +This category does not have any entries.=Essa categoria não possui entradas. +This category has the following entries:=Essa categoria tem as seguintes entradas: +This category is empty.=Essa categoria está vazia. +This is the help.=Essa é a ajuda. +You haven't chosen a category yet. Please choose one in the category list first.=Você ainda não escolheu uma categoria. Por favor, escolha uma na lista de categorias primeiro. +You haven't chosen an entry yet. Please choose one in the entry list first.=Você ainda não escolheu uma entrada. Por favor, escolha uma na lista de entrada primeiro. +Collection of help texts=Coleção de textos de ajuda diff --git a/mods/HELP/doc/doc/locale/template.txt b/mods/HELP/doc/doc/locale/template.txt index 7d852e9a4..fdeecfdca 100644 --- a/mods/HELP/doc/doc/locale/template.txt +++ b/mods/HELP/doc/doc/locale/template.txt @@ -1,42 +1,51 @@ -< = -> = -Access to the requested entry has been denied; this entry is secret. You may unlock access by progressing in the game. Figure out on your own how to unlock this entry. = -All entries read. = -All help entries revealed! = -All help entries are already revealed. = -Allows you to reveal all hidden help entries with /help_reveal = -Category list = -Currently all entries in this category are hidden from you.\\nUnlock new entries by progressing in the game. = -Help = -Entry = -Entry list = -Error: Access denied. = -Error: No help available. = -Go to category list = -Go to entry list = -Help > @1 = -Help > @1 > @2 = -Help > @1 > (No Entry) = -Help > (No Category) = -Hidden entries: @1 = -Nameless entry (@1) = -New entries: @1 = -New help entry unlocked: @1 > @2 = -No categories have been registered, but they are required to provide help.\nThe Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again. = -Number of entries: @1 = -OK = -Open a window providing help entries about Minetest and more = -Please select a category you wish to learn more about: = -Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia. = -Reveal all hidden help entries to you = -Show entry = -Show category = -Show next entry = -Show previous entry = -This category does not have any entries. = -This category has the following entries: = -This category is empty. = -This is the help. = -You haven't chosen a category yet. Please choose one in the category list first. = -You haven't chosen an entry yet. Please choose one in the entry list first. = -Collection of help texts = +# textdomain:doc +<= +>= +Access to the requested entry has been denied; this entry is secret. You may unlock access by progressing in the game. Figure out on your own how to unlock this entry.= +All entries read.= +All help entries revealed!= +All help entries are already revealed.= +Allows you to reveal all hidden help entries with /help_reveal= +Category list= +Currently all entries in this category are hidden from you. +Unlock new entries by progressing in the game.= +Help= +Entry= +Entry list= +Error: Access denied.= +Error: No help available.= +Go to category list= +Go to entry list= +Help > @1= +Help > @1 > @2= +Help > @1 > (No Entry)= +Help > (No Category)= +Hidden entries: @1= +Nameless entry (@1)= +New entries: @1= +New help entry unlocked: @1 > @2= +No categories have been registered, but they are required to provide help.= +The Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again.= +Number of entries: @1= +OK= +Open a window providing help entries about Minetest and more= +Please select a category you wish to learn more about:= +Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia.= +Reveal all hidden help entries to you= +Show entry= +Show category= +Show next entry= +Show previous entry= +This category does not have any entries.= +This category has the following entries:= +This category is empty.= +This is the help.= +You haven't chosen a category yet. Please choose one in the category list first.= +You haven't chosen an entry yet. Please choose one in the entry list first.= +Collection of help texts= +Notify me when new help is available= +Play notification sound when new help is available= +Show previous image= +Show previous gallery page= +Show next image= +Show next gallery page= diff --git a/mods/HELP/doc/doc/mod.conf b/mods/HELP/doc/doc/mod.conf index 5e2f43080..302fd83d1 100644 --- a/mods/HELP/doc/doc/mod.conf +++ b/mods/HELP/doc/doc/mod.conf @@ -1 +1,3 @@ name = doc +optional_depends = unified_inventory, sfinv_buttons, central_message, inventory_plus +description = A simple in-game documentation system which enables mods to add help entries based on templates. diff --git a/mods/HELP/doc/doc_identifier/depends.txt b/mods/HELP/doc/doc_identifier/depends.txt deleted file mode 100644 index b4a65e0db..000000000 --- a/mods/HELP/doc/doc_identifier/depends.txt +++ /dev/null @@ -1,5 +0,0 @@ -doc -doc_items -doc_basics? -mcl_core? -intllib? diff --git a/mods/HELP/doc/doc_identifier/description.txt b/mods/HELP/doc/doc_identifier/description.txt deleted file mode 100644 index 8294c740f..000000000 --- a/mods/HELP/doc/doc_identifier/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds a tool which shows help entries about almost anything which it punches. diff --git a/mods/HELP/doc/doc_identifier/init.lua b/mods/HELP/doc/doc_identifier/init.lua index b326a3952..2713d3890 100644 --- a/mods/HELP/doc/doc_identifier/init.lua +++ b/mods/HELP/doc/doc_identifier/init.lua @@ -1,10 +1,4 @@ --- Boilerplate to support localized strings if intllib mod is installed. -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function(s) return s end -end +local S = minetest.get_translator("doc_identifier") local doc_identifier = {} @@ -28,7 +22,7 @@ doc_identifier.identify = function(itemstack, user, pointed_thing) elseif itype == "error_node" then message = S("No help entry for this block could be found.") elseif itype == "error_unknown" then - vsize = vsize + 3 + vsize = vsize + 2 local mod if param ~= nil then local colon = string.find(param, ":") @@ -36,20 +30,23 @@ doc_identifier.identify = function(itemstack, user, pointed_thing) mod = string.sub(param,1,colon-1) end end - message = S("Error: This node, item or object is undefined. This is always an error.\nThis can happen for the following reasons:\n• The mod which is required for it is not enabled\n• The author of the game or a mod has made a mistake") + message = S("Error: This node, item or object is undefined. This is always an error.").."\n".. + S("This can happen for the following reasons:").."\n".. + S("• The mod which is required for it is not enabled").."\n".. + S("• The author of the game or a mod has made a mistake") message = message .. "\n\n" if mod ~= nil then if minetest.get_modpath(mod) ~= nil then - message = message .. string.format(S("It appears to originate from the mod “%s”, which is enabled."), mod) + message = message .. S("It appears to originate from the mod “@1”, which is enabled.", mod) message = message .. "\n" else - message = message .. string.format(S("It appears to originate from the mod “%s”, which is not enabled!"), mod) + message = message .. S("It appears to originate from the mod “@1”, which is not enabled!", mod) message = message .. "\n" end end if param ~= nil then - message = message .. string.format(S("Its identifier is “%s”."), param) + message = message .. S("Its identifier is “@1”.", param) end elseif itype == "error_ignore" then message = S("This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds.") @@ -61,9 +58,9 @@ doc_identifier.identify = function(itemstack, user, pointed_thing) minetest.show_formspec( username, "doc_identifier:error_missing_item_info", - "size[12,"..vsize..";]" .. - "label[0,0.2;"..minetest.formspec_escape(message).."]" .. - "button_exit[4.5,"..(-0.5+vsize)..";3,1;okay;"..minetest.formspec_escape(S("OK")).."]" + "size[10,"..vsize..";]" .. + "textarea[0.5,0.2;10,"..(vsize-0.2)..";;;"..minetest.formspec_escape(message).."]" .. + "button_exit[3.75,"..(-0.5+vsize)..";3,1;okay;"..minetest.formspec_escape(S("OK")).."]" ) end if pointed_thing.type == "node" then @@ -165,11 +162,10 @@ end minetest.register_tool("doc_identifier:identifier_solid", { description = S("Lookup Tool"), _doc_items_longdesc = S("This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used."), - _doc_items_usagehelp = S("Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by a rightclick. In liquid mode (blue) this tool points to liquids as well while in solid mode (red) this is not the case. Liquid mode is required if you want to identify a liquid."), + _doc_items_usagehelp = S("Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by using. In liquid mode, this tool points to liquids as well while in solid mode this is not the case."), _doc_items_hidden = false, tool_capabilities = {}, range = 10, - groups = { disable_repair = 1 }, wield_image = "doc_identifier_identifier.png", inventory_image = "doc_identifier_identifier.png", liquids_pointable = false, @@ -182,7 +178,7 @@ minetest.register_tool("doc_identifier:identifier_liquid", { _doc_items_create_entry = false, tool_capabilities = {}, range = 10, - groups = { not_in_creative_inventory = 1, not_in_craft_guide = 1, disable_repair=1 }, + groups = { not_in_creative_inventory = 1, not_in_craft_guide = 1, disable_repair = 1 }, wield_image = "doc_identifier_identifier_liquid.png", inventory_image = "doc_identifier_identifier_liquid.png", liquids_pointable = true, @@ -191,7 +187,6 @@ minetest.register_tool("doc_identifier:identifier_liquid", { on_secondary_use = doc_identifier.solid_mode, }) ---- TODO: These crafting recipes are temporary. Add a different way to obtain the lookup tool minetest.register_craft({ output = "doc_identifier:identifier_solid", recipe = { {"group:stick", "group:stick" }, diff --git a/mods/HELP/doc/doc_identifier/locale/de.txt b/mods/HELP/doc/doc_identifier/locale/de.txt deleted file mode 100644 index 418bd83b9..000000000 --- a/mods/HELP/doc/doc_identifier/locale/de.txt +++ /dev/null @@ -1,13 +0,0 @@ -Error: This node, item or object is undefined. This is always an error.\nThis can happen for the following reasons:\n• The mod which is required for it is not enabled\n• The author of the game or a mod has made a mistake = Fehler: Dieser Node, Gegenstand oder dieses Objekt ist nicht definiert.\nDas ist immer ein Fehler.\nDies kann aus folgenden Gründen passieren:\n• Die Mod, die dafür benötigt wird, ist nicht aktiv\n• Der Spiel-Autor oder ein Mod-Autor machte einen Fehler -It appears to originate from the mod “%s”, which is enabled. = Es scheint von der Mod »%s« zu stammen. Sie ist aktiv. -It appears to originate from the mod “%s”, which is not enabled! = Es scheint von der Mod »%s« zu stammen. Sie ist nicht aktiv! -Its identifier is “%s”. = Der Identifkator ist »%s«. -Lookup Tool = Nachschlagewerkzeug -No help entry for this block could be found. = Für diesen Block konnte kein Hilfseintrag gefunden werden. -No help entry for this item could be found. = Für diesen Gegenstand konnte kein Hilfseintrag gefunden werden. -No help entry for this object could be found. = Für dieses Objekt konnte kein Hilfseintrag gefunden werden. -OK = OK -Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by a rightclick. In liquid mode (blue) this tool points to liquids as well while in solid mode (red) this is not the case. Liquid mode is required if you want to identify a liquid. = Schlagen Sie einen beliebigen Block, Gegenstand oder irgendwas, worüber Sie mehr erfahren wollen. Das wird den passenden Hilfseintrag öffnen. Das Werkzeug hat zwei Modi, welcher mit einem Rechtsklick gewechselt werden kann. Im Flüssigmodus (blau) zeigt das Werkzeug auch auf Flüssigkeiten. Im Festmodus (rot) ist das nicht der Fall. Der Flüssigmodis ist notwendig, wenn Sie eine Flüssigkeit identifizieren wollen. -This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds. = Dieser Block kann nicht identifiziert werden, weil sich die Welt an dieser Stelle noch nicht materialisiert hat. Versuch es in ein paar Sekunden erneut. -This is a player. = Dies ist ein Spieler. -This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used. = Dieser nützliche kleine Helfer kann benutzt werden, um schnell etwas über die nähere Umgebung zu erfahren. Er identifiziert und analysiert Blöcke, Gegenstände und andere Dinge und zeigt ausführliche Informationen über all das, worauf man ihn anwendet. diff --git a/mods/HELP/doc/doc_identifier/locale/doc_identifier.de.tr b/mods/HELP/doc/doc_identifier/locale/doc_identifier.de.tr new file mode 100644 index 000000000..beba2e75f --- /dev/null +++ b/mods/HELP/doc/doc_identifier/locale/doc_identifier.de.tr @@ -0,0 +1,17 @@ +# textdomain:doc_identifier +Error: This node, item or object is undefined. This is always an error.=Fehler: Dieser Node, Gegenstand oder dieses Objekt ist nicht definiert. Das ist immer ein Fehler. +This can happen for the following reasons:=Dies kann aus folgenden Gründen passieren: +• The mod which is required for it is not enabled=• Die Mod, die dafür benötigt wird, ist nicht aktiv +• The author of the game or a mod has made a mistake=• Der Spiel-Autor oder ein Mod-Autor machte einen Fehler +It appears to originate from the mod “@1”, which is enabled.=Es scheint von der Mod „@1“ zu stammen. Sie ist aktiv. +It appears to originate from the mod “@1”, which is not enabled!=Es scheint von der Mod „@1“ zu stammen. Sie ist nicht aktiv! +Its identifier is “@1”.=Der Identifikator ist „@1“. +Lookup Tool=Nachschlagewerkzeug +No help entry for this block could be found.=Für diesen Block konnte kein Hilfseintrag gefunden werden. +No help entry for this item could be found.=Für diesen Gegenstand konnte kein Hilfseintrag gefunden werden. +No help entry for this object could be found.=Für dieses Objekt konnte kein Hilfseintrag gefunden werden. +OK=OK +Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by using. In liquid mode, this tool points to liquids as well while in solid mode this is not the case.=Schlagen Sie einen beliebigen Block, Gegenstand oder irgendwas, worüber Sie mehr erfahren wollen. Das wird den passenden Hilfseintrag öffnen. Das Werkzeug hat zwei Modi, welcher mit Benutzen gewechselt werden kann. Im Flüssigmodus zeigt das Werkzeug auch auf Flüssigkeiten. Im Festmodus ist das nicht der Fall. +This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds.=Dieser Block kann nicht identifiziert werden, weil sich die Welt an dieser Stelle noch nicht materialisiert hat. Versuchen Sie es in ein paar Sekunden erneut. +This is a player.=Dies ist ein Spieler. +This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used.=Dieser nützliche kleine Helfer kann benutzt werden, um schnell etwas über die nähere Umgebung zu erfahren. Er identifiziert und analysiert Blöcke, Gegenstände und andere Dinge und zeigt ausführliche Informationen über all das, worauf man ihn anwendet. diff --git a/mods/HELP/doc/doc_identifier/locale/doc_identifier.pt.tr b/mods/HELP/doc/doc_identifier/locale/doc_identifier.pt.tr new file mode 100644 index 000000000..cb013c947 --- /dev/null +++ b/mods/HELP/doc/doc_identifier/locale/doc_identifier.pt.tr @@ -0,0 +1,14 @@ +# textdomain:doc_identifier +Error: This node, item or object is undefined. This is always an error.\\nThis can happen for the following reasons:\\n• The mod which is required for it is not enabled\\n• The author of the game or a mod has made a mistake=Erro: Esse bloco, item ou objeto é indefinido. Isso é sempre um erro.\\n Isso pode ter acontecido pelas seguintes rasões:\\n• O mod o qual ele precisa não está habilitado\\n• O autor do jogo ou mod comoteu um erro +It appears to originate from the mod “%s”, which is enabled.=Parece originar do mod “%s”, que está habilitado. +It appears to originate from the mod “%s”, which is not enabled!=Parece originar do mod “%s”, que não está habilitado. +Its identifier is “%s”.=Seu identificador é “%s”. +Lookup tool=Ferramenta de Pesquisa +No help entry for this block could be found.=Nenhuma entrada de ajuda para esse bloco pode ser encontrada. +No help entry for this item could be found.=Nenhuma entrada de ajuda para esse item pode ser encontrada. +No help entry for this object could be found.=Nenhuma entrada de ajuda para esse objeto pode ser encontrada. +OK=OK +Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by a rightclick. In liquid mode (blue) this tool points to liquids as well while in solid mode (red) this is not the case. Liquid mode is required if you want to identify a liquid.=Soque qualquer bloco, item ou outra coisa sobre a qual você deseja aprender mais. Isso abrirá a entrada de ajuda apropriada. A ferramenta vem em dois modos que são alterados por um clique direito. No modo líquido (azul), esta ferramenta também aponta para líquidos, enquanto no modo sólido (vermelho) não é esse o caso. O modo líquido é necessário se você quiser identificar um líquido. +This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds.=Este bloco não pode ser identificado porque o mundo ainda não se materializou neste momento. Tente novamente em alguns segundos. +This is a player.=Este é um jogador. +This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used.=Esse pequeno e útil ajudante pode ser usado para aprender rapidamente sobre as coisas em sua volta. Ele identifica e analisa blocos, itens e outras coisas e mostra informações abrangentes sobre a coisa na qual é usado. diff --git a/mods/HELP/doc/doc_identifier/locale/doc_identifier.pt_BR.tr b/mods/HELP/doc/doc_identifier/locale/doc_identifier.pt_BR.tr new file mode 100644 index 000000000..cb013c947 --- /dev/null +++ b/mods/HELP/doc/doc_identifier/locale/doc_identifier.pt_BR.tr @@ -0,0 +1,14 @@ +# textdomain:doc_identifier +Error: This node, item or object is undefined. This is always an error.\\nThis can happen for the following reasons:\\n• The mod which is required for it is not enabled\\n• The author of the game or a mod has made a mistake=Erro: Esse bloco, item ou objeto é indefinido. Isso é sempre um erro.\\n Isso pode ter acontecido pelas seguintes rasões:\\n• O mod o qual ele precisa não está habilitado\\n• O autor do jogo ou mod comoteu um erro +It appears to originate from the mod “%s”, which is enabled.=Parece originar do mod “%s”, que está habilitado. +It appears to originate from the mod “%s”, which is not enabled!=Parece originar do mod “%s”, que não está habilitado. +Its identifier is “%s”.=Seu identificador é “%s”. +Lookup tool=Ferramenta de Pesquisa +No help entry for this block could be found.=Nenhuma entrada de ajuda para esse bloco pode ser encontrada. +No help entry for this item could be found.=Nenhuma entrada de ajuda para esse item pode ser encontrada. +No help entry for this object could be found.=Nenhuma entrada de ajuda para esse objeto pode ser encontrada. +OK=OK +Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by a rightclick. In liquid mode (blue) this tool points to liquids as well while in solid mode (red) this is not the case. Liquid mode is required if you want to identify a liquid.=Soque qualquer bloco, item ou outra coisa sobre a qual você deseja aprender mais. Isso abrirá a entrada de ajuda apropriada. A ferramenta vem em dois modos que são alterados por um clique direito. No modo líquido (azul), esta ferramenta também aponta para líquidos, enquanto no modo sólido (vermelho) não é esse o caso. O modo líquido é necessário se você quiser identificar um líquido. +This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds.=Este bloco não pode ser identificado porque o mundo ainda não se materializou neste momento. Tente novamente em alguns segundos. +This is a player.=Este é um jogador. +This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used.=Esse pequeno e útil ajudante pode ser usado para aprender rapidamente sobre as coisas em sua volta. Ele identifica e analisa blocos, itens e outras coisas e mostra informações abrangentes sobre a coisa na qual é usado. diff --git a/mods/HELP/doc/doc_identifier/locale/template.txt b/mods/HELP/doc/doc_identifier/locale/template.txt index b57c67f5d..a35201af8 100644 --- a/mods/HELP/doc/doc_identifier/locale/template.txt +++ b/mods/HELP/doc/doc_identifier/locale/template.txt @@ -1,13 +1,17 @@ -Error: This node, item or object is undefined. This is always an error.\\nThis can happen for the following reasons:\\n• The mod which is required for it is not enabled\\n• The author of the game or a mod has made a mistake = -It appears to originate from the mod “%s”, which is enabled. = -It appears to originate from the mod “%s”, which is not enabled! = -Its identifier is “%s”. = -Lookup Tool = -No help entry for this block could be found. = -No help entry for this item could be found. = -No help entry for this object could be found. = -OK = -Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by a rightclick. In liquid mode (blue) this tool points to liquids as well while in solid mode (red) this is not the case. Liquid mode is required if you want to identify a liquid. = -This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds. = -This is a player. = -This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used. = +# textdomain:doc_identifier +Error: This node, item or object is undefined. This is always an error.= +This can happen for the following reasons:= +• The mod which is required for it is not enabled= +• The author of the game or a mod has made a mistake= +It appears to originate from the mod “@1”, which is enabled.= +It appears to originate from the mod “@1”, which is not enabled!= +Its identifier is “@1”.= +Lookup Tool= +No help entry for this block could be found.= +No help entry for this item could be found.= +No help entry for this object could be found.= +OK= +Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by using. In liquid mode, this tool points to liquids as well while in solid mode this is not the case.= +This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds.= +This is a player.= +This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used.= diff --git a/mods/HELP/doc/doc_identifier/mod.conf b/mods/HELP/doc/doc_identifier/mod.conf index df963a0cf..4a7626a4e 100644 --- a/mods/HELP/doc/doc_identifier/mod.conf +++ b/mods/HELP/doc/doc_identifier/mod.conf @@ -1 +1,4 @@ name = doc_identifier +depends = doc, doc_items +optional_depends = doc_basics, mcl_core +description = Adds a tool which shows help entries about almost anything which it punches. diff --git a/mods/HELP/doc/doc_identifier/textures/doc_identifier_identifier_liquid.png b/mods/HELP/doc/doc_identifier/textures/doc_identifier_identifier_liquid.png index 9f3aef969a008d9c6c4c9dc3f204465b7c4b018d..d3689ec6b8024875dd369defc41bac297ac28a50 100644 GIT binary patch delta 258 zcmV+d0sa1-1Cs)f8Gix*005AYXf^-<00wkYPE!B?00000Zl(v30002UNkl< zmz^}(a6u*MY1_pIKs4bBUJXEZJ8V7|zWCV@K85eo58Z`mz^A8p%ORkrBg#I_y!{-X>dA4;tCzll=z$=7s;9;?f8CS#c#a8C zF*PlLF+_O$cB2r9GOV%P=Sa0QdWKlGw4lW&i*H07*qo IM6N<$f?8T~{r~^~ delta 399 zcmV;A0dW440-ghq8Gi-<001BJ|6u?C00DDSM?wIu&K&6g000SaNLh0L01m_e01m_f zl`9S#00007bV*G`2jB<<5ELeb2b^pG00A&bL_t(I%hi&-O9F8m#y{8H$zi@wmKxCz zEh0n^O-)U;8%{xHQA7GAbQ z&-{G8Jba%A{#uHgVSBSA0fcB`6>V~6tcB@ugY|^usvh7@3z66fk(w{a&mOH4d^7#b zeRhbMbOl}Ukj?l>ZUumX{79m8N^nuN>6`#IF4%KRT-TtlUxWZ?O$)N@r(9SsucOOw2r4_*Q?rJ(xk|*NGm(pJ$#VX tq&QoZrK1V?t4)jZHCZ|wm;5`u19iS~k;Sb(w*UYD00>D%PDHLkV1l`is@VVl diff --git a/mods/HELP/doc/doc_items/depends.txt b/mods/HELP/doc/doc_items/depends.txt deleted file mode 100644 index 31aa39034..000000000 --- a/mods/HELP/doc/doc_items/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -doc -intllib? diff --git a/mods/HELP/doc/doc_items/description.txt b/mods/HELP/doc/doc_items/description.txt deleted file mode 100644 index 7291077e6..000000000 --- a/mods/HELP/doc/doc_items/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds automatically generated help texts for items. diff --git a/mods/HELP/doc/doc_items/init.lua b/mods/HELP/doc/doc_items/init.lua index bdbba21a4..7ad8d58be 100644 --- a/mods/HELP/doc/doc_items/init.lua +++ b/mods/HELP/doc/doc_items/init.lua @@ -1,10 +1,5 @@ --- Boilerplate to support localized strings if intllib mod is installed. -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end -end +local S = minetest.get_translator("doc_items") +local N = function(s) return s end doc.sub.items = {} @@ -642,7 +637,7 @@ doc.add_category("nodes", { end end local fdap = data.def.groups.fall_damage_add_percent - if fdap ~= nil then + if fdap ~= nil and fdap ~= 0 then if fdap > 0 then datastring = datastring .. S("The fall damage on this block is increased by @1%.", fdap) .. "\n" elseif fdap <= -100 then @@ -664,9 +659,13 @@ doc.add_category("nodes", { datastring = datastring .. S("This block can be climbed.").."\n" end local bouncy = data.def.groups.bouncy - if bouncy ~= nil then + if bouncy ~= nil and bouncy ~= 0 then datastring = datastring .. S("This block will make you bounce off with an elasticity of @1%.", bouncy).."\n" end + local slippery = data.def.groups.slippery + if slippery ~= nil and slippery ~= 0 then + datastring = datastring .. S("This block is slippery.") .. "\n" + end datastring = datastring .. factoid_custom("nodes", "movement", data) datastring = newline2(datastring) end @@ -841,15 +840,15 @@ doc.add_category("nodes", { local dropstring = "" local dropstring_base = "" if max == nil then - dropstring_base = S("This block will drop the following items when mined: %s.") + dropstring_base = N("This block will drop the following items when mined: @1.") elseif max == 1 then if #data.def.drop.items == 1 then - dropstring_base = S("This block will drop the following when mined: %s.") + dropstring_base = N("This block will drop the following when mined: @1.") else - dropstring_base = S("This block will randomly drop one of the following when mined: %s.") + dropstring_base = N("This block will randomly drop one of the following when mined: @1.") end else - dropstring_base = S("This block will randomly drop up to %d drops of the following possible drops when mined: %s.") + dropstring_base = N("This block will randomly drop up to @1 drops of the following possible drops when mined: @2.") end -- Save calculated probabilities into a table for later output local probtables = {} @@ -932,7 +931,7 @@ doc.add_category("nodes", { -- Final list seperator dropstring_this = dropstring_this .. S(" and ") end - local desc = S(itemtable.desc) + local desc = itemtable.desc local count = itemtable.count if count ~= 1 then desc = S("@1×@2", count, desc) @@ -963,9 +962,9 @@ doc.add_category("nodes", { pcount = pcount + 1 end if max ~= nil and max > 1 then - datastring = datastring .. string.format(dropstring_base, max, dropstring) + datastring = datastring .. S(dropstring_base, max, dropstring) else - datastring = datastring .. string.format(dropstring_base, dropstring) + datastring = datastring .. S(dropstring_base, dropstring) end datastring = newline(datastring) end @@ -1369,6 +1368,18 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv end end) +minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) + if player == nil then return end + local playername = player:get_player_name() + local itemstack + if action == "take" or action == "put" then + itemstack = inventory_info.stack + end + if itemstack ~= nil and playername ~= nil and playername ~= "" and (not itemstack:is_empty()) then + reveal_item(playername, itemstack:get_name()) + end +end) + minetest.register_on_item_eat(function(hp_change, replace_with_item, itemstack, user, pointed_thing) if user == nil then return end local playername = user:get_player_name() @@ -1402,4 +1413,4 @@ minetest.register_globalstep(function(dtime) end end) -minetest.after(0, gather_descs) +minetest.register_on_mods_loaded(gather_descs) diff --git a/mods/HELP/doc/doc_items/locale/de.txt b/mods/HELP/doc/doc_items/locale/de.txt deleted file mode 100644 index 8bc67ad76..000000000 --- a/mods/HELP/doc/doc_items/locale/de.txt +++ /dev/null @@ -1,140 +0,0 @@ -\sUsing it as fuel turns it into: @1. = \sWird dieser Gegenstand als Brennstoff verwendet, verwandelt er sich zu: @1. -@1 seconds = @1 Sekunden -# Item count times item name -@1×@2 = @1×@2 -# Itemname (25%) -@1 (@2%) = @1 (@2%) -# Itemname (<0.5%) -@1 (<0.5%) = @1 (<0,5%) -# Itemname (ca. 25%) -@1 (ca. @2%) = @1 (ca. @2%) -# List separator (e.g. “one, two, three”) -,\s = ,\s -# Final list separator (e.g. “One, two and three”) -\sand\s = \sund\s -1 second = 1 Sekunde -A transparent block, basically empty space. It is usually left behind after digging something. = Ein transparenter Block, praktisch leerer Raum. Er wird üblicherweise hinterlassen, nachdem man etwas ausgegraben hat. -Air = Luft -Blocks = Blöcke -Building another block at this block will place it inside and replace it. = Wird ein anderer Block an diesem Block gebaut, wird dieser andere Block seine Stelle einnehmen. -Building this block is completely silent. = Das Bauen dieses Blocks ist völlig lautlos. -Collidable: @1 = Kollidiert: @1 -Description: @1 = Beschreibung: @1 -Falling blocks can go through this block; they destroy it when doing so. = Fallende Blöcke können diesen Block durchdringen; sie zerstören ihn dabei. -Full punch interval: @1 s = Schlagintervall: @1 s -Hand = Hand -Hold it in your hand, then leftclick to eat it. = Halten Sie es in Ihrer Hand, dann klicken Sie mit der linken Maustaste, um es zu essen. -Hold it in your hand, then leftclick to eat it. But why would you want to do this? = Halten Sie es in Ihrer Hand, dann klicken Sie mit der linken Maustaste, um es zu essen. Aber warum sollten Sie das tun wollen? -Item reference of all wieldable tools and weapons = Gegenstandsreferenz aller tragbaren Werkzeugen und Waffen -Item reference of blocks and other things which are capable of occupying space = Gegenstandsreferenz aller Blöcke und anderen Dingen, die Raum belegen -Item reference of items which are neither blocks, tools or weapons (esp. crafting items) = Gegenstandsreferenz aller Gegenstände, welche weder Blöcke, Werkzeuge oder Waffen sind (insb. Fertigungsgegenstände) -Liquids can flow into this block and destroy it. = Flüssigkeiten können in diesen Block hereinfließen und ihn zerstören. -Maximum stack size: @1 = Maximale Stapelgröße: @1 -Mining level: @1 = Grabestufe: @1 -Mining ratings: = Grabewertungen: -• @1, rating @2: @3 s - @4 s = • @1, Wertung @2: @3 s - @4 s -• @1, rating @2: @3 s = • @1, Wertung @2: @3 s -Mining times: = Grabezeiten: -Mining this block is completely silent. = Das Abbauen dieses Blocks ist völlig lautlos. -Miscellaneous items = Sonstige Gegenstände -No = Nein -Pointable: No = Zeigbar: Nein -Pointable: Only by special items = Zeigbar: Nur von besonderen Gegenständen -Pointable: Yes = Zeigbar: Ja -Punches with this block don't work as usual; melee combat and mining are either not possible or work differently. = Schläge mit diesem Block funktionieren nicht auf die übliche Weise; Nahkampf und Graben sind damit entweder nicht möglich oder funktionieren auf andere Weise. -Punches with this item don't work as usual; melee combat and mining are either not possible or work differently. = Schläge mit diesem Gegenstand funktionieren nicht auf die übliche Weise; Nahkampf und Graben sind damit entweder nicht möglich oder funktionieren auf andere Weise. -Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently. = Schläge mit diesem Werkzeug funktionieren nicht auf die übliche Weise; Nahkampf und Graben sind damit entweder nicht möglich oder funktionieren auf andere Weise. -Range: @1 = Reichweite: @1 -# Range: () -Range: @1 (@2) = Reichweite: @1 (@2) -Range: 4 = Reichweite: 4 -# Rating used for digging times -Rating @1 = Wertung @1 -Rating @1-@2 = Wertung @1-@2 -The fall damage on this block is increased by @1%. = Der Fallschaden auf diesem Block ist um @1% erhöht. -The fall damage on this block is reduced by @1%. = Der Fallschaden auf diesem Block ist um @1% reduziert. -This block allows light to propagate with a small loss of brightness, and sunlight can even go through losslessly. = Dieser Block ist lichtdurchlässig mit einen geringfügigen Helligkeitsverlust; Sonnenlicht passiert jedoch ohne Verlust. -This block allows light to propagate with a small loss of brightness. = Dieser Block ist lichtdurchlässig mit einen geringfügigen Helligkeitsverlust. -This block allows sunlight to propagate without loss in brightness. = Dieser Block ist vollkommen durchlässig für Sonnenlicht. -This block belongs to the @1 group. = Dieser Block gehört zur Gruppe »@1«. -This block belongs to these groups: @1. = Dieser Block gehört zu den folgenden Gruppen: @1. -This block can be climbed. = Dieser Block kann beklettert werden. -This block can be destroyed by any mining tool immediately. = Dieser Block kann von einem beliebigen Grabewerkzeug sofort zerstört werden. -This block can be destroyed by any mining tool in half a second. = Dieser Block kann von einem beliebigen Grabewerkzeug in einer halben Sekunde zerstört werden. -This block can be mined by any mining tool immediately. = Dieser Block kann von einem beliebigen Grabewerkzeug sofort abgebaut werden. -This block can be mined by any mining tool in half a second. = Dieser Block kann von einem beliebigen Grabewerkzeug in einer halben Sekunde abgebaut werden. -This block can be mined by mining tools which match any of the following mining ratings and its toughness level. = Dieser Block kann von Grabewerkzeugen abgebaut werden, falls sie auf eine der folgenden Grabewertungen sowie seinem Härtegrad passen. -This block can not be destroyed by ordinary mining tools. = Dieser Block kann nicht von Grabewerkzeugen zerstört werden. -This block can not be mined by ordinary mining tools. = Dieser Block kann nicht von gewöhnlichen Grabewerkzeugen abgebaut werden. -This block can serve as a smelting fuel with a burning time of @1. = Dieser Block kann als Brennstoff mit einer Brenndauer von @1 dienen. -This block causes a damage of @1 hit point per second. = Dieser Block richtet einen Schaden von @1 Trefferpunkt pro Sekunde an. -This block causes a damage of @1 hit points per second. = Dieser Block richtet einen Schaden von @1 Trefferpunkten pro Sekunde an. -This block connects to blocks of the @1 group. = Dieser Block verbindet sich mit Blöcken der Gruppe »@1«. -This block connects to blocks of the following groups: @1. = Dieser Block verbindet sich mit Blöcken der folgenden Gruppen: @1. -This block connects to these blocks: @1. = Dieser Block verbindet sich mit den folgenden Blöcken: @1. -This block connects to this block: @1. = Dieser Block verbindet sich mit diesem Block: @1. -This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds. = Dieser Block reduziert Ihren Atem und verursacht beim Ertrinken einen Schaden von @1 Trefferpunkt alle 2 Sekunden. -This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds. = Dieser Block reduziert Ihren Atem und verursacht beim Ertrinken einen Schaden von @1 Trefferpunkten alle 2 Sekunden. -This block glows faintly. It is barely noticable. = Dieser Block leuchtet schwach. Es ist kaum merklich. -This block is a light source with a light level of @1. = Dieser Block ist eine Lichtquelle mit einer Helligkeitsstufe von @1. -This block glows faintly with a light level of @1. = Dieser Block leuchtet schwach mit einer Helligkeitsstufe von @1. -This block is a building block for creating various buildings. = Dieser Block ist für den Bau diverser Gebäude vorgesehen. -This block is a liquid with these properties: = Dieser Block ist eine Flüssigkeit mit folgenden Eigenschaften: -This block is affected by gravity and can fall. = Dieser Block wird von der Schwerkraft beeinflusst und kann fallen. -This block is completely silent when mined or built. = Dieser Block kann vollkommen lautlos gebaut oder abgebaut werden. -This block is completely silent when walked on, mined or built. = Es ist vollkommen lautlos, wenn man auf diesen Block geht, ihn baut oder abbaut. -This block is destroyed when a falling block ends up inside it. = Dieser Block wird zerstört, wenn ein fallender Block in ihm landet. -This block negates all fall damage. = Auf diesem Block gibt es keinen Fallschaden. -This block points to liquids. = Mit diesem Block zeigt man auf Flüssigkeiten. -This block will drop as an item when a falling block ends up inside it. = Dieser Block wird sich als Gegenstand abwerfen, wenn ein fallender Block in ihn landet. -This block will drop as an item when it is not attached to a surrounding block. = Dieser Block wird sich als Gegenstand abwerfen, wenn er nicht an einen benachbarten Block befestigt ist. -This block will drop as an item when no collidable block is below it. = Dieser Block wird sich als Gegenstand abwerfen, wenn kein kollidierender Block unter ihn liegt. -This block will drop the following items when mined: %s. = Dieser Block wird nach dem Abbauen die folgenden Gegenstände abwerfen: %s. -This block will drop the following when mined: @1×@2. = Dieser Block wird nach dem Abbauen folgendes abwerfen: @1×@2. -This block will drop the following when mined: @1. = Dieser Block wird nach dem Abbauen folgendes abwerfen: @1. -This block will drop the following when mined: %s. = Dieser Block wird nach dem Abbauen folgendes abwerfen: %s. -This block will make you bounce off with an elasticity of @1%. = Dieser Block wird Sie mit einer Elastizität von @1% abprallen lassen. -This block will randomly drop one of the following when mined: %s. = Dieser Block wird nach dem Abbauen zufällig eines von den folgenden Dingen abwerfen: %s. -This block will randomly drop up to %d drops of the following possible drops when mined: %s. = Dieser Block nach dem Abbauen wird zufällig bis zu %d Abwürfe von den folgenden möglichen Abwürfen abwerfen: %s. -This block won't drop anything when mined. = Dieser Block wird nach dem Abbauen nichts abwerfen. -This is a decorational block. = Dieser Block dient zur Dekoration. -This is a melee weapon which deals damage by punching. = Dies ist eine Nahkampfwaffe, welche Schaden durch Schläge verursacht. -Maximum damage per hit: = Maximaler Schaden pro Treffer: -This item belongs to the @1 group. = Dieser Gegenstand gehört zur Gruppe »@1«. -This item belongs to these groups: @1. = Dieser Gegenstand gehört zu den folgenden Gruppen: @1. -This item can serve as a smelting fuel with a burning time of @1. = Dieser Gegenstand kann als Brennstoff mit einer Brenndauer von @1 dienen. -This item is primarily used for crafting other items. = Dieser Gegenstand wird primär für die Fertigung von anderen Gegenständen benutzt. -This item points to liquids. = Mit diesem Gegenstand zeigt man auf Flüssigkeiten. -This tool belongs to the @1 group. = Dieses Werkzeug gehört zur Gruppe »@1«. -This tool belongs to these groups: @1. = Dieses Werkzeug gehört zu den folgenden Gruppen: @1. -This tool can serve as a smelting fuel with a burning time of @1. = Dieses Werkzeug kann als Brennstoff mit einer Brenndauer von @1 dienen. -This tool is capable of mining. = Dies ist ein Grabewerkzeug. -Maximum toughness levels: = Maximale Härtegrade: -This tool points to liquids. = Mit diesem Werkzeug zeigt man auf Flüssigkeiten. -Tools and weapons = Werkzeuge und Waffen -Unknown Node = Unbekannter Node -Usage help: @1 = Benutzung: @1 -Walking on this block is completely silent. = Auf diesem Block sind Schritte lautlos. -Whenever you are not wielding any item, you use the hand which acts as a tool with its own capabilities. When you are wielding an item which is not a mining tool or a weapon it will behave as if it would be the hand. = Wenn Sie keinen Gegenstand halten, benutzen Sie die Hand, welches als ein Werkzeug mit seinen eigenen Fägihkeiten dient. Wenn Sie einen Gegenstand halten, der kein Grabewerkzeug oder eine Waffe ist, wird er sich verhalten als wäre er die Hand. -Yes = Ja -You can not jump while standing on this block. = Man kann von diesem Block nicht abspringen. -any level = beliebige Stufe -level 0 = Stufe 0 -level 0-@1 = Stufen 0-@1 -unknown = unbekannt -Unknown item (@1) = Unbekannter Gegenstand (@1) -• @1: @2 = • @1: @2 -• @1: @2 HP = • @1: @2 TP -• @1: @2, @3 = • @1: @2, @3 -• Flowing range: @1 = • Fließweite: @1 -• No flowing = • Kein Fließen -• Not renewable = • Nicht erneuerbar -• Renewable = • Erneuerbar -• Viscosity: @1 = • Zähflüssigkeit: @1 -Itemstring: "@1" = Itemstring: »@1« -Durability: @1 uses = Haltbarkeit: @1 Benutzungen -Durability: @1 = Haltbarkeit: @1 -Mining durability: = Grabehaltbarkeit: -• @1, level @2: @3 uses = • @1, Stufe @2: @3 Benutzungen -• @1, level @2: Unlimited = • @1, Stufe @2: Unbegrenzt -This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead. = Die Rotation dieses Blocks hängt davon ab, wie sie ihn platzieren: Platzieren Sie ihn auf den Boden oder an die Decke, um ihn vertikal aufzustellen; platzieren Sie in an der Seite für eine horizontale Ausrichtung. Wenn Sie während des Bauens schleichen, wird der Block stattdessen senkrecht zur üblichen Ausrichtung rotiert. diff --git a/mods/HELP/doc/doc_items/locale/doc_items.de.tr b/mods/HELP/doc/doc_items/locale/doc_items.de.tr new file mode 100644 index 000000000..b4a53a8a7 --- /dev/null +++ b/mods/HELP/doc/doc_items/locale/doc_items.de.tr @@ -0,0 +1,142 @@ +# textdomain:doc_items + Using it as fuel turns it into: @1.= Wird dieser Gegenstand als Brennstoff verwendet, verwandelt er sich zu: @1. +@1 seconds=@1 Sekunden +# Item count times item name +@1×@2=@1×@2 +# Itemname (25%) +@1 (@2%)=@1 (@2%) +# Itemname (<0.5%) +@1 (<0.5%)=@1 (<0,5%) +# Itemname (ca. 25%) +@1 (ca. @2%)=@1 (ca. @2%) +# List separator (e.g. “one, two, three”) +, =, +# Final list separator (e.g. “One, two and three”) + and = und +1 second=1 Sekunde +A transparent block, basically empty space. It is usually left behind after digging something.=Ein transparenter Block, praktisch leerer Raum. Er wird üblicherweise hinterlassen, nachdem man etwas ausgegraben hat. +Air=Luft +Blocks=Blöcke +Building another block at this block will place it inside and replace it.=Wird ein anderer Block an diesem Block gebaut, wird dieser andere Block seine Stelle einnehmen. +Building this block is completely silent.=Das Bauen dieses Blocks ist völlig lautlos. +Collidable: @1=Kollidiert: @1 +Description: @1=Beschreibung: @1 +Falling blocks can go through this block; they destroy it when doing so.=Fallende Blöcke können diesen Block durchdringen; sie zerstören ihn dabei. +Full punch interval: @1 s=Schlagintervall: @1 s +Hand=Hand +Hold it in your hand, then leftclick to eat it.=Halten Sie es in Ihrer Hand, dann klicken Sie mit der linken Maustaste, um es zu essen. +Hold it in your hand, then leftclick to eat it. But why would you want to do this?=Halten Sie es in Ihrer Hand, dann klicken Sie mit der linken Maustaste, um es zu essen. Aber warum sollten Sie das tun wollen? +Item reference of all wieldable tools and weapons=Gegenstandsreferenz aller tragbaren Werkzeugen und Waffen +Item reference of blocks and other things which are capable of occupying space=Gegenstandsreferenz aller Blöcke und anderen Dingen, die Raum belegen +Item reference of items which are neither blocks, tools or weapons (esp. crafting items)=Gegenstandsreferenz aller Gegenstände, welche weder Blöcke, Werkzeuge oder Waffen sind (insb. Fertigungsgegenstände) +Liquids can flow into this block and destroy it.=Flüssigkeiten können in diesen Block hereinfließen und ihn zerstören. +Maximum stack size: @1=Maximale Stapelgröße: @1 +Mining level: @1=Grabestufe: @1 +Mining ratings:=Grabewertungen: +• @1, rating @2: @3 s - @4 s=• @1, Wertung @2: @3 s - @4 s +• @1, rating @2: @3 s=• @1, Wertung @2: @3 s +Mining times:=Grabezeiten: +Mining this block is completely silent.=Das Abbauen dieses Blocks ist völlig lautlos. +Miscellaneous items=Sonstige Gegenstände +No=Nein +Pointable: No=Zeigbar: Nein +Pointable: Only by special items=Zeigbar: Nur von besonderen Gegenständen +Pointable: Yes=Zeigbar: Ja +Punches with this block don't work as usual; melee combat and mining are either not possible or work differently.=Schläge mit diesem Block funktionieren nicht auf die übliche Weise; Nahkampf und Graben sind damit entweder nicht möglich oder funktionieren auf andere Weise. +Punches with this item don't work as usual; melee combat and mining are either not possible or work differently.=Schläge mit diesem Gegenstand funktionieren nicht auf die übliche Weise; Nahkampf und Graben sind damit entweder nicht möglich oder funktionieren auf andere Weise. +Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently.=Schläge mit diesem Werkzeug funktionieren nicht auf die übliche Weise; Nahkampf und Graben sind damit entweder nicht möglich oder funktionieren auf andere Weise. +Range: @1=Reichweite: @1 +# Range: () +Range: @1 (@2)=Reichweite: @1 (@2) +Range: 4=Reichweite: 4 +# Rating used for digging times +Rating @1=Wertung @1 +Rating @1-@2=Wertung @1-@2 +The fall damage on this block is increased by @1%.=Der Fallschaden auf diesem Block ist um @1% erhöht. +The fall damage on this block is reduced by @1%.=Der Fallschaden auf diesem Block ist um @1% reduziert. +This block allows light to propagate with a small loss of brightness, and sunlight can even go through losslessly.=Dieser Block ist lichtdurchlässig mit einen geringfügigen Helligkeitsverlust; Sonnenlicht passiert jedoch ohne Verlust. +This block allows light to propagate with a small loss of brightness.=Dieser Block ist lichtdurchlässig mit einen geringfügigen Helligkeitsverlust. +This block allows sunlight to propagate without loss in brightness.=Dieser Block ist vollkommen durchlässig für Sonnenlicht. +This block belongs to the @1 group.=Dieser Block gehört zur Gruppe „@1“. +This block belongs to these groups: @1.=Dieser Block gehört zu den folgenden Gruppen: @1. +This block can be climbed.=Dieser Block kann beklettert werden. +This block can be destroyed by any mining tool immediately.=Dieser Block kann von einem beliebigen Grabewerkzeug sofort zerstört werden. +This block can be destroyed by any mining tool in half a second.=Dieser Block kann von einem beliebigen Grabewerkzeug in einer halben Sekunde zerstört werden. +This block can be mined by any mining tool immediately.=Dieser Block kann von einem beliebigen Grabewerkzeug sofort abgebaut werden. +This block can be mined by any mining tool in half a second.=Dieser Block kann von einem beliebigen Grabewerkzeug in einer halben Sekunde abgebaut werden. +This block can be mined by mining tools which match any of the following mining ratings and its toughness level.=Dieser Block kann von Grabewerkzeugen abgebaut werden, falls sie auf eine der folgenden Grabewertungen sowie seinem Härtegrad passen. +This block can not be destroyed by ordinary mining tools.=Dieser Block kann nicht von Grabewerkzeugen zerstört werden. +This block can not be mined by ordinary mining tools.=Dieser Block kann nicht von gewöhnlichen Grabewerkzeugen abgebaut werden. +This block can serve as a smelting fuel with a burning time of @1.=Dieser Block kann als Brennstoff mit einer Brenndauer von @1 dienen. +This block causes a damage of @1 hit point per second.=Dieser Block richtet einen Schaden von @1 Trefferpunkt pro Sekunde an. +This block causes a damage of @1 hit points per second.=Dieser Block richtet einen Schaden von @1 Trefferpunkten pro Sekunde an. +This block connects to blocks of the @1 group.=Dieser Block verbindet sich mit Blöcken der Gruppe „@1“. +This block connects to blocks of the following groups: @1.=Dieser Block verbindet sich mit Blöcken der folgenden Gruppen: @1. +This block connects to these blocks: @1.=Dieser Block verbindet sich mit den folgenden Blöcken: @1. +This block connects to this block: @1.=Dieser Block verbindet sich mit diesem Block: @1. +This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds.=Dieser Block reduziert Ihren Atem und verursacht beim Ertrinken einen Schaden von @1 Trefferpunkt alle 2 Sekunden. +This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds.=Dieser Block reduziert Ihren Atem und verursacht beim Ertrinken einen Schaden von @1 Trefferpunkten alle 2 Sekunden. +This block glows faintly. It is barely noticable.=Dieser Block leuchtet schwach. Es ist kaum merklich. +This block is a light source with a light level of @1.=Dieser Block ist eine Lichtquelle mit einer Helligkeitsstufe von @1. +This block glows faintly with a light level of @1.=Dieser Block leuchtet schwach mit einer Helligkeitsstufe von @1. +This block is a building block for creating various buildings.=Dieser Block ist für den Bau diverser Gebäude vorgesehen. +This block is a liquid with these properties:=Dieser Block ist eine Flüssigkeit mit folgenden Eigenschaften: +This block is affected by gravity and can fall.=Dieser Block wird von der Schwerkraft beeinflusst und kann fallen. +This block is completely silent when mined or built.=Dieser Block kann vollkommen lautlos gebaut oder abgebaut werden. +This block is completely silent when walked on, mined or built.=Es ist vollkommen lautlos, wenn man auf diesen Block geht, ihn baut oder abbaut. +This block is destroyed when a falling block ends up inside it.=Dieser Block wird zerstört, wenn ein fallender Block in ihm landet. +This block negates all fall damage.=Auf diesem Block gibt es keinen Fallschaden. +This block points to liquids.=Mit diesem Block zeigt man auf Flüssigkeiten. +This block will drop as an item when a falling block ends up inside it.=Dieser Block wird sich als Gegenstand abwerfen, wenn ein fallender Block in ihn landet. +This block will drop as an item when it is not attached to a surrounding block.=Dieser Block wird sich als Gegenstand abwerfen, wenn er nicht an einen benachbarten Block befestigt ist. +This block will drop as an item when no collidable block is below it.=Dieser Block wird sich als Gegenstand abwerfen, wenn kein kollidierender Block unter ihn liegt. +This block will drop the following items when mined: @1.=Dieser Block wird nach dem Abbauen die folgenden Gegenstände abwerfen: @1. +This block will drop the following when mined: @1×@2.=Dieser Block wird nach dem Abbauen folgendes abwerfen: @1×@2. +This block will drop the following when mined: @1.=Dieser Block wird nach dem Abbauen folgendes abwerfen: @1. +This block will drop the following when mined: @1.=Dieser Block wird nach dem Abbauen folgendes abwerfen: @1. +This block will make you bounce off with an elasticity of @1%.=Dieser Block wird Sie mit einer Elastizität von @1% abprallen lassen. +This block will randomly drop one of the following when mined: @1.=Dieser Block wird nach dem Abbauen zufällig eines von den folgenden Dingen abwerfen: @1. +This block will randomly drop up to @1 drops of the following possible drops when mined: @2.=Dieser Block nach dem Abbauen wird zufällig bis zu @1 Abwürfe von den folgenden möglichen Abwürfen abwerfen: @2. +This block won't drop anything when mined.=Dieser Block wird nach dem Abbauen nichts abwerfen. +This is a decorational block.=Dieser Block dient zur Dekoration. +This is a melee weapon which deals damage by punching.=Dies ist eine Nahkampfwaffe, welche Schaden durch Schläge verursacht. +Maximum damage per hit:=Maximaler Schaden pro Treffer: +This item belongs to the @1 group.=Dieser Gegenstand gehört zur Gruppe „@1“. +This item belongs to these groups: @1.=Dieser Gegenstand gehört zu den folgenden Gruppen: @1. +This item can serve as a smelting fuel with a burning time of @1.=Dieser Gegenstand kann als Brennstoff mit einer Brenndauer von @1 dienen. +This item is primarily used for crafting other items.=Dieser Gegenstand wird primär für die Fertigung von anderen Gegenständen benutzt. +This item points to liquids.=Mit diesem Gegenstand zeigt man auf Flüssigkeiten. +This tool belongs to the @1 group.=Dieses Werkzeug gehört zur Gruppe „@1“. +This tool belongs to these groups: @1.=Dieses Werkzeug gehört zu den folgenden Gruppen: @1. +This tool can serve as a smelting fuel with a burning time of @1.=Dieses Werkzeug kann als Brennstoff mit einer Brenndauer von @1 dienen. +This tool is capable of mining.=Dies ist ein Grabewerkzeug. +Maximum toughness levels:=Maximale Härtegrade: +This tool points to liquids.=Mit diesem Werkzeug zeigt man auf Flüssigkeiten. +Tools and weapons=Werkzeuge und Waffen +Unknown Node=Unbekannter Node +Usage help: @1=Benutzung: @1 +Walking on this block is completely silent.=Auf diesem Block sind Schritte lautlos. +Whenever you are not wielding any item, you use the hand which acts as a tool with its own capabilities. When you are wielding an item which is not a mining tool or a weapon it will behave as if it would be the hand.=Wenn Sie keinen Gegenstand halten, benutzen Sie die Hand, welches als ein Werkzeug mit seinen eigenen Fägihkeiten dient. Wenn Sie einen Gegenstand halten, der kein Grabewerkzeug oder eine Waffe ist, wird er sich verhalten als wäre er die Hand. +Yes=Ja +You can not jump while standing on this block.=Man kann von diesem Block nicht abspringen. +any level=beliebige Stufe +level 0=Stufe 0 +level 0-@1=Stufen 0-@1 +unknown=unbekannt +Unknown item (@1)=Unbekannter Gegenstand (@1) +• @1: @2=• @1: @2 +• @1: @2 HP=• @1: @2 TP +• @1: @2, @3=• @1: @2, @3 +• Flowing range: @1=• Fließweite: @1 +• No flowing=• Kein Fließen +• Not renewable=• Nicht erneuerbar +• Renewable=• Erneuerbar +• Viscosity: @1=• Zähflüssigkeit: @1 +Itemstring: "@1"=Itemstring: „@1“ +Durability: @1 uses=Haltbarkeit: @1 Benutzungen +Durability: @1=Haltbarkeit: @1 +Mining durability:=Grabehaltbarkeit: +• @1, level @2: @3 uses=• @1, Stufe @2: @3 Benutzungen +• @1, level @2: Unlimited=• @1, Stufe @2: Unbegrenzt +This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead.=Die Rotation dieses Blocks hängt davon ab, wie sie ihn platzieren: Platzieren Sie ihn auf den Boden oder an die Decke, um ihn vertikal aufzustellen; platzieren Sie in an der Seite für eine horizontale Ausrichtung. Wenn Sie während des Bauens schleichen, wird der Block stattdessen senkrecht zur üblichen Ausrichtung rotiert. +Toughness level: @1=Härtegrad: @1 diff --git a/mods/HELP/doc/doc_items/locale/doc_items.pt.tr b/mods/HELP/doc/doc_items/locale/doc_items.pt.tr new file mode 100644 index 000000000..648e14569 --- /dev/null +++ b/mods/HELP/doc/doc_items/locale/doc_items.pt.tr @@ -0,0 +1,141 @@ +# textdomain:doc_items + Using it as fuel turns it into: @1.= Usar isso como combustivel o transforma em: @1. +@1 seconds=@1 segundos +# Item count times item name +%@1×@2=%@1×@2 +# Itemname (25%) +@1 (@2%)=@1 (@2%) +# Itemname (<0.5%) +@1 (<0.5%)=@1 (<0.5%) +# Itemname (ca. 25%) +@1 (ca. @2%)= +# List separator (e.g. “one, two, three”) +, =, +# Final list separator (e.g. “One, two and three”) + 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 +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. +Collidable: @1=Coledível: @1 +Description: @1=Descrição: @1 +Falling blocks can go through this block; they destroy it when doing so.=Blocos caindo podem atravessar esse bloco destruindo-o. +Full punch interval: @1 s=Intervalo completo de golpe: @1 s +Hand=Mão +Hold it in your hand, then leftclick to eat it.=Segure-o na sua mão, depois clique com o botão esquerdo para comer. +Hold it in your hand, then leftclick to eat it. But why would you want to do this?=Segure-o na sua mão, depois clique com o botão esquerdo para comer. Mas por que você quer fazer isso? +Item reference of all wieldable tools and weapons=Referência de item de todas as ferramentas e armas que podem ser usadas +Item reference of blocks and other things which are capable of occupying space=Referência de item de blocos e outras coisas que são capazes de ocupar espaço +Item reference of items which are neither blocks, tools or weapons (esp. crafting items)=Referência de itens que não são blocos, ferramentas ou armas (especialmente itens de criação) +Liquids can flow into this block and destroy it.=Líquidos podem fluir por esse bloco destruindo-o. +Maximum stack size: @1=Tamanho máximo de empilhamento: @1 +Mining level: @1=Nível de mineração: @1 +Mining ratings:=Classificações de mineração: +• @1, rating @2: @3 s - @4 s= +• @1, rating @2: @3 s= +Mining times:=Tempos de mineração: +Mining this block is completely silent.=Minerar esse bloco é completamente silencioso. +Miscellaneous items=Itens variados +No=Não +Pointable: No=Apontável: Não +Pointable: Only by special items=Apontável: Apenas por itens especiais +Pointable: Yes=Apontável: Sim +Punches with this block don't work as usual; melee combat and mining are either not possible or work differently.=Socos com esse bloco não funcionam de forma comum; Combate corpo a corpo e mineração não são possíveis ou funcionam de forma diferente. +Punches with this item don't work as usual; melee combat and mining are either not possible or work differently.=Socos com esse item não funcionam de forma comum; Combate corpo a corpo e mineração não são possíveis ou funcionam de forma diferente. +Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently.=Socos com essa ferramenta não funcionam de forma comum; Combate corpo a corpo e mineração não são possíveis ou funcionam de forma diferente. +Range: @1=Alcance: @1 +# Range: () +Range: @1 (@2)=Alcance: @1 (@2) +Range: 4=Range: 4 +# Rating used for digging times +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%. +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. +This block belongs to the @1 group.=Esse bloco pertence ao grupo @1. +This block belongs to these groups: @1.=Esse bloco pertence a estes grupos: @1. +This block can be climbed.=Esse bloco pode ser escalado. +This block can be destroyed by any mining tool immediately.=Esse bloco pode ser destruído de forma imediata por qualquer ferramenta de mineração. +This block can be destroyed by any mining tool in half a second.=Esse bloco pode ser destruído em meio segundo por qualquer ferramenta de mineração. +This block can be mined by any mining tool immediately.=Esse bloco pode ser extraído de forma imediata por qualquer ferramenta de mineração. +This block can be mined by any mining tool in half a second.=Esse bloco pode ser extraído em meio segundo por qualquer ferramenta de mineração. +This block can be mined by mining tools which match any of the following mining ratings and its toughness level.=Esse bloco pode ser extraído por ferramentas de mineração que correspondem a qualquer uma das seguintes classificações de mineração e seu nível de resistência. +This block can not be destroyed by ordinary mining tools.=Esse bloco não pode ser destruído por ferramentas de mineração comuns. +This block can not be mined by ordinary mining tools.=Esse bloco não pode ser extraído por ferramentas de mineração comuns. +This block can serve as a smelting fuel with a burning time of @1.=Esse bloco pode servir como combustível de fundição com um tempo de queima de @1. +This block causes a damage of @1 hit point per second.=Esse bloco causa um dano de @1 ponto de impacto por segundo. +This block causes a damage of @1 hit points per second.=Esse bloco causa um dano de @1 pontos de impacto por segundo. +This block connects to blocks of the @1 group.=Esse bloco se conecta a blocos do grupo @1. +This block connects to blocks of the following groups: @1.=Esse bloco se conecta a dos seguintes grupos: @1. +This block connects to these blocks: @1.=Esse bloco se conecta aos seguintes blocos: @1. +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 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. +This block is completely silent when mined or built.=Esse bloco é completamente silencioso quando extraído ou construído. +This block is completely silent when walked on, mined or built.=Esse bloco é completamente silencioso quando pisado, extraído ou construído. +This block is destroyed when a falling block ends up inside it.=Esse bloco é destruído quando um bloco em queda acaba dentro dele. +This block negates all fall damage.=Esse bloco nega todos os danos por queda. +This block points to liquids.=Esse bloco pode ser apontado para líquidos. +This block will drop as an item when a falling block ends up inside it.=Esse bloco vai cair como um item quando um bloco caindo acaba dentro dele. +This block will drop as an item when it is not attached to a surrounding block.=Esse bloco irá cair como um item quando não estiver anexado a um bloco adjacente. +This block will drop as an item when no collidable block is below it.=Esse bloco irá cair como um item quando nenhum bloco colidível estiver abaixo dele. +This block will drop the following items when mined: %s.=Esse bloco soltará os seguintes itens quando minerados: %s. +This block will drop the following when mined: @1×@2.=Esse bloco irá deixar cair o seguinte quando extraído: @1×@2. +This block will drop the following when mined: @1.=Esse bloco irá deixar cair o seguinte quando extraído: @1. +This block will drop the following when mined: %s.=Esse bloco irá deixar cair o seguinte quando extraído: %s. +This block will make you bounce off with an elasticity of @1%.=Esse bloco fará você saltar com uma elasticidade de @1%. +This block will randomly drop one of the following when mined: %s.=Esse bloco irá deixar cair aleatoriamente um dos seguintes quando extraído: %s. +This block will randomly drop up to %d drops of the following possible drops when mined: %s.=Esse bloco irá cair aleatoriamente %d vezes das seguintes possíveis formas quando extraído: %s. +This block won't drop anything when mined.=Esse bloco não vai deixar cair nada quando extraído. +This is a decorational block.=Esse é um bloco decorativo. +This is a melee weapon which deals damage by punching.=Essa é uma arma corpo-a-corpo que causa dano ao socar. +Maximum damage per hit:=Dano máximo por acerto: +This item belongs to the @1 group.=Esse item pertence ao grupo @1. +This item belongs to these groups: @1.=Esse item pertence aos seguintes grupos: @1. +This item can serve as a smelting fuel with a burning time of @1.=Esse item pode servir como combustível de fundição com um tempo de queima de @1. +This item is primarily used for crafting other items.=Esse item é usado principalmente para criar outros itens. +This item points to liquids.=Esse item pode ser apontado para líquidos. +This tool belongs to the @1 group.=Essa ferramenta pertence ao grupo @1. +This tool belongs to these groups: @1.=Essa ferramenta pertence aos seguintes grupos: @1. +This tool can serve as a smelting fuel with a burning time of @1.=Essa ferramenta pode servir como combustível de fundição com um tempo de queima de @1. +This tool is capable of mining.=Essa ferramenta é capaz de minerar. +Maximum toughness levels:=Níveis máximos de dureza: +This tool points to liquids.=Essa ferramenta pode ser apontada para líquidos. +Tools and weapons=Ferramentas e armas +Unknown Node=Bloco Desconhecido +Usage help: @1=Como usar: @1 +Walking on this block is completely silent.= +Whenever you are not wielding any item, you use the hand which acts as a tool with its own capabilities. When you are wielding an item which is not a mining tool or a weapon it will behave as if it would be the hand.=Sempre que você não estiver empunhando nenhum item, você usa a mão que atua como uma ferramentacom caracteristicas próprias. Quando você está empunhando um item que não é uma ferramenta de mineração ou uma arma, ele se comportará como se fosse a mão. +Yes=Sim +You can not jump while standing on this block.= Você não pode pular enquanto estiver neste bloco. +any level=qualquer nível +level 0=nível 0 +level 0-@1=nivel 0-@1 +unknown=desconhecido +Unknown item (@1)=Item desconhecido +• @1: @2= +• @1: @2 HP= +• @1: @2, @3= +• Flowing range: @1= +• No flowing= +• Not renewable= +• Renewable= +• Viscosity: @1= +Itemstring: "@1"= +Durability: @1 uses= +Durability: @1= +Mining durability:= +• @1, level @2: @3 uses= +• @1, level @2: Unlimited= +This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead.= 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 new file mode 100644 index 000000000..648e14569 --- /dev/null +++ b/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr @@ -0,0 +1,141 @@ +# textdomain:doc_items + Using it as fuel turns it into: @1.= Usar isso como combustivel o transforma em: @1. +@1 seconds=@1 segundos +# Item count times item name +%@1×@2=%@1×@2 +# Itemname (25%) +@1 (@2%)=@1 (@2%) +# Itemname (<0.5%) +@1 (<0.5%)=@1 (<0.5%) +# Itemname (ca. 25%) +@1 (ca. @2%)= +# List separator (e.g. “one, two, three”) +, =, +# Final list separator (e.g. “One, two and three”) + 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 +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. +Collidable: @1=Coledível: @1 +Description: @1=Descrição: @1 +Falling blocks can go through this block; they destroy it when doing so.=Blocos caindo podem atravessar esse bloco destruindo-o. +Full punch interval: @1 s=Intervalo completo de golpe: @1 s +Hand=Mão +Hold it in your hand, then leftclick to eat it.=Segure-o na sua mão, depois clique com o botão esquerdo para comer. +Hold it in your hand, then leftclick to eat it. But why would you want to do this?=Segure-o na sua mão, depois clique com o botão esquerdo para comer. Mas por que você quer fazer isso? +Item reference of all wieldable tools and weapons=Referência de item de todas as ferramentas e armas que podem ser usadas +Item reference of blocks and other things which are capable of occupying space=Referência de item de blocos e outras coisas que são capazes de ocupar espaço +Item reference of items which are neither blocks, tools or weapons (esp. crafting items)=Referência de itens que não são blocos, ferramentas ou armas (especialmente itens de criação) +Liquids can flow into this block and destroy it.=Líquidos podem fluir por esse bloco destruindo-o. +Maximum stack size: @1=Tamanho máximo de empilhamento: @1 +Mining level: @1=Nível de mineração: @1 +Mining ratings:=Classificações de mineração: +• @1, rating @2: @3 s - @4 s= +• @1, rating @2: @3 s= +Mining times:=Tempos de mineração: +Mining this block is completely silent.=Minerar esse bloco é completamente silencioso. +Miscellaneous items=Itens variados +No=Não +Pointable: No=Apontável: Não +Pointable: Only by special items=Apontável: Apenas por itens especiais +Pointable: Yes=Apontável: Sim +Punches with this block don't work as usual; melee combat and mining are either not possible or work differently.=Socos com esse bloco não funcionam de forma comum; Combate corpo a corpo e mineração não são possíveis ou funcionam de forma diferente. +Punches with this item don't work as usual; melee combat and mining are either not possible or work differently.=Socos com esse item não funcionam de forma comum; Combate corpo a corpo e mineração não são possíveis ou funcionam de forma diferente. +Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently.=Socos com essa ferramenta não funcionam de forma comum; Combate corpo a corpo e mineração não são possíveis ou funcionam de forma diferente. +Range: @1=Alcance: @1 +# Range: () +Range: @1 (@2)=Alcance: @1 (@2) +Range: 4=Range: 4 +# Rating used for digging times +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%. +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. +This block belongs to the @1 group.=Esse bloco pertence ao grupo @1. +This block belongs to these groups: @1.=Esse bloco pertence a estes grupos: @1. +This block can be climbed.=Esse bloco pode ser escalado. +This block can be destroyed by any mining tool immediately.=Esse bloco pode ser destruído de forma imediata por qualquer ferramenta de mineração. +This block can be destroyed by any mining tool in half a second.=Esse bloco pode ser destruído em meio segundo por qualquer ferramenta de mineração. +This block can be mined by any mining tool immediately.=Esse bloco pode ser extraído de forma imediata por qualquer ferramenta de mineração. +This block can be mined by any mining tool in half a second.=Esse bloco pode ser extraído em meio segundo por qualquer ferramenta de mineração. +This block can be mined by mining tools which match any of the following mining ratings and its toughness level.=Esse bloco pode ser extraído por ferramentas de mineração que correspondem a qualquer uma das seguintes classificações de mineração e seu nível de resistência. +This block can not be destroyed by ordinary mining tools.=Esse bloco não pode ser destruído por ferramentas de mineração comuns. +This block can not be mined by ordinary mining tools.=Esse bloco não pode ser extraído por ferramentas de mineração comuns. +This block can serve as a smelting fuel with a burning time of @1.=Esse bloco pode servir como combustível de fundição com um tempo de queima de @1. +This block causes a damage of @1 hit point per second.=Esse bloco causa um dano de @1 ponto de impacto por segundo. +This block causes a damage of @1 hit points per second.=Esse bloco causa um dano de @1 pontos de impacto por segundo. +This block connects to blocks of the @1 group.=Esse bloco se conecta a blocos do grupo @1. +This block connects to blocks of the following groups: @1.=Esse bloco se conecta a dos seguintes grupos: @1. +This block connects to these blocks: @1.=Esse bloco se conecta aos seguintes blocos: @1. +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 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. +This block is completely silent when mined or built.=Esse bloco é completamente silencioso quando extraído ou construído. +This block is completely silent when walked on, mined or built.=Esse bloco é completamente silencioso quando pisado, extraído ou construído. +This block is destroyed when a falling block ends up inside it.=Esse bloco é destruído quando um bloco em queda acaba dentro dele. +This block negates all fall damage.=Esse bloco nega todos os danos por queda. +This block points to liquids.=Esse bloco pode ser apontado para líquidos. +This block will drop as an item when a falling block ends up inside it.=Esse bloco vai cair como um item quando um bloco caindo acaba dentro dele. +This block will drop as an item when it is not attached to a surrounding block.=Esse bloco irá cair como um item quando não estiver anexado a um bloco adjacente. +This block will drop as an item when no collidable block is below it.=Esse bloco irá cair como um item quando nenhum bloco colidível estiver abaixo dele. +This block will drop the following items when mined: %s.=Esse bloco soltará os seguintes itens quando minerados: %s. +This block will drop the following when mined: @1×@2.=Esse bloco irá deixar cair o seguinte quando extraído: @1×@2. +This block will drop the following when mined: @1.=Esse bloco irá deixar cair o seguinte quando extraído: @1. +This block will drop the following when mined: %s.=Esse bloco irá deixar cair o seguinte quando extraído: %s. +This block will make you bounce off with an elasticity of @1%.=Esse bloco fará você saltar com uma elasticidade de @1%. +This block will randomly drop one of the following when mined: %s.=Esse bloco irá deixar cair aleatoriamente um dos seguintes quando extraído: %s. +This block will randomly drop up to %d drops of the following possible drops when mined: %s.=Esse bloco irá cair aleatoriamente %d vezes das seguintes possíveis formas quando extraído: %s. +This block won't drop anything when mined.=Esse bloco não vai deixar cair nada quando extraído. +This is a decorational block.=Esse é um bloco decorativo. +This is a melee weapon which deals damage by punching.=Essa é uma arma corpo-a-corpo que causa dano ao socar. +Maximum damage per hit:=Dano máximo por acerto: +This item belongs to the @1 group.=Esse item pertence ao grupo @1. +This item belongs to these groups: @1.=Esse item pertence aos seguintes grupos: @1. +This item can serve as a smelting fuel with a burning time of @1.=Esse item pode servir como combustível de fundição com um tempo de queima de @1. +This item is primarily used for crafting other items.=Esse item é usado principalmente para criar outros itens. +This item points to liquids.=Esse item pode ser apontado para líquidos. +This tool belongs to the @1 group.=Essa ferramenta pertence ao grupo @1. +This tool belongs to these groups: @1.=Essa ferramenta pertence aos seguintes grupos: @1. +This tool can serve as a smelting fuel with a burning time of @1.=Essa ferramenta pode servir como combustível de fundição com um tempo de queima de @1. +This tool is capable of mining.=Essa ferramenta é capaz de minerar. +Maximum toughness levels:=Níveis máximos de dureza: +This tool points to liquids.=Essa ferramenta pode ser apontada para líquidos. +Tools and weapons=Ferramentas e armas +Unknown Node=Bloco Desconhecido +Usage help: @1=Como usar: @1 +Walking on this block is completely silent.= +Whenever you are not wielding any item, you use the hand which acts as a tool with its own capabilities. When you are wielding an item which is not a mining tool or a weapon it will behave as if it would be the hand.=Sempre que você não estiver empunhando nenhum item, você usa a mão que atua como uma ferramentacom caracteristicas próprias. Quando você está empunhando um item que não é uma ferramenta de mineração ou uma arma, ele se comportará como se fosse a mão. +Yes=Sim +You can not jump while standing on this block.= Você não pode pular enquanto estiver neste bloco. +any level=qualquer nível +level 0=nível 0 +level 0-@1=nivel 0-@1 +unknown=desconhecido +Unknown item (@1)=Item desconhecido +• @1: @2= +• @1: @2 HP= +• @1: @2, @3= +• Flowing range: @1= +• No flowing= +• Not renewable= +• Renewable= +• Viscosity: @1= +Itemstring: "@1"= +Durability: @1 uses= +Durability: @1= +Mining durability:= +• @1, level @2: @3 uses= +• @1, level @2: Unlimited= +This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead.= diff --git a/mods/HELP/doc/doc_items/locale/template.txt b/mods/HELP/doc/doc_items/locale/template.txt index 5f71c75a6..68d2d0a7d 100644 --- a/mods/HELP/doc/doc_items/locale/template.txt +++ b/mods/HELP/doc/doc_items/locale/template.txt @@ -1,140 +1,142 @@ -\sUsing it as fuel turns it into: @1. = -@1 seconds = +# textdomain:doc_items +Using it as fuel turns it into: @1.= +@1 seconds= # Item count times item name -%@1×@2 = +%@1×@2= # Itemname (25%) -@1 (@2%) = +@1 (@2%)= # Itemname (<0.5%) -@1 (<0.5%) = +@1 (<0.5%)= # Itemname (ca. 25%) -@1 (ca. @2%) = +@1 (ca. @2%)= # List separator (e.g. “one, two, three”) -,\s = +, = # Final list separator (e.g. “One, two and three”) -\sand\s = -1 second = -A transparent block, basically empty space. It is usually left behind after digging something. = -Air = -Blocks = -Building another block at this block will place it inside and replace it. = -Building this block is completely silent. = -Collidable: @1 = -Description: @1 = -Falling blocks can go through this block; they destroy it when doing so. = -Full punch interval: @1 s = -Hand = -Hold it in your hand, then leftclick to eat it. = -Hold it in your hand, then leftclick to eat it. But why would you want to do this? = -Item reference of all wieldable tools and weapons = -Item reference of blocks and other things which are capable of occupying space = -Item reference of items which are neither blocks, tools or weapons (esp. crafting items) = -Liquids can flow into this block and destroy it. = -Maximum stack size: @1 = -Mining level: @1 = -Mining ratings: = -• @1, rating @2: @3 s - @4 s = -• @1, rating @2: @3 s = -Mining times: = -Mining this block is completely silent. = -Miscellaneous items = -No = -Pointable: No = -Pointable: Only by special items = -Pointable: Yes = -Punches with this block don't work as usual; melee combat and mining are either not possible or work differently. = -Punches with this item don't work as usual; melee combat and mining are either not possible or work differently. = -Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently. = -Range: @1 = + and = +1 second= +A transparent block, basically empty space. It is usually left behind after digging something.= +Air= +Blocks= +Building another block at this block will place it inside and replace it.= +Building this block is completely silent.= +Collidable: @1= +Description: @1= +Falling blocks can go through this block; they destroy it when doing so.= +Full punch interval: @1 s= +Hand= +Hold it in your hand, then leftclick to eat it.= +Hold it in your hand, then leftclick to eat it. But why would you want to do this?= +Item reference of all wieldable tools and weapons= +Item reference of blocks and other things which are capable of occupying space= +Item reference of items which are neither blocks, tools or weapons (esp. crafting items)= +Liquids can flow into this block and destroy it.= +Maximum stack size: @1= +Mining level: @1= +Mining ratings:= +• @1, rating @2: @3 s - @4 s= +• @1, rating @2: @3 s= +Mining times:= +Mining this block is completely silent.= +Miscellaneous items= +No= +Pointable: No= +Pointable: Only by special items= +Pointable: Yes= +Punches with this block don't work as usual; melee combat and mining are either not possible or work differently.= +Punches with this item don't work as usual; melee combat and mining are either not possible or work differently.= +Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently.= +Range: @1= # Range: () -Range: @1 (@2) = -Range: 4 = +Range: @1 (@2)= +Range: 4= # Rating used for digging times -Rating @1 = +Rating @1= # @1 is minimal rating, @2 is maximum rating -Rating @1-@2 = -The fall damage on this block is increased by @1%. = -The fall damage on this block is reduced by @1%. = -This block allows light to propagate with a small loss of brightness, and sunlight can even go through losslessly. = -This block allows light to propagate with a small loss of brightness. = -This block allows sunlight to propagate without loss in brightness. = -This block belongs to the @1 group. = -This block belongs to these groups: @1. = -This block can be climbed. = -This block can be destroyed by any mining tool immediately. = -This block can be destroyed by any mining tool in half a second. = -This block can be mined by any mining tool immediately. = -This block can be mined by any mining tool in half a second. = -This block can be mined by mining tools which match any of the following mining ratings and its toughness level. = -This block can not be destroyed by ordinary mining tools. = -This block can not be mined by ordinary mining tools. = -This block can serve as a smelting fuel with a burning time of @1. = -This block causes a damage of @1 hit point per second. = -This block causes a damage of @1 hit points per second. = -This block connects to blocks of the @1 group. = -This block connects to blocks of the following groups: @1. = -This block connects to these blocks: @1. = -This block connects to this block: @1. = -This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds. = -This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds. = -This block is a light source with a light level of @1. = -This block glows faintly with a light level of @1. = -This block is a building block for creating various buildings. = -This block is a liquid with these properties: = -This block is affected by gravity and can fall. = -This block is completely silent when mined or built. = -This block is completely silent when walked on, mined or built. = -This block is destroyed when a falling block ends up inside it. = -This block negates all fall damage. = -This block points to liquids. = -This block will drop as an item when a falling block ends up inside it. = -This block will drop as an item when it is not attached to a surrounding block. = -This block will drop as an item when no collidable block is below it. = -This block will drop the following items when mined: %s. = -This block will drop the following when mined: @1×@2. = -This block will drop the following when mined: @1. = -This block will drop the following when mined: %s. = -This block will make you bounce off with an elasticity of @1%. = -This block will randomly drop one of the following when mined: %s. = -This block will randomly drop up to %d drops of the following possible drops when mined: %s. = -This block won't drop anything when mined. = -This is a decorational block. = -This is a melee weapon which deals damage by punching. = -Maximum damage per hit: = -This item belongs to the @1 group. = -This item belongs to these groups: @1. = -This item can serve as a smelting fuel with a burning time of @1. = -This item is primarily used for crafting other items. = -This item points to liquids. = -This tool belongs to the @1 group. = -This tool belongs to these groups: @1. = -This tool can serve as a smelting fuel with a burning time of @1. = -This tool is capable of mining. = -Maximum toughness levels: = -This tool points to liquids. = -Tools and weapons = -Unknown Node = -Usage help: @1 = -Walking on this block is completely silent. = -Whenever you are not wielding any item, you use the hand which acts as a tool with its own capabilities. When you are wielding an item which is not a mining tool or a weapon it will behave as if it would be the hand. = -Yes = -You can not jump while standing on this block. = -any level = -level 0 = -level 0-@1 = -unknown = -Unknown item (@1) = -• @1: @2 = -• @1: @2 HP = -• @1: @2, @3 = -• Flowing range: @1 = -• No flowing = -• Not renewable = -• Renewable = -• Viscosity: @1 = -Itemstring: "@1" = -Durability: @1 uses = -Durability: @1 = -Mining durability: = -• @1, level @2: @3 uses = -• @1, level @2: Unlimited = -This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead. = +Rating @1-@2= +The fall damage on this block is increased by @1%.= +The fall damage on this block is reduced by @1%.= +This block allows light to propagate with a small loss of brightness, and sunlight can even go through losslessly.= +This block allows light to propagate with a small loss of brightness.= +This block allows sunlight to propagate without loss in brightness.= +This block belongs to the @1 group.= +This block belongs to these groups: @1.= +This block can be climbed.= +This block can be destroyed by any mining tool immediately.= +This block can be destroyed by any mining tool in half a second.= +This block can be mined by any mining tool immediately.= +This block can be mined by any mining tool in half a second.= +This block can be mined by mining tools which match any of the following mining ratings and its toughness level.= +This block can not be destroyed by ordinary mining tools.= +This block can not be mined by ordinary mining tools.= +This block can serve as a smelting fuel with a burning time of @1.= +This block causes a damage of @1 hit point per second.= +This block causes a damage of @1 hit points per second.= +This block connects to blocks of the @1 group.= +This block connects to blocks of the following groups: @1.= +This block connects to these blocks: @1.= +This block connects to this block: @1.= +This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds.= +This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds.= +This block is a light source with a light level of @1.= +This block glows faintly with a light level of @1.= +This block is a building block for creating various buildings.= +This block is a liquid with these properties:= +This block is affected by gravity and can fall.= +This block is completely silent when mined or built.= +This block is completely silent when walked on, mined or built.= +This block is destroyed when a falling block ends up inside it.= +This block negates all fall damage.= +This block points to liquids.= +This block will drop as an item when a falling block ends up inside it.= +This block will drop as an item when it is not attached to a surrounding block.= +This block will drop as an item when no collidable block is below it.= +This block will drop the following items when mined: @1.= +This block will drop the following when mined: @1×@2.= +This block will drop the following when mined: @1.= +This block will drop the following when mined: @1.= +This block will make you bounce off with an elasticity of @1%.= +This block will randomly drop one of the following when mined: @1.= +This block will randomly drop up to @1 drops of the following possible drops when mined: @2.= +This block won't drop anything when mined.= +This is a decorational block.= +This is a melee weapon which deals damage by punching.= +Maximum damage per hit:= +This item belongs to the @1 group.= +This item belongs to these groups: @1.= +This item can serve as a smelting fuel with a burning time of @1.= +This item is primarily used for crafting other items.= +This item points to liquids.= +This tool belongs to the @1 group.= +This tool belongs to these groups: @1.= +This tool can serve as a smelting fuel with a burning time of @1.= +This tool is capable of mining.= +Maximum toughness levels:= +This tool points to liquids.= +Tools and weapons= +Unknown Node= +Usage help: @1= +Walking on this block is completely silent.= +Whenever you are not wielding any item, you use the hand which acts as a tool with its own capabilities. When you are wielding an item which is not a mining tool or a weapon it will behave as if it would be the hand.= +Yes= +You can not jump while standing on this block.= +any level= +level 0= +level 0-@1= +unknown= +Unknown item (@1)= +• @1: @2= +• @1: @2 HP= +• @1: @2, @3= +• Flowing range: @1= +• No flowing= +• Not renewable= +• Renewable= +• Viscosity: @1= +Itemstring: "@1"= +Durability: @1 uses= +Durability: @1= +Mining durability:= +• @1, level @2: @3 uses= +• @1, level @2: Unlimited= +This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead.= +Toughness level: @1= diff --git a/mods/HELP/doc/doc_items/mod.conf b/mods/HELP/doc/doc_items/mod.conf index 74fa80dfc..f1c0fbbc5 100644 --- a/mods/HELP/doc/doc_items/mod.conf +++ b/mods/HELP/doc/doc_items/mod.conf @@ -1 +1,3 @@ name = doc_items +depends = doc +description = Adds automatically generated help texts for items. From 78f4043fb9724456c8eee9a3e319b52704f3807c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Mar 2019 14:22:51 +0100 Subject: [PATCH 216/379] Update mcl_doc_basics, with new translations --- mods/HELP/mcl_doc_basics/README.md | 4 +- mods/HELP/mcl_doc_basics/depends.txt | 1 - mods/HELP/mcl_doc_basics/description.txt | 1 - mods/HELP/mcl_doc_basics/init.lua | 314 +++++------- .../locale/mcl_doc_basics.de.tr | 451 +++++++++++++++++- .../locale/mcl_doc_basics.it.tr | 408 ++++++++++++++++ mods/HELP/mcl_doc_basics/mcl_extension.lua | 97 ++++ mods/HELP/mcl_doc_basics/mod.conf | 4 +- 8 files changed, 1058 insertions(+), 222 deletions(-) delete mode 100644 mods/HELP/mcl_doc_basics/depends.txt delete mode 100644 mods/HELP/mcl_doc_basics/description.txt create mode 100644 mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.it.tr create mode 100644 mods/HELP/mcl_doc_basics/mcl_extension.lua diff --git a/mods/HELP/mcl_doc_basics/README.md b/mods/HELP/mcl_doc_basics/README.md index 2125bed79..13ac04e4a 100644 --- a/mods/HELP/mcl_doc_basics/README.md +++ b/mods/HELP/mcl_doc_basics/README.md @@ -1,4 +1,4 @@ -# Basic help [`doc_basics`] +# Basic help, MineClone 2 edition [`mcl_doc_basics`] Adds basic help texts about Minetest, controls, gameplay and other basics. This mod uses the Documentation System [`doc`] as a basis and adds these categories: @@ -6,7 +6,5 @@ categories: * Basics: Basic gameplay information (e.g. how to craft) * Advanced usage: Advanced Minetest information (not gameplay-releavant) for power users (e.g. how to use commands) -Version: 1.0.0 - ## License Everything in this mod is licensed under the MIT License. diff --git a/mods/HELP/mcl_doc_basics/depends.txt b/mods/HELP/mcl_doc_basics/depends.txt deleted file mode 100644 index 8e695ec83..000000000 --- a/mods/HELP/mcl_doc_basics/depends.txt +++ /dev/null @@ -1 +0,0 @@ -doc diff --git a/mods/HELP/mcl_doc_basics/description.txt b/mods/HELP/mcl_doc_basics/description.txt deleted file mode 100644 index f86a1b591..000000000 --- a/mods/HELP/mcl_doc_basics/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds some help texts explaining how to use Minetest. diff --git a/mods/HELP/mcl_doc_basics/init.lua b/mods/HELP/mcl_doc_basics/init.lua index d8b8c790a..7da389b16 100644 --- a/mods/HELP/mcl_doc_basics/init.lua +++ b/mods/HELP/mcl_doc_basics/init.lua @@ -1,3 +1,7 @@ +--[[ +Basic help for MCL2. Fork of doc_basics +]] + local S = minetest.get_translator("mcl_doc_basics") doc.add_category("basics", @@ -23,7 +27,6 @@ doc.add_entry("basics", "quick_start", { data = { text = S("This is a very brief introduction to the basic gameplay:").."\n\n".. -S("Basic controls:").."\n".. S("• Move mouse to look").."\n".. S("• [W], [A], [S] and [D] to move").."\n".. S("• [E] to sprint").."\n".. @@ -34,7 +37,9 @@ S("• Left-click to mine blocks or attack").."\n".. S("• Recover from swings to deal full damage").."\n".. S("• Right-click to build blocks and use things").."\n".. S("• [I] for the inventory").."\n".. -S("• Lowest row in inventory appears in hotbar below").."\n".. +S("• First items in inventory appear in hotbar below").."\n".. +S("• [F9] for the minimap").."\n".. +S("• Read entries in this help to learn the rest").."\n".. S("• [Esc] to close this window").."\n\n".. S("How to play:").."\n".. @@ -48,7 +53,6 @@ S("• Craft a wooden pickaxe so you can dig stone").."\n".. S("• Different tools break different kinds of blocks. Try them out!").."\n".. S("• Read entries in this help to learn the rest").."\n".. S("• Continue playing as you wish. There's no goal. Have fun!") - }}) doc.add_entry("basics", "minetest", { @@ -59,13 +63,12 @@ S("Minetest is a free software game engine for games based on voxel gameplay, in S("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 can, however, be much more complex than this.").."\n\n".. -S("A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorative blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.").."\n\n".. +S("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.").."\n\n".. S("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.").."\n\n".. -S("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 .").."\n\n".. +S("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 ."), -S("Minetest as well as Minetest Game are both unfinished at the moment, so please forgive us when not everything works out perfectly."), images = {{image="doc_basics_gameplay_mtg_1.png"}, {image="doc_basics_gameplay_mtg_2.png"}, {image="doc_basics_gameplay_carbone_ng.png"}, {image="doc_basics_gameplay_lott.png"}, {image="doc_basics_gameplay_pixture.png"}, {image="doc_basics_gameplay_outback.png"}, {image="doc_basics_gameplay_moontest.png"}, {image="doc_basics_gameplay_hades.png"}, {image="doc_basics_gameplay_xtraores_xtension.png"},} }}) @@ -80,8 +83,6 @@ S("• Sneak: [Shift]").."\n\n".. S("Sneaking only works when you stand on solid ground, are not in a liquid and don't climb.").."\n\n".. -S("If you jump while holding the sneak key, you also jump slightly higher than usual.").."\n\n".. - S("Sneaking might be disabled by mods. In this case, you still walk slower by sneaking, but you will no longer be stopped at ledges."), images = { { image = "doc_basics_sneak.png" } }, }}) @@ -96,7 +97,7 @@ S("• Moving the mouse around: Look around").."\n".. S("• W: Move forwards").."\n".. S("• A: Move to the left").."\n".. S("• D: Move to the right").."\n".. -S("• S: Move backwards").."\n\n".. +S("• S: Move backwards").."\n".. S("• E: Sprint").."\n\n".. S("While standing on solid ground:").."\n".. @@ -111,13 +112,13 @@ S("Extended movement (requires privileges):").."\n".. S("• J: Toggle fast mode, makes you run or fly fast (requires “fast” privilege)").."\n".. S("• K: Toggle fly mode, makes you move freely in all directions (requires “fly” privilege)").."\n".. S("• H: Toggle noclip mode, makes you go through walls in fly mode (requires “noclip” privilege)").."\n".. -S("• E: Move even faster when in fast mode").."\n\n".. +S("• E: Walk fast in fast mode").."\n\n".. S("World interaction:").."\n".. -S("• Left mouse button: Punch / mine blocks / take items").."\n".. +S("• Left mouse button: Punch / mine blocks").."\n".. S("• Right mouse button: Build or use pointed block").."\n".. S("• Shift+Right mouse button: Build").."\n".. -S("• Roll mouse wheel: Select next/previous item in hotbar").."\n".. +S("• Roll mouse wheel / B / N: Select next/previous item in hotbar").."\n".. S("• 1-9: Select item in hotbar directly").."\n".. S("• Q: Drop item stack").."\n".. S("• Shift+Q: Drop 1 item").."\n".. @@ -127,22 +128,21 @@ S("Inventory interaction:").."\n".. S("See the entry “Basics > Inventory”.").."\n\n".. S("Camera:").."\n".. -S("• Z: Zoom (requires “zoom” privilege)").."\n".. -S("• F7: Toggle camera mode").."\n".. -S("• F8: Toggle cinematic mode").."\n\n".. +S("• Z: Zoom").."\n".. +S("• F7: Toggle camera mode").."\n\n".. S("Interface:").."\n".. S("• Esc: Open menu window (pauses in single-player mode) or close window").."\n".. S("• F1: Show/hide HUD").."\n".. S("• F2: Show/hide chat").."\n".. -S("• F9: Toggle minimap (only works if have a map)").."\n".. +S("• F9: Toggle minimap").."\n".. S("• Shift+F9: Toggle minimap rotation mode").."\n".. S("• F10: Open/close console/chat log").."\n".. S("• F12: Take a screenshot").."\n\n".. S("Server interaction:").."\n".. S("• T: Open chat window (chat requires the “shout” privilege)").."\n".. -S("• /: Start issuing a server command)").."\n\n".. +S("• /: Start issuing a server command").."\n\n".. S("Technical:").."\n".. S("• R: Toggle far view (disables all fog and allows viewing far away, can make game very slow)").."\n".. @@ -150,8 +150,7 @@ S("• +: Increase minimal viewing distance").."\n".. S("• -: Decrease minimal viewing distance").."\n".. S("• F3: Enable/disable fog").."\n".. S("• F5: Enable/disable debug screen which also shows your coordinates").."\n".. -S("• F6: Only useful for developers. Enables/disables profiler").."\n".. -S("• P: Only useful for developers. Writes current stack traces") +S("• F6: Only useful for developers. Enables/disables profiler") }}) doc.add_entry("basics", "players", { @@ -160,17 +159,19 @@ doc.add_entry("basics", "players", { text = S("Players (actually: “player characters”) are the characters which users control.").."\n\n".. -S("Players are living beings which occupy a space of about 1×2×1 cubes. They start with 20 health points (HP) and 10 breath points (BP).").."\n".. +S("Players are living beings. They start with a number of health points (HP) and a number of breath points (BP).").."\n".. S("Players are capable of walking, sneaking, jumping, climbing, swimming, diving, mining, building, fighting and using tools and blocks.").."\n".. -S("Players can take damage for a variety of reasons, here are some:\ -• Taking fall damage\ -• Touching a block which causes direct damage\ -• Drowning\ -• Being attacked by another player\ -• Being attacked by a computer enemy").."\n\n".. +S("Players can take damage for a variety of reasons, here are some:").."\n\n".. -S("At a health of 0, the player dies and loses all items in the inventory. The player can just respawn in the world.").."\n".. +S("• Taking fall damage").."\n".. +S("• Touching a block which causes direct damage").."\n".. +S("• Drowning").."\n".. +S("• Being attacked by another player").."\n".. +S("• Being attacked by a computer enemy").."\n\n".. + +S("At a health of 0, the player dies. The player can just respawn in the world.").."\n".. +S("Other consequences of death depend on the game. The player could lose all items, or lose the round in a competitive game.").."\n\n".. S("Some blocks reduce breath. While being with the head in a block which causes drowning, the breath points are reduced by 1 for every 2 seconds. When all breath is gone, the player starts to suffer drowning damage. Breath is quickly restored in any other block.").."\n\n".. @@ -188,14 +189,14 @@ S("Items are things you can carry along and store in inventories. They can be us S("An item stack is a collection of items of the same type which fits into a single item slot. Item stacks can be dropped on the ground. Items which drop into the same coordinates will form an item stack.").."\n\n".. -S("Items have several properties, including the following:\ -\ -• Maximum stack size: Number of items which fit on 1 item stack\ -• Pointing range: How close things must be to be pointed while wielding this item\ -• Group memberships: See “Basics > Groups”\ -• May be used for crafting or cooking").."\n\n".. +S("Items have several properties, including the following:").."\n\n".. -S("Dropped item stacks will be collected automatically when you stand close to them."), +S("• Maximum stack size: Number of items which fit on 1 item stack").."\n".. +S("• Pointing range: How close things must be to be pointed while wielding this item").."\n".. +S("• Group memberships: See “Basics > Groups”").."\n".. +S("• May be used for crafting or cooking").."\n\n".. + +S("A dropped item stack can be collected by punching it."), images = {{image="doc_basics_inventory_detail.png"}, {image="doc_basics_items_dropped.png"}}, }}) @@ -204,9 +205,9 @@ doc.add_entry("basics", "tools", { data = { text = S("Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.").."\n\n".. -S("Mining tools are important to break all kinds of blocks. Weapons are another kind of tool. There are some other more specialized tools. Special actions of tools are usually done by right-click.").."\n\n".. +S("A common tool in Minetest are, of course, mining tools. These are important to break all kinds of blocks. Weapons are a kind of tool in Minetest. There are of course many other possible tools. Special actions of tools are usually done by left-click or right-click.").."\n\n".. -S("When nothing is wielded, players use their hand which may act as tool and weapon. The hand is capable of punching and deals minimum damage.").."\n\n".. +S("When nothing is wielded, players use their hand which may act as tool and weapon.").."\n\n".. S("Many tools will wear off when using them and may eventually get destroyed. The damage is displayed in a damage bar below the tool icon. If no damage bar is shown, the tool is in mint condition. Tools may be repairable by crafting, see “Basics > Crafting”."), images = {{image="doc_basics_tools.png"}, {image="doc_basics_tools_mining.png"}}, @@ -222,7 +223,7 @@ S("• Single punch: Left-click once to deal a single punch").."\n".. S("• Quick punching: Hold down the left mouse button to deal quick repeated punches").."\n\n".. S("There are two core attributes of melee weapons:").."\n".. -S("• Maximum damage: Damage which is dealt after a hit when the weapon was fully recovered)").."\n".. +S("• Maximum damage: Damage which is dealt after a hit when the weapon was fully recovered").."\n".. S("• Full punch interval: Time it takes for fully recovering from a punch").."\n\n".. S("A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.").."\n\n".. @@ -247,18 +248,17 @@ doc.add_entry("basics", "cam", { name = S("Camera"), data = { text = -S("Minetest has 3 different views which determine the way you see the world. The modes are:\ -\ -• 1: First-person view (default)\ -• 2: Third-person view from behind\ -• 3: Third-person view from the front").."\n\n".. +S("Minetest has 3 different views which determine the way you see the world. The modes are:").."\n\n".. + +S("• 1: First-person view (default)").."\n".. +S("• 2: Third-person view from behind").."\n".. +S("• 3: Third-person view from the front").."\n\n".. S("You can change the camera mode by pressing [F7].").."\n".. -S("There is also Cinematic Mode which can be toggled with [F8]. With Cinematic Mode enabled, the camera movements become more smooth. Some players don't like it, it is a matter of taste.").."\n".. -S("By holding down [Z], you can zoom the view at your crosshair. You need the “zoom” privilege to do this.").."\n\n".. +S("You might be able to zoom with [Z] to zoom the view at the crosshair. This allows you to look further.").."\n".. +S("Zooming is a gameplay feature that might be enabled or disabled by the game. By default, zooming is enabled when in Creative Mode but disabled otherwise.").."\n\n".. S("• Switch camera mode: [F7]").."\n".. -S("• Toggle Cinematic Mode: [F8]").."\n".. S("• Zoom: [Z]"), images = {{image="doc_basics_camera_ego.png"}, {image="doc_basics_camera_behind.png"}, {image="doc_basics_camera_front.png"}} }}) @@ -267,7 +267,7 @@ doc.add_entry("basics", "nodes", { name = S("Blocks"), data = { text = -S("The world of MineClone 2 is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.").."\n\n".. +S("The world of Minetest is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.").."\n\n".. S("Blocks can have a wide range of different properties which determine mining times, behavior, looks, shape, and much more. Their properties include:").."\n\n".. @@ -288,13 +288,42 @@ doc.add_entry("basics", "mine", { text = S("Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.").."\n\n".. -S("Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in hardness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining will drop on the ground, ready to be collected.") .. "\n\n".. +S("Short explanation:").."\n\n".. + +S("Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in toughness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining go straight into your inventory.") .. "\n\n".. + +S("Detailed explanation:").."\n\n".. + +S("Mineable blocks have mining properties (based on groups) and a toughness level. Mining tools have the same properties. Each mining property of a block also has a rating, while tools can be able to break blocks within a range of ratings.").."\n\n".. + +S("In order to mine a block, these conditions need to be met:").."\n".. +S("• The block and tool share at least one mining property for which they have a matching rating").."\n".. +S("• The tool's toughness level is equal or greater than the block's toughness level").."\n\n".. + +S("Example: A block with the mining property “cracky”, rating 3 and toughness level 0 can only be broken by a tool which is able to break “cracky” blocks at rating 3 and it must have a toughness level of 0 or larger.").."\n\n".. + +S("The time it takes to mine a block depends on the ratings and the toughness levels of both tool and block.").."\n".. +S("• The base mining time depends on the ratings of the block and the mining speed of the tool").."\n".. +S("• The mining speed of the tool differs for each mining property and its rating").."\n".. +S("• The toughness level further modifies the mining speed for this mining property").."\n".. +S("• A high difference in toughness levels decreases the mining time considerably").."\n".. +S("• If the toughness level difference is 2, the mining time is half of the base mining time").."\n".. +S("• With a difference of 3, the mining time is a third, and so on").."\n\n".. + +S("The item help shows the mining times of a tool listed by its mining properties and its ratings. The mining times are often expressed as a range. The low number stands for the mining time for toughness level 0 and the high number for the highest level the tool can mine.").."\n\n".. + +S("Mining usually wears off tools. Each time you mine a block, your tool takes some damage until it is destroyed eventually. The wear per mined block is determined by the difference between the tool's toughness level and the block's toughness level. The higher the difference, the lower the wear. This means:").."\n".. +S("• High-level blocks wear off your tools faster").."\n".. +S("• You can use high-level tools to compensate this").."\n".. +S("• The highest wear is caused when the level of both tool and block are equal").."\n\n".. S("After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:").."\n".. S("• Always drops itself (the usual case)").."\n".. S("• Always drops the same items").."\n".. S("• Drops items based on probability").."\n".. -S("• Drops nothing"), +S("• Drops nothing").."\n\n".. + +S("The drop goes directly into your inventory, unless there's no more space left. In that case, the items literally drop on the floor."), images = {{image="doc_basics_tools_mining.png"}}, }}) @@ -321,19 +350,19 @@ doc.add_entry("basics", "liquids", { S("Liquids are special dynamic blocks. Liquids like to spread and flow to their surrounding blocks. Players can swim and drown in them.").."\n\n".. S("Liquids usually come in two forms: In source form (S) and in flowing form (F).").."\n".. -S("Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. A long it is left alone, a liquid source will normally keep its place and does not drain out.").."\n".. +S("Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. As long it is left alone, a liquid source will normally keep its place and does not drain out.").."\n".. S("Flowing liquids take a sloped form. Flowing liquids spread around the world until they drain. A flowing liquid can not sustain itself and always comes from a liquid source, either directly or indirectly. Without a liquid source, a flowing liquid will eventually drain out and disappear.").."\n".. S("All liquids share the following properties:").."\n".. -S("• All properties of blocks (including drowning damage").."\n".. +S("• All properties of blocks (including drowning damage)").."\n".. S("• Renewability: Renewable liquids can create new sources").."\n".. S("• Flowing range: How many flowing liquids are created at maximum per liquid source, it determines how far the liquid will spread. Possible are ranges from 0 to 8. At 0, no flowing liquids will be created. Image 5 shows a liquid of flowing range 2").."\n".. S("• Viscosity: How slow players move through it and how slow the liquid spreads").."\n\n".. -S("Renewable liquids create new liquid sources at open spaces (image 2). A new liquid source is created when:\ -• Two renewable liquid blocks of the same type touch each other diagonally\ -• These blocks are also on the same height\ -• One of the two “corners” is open space which allows liquids to flow in").."\n\n".. +S("Renewable liquids create new liquid sources at open spaces (image 2). A new liquid source is created when:").."\n".. +S("• Two renewable liquid blocks of the same type touch each other diagonally").."\n".. +S("• These blocks are also on the same height").."\n".. +S("• One of the two “corners” is open space which allows liquids to flow in").."\n\n".. S("When those criteria are met, the open space is filled with a new liquid source of the same type (image 3).").."\n\n".. @@ -371,16 +400,16 @@ S("To craft something, you need one or more items, a crafting grid (C) and a cra S("To complete the craft, take the result item from the output slot, which will consume items from the crafting grid and creates a new item. It is not possible to place items into the output slot.").."\n\n".. -S("A description on how to craft an item is called a “crafting recipe”. These crafting recipes can be found in the crafting guide which you can access from the inventory menu.").."\n\n".. +S("A description on how to craft an item is called a “crafting recipe”. You need this knowledge to craft. There are multiple ways to learn crafting recipes. One way is by using a crafting guide, which contains a list of available crafting recipes. Some games provide crafting guides. There are also some mods which you can download online for installing a crafting guide. Another way is by reading the online manual of the game (if one is available).").."\n\n".. S("Crafting recipes consist of at least one input item and exactly one stack of output items. When performing a single craft, it will consume exactly one item from each stack of the crafting grid, unless the crafting recipe defines replacements.").."\n\n".. -S("There are multiple types of crafting recipes:\ -\ -• Shaped (image 2): Items need to be placed in a particular shape\ -• Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)\ -• Cooking: Explained in “Basics > Cooking”\ -• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by 5%.").."\n\n".. +S("There are multiple types of crafting recipes:").."\n\n".. + +S("• Shaped (image 2): Items need to be placed in a particular shape").."\n".. +S("• Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)").."\n".. +S("• Cooking: Explained in “Basics > Cooking”").."\n".. +S("• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by a certain percentage. This recipe may not be available in all games").."\n\n".. S("In some crafting recipes, some input items do not need to be a concrete item, instead they need to be a member of a group (see “Basics > Groups”). These recipes offer a bit more freedom in the input items. Images 6-8 show the same group-based recipe. Here, 8 items of the “stone” group are required, which is true for all of the shown items.").."\n\n".. @@ -396,7 +425,7 @@ doc.add_entry("basics", "cook", { name = S("Cooking"), data = { text = -S("Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a furnace, an cookable item, a fuel item and time in order to yield a new item.").."\n\n".. +S("Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a special block (like a furnace), an cookable item, a fuel item and time in order to yield a new item.").."\n\n".. S("Each fuel item has a burning time. This is the time a single item of the fuel keeps a furnace burning.").."\n\n".. @@ -407,12 +436,12 @@ doc.add_entry("basics", "hotbar", { name = S("Hotbar"), data = { text = -S("At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the lowest row of items in the player inventory.").."\n".. -S("You can change the selected item with the mouse wheel or the number keys.").."\n\n".. +S("At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the first items from your player inventory.").."\n".. +S("You can change the selected item with the mouse wheel or the keyboard.").."\n\n".. -S("• Select previous item in hotbar: [Mouse wheel up]").."\n".. -S("• Select next item in hotbar: [Mouse wheel down]").."\n".. -S("• Select item in hotbar directly: [0]-[9]").."\n\n".. +S("• Select previous item in hotbar: [Mouse wheel up] or [B]").."\n".. +S("• Select next item in hotbar: [Mouse wheel down] or [N]").."\n".. +S("• Select item in hotbar directly: [1]-[9]").."\n\n".. S("The selected item is also your wielded item."), images = {{image="doc_basics_hotbar.png"}, {image="doc_basics_hotbar_relations.png"}}, @@ -430,11 +459,11 @@ S("There are 2 minimap modes and 3 zoom levels.").."\n\n".. S("Surface mode (image 1) is a top-down view of the world, roughly resembling the colors of the blocks this world is made of. It only shows the topmost blocks, everything below is hidden, like a satellite photo. Surface mode is useful if you got lost.").."\n\n".. -S("Radar mode (image 2) is more complicated. It displays the “denseness” of the area around you and changes with your height. Roughly, the more green an area is, the less “dense” it is. Black areas have many blocks. Use the radar to find caverns, hidden areas, walls and more. The rectangular shapes in image 2 clearly expose the position of a dungeon. Radar mode is only available in Creative Mode").."\n\n".. +S("Radar mode (image 2) is more complicated. It displays the “denseness” of the area around you and changes with your height. Roughly, the more green an area is, the less “dense” it is. Black areas have many blocks. Use the radar to find caverns, hidden areas, walls and more. The rectangular shapes in image 2 clearly expose the position of a dungeon.").."\n\n".. S("There are also two different rotation modes. In “square mode”, the rotation of the minimap is fixed. If you press [Shift]+[F9] to switch to “circle mode”, the minimap will instead rotate with your looking direction, so “up” is always your looking direction.").."\n\n".. -S("In other games, the minimap may be disabled.").."\n\n".. +S("In some games, the minimap may be disabled.").."\n\n".. S("• Toggle minimap mode: [F9]").."\n".. S("• Toggle minimap rotation mode: [Shift]+[F9]"), @@ -442,7 +471,7 @@ S("• Toggle minimap rotation mode: [Shift]+[F9]"), }}) doc.add_entry("basics", "inventory", { - name="Inventory", + name=S("Inventory"), data = { text = S("Inventories are used to store item stacks. There are other uses, such as crafting. An inventory consists of a rectangular grid of item slots. Each item slot can either be empty or hold one item stack. Item stacks can be moved freely between most slots.").."\n".. @@ -454,11 +483,12 @@ S("Inventory controls:").."\n\n".. S("Taking: You can take items from an occupied slot if the cursor holds nothing.").."\n".. S("• Left click: take entire item stack").."\n".. S("• Right click: take half from the item stack (rounded up)").."\n".. -S("• Middle click: take 10 items from the item stack").."\n\n".. +S("• Middle click: take 10 items from the item stack").."\n".. +S("• Mouse wheel down: take 1 item from the item stack").."\n\n".. S("Putting: You can put items onto a slot if the cursor holds 1 or more items and the slot is either empty or contains an item stack of the same item type.").."\n".. S("• Left click: put entire item stack").."\n".. -S("• Right click: put 1 item of the item stack").."\n".. +S("• Right click or mouse wheel up: put 1 item of the item stack").."\n".. S("• Middle click: put 10 items of the item stack").."\n\n".. S("Exchanging: You can exchange items if the cursor holds 1 or more items and the destination slot is occupied by a different item type.").."\n".. @@ -474,23 +504,15 @@ S("• Sneak+Left click: Automatically transfer item stack"), doc.add_entry("advanced", "online", { name = S("Online help"), data = { text= -S("You may want to check out these online resources related to MineClone 2.").."\n\n".. +S("You may want to check out these online resources related to Minetest:").."\n\n".. -S("MineClone 2 download and forum discussion: ").."\n".. -S("Here you find the most recent version of MineClone 2 and can discuss it.").."\n\n".. +S("Official homepage of Minetest: ").."\n".. +S("The main place to find the most recent version of Minetest.").."\n\n".. -S("Bug tracker: ").."\n".. -S("Report bugs here.").."\n\n\n\n".. +S("Community wiki: ").."\n".. +S("A community-based documentation website for Minetest. Anyone with an account can edit it! It also features a documentation of Minetest Game.").."\n\n".. -S("Minetest links:").."\n".. - -S("Official homepage of Minetest: ").."\n".. -S("The main place to find the most recent version of Minetest, the engine used by MineClone 2.").."\n\n".. - -S("Community wiki: ").."\n".. -S("A community-based documentation website for Minetest. Anyone with an account can edit it.").."\n\n".. - -S("Minetest forums: ").."\n".. +S("Web forums: ").."\n".. S("A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and games are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.").."\n\n".. S("Chat: ").."\n".. @@ -516,7 +538,7 @@ doc.add_entry("basics", "glossary", { name = S("Glossary"), data = { text = -S("This is a list of commonly used terms:").."\n\n".. +S("This is a list of commonly used terms in Minetest:").."\n\n".. S("Controls:").."\n".. S("• Wielding: Holding an item in hand").."\n".. @@ -548,7 +570,7 @@ S("• Craftitem: An item which is (primarily or only) used for crafting").."\n\ S("Gameplay:").."\n".. S("• “heart”: A single health symbol, indicates 2 HP").."\n".. S("• “bubble”: A single breath symbol, indicates 1 BP").."\n".. -S("• HP: Hit point (equals a half “heart”)").."\n".. +S("• HP: Hit point (equals half 1 “heart”)").."\n".. S("• BP: Breath point, indicates breath when diving").."\n".. S("• Mob: Computer-controlled enemy").."\n".. S("• Crafting: Combining multiple items to create new ones").."\n".. @@ -571,7 +593,6 @@ S("• Protection: Mechanism to own areas of the world, which only allows the ow S("Technical terms:").."\n".. S("• Minetest: This game engine").."\n".. -S("• MineClone 2: What you play right now").."\n".. S("• Minetest Game: A game for Minetest by the Minetest developers").."\n".. S("• Game: A complete playing experience to be used in Minetest; such as a game or sandbox or similar").."\n".. S("• Mod: A single subsystem which adds or modifies functionality; is the basic building block of games and can be used to further enhance or modify them").."\n".. @@ -588,16 +609,21 @@ S("There is a large variety of settings to configure Minetest. Pretty much every S("These are a few of the most important gameplay settings:").."\n\n".. S("• Damage enabled (enable_damage): Enables the health and breath attributes for all players. If disabled, players are immortal").."\n".. -S("• Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. Changes include: Instant digging, easy access to almost all items, tools never wear off, etc.").."\n".. +S("• Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. The meaning depends on the game; usual changes are: Reduced dig times, easy access to almost all items, tools never wear off, etc.").."\n".. S("• PvP (enable_pvp): Short for “Player vs Player”. If enabled, players can deal damage to each other").."\n\n".. -S("For a full list of all available settings, use the “Advanced settings” dialog in the main menu.") +S("For a full list of all available settings, use the “All Settings” dialog in the main menu.") }}) doc.add_entry("advanced", "movement_modes", { name = S("Movement modes"), data = { text = -S("If you have the required privileges, you can use up to three special movement modes. Using these may be considered cheating.").."\n\n".. +S("You can enable some special movement modes that change how you move.").."\n\n".. + +S("Pitch movement mode:").."\n".. +S("• Description: If this mode is activated, the movement keys will move you relative to your current view pitch (vertical look angle) when you're in a liquid or in fly mode.").."\n".. +S("• Default key: [L]").."\n".. +S("• No privilege required").."\n\n".. S("Fast mode:").."\n".. S("• Description: Allows you to move much faster. Hold down the the “Use” key [E] to move faster. In the client configuration, you can further customize fast mode.").."\n".. @@ -706,7 +732,7 @@ S("Players with the “privs” privilege can modify privileges at will:").."\n\ S("• /grant : Grant to ").."\n".. S("• /revoke : Revoke from ").."\n\n".. -S("In single-player mode, you can use “/grant singleplayer all” to unlock all abilities (which is often considered cheating).") +S("In single-player mode, you can use “/grantme all” to unlock all abilities.") }}) doc.add_entry("basics", "light", { @@ -717,7 +743,7 @@ S("As the world is entirely block-based, so is the light in the world. Each bloc S("There are two types of light: Sunlight and artificial light.").."\n\n".. S("Artificial light is emitted by luminous blocks. Artificial light has a light level from 1-14.").."\n".. -S("Sunlight is the brightest light and always goes perfectly straight down from the sky at each time of the day. blocks. At night, the sunlight will become moonlight instead, which still provides a small amount of light. The light level of sunlight is 15.").."\n\n".. +S("Sunlight is the brightest light and always goes perfectly straight down from the sky at each time of the day. At night, the sunlight will become moonlight instead, which still provides a small amount of light. The light level of sunlight is 15.").."\n\n".. S("Blocks have 3 levels of transparency:").."\n\n".. @@ -735,7 +761,7 @@ S("Note that “transparency” here only means that the block is able to carry doc.add_entry("advanced", "coordinates", { name = S("Coordinates"), data = { text = -S("The 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.").."\n\n".. +S("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.").."\n\n".. S("Like this: (5, 45, -12)").."\n\n".. @@ -751,101 +777,7 @@ S("• Follow the sun, then go right: Z increases").."\n".. S("• Follow the sun, then go left: Z decreases").."\n".. S("• The side length of a full cube is 1").."\n\n".. -S("You can view your current position in the debug screen (open with [F5]). This is considered cheating in some games.") -}}) - -doc.add_entry("advanced", "creative", { - name = S("Creative Mode"), - data = { text = -S("Enabling Creative Mode in MineClone 2 applies the following changes:").."\n\n".. - -S("• You keep the things you've placed").."\n".. -S("• Creative inventory is available to obtain most items easily").."\n".. -S("• Hand breaks all default blocks instantly").."\n".. -S("• Greatly increased hand pointing range").."\n".. -S("• Mined blocks don't drop items").."\n".. -S("• Items don't get used up").."\n".. -S("• Tools don't wear off").."\n".. -S("• You can eat food whenever you want").."\n".. -S("• You can always use the minimap (including radar mode)").."\n\n".. - -S("Damage is not affected by Creative Mode, it needs to be disabled seperately.") -}}) - -doc.add_entry("basics", "mobs", { - name = S("Mobs"), - data = { text = -S("Mobs are the living beings in the world. This includes animals and monsters.").."\n\n".. - -S("Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some blocks only spawn on particular blocks (like grass blocks).").."\n\n".. - -S("Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.").."\n\n".. - -S("Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.") -}}) - -doc.add_entry("basics", "animals", { - name = S("Animals"), - data = { text = -S("Animals are peaceful beings which roam the world aimlessly. You can feed, tame and breed them.").."\n\n".. - -S("Feeding:").."\n".. -S("Each animal has its own taste for food and doesn't just accept any food. To feed, hold an item in your hand and rightclick the animal.").."\n".. -S("Animals are attraced to the food they like and follow you as long you hold the food item in hand.").."\n".. -S("Feeding an animal has three uses: Taming, healing and breeding.").."\n".. -S("Feeding heals animals instantly, depending on the quality of the food item.").."\n\n".. - -S("Taming:").."\n".. -S("A few animals can be tamed. You can generally do more things with tamed animals and use other items on them. For example, tame horses can be saddled and tame wolves fight on your side.").."\n\n".. - -S("Breeding:").."\n".. -S("When you have fed an animal up to its maximum health, then feed it again, you will activate “Love Mode” and many hearts appear around the animal.").."\n".. -S("Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.").."\n\n".. - -S("Baby animals:").."\n".. -S("Baby animals are just like their adult couterparts, but they can't be fed, tamed or bred and don't drop anything when they die. They grow to adults after a short time.") - -}}) - -doc.add_entry("basics", "hunger", { - name = S("Hunger"), - data = { text = -S("Hunger affects your health and your ability to sprint. Hunger is not in effect when damage is disabled.").."\n\n".. - -S("Core hunger rules:").."\n\n".. -S("• You start with 20/20 hunger points (more points = less hungry)").."\n".. -S("• Actions like combat, jumping, sprinting, etc. decrease hunger points").."\n".. -S("• Food restores hunger points").."\n".. -S("• If your hunger bar decreases, you're hungry").."\n".. -S("• At 18-20 hunger points, you regenerate 1 HP every 4 seconds").."\n".. -S("• At 6 hunger points or less, you can't sprint").."\n".. -S("• At 0 hunger points, you lose 1 HP every 4 seconds (down to 1 HP)").."\n".. -S("• Poisonous food decreases your health").."\n\n".. - - -S("Details:").."\n\n".. -S("You have 0-20 hunger points, indicated by 20 drumstick half-icons above the hotbar. You also have an invisible attribute: Saturation.").."\n".. -S("Hunger points reflect how full you are while saturation points reflect how long it takes until you're hungry again.").."\n\n".. - -S("Each food item increases both your hunger level as well your saturation.").."\n".. -S("Food with a high saturation boost has the advantage that it will take longer until you get hungry again.").."\n".. -S("A few food items might induce food poisoning by chance. When you're poisoned, the health and hunger symbols turn sickly green. Food poisoning drains your health by 1 HP per second, down to 1 HP. Food poisoning also drains your saturation. Food poisoning goes away after a while or when you drink milk.").."\n\n".. - -S("You start with 5 saturation points. The maximum saturation is equal to your current hunger level. So with 20 hunger points your maximum saturation is 20. What this means is that food items which restore many saturation points are more effective the more hunger points you have. This is because at low hunger levels, a lot of the saturation boost will be lost due to the low saturation cap.").."\n".. -S("If your saturation reaches 0, you're hungry and start to lose hunger points. Whenever you see the hunger bar decrease, it is a good time to eat.").."\n\n".. - -S("Saturation decreases by doing things which exhaust you (highest exhaustion first):").."\n".. -S("• Regenerating 1 HP").."\n".. -S("• Suffering food poisoning").."\n".. -S("• Sprint-jumping").."\n".. -S("• Sprinting").."\n".. -S("• Attacking").."\n".. -S("• Taking damage").."\n".. -S("• Swimming").."\n".. -S("• Jumping").."\n".. -S("• Mining a block").."\n\n".. - -S("Other actions, like walking, do not exaust you.") - +S("You can view your current position in the debug screen (open with [F5]).") }}) +dofile(minetest.get_modpath(minetest.get_current_modname()).."/mcl_extension.lua") diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr index 8a17951d6..cc02b02c4 100644 --- a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr @@ -1,34 +1,435 @@ # textdomain: mcl_doc_basics -# UNFINISHED translation! -# TODO: Add the missing strings from template.txt and complete the translation - Basics=Grundlagen -Everything you need to know about MineClone 2 to get started with playing=Alles, was Sie über MineClone 2 wissen sollten, um zu spielen +Everything you need to know about Minetest to get started with playing=Alles, was Sie über Minetest zum Spielen wissen sollten Advanced usage=Fortgeschrittenes -Advanced information about Minetest which may be nice to know, but is not crucial to gameplay=Fortgeschrittene Infos über Minetest, die nett zu wissen sind, aber nicht unbedingt kritisch für das Spiel +Advanced information about Minetest which may be nice to know, but is not crucial to gameplay=Fortgeschrittene Informationen über Minetest, die nett zu wissen sind, aber nicht kritisch für das reguläre Spiel Quick start=Schnellstart -This is a very brief introduction to the basic gameplay:=Dies ist eine sehr kurze Einleitung ins Spiel: -Basic controls:=Grundsteuerung: -• Move mouse to look=• Maus bewegen zum Umsehen +This is a very brief introduction to the basic gameplay:=Hier ist eine sehr kurze Einführung ins Spiel: +• Move mouse to look=• Mausbewegung zum Umsehen • [W], [A], [S] and [D] to move=• [W], [A], [S] und [D] zum Bewegen -• [E] to sprint=[E] zum Sprinten -• [Space] to jump or move upwards=[Leertaste] zum Springen oder Aufwärtsbewegung -• [Shift] to sneak or move downwards=• [Umschalt] zum Schleichen oder Abwärtsbewegung -• Mouse wheel or [1]-[9] to select item=Mausrad oder [1]-[9] zur Gegenstandsauswahl +• [Space] to jump or move upwards=• [Leertaste] zum Springen oder für Aufwärtsbewegung +• [Shift] to sneak or move downwards=• [Umschalt] zum Schleichen oder für Abwärtsbewegung +• Mouse wheel or [0]-[9] to select item=• Mausrad oder [0]-[9], um Gegenstand zu wählen • Left-click to mine blocks or attack=• Linksklick, um Blöcke abzubauen oder anzugreifen -• Recover from swings to deal full damage=• Warten Sie Schwünge von Angriffen ab, um vollen Schaden anzurichten +• Recover from swings to deal full damage=• Warten Sie Schwünge ganz ab, um vollen Schaden anzurichten • Right-click to build blocks and use things=• Rechtsklick, um Blöcke zu bauen und Dinge zu benutzen • [I] for the inventory=• [I] für das Inventar -• Lowest row in inventory appears in hotbar below=• Unterste Inventarzeile erscheint in Schnellleiste -• [Esc] to close this window=• [Esc], um dieses Fenster zu schließen -How to play:=Spielanleitung -• Punch a tree trunk until it breaks and collect wood=• Hauen Sie einen Baumstamm, bis er bricht und sammeln Sie Holz auf -• Place the wood into the 2×2 grid (your “crafting grid”) in your inventory menu and craft 4 wood planks=• Platzieren Sie das Holz in das 2×2-Gitter (Ihr „Fertigungsgitter) in Ihrem Inventar und fertigen Sie 4 Holzplanken -• Place them in a 2×2 shape in the crafting grid to craft a crafting table=• Platzieren Sie sie in eine 2×2-Form im Fertigungsgitter, um eine Werkbank zu errichten -• Place the crafting table on the ground=• Platzieren Sie die Werkbank auf den Boden -• Rightclick it for a 3×3 crafting grid=Rechtsklicken Sie sie für ein 3×3-Fertigungsgitter -• Use the crafting guide (book icon) to learn all the possible crafting recipes=• Benutzen Sie die Bauanleitung (Buchsymbol) um alle möglichen Fertigungsrezepte zu lernen -• Craft a wooden pickaxe so you can dig stone=• Fertigen Sie eine Holzspitzhacke, damit Sie Stein graben können -• Different tools break different kinds of blocks. Try them out!=• Verschiedene Werkzeuge können verschiedene Blöcke brechen. Probieren Sie einfach! +• First items in inventory appear in hotbar below=• Die ersten Gegenstände im Inventar tauchen in der Schnellleiste unten auf +• [F9] for the minimap=• [F9] für die Übersichtskarte +• Put items into crafting grid (usually 3×3 grid) to craft=• Legen Sie Gegenstände ins Fertigungsgitter (normalerweise 3×3-Gitter) zum Fertigen +• Use a crafting guide mod to learn crafting recipes or visit =• Benutzen Sie eine Mod mit Fertigungsführer, um die Fertigungsrezepte zu erlernen oder besuchen Sie • Read entries in this help to learn the rest=• Lesen Sie Einträge in dieser Hilfe, um den Rest zu lernen -• Continue playing as you wish. There's no goal. Have fun!=• Spielen Sie weiter, so wie sie wollen. Es gibt kein Ziel. Viel Spaß! +• [Esc] to close this window=• [Esc], um dieses Fenster zu schließen +Minetest=Minetest +Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).=Minetest ist eine freie Spiel-Engine für Spiele auf Voxelbasis, inspiriert von InfiniMiner, Minecraft, und so weiter. Minetest wurde ursprünglich erfunden von Perttu Ahola (alias „celeron55“). +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 can, however, be much more complex than this.=Der Spieler wird in eine große Welt aus Würfeln bzw. Blöcken geworfen. Aus diesen Würfeln besteht die Landschaft; sie können aufgesammelt und wieder platziert werden. Mit den aufgesammelten Gegenständen können neue Werkzeuge und andere Dinge gefertigt werden. Spiele in Minetest können aber viel komplexer sein. +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.=Ein Hauptfeature in Minetest ist die eingebaute Modding-Funktionalität. Mods ändern das bestehende Spielgeschehen ab. Sie können recht einfach sein und einfach nur ein paar dekorative Blöcke hinzufügen oder sie können sehr komplex sein, indem sie z.B. völlig neue Spielkonzepte einführen, eine ganz andere Art Welt erschaffen, und viele andere Dinge. +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 kann alleine oder online mit mehreren Spielern gespielt werden. Das Onlinespiel funktioniert mit beliebigen Mods, es muss keine Zusatzsoftware installiert werden, da die Mods komplett vom Server zur Verfügung gestellt werden. +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 wird normalerweise mit einem einfachen Standardspiel ausgeliefert, es heißt „Minetest Game“ (siehe Bilder 1 und 2). Sie haben es vielleicht schon. Andere Spiele für Minetest können von den offiziellen Minetest-Foren heruntergeladen werden. +Sneaking=Schleichen +Sneaking makes you walk slower and prevents you from falling off the edge of a block.=Schleichen verlangsamt Ihre Schritte und hindert Sie daran, vom Rand eines Blocks zu fallen. +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!=Zum Schleichen halten Sie die Schleichtaste (Standard: [Umschalt]) gedrückt. Lassen Sie sie los, um nicht mehr zu schleichen. Vorsicht: Wenn sie die Taste an einer Kante loslassen, könnten sie stürzen! +• Sneak: [Shift]=• Schleichen [Umschalt] +Sneaking only works when you stand on solid ground, are not in a liquid and don't climb.=Schleichen funktioniert nur, wenn Sie auf festem Boden stehen, sich nicht in einer Flüssigkeit befinden und nicht klettern. +Sneaking might be disabled by mods. In this case, you still walk slower by sneaking, but you will no longer be stopped at ledges.=Schleichen kann von Mods deaktiviert werden. In diesem Fall gehen Sie immer noch langsamer, aber Sie werden an Kanten nicht mehr anhalten. +Controls=Steuerung +These are the default controls:=Dies ist die Standardsteuerung: +Basic movement:=Bewegen: +• Moving the mouse around: Look around=• Mausbewegung: Umsehen +• W: Move forwards=• W: Vorwärts +• A: Move to the left=• A: Links +• D: Move to the right=• D: Rechts +• S: Move backwards=• S: Rückwärts +While standing on solid ground:=Auf festem Boden: +• Space: Jump=• Leertaste: Springen +• Shift: Sneak=• Umschalt: Schleichen +While on a ladder, swimming in a liquid or fly mode is active=An einer Leiter, beim Tauchen oder im Flugmodus: +• Space: Move up=• Leertaste: Hoch +• Shift: Move down=• Umschalt: Runter +Extended movement (requires privileges):=Erweiterte Bewegung (benötigt Privilegien): +• J: Toggle fast mode, makes you run or fly fast (requires “fast” privilege)=• J: Schnellmodus, damit laufen oder fliegen Sie schneller (benötigt das „fast“-Privileg) +• K: Toggle fly mode, makes you move freely in all directions (requires “fly” privilege)=• K: Flugmodus, damit fliegen Sie frei in alle Richtungen (benötigt das „fly“-Privileg) +• H: Toggle noclip mode, makes you go through walls in fly mode (requires “noclip” privilege)=• H: Geistmodus, damit fliegen durch Wände im Flugmodus (benötigt das „noclip“-Privileg) +• E: Walk fast in fast mode=• E: Schnell im Schnellmodus gehen +World interaction:=Weltinteraktion: +• Left mouse button: Punch / mine blocks=• Linke Maustaste: Schlagen / Blöcke abbauen +• Right mouse button: Build or use pointed block=• Rechte Maustaste: Bauen oder gezeigten Block benutzen +• Shift+Right mouse button: Build=• Umschalt+Rechte Maustaste: Bauen +• Roll mouse wheel / B / N: Select next/previous item in hotbar=• Mausrad drehen / B / N: Nächten/vorherigen Gegenstand in Schnellleiste wählen +• 0-9: Select item in hotbar directly=• 0-9: Gegenstand in Schnellleiste direkt wählen +• Q: Drop item stack=• Q: Gegenstandsstapel wegwerfen +• Shift+Q: Drop 1 item=• Umschalt+Q: 1 Gegenstand wegwerfen +• I: Show/hide inventory menu=• I: Inventarmenü zeigen/verbergen +Inventory interaction:=Inventarinteraktion: +See the entry “Basics > Inventory”.=Siehe Eintrag „Grundlagen > Inventar“. +Camera:=Kamera: +• Z: Zoom=• Z: Zoom +• F7: Toggle camera mode=• F7: Kameramodus wechseln +• F8: Toggle cinematic mode=• F8: Kinomodus umschalten +Interface:=Benutzeroberfläche: +• Esc: Open menu window (pauses in single-player mode) or close window=• Esc: Menüfenster öffnen (pausiert im Einzelspielermodus) oder Fenster schließen +• F1: Show/hide HUD=• F1: Oberfläche zeigen/verbergen +• F2: Show/hide chat=• F2: Chat zeigen/verbergen +• F9: Toggle minimap=• F9: Übersichtskarte umschalten +• Shift+F9: Toggle minimap rotation mode=• Umschalt+F9: Rotationsmodus der Übersichtskarte wechseln +• F10: Open/close console/chat log=• F10: Konsole/Chatprotokoll öffnen/schließen +• F12: Take a screenshot=• Bildschirmfoto machen +Server interaction:=Serverinteraktion: +• T: Open chat window (chat requires the “shout” privilege)=• T: Chatfenster öffnen (Chat benötigt das „shout“-Privileg) +• /: Start issuing a server command=• Einen Serverbefehl eingeben +Technical:=Technisches: +• R: Toggle far view (disables all fog and allows viewing far away, can make game very slow)=• Weite Sicht (deaktiviert Nebel und erlaubt sehr weite Sicht, kann das Spiel enorm verlangsamen) +• +: Increase minimal viewing distance=• +: Minimale Sichtweite erhöhen +• -: Decrease minimal viewing distance=• -: Minimale Sichtweite verringern +• F3: Enable/disable fog=• F3: Nebel umschalten +• F5: Enable/disable debug screen which also shows your coordinates=• F5: Debug-Anzeige umschalten, was auch Ihre Koordinaten anzeigt +• F6: Only useful for developers. Enables/disables profiler=• F6: Nur nützlich für Entwickler. Schaltet die Profiler-Anzeige um +Players=Spieler +Players (actually: “player characters”) are the characters which users control.=Spieler (genauer: „Spielerfiguren“) sind die Figuren, die die Benutzer steuern. +Players are living beings. They start with a number of health points (HP) and a number of breath points (BP).=Spieler sind Lebewesen. Sie starten mit ein paar Trefferpunkten (TP) und ein paar Atempunkten (AP). +Players are capable of walking, sneaking, jumping, climbing, swimming, diving, mining, building, fighting and using tools and blocks.=Spieler können gehen, schleichen, springen, klettern, tauchen, graben, bauen, kämpfen und Werkzeuge und Blöcke benutzen. +At a health of 0, the player dies. The player can just respawn in the world.=Fällt die Gesundheit auf 0, stirbt der Spieler. Der Spieler kann in der Welt einfach wieder einsteigen. +Other consequences of death depend on the game. The player could lose all items, or lose the round in a competitive game.=Andere Konsequenzen des Todes hängen vom Spiel ab. Der Spieler könnte seinen Besitz verlieren oder eine Runde in einem Wettbewerb verlieren. +Some blocks reduce breath. While being with the head in a block which causes drowning, the breath points are reduced by 1 for every 2 seconds. When all breath is gone, the player starts to suffer drowning damage. Breath is quickly restored in any other block.=Einige Blöcke reduzieren den Atem. In einem Block, der den Atem reduziert, werden die Atempunkte um 1 alle 2 Sekunden reduziert. Wenn der Atem verbraucht ist, erleidet der Spieler Schaden durch Ertrinken. Der Atem wird in jedem anderen Block rasch wiederhergestellt. +Damage can be disabled on any world. Without damage, players are immortal and health and breath are unimportant.=Schaden kann in jeder Welt ausgeschaltet werden. Ohne Schaden sind Spieler unsterblich und Gesundheit und Atem spielen keine Rolle. +In multi-player mode, the name of other players is written above their head.=Im Mehrspielermodus steht der Name anderer Spieler über dem Kopf. +Items=Gegenstände +Items are things you can carry along and store in inventories. They can be used for crafting, smelting, building, mining, and more. Types of items include blocks, tools, weapons and items only used for crafting.=Gegenstände sind Dinge, die sie tragen und in Inventaren aufbewahren können. Sie können für die Fertigung, zum Schmelzen, Bauen, Graben und mehr verwendet werden. Zu Gegenständen zählen Blöcke, Werkzeuge und Gegenstände, die nur in der Fertigung benutzt werden. +An item stack is a collection of items of the same type which fits into a single item slot. Item stacks can be dropped on the ground. Items which drop into the same coordinates will form an item stack.=Ein Gegenstandsstapel ist eine Sammlung von gleichen Gegenständen, die in einem Inventarplatz passen. Gegenstandsstapel können auf den Boden geworfen werden. Gegenstände, die auf die gleichen Koordinaten fallen, bilden einen Gegenstandsstapel. +A dropped item stack can be collected by punching it.=Ein fallen gelassener Gegenstandsstapel kann aufgesammelt werden, indem er geschlagen wird. +Tools=Werkzeuge +Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.=Einige Gegenstände können als Werkzeug fungieren, wenn man sie hält. Als Werkzeug zählt jeder Gegenstand, der einen besonderen Zweck hat, der direkt vom Träger ausgelöst werden kann. +A common tool in Minetest are, of course, mining tools. These are important to break all kinds of blocks. Weapons are a kind of tool in Minetest. There are of course many other possible tools. Special actions of tools are usually done by left-click or right-click.=Eine häufige Werkzeugart in Minetest sind Grabewerkzeuge. Sie sind wichtig zum Abbauen aller möglichen Blöcke. Waffen sind eine Art Werkzeug in Minetest. Es gibt natürlich viele weitere Werkzeuge. Sonderaktionen von Werkzeugen weden normalerweise mit Links- oder Rechtsklick ausgelöst. +When nothing is wielded, players use their hand which may act as tool and weapon.=Wird nichts gehalten, benutzen die Spieler ihre Hand, die als Werkzeug und Waffe herhalten kann. +Many tools will wear off when using them and may eventually get destroyed. The damage is displayed in a damage bar below the tool icon. If no damage bar is shown, the tool is in mint condition. Tools may be repairable by crafting, see “Basics > Crafting”.=Viele Werkzeuge werden sich bei Benutzung abnutzen und zerbrechen früher oder später. Der Schaden wird in einer Schadensleiste unter dem Werkzeugsymbol angezeigt. Ohne diese Leiste ist das Werkzeug wie neu. Werkzeuge kann man eventuell mit einer Fertigung reparieren. +Weapons=Waffen +Some items are usable as a melee weapon when wielded. Weapons share most of the properties of tools.=Einige Gegenstände sind als Nahkampfwaffen zu gebrauchen. Waffen teilen die meisten Eigenschaften mit Werkzeugen. +Melee weapons deal damage by punching players and other animate objects. There are two ways to attack:=Nahkampfwaffen richten Schaden an, indem Spieler und andere aktive Objekte geschlagen werden. +• Single punch: Left-click once to deal a single punch=• Einzelner Schlag: Einmal links klicken +• Quick punching: Hold down the left mouse button to deal quick repeated punches=• Schneller Schlag: Linke Maustaste gedrückt halten, um schnelle wiederholte Schläge zu machen +There are two core attributes of melee weapons:=Nahkampfwaffen haben zwei Hauptattribute: +• Maximum damage: Damage which is dealt after a hit when the weapon was fully recovered=• Höchstschaden: Schaden, der angerichtet wird, wenn die Waffe voll ausgeholt ist +• Full punch interval: Time it takes for fully recovering from a punch=• Vollschlagintervall: Zeit, die es braucht, um die Waffe nach einem Schlag wieder stabil zu halten +A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.=Eine Waffe macht nur den vollen Schaden, wenn sie voll ausgeholt ist, d.h. der letzte Schlag war lange genug her. Sonst macht die Waffe nur reduzierten Schaden. Das bedeutet, dass schnelle Schläge wirklich sehr schnell sind, aber geringen Schaden anrichten. Beachten Sie, dass das Vollschlagintervall nicht begrenzt, wie schnell Sie angreifen können. +There is a rule which sometimes makes attacks impossible: Players, animate objects and weapons belong to damage groups. A weapon only deals damage to those who share at least one damage group with it. So if you're using the wrong weapon, you might not deal any damage at all.=Es gibt eine Regel, die es manchmal unmöglich macht, Schaden anzurichten. Spieler, lebendige Objekte und Waffen gehören Schadensgruppen an. Eine Waffe macht nur Schaden auf Sachen, mit denen sie mindestens eine Schadensgruppe teilt. Wenn Sie also die falsche Waffe benutzen, können sie überhaupt keinen Schaden machen. +Pointing=Zeigen +“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, dropped items, players, computer enemies and objects.=„Zeigen“ bedeutet, dass man auf etwas mit dem Fadenkreuz in Reichweite schaut. Zeigen wird für die Interaktion benutzt, wie Graben, Schlagen, usw. Zu zeigbare Dingen gehören Blöcke, fallen gelassene Gegenstände, Spieler, computergesteuerte Feinde und Objekte. +To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.=Um auf etwas zu zeigen, muss es sich in der Zeigereichweite (kurz „Reichweite“) Ihres gehaltenen Gegenstands befinden. Es gibt eine Standardreichweite, wenn Sie nichts halten. Ein gezeigtes Ding wird umrandet oder hervorgehoben (abhängig von Ihren Einstellungen). Zeigen ist nicht möglich mit der Dritten-Person-Vorderkamera. +A few things can not be pointed. Most blocks are pointable. A few blocks, like air, can never be pointed. Other blocks, like liquids can only be pointed by special items.=Ein paar Dinge können nicht gezeigt werden. Die meisten Blöcke sind zeigbar. Ein paar Blöcke, wie Luft, können niemals gezeigt werden. Andere Blöcke, wie Flüssigkeiten können nur von besonderen Gegenständen gezeigt werden. +Camera=Kamera +You can change the camera mode by pressing [F7].=Sie wechseln den Kameramodus mit [F7]. +You might be able to zoom with [Z] to zoom the view at the crosshair. This allows you to look further.=Sie sind eventuell in der Lage, mit [Z] zum Fadenkreuz hereinzuzoomen. Damit können Sie weiter sehen. +Zooming is a gameplay feature that might be enabled or disabled by the game. By default, zooming is enabled when in Creative Mode but disabled otherwise.=Zoomen ist eine Spielfunktion, die vom Spiel ein- oder ausgeschaltet werden kann. Standardmäßig ist das Zoomen im Kreativmodus erlaubt, aber sonst deaktiviert. +• Switch camera mode: [F7]=• Kameramodus wechseln: [F7] +• Zoom: [Z]=• Zoom: [Z] +Blocks=Blöcke +The world of Minetest is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.=Die Welt von Minetest besteht aus Blöcken (oder Voxeln, um genau zu sein). Blöcke können mit den richtigen Werkzeugen gebaut oder entfernt werden. +Blocks can have a wide range of different properties which determine mining times, behavior, looks, shape, and much more. Their properties include:=Blöcke haben eine Reihe an verschiedenen Eigenschaften, die die Abbauzeit, ihr Verhalten, Aussehen, Form und vieles mehr beeinflussen. Zu ihren Eigenschaften zählen: +• Collidable: Collidable blocks can not be passed through; players can walk on them. Non-collidable blocks can be passed through freely=• Kollisionsfähig: Kollisionsfähige Blöcke können nicht passiert werden, Spieler können auf ihnen gehen. Nicht kollisionsfähige Blöcke können frei passiert werden +• Pointable: Pointable blocks show a wireframe or a halo box when pointed. But you will just point through non-pointable blocks. Liquids are usually non-pointable but they can be pointed at by some special tools=• Zeigbar: Zeigbare Blöcke zeigen ein Drahtmodell oder eine scheinende Box, wenn sie gezeigt werden. Aber durch nicht-zeigbare Blöcke werden Sie hindurch zeigen. Flüssigkeiten sind üblicherweise nicht-zeigbar, aber mit besonderen Werkzeugen können sie gezeigt werden. +• Mining properties: By which tools it can be mined, how fast and how much it wears off tools=• Grabeeigenschaften: Von welchen Werkzeugen es abgebaut werden kann, wie schnell und wie stark es Werkzeuge abnutzt +• Climbable: While you are at a climbable block, you won't fall and you can move up and down with the jump and sneak keys=• Kletterbar: Wenn Sie sich an einem kletterbaren Block befinden, werden Sie nicht fallen und Sie können sich mit den Sprung- und Schleichtasten auf- und ab bewegen +• Drowning damage: See the entry “Basics > Player”=• Ertrinkenssschaden: Siehe „Grundlagen > Spieler“ +• Liquids: See the entry “Basics > Liquids”=• Flüssigkeiten: Siehe „Grundlagen > Flüssigkeiten“ +• Group memberships: Group memberships are used to determine mining properties, crafting, interactions between blocks and more=• Gruppenmitgliedschaften: Gruppenmitgliedschaften werden benutzt, um Grabeeigenschaften, Fertigungen, Interaktionen zwischen Blöcken und mehr festzulegen +Mining=Abbauen +Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.=Das Abbauen (oder Ausgraben) ist der Prozess, in dem Blöcke abgebrochen werden, um sie zu entfernen. Um einen Block abzubauen, zeigen Sie auf ihn und halten Sie die linke Maustaste, bis er bricht. +Short explanation:=Kurzerklärung: +Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in toughness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining go straight into your inventory.=Blöcke benötigen ein Grabewerkzeug, um abgebaut werden zu können. Andere Blöcke werden von anderen Grabewerkzeugen abgebaut, und einige Blöcke können überhaupt nicht abgebaut werden. Blöcke unterscheiden sich in ihrer Härte und Werkzeuge unterscheiden sich in ihrer Stärke. Grabewerkzeuge werden sich allmählich abnutzen. Die Abbauzeit und Abnutzung hängen vom Block und dem Grabewerkzeug ab. Die schnellste Methode, um herauszufinden, wie effizient Ihre Grabewerkzeuge sind, ist es, sie einfach an verschiedenen Blöcken auszuprobieren. Gegenstände, die Sie vom Abbauen erhalten, werden direkt in Ihr Inventar befördert. +Detailed explanation:=Detaillierte Erklärung: +Mineable blocks have mining properties (based on groups) and a toughness level. Mining tools have the same properties. Each mining property of a block also has a rating, while tools can be able to break blocks within a range of ratings.=Abbaubare Blöcke haben Abbaueigenschaften (basierend auf Gruppen) und einen Härtegrad. Grabewerkzeuge haben die gleichen Eigenschaften. Jede Abbaueigenschaft eines Blocks hat auch eine Wertung; Werkzeuge hingegen können fähig sein, Blöcke mit einer Reihe von Wertungen abzubauen. +In order to mine a block, these conditions need to be met:=Um einen Block abbauen zu können, müssen diese Bedingungen erfüllt sein: +• The block and tool share at least one mining property for which they have a matching rating=• Der Block und das Werkzeug haben mindestens eine gemeinsame Abbaueigenschaft, für die sie eine gleiche Wertung haben +• The tool's toughness level is equal or greater than the block's toughness level=• Der Härtegrad des Werkzeugs ist größer oder gleich dem Härtegrad des Blocks +Example: A block with the mining property “cracky”, rating 3 and toughness level 0 can only be broken by a tool which is able to break “cracky” blocks at rating 3 and it must have a toughness level of 0 or larger.=Beispiel: Ein Block mit der Abbaueigenschaft „cracky“, Wertung 3 und Härtegrad 0 kann nur von einem Werkzeug, der Blöcke mit Eigenschaft „cracky“ bei Wertung 3 bricht, und er muss einen Härtegrad von 0 oder größer haben. +The time it takes to mine a block depends on the ratings and the toughness levels of both tool and block.=Die Zeit, die gebraucht wird, um einen Block abzubauen, hängt von den Wertungen und dem Härtegrad von sowohl dem Werkzeug als auch dem Block ab. +• The base mining time depends on the ratings of the block and the mining speed of the tool=• Die Grund-Abbauzeit hängt von den Wertungen des Blocks und der Grabegeschwindigkeit des Werkzeugs ab +• The mining speed of the tool differs for each mining property and its rating=• Die Grabezeit der Werkzeug unterscheidet sich für jede Abbaueigenschaft und ihrer Wertung +• The toughness level further modifies the mining speed for this mining property=• Der Härtegrad modifiziert die Abbaugeschwindigkeit für diese Abbaueigenschaft noch weiter +• A high difference in toughness levels decreases the mining time considerably=• Eine hohe Differenz in Härtegraden verringert die Abbauzeit beträchtlich +• If the toughness level difference is 2, the mining time is half of the base mining time=• Wenn der Härtegrad 2 ist, wird die Abbauzeit die Hälfte der Grundabbauzeit sein +• With a difference of 3, the mining time is a third, and so on=• Mit einer Differenz von 3 ist die Abbauzeit ein Drittel, und so weiter +The item help shows the mining times of a tool listed by its mining properties and its ratings. The mining times are often expressed as a range. The low number stands for the mining time for toughness level 0 and the high number for the highest level the tool can mine.=Die Gegenstandshilfe zeigt die Abbauzeiten eines Werkzeuges unterteilt nach seinen Abbaueigenschaften und -wertungen. Die Abbauzeiten werden oft als Intervall angegeben. Die niedrige Zahl steht für die Abbauzeit mit Härtegrad 0 und die hohe Zahl für den höchstmöglichen Härtegrad, der vom Werkzeug abgebaut werden kann. +Mining usually wears off tools. Each time you mine a block, your tool takes some damage until it is destroyed eventually. The wear per mined block is determined by the difference between the tool's toughness level and the block's toughness level. The higher the difference, the lower the wear. This means:=Abbauen nutzt Werkzeuge üblicherweise ab. Jedes mal, wenn Sie einen Block abbauen, nimmt Ihr Werkzeug etwas Schaden, bis es zerstört ist. Die Abnutzung pro abgebautem Block hängt ab von der Differenz zwischen dem Härtegrad des Werkzeugs und dem Härtegrad des Blocks. Je größer die Differenz, desto niedriger die Abnutzung. Das bedeutet: +• High-level blocks wear off your tools faster=• Blöcke mit hohem Härtegrad nutzen Ihre Werkzeuge schneller ab +• You can use high-level tools to compensate this=• Sie können hochgradige Werkzeuge benutzen, um dies zu kompensieren +• The highest wear is caused when the level of both tool and block are equal=• Die höchste Abnutzung tritt ein, wenn der Härtegrad von Werkzeug und Block gleich sind +After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:=Nach dem Abbauen kann ein Block etwas abwerfen. Das sind ein paar Gegenstände, die Sie nach dem Abbauen erhalten können. Üblicherweise erhalten Sie den Block selbst. Es gibt andere Möglichkeiten für einen Abwurf, der vom Blocktyp abhängt. Die folgenden Abwürfe sind möglich: +• Always drops itself (the usual case)=• Wirft nur sich selbst ab (der Normalfall) +• Always drops the same items=• Wirft immer die gleichen Gegenstände ab +• Drops items based on probability=• Wirft Gegenstände mit einer bestimmten Wahrscheinlichkeit ab +• Drops nothing=• Wirft nichts ab +The drop goes directly into your inventory, unless there's no more space left. In that case, the items literally drop on the floor.=Der Abwurf landet direkt in Iherem Inventar, außer, es gibt keinen Platz mehr. In diesem Fall fallen die Gegenstände zu Boden. +Building=Bauen +Almost all blocks can be built (or placed). Building is very simple and has no delay.=Fast alle Blöcke können gebaut (oder platziert) werden. Bauen ist sehr einfach und hat keine Verzögerung. +To build your wielded block, point at a block in the world and right-click. If this is not possible because the pointed block has a special right-click action, hold down the sneak key before right-clicking.=Um den gehaltenen Block zu bauen, zeigen Sie auf einen Block in der Welt und machen Sie einen Rechtsklick. Wenn dies nicht möglich ist, weil der Block eine besondere Rechtsklick-Aktion hat, halten Sie zusätzlich die Schleichen-Taste gedrückt. +Blocks can almost always be built at pointable blocks. One exception are blocks attached to the floor; these can only be built on the floor.=Blöcke können fast immer an zeigbaren Blöcken gebaut werden. Eine Ausnahme sind Blöcke, die am Boden befestigt sind; diese können nur auf dem Boden gebaut werden. +Normally, blocks are built in front of the pointed side of the pointed block. A few blocks are different: When you try to build at them, they are replaced.=Normalerweise werden Blöcke vor der gezeigten Seite des gezeigten Blocks gebaut. Ein paar Blöcke sind anders: Wenn Sie an sie anbauen, werden sie ersetzt. +Liquids=Flüssigkeiten +Liquids are special dynamic blocks. Liquids like to spread and flow to their surrounding blocks. Players can swim and drown in them.=Flüssigkeiten sind besondere dynamische Blöcke. Flüssigkeiten neigen dazu, sich auszubreiten und zu ihren Nachbarblöcken zu fließen. Spieler können in Flüssigkeiten schwimmen und ertrinken. +Liquids usually come in two forms: In source form (S) and in flowing form (F).=Flüssigkeiten gibt es normalerweise in zwei Formen: Quelle (S) und fließend (F). +Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. As long it is left alone, a liquid source will normally keep its place and does not drain out.=Flüssigkeitsquellen nehmen die Form eines ganzen Würfels an. Eine Flüssigkeitsquelle wird um sich herum fließende Flüssigkeitsquellen erzeugen und, falls die Flüssigkeit erneuerbar ist, auch Flüssigkeitsquellen erzeugen. Eine Flüssigkeitsquelle erhält sich selbst. Solange nichts passiert, wird eine Flüssigkeitsquelle normalerweise ihren Platz behalten und nicht austrocknen. +Flowing liquids take a sloped form. Flowing liquids spread around the world until they drain. A flowing liquid can not sustain itself and always comes from a liquid source, either directly or indirectly. Without a liquid source, a flowing liquid will eventually drain out and disappear.=Fließende Flüssigkeiten nehmen eine schräge Form an. Fließende Flüssigkeiten breiten sich in der Welt aus, bis sie austrocknen. Eine fließende Flüssigkeit kann sich nicht selbst erhalten und kommt immer aus einer Flüssigkeitsquelle, entweder direkt oder indirekt. Ohne einer Flüssigkeitsquelle wird eine fließende Flüssigkeit irgendwann austrocknen und verschwinden. +All liquids share the following properties:=Alle Flüssigkeiten teilen die folgenden Eigenschaften: +• All properties of blocks (including drowning damage)=• Alle Eigenschaften von Blöcken (inklusive Ertrinkensschaden) +• Renewability: Renewable liquids can create new sources=• Erneuerbarkeit: Erneuerbare Flüssigkeiten können neue Quellen erschaffen +• Flowing range: How many flowing liquids are created at maximum per liquid source, it determines how far the liquid will spread. Possible are ranges from 0 to 8. At 0, no flowing liquids will be created. Image 5 shows a liquid of flowing range 2=• Fließreichweite: Wie viele fließende Flüssigkeiten maximal je Flüssigkeitsquelle erschaffen werden; das bestimmt, wie weit die Flüssigkeit fließen wird. Mögliche Reichweiten sind zwischen 0 bis 8. Bei 0 werden keine fließenden Flüssigkeiten erzeugt. Bild 5 zeigt eine Flüssigkeit mit einer Fließreichweite von 2. +• Viscosity: How slow players move through it and how slow the liquid spreads=• Zähflüssigkeit: Wie langsam sich Spieler durch sie bewegen und wie langsam sich die Flüssigkeit ausbreitet +When those criteria are met, the open space is filled with a new liquid source of the same type (image 3).=Wenn diese Eigenschaften zutreffen, wird der freie Raum mit einer neuen Flüssigkeitsquelle des selben Typs gefüllt (Bild 3). +Swimming in a liquid is fairly straightforward: The usual direction keys for basic movement, the jump key for rising and the sneak key for sinking.=Schwimmen in einer Flüssigkeit ist einfach: Die normale Richtungstasten für die Grundbewegung, Sprungtaste und Schleichen für Auf- und Abbewegungen. +The physics for swimming and diving in a liquid are:=Die Schwimmphysik: +• The higher the viscosity, the slower you move=• Je höher die Zähflüssigkeit, desto langsamer bewegen Sie sich +• If you rest, you'll slowly sink=• Wenn Sie ruhen, sinken sie langsam +• There is no fall damage for falling into a liquid as such=• Es gibt keinen Fallschaden für das Eintauchen in einer Flüssigkeit als solche +• If you fall into a liquid, you will be slowed down on impact (but don't stop instantly). Your impact depth is determined by your speed and the liquid viscosity. For a safe high drop into a liquid, make sure there is enough liquid above the ground, otherwise you might hit the ground and take fall damage=• Wenn Sie in eine Flüssigkeit stürzen, werden Sie bei Kontakt verlangsamt (aber Sie halten nicht sofort an). Ihre Falltiefe hängt von Ihrer Geschwindigkeit und der Zähflüssigkeit ab. Für einen sicheren hohen Sturz in eine Flüssigkeit, stellen Sie sicher, dass genug Flüssigkeit über dem Boden ist, sonst könnten Sie auf den Boden aufschlagen und Fallschaden nehmen. +Liquids are often not pointable. But some special items are able to point all liquids.=Flüssigkeiten sind generell nicht zeigbar. Aber ein paar besondere Werkzeuge können auf alle Flüssigkeiten zeigen. +Crafting=Fertigung +Crafting is the task of combining several items to form a new item.=Fertigen ist die Tätigkeit, in der man mehrere Gegenstände kombiniert, um einen neuen zu erhalten. +To craft something, you need one or more items, a crafting grid (C) and a crafting recipe. A crafting grid is like a normal inventory which can also be used for crafting. Items need to be put in a certain pattern into the crafting grid. Next to the crafting grid is an output slot (O). Here the result will appear when you placed items correctly. This is just a preview, not the actual item. Crafting grids can come in different sizes which limits the possible recipes you can craft.=Um etwas zu fertigen, brauchen Sie einen oder mehrere Gegenstände, ein Fertigungsgitter (C) und ein Fertigungsrezept. Ein Fertigungsgitter ist wie ein normales Inventar, welches auch zum Fertigen benutzt werden kann. Gegenstände müssen in ein bestimmtes Muster in das Fertigungsgitter platziert werden. Neben dem Fertigungsgitter befindet sich ein Ausgabeplatz (O). Hier wird das Ergebnis auftauchen, wenn Sie die Gegenstände korrekt platziert haben. Das ist nur eine Vorschau, nicht der richtige Gegenstand. Fertigungsgitter können in verschiedenen Größen daher kommen, was die möglichen Rezepte begrenzt. +To complete the craft, take the result item from the output slot, which will consume items from the crafting grid and creates a new item. It is not possible to place items into the output slot.=Um die Fertigung abzuschließen, nehmen Sie sich das Ergebnis vom Ausgabeplatz, was die Gegenstände aus dem Fertigungsgitter verbrauchen und einen neuen Gegenstand erschaffen wird. Es ist nicht möglich, Gegenstände in den Ausgabeplatz zu platzieren. +A description on how to craft an item is called a “crafting recipe”. You need this knowledge to craft. There are multiple ways to learn crafting recipes. One way is by using a crafting guide, which contains a list of available crafting recipes. Some games provide crafting guides. There are also some mods which you can download online for installing a crafting guide. Another way is by reading the online manual of the game (if one is available).=Eine Beschreibung, wie man einen Gegenstand fertigt, nennt man „Fertigungsrezept“. Sie brauchen dieses Wissen, um etwas zu fertigen. Es gibt mehrere Möglichkeiten, Fertigungsrezepte zu lernen. Eine Möglichkeit ist es, einen Fertigungsführer zu benutzen, er enthält eine Liste von verfügbaren Fertigungsrezepten. Einige Spiele bieten Fertigungsführer an. Es gibt auch ein paar Mods, die Sie online herunterladen können, um einen Fertigungsführer zu installieren. Ansonsten können Sie die Online-Anleitung des Spieles lesen (wenn es eine gibt). +Crafting recipes consist of at least one input item and exactly one stack of output items. When performing a single craft, it will consume exactly one item from each stack of the crafting grid, unless the crafting recipe defines replacements.=Fertigungsrezepte bestehen aus mindestens einem Eingabegegenstand und genau einem Stapel von Ausgabegegenständen. Beim Vornehmen einer einzelnen Fertigung wird es genau einen Gegenstand von jedem Stapel im Fertigungsgitter verbrauchen, außer, wenn das Fertigungsrezept Ersätze definiert. +In some crafting recipes, some input items do not need to be a concrete item, instead they need to be a member of a group (see “Basics > Groups”). These recipes offer a bit more freedom in the input items. Images 6-8 show the same group-based recipe. Here, 8 items of the “stone” group are required, which is true for all of the shown items.=In einigen Fertigungsrezepten brauchen ein paar Eingabegegenstände keine konkreten Gegenstände zu sein, sie müssen stattdessen nur Mitglied einer Gruppe sein (siehe „Grundlagen > Gruppen“). Diese Rezepte bieten etwas mehr Freiheit bei der Wahl der Eingabegegenstände. Bilder 6-8 zeigen das gleiche gruppenbasierte Rezept. Hier werden 8 Gegenstände der „Stein“-Gruppe benötigt, was der Fall für alle gezeigten Gegenstände ist. +Rarely, crafting recipes have replacements. This means, whenever you perform a craft, some items in the crafting grid will not be consumed, but instead will be replaced by another item.=Selten können Fertigungsrezepte Ersätze haben. Das bedeutet, wenn Sie eine Fertigung vornehmen, werden einige Gegenstände im Fertigungsgitter nicht verbraucht, sondern durch einen anderen Gegenstand ersetzt. +Cooking=Kochen +Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a special block (like a furnace), an cookable item, a fuel item and time in order to yield a new item.=Kochen (bzw. Schmelzen) ist eine Art Fertigung, die ohne Fertigungsgitter auskommt. Kochen wird mit einem besonderem Block vorgenommen (wie einem Ofen), einen kochbaren Gegenstand, einem Brennstoff und Zeit, um einen neuen Gegenstand zu erhalten. +Each fuel item has a burning time. This is the time a single item of the fuel keeps a furnace burning.=Jeder Brennstoff hat eine Brennzeit. Das ist die Zeit, die ein einzelner Gegenstand des Brennstoffs den Ofen brennen lässt. +Each cookable item requires time to be cooked. This time is specific to the item type and the item must be “on fire” for the whole cooking time to actually yield the result.=Jeder kochbare Gegenstand braucht Zeit, um gekocht zu werden. Diese Zeit hängt vom Gegenstandstyp ab und der Gegenstand muss für die gesamte Kochzeit „im Feuer“ sein, um tatsächlich gekocht zu werden. +Hotbar=Schnellleiste +At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the first items from your player inventory.=Unten sehen Sie ein paar Quadrate. Dies ist die „Schnellleiste“. Die Schnellleiste ermöglicht es Ihnen, schnell auf die ersten Gegenstände Ihres Spielerinventars zuzugreifen. +You can change the selected item with the mouse wheel or the keyboard.=Sie können die gewählten Gegenstände mit dem Mausrad oder der Tastatur wechseln. +• Select previous item in hotbar: [Mouse wheel up] or [B]=• Vorherigen Gegenstand in Schnellleiste wählen: [Mausrad rauf] oder [B] +• Select next item in hotbar: [Mouse wheel down] or [N]=• Vorherigen Gegenstand in Schnellleiste wählen: [Mausrad runter] oder [N] +• Select item in hotbar directly: [0]-[9]=• Gegenstand direkt in Schnellleiste wählen: [0]-[9] +The selected item is also your wielded item.=Der gewählte Gegenstand ist auch Ihr gehaltener Gegenstand. +Minimap=Übersichtskarte +Press [F9] to make a minimap appear on the top right. The minimap helps you to find your way around the world. Press it again to select different minimap modes and zoom levels. The minimap also shows the positions of other players.=Drücken Sie [F9], um eine Übersichtskarte rechts oben erscheinen zu lassen. Die Übersichtskarte hilft Ihnen, sich in der Welt zu orientieren. +There are 2 minimap modes and 3 zoom levels.=Es gibt 2 Modi und 3 Zoom-Stufen. +Surface mode (image 1) is a top-down view of the world, roughly resembling the colors of the blocks this world is made of. It only shows the topmost blocks, everything below is hidden, like a satellite photo. Surface mode is useful if you got lost.=Der Bodenmodus (Bild 1) ist eine Draufsicht auf die Welt, er zeigt grob die Farben der Blöcke, aus denen die Welt besteht. Er zeigt nur die obersten Blöcke, alles unter ihnen ist verborgen, wie bei einem Satellitenfoto. Der Bodenmodus ist nützlich, wenn Sie sich verlaufen haben. +Radar mode (image 2) is more complicated. It displays the “denseness” of the area around you and changes with your height. Roughly, the more green an area is, the less “dense” it is. Black areas have many blocks. Use the radar to find caverns, hidden areas, walls and more. The rectangular shapes in image 2 clearly expose the position of a dungeon.=Der Radarmodus (Bild 2) ist etwas komplizierter. Er zeigt die „Dichte“ des Gebiets um Sie herum an und ändert sich mit Ihrer Höhe. Grob gesagt, je grüner ein Gebiet ist, desto „weniger dicht“ ist es. Schwarze Gebiete haben viele Blöcke. Benutzen Sie das Radar, um Höhlen, verborgene Gebiete, Wände und mehr zu finden. Die rechteckigen Formen in Bild 2 verraten deutlich den Ort eines Kerkers. +There are also two different rotation modes. In “square mode”, the rotation of the minimap is fixed. If you press [Shift]+[F9] to switch to “circle mode”, the minimap will instead rotate with your looking direction, so “up” is always your looking direction.=Es gibt auch zwei unterschiedliche Rotationsmodi. Im „Quadratsmodus“ ist die Rotation der Übersichtskarte fest. Drücken Sie [Umschalt]+[F9], um zum „Kreismodus“ zu wechseln, in dem sich die Karte mit Ihrer Blickrichtung dreht, also ist „oben“ immer in Ihrer Blickrichtung. +In some games, the minimap may be disabled.=In einigen Spielen kann die Übersichtskarte deaktiviert sein. +• Toggle minimap mode: [F9]=• Übersichtskartenmodus ändern: [F9] +• Toggle minimap rotation mode: [Shift]+[F9]=• Rotationsmodus der Übersichtskarte ändern: [Umschalt]+[F9] +Inventory=Inventar +Inventories are used to store item stacks. There are other uses, such as crafting. An inventory consists of a rectangular grid of item slots. Each item slot can either be empty or hold one item stack. Item stacks can be moved freely between most slots.=Inventare werden benutzt, um Gegenstandsstapel aufzubewahren. Es gibt andere Verwendungszwecke, wie die Fertigung. Ein Inventar besteht aus einem rechteckigem Raster aus Gegenstandsplätzen. Jeder Gegenstandsplatz kann entweder leer sein, oder einen Gegenstandsstapel enthalten. Gegenstandsstapel können frei zwischen den meisten Plätzen bewegt weren. +You have your own inventory which is called your “player inventory”, you can open it with the inventory key (default: [I]). The first inventory slots are also used as slots in your hotbar.=Sie haben Ihr eigenes Inventar, das „Spielerinventar“, Sie können es mit Ihrer Inventartaste (Standard: [I]) öffnen. Die ersten Inventarplätze werden auch als Plätze in Ihrer Schnellleiste benutzt. +Blocks can also have their own inventory, e.g. chests and furnaces.=Blöcke können auch ihr eigenes Inventar haben, z.B. Truhen und Öfen. +Inventory controls:=Inventarsteuerung: +Taking: You can take items from an occupied slot if the cursor holds nothing.=Nehmen: Sie können Gegenstände aus einem belegten Platz nehmen, wenn der Mauszeiger nichts hält. +• Left click: take entire item stack=• Linksklick: Ganzen Gegenstandsstapel nehmen +• Right click: take half from the item stack (rounded up)=• Rechtsklick: Hälfte des Stapels nehmen (aufgerundet) +• Middle click: take 10 items from the item stack=• Mittelklick: 10 Gegenstände von einem Stapel nehmen +• Mouse wheel down: take 1 item from the item stack=• Mausrad runter: 1 Gegenstand vom Stapel nehmen +Putting: You can put items onto a slot if the cursor holds 1 or more items and the slot is either empty or contains an item stack of the same item type.=Ablegen: Sie können Gegenstände auf einem Platz ablegen, wenn der Mauszeiger einen oder mehrere Gegenstände hält und der Platz entweder leer ist, oder einen Stapel des gleichen Gegenstandstyps enthält. +• Left click: put entire item stack=• Linksklick: Ganzen Stapel ablegen +• Right click or mouse wheel up: put 1 item of the item stack=• Rechtsklick oder Mausrad hoch: 1 Gegenstand des Stapels ablegen +• Middle click: put 10 items of the item stack=• Mittelklick: 10 Gegenstände des Stapels ablegen +Exchanging: You can exchange items if the cursor holds 1 or more items and the destination slot is occupied by a different item type.=Vertauschen: Sie können Gegenstände vertauschen, wenn der Mauszeiger einen oder mehrere Gegenstände hält und der Zielplatz von einem anderen Gegenstandstyp belegt ist. +• Click: exchange item stacks=• Klick: Stapel vertauschen +Throwing away: If you hold an item stack and click with it somewhere outside the menu, the item stack gets thrown away into the environment.=Wegwerfen: Wenn Sie einen Stapel halten und irgendwo außerhalb des Menüs klicken, wird der Stapel in die Umwelt weggeworfen. +Quick transfer: You can quickly transfer an item stack to/from the player inventory to/from another item's inventory slot like a furnace, chest, or any other item with an inventory slot when that item's inventory is accessed. The target inventory is generally the most relevant inventory in this context.=Schnelles Verschieben: Sie können einen Stapel schnell von/zu dem Spielerinventar von/zu einem anderem Inventar (z.B. in einem Inventar einer Truhe oder eines Ofens) verschieben. Das Zielinventar ist normalerweise das relevanteste Inventar des Behälters. +• Sneak+Left click: Automatically transfer item stack=• Schleichtaste+Linksklick: Automatisch Stapel verschieben +Online help=Online-Hilfe +You may want to check out these online resources related to Minetest:=Sie können diese Onlinequellen zum Thema Minetest besuchen: +Official homepage of Minetest: =Offizielle Minetest-Homepage: +The main place to find the most recent version of Minetest.=Dort findet man die neueste Minetest-Version. +Community wiki: =Community-Wiki: +A community-based documentation website for Minetest. Anyone with an account can edit it! It also features a documentation of Minetest Game.=Eine gemeinschaftsbasierte Dokumentationswebpräsenz für Minetest. Jeder mit einem Benutzerkonto kann sie bearbeiten. Enthält auch die Hilfe zu Minetest Game. +Web forums: =Webforen: +A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and games are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.=Eine webbasierte Diskussionsplattform, wo Sie über alles zum Thema Minetest diskutieren können. Dort werden auch spielergemachte Mods und Spiele veröffentlicht und diskutiert. +Chat: =Chat: +A generic Internet Relay Chat channel for everything related to Minetest where people can meet to discuss in real-time. If you do not understand IRC, see the Community Wiki for help.=Ein allgemeiner Internet-Relay-Chat-Kanal für alles über Minetest, wo sich Menschen treffen können, um in Echtzeit zu diskutieren. Wenn Sie IRC nicht verstehen, sehen Sie im Community-Wiki für Hilfe nach. +Groups=Gruppen +Items, players and objects (animate and inanimate) can be members of any number of groups. Groups serve multiple purposes:=Gegenstände, Spieler und Objekte (lebend oder nicht) können Mitglieder von einer Reihe von Gruppen sein. Gruppen erfüllen mehrere Zwecke: +• Crafting recipes: Slots in a crafting recipe may not require a specific item, but instead an item which is a member of a particular group, or multiple groups=• Fertigungsrezepte: Plätze in Fertigungsrezepten erfordern nicht unbedingt einen konkreten Gegenstand, sondern einen Gegenstand, der zu einer bestimmten Gruppe, oder mehreren Gruppen, gehört +• Digging times: Diggable blocks belong to groups which are used to determine digging times. Mining tools are capable of digging blocks belonging to certain groups=• Abbauzeiten: Abbaubare Blöcke gehören zu Gruppen, die benutzt werden, um die Abbauzeiten zu bestimmen. Grabewerkzeuge sind fähig, grabbare Blöcke, die zu bestimmten Gruppen gehören, abzubauen +• Block behavior: Blocks may show a special behaviour and interact with other blocks when they belong to a particular group=• Blockverhalten: Blöcke können ein besonderes Verhalten aufweisen und mit anderen Blöcken interagieren, wenn sie zu einer bestimmten Gruppe gehören +• Damage and armor: Objects and players have armor groups, weapons have damage groups. These groups determine damage. See also: “Basics > Weapons”=• Schaden und Rüstung: Objekte und Spieler haben Rüstungsgruppen, Waffen haben Schadensgruppen. Diese Gruppe bestimmen den Schaden. Siehe auch: „Grundlagen > Waffen“ +• Other uses=• Andere Zwecke +In the item help, many important groups are usually mentioned and explained.=In der Gegenstandshilfe werden viele wichtige Gruppen normalerweise erwähnt und erklärt. +Glossary=Glossar +This is a list of commonly used terms in Minetest:=Dies ist eine Liste von häufig benutzten Begriffen in Minetest +Controls:=Steuerung: +• Wielding: Holding an item in hand=• Halten: Einen Gegenstand in der Hand halten +• Pointing: Looking with the crosshair at something in range=• Zeigen: Mit dem Fadenkreuz auf etwas in Reichweite blicken +• Dropping: Throwing an item or item stack to the ground=• Wegwerfen: Gegenstand oder Stapel zu Boden werfen +• Punching: Attacking with left-click, is also used on blocks=• Schlagen: Angriff mit Linksklick, wird auch an Blöcken benutzt +• Sneaking: Walking slowly while (usually) avoiding to fall over edges=• Schleichen: Langsam gehen, während man (normalerweise) verhindert, über die Kante zu fallen +• Climbing: Moving up or down a climbable block=• Klettern: Bei einem kletterbaren Block auf- oder absteigen +Blocks:=Blöcke: +• Block: Cubes that the worlds are made of=• Block: Würfel, aus denen die Welten gemacht sind +• Mining/digging: Using a mining tool to break a block=• Abbauen/Graben: Ein Grabewerkzeug benutzen, um einen Block zu zerbrechen +• Building/placing: Putting a block somewhere=• Bauen/Platzieren: Einen Block irgendwo hin setzen +• Drop: Items you get after mining a block=• Abwurf: Gegenstände, den Sie nach dem Abbauen erhalten +• Using a block: Right-clicking a block to access its special function=• Einen Block benutzen: Rechtsklick auf einem Block, um auf seine Sonderfunktion zuzugreifen +Items:=Gegenstände: +• Item: A single thing that players can possess=• Gegenstand: Ein einzelnes Ding, den Spieler besitzen können +• Item stack: A collection of items of the same kind=• Gegenstandsstapel: Eine Sammlung von gleichen Gegenständen +• Maximum stack size: Maximum amount of items in an item stack=• Maximale Stapelgröße: Maximale Anzahl Gegenstände in einem Gegenstandsstapel +• Slot / inventory slot: Can hold one item stack=• Platz / Inventarplatz: Kann einen Gegenstandsstapel halten +• Inventory: Provides several inventory slots for storage=• Inventar: Bietet mehrere Inventarplätze für die Lagerung +• Player inventory: The main inventory of a player=• Spielerinventar: Das Hauptinventar eines Spielers +• Tool: An item which you can use to do special things with when wielding=• Werkzeug: Ein Gegenstand, mit dem man besondere Dinge beim Halten tun kan +• Range: How far away things can be to be pointed by an item=• Reichweite: Bis zu welcher Entfernung man Dinge zeigen kann +• Mining tool: A tool which allows to break blocks=• Grabewerkzeug: Werkzeug, mit dem man Blöcke brechen kann +• Craftitem: An item which is (primarily or only) used for crafting=• Fertigungsgegenstand: Ein Gegenstand der (hauptsächlich oder nur) für die Fertigung benutzt wird +Gameplay:=Spiel: +• “heart”: A single health symbol, indicates 2 HP=• „Herz“: Ein einzelnes Gesundheitssymbol, steht für 2 TP +• “bubble”: A single breath symbol, indicates 1 BP=• „Luftblase“: Ein einzelnes Atemsymbol, steht für 1 AP +• HP: Hit point (equals half 1 “heart”)=• TP: Trefferpunkt (gleich 1 halbes „Herz“) +• BP: Breath point, indicates breath when diving=• AP: Atempunkt, steht für Atem beim Tauchen +• Mob: Computer-controlled enemy=• Mob: Computergesteuerter Gegner +• Crafting: Combining multiple items to create new ones=• Fertigen: Kombinierung mehrerer Gegenstände, um neue zu erhalten +• Crafting guide: A helper which shows available crafting recipes=• Fertigungsführer: Ein Helferlein, um die verfügbaren Fertigungsrezepte zu zeigen +• Spawning: Appearing in the world=• Einsteigen (spawning): In der Welt auftauchen +• Respawning: Appearing again in the world after death=• Wiedereinsteigen (respawning): Wieder in der Welt auftauchen, nach dem man gestorben ist +• Group: Puts similar things together, often affects gameplay=• Gruppe: Fasst mehrere Dinge zusammen, betrifft oft den Spielverlauf +• noclip: Allows to fly through walls=• Geistmodus / noclip: Damit kann man durch Wände fliegen +Interface=Benutzeroberfläche +• Hotbar: Inventory slots at the bottom=• Schnellleiste: Untere Inventarplätze +• Statbar: Indicator made out of half-symbols, used for health and breath=• Wertleiste: Indikator aus Halbsymbolen, für Gesundheit und Atem benutzt +• Minimap: The map or radar at the top right=• Übersichtskarte: Karte oder Radar oben rechts +• Crosshair: Seen in the middle, used to point at things=• Fadenkreuz: In der Mitte, damit kann man auf Dinge zeigen +Online multiplayer:=Online-Mehrspieler: +• PvP: Player vs Player. If active, players can deal damage to each other=• PvP: Spielerkampf (Player vs Player). Wenn aktiv, können sich Spieler gegenseitig verletzen +• Griefing: Destroying the buildings of other players against their will=• Griefen: Gebäude anderer Spieler gegen ihren Willen zerstören +• Protection: Mechanism to own areas of the world, which only allows the owners to modify blocks inside=• Schutz: Mechanismus, um Eigentum an Gebieten in der der Welt zu erlangen, wodurch nur der Eigentümer die Blöcke verändern kann +Technical terms:=Technische Begriffe: +• Minetest: This game engine=• Minetest: Diese Spiel-Engine +• Minetest Game: A game for Minetest by the Minetest developers=• Minetest Game: Ein Spiel für Minetest von den Minetest-Entwicklern +• Game: A complete playing experience to be used in Minetest; such as a game or sandbox or similar=• Spiel: Ein vollständiges Spielerlebnis für Minetest, also ein richtiges Spiel oder auch nur eine Sandbox oder ähnliches +• Mod: A single subsystem which adds or modifies functionality; is the basic building block of games and can be used to further enhance or modify them=• Mod: Ein einzelnes Untersystem, welches Funktionalität hinzufügt oder modifiziert; ist das Fundament von Spielen und kann benutzt werden, um sie zu erweitern oder zu modifizieren +• Privilege: Allows a player to do something=• Privileg: Erlaubt einem Spieler, etwas zu tun +• Node: Other word for “block”=• Node: Anderes Wort für „Block“ +Settings=Einstellungen +There is a large variety of settings to configure Minetest. Pretty much every aspect can be changed that way.=Es gibt viele Einstellungen, um Minetest einzurichten. Fast jeder Aspekt kann so verändert werden. +These are a few of the most important gameplay settings:=Dies sind ein paar der wichtigsten Spieleinstellungen: +• Damage enabled (enable_damage): Enables the health and breath attributes for all players. If disabled, players are immortal=• Schaden aktiviert (enable_damage): Aktiviert die Gesundheits- und Atemattribute für alle Spieler. Wird dies deaktiviert, sind Spieler unsterblich. +• Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. The meaning depends on the game; usual changes are: Reduced dig times, easy access to almost all items, tools never wear off, etc.=• Kreativmodus (creative_mode): Aktiviert eine Art Sandkastenmodus, der sich auf Kreativität statt auf ein herausforderndes Spiel konzentriert. Die Bedeutung hängt vom Spiel ab; die üblichen Änderungen sind: Verringerte Grabezeiten, leichter Zugriff zu fast allen Dingen, Werkzeuge nutzen sich nie ab, usw. +• PvP (enable_pvp): Short for “Player vs Player”. If enabled, players can deal damage to each other=• PvP (enable_pvp): Wenn aktiv, können sich Spieler gegenseitig verletzen +For a full list of all available settings, use the “All Settings” dialog in the main menu.=Für eine vollständige Liste aller verfügbaren Einstellungen, benutzen Sie den Knopf „Alle Einstellunen“ im Hauptmenü. +Movement modes=Bewegungsmodi +If you have the required privileges, you can use up to three special movement modes.=Wenn Sie die benötigten Privilegien haben, können Sie bis zu drei besondere Bewegungsmodi benutzen. +Fast mode:=Schnellmodus: +• Description: Allows you to move much faster. Hold down the the “Use” key [E] to move faster. In the client configuration, you can further customize fast mode.=• Beschreibung: Damit bewegen Sie sich viel schneller. In der Client-Konfiguration können Sie den Schnellmodus ferner anpassen +• Default key: [J]=• Standardtaste: [J] +• Required privilege: fast=• Benötigtes Privileg: fast +Fly mode:=Flugmodus +• Description: Gravity doesn't affect you and you can move freely in all directions. Use the jump key to rise and the sneak key to sink.=• Beschreibung: Schwerkraft beeinflusst Sie nicht und Sie können sich in alle Richtungen schnell bewegen. Benutzen Sie die Sprungtaste zum Aufsteigen und die Schleichentaste zum Absinken. +• Default key: [K]=• Standardtaste: [K] +• Required privilege: fly=• Benötigtes Privileg: fly +Noclip mode:=Geistmodus: +• Description: Allows you to move through walls. Only works when fly mode is enabled, too.=• Beschreibung: Damit können Sie durch Wände fliegen, wenn der Flugmodus aktiv ist. +• Default key: [H]=• Standardtaste: [H] +• Required privilege: noclip=• Benötigtes Privileg: noclip +Console=Konsole +With [F10] you can open and close the console. The main use of the console is to show the chat log and enter chat messages or server commands.=Mit [F10] öffnen und schließen Sie die Konsole. Der Hauptzweck der Konsole ist die Anzeige des Chatprotokolls und für die Eingabe von Chatnachrichten oder Serverbefehlen. +Using the chat or server command key also opens the console, but it is smaller and will be closed after you sent a message.=Wenn Sie die Chat- oder Serverbefehlstaste benutzen, wird die Konsole auch geöffnet, aber sie ist kleiner und wird geschlossen, nachdem Sie eine Nachricht gesendet haben. +Use the chat to communicate with other players. This requires you to have the “shout” privilege.=Benutzen Sie den Chat, um mit anderen Spielern zu kommunizieren. Dafür brauchen Sie das „shout“-Privileg. +Just type in the message and hit [Enter]. Public chat messages can not begin with “/”.=Geben Sie einfach die Nachricht ein und drücken [Eingabe]. Öffentliche Chatnachrichten können nicht mit „/“ beginnen. +You can send private messages: Say “/msg ” in chat to send “” which can only be seen by .=Sie können private Nachrichten senden: Sagen Sie „/msg “ im Chat, um „“ zu senden, aber nur für sichtbar. +There are some special controls for the console:=Besondere Steuerung für die Konsole: +• [F10] Open/close console=• [F10] Konsole öffnen/schließen +• [Enter]: Send message or command=• [Eingabe] Nachricht oder Befehl senden +• [Tab]: Try to auto-complete a partially-entered player name=• [Tab]: Autovervollständigung von Spielernamen +• [Ctrl]+[Left]: Move cursor to the beginning of the previous word=• [Strg]+[Links]: Cursor zum Anfang des vorherigen Wortes bewegen +• [Ctrl]+[Right]: Move cursor to the beginning of the next word=• [Strg]+[Rechts]: Cursor zum Anfang des vorherigen Wortes bewegen +• [Ctrl]+[Backspace]: Delete previous word=• [Strg]+[Rücktaste]: Vorheriges Wort löschen +• [Ctrl]+[Delete]: Delete next word=• [Strg]+[Entfernen]: Nächstes Wort löschen +• [Ctrl]+[U]: Delete all text before the cursor=• [Strg]+[U]: Text vor dem Cursor löschen +• [Ctrl]+[K]: Delete all text after the cursor=• [Strg]+[K]: Text nach dem Cursor löschen +• [Page up]: Scroll up=• [Bild auf]: Nach oben scrollen +• [Page down]: Scroll down=• [Bild ab]: Nach unten rollen +There is also an input history. Minetest saves your previous console inputs which you can quickly access later:=Es gibt auch eine Eingabe-Historie. Minetest merkt sich Ihre vorherigen Konsoleneingaben, auf die Sie später schnell zugreifen können: +• [Up]: Go to previous entry in history=• [Rauf]: Zum vorherigen Eintrag in der Historie gehen +• [Down]: Go to next entry in history=• [Runter]: Zum nächsten Eintrag in der Historie gehen +Server commands=Serverbefehle +Server commands (also called “chat commands”) are little helpers for advanced users. You don't need to use these commands when playing. But they might come in handy to perform some more technical tasks. Server commands work both in multi-player and single-player mode.=Serverbefehle (auch „Chat-Befehle“ genannt) sind kleine Helferlein für fortgeschrittene Benutzer. Sie müssen diese Befehle im normalen Spielverlauf nicht benutzen. Aber sie können nützlich sein, um ein paar technischere Aufgaben zu erledigen. Serverbefehle funktionieren sowohl im Mehrspieler- als auch im Einzelspielermodus. +Server commands can be entered by players using the chat to perform a special server action. There are a few commands which can be issued by everyone, but some commands only work if you have certain privileges granted on the server. There is a small set of basic commands which are always available, other commands can be added by mods.=Serverbefehle können von Spielern im Chat eingegeben werden, um eine besondere Serveraktion auszulösen. Es gibt ein paar Befehle, die von jedem benutzt werden können, aber einige Befehle benötigen Privilegien, die vom Server gewährt werden. Es gibt eine kleine Menge an Grundbefehlen, die immer verfügbar sind, andere Befehle können von Mods hinzugefügt werden. +To issue a command, simply type it like a chat message or press Minetest's command key (default: [/]). All commands have to begin with “/”, for example “/mods”. The Minetest command key does the same as the chat key, except that the slash is already entered.=Um einen Befehl zu erteilen, geben Sie ihn einfach wie eine Chatnachricht ein oder drücken Sie Minetests Befehlstaste (Standard: [/]). Alle Befehle müssen mit „/“ beginnen, z.B. „/mods“. Die Minetestbefehlstaste macht das gleiche wie die Chattaste, nur, dass der Schrägstrich schon eingegeben wurde. +Commands may or may not give a response in the chat log, but errors will generally be shown in the chat. Try it for yourselves: Close this window and type in the “/mods” command. This will give you the list of available mods on this server.=Befehle können eine Rückmeldung im Chatprotokoll auslösen, müssen aber nicht. Fehlermeldungen tauchen grundsätzlich im Chat auf. Probieren Sie es aus: Schließen Sie dieses Fenster und geben Sie den „/mods“-Befehl ein. Damit erhalten Sie die Liste der vorhandenen Mods auf diesem Server. +“/help all” is a very important command: You get a list of all available commands on the server, a short explanation and the allowed parameters. This command is also important because the available commands often differ per server.=„/help all“ ist ein sehr wichtiger Befehl: Damit erhalten Sie eine Liste aller verfügbaren Befehle auf dem Server, eine kurze Erklärung und die möglichen Parameter. Dieser Befehl ist auch wichtig, weil die Befehle sich je nach Server unterscheiden können. +Commands are followed by zero or more parameters.=Befehle haben null oder mehr Parameter. +In the command reference, you see some placeholders which you need to replace with an actual value. Here's an explanation:=In der Befehlsreferenz sehen Sie einige Platzhalter, die sie mit dem richtigen Wert ersetzen müssen. Hier ist eine Erklärung: +• Text in greater-than and lower-than signs (e.g. “”): Placeholder for a parameter=• Text zwischen Größer-Als- und Kleiner-Als-Zeichen (z.B. „“): Platzhalter für einen Parameter +• Anything in square brackets (e.g. “[text]”) is optional and can be omitted=• Alles in eckigen Klammern (z.B. „[Text]“) ist optional und kann ausgelassen werden +• Pipe or slash (e.g. “text1 | text2 | text3”): Alternation. One of multiple texts must be used (e.g. “text2”)=• Senkrechtstrich (z.B. „Text1 | Text2 | Text3“): Alternativen. Eines von mehreren Texten muss benutzt werden +• Parenthesis: (e.g. “(word1 word2) | word3”): Groups multiple words together, used for alternations=• Klammern (z.B. „(Wort1 Wort2) | Wort3“): Gruppiert mehrere Wörter zusammen, für die Alternativen benutzt +• Everything else is to be read as literal text=• Alles andere muss als wortwörtlicher Text gelesen werden +Here are some examples to illustrate the command syntax:=Ein paar Beispiele, um die Befehlssyntax zu erläutern: +• /mods: No parameters. Just enter “/mods”=• /mods: Keine Parameter. Geben Sie einfach „/mods“ ein +• /me : 1 parameter. You have to enter “/me ” followed by any text, e.g. “/me orders pizza”=• /me : 1 Parameter. Sie müssen „/me “ gefolgt von einem beliebigen Text eingeben, z.B. „/me bestellt Pizza“ +• /give : Two parameters. Example: “/give Player default:apple”=• /give : Zwei Parameter. Beispiel: „/give Spieler default:apple“ +• /help [all|privs|]: Valid inputs are “/help”, “/help all”, “/help privs”, or “/help ” followed by a command name, like “/help time”=• /help [all|privs|]: Gültige Eingaben sind „/help“, „/help all“, „/help privs“ oder „/help “ gefolgt von einem Befehlsnamen, wie „/help time“ +• /spawnentity [,,]: Valid inputs include “/spawnentity boats:boat” and “/spawnentity boats:boat 0,0,0”=• /spawnentity [,,]: Gültige Eingaben beeinhalten „/spawnentity boats:boat“ und „/spawnentity boats:boat 0,0,0“ +Some final remarks:=Ein paar letzte Anmerkungen: +• For /give and /giveme, you need an itemstring. This is an internally used unique item identifier which you may find in the item help if you have the “give” or “debug” privilege=• Für /give und /giveme brauchen Sie einen sog. Itemstring. Das ist ein intern benutzter eindeutiger Gegenstandsidentifikator, den Sie in der Gegenstandshilfe finden, wenn Sie das „give“ oder „debug“-Privileg haben +• For /spawnentity you need an entity name, which is another identifier=• Für /spawnentity brauchen Sie einen Entity-Namen, was ein anderer Identifikator ist +Privileges=Privilegien +Each player has a set of privileges, which differs from server to server. Your privileges determine what you can and can't do. Privileges can be granted and revoked from other players by any player who has the privilege called “privs”.=Jeder Spieler hat eine Menge an Privilegien, die sich von Server zu Server unterscheiden. Ihre Privilegien bestimmen, was Sie tun können und was nicht. Privilegien können von anderen Spielern gewährt und entzogen werden, wenn diese das Privileg namens „privs“ haben. +On a multiplayer server with the default configuration, new players start with the privileges called “interact” and “shout”. The “interact” privilege is required for the most basic gameplay actions such as building, mining, using, etc. The “shout” privilege allows to chat.=In Mehrspielerservern mit der Standardeinstellung starten Spieler mit den Privilegien „interact“ und „shout“. Das „interact“-Privileg wird für die grundlegendsten Spielaktionen so wie Bauen, Abbauen, Benutzen, usw. gebraucht. Das „shout“-Privileg braucht man zum Chatten. +There is a small set of core privileges which you'll find on every server, other privileges might be added by mods.=Es gibt eine kleine Menge an Hauptprivilegien, die Sie auf jeden Server finden, andere Privilegien können von Mods hinzugefügt werden. +To view your own privileges, issue the server command “/privs”.=Um Ihre eigenen Privilegien zu sehen, erteilen Sie den Serverbefehl „/privs“. +Here are a few basic privilege-related commands:=Hier sind ein paar Befehle zum Thema Privilegien: +• /privs: Lists your privileges=• /privs: Listet Ihre Privilegien auf +• /privs : Lists the privileges of =• /privs : Listet die Privilegien von auf +• /help privs: Shows a list and description about all privileges=• /help privs: Zeigt eine Liste und Beschreibung für alle Privilegien an +Players with the “privs” privilege can modify privileges at will:=Spieler mit dem Privileg „privs“ können Privilegien beliebig ändern: +• /grant : Grant to =• /grant : an gewähren +• /revoke : Revoke from =• /revoke : von entziehen +In single-player mode, you can use “/grantme all” to unlock all abilities.=Im Einzelspielermodus können Sie „/grantme all“ benutzen, um alle Fähigkeiten freizuschalten. +Light=Licht +As the world is entirely block-based, so is the light in the world. Each block has its own brightness. The brightness of a block is expressed in a “light level” which ranges from 0 (total darkness) to 15 (as bright as the sun).=Da die Welt völlig auf Blöcken basiert, gilt dies auch für das Licht in der Welt. Jeder Block hat seine eigene Helligkeit. Die Helligkeit eines Blocks wird als „Helligkeitsstufe“ angegeben, die von 0 (völlig dunkel) bis 15 (so hell wie die Sonne) reicht. +There are two types of light: Sunlight and artificial light.=Es gibt zwei Lichttypen: Sonnenlicht und künstliches Licht. +Artificial light is emitted by luminous blocks. Artificial light has a light level from 1-14.=Künstliches List kommt von leuchtenden Blöcken. Künstliches Licht hat eine Helligkeit zwischen 1-14. +Sunlight is the brightest light and always goes perfectly straight down from the sky at each time of the day. At night, the sunlight will become moonlight instead, which still provides a small amount of light. The light level of sunlight is 15.=Sonnenlicht ist das hellste Licht und geht immer von oben vom Himmel schnurgerade nach unten zu jeder Tageszeit. In der Nacht wird aus Sonnenlicht Mondlicht, welches immer noch etwas Licht spendet. +Blocks have 3 levels of transparency:=Blöcke haben 3 Stufen der Transparenz: +• Transparent: Sunlight goes through limitless, artificial light goes through with losses=• Transparent: Sonnenlicht geht unbegrenzt hindurch, künstliches Licht geht mit Verlusten hindurch +• Semi-transparent: Sunlight and artificial light go through with losses=• Halbtransparent: Sonnenlicht und künstliches Licht gehen mit Verlusten durch +• Opaque: No light passes through=• Lichtundurchlässig: Licht kann nicht passieren +Artificial light will lose one level of brightness for each transparent or semi-transparent block it passes through, until only darkness remains (image 1).=Künstliches Licht wird eine Helligkeitsstufe für jeden transparenten oder halbtransparenten Block, den es passiert, einbüßen, bis es völlig verdunkelt ist (Bild 1). +Sunlight will preserve its brightness as long it only passes fully transparent blocks. When it passes through a semi-transparent block, it turns to artificial light. Image 2 shows the difference.=Sonnenlicht wird seine Helligkeit behalten, solange sie nur volltransparente Blöcke passiert. Sobald sie einen halbtransparenten Block passiert, wird es zu künstlichem Licht. Bild 2 zeigt den Unterschied. +Note that “transparency” here only means that the block is able to carry brightness from its neighboring blocks. It is possible for a block to be transparent to light but you can't see trough the other side.=Beachten Sie, dass das Wort „Transparenz“ hier nur bedeutet, dass der Block fähig ist, Helligkeit von seinen Nachbarblöcken weiterzugeben. Es ist möglich, dass ein Block transparent gegenüber Licht ist, aber Sie können nicht durch ihn sehen. +Coordinates=Koordinaten +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.=Die Minetest-Welt ist ein großer Würfel. Und daher kann eine Position in der Welt leicht mit kartesischen Koordinaten ausgedrückt weren. Das bedeutet, für jede Position in der Welt gibt es 3 Werte X, Y und Z. +Like this: (5, 45, -12)=So wie dies: (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.=Das bezieht sich auf die Position, in der X@=5, Y@=45 und Z@=-12 sind. Die drei Buchstaben nennt man „Achsen“. Y ist für die Höhe X und Z sind für die horizontale Position. +The values for X, Y and Z work like this:=Die Werte für X, Y und Z funktionieren so: +• If you go up, Y increases=• Wenn Sie aufsteigen, erhöht sich Y +• If you go down, Y decreases=• Steigen Sie ab, verringert sich Y +• If you follow the sun, X increases=• Folgen Sie der Sonne, erhöht sich X +• If you go to the reverse direction, X decreases=• Gehen Sie in die entgegengesetzte Richtung, verringert sich X +• Follow the sun, then go right: Z increases=• Folgen Sie der Sonne, dann gehen Sie nach rechts: Z erhöht sich +• Follow the sun, then go left: Z decreases=• Folgen Sie der Sonne, dann gehen Sie nach links: Z verringert sich +• The side length of a full cube is 1=• Die Seitenlänge eines ganzen Würfels ist 1 +You can view your current position in the debug screen (open with [F5]).=Sie sehen Ihre aktuelle Position im Debug-Bildschirm (mit [F5] öffnen). +Items have several properties, including the following:=Gegenstände haben diverse Eigenschaften, unter anderem: +• Maximum stack size: Number of items which fit on 1 item stack=• Maximale Stapelgröße: Anzahl der Gegenstände, die in einen Gegenstandsstapel passen +• Pointing range: How close things must be to be pointed while wielding this item=• Zeigereichweite: Wie nah Dinge zum Zeigen sein müssen, wenn dieser Gegenstand gehalten wird +• Group memberships: See “Basics > Groups”=• Gruppenmitgliedschaften: Siehe „Grundlagen > Gruppen“ +• May be used for crafting or cooking=• Kann zum Fertigen oder beim Kochen benutzt werden +There are multiple types of crafting recipes:=Es gibt mehrere Arten von Fertigungsrezepten: +• Shaped (image 2): Items need to be placed in a particular shape=• Förmig (Bild 2): Gegenstände müssen in einer bestimmten Form platziert werden +• Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)=• Formlos (Bilder 3 und 4): Gegenstände müssen irgendwo in der Eingabe platziert werden (beide Bilder zeigen das gleiche Rezept) +• Cooking: Explained in “Basics > Cooking”=• Kochen: Siehe „Grundlagen > Kochen“ +• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by a certain percentage. This recipe may not be available in all games=• Reparieren (Bild 5): Platzieren sie zwei gleiche beschädigte Werkzeuge in das Fertigungsgitter, um ein Werkzeug zu erhalten, das zu einem bestimmten Prozentsatz repariert ist. Dieses Rezept ist nicht in allen Spielen vorhanden +Minetest has 3 different views which determine the way you see the world. The modes are:=Minetest hat 3 verschiedene Ansichten, die bestimmen, wie Sie die Welt sehen. Die Modi sind: +• 1: First-person view (default)=• 1: Erste Person (Standard) +• 2: Third-person view from behind=• 2: Dritte Person von hinten +• 3: Third-person view from the front=• 3: Dritte Person von vorne +Players can take damage for a variety of reasons, here are some:=Spieler können aus verschidenen Gründen Schaden erleiden, hier sind ein paar: +• Taking fall damage=• Fallschaden +• Touching a block which causes direct damage=• Einen Block berühren, der Direktschaden anrichtet +• Drowning=• Ertrinken +• Being attacked by another player=• Angriff eines anderen Spielers +• Being attacked by a computer enemy=• Angriff eines Computergegners +Renewable liquids create new liquid sources at open spaces (image 2). A new liquid source is created when:=Erneuerbare Flüssigkeiten erschaffen neue Flüssigkeitsquellen in Freiräumen (Bild 2). Eine neue Flüssigkeitsquelle wird erschaffen, wenn: +• Two renewable liquid blocks of the same type touch each other diagonally=• Zwei gleiche erneuerbare Flüssigkeitsblöcke sich diagonal berühren +• These blocks are also on the same height=• Diese Blöcke sich auch in der gleichen Höhe befinden +• One of the two “corners” is open space which allows liquids to flow in=• Eines der zwei „Ecken“ ein Freiraum ist, in den Flüssigkeiten hereinfließen können +You can enable some special movement modes that change how you move.=Sie können in paar besondere Bewegungsmodi einschalten, die ändern, wie Sie sich bewegen. +Pitch movement mode:=Nick-Bewegungsmodus: +• Description: If this mode is activated, the movement keys will move you relative to your current view pitch (vertical look angle) when you're in a liquid or in fly mode.=• Wenn dieser Modus aktiviert ist, werden die Bewegungstasten Sie relativ zu Ihrem jetzigen Nickwinkel (vertikaler Blickwinkel) bewegen, wenn Sie sich in einer Flüssigkeit befinden oder der Flugmodus aktiv ist. +• Default key: [L]=• Standardtaste: [L] +• No privilege required=• Kein Privileg nötig 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 new file mode 100644 index 000000000..694735cac --- /dev/null +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.it.tr @@ -0,0 +1,408 @@ +# textdomain: mcl_doc_basics +Basics=Nozioni di base +Everything you need to know about Minetest to get started with playing=Tutto ciò che vi serve sapere riguardo a Minetest per cominciare a giocare +Advanced usage=Utilizzo avanzato +Advanced information about Minetest which may be nice to know, but is not crucial to gameplay=Informazioni avanzate riguardo a Minetest che possono essere utili da conoscere, ma non sono cruciali per l'esperienza di gioco +Quick start=Partenza rapida +This is a very brief introduction to the basic gameplay:=Questa è una introduzione molto rapida all'esperienza di gioco di base +• Move mouse to look=• Spostare il mouse per guardare attorno +• [W], [A], [S] and [D] to move=• [W], [A], [S] e [D] per muoversi +• [Space] to jump or move upwards=• [Spazio] per saltare o muoversi in su +• [Shift] to sneak or move downwards=• [Maiusc] per strisciare o muoversi in giù +• Mouse wheel or [0]-[9] to select item=• Rotella del mouse o [0]-[9] per scegliere un oggetto +• Left-click to mine blocks or attack=• Click sinistro per scavare i blocchi o attaccare +• Recover from swings to deal full damage=• Riprendersi dall'oscillazione per infliggere un danno completo +• Right-click to build blocks and use things=• Click destro per costruire blocchi e usare gli oggetti +• [I] for the inventory=• [I] per aprire l'inventario +• First items in inventory appear in hotbar below=• I primi oggetti nell'inventario compaiono nella barra di uso frequente sottostante +• [F9] for the minimap=• [F9] per attivare la minimappa +• Put items into crafting grid (usually 3×3 grid) to craft=• Mettete gli oggetti nella griglia di assemblaggio (normalmente una griglia 3x3) per assemblare +• Use a crafting guide mod to learn crafting recipes or visit =• Usate una gruida di assemblaggio per imparare le ricette di assemblaggio o visitate +• Read entries in this help to learn the rest=• Leggete le voci in questa guida per imparare il resto +• [Esc] to close this window=• [Esc] per chiudere questa finestra +Minetest=Minetest +Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).=Minetest è un programma gratuito che funge da motore di gioco per giochi basati sull'esperienza di gioco coi voxel, ispirato da InfiniMiner, Minecraft, e simili. Minetest in origine è stato creato da Perttu Ahola (cioè “celeron55”). +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 . +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! +• Sneak: [Shift]=• Strisciare: [Maiusc] +Sneaking only works when you stand on solid ground, are not in a liquid and don't climb.=È possibile strisciare solo quando siete su un terreno solido, non siete in un liquido e non vi state arrampicando. +Sneaking might be disabled by mods. In this case, you still walk slower by sneaking, but you will no longer be stopped at ledges.=Lo strisciare potrebbe essere disabilitato da dei moduli. In questo caso, strisciando camminerete comunque più lentamente, ma non verrete più fermat* agli orli. +Controls=Controlli +These are the default controls:=Questi sono i controlli predefiniti: +Basic movement:=Movimento di base: +• Moving the mouse around: Look around=• Spostando il mouse in giro: guardarsi attorno +• W: Move forwards=• W: fa avanzare +• A: Move to the left=• A: sposta a sinistra +• D: Move to the right=• D: sposta a destra +• S: Move backwards=• S: fa indietreggiare +While standing on solid ground:=Stando su di un terreno solido: +• Space: Jump=• Spazio: saltare +• Shift: Sneak=• Maiusc: strisciare +While on a ladder, swimming in a liquid or fly mode is active=Stando su di una scala a pioli, nuotando in un liquido o mentre è attiva la modalità di volo +• Space: Move up=• Spazio: fa salire +• Shift: Move down=• Maiusc: fa scendere +Extended movement (requires privileges):=Movimento esteso (richiede privilegi): +• J: Toggle fast mode, makes you run or fly fast (requires “fast” privilege)=• J: Attiva o disattiva la modalità veloce, vi fa correre o volare velocemente (richiede il privilegio “fast”) +• K: Toggle fly mode, makes you move freely in all directions (requires “fly” privilege)=• K: Attiva o disattiva la modalità di volo, vi fa muovere liberamente in tutte le direzioni (richiede il privilegio “fly”) +• H: Toggle noclip mode, makes you go through walls in fly mode (requires “noclip” privilege)=• H: Attiva o disattiva la modalità incorporea, in modalità volo vi fa passare attraverso i muri (richiede il privilegio “noclip”) +• E: Walk fast in fast mode=• E: Camminare velocemente in modalità veloce +World interaction:=Interazione col mondo: +• Left mouse button: Punch / mine blocks / take items=• Pulsante sinistro del mouse: colpire / scavare blocchi / prendere oggetti +• Right mouse button: Build or use pointed block=• Pulsante destro del mouse: costruire o usare il blocco puntato +• Shift+Right mouse button: Build=• Maiusc + pulsante destro del mouse: costruire +• Roll mouse wheel: Select next/previous item in hotbar=• Ruotare la rotella del mouse: selezionare il prossimo/precedente oggetto nella barra di uso frequente +• 0-9: Select item in hotbar directly=• 0-9: selezionare direttamente un oggetto nella barra di uso frequente +• Q: Drop item stack=• Q: lasciare una pila di oggetti +• Shift+Q: Drop 1 item=• Maiusc + Q: lasciare un oggetto +• I: Show/hide inventory menu=• I: mostrare/nascondere il menu dell'inventario +Inventory interaction:=Interazione con l'inventario: +See the entry “Basics > Inventory”.=Si veda la voce “Nozioni di base > Inventario” +Camera:=Telecamera: +• Z: Zoom (requires “zoom” privilege)=• Z: ingrandimento (richiede il privilegio “zoom”) +• F7: Toggle camera mode=• F7: cambiare la modalità della telecamera +• F8: Toggle cinematic mode=• F8: attiva/disattiva la modalità cinematic +Interface:=Interfaccia: +• Esc: Open menu window (pauses in single-player mode) or close window=• Esc: apre la finestra del menu (in modalità gioco locale mette in pausa) o chiude la finestra +• F1: Show/hide HUD=• F1: mostra/nasconde il visore +• F2: Show/hide chat=• F2: mostra/nasconde la messaggistica +• F9: Toggle minimap=• F9: attiva o disattiva la minimappa +• Shift+F9: Toggle minimap rotation mode=• Maiusc + F9: cambia la modalità di rotazione della minimappa +• F10: Open/close console/chat log=• F10: apre/chiude il registro della console/messaggistica +• F12: Take a screenshot=• F12: scatta un'istantanea +Server interaction:=Interazione col server +• T: Open chat window (chat requires the “shout” privilege)=• T: apre la finestra di messaggistica (la messaggistica richiede il privilegio “shout”) +• /: Start issuing a server command)=• /: precede l'invio di un comando al server +Technical:=Tecnici: +• R: Toggle far view (disables all fog and allows viewing far away, can make game very slow)=• R: attiva/disattiva la vista lontana (disabilita la nebbia e permette di vedere distante, può rendere il gioco molto lento) +• +: Increase minimal viewing distance=• +: aumenta la distanza visiva minima +• -: Decrease minimal viewing distance=• -: diminuisce la distanza visiva minima +• F3: Enable/disable fog=• F3: abilita/disabilita la nebbia +• F5: Enable/disable debug screen which also shows your coordinates=• F5: abilita/disabilita la schermata di debug che mostra anche le vostre coordinate +• F6: Only useful for developers. Enables/disables profiler=• F6: utile solo per sviluppatori/trici. Abilita/disabilita il generatore di profili +Players=Utenti +Players (actually: “player characters”) are the characters which users control.=Gli utenti (in realtà: “personaggi utente”) sono i personaggi controllati dagli/dalle utenti. +Players are living beings which occupy a space of about 1×2×1 cubes. They start with 20 health points (HP) and 10 breath points (BP).=Gli/le utenti sono entità viventi che occupano uno spazio di circa 1x2x1 cubi. Iniziano con venti punti salute (PS) e dieci punti ossigeno (PO). +Players are capable of walking, sneaking, jumping, climbing, swimming, diving, mining, building, fighting and using tools and blocks.=Gli/le utenti sono in grado di camminare, strisciare, saltare, arrampicarsi, nuotare, immergersi, scavare, costruire, combattere e di usare strumenti e blocchi. +Players can take damage for a variety of reasons, here are some:\n• Taking fall damage\n• Touching a block which causes direct damage\n• Drowning\n• Being attacked by another player\n• Being attacked by a computer enemy=Gli/le utenti possono ferirsi per una serie di motivi, eccone alcune:\n• Cadendo\n• Toccando un blocco che danneggia\n• Affogando\n• Vendendo attaccat* da un* altr* utente\n• Vendendo attaccat* da un* nemic* controllato dal computer +At a health of 0, the player dies. The player can just respawn in the world.=A salute pari a 0, il/la utente muore. Il/la utente può solo ricomparire nel mondo. +Other consequences of death depend on the subgame. The player could lose all items, or lose the round in a competitive game.=Altre conseguenze della morte dipendono dal gioco. Il/la utente potrebbe perdere tutti gli oggetti, o perdere il turno in un gioco di competizione. +Some blocks reduce breath. While being with the head in a block which causes drowning, the breath points are reduced by 1 for every 2 seconds. When all breath is gone, the player starts to suffer drowning damage. Breath is quickly restored in any other block.=Alcuni blocchi riducono l'ossigeno. Stando con la testa in un blocco che causa l'annegamento, i punti ossigeno vengono ridotti di uno ogni due secondi. Quando tutto l'ossigeno è finito, il/la utente inizia a subire il ferimento da annegamento. L'ossigeno viene ripristinato rapidamente in ogni altro blocco. +Damage can be disabled on any world. Without damage, players are immortal and health and breath are unimportant.=Il ferimento può essere disabilitato in qualunque mondo. Senza ferimento, gli/le utenti sono immortali, e salute e ossigeno non hanno importanza. +In multi-player mode, the name of other players is written above their head.=Durante il gioco in rete, il nome degli/delle altr* giocatori/trici è scritto sopra la loro testa. +Items=Oggetti +Items are things you can carry along and store in inventories. They can be used for crafting, smelting, building, mining, and more. Types of items include blocks, tools, weapons and items only used for crafting.=Gli oggetti sono cose che potete trasportare e immagazzinare negli inventari. Possono essere usati per assemblare, fondere, costruire, scavare, e altro. Tipologie di oggetti includono blocchi, strumenti, armi, e oggetti usati solo per l'assemblaggio. +An item stack is a collection of items of the same type which fits into a single item slot. Item stacks can be dropped on the ground. Items which drop into the same coordinates will form an item stack.=Una pila di oggetti è una raccolta di oggetti dello stesso tipo che sta in un unico scomparto per oggetti. Le pile di oggetti possono essere lasciate a terra. Gli oggetti che si lasciano alle stesse coordinate formeranno una pila di oggetti. +Items have several properties, including the following:\n\n• Maximum stack size: Number of items which fit on 1 item stack\n• Pointing range: How close things must be to be pointed while wielding this item\n• Group memberships: See “Basics > Groups”\n• May be used for crafting or cooking=Gli oggetti possiedono diverse proprietà, incluse le seguenti:\n\n• Dimensione massima della pila: il numero di oggetti che stanno in una pila di oggetti\n• Raggio di puntamento: quanto vicino devono essere le cose per essere puntate mentre si impugna questo oggetto\n• Appartenenza a gruppi: si veda “Nozioni di base > Gruppi”\n• Possono essere usati per assemblare o cucinare +A dropped item stack can be collected by punching it.=Una pila di oggetti lasciata a terra può essere raccolta colpendola. +Tools=Strumenti +Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.=Alcuni oggetti possono servire come strumento quando vengono impugnati. Ogni oggetto che possiede qualche uso speciale che può essere utilizzato da chi lo impugna è considerato uno strumento. +A common tool in Minetest are, of course, mining tools. These are important to break all kinds of blocks. Weapons are a kind of tool in Minetest. There are of course many other possible tools. Special actions of tools are usually done by left-click or right-click.=Uno strumento comune in Minetest sono, naturalmente, gli strumenti di scavo. Questi sono importanti per rompere tutti i tipi di blocchi. In Minetest le armi in sono un tipo di strumento. Certamente ci sono molti altri strumenti possibili. Le azioni speciali degli oggetti di solito sono eseguite cliccando il pulsante sinistro o destro. +When nothing is wielded, players use their hand which may act as tool and weapon. The hand is capable of collecting dropped items by punching.=Quando non si impugna nulla, gli/le utenti usano la loro mano che può fungere come strumento e arma. La mano può raccogliere gli oggetti lasciati a terra colpendoli. +Many tools will wear off when using them and may eventually get destroyed. The damage is displayed in a damage bar below the tool icon. If no damage bar is shown, the tool is in mint condition. Tools may be repairable by crafting, see “Basics > Crafting”.=Molti strumenti si consumeranno usandoli e alla fine potrebbero rompersi. L'usura è mostrata in una barra sotto all'icona dello strumento. Se non è mostrata nessuna barra di usura, lo strumento è nuovo di zecca. Gli strumenti potrebbero essere riparabili tramite l'assemblaggio, si veda “Nozioni di base > Assemblaggio”. +Weapons=Armi +Some items are usable as a melee weapon when wielded. Weapons share most of the properties of tools.=Alcuni oggetti sono utilizzabili come armi bianche quando sono impugnati. Le armi condividono la maggior parte delle proprietà degli strumenti. +Melee weapons deal damage by punching players and other animate objects. There are two ways to attack:=Le armi bianche infliggono ferite colpendo i/le utenti e gli altri oggetti animati. Ci sono due modi per attaccare: +• Single punch: Left-click once to deal a single punch=• Colpo singolo: cliccate una volta il pulsante sinistro per sferrare un colpo singolo +• Quick punching: Hold down the left mouse button to deal quick repeated punches=• Colpo rapido: tenete premuto il pulsante sinistro del mouse per sferrare colpi rapidi ripetuti +There are two core attributes of melee weapons:=Esistono due attributi principali delle armi bianche: +• Maximum damage: Damage which is dealt after a hit when the weapon was fully recovered)=• Danno massimo: il ferimento inferto dopo un colpo quando l'arma è stata ritratta completamente +• Full punch interval: Time it takes for fully recovering from a punch=• Intervallo di colpo completo: il tempo richiesto per ritrarre completamente da un colpo +A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.=Un'arma infligge una ferita completa solo quando è stata ritratta completamente dal colpo precedente. Altrimenti, l'arma infliggerà solo un ferimento ridotto. Ciò significa, colpire rapidamente è molto veloce, però infligge ferite piuttosto basse. Si noti che l'intervallo di colpo completo non limita la vostra velocità di attacco. +There is a rule which sometimes makes attacks impossible: Players, animate objects and weapons belong to damage groups. A weapon only deals damage to those who share at least one damage group with it. So if you're using the wrong weapon, you might not deal any damage at all.=C'è una regola che a volte rende impossibili gli attacchi: utenti, oggetti animati e armi appartengono a gruppi di ferimento. Un'arma infligge ferite a quell* che condividono con essa almeno un gruppo di ferimento. Perciò se state usando l'arma sbagliata, potreste non infliggere ferite affatto. +Pointing=Puntare +“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, dropped items, players, computer enemies and objects.=“Puntare” significa guardare qualcosa entro il raggio del mirino. Puntare è necessario per l'interazione, come scavare, colpire, usare, ecc. Le cose puntabili includono blocchi, oggetti lasciati a terra, utenti, nemic* controllat* dal computer e oggetti. +To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.=Per puntare qualcosa, deve essere nel raggio di puntamento (chiamato anche solo “raggio”) del vostro oggetto impugnato. +A few things can not be pointed. Most blocks are pointable. A few blocks, like air, can never be pointed. Other blocks, like liquids can only be pointed by special items.=Un po' di cose non possono essere puntate. La maggior parte dei blocchi sono puntabili. Pochi blocchi, come l'aria, non possono mai essere puntati. Altri blocchi, come i liquidi, possono essere puntati solo da oggetti speciali. +Camera=Telecamera +Minetest has 3 different views which determine the way you see the world. The modes are:\n\n• 1: First-person view (default)\n• 2: Third-person view from behind\n• 3: Third-person view from the front=Minetest possiede tre visuali diverse che stabiliscono il modo in cui vedete il mondo. Le modalità sono:\n\n• 1: Visuale in prima persona (predefinita)\n• 2: Visuale in terza persona da dietro\n• 3: Visuale in terza persona da davanti +You can change the camera mode by pressing [F7].=Potete cambiare la modalità della telecamera premendo [F7]. +By holding down [Z], you can zoom the view at your crosshair. You need the “zoom” privilege to do this.=Tenendo premuto il tasto [Z], potete ingrandire la visuale del vostro mirino. Per fare ciò vi serve il privilegio “zoom”. +• Switch camera mode: [F7]=• Cambiare modalità della telecamera: [F7] +• Zoom: [Z]=• Ingrandimento: [Z] +Blocks=Blocchi +The world of Minetest is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.=Il mondo di Minetest è fatto interamente di blocchi (voxel, per la precisione). I blocchi possono essere messi o tolti per mezzo degli strumenti adatti. +Blocks can have a wide range of different properties which determine mining times, behavior, looks, shape, and much more. Their properties include:=I blocchi possono avere un ampio spettro di proprietà differenti che stabiliscono tempi di scavo, comportamento, aspetto, forma e molto altro. Le loro proprietà includono: +• Collidable: Collidable blocks can not be passed through; players can walk on them. Non-collidable blocks can be passed through freely=• Urtabile: non si può passare attraverso i blocchi urtabili; gli/le utenti possono camminare su di essi. I blocchi non urtabili possono essere attraversati liberamente +• Pointable: Pointable blocks show a wireframe or a halo box when pointed. But you will just point through non-pointable blocks. Liquids are usually non-pointable but they can be pointed at by some special tools=• Puntabile: i blocchi puntabili mostrano una cornice o una scatola luminescente quando vengono puntati. Ma nel caso di blocchi non puntabili potrete solo puntare attraverso di essi. I liquidi normalmente non sono puntabili, ma possono essere puntati da alcuni strumenti speciali. +• Mining properties: By which tools it can be mined, how fast and how much it wears off tools=• Proprietà di scavo: tramite quali strumenti possono essere scavati, quanto velocemente e quanto usurano gli strumenti +• Climbable: While you are at a climbable block, you won't fall and you can move up and down with the jump and sneak keys=• Scalabile: mentre siete su di un blocco scalabile, non cadrete e potrete muovervi su e giù con i tasti di salto e strisciamento +• Drowning damage: See the entry “Basics > Player”=• Ferimento da annegamento: si veda la voce “Nozioni di base > Utenti” +• Liquids: See the entry “Basics > Liquids”=• Liquidi: si veda la voce “Nozioni di base > Liquidi” +• Group memberships: Group memberships are used to determine mining properties, crafting, interactions between blocks and more=• Appartenenze a gruppi: le appartenenze ai gruppi sono usate per stabilire le proprietà di scavo, assemblaggio, l'interazione tra blocchi e altro +Mining=Scavo +Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.=Scavare (o minare) è il processo di rompere i blocchi per toglierli. Per scavare un blocco, puntatelo e tenete premuto il pulsante sinistro del mouse finché si rompe. +Short explanation:=Spiegazione breve: +Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in toughness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining go straight into your inventory.=Per scavare un blocco servono degli strumenti di scavo. Blocchi differenti si scavano con strumenti di scavo diversi, e alcuni blocchi non possono essere scavati da nessuno strumento. I blocchi variano in durezza e gli strumenti variano in forza. Gli strumenti di scavo si usurano nel tempo. Il tempo di scavo e l'usura dello strumento dipendono dal blocco e dallo strumento di scavo. Il modo più veloce di scoprire quanto sono efficienti i vostri strumenti di scavo è quello di provarli su diversi blocchi. Ogni oggetto che ottenete scavando va direttamente nel vostro inventario. +Detailed explanation:=Spiegazione dettagliata: +Mineable blocks have mining properties (based on groups) and a toughness level. Mining tools have the same properties. Each mining property of a block also has a rating, while tools can be able to break blocks within a range of ratings.=I blocchi scavabili possiedono proprietà di scavo (basate sui gruppi) e un livello di durezza. Gli strumenti di scavo possiedono le stesse proprietà. Ogni proprietà di scavo di un blocco ha anche un grado, mentre gli strumenti possono rompere blocchi all'interno di una scala di gradi. +In order to mine a block, these conditions need to be met:=Per scavare un blocco, è necessario soddisfare queste condizioni: +• The block and tool share at least one mining property for which they have a matching rating=• Il blocco e lo strumento condividono almeno una proprietà di scavo per la quale possiedono un grado corrispondente +• The tool's toughness level is equal or less than the block's toughness level=• Il livello di durezza dello strumento è uguale o inferiore alla durezza del blocco +Example: A block with the mining property “cracky”, rating 3 and toughness level 0 can only be broken by a tool which is able to break “cracky” blocks at rating 3 and it must have a toughness level of 0 or larger.=Esempio: un blocco avente la proprietà “cracky”, di grado 3 e un livello di durezza 0 può essere rotto solo da uno strumento che è in grado di rompere blocchi “cracky” di grado 3 e deve avere un livello di durezza pari a 0 o maggiore. +The time it takes to mine a block depends on the ratings and the toughness levels of both tool and block.=Il tempo necessario per scavare un blocco dipende dal grado e dal livello di durezza sia dello strumento che del blocco. +• The base mining time depends on the ratings of the block and the mining speed of the tool=• Il tempo base di scavo dipende dai gradi del blocco e dalla velocità di scavo dello strumento +• The mining speed of the tool differs for each mining property and its rating=• La velocità di scavo dello strumento varia per ogni proprietà di scavo ed il suo grado +• The toughness level further modifies the mining speed for this mining proeprty=• Il livello di durezza modifica ulteriormente la velocità di scavo per questa proprietà di scavo +• A high difference in toughness levels decreases the mining time considerably=• Una elevata differenza in livelli di durezza diminuisce considerevolmente il tempo di scavo +• If the toughness level difference is 2, the mining time is half of the base mining time=• Se la differenza del livello di durezza è pari a 2, il tempo di scavo è la metà del tempo di base di scavo +• If the a difference of 3, the mining time is a third, and so on=• Se la differenza è pari a 3, il tempo di scavo è un terzo, e così via +The item help shows the mining times of a tool listed by its mining properties and its ratings. The mining times are often expressed as a range. The low number stands for the mining time for toughness level 0 and the high number for the highest level the tool can mine.=L'aiuto sull'oggetto mostra i tempi di scavo di uno strumento, elencati dalle sue proprietà di scavo e dai suoi gradi. I tempi di scavo sono spesso espressi come un ventaglio. Il numero basso sta per il tempo di scavo per il livello di durezza 0 e il numero alto sta per il livello massimo che lo strumento può scavare. +Mining usually wears off tools. Each time you mine a block, your tool takes some damage until it is destroyed eventually. The wear per mined block determined by the difference between the tool's toughness level and the block's toughness level. The higher the difference, the lower the wear. This means:=Normalmente scavare usura gli strumenti. Ogni volta che scavate un blocco, il vostro strumento viene danneggiato un po' finché alla fine si rompe. L'usura per ciascun blocco scavato è stabilita dalla differenza tra il livello di durezza dello strumento e quello del blocco. Maggiore è la differenza, minore è l'usura. Ciò significa: +• High-level blocks wear off your tools faster=• Blocchi di alto livello usurano i vostri strumenti più velocemente +• You can use high-level tools to compensate this=• Per compensare ciò potete usare strumenti di alto livello +• The highest wear is caused when the level of both tool and block are equal=• L'usura maggiore è causata quando il livello di strumento e blocco sono uguali +After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:=Dopo averlo scavato, un blocco potrebbe lasciarsi alle spalle un “rilascio”. Questo è un numero di oggetti che ottenete dopo avere scavato. Più comunemente, otterrete il blocco stesso. Ci sono altre possibilità per un rilascio che dipendono dal tipo di blocco. I rilasci seguenti sono possibili: +• Always drops itself (the usual case)=• Rilascia sempre sé stesso (il caso normale) +• Always drops the same items=• Rilascia sempre gli stessi oggetti +• Drops items based on probability=• Rilascia oggetti in base a probabilità +• Drops nothing=• Non rilascia niente +The drop goes directly into your inventory, unless there's no more space left. In that case, the items literally drop on the floor.=Il rilascio va direttamente nel vostro inventario, a meno che non ci sia più spazio. In quel caso, l'oggetto cade per terra. +Building=Costruzione +Almost all blocks can be built (or placed). Building is very simple and has no delay.=Quasi tutti i blocchi possono essere costruiti (o posizionati). Costruire è molto semplice e non ha ritardo. +To build your wielded block, point at a block in the world and right-click. If this is not possible because the pointed block has a special right-click action, hold down the sneak key before right-clicking.=Per posizionare il blocco che state impugnando, puntate ad un blocco nel mondo e cliccate col pulsante destro. Se ciò non è possibile perché il blocco puntato ha una azione speciale legata al pulsante destro, tenete premuto il tasto per strisciare prima di cliccare col pulsante destro. +Blocks can almost always be built at pointable blocks. One exception are blocks attached to the floor; these can only be built on the floor.=I blocchi possono essere piazzati quasi sempre sui blocchi puntabili. Una eccezione sono i blocchi attaccati al pavimento; questi possono essere costruiti solo sul pavimento. +Normally, blocks are built in front of the pointed side of the pointed block. A few blocks are different: When you try to build at them, they are replaced.=Normalmente, i blocchi vengono posizionati di fronte al lato puntato del blocco puntato. Pochi blocchi sono differenti: quando tentate di costruirci, vengono rimpiazzati. +Liquids=Liquidi +Liquids are special dynamic blocks. Liquids like to spread and flow to their surrounding blocks. Players can swim and drown in them.=I liquidi sono blocchi speciali dinamici. Ai liquidi piace espandersi e fluire verso i blocchi circostanti. Gli/le utenti possono affogarci. +Liquids usually come in two forms: In source form (S) and in flowing form (F).=I liquidi normalmente sono di due tipi: il tipo fonte (S) e il tipo corrente (F). +Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. A long it is left alone, a liquid source will normally keep its place and does not drain out.=Le fonti di liquidi hanno la forma di un piccolo cubo. Una fonte di liquidi di tanto in tanto produrrà intorno a sé dei liquidi correnti, e, se il liquido è rinnovabile, produrrà anche fonti di liquidi. Una fonte di liquidi può sostenersi. Finché è lasciata stare, normalmente una fonte di liquidi manterrà il suo posto e non si prosciugherà. +Flowing liquids take a sloped form. Flowing liquids spread around the world until they drain. A flowing liquid can not sustain itself and always comes from a liquid source, either directly or indirectly. Without a liquid source, a flowing liquid will eventually drain out and disappear.=I liquidi correnti assumono una forma inclinata. I liquidi correnti si espandono per il mondo finché si prosciugano. Un liquido corrente non può sostenersi e proviene sempre da una fonte di liquidi, o direttamente o indirettamente. Senza una fonte di liquidi, alla fine un liquido corrente si prosciugherà e sparirà. +All liquids share the following properties:=Tutti i liquidi condividono le proprietà seguenti: +• All properties of blocks (including drowning damage=• Tutte le proprietà dei blocchi (incluso il ferimento da annegamento) +• Renewability: Renewable liquids can create new sources=• Rinnovabilità: i liquidi rinnvabili possono creare nuove fonti +• Flowing range: How many flowing liquids are created at maximum per liquid source, it determines how far the liquid will spread. Possible are ranges from 0 to 8. At 0, no flowing liquids will be created. Image 5 shows a liquid of flowing range 2=• Raggio di flusso: quanti liquidi correnti sono creati al massimo da una fonte di liquidi, stabilisce quanto lontano si espanderà il liquido. Sono possibili raggi da 0 a 8. A 0, non sarà creato nessun liquido corrente. L'immagine 5 mostra un liquido con raggio di flusso pari a 2 +• Viscosity: How slow players move through it and how slow the liquid spreads=• Viscosità: quanto lentamente si muovono gli/le utenti in esso e quanto lentamente si espande il liquido +Renewable liquids create new liquid sources at open spaces (image 2). A new liquid source is created when:\n• Two renewable liquid blocks of the same type touch each other diagonally\n• These blocks are also on the same height\n• One of the two “corners” is open space which allows liquids to flow in=I liquidi rinnovabili generano nuove fonti di liquidi negli spazi aperti (immagine 2). Una nuova fonte di liquidi viene creata quando:\n• Due blocchi di liquidi rinnovabili dello stesso tipo si toccano l'un l'altro diagonalmente\n• Questi blocchi sono anche alla stessa altezza\n• Uno dei due “angoli” è uno spazio aperto che consente ai liquidi di scorrervi dentro +When those criteria are met, the open space is filled with a new liquid source of the same type (image 3).=Quando questi criteri sono soddisfatti, lo spazio aperto viene riempito con una nuova fonte di liquidi dello stesso tipo (immagine 3). +Swimming in a liquid is fairly straightforward: The usual direction keys for basic movement, the jump key for rising and the sneak key for sinking.=Nuotare in un liquido è abbastanza semplice: i soliti tasti direzionali per il movimento di base, il tasto di salto per emergere e il tasto strisciare per immergersi. +The physics for swimming and diving in a liquid are:=Le regole fisiche per nuotare e immergersi in un liquido sono: +• The higher the viscosity, the slower you move=• Maggiore è la viscosità, più lentamente vi muoverete +• If you rest, you'll slowly sink=• Se vi riposate, affonderete lentamente +• There is no fall damage for falling into a liquid as such=• Non c'è nessun ferimento da caduta alla caduta in un liquido in quanto tale +• If you fall into a liquid, you will be slowed down on impact (but don't stop instantly). Your impact depth is determined by your speed and the liquid viscosity. For a safe high drop into a liquid, make sure there is enough liquid above the ground, otherwise you might hit the ground and take fall damage=• Se cadete in un liquido, verrete rallentat* all'impatto (ma non vi fermerete immediatamente). La profondità del vostro impatto è determinata dalla vostra velocità e dalla viscosità del liquido. Per un tuffo sicuro in un liquido da grande altezza, assicuratevi che ci sia abbastanza liquido sopra il terreno, altrimenti potreste colpire il terreno e subire il ferimento da caduta. +Liquids are often not pointable. But some special items are able to point all liquids.=Spesso i liquidi non sono puntabili. Ma alcuni oggetti speciali possono puntare tutti i liquidi. +Crafting=Assemblaggio +Crafting is the task of combining several items to form a new item.=L'assemblaggio è l'azione di combinare diversi oggetti per formarne uno nuovo. +To craft something, you need one or more items, a crafting grid (C) and a crafting recipe. A crafting grid is like a normal inventory which can also be used for crafting. Items need to be put in a certain pattern into the crafting grid. Next to the crafting grid is an output slot (O). Here the result will appear when you placed items correctly. This is just a preview, not the actual item. Crafting grids can come in different sizes which limits the possible recipes you can craft.=Per assemblare qualcosa, vi servono uno o più oggetti, una griglia di assemblaggio (C) e una ricetta di assemblaggio. Una griglia di assemblaggio è come un comune inventario che può anche essere usata per assemblare. Gli oggetti devono essere messi nella griglia di assemblaggio secondo una certa disposizione. Vicino alla griglia di assemblaggio c'è la casella del prodotto (O). Lì comparirà il risultato quando avrete disposto correttamente gli oggetti. Quella è solo un'anteprima, non il vero oggetto. Le griglie di assemblaggio possono essere di varie dimensioni che limitano le possibili ricette che potete assemblare. +To complete the craft, take the result item from the output slot, which will consume items from the crafting grid and creates a new item. It is not possible to place items into the output slot.=Per completare l'assemblaggio, prendete dalla casella del prodotto l'oggetto risultante, così facendo consumerete gli oggetti disposti nella griglia di assemblaggio creando il nuovo oggetto. Non è possibile posizionare oggetti nella casella del prodotto. +A description on how to craft an item is called a “crafting recipe”. You need this knowledge to craft. There are multiple ways to learn crafting recipes. One way is by using a crafting guide, which contains a list of available crafting recipes. Some subgames provide crafting guides. There are also some mods which you can download online for installing a crafting guide. Another way is by reading the online manual of the subgame (if one is available).=La descrizione di come si assembla un oggetto è chiamata “ricetta di assemblaggio”. Per assemblare vi servirà questa conoscenza. Esistono svariati modi per imparare le ricette di assemblaggio. Un modo è usare una guida di assemblaggio, che contiene un elenco delle ricette di assemblaggio disponibili. Alcuni giochi forniscono guide di assemblaggio. Esistono anche alcuni moduli che potete scaricare dalla rete per installare una guida di assemblaggio. Un altro modo è leggere il manuale in rete del gioco (se questo è disponibile). +Crafting recipes consist of at least one input item and exactly one stack of output items. When performing a single craft, it will consume exactly one item from each stack of the crafting grid, unless the crafting recipe defines replacements.=Le ricette di assemblaggio sono formate da almeno un oggetto iniziale ed esattamente una pila di oggetti finali. Quando si esegue un assemblaggio singolo, questo consumerà esattamente un oggetto dalla griglia di assemblaggio, a meno che la ricetta di assemblaggio stabilisca dei rimpiazzi. +There are multiple types of crafting recipes:\n\n• Shaped (image 2): Items need to be placed in a particular shape\n• Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)\n• Cooking: Explained in “Basics > Cooking”\n• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by a certain percentage. This recipe may not be available in all subgames=Esistono tipi multipli di ricette di assemblaggio:\n\n• Con una forma (immagine 2): gli oggetti devono essere disposti nella griglia secondo un ordine particolare\n• Senza una forma (immagini 3 e 4): gli oggetti devono essere messi da qualche parte nella griglia (entrambe le immagini mostrano la stessa ricetta)\n• Cottura: spiegata in “Nozioni di base > Cottura”\n• Riparazione (immagine 5): mettete nella griglia due strumenti usurati in punti qualsiasi per ottenere uno strumento riparato per una certa percentuale. Questa ricetta potrebbe non essere disponibile in tutti i giochi +In some crafting recipes, some input items do not need to be a concrete item, instead they need to be a member of a group (see “Basics > Groups”). These recipes offer a bit more freedom in the input items. Images 6-8 show the same group-based recipe. Here, 8 items of the “stone” group are required, which is true for all of the shown items.=In alcune ricette di assemblaggio, alcuni oggetti iniziali non devono essere un oggetto preciso, devono essere invece membri di un gruppo (si veda “Nozioni di base > Gruppi”). Queste ricette offrono una maggiore libertà per gli oggetti iniziali. Le immagini 6-8 mostrano la stessa ricetta basata sui gruppi. In questa, servono otto oggetti del gruppo “stone” (“pietra”), cosa valida per tutti gli oggetti mostrati. +Rarely, crafting recipes have replacements. This means, whenever you perform a craft, some items in the crafting grid will not be consumed, but instead will be replaced by another item.=Raramente, le ricette di assemblaggio hanno dei rimpiazzi. Questo significa, ogni volta che eseguite un assemblaggio, alcuni oggetti nella griglia di assemblaggio non verranno consumati, ma invece verranno rimpiazzati da un altro oggetto. +Cooking=Cottura +Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a special block (like a furnace), an cookable item, a fuel item and time in order to yield a new item.=La cottura (o fusione) è una forma di creazione che non coinvolge una griglia di assemblaggio. La cottura viene eseguita con un blocco speciale (come una fornace), un oggetto cucinabile, un oggetto combustibile e del tempo per ottenere un nuovo oggetto. +Each fuel item has a burning time. This is the time a single item of the fuel keeps a furnace burning.=Ciascun combustibile possiede un tempo di bruciatura. Questo è il tempo per cui un singolo oggetto di combustibile tiene accesa una fornace. +Each cookable item requires time to be cooked. This time is specific to the item type and the item must be “on fire” for the whole cooking time to actually yield the result.=Ciascun oggetto cucinabile richiede del tempo per essere cotto. Questo tempo è specifico per il tipo di oggetto, e l'oggetto deve essere “sulla fiamma” per l'intero tempo di cottura per produrre effettivamente il risultato. +Hotbar=Barra di uso frequente +At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the first items from your player inventory.=Nella parte inferiore dello schermo si vedono alcuni riquadri. Questi sono chiamati “barra di uso frequente”. La barra di uso frequente vi permette di accedere rapidamente ai primi oggetti dell'inventario del vostro personaggio. +You can change the selected item with the mouse wheel or the number keys.=Potete cambiare l'oggetto selezionato con la rotella del mouse o i tasti numerici. +• Select previous item in hotbar: [Mouse wheel up]=• Selezionare l'oggetto precedente dalla barra di uso frequente: [Rotella del mouse in avanti] +• Select next item in hotbar: [Mouse wheel down]=• Selezionare l'oggetto successivo dalla barra di uso frequente: [Rotella del mouse indietro] +• Select item in hotbar directly: [0]-[9]=• Selezionare direttamente un oggetto dalla barra di uso frequente: [0]-[9] +The selected item is also your wielded item.=L'oggetto selezionato è anche l'oggetto impugnato. +Minimap=Minimappa +Press [F9] to make a minimap appear on the top right. The minimap helps you to find your way around the world. Press it again to select different minimap modes and zoom levels. The minimap also shows the positions of other players.=Premete [F9] per fare comparire una minimappa in alto a destra. La minimappa vi aiuta a trovare la vostra strada nel mondo. Premetelo ancora per selezionare modalità e livelli di ingrandimento differenti. La minimappa mostra anche la posizione degli/delle altre utenti. +There are 2 minimap modes and 3 zoom levels.=Esistono due modalità della minimappa e tre livelli di ingrandimento. +Surface mode (image 1) is a top-down view of the world, roughly resembling the colors of the blocks this world is made of. It only shows the topmost blocks, everything below is hidden, like a satellite photo. Surface mode is useful if you got lost.=La modalità di superficie (immagine 1) è una visuale del mondo dall'alto, rappresentante approssimativamente i colori dei blocchi di cui è composto questo mondo. Mostra solo i blocchi più elevati, ogni cosa al di sotto è nascosta, come nella foto scattata da un satellite. La modalità di superficie è utile se vi perdete. +Radar mode (image 2) is more complicated. It displays the “denseness” of the area around you and changes with your height. Roughly, the more green an area is, the less “dense” it is. Black areas have many blocks. Use the radar to find caverns, hidden areas, walls and more. The rectangular shapes in image 2 clearly expose the position of a dungeon.=La modalità radar (immagine 2) è più complessa. Mostra la “densità” dell'area che vi circonda e varia col variare della vostra altitudine. Grosso modo, più verde è l'area, e meno “compatta” è. Le aree nere possiedono molti blocchi. Usate il radar per trovare caverne, aree nascoste, muri e altro. Le forme rettangolari nell'immagine 2 rivelano chiaramente la posizione di un sotterraneo. +There are also two different rotation modes. In “square mode”, the rotation of the minimap is fixed. If you press [Shift]+[F9] to switch to “circle mode”, the minimap will instead rotate with your looking direction, so “up” is always your looking direction.=Esistono anche due modalità di rotazione diverse. Nella “modalità quadrata”, la rotazione della minimappa è fissa. Se premete [Maiusc]+[F9] per passare alla “modalità circolare”, la minimappa ruoterà invece con la vostra direzione di sguardo, perciò “su” è sempre la vostra direzione di sguardo. +In some subgames, the minimap may be disabled.=In alcuni giochi, la minimappa potrebbe essere disabilitata. +• Toggle minimap mode: [F9]=• Cambiare la modalità della minimappa: [F9] +• Toggle minimap rotation mode: [Shift]+[F9]=• Cambiare la modalità di rotazione della minimappa: [Maiusc]+[F9] +Inventories are used to store item stacks. There are other uses, such as crafting. An inventory consists of a rectangular grid of item slots. Each item slot can either be empty or hold one item stack. Item stacks can be moved freely between most slots.=Gli inventari sono usati per immagazzinare pile di oggetti. Esistono altri usi, come l'assemblaggio. Un inventario è composto da una griglia rettangolare di alloggi per oggetti. Ogni alloggio per oggetto può essere vuoto o contenere una pila di oggetti. Le pile di oggetti possono essere spostate liberamente nella maggior parte degli alloggi. +You have your own inventory which is called your “player inventory”, you can open it with the inventory key (default: [I]). The first inventory slots are also used as slots in your hotbar.=Voi avete il vostro inventario personale che è chiamato “inventario utente”, potete aprirlo con il tasto dell'inventario (predefinito: [I]). I primi alloggi dell'inventario sono anche usati come alloggi nella vostra barra di uso frequente. +Blocks can also have their own inventory, e.g. chests and furnaces.=Anche i blocchi possono avere il proprio inventario, per es. bauli e fornaci. +Inventory controls:=Controlli dell'inventario +Taking: You can take items from an occupied slot if the cursor holds nothing.=Prendere: potete prendere oggetti da un alloggio occupato se il cursore non sta tenendo nulla. +• Left click: take entire item stack=• Click sinistro: prende tutta la pila di oggetti +• Right click: take half from the item stack (rounded up)=• Click destro: prende metà della pila di oggetti (arrotondando) +• Middle click: take 10 items from the item stack=• Click centrale: prende dieci oggetti dalla pila di oggetti +Putting: You can put items onto a slot if the cursor holds 1 or more items and the slot is either empty or contains an item stack of the same item type.=Mettere: potete mettere oggetti in un alloggio se il cursore sta tenendo uno o più oggetti e se l'alloggio è vuoto o contiene una pila di oggetti dello stesso tipo. +• Left click: put entire item stack=• Click sinistro: mette una intera pila di oggetti +• Right click: put 1 item of the item stack=• Click destro: mette un oggetto della pila di oggetti +• Middle click: put 10 items of the item stack=• Click centrale: mette dieci oggetti della pila di oggetti +Exchanging: You can exchange items if the cursor holds 1 or more items and the destination slot is occupied by a different item type.= Scambiare: potete scambiare gli oggetti se il cursore sta tenendo uno o più oggetti e l'alloggio di destinazione è occupato da un tipo di oggetto differente. +• Click: exchange item stacks=• Click: scambiare le pile di oggetti +Throwing away: If you hold an item stack and click with it somewhere outside the menu, the item stack gets thrown away into the environment.=Gettare via: se state tenendo una pila di oggetti e cliccate con essa da qualche parte fuori dal menu, la pila di oggetti viene gettata nell'ambiente. +Quick transfer: You can quickly transfer an item stack to/from the player inventory to/from another item's inventory slot like a furnace, chest, or any other item with an inventory slot when that item's inventory is accessed. The target inventory is generally the most relevant inventory in this context.=Trasferimento rapido: potete trasferire rapidamente una pila di oggetti da/nell'inventario utente da/in un altro alloggio per oggetti di un inventario come quello di una fornace, un baule, o di ogni altro oggetto che abbia un alloggio per oggetti quando si accede all'inventario di quell'oggetto. In questo contesto generalmente l'inventario di destinazione è quello più importante. +• Sneak+Left click: Automatically transfer item stack=• Strisciare + click sinistro: trasferire automaticamente una pila di oggetti +Online help=Aiuto in rete +You may want to check out these online resources related to Minetest:=Potreste volere controllare queste risorse in rete collegate a Minetest: +Official homepage of Minetest: =Pagina ufficiale di Minetest: +The main place to find the most recent version of Minetest.=Il luogo principale dove trovare la versione più recente di Minetest. +Community wiki: =Wiki della comunità: +A community-based documentation website for Minetest. Anyone with an account can edit it! It also features a documentation of Minetest Game.=Un sito in rete di documentazione per Minetest basato sulla comunità. Chiunque abbia un account può modificarlo! Presenta anche una documentazione del Minetest Game. +Web forums: =Forum in rete: +A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and subgames are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.=Una piattaforma di discussione basata sulla rete dove potete discutere ogni cosa riguardante Minetest. Questo è anche il luogo dove sono pubblicati e discussi i moduli e i giochi fatti dagli/dalle utenti. Le conversazioni sono principalmente in Inglese, ma c'è spazio anche per le conversazioni in altre lingue. +Chat: =Messaggistica: +A generic Internet Relay Chat channel for everything related to Minetest where people can meet to discuss in real-time. If you do not understand IRC, see the Community Wiki for help.=Un canale Internet Relay Chat generico per tutto ciò che riguarda Minetest dove le persone possono incontrarsi per discutere in tempo reale. Se non capite IRC, leggete la Wiki della comunità per ottenere aiuto. +Groups=Gruppi +Items, players and objects (animate and inanimate) can be members of any number of groups. Groups serve multiple purposes:=Cose, utenti e oggetti (animati e inanimati) possono essere membri di qualunque numero di gruppi. I gruppi servono a svariati scopi: +• Crafting recipes: Slots in a crafting recipe may not require a specific item, but instead an item which is a member of a particular group, or multiple groups=• Ricette di assemblaggio: gli alloggi in una ricetta di assemblaggio potrebbero non richiedere un oggetto specifico, ma invece un oggetto che sia membro di un gruppo particolare, o di più gruppi +• Digging times: Diggable blocks belong to groups which are used to determine digging times. Mining tools are capable of digging blocks belonging to certain groups=• Tempi di scavo: i blocchi scavabili appartengono a gruppi che sono usati per stabilire i tempi di scavo. Gli strumenti di scavo possono scavare blocchi che appartengono a certi gruppi +• Block behavior: Blocks may show a special behaviour and interact with other blocks when they belong to a particular group=• Comportamento del blocco: i blocchi possono mostrare un comportamento speciale e interagire con altri blocchi quando questi appartengono a un gruppo particolare +• Damage and armor: Objects and players have armor groups, weapons have damage groups. These groups determine damage. See also: “Basics > Weapons”=• Ferimento e armatura: gli oggetti e i personaggi possiedono gruppi di armatura, le armi possiedono gruppi di ferimento. Questi gruppi stabiliscono il ferimento. Si veda anche: “Nozioni di base > Armi” +• Other uses=• Altri usi +In the item help, many important groups are usually mentioned and explained.=Nell'aiuto sull'oggetto, solitamente sono nominati e spiegati molti gruppi importanti. +Glossary=Glossario +This is a list of commonly used terms in Minetest:=Questo è un elenco dei termini usati comunemente in Minetest: +Controls:=Controlli: +• Wielding: Holding an item in hand=• Impugnare: tenere un oggetto nella mano +• Pointing: Looking with the crosshair at something in range=• Puntare: guardare col mirino a qualcosa entro il suo raggio +• Dropping: Throwing an item or item stack to the ground=• Rilasciare: gettare a terra un oggetto o una pila di oggetti +• Punching: Attacking with left-click, is also used on blocks=• Colpire: attaccare cliccando col pulsante destro, si usa anche sui blocchi +• Sneaking: Walking slowly while (usually) avoiding to fall over edges=• Strisciare: camminare lentamente evitando (normalmente) di cadere dagli orgli +• Climbing: Moving up or down a climbable block=• Arrampicarsi: muoversi in alto o in basso su di un blocco arrampicabile +Blocks:=Blocchi: +• Block: Cubes that the worlds are made of=• Blocco: cubi di cui è fatto il mondo +• Mining/digging: Using a mining tool to break a block=• Scavare/minare: usare uno strumento di scavo per rompere un blocco +• Building/placing: Putting a block somewhere=• Costruire/piazzare: mettere un blocco da qualche parte +• Drop: Items you get after mining a block=• Rilascio: oggetti che ottenete dopo avere scavato un blocco +• Using a block: Right-clicking a block to access its special function=• Usare un blocco: cliccare col pulsante destro un blocco per accedere alla sua funzione speciale +Items:=Oggetti: +• Item: A single thing that players can possess=• Oggetto: una cosa singola che gli/le utenti possono possedere +• Item stack: A collection of items of the same kind=• Pila di oggetti: una raccolta di oggetti dello stesso tipo +• Maximum stack size: Maximum amount of items in an item stack=• Dimensione massima della pila: numero massimo di oggetti in una pila di oggetti +• Slot / inventory slot: Can hold one item stack=• Alloggo / alloggio dell'inventario: può contenere una pila di oggetti +• Inventory: Provides several inventory slots for storage=• Inventario: fornisce numerosi alloggi inventario per l'immagazzinamento +• Player inventory: The main inventory of a player=• Inventario utente: l'inventario principale di un* utente +• Tool: An item which you can use to do special things with when wielding=• Strumento: un oggetto che potete usare per fare cose speciali mentre lo impugnate +• Range: How far away things can be to be pointed by an item=• Raggio: quanto possono essere distanti le cose per poter essere puntate da un oggetto +• Mining tool: A tool which allows to break blocks=• Strumento di scavo: uno strumento che permette di rompere blocchi +• Craftitem: An item which is (primarily or only) used for crafting=• Oggetto da assemblaggio: un oggetto che è usato (solamente o principalmente) per assemblare +Gameplay:=Esperienza di gioco: +• “heart”: A single health symbol, indicates 2 HP=• “cuore”: un singolo simbolo di salute, indica 2 PS +• “bubble”: A single breath symbol, indicates 1 BP=• “bolla”: un singolo simbolo di ossigeno, indica 1 PO +• HP: Hit point (equals half 1 “heart”)=• PS: punto salute (pari a metà di 1 “cuore”) +• BP: Breath point, indicates breath when diving=• PO: punto ossigeno, indica l'ossigeno quando ci si immerge +• Mob: Computer-controlled enemy=• Mob: nemic* controllat* dal computer (abbreviazione di “mobile”) +• Crafting: Combining multiple items to create new ones=• Assemblare: combinare diversi oggetti per crearne di nuovi +• Crafting guide: A helper which shows available crafting recipes=• Guida di assemblaggio: una fonte di aiuto che mostra le ricette di assemblaggio disponibili +• Spawning: Appearing in the world=• Comparire: comparire nel mondo +• Respawning: Appearing again in the world after death=• Ricomparire: ricomparire ancora nel mondo dopo la morte +• Group: Puts similar things together, often affects gameplay=• Gruppo: mette assieme cose simili, spesso influenza l'esperienza di gioco +• noclip: Allows to fly through walls=• Modalità incorporea: permette di volare attraverso i muri +Interface=Interfaccia +• Hotbar: Inventory slots at the bottom=• Barra di uso frequente: alloggi dell'inventario sottostanti +• Statbar: Indicator made out of half-symbols, used for health and breath=• Barra delle caratteristiche: indicatore composto di mezzi-simboli, usato per salute e ossigeno +• Minimap: The map or radar at the top right=• Minimappa: la mappa o radar in alto a destra +• Crosshair: Seen in the middle, used to point at things=• Mirino: visibile al centro, usato per puntare le cose +Online multiplayer:=Gioco in rete: +• PvP: Player vs Player. If active, players can deal damage to each other=• UcU: Utente contro Utente (“PvP” in Inglese). Se attivata, gli/le utenti possono ferirsi a vicenda +• Griefing: Destroying the buildings of other players against their will=• Vandalizzare: (“griefing” in Inglese) distruggere le costruzioni degli/delle altr* utenti contro la loro volontà +• Protection: Mechanism to own areas of the world, which only allows the owners to modify blocks inside=• Protezione: meccanismo per possedere aree del mondo, che permette solo al/alla proprietari* di modificare i blocchi al loro interno +Technical terms:=Termini tecnici: +• Minetest: This game engine=• Minetest: questo motore di gioco +• Minetest Game: A subgame for Minetest by the Minetest developers=• Minetest Game: un gioco per Minetest degli sviluppatori di Minetest +• Subgame: A complete playing experience to be used in Minetest; such as a game or sandbox or similar=• Gioco: una esperienza di gioco completa da usarsi in Minetest; come un gioco, una sandbox o simili +• Mod: A single subsystem which adds or modifies functionality; is the basic building block of subgames and can be used to further enhance or modify them=• Modulo: un singolo sottosistema che aggiunge o modifica funzionalità; è il “mattone” di costruzione di base dei giochi e può essere usato per migliorarli o modificarli ulteriormente +• Privilege: Allows a player to do something=• Privilegio: permette a un* utente di fare qualcosa +• Node: Other word for “block”=• Nodo: parola alternativa per “blocco” +Settings=Impostazioni +There is a large variety of settings to configure Minetest. Pretty much every aspect can be changed that way.=Esiste una grande varietà di impostazioni per configurare Minetest. Quasi ogni aspetto può essere cambiato in quel modo. +These are a few of the most important gameplay settings:=Queste sono alcune delle impostazioni di gioco più importanti: +• Damage enabled (enable_damage): Enables the health and breath attributes for all players. If disabled, players are immortal=• Ferimento abilitato (enable_damage): abilita gli attributi di salute e ossigeno per tutt* gli/le utenti. Se è disabilitato, gli/le utenti sono immortali +• Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. The meaning depends on the subgame; usual changes are: Reduced dig times, easy access to almost all items, tools never wear off, etc.=• Modalità creativa (creative_mode): abilita lo stile di gioco sandbox incentrato sulla creatività piuttosto di quello impegnativo. Il significato dipende dal gioco; i cambiamenti comuni sono: tempi di scavo ridotti, accesso facile a quasi tutti gli oggetti, gli strumenti non si usurano mai, ecc. +• PvP (enable_pvp): Short for “Player vs Player”. If enabled, players can deal damage to each other=• UcU (enable_pvp): abbreviazione per “Utente contro Utente” (“PvP” in Inglese). Se abilitata, gli/le utenti possono ferirsi a vicenda. +For a full list of all available settings, use the “Advanced settings” dialog in the main menu.=Per un elenco completo delle impostazioni disponibili, usate il pulsante “Impostazioni avanzate” nel menu principale. +Movement modes=Modalità di movimento +If you have the required privileges, you can use up to three special movement modes. Using these may be considered cheating.=Se disponete dei privilegi necessari, potete usare fino a tre modalità speciali di movimento. Usarle potrebbe essere considerato barare. +Fast mode:=Modalità veloce: +• Description: Allows you to move much faster. Hold down the the “Use” key [E] to move faster. In the client configuration, you can further customize fast mode.=• Descrizione: vi consente di muovervi molto più velocemente. Tenete premuto il tasto “Usare” [E] per muovervi più velocemente. Potete personalizzare ulteriormente la modalità veloce nella configurazione del client. +• Default key: [J]=• Tasto predefinito: [J] +• Required privilege: fast=• Privilegio richiesto: fast (“veloce”) +Fly mode:=Modalità volo: +• Description: Gravity doesn't affect you and you can move freely in all directions. Use the jump key to rise and the sneak key to sink.=• Descrizione: la gravità non ha effetto su di voi e potete muovervi liberamente in tutte le direzioni. Usate il tasto di salto per ascendere e quello di strisciamento per discendere. +• Default key: [K]=• Tasto predefinito: [K] +• Required privilege: fly=• Privilegio richiesto: fly (“volo”) +Noclip mode:=Modalità incorporea: +• Description: Allows you to move through walls. Only works when fly mode is enabled, too.=• Descrizione: vi consente di passare attraverso i muri. Funziona solo quando è attivata anche la modalità volo. +• Default key: [H]=• Tasto predefinito: [H] +• Required privilege: noclip=• Privilegio richiesto: noclip (“nessun aggancio”) +Console=Console +With [F10] you can open and close the console. The main use of the console is to show the chat log and enter chat messages or server commands.=Con [F10] potete aprire e chiudere la console. L'uso principale della console è mostrare il registro della messaggistica, o inviare messaggi, o comandi per il sever. +Using the chat or server command key also opens the console, but it is smaller and will be closed after you sent a message.=La console può essere aperta anche col tasto della messaggistica, o con quello che precede l'invio dei comandi, ma è più piccola e verrà chiusa dopo che avrete inviato un messaggio. +Use the chat to communicate with other players. This requires you to have the “shout” privilege.=Usate la messaggistica per comunicare con gli/le altr* utenti. Ciò richiede il privilegio “shout” (“urlare”). +Just type in the message and hit [Enter]. Public chat messages can not begin with “/”.=Scrivete il messaggio e premete [Invio]. I messaggi inviati pubblicamente non possono iniziare con “/”. +You can send private messages: Say “/msg ” in chat to send “” which can only be seen by .=Potete inviare messaggi privati: scrivete “/msg Nome Messaggio” (senza virgolette) nell'area di messaggistica per mandare un “Messaggio” che potrà essere visto solo da “Nome”. +There are some special controls for the console:=Per la console esistono alcuni controlli speciali: +• [F10] Open/close console=• [F10] apre/chiude la console +• [Enter]: Send message or command=• [Invio]: manda un messaggio o un comando +• [Tab]: Try to auto-complete a partially-entered player name=• [Tab]: prova a completare automaticamente il nome di un* utente già parzialmente scritto +• [Ctrl]+[Left]: Move cursor to the beginning of the previous word=• [Ctrl] + [Sinistra]: sposta il cursore all'inizio della parola precedente +• [Ctrl]+[Right]: Move cursor to the beginning of the next word=• [Ctrl] + [Destra]: sposta il cursore all'inizio della parola successiva +• [Ctrl]+[Backspace]: Delete previous word=• [Ctrl] + [Backspace]: cancella la parola precedente +• [Ctrl]+[Delete]: Delete next word=• [Ctrl] + [Canc]: cancella la parola successiva +• [Ctrl]+[U]: Delete all text before the cursor=• [Ctrl] + [U]: cancella tutto il testo prima del cursore +• [Ctrl]+[K]: Delete all text after the cursor=• [Ctrl] + [K]: cancella tutto il testo dopo il cursore +• [Page up]: Scroll up=• [Pag su]: scorre indietro il testo +• [Page down]: Scroll down=• [Pag giù]: scorre in avanti il testo +There is also an input history. Minetest saves your previous console inputs which you can quickly access later:=Esiste anche uno storico dei contenuti inseriti. Minetest salva i vostri inserimenti precendenti nella console, in modo che possiate accedervi rapidamente più tardi: +• [Up]: Go to previous entry in history=• [Su]: va alla voce precedente nello storico +• [Down]: Go to next entry in history=• [Giù]: va alla voce successiva nello storico +Server commands=Comandi del server +Server commands (also called “chat commands”) are little helpers for advanced users. You don't need to use these commands when playing. But they might come in handy to perform some more technical tasks. Server commands work both in multi-player and single-player mode.=I comandi del server (chiamati anche “comandi di messaggistica”) sono piccoli aiutanti per gli/le utenti avanzat*. Quando giocate non vi serve usare questi comandi. Ma potrebbero esservi utili per eseguire compiti più avanzati. I comandi del server funzionano sia nella modalità di gioco locale che in quella in rete. +Server commands can be entered by players using the chat to perform a special server action. There are a few commands which can be issued by everyone, but some commands only work if you have certain privileges granted on the server. There is a small set of basic commands which are always available, other commands can be added by mods.=I comandi del server possono essere inseriti dai/dalle utenti usando la messaggistica per eseguire una azione speciale del server. Esistono un po' di comandi che possono essere usati da tutt*, ma alcuni comandi funzionano solo se sul server vi sono stati concessi certi privilegi. Esiste un piccolo numero di comandi di base che sono sempre disponibili, altri comandi possono essere aggiunti dai moduli. +To issue a command, simply type it like a chat message or press Minetest's command key (default: [/]). All commands have to begin with “/”, for example “/mods”. The Minetest command key does the same as the chat key, except that the slash is already entered.=Per inviare un comando, scrivetelo come se fosse un messaggio o premete il tasto di comando di Minetest (predefinito: [/]). Tutti i comandi devono iniziare con “/”, per esempio “/mods”. Il tasto di comando di Minetest si comporta come il tasto della messaggistica, eccetto il fatto che la sbarra “/” è già inserita. +Commands may or may not give a response in the chat log, but errors will generally be shown in the chat. Try it for yourselves: Close this window and type in the “/mods” command. This will give you the list of available mods on this server.=I comandi possono non dare una risposta nel registro della messaggistica, ma in genere gli errori saranno mostrati. Provate voi stess*: chiudete questa finestra e inviate il comando “/mods” (senza virgolette). Vi mostrerà l'elenco dei moduli disponibili su questo server. +“/help all” is a very important command: You get a list of all available commands on the server, a short explanation and the allowed parameters. This command is also important because the available commands often differ per server.=“/help all” è un comando molto importante: ottenete un elenco di tutti i comandi disponibili sul server, una breve spiegazione e i parametri consentiti. Questo comando è importante anche perhé i comandi disponibili spesso variano da server a server. +Commands are followed by zero or more parameters.=I comandi sono seguiti da zero o più parametri. +In the command reference, you see some placeholders which you need to replace with an actual value. Here's an explanation:=Nella guida di riferimento dei comandi, vedrete alcuni segnaposto che dovrete sostituire con un valore effettivo. Ecco una spiegazione: +• Text in greater-than and lower-than signs (e.g. “”): Placeholder for a parameter=• Testo racchiuso tra i simboli minore-di e maggiore-di (per es. “”): segnaposto per un parametro +• Anything in square brackets (e.g. “[text]”) is optional and can be omitted=• Tutto quello che è tra parentesi quadre (per esempio “[testo]”) è facoltativo è si può omettere +• Pipe or slash (e.g. “text1 | text2 | text3”): Alternation. One of multiple texts must be used (e.g. “text2”)=• Simbolo alternativo “|” barretta, o “/” sbarra (per es. “testo1 | testo2 | testo3”): alternanza. Si devono usare uno o più testi (per es. “testo2”) +• Parenthesis: (e.g. “(word1 word2) | word3”): Groups multiple words together, used for alternations=• Parentesi tonde (per es. “(parola1 parola2) | parola3”): raggruppano assieme più parole, usate per le alternanze +• Everything else is to be read as literal text=Tutto il resto va letto come testo letterale +Here are some examples to illustrate the command syntax:=Ecco alcuni esempi per illustrare la sintassi dei comandi: +• /mods: No parameters. Just enter “/mods”=• /mods: nessun parametro. Scrivete solo “/mods” +• /me : 1 parameter. You have to enter “/me ” followed by any text, e.g. “/me orders pizza”=• /me : un parametro. Dovete scrivere “/me ” seguito da del testo, per es. “/me ordina una pizza” +• /give : Two parameters. Example: “/give Player default:apple”=• /give : due parametri. Esempio: “/give Utente default:apple” +• /help [all|privs|]: Valid inputs are “/help”, “/help all”, “/help privs”, or “/help ” followed by a command name, like “/help time”=• /help [all|privs|]: i valori validi sono “/help”, “/help all”, “/help privs”, o “/help ” seguito dal nome di un comando, come “/help time” +• /spawnentity [,,]: Valid inputs include “/spawnentity boats:boat” and “/spawnentity boats:boat 0,0,0”=• /spawnentity [,,]: i valori validi includono “/spawnentity boats:boat” e “/spawnentity boats:boat 0,0,0” +Some final remarks:=Alcune osservazioni finali: +• For /give and /giveme, you need an itemstring. This is an internally used unique item identifier which you may find in the item help if you have the “give” or “debug” privilege=Per /give e /giveme, vi serve una stringa oggetto. Questa è un identificatore unico usato internamente che potreste trovare nell'aiuto sull'oggetto se avete il privilegio “give” o “debug” +• For /spawnentity you need an entity name, which is another identifier=• Per /spawnentity vi serve il nome di una entità, che è un altro identificatore +Privileges=Privilegi +Each player has a set of privileges, which differs from server to server. Your privileges determine what you can and can't do. Privileges can be granted and revoked from other players by any player who has the privilege called “privs”.=Ogni utente ha un numero di privilegi, che variano da server a server. I vostri privilegi stabiliscono cosa potete e non potete fare. I privilegi possono essere concessi e revocati ad altr* utenti da qualunque utente che abbia il privilegio chiamato “privs”. +On a multiplayer server with the default configuration, new players start with the privileges called “interact” and “shout”. The “interact” privilege is required for the most basic gameplay actions such as building, mining, using, etc. The “shout” privilege allows to chat.=Su di un server in rete avente la configurazione predefinita, i/le nuov* utenti iniziano coi privilegi chiamati “interact” (“interagire”) e “shout” (“urlare”). Il privilegio “interact” è necessario per le azioni di gioco di base, come costruire, scavare, usare, ecc. Il privilegio “shout” permette di conversare. +There is a small set of core privileges which you'll find on every server, other privileges might be added by mods.=Esiste un piccolo numero di privilegi fondamentali che troverete su ogni server, altri privilegi potrebbero essere aggiunti dai moduli. +To view your own privileges, issue the server command “/privs”.=Per vedere i vostri privilegi, inviate il comando “/privs”. +Here are a few basic privilege-related commands:=Ecco alcuni comandi di base legati ai privilegi: +• /privs: Lists your privileges=• /privs: elenca i vostri privilegi +• /privs : Lists the privileges of =• /privs : elenca i privilegi di +• /help privs: Shows a list and description about all privileges=• /help privs: mostra un elenco e una descrizione di tutti i privilegi +Players with the “privs” privilege can modify privileges at will:=Gli/le utenti con il privilegio “privs” possono cambiare i privilegi a volontà: +• /grant : Grant to =• /grant : concede a +• /revoke : Revoke from =• /revoke : revoca a +In single-player mode, you can use “/grant singleplayer all” to unlock all abilities (which is often considered cheating).=Nella modalità di gioco locale, potete usare “/grant singleplayer all” per sbloccare tutte le abilità (che spesso è considerato barare). +Light=Luce +As the world is entirely block-based, so is the light in the world. Each block has its own brightness. The brightness of a block is expressed in a “light level” which ranges from 0 (total darkness) to 15 (as bright as the sun).=Essendo il mondo completamente basato su blocchi, lo è anche la luce nel mondo. Ogni blocco ha la propria luminosità. La luminosità di un blocco è espressa in un “livello di luce” che va da 0 (oscurità completa) a 15 (luminoso quanto il sole). +There are two types of light: Sunlight and artificial light.=Esistono due tipi di luce: la luce solare e la luce artificiale. +Artificial light is emitted by luminous blocks. Artificial light has a light level from 1-14.=La luce artificiale è emessa dai blocchi luminosi. La luce artificiale ha un livello di luce tra 1 e 14. +Sunlight is the brightest light and always goes perfectly straight down from the sky at each time of the day. blocks. At night, the sunlight will become moonlight instead, which still provides a small amount of light. The light level of sunlight is 15.=La luce solare è quella più luminosa e discende dal cielo perfettamente dritta a ogni ora del giorno. Di notte, la luce solare diverrà invece luce lunare, che fornisce comunque un po' di luce. Il livello di luce della luce solare è 15. +Blocks have 3 levels of transparency:=I blocchi hanno tre livelli di trasparenza: +• Transparent: Sunlight goes through limitless, artificial light goes through with losses=• Trasparente: la luce solare li attraversa senza perdite, la luce artificiale li attraversa con delle perdite +• Semi-transparent: Sunlight and artificial light go through with losses=• Semi-trasparenti: la luce solare e la luce artificiale li attraversano con delle perdite +• Opaque: No light passes through=• Opachi: nessuna luce li attraversa +Artificial light will lose one level of brightness for each transparent or semi-transparent block it passes through, until only darkness remains (image 1).=La luce artificiale perderà un livello di luminosità per ciascun nodo trasparente o semi-trasparente che attraversa, finché resterà solo oscurità (immagine 1). +Sunlight will preserve its brightness as long it only passes fully transparent blocks. When it passes through a semi-transparent block, it turns to artificial light. Image 2 shows the difference.=La luce solare conserverà la propria luminosità finché attraverserà solo blocchi trasparenti. Quando passa attraverso un blocco semi-trasparente, si trasforma in luce artificiale. L'immagine 2 mostra la differenza. +Note that “transparency” here only means that the block is able to carry brightness from its neighboring blocks. It is possible for a block to be transparent to light but you can't see trough the other side.=Si noti che per “trasparenza” qui si intende solo che il blocco può trasferire la luminosità ai nodi vicini. È possibile che un blocco sia trasparente alla luce, ma che voi non possiate guardarci attraverso. +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. +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 +• If you follow the sun, X increases=• Se seguite il sole, X aumenta +• If you go to the reverse direction, X decreases=• Se andate nella direzione opposta, X diminuisce +• Follow the sun, then go right: Z increases=• Seguite il sole, poi andate a destra: Z aumenta +• Follow the sun, then go left: Z decreases=• Seguite il sole, poi andate a sinistra: Z diminuisce +• The side length of a full cube is 1=• La larghezza di un cubo completo è pari a 1 +You can view your current position in the debug screen (open with [F5]). This is considered cheating in some games.=Potete vedere la vostra posizione attuale nella schermata di debug (visibile con [F5]). In alcuni giochi questo è considerato barare. diff --git a/mods/HELP/mcl_doc_basics/mcl_extension.lua b/mods/HELP/mcl_doc_basics/mcl_extension.lua new file mode 100644 index 000000000..630ba9829 --- /dev/null +++ b/mods/HELP/mcl_doc_basics/mcl_extension.lua @@ -0,0 +1,97 @@ +local S = minetest.get_translator("mcl_doc_basics") + +doc.add_entry("advanced", "creative", { + name = S("Creative Mode"), + data = { text = +S("Enabling Creative Mode in MineClone 2 applies the following changes:").."\n\n".. + +S("• You keep the things you've placed").."\n".. +S("• Creative inventory is available to obtain most items easily").."\n".. +S("• Hand breaks all default blocks instantly").."\n".. +S("• Greatly increased hand pointing range").."\n".. +S("• Mined blocks don't drop items").."\n".. +S("• Items don't get used up").."\n".. +S("• Tools don't wear off").."\n".. +S("• You can eat food whenever you want").."\n".. +S("• You can always use the minimap (including radar mode)").."\n\n".. + +S("Damage is not affected by Creative Mode, it needs to be disabled seperately.") +}}) + +doc.add_entry("basics", "mobs", { + name = S("Mobs"), + data = { text = +S("Mobs are the living beings in the world. This includes animals and monsters.").."\n\n".. + +S("Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some blocks only spawn on particular blocks (like grass blocks).").."\n\n".. + +S("Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.").."\n\n".. + +S("Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.") +}}) + +doc.add_entry("basics", "animals", { + name = S("Animals"), + data = { text = +S("Animals are peaceful beings which roam the world aimlessly. You can feed, tame and breed them.").."\n\n".. + +S("Feeding:").."\n".. +S("Each animal has its own taste for food and doesn't just accept any food. To feed, hold an item in your hand and rightclick the animal.").."\n".. +S("Animals are attraced to the food they like and follow you as long you hold the food item in hand.").."\n".. +S("Feeding an animal has three uses: Taming, healing and breeding.").."\n".. +S("Feeding heals animals instantly, depending on the quality of the food item.").."\n\n".. + +S("Taming:").."\n".. +S("A few animals can be tamed. You can generally do more things with tamed animals and use other items on them. For example, tame horses can be saddled and tame wolves fight on your side.").."\n\n".. + +S("Breeding:").."\n".. +S("When you have fed an animal up to its maximum health, then feed it again, you will activate “Love Mode” and many hearts appear around the animal.").."\n".. +S("Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.").."\n\n".. + +S("Baby animals:").."\n".. +S("Baby animals are just like their adult couterparts, but they can't be fed, tamed or bred and don't drop anything when they die. They grow to adults after a short time.") + +}}) + +doc.add_entry("basics", "hunger", { + name = S("Hunger"), + data = { text = +S("Hunger affects your health and your ability to sprint. Hunger is not in effect when damage is disabled.").."\n\n".. + +S("Core hunger rules:").."\n\n".. +S("• You start with 20/20 hunger points (more points = less hungry)").."\n".. +S("• Actions like combat, jumping, sprinting, etc. decrease hunger points").."\n".. +S("• Food restores hunger points").."\n".. +S("• If your hunger bar decreases, you're hungry").."\n".. +S("• At 18-20 hunger points, you regenerate 1 HP every 4 seconds").."\n".. +S("• At 6 hunger points or less, you can't sprint").."\n".. +S("• At 0 hunger points, you lose 1 HP every 4 seconds (down to 1 HP)").."\n".. +S("• Poisonous food decreases your health").."\n\n".. + + +S("Details:").."\n\n".. +S("You have 0-20 hunger points, indicated by 20 drumstick half-icons above the hotbar. You also have an invisible attribute: Saturation.").."\n".. +S("Hunger points reflect how full you are while saturation points reflect how long it takes until you're hungry again.").."\n\n".. + +S("Each food item increases both your hunger level as well your saturation.").."\n".. +S("Food with a high saturation boost has the advantage that it will take longer until you get hungry again.").."\n".. +S("A few food items might induce food poisoning by chance. When you're poisoned, the health and hunger symbols turn sickly green. Food poisoning drains your health by 1 HP per second, down to 1 HP. Food poisoning also drains your saturation. Food poisoning goes away after a while or when you drink milk.").."\n\n".. + +S("You start with 5 saturation points. The maximum saturation is equal to your current hunger level. So with 20 hunger points your maximum saturation is 20. What this means is that food items which restore many saturation points are more effective the more hunger points you have. This is because at low hunger levels, a lot of the saturation boost will be lost due to the low saturation cap.").."\n".. +S("If your saturation reaches 0, you're hungry and start to lose hunger points. Whenever you see the hunger bar decrease, it is a good time to eat.").."\n\n".. + +S("Saturation decreases by doing things which exhaust you (highest exhaustion first):").."\n".. +S("• Regenerating 1 HP").."\n".. +S("• Suffering food poisoning").."\n".. +S("• Sprint-jumping").."\n".. +S("• Sprinting").."\n".. +S("• Attacking").."\n".. +S("• Taking damage").."\n".. +S("• Swimming").."\n".. +S("• Jumping").."\n".. +S("• Mining a block").."\n\n".. + +S("Other actions, like walking, do not exaust you.") + +}}) + diff --git a/mods/HELP/mcl_doc_basics/mod.conf b/mods/HELP/mcl_doc_basics/mod.conf index 8138f7d82..525619045 100644 --- a/mods/HELP/mcl_doc_basics/mod.conf +++ b/mods/HELP/mcl_doc_basics/mod.conf @@ -1 +1,3 @@ -name = doc_basics +name = mcl_doc_basics +depends = doc +description = Adds some help texts explaining how to use MineClone 2. From 6511394b692ca533e04ac5fc36bd06b63393299b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Mar 2019 14:30:25 +0100 Subject: [PATCH 217/379] Add some mcl_doc_basics translations --- mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr index cc02b02c4..eb1270cff 100644 --- a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr @@ -20,6 +20,17 @@ This is a very brief introduction to the basic gameplay:=Hier ist eine sehr kurz • Use a crafting guide mod to learn crafting recipes or visit =• Benutzen Sie eine Mod mit Fertigungsführer, um die Fertigungsrezepte zu erlernen oder besuchen Sie • Read entries in this help to learn the rest=• Lesen Sie Einträge in dieser Hilfe, um den Rest zu lernen • [Esc] to close this window=• [Esc], um dieses Fenster zu schließen +How to play:=Spielanleitung +• Punch a tree trunk until it breaks and collect wood=• Hauen Sie einen Baumstamm, bis er bricht und sammeln Sie Holz auf +• Place the wood into the 2×2 grid (your “crafting grid”) in your inventory menu and craft 4 wood planks=• Platzieren Sie das Holz in das 2×2-Gitter (Ihr „Fertigungsgitter) in Ihrem Inventar und fertigen Sie 4 Holzplanken +• Place them in a 2×2 shape in the crafting grid to craft a crafting table=• Platzieren Sie sie in eine 2×2-Form im Fertigungsgitter, um eine Werkbank zu errichten +• Place the crafting table on the ground=• Platzieren Sie die Werkbank auf den Boden +• Rightclick it for a 3×3 crafting grid=Rechtsklicken Sie sie für ein 3×3-Fertigungsgitter +• Use the crafting guide (book icon) to learn all the possible crafting recipes=• Benutzen Sie die Bauanleitung (Buchsymbol) um alle möglichen Fertigungsrezepte zu lernen +• Craft a wooden pickaxe so you can dig stone=• Fertigen Sie eine Holzspitzhacke, damit Sie Stein graben können +• Different tools break different kinds of blocks. Try them out!=• Verschiedene Werkzeuge können verschiedene Blöcke brechen. Probieren Sie einfach! +• Read entries in this help to learn the rest=• Lesen Sie Einträge in dieser Hilfe, um den Rest zu lernen +• Continue playing as you wish. There's no goal. Have fun!=• Spielen Sie weiter, so wie sie wollen. Es gibt kein Ziel. Viel Spaß! Minetest=Minetest Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).=Minetest ist eine freie Spiel-Engine für Spiele auf Voxelbasis, inspiriert von InfiniMiner, Minecraft, und so weiter. Minetest wurde ursprünglich erfunden von Perttu Ahola (alias „celeron55“). 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 can, however, be much more complex than this.=Der Spieler wird in eine große Welt aus Würfeln bzw. Blöcken geworfen. Aus diesen Würfeln besteht die Landschaft; sie können aufgesammelt und wieder platziert werden. Mit den aufgesammelten Gegenständen können neue Werkzeuge und andere Dinge gefertigt werden. Spiele in Minetest können aber viel komplexer sein. From d191c3ac4869ef768f1a0024a12eacfd5c3bc494 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Mar 2019 15:16:58 +0100 Subject: [PATCH 218/379] Update German basic help translation --- .../locale/mcl_doc_basics.de.tr | 69 ++++++++++++++++++- mods/HELP/mcl_doc_basics/locale/template.txt | 65 +++++++++++++++++ mods/HELP/mcl_doc_basics/mcl_extension.lua | 2 +- 3 files changed, 133 insertions(+), 3 deletions(-) diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr index eb1270cff..dd4e96fcb 100644 --- a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr @@ -7,9 +7,10 @@ Quick start=Schnellstart This is a very brief introduction to the basic gameplay:=Hier ist eine sehr kurze Einführung ins Spiel: • Move mouse to look=• Mausbewegung zum Umsehen • [W], [A], [S] and [D] to move=• [W], [A], [S] und [D] zum Bewegen +• [E] to sprint=• [E] zum Sprinten • [Space] to jump or move upwards=• [Leertaste] zum Springen oder für Aufwärtsbewegung • [Shift] to sneak or move downwards=• [Umschalt] zum Schleichen oder für Abwärtsbewegung -• Mouse wheel or [0]-[9] to select item=• Mausrad oder [0]-[9], um Gegenstand zu wählen +• Mouse wheel or [1]-[9] to select item=• Mausrad oder [1]-[9], um Gegenstand zu wählen • Left-click to mine blocks or attack=• Linksklick, um Blöcke abzubauen oder anzugreifen • Recover from swings to deal full damage=• Warten Sie Schwünge ganz ab, um vollen Schaden anzurichten • Right-click to build blocks and use things=• Rechtsklick, um Blöcke zu bauen und Dinge zu benutzen @@ -51,6 +52,7 @@ Basic movement:=Bewegen: • A: Move to the left=• A: Links • D: Move to the right=• D: Rechts • S: Move backwards=• S: Rückwärts +• E: Sprint=• E: Sprint While standing on solid ground:=Auf festem Boden: • Space: Jump=• Leertaste: Springen • Shift: Sneak=• Umschalt: Schleichen @@ -211,7 +213,7 @@ At the bottom of the screen you see some squares. This is called the “hotbar You can change the selected item with the mouse wheel or the keyboard.=Sie können die gewählten Gegenstände mit dem Mausrad oder der Tastatur wechseln. • Select previous item in hotbar: [Mouse wheel up] or [B]=• Vorherigen Gegenstand in Schnellleiste wählen: [Mausrad rauf] oder [B] • Select next item in hotbar: [Mouse wheel down] or [N]=• Vorherigen Gegenstand in Schnellleiste wählen: [Mausrad runter] oder [N] -• Select item in hotbar directly: [0]-[9]=• Gegenstand direkt in Schnellleiste wählen: [0]-[9] +• Select item in hotbar directly: [1]-[9]=• Gegenstand direkt in Schnellleiste wählen: [1]-[9] The selected item is also your wielded item.=Der gewählte Gegenstand ist auch Ihr gehaltener Gegenstand. Minimap=Übersichtskarte Press [F9] to make a minimap appear on the top right. The minimap helps you to find your way around the world. Press it again to select different minimap modes and zoom levels. The minimap also shows the positions of other players.=Drücken Sie [F9], um eine Übersichtskarte rechts oben erscheinen zu lassen. Die Übersichtskarte hilft Ihnen, sich in der Welt zu orientieren. @@ -444,3 +446,66 @@ Pitch movement mode:=Nick-Bewegungsmodus: • Description: If this mode is activated, the movement keys will move you relative to your current view pitch (vertical look angle) when you're in a liquid or in fly mode.=• Wenn dieser Modus aktiviert ist, werden die Bewegungstasten Sie relativ zu Ihrem jetzigen Nickwinkel (vertikaler Blickwinkel) bewegen, wenn Sie sich in einer Flüssigkeit befinden oder der Flugmodus aktiv ist. • Default key: [L]=• Standardtaste: [L] • No privilege required=• Kein Privileg nötig + +Creative Mode=Kreativmodus +Enabling Creative Mode in MineClone 2 applies the following changes:=Der Kreativmodus in MineClone 2 nimmt die folgenden Änderungen vor: +• You keep the things you've placed=• Sie behalten die Dinge, die Sie platzieren +• Creative inventory is available to obtain most items easily=• Das Kreativinventar ist verfügbar, mit dem Sie die meisten Dinge leicht erhalten +• Hand breaks all default blocks instantly=• Hand zerbricht alle Standardblöcke sofort +• Greatly increased hand pointing range=• Stark erhöhte Handzeigereichweite +• Mined blocks don't drop items=• Gegrabene Blöcke werfen nichts ab +• Items don't get used up=• Gegenstände werden nicht verbraucht +• Tools don't wear off=• Werkzeuge nutzen sich nicht ab +• You can eat food whenever you want=• Sie können essen, wann immer Sie wollen +• You can always use the minimap (including radar mode)=• Sie können die Übersichtskarte immer benutzen (auch den Radarmodus) +Damage is not affected by Creative Mode, it needs to be disabled separately.=Schaden wird vom Kreativmodus nicht beeinflusst, er muss separat ausgeschaltet werden. +Mobs=Mobs +Mobs are the living beings in the world. This includes animals and monsters.=Mobs sind die lebenden Kreaturen in der Welt. Das schließt Tiere und Monster ein. +Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some blocks only spawn on particular blocks (like grass blocks).=Monster tauchen zufällig in der Welt auf. Das nennt man „spawnen“. Jeder Mobart taucht auf bestimmten Blocktypen bei einer bestimmten Helligkeit auf. Die Höhe spielt auch eine Rolle. Friedliche Mobs neigen dazu, bei Tageslicht zu spawnen, während feindliche Mobs die Dunkelheit bevorzugen. Die meisten Mobs können auf jedem festen Block spawnen, aber einige Blöcke können nur auf bestimmten Blöcken spawnen (wie Grasblöcke). +Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.=Wie Spieler haben Mobs Trefferpunkte und manchmal auch Rüstungspunkte (was bedeutet, dass Sie bessere Waffen benötigen, um überhaupt Schaden anrichten zu können). Auch wie bei Spielern können feindliche Mobs direkt angreifen oder aus der Ferne. Mobs können nach ihrem Tod zufällige Gegenstände abwerfen. +Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.=Die meisten Tiere wandern in der Welt ziellos umher, während die meisten feindlichen Mobs die Spieler jagen. Tiere können gefüttert, gezähmt und gezüchtet werden. +Animals=Tiere +Animals are peaceful beings which roam the world aimlessly. You can feed, tame and breed them.=Tiere sind friedliche Wesen, die in der Welt ziellos umherwandern. Sie können sie füttern, zähmen und züchten. +Feeding:=Füttern: +Each animal has its own taste for food and doesn't just accept any food. To feed, hold an item in your hand and rightclick the animal.=Jedes Tier hat eine eigene Vorliebe für Nahrung und akzeptiert nicht einfach jedes Lebensmittel. Zum Füttern halten Sie einen Gegenstand in der Hand und rechtsklicken Sie das Tier. +Animals are attraced to the food they like and follow you as long you hold the food item in hand.=Tiere werden von Lebensmitteln, die sie mögen, magisch angezogen und sie folgen Ihnen, solange Sie einen solchen Gegenstand halten. +Feeding an animal has three uses: Taming, healing and breeding.=Füttern hat drei Zwecke: Zähmen, heilen und züchten. +Feeding heals animals instantly, depending on the quality of the food item.=Füttern heilt Tiere sofort, abhängig von der Qualität des Lebensmittels. +Taming:=Zähmen: +A few animals can be tamed. You can generally do more things with tamed animals and use other items on them. For example, tame horses can be saddled and tame wolves fight on your side.=Ein paar Tiere können gezähmt werden. Sie können grundsätzlich mehr Sachen mit gezähmten Tieren machen und andere Gegenstände an ihnen benutzen. Zum Beispiel können zahme Pferde aufgesattelt werden und Wölfe dazu gebracht werden, an Ihrer Seite zu kämpfen. +Breeding:=Züchten: +When you have fed an animal up to its maximum health, then feed it again, you will activate “Love Mode” and many hearts appear around the animal.=Wenn Sie ein Tier bis zur vollen Gesundheit geheilt haben und es erneut füttern, werden Sie den „Liebesmodus“ aktivieren. Viele Herzen tauchen um das Tier herum auf. +Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.=Zwei Tiere der gleichen Art werden sich paaren, wenn sie im Liebesmodus sind und nah beieinander stehen. Kurz darauf wird ein Junges auftauchen. +Baby animals:=Junge: +Baby animals are just like their adult couterparts, but they can't be fed, tamed or bred and don't drop anything when they die. They grow to adults after a short time.=Junge sind wie ihre erwachsenen Artgenossen, aber sie können nicht gefüttert, gezähmt oder gezüchtet werden und werfen nichts ab, wenn sie sterben. Nach einer kurzen Zeit werden sie erwachsen. +Hunger=Hunger +Hunger affects your health and your ability to sprint. Hunger is not in effect when damage is disabled.=Hunger beeinflusst Ihre Gesundheit und Ihre Fähigkeit, zu sprinten. +Core hunger rules:=Haupthungerregeln: +• You start with 20/20 hunger points (more points @= less hungry)=• Sie beginnen mit 20/20 Hungerpunkten (mehr Punkte @= weniger hungrig) +• Actions like combat, jumping, sprinting, etc. decrease hunger points=• Aktionen wie kämpfen, springen, sprinten, usw. verringern die Hungerpunkte +• Food restores hunger points=• Nahrung erhöht die Hungerpunkte +• If your hunger bar decreases, you're hungry=• Wenn sich Ihre Hungerleiste verringert, sind Sie hungrig +• At 18-20 hunger points, you regenerate 1 HP every 4 seconds=• Bei 18-20 Hungerpunkten erhalten Sie 1 TP alle 4 Sekunden +• At 6 hunger points or less, you can't sprint=• Bei 6 Hungerpunkten oder weniger können Sie nicht sprinten +• At 0 hunger points, you lose 1 HP every 4 seconds (down to 1 HP)=• Bei 0 Hungerpunkten verlieren Sie 1 TP alle 4 Sekunden (bis nur 1 TP bleibt) +• Poisonous food decreases your health=• Giftige oder verpestete Nahrung verringert Ihre Gesundheit +Details:=Details: +You have 0-20 hunger points, indicated by 20 drumstick half-icons above the hotbar. You also have an invisible attribute: Saturation.=Sie haben 0-20 Hungerpunkte, was durch 20 Fleischkeulen-Halbsymbole über der Schnellleiste dargestellt wird. +Hunger points reflect how full you are while saturation points reflect how long it takes until you're hungry again.=Hungerpunkte reflektieren, wie satt Sie sind, während Sättigung reflektiert, wie lange es noch braucht, bis Sie wieder hungrig sind. +Each food item increases both your hunger level as well your saturation.=Jedes Lebensmittel erhöht Ihre Hunger- als auch Ihre Sättigungspunkte. +Food with a high saturation boost has the advantage that it will take longer until you get hungry again.=Nahrung mit einer hohen Sättigung hat den Vorteil, dass es länger dauern wird, bis Sie wieder hungrig sind. +A few food items might induce food poisoning by chance. When you're poisoned, the health and hunger symbols turn sickly green. Food poisoning drains your health by 1 HP per second, down to 1 HP. Food poisoning also drains your saturation. Food poisoning goes away after a while or when you drink milk.=Ein paar Lebensmittel können eine Lebensmittelvergiftung verursachen. Wenn Sie vergiftet sind, werden die Gesundheits- und Hungersymbole eine ungesund grüne Farbe annehmen. Die Lebensmittelvergiftung verringert Ihre Gesundheit um 1 TP pro Sekunde, bis nur noch 1 TP verbleibt. Eine Lebensmittelvergiftung reduziert auch Ihre Sättigung. Eine Lebensmittelvergiftung vergeht nach einer Weile, oder, wenn Sie Milch trinken. +You start with 5 saturation points. The maximum saturation is equal to your current hunger level. So with 20 hunger points your maximum saturation is 20. What this means is that food items which restore many saturation points are more effective the more hunger points you have. This is because at low hunger levels, a lot of the saturation boost will be lost due to the low saturation cap.=Sie beginnen mit 5 Sättigungspunkten. Ihre höchstmögliche Sättigung ist gleich der Anzahl Ihrer Hungerpunkte. Wenn Sie also 20 Hungerpunkte haben, ist Ihre höchstmögliche Sättigung 20. Das bedeutet, dass Lebensmittel mit einer hohen Sättigung effektiver sind, je mehr Hungerpunkte Sie haben. Das ist deshalb so, weil bei wenigen Hungerpunkten ein Großteil des Sättigungsbonus aufgrund der niedrigen Maximalsättigung verloren gehen wird. +If your saturation reaches 0, you're hungry and start to lose hunger points. Whenever you see the hunger bar decrease, it is a good time to eat.=Wenn Ihre Sättigung 0 erreicht, haben Sie Hunger und werden allmählich Hungerpunkte verlieren. Wenn Sie sehen, dass die Hungerleiste sich verringert, ist es ein guter Zeitpunkt, etwas zu essen. +Saturation decreases by doing things which exhaust you (highest exhaustion first):=Die Sättigung verringert sich, wenn Sie Dinge tun, die Sie erschöpfen (höchste Erschöpfung zuerst): +• Regenerating 1 HP=• 1 TP regenerieren +• Suffering food poisoning=• Lebensmittelvergiftung erleiden +• Sprint-jumping=• Beim sprinten springen +• Sprinting=• Sprinten +• Attacking=• Angreifen +• Taking damage=• Schaden nehmen +• Swimming=• Schwimmen +• Jumping=• Springen +• Mining a block=• Einen Block abbauen +Other actions, like walking, do not exaust you.=Andere Aktionen, wie gehen, erschöpfen Sie nicht. +If you have a map item in any of your hotbar slots, you can use the minimap.=Wenn Sie eine Karte in einem beliebigen Platz der Schnellleiste haben, können Sie die Übersichtskarte benutzen. diff --git a/mods/HELP/mcl_doc_basics/locale/template.txt b/mods/HELP/mcl_doc_basics/locale/template.txt index 0fcc0f3b0..51f09bae1 100644 --- a/mods/HELP/mcl_doc_basics/locale/template.txt +++ b/mods/HELP/mcl_doc_basics/locale/template.txt @@ -402,6 +402,8 @@ The values for X, Y and Z work like this:= • Follow the sun, then go left: Z decreases= • The side length of a full cube is 1= You can view your current position in the debug screen (open with [F5]). This is considered cheating in some games.= + +# MCL2 extensions Creative Mode= Enabling Creative Mode in MineClone 2 applies the following changes:= • You keep the things you've placed= @@ -463,3 +465,66 @@ Saturation decreases by doing things which exhaust you (highest exhaustion first • Jumping= • Mining a block= Other actions, like walking, do not exaust you.= +# textdomain: mcl_doc_basics +Creative Mode= +Enabling Creative Mode in MineClone 2 applies the following changes:= +• You keep the things you've placed= +• Creative inventory is available to obtain most items easily= +• Hand breaks all default blocks instantly= +• Greatly increased hand pointing range= +• Mined blocks don't drop items= +• Items don't get used up= +• Tools don't wear off= +• You can eat food whenever you want= +• You can always use the minimap (including radar mode)= +Damage is not affected by Creative Mode, it needs to be disabled separately.= +Mobs= +Mobs are the living beings in the world. This includes animals and monsters.= +Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some blocks only spawn on particular blocks (like grass blocks).= +Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.= +Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.= +Animals= +Animals are peaceful beings which roam the world aimlessly. You can feed, tame and breed them.= +Feeding:= +Each animal has its own taste for food and doesn't just accept any food. To feed, hold an item in your hand and rightclick the animal.= +Animals are attraced to the food they like and follow you as long you hold the food item in hand.= +Feeding an animal has three uses: Taming, healing and breeding.= +Feeding heals animals instantly, depending on the quality of the food item.= +Taming:= +A few animals can be tamed. You can generally do more things with tamed animals and use other items on them. For example, tame horses can be saddled and tame wolves fight on your side.= +Breeding:= +When you have fed an animal up to its maximum health, then feed it again, you will activate “Love Mode” and many hearts appear around the animal.= +Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.= +Baby animals:= +Baby animals are just like their adult couterparts, but they can't be fed, tamed or bred and don't drop anything when they die. They grow to adults after a short time.= +Hunger= +Hunger affects your health and your ability to sprint. Hunger is not in effect when damage is disabled.= +Core hunger rules:= +• You start with 20/20 hunger points (more points @= less hungry)= +• Actions like combat, jumping, sprinting, etc. decrease hunger points= +• Food restores hunger points= +• If your hunger bar decreases, you're hungry= +• At 18-20 hunger points, you regenerate 1 HP every 4 seconds= +• At 6 hunger points or less, you can't sprint= +• At 0 hunger points, you lose 1 HP every 4 seconds (down to 1 HP)= +• Poisonous food decreases your health= +Details:= +You have 0-20 hunger points, indicated by 20 drumstick half-icons above the hotbar. You also have an invisible attribute: Saturation.= +Hunger points reflect how full you are while saturation points reflect how long it takes until you're hungry again.= +Each food item increases both your hunger level as well your saturation.= +Food with a high saturation boost has the advantage that it will take longer until you get hungry again.= +A few food items might induce food poisoning by chance. When you're poisoned, the health and hunger symbols turn sickly green. Food poisoning drains your health by 1 HP per second, down to 1 HP. Food poisoning also drains your saturation. Food poisoning goes away after a while or when you drink milk.= +You start with 5 saturation points. The maximum saturation is equal to your current hunger level. So with 20 hunger points your maximum saturation is 20. What this means is that food items which restore many saturation points are more effective the more hunger points you have. This is because at low hunger levels, a lot of the saturation boost will be lost due to the low saturation cap.= +If your saturation reaches 0, you're hungry and start to lose hunger points. Whenever you see the hunger bar decrease, it is a good time to eat.= +Saturation decreases by doing things which exhaust you (highest exhaustion first):= +• Regenerating 1 HP= +• Suffering food poisoning= +• Sprint-jumping= +• Sprinting= +• Attacking= +• Taking damage= +• Swimming= +• Jumping= +• Mining a block= +Other actions, like walking, do not exaust you.= +If you have a map item in any of your hotbar slots, you can use the minimap.= diff --git a/mods/HELP/mcl_doc_basics/mcl_extension.lua b/mods/HELP/mcl_doc_basics/mcl_extension.lua index 630ba9829..912cb119a 100644 --- a/mods/HELP/mcl_doc_basics/mcl_extension.lua +++ b/mods/HELP/mcl_doc_basics/mcl_extension.lua @@ -15,7 +15,7 @@ S("• Tools don't wear off").."\n".. S("• You can eat food whenever you want").."\n".. S("• You can always use the minimap (including radar mode)").."\n\n".. -S("Damage is not affected by Creative Mode, it needs to be disabled seperately.") +S("Damage is not affected by Creative Mode, it needs to be disabled separately.") }}) doc.add_entry("basics", "mobs", { From 23ccd197ee8faf6cb27eb791ef62eb230f656203 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Mar 2019 16:36:59 +0100 Subject: [PATCH 219/379] Fix some factual mistakes in mcl_doc_basics --- mods/HELP/mcl_doc_basics/init.lua | 46 +++---------- .../locale/mcl_doc_basics.de.tr | 18 ++--- mods/HELP/mcl_doc_basics/locale/template.txt | 68 +------------------ mods/HELP/mcl_doc_basics/mcl_extension.lua | 4 +- 4 files changed, 22 insertions(+), 114 deletions(-) diff --git a/mods/HELP/mcl_doc_basics/init.lua b/mods/HELP/mcl_doc_basics/init.lua index 7da389b16..94d627456 100644 --- a/mods/HELP/mcl_doc_basics/init.lua +++ b/mods/HELP/mcl_doc_basics/init.lua @@ -38,7 +38,6 @@ S("• Recover from swings to deal full damage").."\n".. S("• Right-click to build blocks and use things").."\n".. S("• [I] for the inventory").."\n".. S("• First items in inventory appear in hotbar below").."\n".. -S("• [F9] for the minimap").."\n".. S("• Read entries in this help to learn the rest").."\n".. S("• [Esc] to close this window").."\n\n".. @@ -194,9 +193,9 @@ S("Items have several properties, including the following:").."\n\n".. S("• Maximum stack size: Number of items which fit on 1 item stack").."\n".. S("• Pointing range: How close things must be to be pointed while wielding this item").."\n".. S("• Group memberships: See “Basics > Groups”").."\n".. -S("• May be used for crafting or cooking").."\n\n".. +S("• May be used for crafting or cooking"), -S("A dropped item stack can be collected by punching it."), +-- MCL2: Items cannot be taken by punching images = {{image="doc_basics_inventory_detail.png"}, {image="doc_basics_items_dropped.png"}}, }}) @@ -236,7 +235,7 @@ doc.add_entry("basics", "point", { name = S("Pointing"), data = { text = -S("“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, dropped items, players, computer enemies and objects.").."\n\n".. +S("“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, players, computer enemies and objects.").."\n\n".. S("To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.").."\n\n".. @@ -281,50 +280,20 @@ S("• Group memberships: Group memberships are used to determine mining propert images = {{image="doc_basics_nodes.png"}} }}) --- TODO: Oh jeez, this explanation is WAY too difficult. Maybe we need to find some way to make it easier to understand. doc.add_entry("basics", "mine", { name = S("Mining"), data = { text = +-- Text changed for MCL2 S("Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.").."\n\n".. -S("Short explanation:").."\n\n".. - -S("Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in toughness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining go straight into your inventory.") .. "\n\n".. - -S("Detailed explanation:").."\n\n".. - -S("Mineable blocks have mining properties (based on groups) and a toughness level. Mining tools have the same properties. Each mining property of a block also has a rating, while tools can be able to break blocks within a range of ratings.").."\n\n".. - -S("In order to mine a block, these conditions need to be met:").."\n".. -S("• The block and tool share at least one mining property for which they have a matching rating").."\n".. -S("• The tool's toughness level is equal or greater than the block's toughness level").."\n\n".. - -S("Example: A block with the mining property “cracky”, rating 3 and toughness level 0 can only be broken by a tool which is able to break “cracky” blocks at rating 3 and it must have a toughness level of 0 or larger.").."\n\n".. - -S("The time it takes to mine a block depends on the ratings and the toughness levels of both tool and block.").."\n".. -S("• The base mining time depends on the ratings of the block and the mining speed of the tool").."\n".. -S("• The mining speed of the tool differs for each mining property and its rating").."\n".. -S("• The toughness level further modifies the mining speed for this mining property").."\n".. -S("• A high difference in toughness levels decreases the mining time considerably").."\n".. -S("• If the toughness level difference is 2, the mining time is half of the base mining time").."\n".. -S("• With a difference of 3, the mining time is a third, and so on").."\n\n".. - -S("The item help shows the mining times of a tool listed by its mining properties and its ratings. The mining times are often expressed as a range. The low number stands for the mining time for toughness level 0 and the high number for the highest level the tool can mine.").."\n\n".. - -S("Mining usually wears off tools. Each time you mine a block, your tool takes some damage until it is destroyed eventually. The wear per mined block is determined by the difference between the tool's toughness level and the block's toughness level. The higher the difference, the lower the wear. This means:").."\n".. -S("• High-level blocks wear off your tools faster").."\n".. -S("• You can use high-level tools to compensate this").."\n".. -S("• The highest wear is caused when the level of both tool and block are equal").."\n\n".. +S("Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in hardness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining will drop on the ground, ready to be collected.") .. "\n\n".. S("After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:").."\n".. S("• Always drops itself (the usual case)").."\n".. S("• Always drops the same items").."\n".. S("• Drops items based on probability").."\n".. -S("• Drops nothing").."\n\n".. - -S("The drop goes directly into your inventory, unless there's no more space left. In that case, the items literally drop on the floor."), - images = {{image="doc_basics_tools_mining.png"}}, +S("• Drops nothing"), }}) doc.add_entry("basics", "build", { @@ -409,7 +378,8 @@ S("There are multiple types of crafting recipes:").."\n\n".. S("• Shaped (image 2): Items need to be placed in a particular shape").."\n".. S("• Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)").."\n".. S("• Cooking: Explained in “Basics > Cooking”").."\n".. -S("• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by a certain percentage. This recipe may not be available in all games").."\n\n".. +-- MCL2 change: call out specific repair percentage +S("• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by 5%").."\n\n".. S("In some crafting recipes, some input items do not need to be a concrete item, instead they need to be a member of a group (see “Basics > Groups”). These recipes offer a bit more freedom in the input items. Images 6-8 show the same group-based recipe. Here, 8 items of the “stone” group are required, which is true for all of the shown items.").."\n\n".. diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr index dd4e96fcb..14512b227 100644 --- a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr @@ -26,8 +26,8 @@ How to play:=Spielanleitung • Place the wood into the 2×2 grid (your “crafting grid”) in your inventory menu and craft 4 wood planks=• Platzieren Sie das Holz in das 2×2-Gitter (Ihr „Fertigungsgitter) in Ihrem Inventar und fertigen Sie 4 Holzplanken • Place them in a 2×2 shape in the crafting grid to craft a crafting table=• Platzieren Sie sie in eine 2×2-Form im Fertigungsgitter, um eine Werkbank zu errichten • Place the crafting table on the ground=• Platzieren Sie die Werkbank auf den Boden -• Rightclick it for a 3×3 crafting grid=Rechtsklicken Sie sie für ein 3×3-Fertigungsgitter -• Use the crafting guide (book icon) to learn all the possible crafting recipes=• Benutzen Sie die Bauanleitung (Buchsymbol) um alle möglichen Fertigungsrezepte zu lernen +• Rightclick it for a 3×3 crafting grid=• Rechtsklicken Sie sie für ein 3×3-Fertigungsgitter +• Use the crafting guide (book icon) to learn all the possible crafting recipes=• Benutzen Sie den Fertigungsführer (Buchsymbol), um die möglichen Fertigungsrezepte zu lernen • Craft a wooden pickaxe so you can dig stone=• Fertigen Sie eine Holzspitzhacke, damit Sie Stein graben können • Different tools break different kinds of blocks. Try them out!=• Verschiedene Werkzeuge können verschiedene Blöcke brechen. Probieren Sie einfach! • Read entries in this help to learn the rest=• Lesen Sie Einträge in dieser Hilfe, um den Rest zu lernen @@ -126,7 +126,7 @@ There are two core attributes of melee weapons:=Nahkampfwaffen haben zwei Haupta A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.=Eine Waffe macht nur den vollen Schaden, wenn sie voll ausgeholt ist, d.h. der letzte Schlag war lange genug her. Sonst macht die Waffe nur reduzierten Schaden. Das bedeutet, dass schnelle Schläge wirklich sehr schnell sind, aber geringen Schaden anrichten. Beachten Sie, dass das Vollschlagintervall nicht begrenzt, wie schnell Sie angreifen können. There is a rule which sometimes makes attacks impossible: Players, animate objects and weapons belong to damage groups. A weapon only deals damage to those who share at least one damage group with it. So if you're using the wrong weapon, you might not deal any damage at all.=Es gibt eine Regel, die es manchmal unmöglich macht, Schaden anzurichten. Spieler, lebendige Objekte und Waffen gehören Schadensgruppen an. Eine Waffe macht nur Schaden auf Sachen, mit denen sie mindestens eine Schadensgruppe teilt. Wenn Sie also die falsche Waffe benutzen, können sie überhaupt keinen Schaden machen. Pointing=Zeigen -“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, dropped items, players, computer enemies and objects.=„Zeigen“ bedeutet, dass man auf etwas mit dem Fadenkreuz in Reichweite schaut. Zeigen wird für die Interaktion benutzt, wie Graben, Schlagen, usw. Zu zeigbare Dingen gehören Blöcke, fallen gelassene Gegenstände, Spieler, computergesteuerte Feinde und Objekte. +“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, players, computer enemies and objects.=„Zeigen“ bedeutet, dass man auf etwas mit dem Fadenkreuz in Reichweite schaut. Zeigen wird für die Interaktion benutzt, wie Graben, Schlagen, usw. Zu zeigbaren Dingen gehören Blöcke, Spieler, computergesteuerte Feinde und Objekte. To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.=Um auf etwas zu zeigen, muss es sich in der Zeigereichweite (kurz „Reichweite“) Ihres gehaltenen Gegenstands befinden. Es gibt eine Standardreichweite, wenn Sie nichts halten. Ein gezeigtes Ding wird umrandet oder hervorgehoben (abhängig von Ihren Einstellungen). Zeigen ist nicht möglich mit der Dritten-Person-Vorderkamera. A few things can not be pointed. Most blocks are pointable. A few blocks, like air, can never be pointed. Other blocks, like liquids can only be pointed by special items.=Ein paar Dinge können nicht gezeigt werden. Die meisten Blöcke sind zeigbar. Ein paar Blöcke, wie Luft, können niemals gezeigt werden. Andere Blöcke, wie Flüssigkeiten können nur von besonderen Gegenständen gezeigt werden. Camera=Kamera @@ -148,7 +148,7 @@ Blocks can have a wide range of different properties which determine mining time Mining=Abbauen Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.=Das Abbauen (oder Ausgraben) ist der Prozess, in dem Blöcke abgebrochen werden, um sie zu entfernen. Um einen Block abzubauen, zeigen Sie auf ihn und halten Sie die linke Maustaste, bis er bricht. Short explanation:=Kurzerklärung: -Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in toughness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining go straight into your inventory.=Blöcke benötigen ein Grabewerkzeug, um abgebaut werden zu können. Andere Blöcke werden von anderen Grabewerkzeugen abgebaut, und einige Blöcke können überhaupt nicht abgebaut werden. Blöcke unterscheiden sich in ihrer Härte und Werkzeuge unterscheiden sich in ihrer Stärke. Grabewerkzeuge werden sich allmählich abnutzen. Die Abbauzeit und Abnutzung hängen vom Block und dem Grabewerkzeug ab. Die schnellste Methode, um herauszufinden, wie effizient Ihre Grabewerkzeuge sind, ist es, sie einfach an verschiedenen Blöcken auszuprobieren. Gegenstände, die Sie vom Abbauen erhalten, werden direkt in Ihr Inventar befördert. +Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in hardness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining will drop on the ground, ready to be collected.=Blöcke benötigen ein Grabewerkzeug, um abgebaut werden zu können. Verschiedene Blöcke werden von verschiedenen Grabewerkzeugen abgebaut und einige Blöcke können gar nicht abgebaut werden. Blöcke variieren in der Härte und Werkzeuge variieren in ihrer Stärke. Grabewerkzeuge werden sich allmählich abnutzen. Die Grabezeit und die Werkzeugabnutzung hängen vom Block und dem Grabewerkzeug ab. Die schnellste Methode, um herauszufinden, wie effizient Ihre Grabewerkzeuge sind, ist es, sie einfach an verschiedenen Blöcken auszuprobieren. Alles, was Sie aus Blöcken erhalten, wird zu Boden fallen und kann von ihnen aufgesammelt werden. Detailed explanation:=Detaillierte Erklärung: Mineable blocks have mining properties (based on groups) and a toughness level. Mining tools have the same properties. Each mining property of a block also has a rating, while tools can be able to break blocks within a range of ratings.=Abbaubare Blöcke haben Abbaueigenschaften (basierend auf Gruppen) und einen Härtegrad. Grabewerkzeuge haben die gleichen Eigenschaften. Jede Abbaueigenschaft eines Blocks hat auch eine Wertung; Werkzeuge hingegen können fähig sein, Blöcke mit einer Reihe von Wertungen abzubauen. In order to mine a block, these conditions need to be met:=Um einen Block abbauen zu können, müssen diese Bedingungen erfüllt sein: @@ -426,7 +426,7 @@ There are multiple types of crafting recipes:=Es gibt mehrere Arten von Fertigun • Shaped (image 2): Items need to be placed in a particular shape=• Förmig (Bild 2): Gegenstände müssen in einer bestimmten Form platziert werden • Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)=• Formlos (Bilder 3 und 4): Gegenstände müssen irgendwo in der Eingabe platziert werden (beide Bilder zeigen das gleiche Rezept) • Cooking: Explained in “Basics > Cooking”=• Kochen: Siehe „Grundlagen > Kochen“ -• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by a certain percentage. This recipe may not be available in all games=• Reparieren (Bild 5): Platzieren sie zwei gleiche beschädigte Werkzeuge in das Fertigungsgitter, um ein Werkzeug zu erhalten, das zu einem bestimmten Prozentsatz repariert ist. Dieses Rezept ist nicht in allen Spielen vorhanden +• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by 5%=• Reparieren (Bild 5): Platzieren sie zwei gleiche beschädigte Werkzeuge in das Fertigungsgitter, um ein Werkzeug zu erhalten, das zu 5% repariert ist Minetest has 3 different views which determine the way you see the world. The modes are:=Minetest hat 3 verschiedene Ansichten, die bestimmen, wie Sie die Welt sehen. Die Modi sind: • 1: First-person view (default)=• 1: Erste Person (Standard) • 2: Third-person view from behind=• 2: Dritte Person von hinten @@ -452,7 +452,7 @@ Enabling Creative Mode in MineClone 2 applies the following changes:=Der Kreativ • You keep the things you've placed=• Sie behalten die Dinge, die Sie platzieren • Creative inventory is available to obtain most items easily=• Das Kreativinventar ist verfügbar, mit dem Sie die meisten Dinge leicht erhalten • Hand breaks all default blocks instantly=• Hand zerbricht alle Standardblöcke sofort -• Greatly increased hand pointing range=• Stark erhöhte Handzeigereichweite +• Greatly increased hand pointing range=• Stark erhöhte Zeigereichweite der Hand • Mined blocks don't drop items=• Gegrabene Blöcke werfen nichts ab • Items don't get used up=• Gegenstände werden nicht verbraucht • Tools don't wear off=• Werkzeuge nutzen sich nicht ab @@ -461,7 +461,7 @@ Enabling Creative Mode in MineClone 2 applies the following changes:=Der Kreativ Damage is not affected by Creative Mode, it needs to be disabled separately.=Schaden wird vom Kreativmodus nicht beeinflusst, er muss separat ausgeschaltet werden. Mobs=Mobs Mobs are the living beings in the world. This includes animals and monsters.=Mobs sind die lebenden Kreaturen in der Welt. Das schließt Tiere und Monster ein. -Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some blocks only spawn on particular blocks (like grass blocks).=Monster tauchen zufällig in der Welt auf. Das nennt man „spawnen“. Jeder Mobart taucht auf bestimmten Blocktypen bei einer bestimmten Helligkeit auf. Die Höhe spielt auch eine Rolle. Friedliche Mobs neigen dazu, bei Tageslicht zu spawnen, während feindliche Mobs die Dunkelheit bevorzugen. Die meisten Mobs können auf jedem festen Block spawnen, aber einige Blöcke können nur auf bestimmten Blöcken spawnen (wie Grasblöcke). +Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some mobs only spawn on particular blocks (like grass blocks).=Monster tauchen zufällig in der Welt auf. Das nennt man „spawnen“. Jeder Mobart taucht auf bestimmten Blocktypen bei einer bestimmten Helligkeit auf. Die Höhe spielt auch eine Rolle. Friedliche Mobs neigen dazu, bei Tageslicht zu spawnen, während feindliche Mobs die Dunkelheit bevorzugen. Die meisten Mobs können auf jedem festen Block spawnen, aber einige Mobs können nur auf bestimmten Blöcken spawnen (wie Grasblöcke). Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.=Wie Spieler haben Mobs Trefferpunkte und manchmal auch Rüstungspunkte (was bedeutet, dass Sie bessere Waffen benötigen, um überhaupt Schaden anrichten zu können). Auch wie bei Spielern können feindliche Mobs direkt angreifen oder aus der Ferne. Mobs können nach ihrem Tod zufällige Gegenstände abwerfen. Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.=Die meisten Tiere wandern in der Welt ziellos umher, während die meisten feindlichen Mobs die Spieler jagen. Tiere können gefüttert, gezähmt und gezüchtet werden. Animals=Tiere @@ -477,7 +477,7 @@ Breeding:=Züchten: When you have fed an animal up to its maximum health, then feed it again, you will activate “Love Mode” and many hearts appear around the animal.=Wenn Sie ein Tier bis zur vollen Gesundheit geheilt haben und es erneut füttern, werden Sie den „Liebesmodus“ aktivieren. Viele Herzen tauchen um das Tier herum auf. Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.=Zwei Tiere der gleichen Art werden sich paaren, wenn sie im Liebesmodus sind und nah beieinander stehen. Kurz darauf wird ein Junges auftauchen. Baby animals:=Junge: -Baby animals are just like their adult couterparts, but they can't be fed, tamed or bred and don't drop anything when they die. They grow to adults after a short time.=Junge sind wie ihre erwachsenen Artgenossen, aber sie können nicht gefüttert, gezähmt oder gezüchtet werden und werfen nichts ab, wenn sie sterben. Nach einer kurzen Zeit werden sie erwachsen. +Baby animals are just like their adult couterparts, but they can't be tamed or bred and don't drop anything when they die. They grow to adults after a short time. When fed, they grow to adults faster.=Junge sind wie ihre erwachsenen Artgenossen, aber sie können nicht gezähmt oder gezüchtet werden und werfen nichts ab, wenn sie sterben. Nach einer kurzen Zeit werden sie erwachsen. Werden sie gefüttert, werden sie schneller erwachsen. Hunger=Hunger Hunger affects your health and your ability to sprint. Hunger is not in effect when damage is disabled.=Hunger beeinflusst Ihre Gesundheit und Ihre Fähigkeit, zu sprinten. Core hunger rules:=Haupthungerregeln: @@ -500,7 +500,7 @@ If your saturation reaches 0, you're hungry and start to lose hunger points. Whe Saturation decreases by doing things which exhaust you (highest exhaustion first):=Die Sättigung verringert sich, wenn Sie Dinge tun, die Sie erschöpfen (höchste Erschöpfung zuerst): • Regenerating 1 HP=• 1 TP regenerieren • Suffering food poisoning=• Lebensmittelvergiftung erleiden -• Sprint-jumping=• Beim sprinten springen +• Sprint-jumping=• Beim Sprinten springen • Sprinting=• Sprinten • Attacking=• Angreifen • Taking damage=• Schaden nehmen diff --git a/mods/HELP/mcl_doc_basics/locale/template.txt b/mods/HELP/mcl_doc_basics/locale/template.txt index 51f09bae1..82dcdb60e 100644 --- a/mods/HELP/mcl_doc_basics/locale/template.txt +++ b/mods/HELP/mcl_doc_basics/locale/template.txt @@ -125,7 +125,7 @@ There are two core attributes of melee weapons:= A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.= There is a rule which sometimes makes attacks impossible: Players, animate objects and weapons belong to damage groups. A weapon only deals damage to those who share at least one damage group with it. So if you're using the wrong weapon, you might not deal any damage at all.= Pointing= -“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, dropped items, players, computer enemies and objects.= +“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, players, computer enemies and objects.= To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.= A few things can not be pointed. Most blocks are pointable. A few blocks, like air, can never be pointed. Other blocks, like liquids can only be pointed by special items.= Camera= @@ -415,72 +415,10 @@ Enabling Creative Mode in MineClone 2 applies the following changes:= • Tools don't wear off= • You can eat food whenever you want= • You can always use the minimap (including radar mode)= -Damage is not affected by Creative Mode, it needs to be disabled seperately.= -Mobs= -Mobs are the living beings in the world. This includes animals and monsters.= -Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some blocks only spawn on particular blocks (like grass blocks).= -Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.= -Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.= -Animals= -Animals are peaceful beings which roam the world aimlessly. You can feed, tame and breed them.= -Feeding:= -Each animal has its own taste for food and doesn't just accept any food. To feed, hold an item in your hand and rightclick the animal.= -Animals are attraced to the food they like and follow you as long you hold the food item in hand.= -Feeding an animal has three uses: Taming, healing and breeding.= -Feeding heals animals instantly, depending on the quality of the food item.= -Taming:= -A few animals can be tamed. You can generally do more things with tamed animals and use other items on them. For example, tame horses can be saddled and tame wolves fight on your side.= -Breeding:= -When you have fed an animal up to its maximum health, then feed it again, you will activate “Love Mode” and many hearts appear around the animal.= -Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.= -Baby animals:= -Baby animals are just like their adult couterparts, but they can't be fed, tamed or bred and don't drop anything when they die. They grow to adults after a short time.= -Hunger= -Hunger affects your health and your ability to sprint. Hunger is not in effect when damage is disabled.= -Core hunger rules:= -• You start with 20/20 hunger points (more points @= less hungry)= -• Actions like combat, jumping, sprinting, etc. decrease hunger points= -• Food restores hunger points= -• If your hunger bar decreases, you're hungry= -• At 18-20 hunger points, you regenerate 1 HP every 4 seconds= -• At 6 hunger points or less, you can't sprint= -• At 0 hunger points, you lose 1 HP every 4 seconds (down to 1 HP)= -• Poisonous food decreases your health= -Details:= -You have 0-20 hunger points, indicated by 20 drumstick half-icons above the hotbar. You also have an invisible attribute: Saturation.= -Hunger points reflect how full you are while saturation points reflect how long it takes until you're hungry again.= -Each food item increases both your hunger level as well your saturation.= -Food with a high saturation boost has the advantage that it will take longer until you get hungry again.= -A few food items might induce food poisoning by chance. When you're poisoned, the health and hunger symbols turn sickly green. Food poisoning drains your health by 1 HP per second, down to 1 HP. Food poisoning also drains your saturation. Food poisoning goes away after a while or when you drink milk.= -You start with 5 saturation points. The maximum saturation is equal to your current hunger level. So with 20 hunger points your maximum saturation is 20. What this means is that food items which restore many saturation points are more effective the more hunger points you have. This is because at low hunger levels, a lot of the saturation boost will be lost due to the low saturation cap.= -If your saturation reaches 0, you're hungry and start to lose hunger points. Whenever you see the hunger bar decrease, it is a good time to eat.= -Saturation decreases by doing things which exhaust you (highest exhaustion first):= -• Regenerating 1 HP= -• Suffering food poisoning= -• Sprint-jumping= -• Sprinting= -• Attacking= -• Taking damage= -• Swimming= -• Jumping= -• Mining a block= -Other actions, like walking, do not exaust you.= -# textdomain: mcl_doc_basics -Creative Mode= -Enabling Creative Mode in MineClone 2 applies the following changes:= -• You keep the things you've placed= -• Creative inventory is available to obtain most items easily= -• Hand breaks all default blocks instantly= -• Greatly increased hand pointing range= -• Mined blocks don't drop items= -• Items don't get used up= -• Tools don't wear off= -• You can eat food whenever you want= -• You can always use the minimap (including radar mode)= Damage is not affected by Creative Mode, it needs to be disabled separately.= Mobs= Mobs are the living beings in the world. This includes animals and monsters.= -Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some blocks only spawn on particular blocks (like grass blocks).= +Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some mobs only spawn on particular blocks (like grass blocks).= Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.= Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.= Animals= @@ -496,7 +434,7 @@ Breeding:= When you have fed an animal up to its maximum health, then feed it again, you will activate “Love Mode” and many hearts appear around the animal.= Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.= Baby animals:= -Baby animals are just like their adult couterparts, but they can't be fed, tamed or bred and don't drop anything when they die. They grow to adults after a short time.= +Baby animals are just like their adult couterparts, but they can't be tamed or bred and don't drop anything when they die. They grow to adults after a short time. When fed, they grow to adults faster.= Hunger= Hunger affects your health and your ability to sprint. Hunger is not in effect when damage is disabled.= Core hunger rules:= diff --git a/mods/HELP/mcl_doc_basics/mcl_extension.lua b/mods/HELP/mcl_doc_basics/mcl_extension.lua index 912cb119a..c6f9f0aa9 100644 --- a/mods/HELP/mcl_doc_basics/mcl_extension.lua +++ b/mods/HELP/mcl_doc_basics/mcl_extension.lua @@ -23,7 +23,7 @@ doc.add_entry("basics", "mobs", { data = { text = S("Mobs are the living beings in the world. This includes animals and monsters.").."\n\n".. -S("Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some blocks only spawn on particular blocks (like grass blocks).").."\n\n".. +S("Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some mobs only spawn on particular blocks (like grass blocks).").."\n\n".. S("Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.").."\n\n".. @@ -49,7 +49,7 @@ S("When you have fed an animal up to its maximum health, then feed it again, you S("Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.").."\n\n".. S("Baby animals:").."\n".. -S("Baby animals are just like their adult couterparts, but they can't be fed, tamed or bred and don't drop anything when they die. They grow to adults after a short time.") +S("Baby animals are just like their adult couterparts, but they can't be tamed or bred and don't drop anything when they die. They grow to adults after a short time. When fed, they grow to adults faster.") }}) From e2cc0e428d42b7ca7dd1998e6135c51671e5e306 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Mar 2019 17:05:00 +0100 Subject: [PATCH 220/379] =?UTF-8?q?Remove=20the=20word=20=E2=80=9CMinetest?= =?UTF-8?q?=E2=80=9D=20more=20often?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/HELP/mcl_doc_basics/init.lua | 14 +++++++------- .../mcl_doc_basics/locale/mcl_doc_basics.de.tr | 14 +++++++------- mods/HELP/mcl_doc_basics/locale/template.txt | 4 ++-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/mods/HELP/mcl_doc_basics/init.lua b/mods/HELP/mcl_doc_basics/init.lua index 94d627456..e700e82bd 100644 --- a/mods/HELP/mcl_doc_basics/init.lua +++ b/mods/HELP/mcl_doc_basics/init.lua @@ -7,7 +7,7 @@ local S = minetest.get_translator("mcl_doc_basics") doc.add_category("basics", { name = S("Basics"), - description = S("Everything you need to know about MineClone 2 to get started with playing"), + description = S("Everything you need to know to get started with playing"), sorting = "custom", sorting_data = {"quick_start", "controls", "point", "items", "inventory", "hotbar", "tools", "weapons", "nodes", "mine", "build", "craft", "cook", "hunger", "mobs", "animals", "minimap", "cam", "sneak", "players", "liquids", "light", "groups", "glossary", "minetest"}, build_formspec = doc.entry_builders.text_and_gallery, @@ -16,7 +16,7 @@ doc.add_category("basics", doc.add_category("advanced", { name = S("Advanced usage"), - description = S("Advanced information about Minetest which may be nice to know, but is not crucial to gameplay"), + description = S("Advanced information which may be nice to know, but is not crucial to gameplay"), sorting = "custom", sorting_data = {"creative", "console", "commands", "privs", "movement_modes", "coordinates", "settings", "online"}, build_formspec = doc.entry_builders.text_and_gallery, @@ -204,7 +204,7 @@ doc.add_entry("basics", "tools", { data = { text = S("Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.").."\n\n".. -S("A common tool in Minetest are, of course, mining tools. These are important to break all kinds of blocks. Weapons are a kind of tool in Minetest. There are of course many other possible tools. Special actions of tools are usually done by left-click or right-click.").."\n\n".. +S("A common subset of tools is mining tools. These are important to break all kinds of blocks. Weapons are a kind of tool. There are of course many other possible tools. Special actions of tools are usually done by left-click or right-click.").."\n\n".. S("When nothing is wielded, players use their hand which may act as tool and weapon.").."\n\n".. @@ -247,7 +247,7 @@ doc.add_entry("basics", "cam", { name = S("Camera"), data = { text = -S("Minetest has 3 different views which determine the way you see the world. The modes are:").."\n\n".. +S("There are 3 different views which determine the way you see the world. The modes are:").."\n\n".. S("• 1: First-person view (default)").."\n".. S("• 2: Third-person view from behind").."\n".. @@ -266,7 +266,7 @@ doc.add_entry("basics", "nodes", { name = S("Blocks"), data = { text = -S("The world of Minetest is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.").."\n\n".. +S("The world is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.").."\n\n".. S("Blocks can have a wide range of different properties which determine mining times, behavior, looks, shape, and much more. Their properties include:").."\n\n".. @@ -508,7 +508,7 @@ doc.add_entry("basics", "glossary", { name = S("Glossary"), data = { text = -S("This is a list of commonly used terms in Minetest:").."\n\n".. +S("This is a list of commonly used terms:").."\n\n".. S("Controls:").."\n".. S("• Wielding: Holding an item in hand").."\n".. @@ -731,7 +731,7 @@ S("Note that “transparency” here only means that the block is able to carry doc.add_entry("advanced", "coordinates", { name = S("Coordinates"), data = { text = -S("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.").."\n\n".. +S("The 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.").."\n\n".. S("Like this: (5, 45, -12)").."\n\n".. diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr index 14512b227..236d5a6bb 100644 --- a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.de.tr @@ -1,8 +1,8 @@ # textdomain: mcl_doc_basics Basics=Grundlagen -Everything you need to know about Minetest to get started with playing=Alles, was Sie über Minetest zum Spielen wissen sollten +Everything you need to know to get started with playing=Alles, was Sie zum Spielen wissen sollten Advanced usage=Fortgeschrittenes -Advanced information about Minetest which may be nice to know, but is not crucial to gameplay=Fortgeschrittene Informationen über Minetest, die nett zu wissen sind, aber nicht kritisch für das reguläre Spiel +Advanced information which may be nice to know, but is not crucial to gameplay=Fortgeschrittene Informationen, die nett zu wissen sind, aber nicht kritisch für das reguläre Spiel Quick start=Schnellstart This is a very brief introduction to the basic gameplay:=Hier ist eine sehr kurze Einführung ins Spiel: • Move mouse to look=• Mausbewegung zum Umsehen @@ -112,7 +112,7 @@ An item stack is a collection of items of the same type which fits into a single A dropped item stack can be collected by punching it.=Ein fallen gelassener Gegenstandsstapel kann aufgesammelt werden, indem er geschlagen wird. Tools=Werkzeuge Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.=Einige Gegenstände können als Werkzeug fungieren, wenn man sie hält. Als Werkzeug zählt jeder Gegenstand, der einen besonderen Zweck hat, der direkt vom Träger ausgelöst werden kann. -A common tool in Minetest are, of course, mining tools. These are important to break all kinds of blocks. Weapons are a kind of tool in Minetest. There are of course many other possible tools. Special actions of tools are usually done by left-click or right-click.=Eine häufige Werkzeugart in Minetest sind Grabewerkzeuge. Sie sind wichtig zum Abbauen aller möglichen Blöcke. Waffen sind eine Art Werkzeug in Minetest. Es gibt natürlich viele weitere Werkzeuge. Sonderaktionen von Werkzeugen weden normalerweise mit Links- oder Rechtsklick ausgelöst. +A common subset of tools is mining tools. These are important to break all kinds of blocks. Weapons are a kind of tool. There are of course many other possible tools. Special actions of tools are usually done by left-click or right-click.=Eine häufige Werkzeugart sind Grabewerkzeuge. Sie sind wichtig zum Abbauen aller möglichen Blöcke. Waffen sind eine Art Werkzeug. Es gibt natürlich viele weitere Werkzeuge. Sonderaktionen von Werkzeugen weden normalerweise mit Links- oder Rechtsklick ausgelöst. When nothing is wielded, players use their hand which may act as tool and weapon.=Wird nichts gehalten, benutzen die Spieler ihre Hand, die als Werkzeug und Waffe herhalten kann. Many tools will wear off when using them and may eventually get destroyed. The damage is displayed in a damage bar below the tool icon. If no damage bar is shown, the tool is in mint condition. Tools may be repairable by crafting, see “Basics > Crafting”.=Viele Werkzeuge werden sich bei Benutzung abnutzen und zerbrechen früher oder später. Der Schaden wird in einer Schadensleiste unter dem Werkzeugsymbol angezeigt. Ohne diese Leiste ist das Werkzeug wie neu. Werkzeuge kann man eventuell mit einer Fertigung reparieren. Weapons=Waffen @@ -136,7 +136,7 @@ Zooming is a gameplay feature that might be enabled or disabled by the game. By • Switch camera mode: [F7]=• Kameramodus wechseln: [F7] • Zoom: [Z]=• Zoom: [Z] Blocks=Blöcke -The world of Minetest is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.=Die Welt von Minetest besteht aus Blöcken (oder Voxeln, um genau zu sein). Blöcke können mit den richtigen Werkzeugen gebaut oder entfernt werden. +The world is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.=Die Welt besteht aus Blöcken (oder Voxeln, um genau zu sein). Blöcke können mit den richtigen Werkzeugen gebaut oder entfernt werden. Blocks can have a wide range of different properties which determine mining times, behavior, looks, shape, and much more. Their properties include:=Blöcke haben eine Reihe an verschiedenen Eigenschaften, die die Abbauzeit, ihr Verhalten, Aussehen, Form und vieles mehr beeinflussen. Zu ihren Eigenschaften zählen: • Collidable: Collidable blocks can not be passed through; players can walk on them. Non-collidable blocks can be passed through freely=• Kollisionsfähig: Kollisionsfähige Blöcke können nicht passiert werden, Spieler können auf ihnen gehen. Nicht kollisionsfähige Blöcke können frei passiert werden • Pointable: Pointable blocks show a wireframe or a halo box when pointed. But you will just point through non-pointable blocks. Liquids are usually non-pointable but they can be pointed at by some special tools=• Zeigbar: Zeigbare Blöcke zeigen ein Drahtmodell oder eine scheinende Box, wenn sie gezeigt werden. Aber durch nicht-zeigbare Blöcke werden Sie hindurch zeigen. Flüssigkeiten sind üblicherweise nicht-zeigbar, aber mit besonderen Werkzeugen können sie gezeigt werden. @@ -262,7 +262,7 @@ Items, players and objects (animate and inanimate) can be members of any number • Other uses=• Andere Zwecke In the item help, many important groups are usually mentioned and explained.=In der Gegenstandshilfe werden viele wichtige Gruppen normalerweise erwähnt und erklärt. Glossary=Glossar -This is a list of commonly used terms in Minetest:=Dies ist eine Liste von häufig benutzten Begriffen in Minetest +This is a list of commonly used terms:=Dies ist eine Liste von häufig benutzten Begriffen: Controls:=Steuerung: • Wielding: Holding an item in hand=• Halten: Einen Gegenstand in der Hand halten • Pointing: Looking with the crosshair at something in range=• Zeigen: Mit dem Fadenkreuz auf etwas in Reichweite blicken @@ -405,7 +405,7 @@ Artificial light will lose one level of brightness for each transparent or semi- Sunlight will preserve its brightness as long it only passes fully transparent blocks. When it passes through a semi-transparent block, it turns to artificial light. Image 2 shows the difference.=Sonnenlicht wird seine Helligkeit behalten, solange sie nur volltransparente Blöcke passiert. Sobald sie einen halbtransparenten Block passiert, wird es zu künstlichem Licht. Bild 2 zeigt den Unterschied. Note that “transparency” here only means that the block is able to carry brightness from its neighboring blocks. It is possible for a block to be transparent to light but you can't see trough the other side.=Beachten Sie, dass das Wort „Transparenz“ hier nur bedeutet, dass der Block fähig ist, Helligkeit von seinen Nachbarblöcken weiterzugeben. Es ist möglich, dass ein Block transparent gegenüber Licht ist, aber Sie können nicht durch ihn sehen. Coordinates=Koordinaten -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.=Die Minetest-Welt ist ein großer Würfel. Und daher kann eine Position in der Welt leicht mit kartesischen Koordinaten ausgedrückt weren. Das bedeutet, für jede Position in der Welt gibt es 3 Werte X, Y und Z. +The 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.=Die Welt ist ein großer Würfel. Und daher kann eine Position in der Welt leicht mit kartesischen Koordinaten ausgedrückt weren. Das bedeutet, für jede Position in der Welt gibt es 3 Werte X, Y und Z. Like this: (5, 45, -12)=So wie dies: (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.=Das bezieht sich auf die Position, in der X@=5, Y@=45 und Z@=-12 sind. Die drei Buchstaben nennt man „Achsen“. Y ist für die Höhe X und Z sind für die horizontale Position. The values for X, Y and Z work like this:=Die Werte für X, Y und Z funktionieren so: @@ -427,7 +427,7 @@ There are multiple types of crafting recipes:=Es gibt mehrere Arten von Fertigun • Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)=• Formlos (Bilder 3 und 4): Gegenstände müssen irgendwo in der Eingabe platziert werden (beide Bilder zeigen das gleiche Rezept) • Cooking: Explained in “Basics > Cooking”=• Kochen: Siehe „Grundlagen > Kochen“ • Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by 5%=• Reparieren (Bild 5): Platzieren sie zwei gleiche beschädigte Werkzeuge in das Fertigungsgitter, um ein Werkzeug zu erhalten, das zu 5% repariert ist -Minetest has 3 different views which determine the way you see the world. The modes are:=Minetest hat 3 verschiedene Ansichten, die bestimmen, wie Sie die Welt sehen. Die Modi sind: +There are 3 different views which determine the way you see the world. The modes are:=Es gibt 3 verschiedene Ansichten, die bestimmen, wie Sie die Welt sehen. Die Modi sind: • 1: First-person view (default)=• 1: Erste Person (Standard) • 2: Third-person view from behind=• 2: Dritte Person von hinten • 3: Third-person view from the front=• 3: Dritte Person von vorne diff --git a/mods/HELP/mcl_doc_basics/locale/template.txt b/mods/HELP/mcl_doc_basics/locale/template.txt index 82dcdb60e..4056de574 100644 --- a/mods/HELP/mcl_doc_basics/locale/template.txt +++ b/mods/HELP/mcl_doc_basics/locale/template.txt @@ -1,8 +1,8 @@ # textdomain: mcl_doc_basics Basics= -Everything you need to know about MineClone 2 to get started with playing= +Everything you need to know to get started with playing= Advanced usage= -Advanced information about Minetest which may be nice to know, but is not crucial to gameplay= +Advanced information which may be nice to know, but is not crucial to gameplay= Quick start= This is a very brief introduction to the basic gameplay:= Basic controls:= From 95d2465901ab66f4248ce2e541a5ef726c3620c7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Mar 2019 17:40:45 +0100 Subject: [PATCH 221/379] Noteblock: Higher kick sound --- .../sounds/mesecons_noteblock_temp_kick.ogg | Bin 10361 -> 10716 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_kick.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_kick.ogg index 10d585b8216cc9b301373f7342fc8ffa64605b8f..c73b71178e1f9cf0e29ebf88617638b95dcfadb9 100644 GIT binary patch delta 7076 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 IrDkIKKSR delta 6686 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 Date: Mon, 18 Mar 2019 17:54:14 +0100 Subject: [PATCH 222/379] Add sound pitch for other noteblock sounds --- .../REDSTONE/mesecons_noteblock/init.lua | 48 +++++++++++------- .../locale/mesecons_noteblock.de.tr | 2 +- .../mesecons_noteblock/locale/template.txt | 2 +- ...ogg => mesecons_noteblock_bass_guitar.ogg} | Bin ...p_kick.ogg => mesecons_noteblock_kick.ogg} | Bin ...snare.ogg => mesecons_noteblock_snare.ogg} | Bin ...stick.ogg => mesecons_noteblock_stick.ogg} | Bin 7 files changed, 31 insertions(+), 21 deletions(-) rename mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/{mesecons_noteblock_temp_bass_guitar.ogg => mesecons_noteblock_bass_guitar.ogg} (100%) rename mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/{mesecons_noteblock_temp_kick.ogg => mesecons_noteblock_kick.ogg} (100%) rename mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/{mesecons_noteblock_temp_snare.ogg => mesecons_noteblock_snare.ogg} (100%) rename mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/{mesecons_noteblock_temp_stick.ogg => mesecons_noteblock_stick.ogg} (100%) diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua index a6b59df91..342cbc7c0 100644 --- a/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua @@ -3,7 +3,7 @@ local S = minetest.get_translator("mesecons_noteblock") minetest.register_node("mesecons_noteblock:noteblock", { description = S("Note Block"), _doc_items_longdesc = S("A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power."), - _doc_items_usagehelp = S("Rightclick the note block to choose the next musical note (there are 24 half notes, or 2 octaves). The intrument played depends on the material of the block below the note block:").."\n\n".. + _doc_items_usagehelp = S("Use the note block to choose the next musical note (there are 25 semitones, or 2 octaves). The intrument played depends on the material of the block below the note block:").."\n\n".. S("• Glass: Sticks").."\n".. S("• Wood: Bass guitar").."\n".. @@ -22,7 +22,7 @@ S("The note block will only play a note when it is below air, otherwise, it stay minetest.record_protection_violation(pos, protname) return end - node.param2 = (node.param2+1)%24 + node.param2 = (node.param2+1)%25 mesecon.noteblock_play(pos, node.param2) minetest.set_node(pos, node) end, @@ -82,6 +82,8 @@ local soundnames_piano = { "mesecons_noteblock_asharp2", "mesecons_noteblock_b2", + -- TODO: Add dedicated sound file? + "mesecons_noteblock_b2", } mesecon.noteblock_play = function (pos, param2) @@ -91,24 +93,32 @@ mesecon.noteblock_play = function (pos, param2) return end - -- Default: One of 24 piano notes - local soundname = soundnames_piano[param2] - local block_below_name = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name - - if minetest.get_item_group(block_below_name, "material_glass") ~= 0 then - -- TODO: 24 sticks and clicks - soundname="mesecons_noteblock_temp_stick" - elseif minetest.get_item_group(block_below_name, "material_wood") ~= 0 then - -- TODO: 24 bass guitar sounds - soundname="mesecons_noteblock_temp_bass_guitar" - elseif minetest.get_item_group(block_below_name, "material_sand") ~= 0 then - -- TODO: 24 snare drum sounds - soundname="mesecons_noteblock_temp_snare" - elseif minetest.get_item_group(block_below_name, "material_stone") ~= 0 then - -- TODO: 24 bass drum sounds - soundname="mesecons_noteblock_temp_kick" + local param2_to_pitch = function(param2) + return 2^((param2-12)/12) end + local soundname, pitch + if minetest.get_item_group(block_below_name, "material_glass") ~= 0 then + soundname="mesecons_noteblock_stick" + pitch = param2_to_pitch(param2) + elseif minetest.get_item_group(block_below_name, "material_wood") ~= 0 then + soundname="mesecons_noteblock_bass_guitar" + pitch = param2_to_pitch(param2) + elseif minetest.get_item_group(block_below_name, "material_sand") ~= 0 then + soundname="mesecons_noteblock_snare" + pitch = param2_to_pitch(param2) + elseif minetest.get_item_group(block_below_name, "material_stone") ~= 0 then + soundname="mesecons_noteblock_kick" + pitch = param2_to_pitch(param2) + else + -- Default: One of 25 piano notes + soundname = soundnames_piano[param2] + -- Workaround: Final sound gets automatic higher pitch instead + if param2 == 24 then + pitch = 2^(1/12) + end + end + minetest.sound_play(soundname, - {pos = pos, gain = 1.0, max_hear_distance = 48,}) + {pos = pos, gain = 1.0, max_hear_distance = 48, pitch = pitch}) end diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.de.tr b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.de.tr index c107bd5dc..272823969 100644 --- a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.de.tr +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.de.tr @@ -1,7 +1,7 @@ # textdomain: mesecons_noteblock Note Block=Notenblock A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power.=Ein Notenblock ist ein musikalischer Block, der eine von vielen Noten von verschiedenen Instrumenten spielt, wenn er geschlagen oder mit Redstoneenergie versorgt wird. -Use the note block to choose the next musical note (there are 24 half notes, or 2 octaves). The intrument played depends on the material of the block below the note block:=Benutzen Sie den Notenblock, um die nächste Note zu wählen (es gibt 24 halbe Noten bzw. 2 Oktaven). Das gespielte Intrument hängt vom Material des Blocks unter dem Notenblock ab: +Use the note block to choose the next musical note (there are 25 semitones, or 2 octaves). The intrument played depends on the material of the block below the note block:=Benutzen Sie den Notenblock, um die nächste Musiknote zu wählen (es gibt 25 Halbtöne, oder 2 Oktaven). Das gespielte Instrument hängt vom Material des Blocks unter dem Notenblock ab: • Glass: Sticks=• Glas: Stöcke • Wood: Bass guitar=• Holz: Bassgitarre • Stone: Bass drum=• Stein: Basstrommel diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/template.txt index 95803f666..c1d7dc02f 100644 --- a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/template.txt @@ -1,7 +1,7 @@ # textdomain: mesecons_noteblock Note Block= A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power.= -Use the note block to choose the next musical note (there are 24 half notes, or 2 octaves). The intrument played depends on the material of the block below the note block:= +Use the note block to choose the next musical note (there are 25 semitones, or 2 octaves). The intrument played depends on the material of the block below the note block:= • Glass: Sticks= • Wood: Bass guitar= • Stone: Bass drum= diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_bass_guitar.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_bass_guitar.ogg similarity index 100% rename from mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_bass_guitar.ogg rename to mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_bass_guitar.ogg diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_kick.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_kick.ogg similarity index 100% rename from mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_kick.ogg rename to mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_kick.ogg diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_snare.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_snare.ogg similarity index 100% rename from mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_snare.ogg rename to mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_snare.ogg diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_stick.ogg b/mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_stick.ogg similarity index 100% rename from mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_temp_stick.ogg rename to mods/ITEMS/REDSTONE/mesecons_noteblock/sounds/mesecons_noteblock_stick.ogg From 8dd3c9224f00662b99970b2428b238b26b728ede Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Mar 2019 18:16:25 +0100 Subject: [PATCH 223/379] Fix translation of falling anvil death msg --- mods/ENTITIES/mcl_falling_nodes/init.lua | 6 +++--- .../mcl_falling_nodes/locale/mcl_falling_nodes.de.tr | 4 ++-- mods/ENTITIES/mcl_falling_nodes/locale/template.txt | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mods/ENTITIES/mcl_falling_nodes/init.lua b/mods/ENTITIES/mcl_falling_nodes/init.lua index 35355c790..540745673 100644 --- a/mods/ENTITIES/mcl_falling_nodes/init.lua +++ b/mods/ENTITIES/mcl_falling_nodes/init.lua @@ -49,12 +49,12 @@ local deal_falling_damage = function(self, dtime) -- TODO: Reduce damage if wearing a helmet local msg if minetest.get_item_group(self.node.name, "anvil") ~= 0 then - msg = S("%s was smashed by a falling anvil.") + msg = S("@1 was smashed by a falling anvil.", v:get_player_name()) else - msg = S("%s was smashed by a falling block.") + msg = S("@1 was smashed by a falling block.", v:get_player_name()) end if dmes then - mcl_death_messages.player_damage(v, string.format(msg, v:get_player_name())) + mcl_death_messages.player_damage(v, msg) end end v:set_hp(hp) diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr index 66cf8a2ae..71dfa4be9 100644 --- a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr +++ b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr @@ -1,3 +1,3 @@ # textdomain: mcl_falling_nodes -%s was smashed by a falling anvil.=%s wurde von einem fallenden Amboss zerschmettert. -%s was smashed by a falling block.=%s wurde von einem fallenden Block zerschmettert. +@1 was smashed by a falling anvil.=@1 wurde von einem fallenden Amboss zerschmettert. +@1 was smashed by a falling block.=@1 wurde von einem fallenden Block zerschmettert. diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/template.txt b/mods/ENTITIES/mcl_falling_nodes/locale/template.txt index 040742c69..4adabaf01 100644 --- a/mods/ENTITIES/mcl_falling_nodes/locale/template.txt +++ b/mods/ENTITIES/mcl_falling_nodes/locale/template.txt @@ -1,3 +1,3 @@ # textdomain: mcl_falling_nodes -%s was smashed by a falling anvil.= -%s was smashed by a falling block.= +@1 was smashed by a falling anvil.= +@1 was smashed by a falling block.= From aaf8801c067f3f913a26dcaeb8d33c3e3f0af42a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Mar 2019 18:24:31 +0100 Subject: [PATCH 224/379] Version 0.52.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 037f2b185..9bffaeda7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.51.1 +Version: 0.52.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From da5b2443f27b02f86ac09fb1a7f1a6d89b1e8385 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 19 Mar 2019 08:43:11 +0100 Subject: [PATCH 225/379] Fix crash when players kill each other --- mods/HUD/mcl_death_messages/init.lua | 4 ++-- mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr | 4 ++-- mods/HUD/mcl_death_messages/locale/template.txt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index dc294e8da..7a55f499e 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -10,7 +10,7 @@ local msgs = { N("@1 has been killed with an arrow."), }, ["arrow_name"] = { - N("@1 was shot by an arrow from %s."), + N("@1 was shot by an arrow from @2."), }, ["drown"] = { N("@1 forgot to breathe."), @@ -18,7 +18,7 @@ local msgs = { N("@1 ran out of oxygen."), }, ["murder"] = { - N("@1 was killed by %s."), + N("@1 was killed by @2."), }, ["mob_kill"] = { N("@1 was killed by a mob."), diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr index 665f6f688..cc1438056 100644 --- a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr @@ -1,11 +1,11 @@ # textdomain: mcl_death_messages @1 was fatally hit by an arrow.=@1 wurde tödlich von einem Pfeil getroffen. @1 has been killed with an arrow.=@1 wurde mit einem Pfeil getötet. -@1 was shot by an arrow from @1.=@1 wurde mit einem Pfeil von @1 abgeschossen. +@1 was shot by an arrow from @2.=@1 wurde mit einem Pfeil von @2 abgeschossen. @1 forgot to breathe.=@1 vergaß, zu atmen. @1 drowned.=@1 ertrank. @1 ran out of oxygen.=@1 ging die Luft aus. -@1 was killed by @1.=@1 wurde von @1 getötet. +@1 was killed by @2.=@1 wurde von @2 getötet. @1 was killed by a mob.=@1 wurde von einem Mob getötet. @1 was burned to death by a blaze's fireball.=@1 wurde von einem Feuerball einer Lohe zu Tode verbrannt. @1 was killed by a fireball from a blaze.=@1 wurde von einem Feuerball einer Lohe getötet. diff --git a/mods/HUD/mcl_death_messages/locale/template.txt b/mods/HUD/mcl_death_messages/locale/template.txt index ce809b353..95b2375b1 100644 --- a/mods/HUD/mcl_death_messages/locale/template.txt +++ b/mods/HUD/mcl_death_messages/locale/template.txt @@ -1,11 +1,11 @@ # textdomain: mcl_death_messages @1 was fatally hit by an arrow.= @1 has been killed with an arrow.= -@1 was shot by an arrow from @1.= +@1 was shot by an arrow from @2.= @1 forgot to breathe.= @1 drowned.= @1 ran out of oxygen.= -@1 was killed by @1.= +@1 was killed by @2.= @1 was killed by a mob.= @1 was burned to death by a blaze's fireball.= @1 was killed by a fireball from a blaze.= From 40923f83fd34945ef8b1a69fe9d153f97fe4c21a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 19 Mar 2019 08:43:38 +0100 Subject: [PATCH 226/379] Version 0.52.1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9bffaeda7..268a530df 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.52.0 +Version: 0.52.1 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 70498cf5298eb523b47be50f694adc29248e2050 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 21 Mar 2019 10:12:20 +0100 Subject: [PATCH 227/379] mcl_signs: Rename characters file --- mods/ITEMS/mcl_signs/{characters => characters.txt} | 0 mods/ITEMS/mcl_signs/init.lua | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename mods/ITEMS/mcl_signs/{characters => characters.txt} (100%) diff --git a/mods/ITEMS/mcl_signs/characters b/mods/ITEMS/mcl_signs/characters.txt similarity index 100% rename from mods/ITEMS/mcl_signs/characters rename to mods/ITEMS/mcl_signs/characters.txt diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index 8ae79a520..f83e63396 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -3,7 +3,7 @@ local S = minetest.get_translator("mcl_signs") -- Font: 04.jp.org -- load characters map -local chars_file = io.open(minetest.get_modpath("mcl_signs").."/characters", "r") +local chars_file = io.open(minetest.get_modpath("mcl_signs").."/characters.txt", "r") -- FIXME: Support more characters (many characters are missing) local charmap = {} if not chars_file then From 52e1c9e27440fb1087baba25b1e8aaee01dede74 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 21 Mar 2019 10:40:58 +0100 Subject: [PATCH 228/379] Signs: Add colon and grave char, tweak more chars --- mods/ITEMS/mcl_signs/characters.txt | 8 +++++++- mods/ITEMS/mcl_signs/textures/_am.png | Bin 89 -> 1907 bytes mods/ITEMS/mcl_signs/textures/_cm.png | Bin 74 -> 856 bytes mods/ITEMS/mcl_signs/textures/_co.png | Bin 0 -> 861 bytes mods/ITEMS/mcl_signs/textures/_dt.png | Bin 72 -> 856 bytes mods/ITEMS/mcl_signs/textures/_gr.png | Bin 0 -> 860 bytes mods/ITEMS/mcl_signs/textures/_hs.png | Bin 84 -> 1257 bytes mods/ITEMS/mcl_signs/textures/_sm.png | Bin 75 -> 859 bytes mods/ITEMS/mcl_signs/textures/_sp.png | Bin 81 -> 864 bytes 9 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 mods/ITEMS/mcl_signs/textures/_co.png create mode 100644 mods/ITEMS/mcl_signs/textures/_gr.png diff --git a/mods/ITEMS/mcl_signs/characters.txt b/mods/ITEMS/mcl_signs/characters.txt index 83d65050c..d6cd825be 100644 --- a/mods/ITEMS/mcl_signs/characters.txt +++ b/mods/ITEMS/mcl_signs/characters.txt @@ -225,7 +225,7 @@ _dl 4 % _pr -5 +6 ^ _ca 3 @@ -277,3 +277,9 @@ _vb . _dt 1 +: +_co +1 +` +_gr +2 diff --git a/mods/ITEMS/mcl_signs/textures/_am.png b/mods/ITEMS/mcl_signs/textures/_am.png index 8e762a1d035acd5ae283344966cee6c088f61c9e..76a886757c165d1fb5091735f1a04cc1c3cc23b3 100644 GIT binary patch delta 1904 zcmV-$2aot!^A3;~e+&o&00000X}_ib00z%`R9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}?N?crC8rMjXBA!o0))hJm~_tDftT+PWQ|>}*X`lYnN>NEAcP_m=!X6K|1A85 zBju){uxM?yMjWM;mO36Z-s9dWmUF!aKX>}r9^!mHBs68*fAf8<`|01&&Tj*xJniFS zdyvOa(#H_J8a_w%nf>|cr;nkWZaY2ip*`bzdAFSBKh4MNWBl`b5d>o~?Bx{F&Xgmr z>a%2ckX!D!XIxXJn$xQ< zbmnbmzDbIi7ole&7$c1M;S66j{+099keO4LDC&(9e`o=}l5-kvIC6ePF91UJ#FS5b z&l%qFCcXnU13^AvRxGf`aZL=SH*V#Fb4EXoCB&N=BYLn2kwbnZ(?J(Uj zx}!($BaJ-D;8BMR9c}ap`phzU)+tkGn|-B~7t(*#C1L4mt8dz%(k`2K-LiGJ-3?r` zY{l5BiK#W~uc*c?7Eb?N4Tu#_A17fKV5En-PgielG zR4OGoa*kPS2}!{Ts1Z9jiySc^ST-d#dd2Pyxo>d`Tz(0+^k>Kghwh(1E;w`#azEns z1!}9G9VH)tJPSRhF&l&p9k%wQ-S?!wd=G!uz`tzB#_KA@H4_Dj#ope{A5fKZ)&nLI5F?jUHx+qv6j+h+Nv~4wdZI zK}C30@ky&-mxF~B%ed}C0x~R8Kg(<&cRgV#lvcoy?JskkYwcK(-G%;=xp3|MsW}hc zSNFXAaqMw{f{d_5B-B>EhT0llA0VN@3y6my>CH+)vLO%GJh7tbL`cyV{6TxCf87JT z0%q+vUFu{;mM&-pV3mdaeH#P^N<3ttEh2w0oO@f7S6{7+ybWxXP}0=BAvv=%+?c0= zfTZn=xGBzu`&f5sH25OR!fFlqGnjv>x;`(5We+~LhTD(uxROB-+l z^OubP5cZx5-2)zixYsfeQ0y8|W}Ce|ih1oOxf9nvZS0%!MAgB%orG?h+H9f3(=CtEc8s zDds$9>^2!2{JCom`{TEj+0nwaJ~4aACLtx0|3yKhivsjG)tH0@egLBN!n zK-xAU89}Nly|PMQPwZlQ(E~yubM$JGl;yiQk~Tt~0982-qkIybCuNH3mPKCqrbYhV zSa56qgt74AnzL!RwG$_ce_)Pg*Y7%98+?MAAKB$&Ph{WsPTfjCXVlRbV5BVU0nxo^ zc}`g_r|XFQ<~_D`28R>^(y;k15lAq^)$r?RHE1)aHHN~^fy4rD(XvLFE%KZ?NOc!Z z8?eq(EF}eeb3kRgMbE@SA-~9F>h;nKC?ZKr8))oRK;P zZ|H7l^@EO`F^`ZP84E|pz&?;puQ(KxDR2RVOcO)RR0FBsT zlsc-Vfs{ewHz{>_LAh*AES1(CPsu}|hwaW+_YYh47;`@HLSG~ga{qVO9 zIDEY$|N8wuLjVq`6#f8Z_uM8;Jen>50007FOGiWi|A&vvYQF#g010qNS#tmYE+YT{ zE+YYWr9XB6000McNliru;{z2594*iqBvt?b04YgCK~xCWg~_oE03ZOvF!TS>VL$?j q0Wx%O`4uS{YFsMoREzh@p;r^)lojonC+ArJ0000k|4ie21dpyf7bzdLY^*;Ar*|tGY$qEG-y<8PGn-> Wbz++Ne%h~RAU&S0elF{r5}E*%J`{rh diff --git a/mods/ITEMS/mcl_signs/textures/_cm.png b/mods/ITEMS/mcl_signs/textures/_cm.png index 716939ad5f4839523f0c3703752b7696229ef86d..6391ec395eff083e26332b0f662ae243e0f8374a 100644 GIT binary patch delta 833 zcmV-H1HSx9*anaze*(;UR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3004N}<&|5~+$ao% z-&w^h0Z9mnUe^ND>yp5?gSS?F%K7qsd``ZkE;i6bPBsI?^=ZGtn zRJdZ`@xJb!V%qon;?vW+J;e5KpeX3&e$3f8OoEP9XLZ=p(bN%xir7 z`~(ud?R1_)Iq%i zwF_I^FT{I{KD3MV*yUY{5c6@!9~vDy>4#k&Y4~kM^vwMB2bLi5^?K26&hB%Ldv!Hs zD3!xm)c2+Ae-RunNO`M~(F{Mu*mf&ujwLn_>!5j|wLpa!YEDYjsnVpe`$i2@Ogz}o zGdJkIY%a!y+lG=>qsaz5J&1!u12ut}A9JCdx9oh49GN@8lL^5HZ~V~0SH|CIk3e&- z(j|(1>x8nvym-|#rm@JaJG=md=FwEQzPp8&x`{7fe+2|}%j{TSjn^IGQhL^wY|a8d zjVZ)?YmoI501_d$VlpHk5HpEVrfAGY1RWiGDrU}-_yPe^t6a6Ad|GPSaHwg{l0c`=JlDe)q=f0)Ix4k~3(BVBMhEn*;;2C+_huzQmG zCAXmIUvcA~kqZmmpCA_&x9_mvUjzK_ z15HrEH$D6VY8d#&F`)6R00002VoOIv0RM-N%)bBt010qNS#tmYE+YT{E+YYWr9XB6 zI{*L&bV*G`2jc@32^Saj;v_Es000q5L_t&t*JEHH3jAk+(#V1UB0>TIRLS(U00000 LNkvXXu0mjf`G$&< delta 45 zcmcb?<~2cCok7sk#W95AdUAq-+@JKOO96Ha5>8BvrFj>ZF#v(5tDnm{r-UW|LR1a} diff --git a/mods/ITEMS/mcl_signs/textures/_co.png b/mods/ITEMS/mcl_signs/textures/_co.png new file mode 100644 index 0000000000000000000000000000000000000000..9b7afe045854eabd289e9817f8f8bfa641356af6 GIT binary patch literal 861 zcmV-j1ETziP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U1p9vfL;Ph2L34mVhLL#Bwk{RkMRxeh!#)-|l;p zswDF^rrKb&kl=hW4&&c{X84ASV)2mFJeQm!u2fRtih;-bx_gRg-|vf0Pp|e6+rxpP zpqKkGkKg zL5!}5CmeVPNyOb(7QqUnNJTHWvk)&!+~Z{tNndLhwzyx2_ZYot7wfUhs}v#TQ~XojC+Y`YaS z#}*ribl?;ff{%S zKh{D!Z`t`8IWl*GCli7ZW_)VlE90NEN1!=Z=@Lc1bwXKSUA$@<%UI;r9bN!J^JuDD z-`&E8x``ja3JB_!*|EVIuRFx0^sFt}oCSUwQ;7GgLDo+INQB&q#gKqN%p^*gqA?p0 zbae2kSUF4L3j|1&JB0~0A{lU;S8mKP+P^g4S`Oiy4SY69*d{hFA8wzDa-FhrbQ*zYjD)3E%Ya9eCFG$j*ZL^#A|>24YJ`L;(K) z{{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@32^S)xQQ!;!000q5 nL_t&t*JEHH2>vrsM-2l2Zq@<=l$6tC00000NkvXXu0mjfd@PNi literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_dt.png b/mods/ITEMS/mcl_signs/textures/_dt.png index 92cc4a9f19235fd3ffb4f00bf9bc487224acdcbe..a965550eafc379cb968340e4587b942c375beef0 100644 GIT binary patch delta 797 zcmV+&1LFKh*anaze*(^WR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3004N}#g%KW94QQi z|FeoL0oxdxH#`(2g{0=Wl7;yrqA+QoY8@+w7$`8eb^jgB3OUhVQo!>==XW`6l&%7@%PYBy*1Imf-a znlhBi;VkN7e<`~M#|u)*9+puIKSkemDJYI5HW2Hed7-pGg&1m1O4O;+q_NvZ4O2`! z*w8XJ=)P<&#)aF4l2)O~20T58gGK{2fteq3p`Ewve2pBLJHe9)!DthFE8#2SpOiWHF$@0RpU)6#K`LV-HmoO+i(&nz|OPS#rvnbGE$hsA^)#)Uuhm6{{|u zTs^zFe|zy-xCpK=ExA}IUP`GINh?BEjIQvg_2Nsebm^5ZyZkCwZP-37HEp?B^Hy5z z+@<6A_uMUX@1@s416ygNp(76)KFX*Qdu_^0Q)iwweU@1t)aV@B7i#oI?$^}lP+P>( z_OmB7n9V*y(7H}^F#|D91md;`U_ zaB^>EX>4U6ba`-PAZ2)IW&i+q+U1p9vfL;Ph2L34mVhLL#Bwk{RkMRxeh!#)-|l;p zswDF^rrKb&kl=hW4&&c{X84ASV)2mFJeQm!u2fRtih;-bx_gRg-|vf0Pp|e6+rxpP zpqKkGkKg zL5!}5CmeVPNyOb(7QqUnNJTHWvk)&!+~Z{tv9GlYTih?idyL++i}l#$Rf-Vvama5P z9XsipT^?!pWkvMN{PKs$W6CG(=IlP_xOZ1mhEh44P5s!)9>MW~l(MH~G{a9Zw%rPv zV~Y*MI%r;KEl?qbnv)WBsx)crzEQ&x6Aw1@%niCPn~QPbwxOieXtDuM58~j_Kuuug z$69FTEjwQ$N9IoOWI`~)j883mW&D%&2sGy^U83l>PAChki&sr!8H?Py!wW!Y9!+)Y zyIc5BH}L~l0YTj|J2qJ3b%(f=p0y>Lv%pVd3h{n5$odHYiI7{d7!nYOnM5g5G-e}$ zjt)K*D`!c3fdHv;r!c`rBm<7~%8fZj+n1GZGmaL3P|0FIgBJ*}Qc~29B}WZa6-_}^ zvzodVtyyx)nsc_i&Zuf)$<(r$xfQD}o?Jb9@G?&&Y*^?!O=x7P>?3Gq*3O^}4?( zvH`8PaA_K4;$VZr@XB7-H|dZ2@V5c}_kkuT;hP@51CH?c%YG&#?f?J)24YJ`L;(K) z{{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@32^S?jHFd85000n4 mL_t&t*JEJ72L9vZPyzs+%>n=LE8{8v0000v zVi7%8etBW@e*yYa?A&K@Uzc|+Wkf26+o>O}oF@$I2&J598O`ujJlkm%t-!?rViPnw z+6YvM5lyE=lNvd#(+?UjG4WzU&pZ(KEh}PNc^oKdH*z-MnL!HJ3{cxt_+bm3b?aGg zP{GQRFp>$%2s1vl@J{%h_E6-$QIrj!gDv(;MOS*}mK@H4aT-&IS7{J%UkVT+tgSGH1O#FxQOXpJ*@zIw0zM6v zvn1{yK&m_`IM|3}z$v`f#vG$FmX$9twibX;$zni*0s^d*6!~MRAcvZYrl6`>O^a4- zS#rvne{;6H_o!xK$<(r$6|2^YlvK3jVx^Q?TIDL(!nEdUp_W=}Ygn{Fb;In25v_IZ z(o@%-yY1jS=pYBz< ze;xS%y9n1~<314sQ6JJhHZREr^#CAHx+(&ZdaHum0zY4qc+{G(!GaQ|5KT?CR9AGQ zo)Z3OnAg(X7UkgBg-0@vOH!TMHBahLV^h4&1?`?&tzvoBI+MkQ(*qwG$alnd-0p^V z{(i&V67Y@3Z$G)`Wb7)#u#W zpJqYtF$|C{(_k15%u!BQ%-`D>o<<&L6m=GnhO6j8!PnW3e4z{?t*r|msJ*00?Je+X@> zCe)yFy!_aQ!BH1sq@!4l2MveAHmsdIz|p-o|Htzhr~3cfhp$ffqv(&K-=PRO?GyiZgnt1N02F2J4C06Y z0007FOGiWi|A&vvzW@LL32;bRTXO&aE+YT{E+YYWr9XB6000McNliru;{z25A_UWI zr$+z)03u05K~xCWV_?7v{xdNAhhhki;XeZdBg20*HMm8Y7>EY|NM{WAv(kl600000 LNkvXXu0mjfS$s>0 delta 67 zcmaFK88SiKmX(nK2$qUSdjKh>k|4ie21dpyf7bzdyq+$OAr*|t5eE-29Aw~p#P~D* Rm02c8xu>h2%Q~loCIBeu5?cTO diff --git a/mods/ITEMS/mcl_signs/textures/_sm.png b/mods/ITEMS/mcl_signs/textures/_sm.png index dc3c258d44f0fd34236ad067006117d870fdf21b..9c576a4d06f41c3b09d0f75e9f5ae0bbae580d7b 100644 GIT binary patch delta 836 zcmV-K1H1f7+Xj#$e*(>VR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3004N}<&|Bs+$ao% z-&sYLfFy*(axgztvx8ZF4w!V`?t7D}B=a_=+F-Si;CwO;gL5!}5CmeVPNyOb(7QqUnNJTHWvk)&!+~Z{- z$zN+1wzyx2_ZYot7wfUhs}v#Tt5Vr;t=G{+Vjh;`7s&|08E3^gYu>Qrgc*nOjhB_h%#XFu&RcfAMvly#;K_twgc+Y&_{#Vv?Gb3s zRk}pcZ=FyUSQoFF#xfSUb%z&#&^(&z)_1q?p>E;_f3O0Ax@C53u*T~SaVb4(OEzbL zpT-p8{c4c)695t+w_-6QAP_T&Ql@CkMg$!ld@5GXlK27vQsquzf{jQ99OsoAbBwkx zE8k`uEdZgC#efDc5MZUGs2@v?8mcOqf~saUbuC)6vexoWCL1n;nFn9#K8uK;g!9vZ_*$4;co-{ z?*mOx!Z$s92YAx>$QOuHK>z>%0%A)?L;(MXkIcUS000SaNLh0L04^f{04^f|c%?sf zJ^%m!2XskIMF-;p6$uv*Ylg9m0000JNkl1KgF(pC#W95AdUC=6=6}YCPye-lVl%MZp00i_>zopr0Dk!o A{{R30 diff --git a/mods/ITEMS/mcl_signs/textures/_sp.png b/mods/ITEMS/mcl_signs/textures/_sp.png index 59bbc581892d3302494487c1abb63fe86c0fdcdb..c51f26b16756c41caf2f2fc7221b626ea859fded 100644 GIT binary patch delta 853 zcmV-b1FHN{;0BNve+&o&0002>moydt00P;1R9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}?Uq}z93cpX-(5wPARvOvv9+zr4zm3G+Mc=PBvm=d<7kcAG=lP>J>mTEeS~i) zlqrU!=DFk?QBp~TD+V5~a`hC`Y9D3u`AHsP+bd>azJ}$Ku}kh z9UH9ixJ(>M_uP`jdD7LGLcER!S>FZ_BKTG;h6Ds+Cee9M7_$)}jt)K*D`!c3fB>m- zr!c@qBm<7~^o==2OP7@|F|HPXP|0FIg98LuDJk;Dk|T$zil(5dSxsGw)+{+?%{g11 zcT_d8e`IRe%-o7q7f-I9-Q2x+EnEawn3h~D6fdRJ3a1sOD`r<{)OzqCM>_P#haG;D zqc)^ZOHEsD*1VNgJ9p_g{yldK-FxZvq!X!hrc=*++UaLG>p-pz8ENRq!-kJC>Wv!h zWBWvnUda8K8f|KmSXz2^rv|avhY6b3iB4u9f5wSG+$I4eG*4#HDJ7odCbL+0UR4Zg zq!Ui3Nel$jNvwlz?C#|L$Sr94D{lNda$%zTALPPBx5@p=?GtLft}lu#K=TyNm_`}6 z*r0HFWv}y_^yNPMtAV$nx1qP8x1qP8)eqd+_=g{U0@Drj#SV=B?f?J)0%A)?L;(MX zPmj#M00009a7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6$v9Q5zSxF0000CNkl Osr7XAb6Mw<&;$VDZx1Q} From 267cf5c4a643668e28c85f4cce7b0f7197325c08 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 21 Mar 2019 11:00:23 +0100 Subject: [PATCH 229/379] Signs: Make all chars 5 or 6 pixels wide --- mods/ITEMS/mcl_signs/characters.txt | 2 +- mods/ITEMS/mcl_signs/textures/_0.png | Bin 80 -> 877 bytes mods/ITEMS/mcl_signs/textures/_1.png | Bin 80 -> 883 bytes mods/ITEMS/mcl_signs/textures/_2.png | Bin 83 -> 876 bytes mods/ITEMS/mcl_signs/textures/_3.png | Bin 85 -> 882 bytes mods/ITEMS/mcl_signs/textures/_5.png | Bin 84 -> 886 bytes mods/ITEMS/mcl_signs/textures/_6.png | Bin 85 -> 891 bytes mods/ITEMS/mcl_signs/textures/_7.png | Bin 80 -> 889 bytes mods/ITEMS/mcl_signs/textures/_8.png | Bin 80 -> 874 bytes mods/ITEMS/mcl_signs/textures/_9.png | Bin 86 -> 886 bytes mods/ITEMS/mcl_signs/textures/_ap.png | Bin 72 -> 874 bytes mods/ITEMS/mcl_signs/textures/_bl.png | Bin 78 -> 880 bytes mods/ITEMS/mcl_signs/textures/_br.png | Bin 78 -> 881 bytes mods/ITEMS/mcl_signs/textures/_c.png | Bin 82 -> 881 bytes mods/ITEMS/mcl_signs/textures/_c_.png | Bin 84 -> 883 bytes mods/ITEMS/mcl_signs/textures/_cl.png | Bin 79 -> 880 bytes mods/ITEMS/mcl_signs/textures/_cm.png | Bin 856 -> 871 bytes mods/ITEMS/mcl_signs/textures/_co.png | Bin 861 -> 873 bytes mods/ITEMS/mcl_signs/textures/_cr.png | Bin 80 -> 878 bytes mods/ITEMS/mcl_signs/textures/_dl.png | Bin 86 -> 884 bytes mods/ITEMS/mcl_signs/textures/_dt.png | Bin 856 -> 869 bytes mods/ITEMS/mcl_signs/textures/_dv.png | Bin 75 -> 886 bytes mods/ITEMS/mcl_signs/textures/_e.png | Bin 81 -> 880 bytes mods/ITEMS/mcl_signs/textures/_eq.png | Bin 76 -> 867 bytes mods/ITEMS/mcl_signs/textures/_ex.png | Bin 74 -> 875 bytes mods/ITEMS/mcl_signs/textures/_f.png | Bin 82 -> 885 bytes mods/ITEMS/mcl_signs/textures/_g_.png | Bin 85 -> 884 bytes mods/ITEMS/mcl_signs/textures/_gr.png | Bin 860 -> 869 bytes mods/ITEMS/mcl_signs/textures/_gt.png | Bin 75 -> 872 bytes mods/ITEMS/mcl_signs/textures/_h.png | Bin 87 -> 893 bytes mods/ITEMS/mcl_signs/textures/_j.png | Bin 79 -> 881 bytes mods/ITEMS/mcl_signs/textures/_k_.png | Bin 91 -> 887 bytes mods/ITEMS/mcl_signs/textures/_lt.png | Bin 75 -> 865 bytes mods/ITEMS/mcl_signs/textures/_mn.png | Bin 72 -> 873 bytes mods/ITEMS/mcl_signs/textures/_o.png | Bin 80 -> 878 bytes mods/ITEMS/mcl_signs/textures/_o_.png | Bin 80 -> 878 bytes mods/ITEMS/mcl_signs/textures/_pr.png | Bin 90 -> 895 bytes mods/ITEMS/mcl_signs/textures/_q_.png | Bin 83 -> 883 bytes mods/ITEMS/mcl_signs/textures/_qo.png | Bin 74 -> 873 bytes mods/ITEMS/mcl_signs/textures/_qu.png | Bin 80 -> 876 bytes mods/ITEMS/mcl_signs/textures/_r_.png | Bin 85 -> 887 bytes mods/ITEMS/mcl_signs/textures/_s.png | Bin 80 -> 881 bytes mods/ITEMS/mcl_signs/textures/_s_.png | Bin 83 -> 885 bytes mods/ITEMS/mcl_signs/textures/_sl.png | Bin 77 -> 882 bytes mods/ITEMS/mcl_signs/textures/_sm.png | Bin 859 -> 871 bytes mods/ITEMS/mcl_signs/textures/_sp.png | Bin 864 -> 862 bytes mods/ITEMS/mcl_signs/textures/_sr.png | Bin 77 -> 879 bytes mods/ITEMS/mcl_signs/textures/_tl.png | Bin 74 -> 871 bytes mods/ITEMS/mcl_signs/textures/_vb.png | Bin 71 -> 873 bytes mods/ITEMS/mcl_signs/textures/_w.png | Bin 83 -> 876 bytes mods/ITEMS/mcl_signs/textures/_w_.png | Bin 88 -> 889 bytes mods/ITEMS/mcl_signs/textures/_z.png | Bin 79 -> 886 bytes mods/ITEMS/mcl_signs/textures/_z_.png | Bin 81 -> 887 bytes 53 files changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_signs/characters.txt b/mods/ITEMS/mcl_signs/characters.txt index d6cd825be..8574b781b 100644 --- a/mods/ITEMS/mcl_signs/characters.txt +++ b/mods/ITEMS/mcl_signs/characters.txt @@ -225,7 +225,7 @@ _dl 4 % _pr -6 +5 ^ _ca 3 diff --git a/mods/ITEMS/mcl_signs/textures/_0.png b/mods/ITEMS/mcl_signs/textures/_0.png index 93070cc75ff6c58a9c4c8085b15ccee54865ed02..e764f3d6a0a224ad3b529855691b012fa69d317c 100644 GIT binary patch literal 877 zcmV-z1CsoSP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HWvfdyFhX1>YEpnuPP$&k=s0kZ1}?&2z~)qNI`vS9CmHh>jJo{VEw;|z6PWw5OJ+7vQTEU%#cuFGrNpwj*h+W9_{ovhtFR_bt%jG!~A?B@+Ut+Z7 zq%U&0x#6c7(cSaY3z3-OV|j?(7~RJ>uhrF*5vd&ZqW&yp^`Lkll(L3pRKum{+o}cC zvBU;q9W)Qr7N`&-nu8K`sx;_aZKH-MCO+BFGB?D1%3O>Kw*@85N`nn}dJqSR25JH^ z-{wNgZ(05tIXriQCKHSiM!c!vJ>ggC&CnP#b%~;1aY9;PUOaOe)0pJu9a=y@W5-li zd{+$*c@rPNPG-8o>{wup$7SMBy62WG&H_D+DQw7OeH%cC;9D^n5)gKIcLlBjH)J;l8c4nrIcFXw8C`7=n9Qm z4?g5bhaUN`!;f;*hV*HvY0J%;x6*3oE*;yy=Wd~UFTI|0B9+c`>X}bF{VZo4$h9FO z4IO#d@KHv+QKP+WpQzCbxzDN5rZ$PCrDu0)5S#rmLGw7#$qd9e5s2F)fQ07BEIOsc zliXw$3u99#gBt0C(`ga|!E_Sqpc}h8xlg$TO@GCWKOz?verm zWC5DHaK<#sz`+KE(<^(O-=r_M;a?4W8~Qf%ZD{^gjE-Ns@EcnkcB5Zv#1sGk00v@9 zM??Vs0RI60puMM)00009a7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6$vdANkXga z0000SNkl zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?QqcBO!2k6#BR>+bB=p;HDyF9hqI_3OW8drUI?Y^VHwqMDf+f+ zL3J##fmjF43$+C*#E9mkM4c*48oO=OFvY}!4J~s++?UM7xNzH0(yBDsfTss>kZ7PL z5c6X$wEdRtuaU!ZCulOk7-7UuHGC!fo%%2|=Sp3o=y#lu7MK^WoW?X3xpjvY5YRj^ z)g9km!%N=87qE+&?l3zRSmSk@xRjo`C7ZKAPh$!PGFd+c5F+?iOojvmV#XmsnW8Zp z5#s3JQ!#Uv#1{yVDt8JKY(z5PI4|EAW3+Wy`4;17*&8H_0Sz_~V5OwUA4`rLs=Cf2 zRn2PZTC`@#DQnKz@;alci6v9ZX69C`x_EN+?B?#pYvCd|!nEXKp?E2!RyeINT`{^s zqt=TrxzeRqzU=a=T(u#6T58&Iv*xX|+PO=|_V2k{=-x}Og9cJ*q@g1Z8$QaY6S+2J zrl~Ven?B2|4{CI_?He`vAopu(bf_(2Y3tdO8pLKlOwc+`bTI=lP6Xn%2q2+(F^f(q z@gldF#lqMW%AiKN;B;EVKrjtro%CS$B=<{hLDRqD#{WbvEOh?|xv&HC=9Rcb$ye5yAA) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa($J_`9G zMn_KiA(w|6ep?YeJ-_`R5>tFFFR`1m`<&z6T}>I0%HeG4$5!?TiWfpDds;>{Jc_aH zT2LKZY#`P_^FnQb3NfNNDN(0Nlg92FH7qglU_;N`5cef>F)rLTl(Z^MHsI+&9Bdk> z3B>$Z3vIt;`)lOz+zFaYFh-d1Qw?7Uf2TeS&AC#SDEb{Iqy^T+E2puHMQ*jw0s@*R zrn=+1Yk0|<_yTq@(;a5V25Y=-6PMC6w`6k`=xI#hKql+Q073-cip7wCK+L!#C{r|M zBSIVU5nN%Ic3c`TV8imHL+xB+05LERTodLp55HNcr9E6SD2PuEEF%L)C#8+rYmMw zXw-V~C0Dxi%9mY!m8&+SPfJZ(Zq~e&Ry%j;IQ~6%3*CF^bbjSjU%ENwk|QiIs+hY4EOi7sX!#)&}O76BwQFJ{px zC0^tfvsf61LK)OZ7o1Lu7zn08tdkz>p5%VXEok~z-1wi!g@x|_AQu+8L+)p8Ur_6H z|D(tTv`*oQX_SeJ4GP06dtLuYzukxbYT(<@x1n!C>#JgReA zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGk{uxkhTmO9mLMR4%dxes$_}#p{MzQ+=2DeO z9!IOy<{&5^dODoHeva@1g+xRB6z;`bG^)OnkDTXKsl5l(`reZVO79l?EH|^dJs44b%i; zzO99p-?IEQa(M0pO(qy4%y?77d%~~Oo1rmg>Jml2;)Jxox_IU^mNCiA7Fs|+W5-li zd{+$*c@rPNPG-8o?ATz9$7SMBy62WG&H_D+DQw7OeH%cC;9Id65)gs#%x50 zqk~Vy%2^U0AV8|zDGaa?$$;ZLePfQ%(q-jKjH_iGkSqo?I6#1vk|KXBIdZ7#ypL2h ztEp?znkA>KIcLlBj;bb>Of8$4Te0fm$X}bF{VZo4$h9FO z4IO#d@KHv+QKNlqpQzCbxzDN5rZ$PCrDu0)5S#rmLGwD%$qd9e5s2F)fQ07BEIOsc zliXw$3*%5IgBt0C(`ga|!E_Sqpc}h8xlg$TO@GCWKOz?vjF3 z$O1G^;f!gNfr||ar&snm|C7GlhkrHjZRp$3x1sq}F*-i&!f$QrcBRejIK}_~00v@9 zM??Vs0RI60puMM)00009a7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6$vdUW-Zri z0000XNkl zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa($J_`9G zMn_KiA(w|6ep?YeJ-_`R5>tFFFR`1m`<&z6T}>I0%HeG4$5!?TiWfpDds;>{Jc_aH zT2LKZY#`P_^FnQb3NfNNDN(0Nlg92FH7qglU_;N`5cef>F)rLTl(Z^MHsI+&9Bdk> z3B>$Z3vIt;`)lOz+zFaYFh-d1Qw?7Uf2TeS&AC#SDEb{Iqy^T+E2puHMQ*jw0s@*R zrn=+1Yk0|<_yTq@(;a5V25Y=-6PMC6w`6k`=xI#hKql+Q073-cip7wCK+L!#C{r|M zBSIVU5nN%Ic3c`TV8imHL+xB+05LERTodLp55HNcr9E6SD2PuEEF%L)C#8+rYmMw zXw-V~C0Dxi%9mY!m8&+SPfJZ(Zq~e&Ry%j;IQ~6%3*CF^bbjSjU%ENwk|QiIs+hY4EOi7sX!#)&}O76BwQFJ{px zC0^tfvsf61LK)OZ7o1Lu7zn08tdkz>p5%VXEok~z-1wi!g@x|_AQu+8L+)p8Ur_6H z|D(tTv`*oQX_SeJ4GP06dtLuYzukxbYT(<@x1n!C>#JgReAy{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@32`w}1 zNFIj(001IML_t&t*JEHH7BDg}F#N|Nh9StnM2vPuY>NInE(I) literal 84 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|!3HE<7s&_%DQQm^$B+ufWCgB2?gtf^oLTL3 hd0IjjXDRYCFzA2e{TzDwqdQO;gQu&X%Q~loCIEF461o5Y diff --git a/mods/ITEMS/mcl_signs/textures/_6.png b/mods/ITEMS/mcl_signs/textures/_6.png index 6b91013dbcc17e524e9a20cd3392e7c38c890f6e..31fcd7d727854b0b8b34b2f88d9c01ec6f4eee54 100644 GIT binary patch literal 891 zcmV->1BCpEP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(A?{1&VqCawC}~xiY{1ilIM_5$ z6Nve-7TSKx_SeYaxf3**V2m*1ry9Nz{!V=unscQtQS>`bNDHisS59LYi`;6V1q3ut zOm)Y1*YJ`z@dfN+raR1z4c2(wCN8CCZpr2>(9@X0flStq0fY#?6^kJOftYbgP^M_i zMua#z_*AT%CGiCUq{^Mb1RIeIIL^yA<``{VR=&l!TJ{0SVnBlf1Xw94^2d@RhpMjo zNL90%x)!Zja>|->w!H4BYGTRMvYELRt1g~gJ-fMk@mjbDt}rdRSSVgfsTEEuOjpdV z(5Us|ORjY3l`p&eDpzetpO%`o+^l&kt#!5*D8foar!-kJC>O`(h znQ7|G)27cd>w_AdWBW#pKFIx=8XanjSlW8_qz19s4->Sm6J5+ej1z&lEdoerUd*CX zO1#J|X0b31g)*p-E;yYQF%V3HSSLN$J<0u&ThR2cxbZ)c3k%)p;s_`nK(1Iylaui};8jQ{`u z24YJ`L;(K){{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@32`xL~ zla{pr001XRL_t&t*JEHH7BE8T|L9`>(N!|x(*7TdaVUcSacW0a@t=V@0059<2Ld(8 RVxa&4002ovPDHLkV1kZEpe6tS literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|!3HE<7s&_%DH%@}$B+ufWCf`|?a2a-irwy( j%ewwcFs-KHs-{an^LB{Ts5* zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?Qqc{24WpFFVq&O5F?tC5_PIHY3#O9!xR$_HnhwQabGeQPV2#&p;!=9%mTb-fJ&h?G$YlK(K#1U5F&PpNh#7|jWs1gZ zM2Mq%ds@y3|uo20C#t&V{Mv=T0e4Myrboam*#H0l z24YJ`L;(K){{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@32`&VG z*yu|D001RPL_t&t*JEHH7BDg}F#N|Nh9dYMo6i3@1(@(zh@y>&f%*Udw5bLG`5&#F P00000NkvXXu0mjfxE7ET literal 80 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|!3HE<7s&_%DREC1$B+ufWCgB2?gs^!6gyYW e5{mr9$PmAo>l?%QL%V@W7(8A5T-G@yGywop-xC4= diff --git a/mods/ITEMS/mcl_signs/textures/_8.png b/mods/ITEMS/mcl_signs/textures/_8.png index af994c2aa39bf9b6d49fed9d90e5575fab0b571e..b61f4e294c2076ddbc94e199619e248ff1778d9e 100644 GIT binary patch literal 874 zcmV-w1C{)VP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HElH4E+hTl0wj({YD#Bnf7Rc?^u=f@_!%~F*~ z9tX;R)j|S&f_50ce$Ma%g+xazJ>w7W; zqbuwQ2OdHa(faZtSb-F&=mjkc@sdQ0lVr3cAH*)?`hM_kqnFsly5;g5iV*Ww$S*P4 za?%&M+}!Zfis>arTWGmY8_3p=WN0`;xgB7j7q%v?@(D;ORjeY#OKu z#C%%|oqo&duaU!ZCulOk7-7bn8r~CrrQQt9xl)%X`V}Xn1=htYr?HGhZne+?0-8If zddByx;URD01K7n(&oDbSSmSY-IF#haBn9BOiA7QI6V>J}otExmoj8TJ7AW zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(G|ykk(lCZd5PVe-RB(l?rO@2R1RlTKen<*P`nUI+0!zr;Zclj z*MjQUVgs=bnipydREQDHNr^gDnlyIbs9}kT2OE0khPW@8i*ez$p`=x5vH?#I;$YK2 zO(5pST4?(%+g~Gx=T6XMf-%C3pKAC@_&fDsXwH?oMA7d!AuX^jUOA0rEOM)b77)-p zG1VR4UBgS>#22uOneH$JLl zMua#z_*AT%CGiCUq{^Mb1RIeIIL^yA<``{VR=&l!S^z?EL=0$ffB-8cMgCZFC;lvmYX$irPa<|I*xzO-9qy|5ldUop41>V`(c9Cb)t(Ih;bqiw?zO6&5K!d zN{JV_#Vi)ap-=`j(gml}A_jtK5bLA|yC=C{atoUN6*vATa$%wSKgflJ?vVSL+ZWV& z-Tx@E0j*QGVj5-QVuQl)%3jxh(r@?SzZ&>9^lj+d(E6&F9iMjLZ;BaqsMnk9asU7T z24YJ`L;(K){{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@32`&%l z3Nga~001IML_t&t*JEHH75s-{6af@A6E@q*kpKVy M07*qoM6N<$f>d6OX8-^I literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|!3HE<7s&_%DOpb!$B+ufWCf`|?FlUG=Z* zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(sJw_j~i}lFmJrp74qmVyh zbmXKTa(TGnw-wRT^V<(1F~!&N61zFO&pGbh)szvb9L}bGY-Nw2cp;Rsr)5;bqZr$+ z1=X>|24WpFFVq&O5F?tC5_PIHY3#mH!x9q@HuTI5abGeQtUAfS0- zsyn{BhL^mFFJKol-C=fYu*T~)aVb4>OEzbLp2idoWU_t?AVl!3SPTgW#EeUVGDTxH zBE-?br()$Si7yZ!Rqhlf*ob7nabCVL$7t)a@-4>I0uYKLVnBlf1Xw94^2d@RhpMjo zNL90%x)!Zja>|->w!H4BYGTRMvYELRt1g~gJ-fMk@mjbDt}rdRSSVgfsTEEuOjpdV z(5Us|ORjY3l`p&eDpzetpO%`o+^l&kt#!5*D8foar!-kJC>O`(h znQ7|G)27cd>w_AdWBW#pKFIx=8XanjSlW8_qz19s4->Sm6J5+ej1z&lEdoerUd*CX zO1#J|X0b31g)*p-E;yYQF%V3HSSLN$J<0u&ThR2cxbZ)c3k%)p;s_`nK(1IyxeuXZy&iU0rr z24YJ`L;(K){{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@32`(`y zYb zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?QqcBO!2k6#BR>+bB=p;HDyF9hqI_3OW8drUI?Y^VHwqMDf+f+ zL3J##fmjF43$+C*#E9mkM4c*48oO=OFvY}!4J~s++?UM7xNzH0(yBDsfTss>uxX$s z5c6X$wEdRtuaU!ZCulOk7-7UuHGC!fo%%2|=Sp3o=y#lu7MK^WoW?X3xpjvY5YRj^ z)g9km!%N=87qE+&?l3zRSmSk@xRjo`C7ZKAPh$!PGFd+c5F+?iOojvmV#XmsnW8Zp z5#s3JQ!#Uv#1{yVDt8JKY(z5PI4|EAW3+Wy`4;170SJ|hP2y_<0ai+i{ITT7p{naV zQq`=cu0?B>oU-PeEw3}GnpiTmY-Vo7s*5LA&u;EsycRBkBTP#!7K)crYK7AZ(-osD zG-|#0k}F+$<;yO=%2gZEr=_MXH*4NXtDU=aZ2z9Sh3>udI%pu3MjATuu;HVOI+1Hr zW|}(lwCS_V`k+Q<+rCkw4|2bzMu*xWmbRWfsX=V^!vwA4L>Ds<<3u2CivSXu7qjS; z5-)O#SuBiAp$uxI3r?p+3WNnuK0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(A?{1&VqCawC}~xiY{1ilIM_5$ z6Nve-7TSKx_SeYaxf3**V2m*1ry9Nz{!V=unscQtQS>`bNDHisS59LYi`;6V1q3ut zOm)Y1*YJ`z@dfN+raR1z4c2(wCN8CCZpr2>(9@X0flStq0fY#?6^kJOftYbgP^M_i zMua#z_*AT%CGiCUq{^Mb1RIeIIL^yA<``{VR=&l!S^z>NJ zrNoQeVipVIP$+{M>4MW~5d*9_mvUk!X4`Zn}!Xnj@8j!(PrH=OBqs+`<;S^xk5 z24YJ`L;(K){{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@32`>00000NkvXX Hu0mjf2g{n} literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y;!3HFk*Rf{-DN#=s$B+uf zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?Qqc{z$o1>sJ$fIpi}lFmJrp74qmVyh zbmXKTa(TGnw;9pX^VOEzbLp2idoWU_t?AVl!3m<$OB#Ee6NGDTxH zBE-?br()(va=t)-RJl`_U?Y+N$9eh27^AJr%C{It3qYu3Y!Y7^2(VI8#t&V{Mv=T0h5MysS>yNrvLx| z24YJ`L;(K){{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@32`?CO z!i7Zu0013HL_t&t*JEIy9rzE$C;}Ml|LEG7uo#2eObP%1vqlH|5NrX500000NkvXX Hu0mjfCa;P8 literal 82 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|!3HE<7s&_%DM?Qk$B+uf zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?QqcW=TO;U#b43)sa>cbFXutns={TuRT}lFeD5r!j>CnXDfJ2oZcMCPM-OG2@V+OwpK) z2yt}qshBxS;tK>wl{b@Alt+0EUH*TO|`glWmeLh({ct#Ddlx?*&N zMy(fLa-~bJeA(q!xoSiDwA8faX3bk^wR4w_?cZ~^(7l&l2MwgsNJB>+Hhh#(Cvt7d zOjBo`Hhq>^AJph<+c#?TLGIVo=ulh4($=#lHHgiAn4oo>=wb$9oCw5i5kNxoViuiJ z;ze#Ti-oZ%ltGPj!RfS!fnXZMI_bggN$!{2f~J4PjsJ;USm^!_a$%u6>-r}Bb{qbyfp0_KhQ1B0zlz!MYZv|ood0&JV?r*t00006 zVoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z25I~Kdt ze-{7%03b<3K~xCWV_={P_z%S>0vPQ7=-QaDnZ<;~Y}^)6001252mOG?H+292002ov JPDHLkV1iZ*lk@-p literal 84 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|!3HE<7s&_%DQQm^$B+ufWCi&@?FlUG=iG!3 igfy;Xy&CX|f#Dki=lA1>=g0z;F?hQAxvX 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

bTV`3A*ZBDP2_$^m={$#W=GF9JJLkvk zggwFEpOZn1u81cbcnC?v-B%XD3ZzIyFSxT1FH79xWf4hVYZtb-Ux@b@y=fQgvCFFz zA?D+d-!wXZcG5SyJks#Xis+g7b@Alt+0EUH*TO|`glWmeLh({c ztw>rCx?*;PN39oMa-~bJeA(q!xoSiCwA8faX3bk^wR4w_*T3g(p?fdA4jL$>k%o>u zZ1^anPSo0znWoM>ZTc*;KB&=oZC|L-8@XS9Q=>y|5lh?8p44DA`w@cHaiWVEh;bqi zw?zO2&5K!dN{JV_#VnR}P$`2N>4MW~5d*c*7(TIg8KE7 z0|PWK7b2rk;0yo&01-( zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa($J_`9G zMn_KiA(w|6ep?YeJ-_`R5>tFFFR`1m`<&z6T}>I0%HeG4$5!?TiWfpDds;>{Jc_aH zT2LKZY#`P_^FnQb3NfNNDN(0Nlg92FH7qglU_;N`5cef>F)rLTl(Z^MHsI+2ELa+- z3B>$Z3vIt;`)lOz+zFaYFa~lz*YK6_ck08?oGW#SqTg{sT3}tgvIfgotUAfS0- zsyn{BhL^mFFJKol-C=fYu*T~)aVb4>OEzbLp2idoWU_t?AVl!3SPTgW#EeUVGDTxH zBE-?br()$Si7yZ!Rqhlf*ob7nabCVL$7t)a@-4>I0uU-$3}|qG04pU${#bJ4P}OxG zscKeJ*P=B`PFZu#me(CsO)QyOHZ!+k)y0#mXE%2*UJDn&6{aN@3&l$*wZdtI>5ADE z8ns@0$(1g>@@1D_<*E(o(^Auxn>BBx)y`cyj(^YHLib*J9W;GOIy#L)F3wdVS?6mqKg@baUu}6MF0uSi&=C^ zi5I!WEEdM0PzE*91*g*@27+l2>!b&}C%Ip83!45FH~uGbVWIm!$c2UOko%e27u0&) z|0uEnty8#S8fD^QgTnC2Ue|xpZ};K98u&K!ZRp$3`l^^6pLXGIfWUUAQ&F?_00006 zVoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z25Fbt(a zU#0*602@g}K~xCWV_+Z^{3j^EgiV%-EVC&v^FKk`0BTMJ1lVs6sQ>@~07*qoM6N<$ Ef|iJdasU7T literal 80 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 M07*qoM6N<$f^^K1GXMYp literal 75 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJz0U{m4&*%XuAx{^_kP60R1<^n1{sj+0gZUU% Xo#6OU!TanIP?o{d)z4*}Q$iB}63!9s diff --git a/mods/ITEMS/mcl_signs/textures/_e.png b/mods/ITEMS/mcl_signs/textures/_e.png index 9cca45b5ed67ec7ca57ac8c7fbc0688f86a4356c..316e966a1c6f29d4620cf36f40d41f6e906acdaa 100644 GIT binary patch literal 880 zcmV-$1CRWPP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?QqcsJ$fIpi}lFmJrp74qmVyh zbmXKTa(TGnw;9pX^VOEzbLp2idoWU_t?AVl!3m<$OB#Ee6NGDTxH zBE-?br()(Ti7yZ!Rqhlf*ob7nabCVL#%SxZ@-4>E0uU-$3}~=X04pU${#bJ4P}OxF zscKeJ*P=B`PFZu#me(0oO)QyOHZ!+k)y0#mXE%2*UJDn&5vC;<3&l$*wZdtI>59=6 z8ns@0$(1g>@@1D_<*E(o(^Auxn>BBx)y`cywtvsvLib*J9W;GOIy#L)F3wdVS?6iqKg@baUu}6MF0uSi&=C^ zi5I!WEEdM5PzE*91*g*@27+l2>!b&}C%Ip83!45FH~uGbVWIm!$c2UOko%e27u0&) zUliGZ)-GHzjWThtL1B1huj`xi+im!-2EGk_8~Qf1{wik2uU+^XufKMzD`J@U00006 zVoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z25F%YO& zGN=Fm03At0K~xCWV_={i_z%S>0w`=oG(kpeD)F010RRBMR0sRdf{lCt0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(+bB=p=HDyF9hqI|4TiGKhUI?Y^X&KeNx z5c6X#wEdRtuaU!ZCulOk7-7awHGC!fo%%2|=Sp3o=y#lu7FZXroW?R1xz$1o2xy*| z>W=TO;U#b43)sa>cbFX;tns={TuRT}lFeD5r!j>CnXDfJ2oZcM7DEC8G2@b;OwpK) z2yt}qsaQEn;tK>wl{oU-PeEw4MOnpiTmY-Vo7s*5LA&u;EsycRBkD@;o+7K)crYK7AZ(-pHT zG-|#0k}F+$<;yO=%2gZEr=_MXH*4NXtDU=a9RHrXh3>udI%pu3MjATuu;HVOI+1Hr zW|}(lwCS_V`k+SV*uGJt4|2bzMu*xWmbRWfsX=V^!vwACL>Ds<<3u2CivSXu7qjS; z5-)O#SuBi0p$uxI3r?p+3vqb;^002ovPDHLkV1iPFi(UW# literal 76 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|0V3b8zA^(y346LYhHzX@PEg>Hko+esqR7U; YP*uRhXgNc;3nFVdQ&MBb@02&$(%>V!Z diff --git a/mods/ITEMS/mcl_signs/textures/_ex.png b/mods/ITEMS/mcl_signs/textures/_ex.png index 83500a411b3f2232783f3743d5200d0dfa22aaa6..65a76aad196a84653ee781ec47526e19ae030890 100644 GIT binary patch literal 875 zcmV-x1C;!UP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?Qqc{z$o1>sJ$fIpi}lFmJrp74qmVyh zbmXKTa(TGnw;9pX^VOw7|T0U5nN%Ic3c`TV7{WHL+xB+05LERTodLp55HNcr9E6N0^peEEF%L)C#8+rYlBQ zXw-V~C0Dxi%9mY!m8&+SPfJZ(Zq~e&Ry%j;*#13t3*CF^bbjSjU%ENwk|QiIs+hY4E8i7sX!#)&}O76BwQFJ{px zC0^tfvsf6LLK)OZ7o1Lu7zn08tdkz>p5%VXEok~z-1wi!g@x|_AQu+8L+)p8Ur_6H ze^F!uTDx$?G|I%m28H33y{>Q4Z@1yU8u&K!ZRp$3`m2~7zjonoufuk%Hv9rP00006 zVoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z25F(P1( zV<-Rs02oO`K~xCWV_+Z${D(1^u*p&=NWAS70ss=}0td>S-ZlUL002ovPDHLkV1nOR Bi~;}v literal 74 zcmeAS@N?(olHy`uVBq!ia0vp^j6lr8!3HE3cV7<&Qi7f?jv*C{$qtPFHwtk?hA=Q3 Xu3-HgR+VQ2lw|O9^>bP0l+XkK29^-H diff --git a/mods/ITEMS/mcl_signs/textures/_f.png b/mods/ITEMS/mcl_signs/textures/_f.png index 1ac67a01bd338c5f383c6a760db752bb55ad6571..1e431df13bd8119194df63f01ca5de10f53c9b4c 100644 GIT binary patch literal 885 zcmV-*1B(2KP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?QqcsJ$fIpi}lFmJrp74qmVyh zbmXKTa(TGnw;9pX^VOEzbLp2idoWU_t?AVl!3m<$OB#Ee6NGDTxH zBE-?br()(Ti7yZ!Rqhlf*ob7nabCVL#%SxZ@-4>E0uU-$3}~=X04pU${#bJ4P}OxF zscKeJ*P=B`PFZu#me(0oO)QyOHZ!+k)y0#mXE%2*UJDn&5vC;<3&l$*wZdtI>59=6 z8ns@0$(1g>@@1D_<*E(o(^Auxn>BBx)y`cywtvsvLib*J9W;GOIy#L)F3wdVS?6iqKg@baUu}6MF0uSi&=C^ zi5I!WEEdM5PzE*91*g*@27+l2>!b&}C%Ip83!45FH~uGbVWIm!$c2UOko%e27u0&) zUliGZ)-GHzjWThtL1B1huj`xi+im!-2EGk_8~Qf1{wik2uU+^XreJofkEkNW00006 zVoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z25F)D6U z>ly$603u05K~xCWV_+Z${D)!`0XSep7l4Xks${}uI95TtW|9d2y$c2dB<$Yt00000 LNkvXXu0mjfycvZe literal 82 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|!3HE<7s&_%DM?Qk$B+ufWChMY?1>ia&TPxM fd>9X zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGk|ZY#MgLiamw+UM#BxX;5#E89?+eM)YuXdx zu|FH45>h1u+#{$8{d%_tJAv3wAbJGeMb^x#fBgIe629$p-a|R#YI@nu`EWa7Pw>z8 zWDuh(;t2;HLK5-xHH%;cQlz34JXwgBC8D3UT}8guF68>Pc#qzPcCjA2yh{;cJ`VXq zqhlxiu*+i_ep?YeXMXzvTS)P>yl6LP_c_PCyP7hT%HeG4$5wU^ju)i7)ySxZkD_n8 z7F5R;8;Et#yii-9LJT!0CF)dZ(%5aIh9xE*Y-pJqbYC_XN!KQ(l zz|4=e(4M#K`5HN9?gURJ1S5?2sfMqNzf&K9=3J>u6#do-X@Pa|%4sZPky}rA0RhdU zscwCD4KH~UU%)PAx@C53u*T~SaVb4>OEzbLpT-mpWU_t&KqAboSPTgW#EeUVGDTxH zBIxMgQ?YWE#1{yVDt8JKY(z5PIIp=e#%TMp@@>Y|0uU-$3}|pr04pU${#bJ4P}OxG zscKeJ*P=B`PFZu#me(CsO)QyOHZ!+k)y0#mXE%2*UJDn&6{aN@3&l$*wPMnW&=sRA zJZio8k}F+$<;yO=%2gZEr=_MXH*4NXtDU=a9RHrXh3>udI%pu3MjATuu;HVOI+1Hr zW|}(lwCS_V`k+SV*uGJt4|2bzMu*xWmbRZgsljaaBLuDML>Ds<<3u2CivSXu7qjS; z5-)O#SuBi0p$uxI3r?p+3y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@32{AR} zT;}fp001CKL_t&t*JEIy3iuDjC;}Ml|LEG7uo;0Y$Vkv43IG73z6kx{fDAqW0000< KMNUMnLSTYwM28gs literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|!3HE<7s&_%DH%@}$B+ufWCi&@?FlUGt$*d6 iEoYhe=yF7UVqjPr&;7Oc_3JXAItEWyKbLh*2~7aFsTAP= diff --git a/mods/ITEMS/mcl_signs/textures/_gr.png b/mods/ITEMS/mcl_signs/textures/_gr.png index 007f12ae3cf3090ff1a071287fc9c6ffc4d3b831..3f806499abd107f9723b6be41a887676f8c88df6 100644 GIT binary patch delta 833 zcmV-H1HSy+2IU5SiBL{Q4GJ0x0000DNk~Le000050000C2nGNE0IFbjEdT%l)p}G| zbW&k=AaHVTW@&6?Aar?fWgumEX=VTbc-rljZF1Zo42J)6iXH(;2#MohFf+YDkKY$e z_9NM5rfGi$W&z7W0zCq6IDh>d;RgzdrjXP;mz*O?DyeXP#lYiLuAX9A?NxO5^ehjt z?H3G@pqJ}0pIg5|uJ;L+w)}XO2iu0&x1l%B+n`L(jKS9PZAkc%(|!(R&#UQSJNq{p zuh)89uiif=Lom9+o^aq(NFrLFUIZ(UA{D)$Wg(uDh_S9VN`4)?kn8K<-A3ZXi4R~WGhJbJY_P`TGI1!~b4wOyfu6<`He|BC4Io7Dtyl~R z2*iv_f-*&8HX_8)!KY&7EQt>gAXV-Z2H1#Xz;T|wF~?}>vhpRy)dCPISqx}!fB-8c zMgCZSa^z6ec^|22R#VraHA_xebIz9M9aT*%nOZh8w_?@BldESpcQ0NG7r_;#B^L|D zODVO&X@%*E*%cbK9(>4=4n6W=hacsr4e8TT)0UexZ>81FT{@0`&)q`zUV1(0L@J%> z)H9!U`dQ98kZVIm8anc@;iHUtqelDKK2f88cjP{&Mw{9smX@B~sX=V^W`gE*qLUej zaUu}6NdO7WlUa01i6^7%)iKld2^1Hm2HOwUFR^G7jV4e`ffGi(>JR)I67*Bd%0`QsIh$$NRc_ifP~Pi%(Cl z_7K~{fuf+7`!SE>Ut!nh1WU($z1oAFK

bTV`3A*ZBDP2_$^m={$#W=GF9JJLkvk zggwFEpOZn1u81cbcnC?v-B%XD3ZzIyFSxT1FH79xWf8HjwF_I^FT{I{-n5JL*yUA< z5c6@!ZyFtcJL#KU9%=YxMfA-4@`uP{$|vpS>^|qXcUMz}QaPMW{n*ML!SRBWvZrM< z!%s1`-3ppxiw(p&XkKV7P$7nzlM;2RG->Rt774Z1Izi*ez$p`_JlvH?#I z;^5IhOPAChki&sr!8H?Py z!wW!Y9!+)YyIc5BH}L~l0YTj|J2qJ3b%(f=p0y>Lv%pVd3h{n5$odHYiI7{d7!nYO znM5g5G-e}$jt)K*D`!c3fdHv;r!c`rBm<7~%8fZj+n1GZGmaL3P|0FIgBJ*}Qc~29 zB}WZ^RTWJ^RkND97Oh!w%9?Ywyw0dH zwg{l0c`=JlDe)q=n8mUVDrHb3U2r-rVj!3Xu}*rhdy@Mlx1i~_xbe@(g@x|FAQu+8 zL+&%TFR1mpzbLW+t+#M#8fD^OgTwI3Ue`D2kNfbq0si-aCMe;X9=-#P@c7GqCM52Y z0s}NI7bQJ4b*}&b01!z;K~xCWV_?7r{^R6O0sx-P0srtT<0=3E002ovPDHLkV1m7? Bg**TN diff --git a/mods/ITEMS/mcl_signs/textures/_gt.png b/mods/ITEMS/mcl_signs/textures/_gt.png index efe2c94a6d02122d102e24281990953b7450eff4..0449b44dea1c7e5c1e21273b298f70193ba5aa7a 100644 GIT binary patch literal 872 zcmV-u1DE`XP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(+bB=p=HDyF9hqI|4TiGKhUI?Y^X&KeuxX$s z5c6X#wEdRtuaU!ZCulOk7-7awHGC!fo%%2|=Sp3o=y#lu7FZXroW?R1xz$1o2xy*| z>W=TO;U#b43)sa>cbFX;tns={TuRT}lFeD5r!j>CnXDfJ2oZcM7DEC8G2@b;OwpK) z2yt}qsaQEn;tK>wl{b@Alt+0EUH*TO|`g=xvfLh({ct#Ddlx?*;P zMy(fLa-~bJeA(q!xoSiDwA8faX3bk^wR4w_+Hhh#(Cvt7d zOjBo`Hhq>^AJpg^+c#?TLGIVo=ulh4($=#lHHgiAn4oo?=wb$9oCw5i5kNxoViuiJ z;ze#Ti-mD0ltGPj!RfS!fnXZMI_bggN$!{2f~J4PjsJ;USm^!_a$%u6lCh-Mwz(SpfJ3$*Y%(D+kN=22EGk_8~Qf1zA9$Nr(O6PWNCJ!k`8|~00006 zVoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z25G7y7x yVQT;Y02N6@K~xCWV_={P_)odSf1N*Xrj*JWp Yi#S;R6rTL{5h%;x>FVdQ&MBb@0R2f3G5`Po diff --git a/mods/ITEMS/mcl_signs/textures/_h.png b/mods/ITEMS/mcl_signs/textures/_h.png index cca4751a325f82b1a8f7bc6810af099f124163ad..bd6f1891c030f1d24e8d159912c139d5ca4ca7a7 100644 GIT binary patch delta 870 zcmV-s1DX6+{RWUDe*)EdR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3004N}?UqZD94QQj z_ng8JR~*GCFh8e zN-A72@OUe?o?_bVt>n|wt31SZUNA(0UXK1a`W140Ot5t1f7h!#*fGR@4AI^2F0wqY z@zL{RNcbkF^Bl^VSJTsW&X3zMdyKz7Cqpp0!k%#8AtVv4FE4@>NRf(O(6SIONyJ!p z%c7shE_}rGJ$U!gTkK*za(N9!xKqe)F*q+lG=>rO5_7J&1!u12ut|?`xs$w`_ln9G*KtlL^KMGk&PyGvS}q zyP-K(>Jml2#mP5dUOA0rEOM)b77)-pG1VR4UBgq}f5a!Si<#~)J2qJ3bu)1(J#tGn zXMvu^6b@vveheT)@U2)32?)eYqLe8bvk@VV4n7qtXGwg40I71PFu_J71CI0ZjX6eJ zmz8f~TrB{hlEr`q2MDlIQsj>%M-EjLO+i(&nz|OPS#rvnbGE$hsA^)#)Uuhm6{{|u zTs^zFe|zy-xCpK=ExA}IUP`GIPAg1T%&yR=_2Nsebm^5ZyZkCwZAhP%nzr1mc`L1U z?$UAmd+rvx_tNX2fm9l4=*Yu{k22~+u1%R~>de!o&ob+s8l7YNLXFznk)efV1g zUxvO6eHr>c7@D{)@aHmo2bNNmz$BH0IsgCw24YJ`L;(K){{a7>y{D4^000SaNLh0L zU;r*7001r{0eGc9b^rhX2XskIMF-;p6$vsK`l;E^0000fNklb|2T%zB0DEQ#0ptOX;{X5v07*qoM6N<$f;{z)n*aa+ delta 58 zcmey%7Cu4Qgh9^J#WAFUFzmvv4FO#qs@7n}e9 diff --git a/mods/ITEMS/mcl_signs/textures/_j.png b/mods/ITEMS/mcl_signs/textures/_j.png index 9b37544873416ffb4496c9888135ff041c164110..7fec502159c9602e6f72c34c360818204573a705 100644 GIT binary patch literal 881 zcmV-%1CIQOP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HWvfdyFhX1>YEj z{dsf}4M9*IGzsI^&l!H8kZ1}?&2z~)qNI`vS9CmHTEU%#cu6Aqigw9Ah+W9_{ovhtFR_bt%jG!~A?B@+Ut+Z7 zq%U&0x#6c7(cSaY3z3-OV|j?(oZaUf*XnA@h*S=HQGb?l_MmtmlyVNssD?|?x3d;h z#}XTeb84?hP8HWUAipFe2 zh@*o~#mrd}A0R-g+$l`35y^n#ynJJf(W%SIml#J2K&WIfpuq+Ltdtb_W66<2Ro8i> zs##54i`FbTWz9KTUT0J_v1Dr5%-o7q7f-I9-Q2x+EnEagn3h~D6fdRJ3a1sOD@Ipn z)OzqCM>_P#haG;Dqc)^ZOHEsD*1VNgJ9p{W{yldK-FxYE&_F7UG<4))!$%o)BG;zO zG7+}u+VLCZ@Ilgt=IF5 zA}64=3s+2|OdM=b7+%@y`X+t34gYH3+t9b6Z$s;^Vs`x6h2Ja>cAj0f%kBUG00v@9 zM??Vs0RI60puMM)00009a7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6$vu{huJ_* z0000WNklzopr0C?IIDgXcg diff --git a/mods/ITEMS/mcl_signs/textures/_k_.png b/mods/ITEMS/mcl_signs/textures/_k_.png index 4444abdda949586bf25a7638451f856046e70c0a..5e0a6b9958b2c1219bf9e371bcd5cb95db7e8def 100644 GIT binary patch literal 887 zcmV--1Bm>IP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?QqcOw7|T0U5nN%Ic3c`TV7{WHL+xB+05LERTodLp55HNcr9E6N0^peEEF%L)C#8+rYlBQ zXw-V~C0Dxi%9mY!m8&+SPfJZ(Zq~e&Ry%j;*#13t3*CF^bbjSjU%ENwk|QiIs+hY4E8i7sX!#)&}O76BwQFJ{px zC0^tfvsf6LLK)OZ7o1Lu7zn08tdkz>p5%VXEok~z-1wi!g@x|_AQu+8L+)p8Ur_6H ze^F!uTDx$?G|I%m28H33y{>Q4Z@1yU8u&K!ZRp$3`m2~7zjonoZPa$9@1C5@00002 zVoOIv0RM-N%)bBt010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z25GZ30?P$~cb z04PaBK~xCWV_+Zv7#aS-$FVF0Qc9jKjv*Y^lM@t#{-polSC^Dn pAR}VQw#F!6lHjQnmuadD3~lRpzs@@usRC5Z;OXk;vd$@?2>@l%7U2K@ diff --git a/mods/ITEMS/mcl_signs/textures/_lt.png b/mods/ITEMS/mcl_signs/textures/_lt.png index 3a183ebd5055ed46543a4e672a0122aa224dedea..54295121ea5a25b72bbb81978df98aee5649543f 100644 GIT binary patch literal 865 zcmV-n1D^beP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?QqcBO!2k6#BR>+bB=p;HDyF9hqI_3OW8drUI?Y^VHwqMDf+f+ zL3J##fmjF43$+C*#E9mkM4c*48oO=OFvY}!4J~s++?UM7xNzH0(yBDsfTss>kZ7PL z5c6X$wEdRtuaU!ZCulOk7-7UuHGC!fo%%2|=Sp3o=y#lu7MK^WoW?X3xpjvY5YRj^ z)g9km!%N=87qE+&?l3zRSmSk@xRjo`C7ZKAPh$!PGFd+c5F+?iOojvmV#XmsnW8Zp z5#s3JQ!#Uv#1{yVDt8JKY(z5PI4|EAW3+Wy`4;170SJ{W1~k|}fR&OWe=Iq2sOmb8 zR5h!qYtfn|r>r?=%j=A)CYDSso0(g&>f*`OvzxmYuZ4@?2-A{_h2o`@TH&<9bj9cj zjao0hB;YUeH;+rQ^-p?fdA4jM?Mk%o>uZ1^anPUPB@ znWoM>ZTc*;KB&>zwr|wvgWRvF(V@18rLAXAY7m?KFhT1$(ZvkJI1z~3B7lVE#Vk6d z#EaZw77JrjD1#d5g41ac1Hm+ib<%^~liV-41x^2o8~+ozu+aS<M?Kb>Z1K){Kw6}&mjx|U@`>!%*rhN00000NkvXXu0mjf?pcic literal 75 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y;!2%K~KmQO&33<9WhHzX@PB_5%Z?Vt~$r}s| Y_exp*yxvf85Gc#w>FVdQ&MBb@09=9;VE_OC diff --git a/mods/ITEMS/mcl_signs/textures/_mn.png b/mods/ITEMS/mcl_signs/textures/_mn.png index 7d04cac677cb2bc69e8e1e345f34970ce9be4fa2..2230e10653a4fa79ac8c4f82e661fbe6f52c4893 100644 GIT binary patch literal 873 zcmV-v1D5=WP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?QqctFFFR`1m`<&xmT}>I0%Hb^P$5M6=iWfpDdss#_T#CN! zT2LKJY#`P_^FnQb3NfNNDN(0Nlg4fvHB2$_U_;B?5cef>F)rLTl(Z^MHsI+&9Bdk> z3B>%E3vIt;`)lOz+zFaYFh&^hQw?7Uf2TeS&AC#SDEb{Iqy^^1E2lAyMQ+`p1q3ut zOm)Y1*YJ`z@dfN+raR1z1=e`oCN8CCZpr2>(9@X0flStq0fY#?6_X(WftYbfP^M_i zMua#z_*BfCCGiCUq{^Mb1RIeIIL^yA#u#l~R=&kJS^z>NivbNb5MZUG$RA6N9ICp` zBUR06>RPmB$ti2j+44H0s);32%Vy?Qth#t|_3Y;E#cSarIKs5#Vxf2`rB*ntFkLaa zLZjA;FS*jCSHA4>t6a4qeOhYTaHwg@1hc`=Jl zDe)q=n8m`_6w07Ry5MwL#6U0&Vx9D0_aygAZb8$(;>Q0(E-ZBa2f47&9dbW&`+{1p z`->tQ(AtG7rcoviHYg0Q>~(#Ue!C6-)xfu*Z$saP)?dZ!__Ygv16vSwqg$);w*UYD z24YJ`L;(K){{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@32{S3h zYuF+H000$9L_t&t*JEIy6JTUuVEB(kYybfOkbeOJBeWrz00000NkvXXu0mjf;8B41 literal 72 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|!3HE<7s&_%DSl5E$B+ufF?6 V{(D88T?Qz{;OXk;vd$@?2>{Fb53&FN diff --git a/mods/ITEMS/mcl_signs/textures/_o.png b/mods/ITEMS/mcl_signs/textures/_o.png index f644e1e728e224d9cdc3802b271d07f05778b312..2a579385ddcc694c3612e16bab7bae796915322b 100644 GIT binary patch literal 878 zcmV-!1CjiRP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGa@`;dhTmC5mw+UM#Bwl~neL#=?~hH+Eoo+& z_AxL9tRp1QCpZq{*UuS#ppa+^NzHS~IijSJ3Res~Ughd3rn9|@?w+3IA-4SkLnP?s zdd*|&SIG4~!P1r=&+=f~5c@VnH^XO<<#~;_o^M0Kmz?%{D0^N_58K%fw{3PCe|=Ae zV048&;lM*kB3fTw1S^mt6}_NkAzqS*v7%qCd>p%w>&L;njb36G>z2!NC_>CzA-}|E z%Sm74a&yB^E26vSrysC|6d%h&?B?t~=eTxPQ%0n6*qeIW$~l7Kflyx2$f$-#F}AZ7 zRL2$@h;`6BP+OovjA%|u)Tz>>arTWGmY8_3p=WN0`;xgB7j7q%v?@(D;ORjeY#OKu z#C%%|oqo&duaU!ZCulOk7-7b{8a@(!rQQt9xl)%X`V}Xn1=htYr?HGhZne+?0-8If zddByx;URD01K7n(&oDbSSmSY-IF#oU-PeEw4MOnpiTmY-Vo7s*5LA&u;EsycRBkD@;o+7K)crYK7AZ(-pHT zG-^HgkRu&>%26BAr=_MXH*4NXtDU=a9RHrXh3>udI%pu3MjATuu;HVOI+1Hr zW|}(lwCS_VdZR}B*gjFC7jmCdqfKoQOQ)XQsX=V^W`fprqKg@baUu}6MF0uSi&=C^ zi5I!WEEdM0PzE*91*g*@27+l2>!cgIJGoD}1xYpw{d8 zk0K|abqZHZqfA_EP#9j>>-tanav%QHz_+1qL*IthSH0w`=IY}%MeGLr%T0OAG(|FI^C{Qv*}07*qoM6N<$ Ef|sp~F8}}l literal 80 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|!3HE<7s&_%DREC1$B+ufL! diff --git a/mods/ITEMS/mcl_signs/textures/_o_.png b/mods/ITEMS/mcl_signs/textures/_o_.png index d5984b00711fff8c9aa26e01e6e3be95d2562eb7..44ac3cbcaf725b13c606e472bc7a1b638e8b7f04 100644 GIT binary patch literal 878 zcmV-!1CjiRP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HWvfdyFhX1>YEj z{dsf}4M9*IGzsI^&l!H8kZ1}?&2z~)qNI`vS9CmHTEU%#cu6Aqil-(2Aa)_w_k(xqy~HloEtls|gqXKNeu>eR zlfKC1=7yhUM0d|mFGOOBkL4kDb9SF|T&t@oBT_l+Mg3XI*@NPNP|7(hqZ%$n-_BZ4 z9ZPH=))qJIXMgTG^Vg2ll5%?A%btkWJo|DW*icfDH^j8 zA&w3{6*Ff^e1HI{a;GrCMkE7{^YV=`MyD<-Ut%0B0HKn_fCd`~uu@Xwk0nPARbA(i zs%ABHEn2hWlr`sUd7V+!#FD9HGjl6eT|BvZc60aQwQvy}VOnyrP`s21d!0Ym_?_Q zc#&JoVqt6wWl$qsa5^nwAeaWRPP(zXllzog(DYZ__#<**q5B`?!a}#nz2)`}wO-FJ zikyJfE?hBznlDHvFrBZ$saPz74IvirMjN7k&dZdUl`s)i1vQ000JJ zOGiWi{{a60|De66lK=n!32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0~HB00LYlu zi2wiq97#k$R0!8&V4w>455*_~C~PKd+K3m#X%Phg05<0a0fme+UH||907*qoM6N<$ Eg00Vk)c^nh literal 80 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|!3HE<7s&_%DREC1$B+ufWCi&@?FlUG=hT83 d5;ZCr7&ZlQf8EcezY?f~!PC{xWt~$(696#u5i|e* diff --git a/mods/ITEMS/mcl_signs/textures/_pr.png b/mods/ITEMS/mcl_signs/textures/_pr.png index 5c231c9a83c436e76e5b34ce229b4883c2244e43..c8783948d31724866e404838ad24cb491cdf6fc4 100644 GIT binary patch literal 895 zcmV-_1AzRAP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HWvfdyFhX1>YEj z{dsf}4M9*IGzsI^&l!H8kZ1}?&2z~)qNI`vS9CmHTEU%#cu6Aqil-_`K8Rh&_5I-8dM~kyb<5>B6d~rVkY8f7 z<)klixw+w|8PVPI(+iQ9;$wM;-JIR$9M|e<%7|1Bdr^Oua`vEjAe3?r%czD+(YLb} zRL2q>akh;brkHrJp=EA}`;xgB7j7q%v?@(D;ORjeG#aQ0 z#C)3zoqo&duaU!ZCulOk7-7Vl8r~CrrQQt9xl)%X`V}Xn1?I&or!kF1Zrz~;1T=R{ z^^EUX!$aQ02e6Boo?&(@u*TyuaVXt$OHR%LJ&h@B$YgyRK#1U5F&PpNh#7|jWs1gZ zM2MqU5nN%Ic3c`TV7{WHL+xB+05LERTodLp55HNcr9E6N0^peEEF%L)C#8+rYlBQ zXw-V}AxAp&$cG(%l%qDJPfJZ(Zq~e&Ry%j;*#13t3*CF^bTFXTR_Mw{9qmQFppQ-j#-j|p1Gi7sX!#)&}O76BwQFJ{px zC0^tfvsf6LLK)OZ7o1Lu7zn08tdnl+?&Ln@7Bu}8H~xrRSm^!-xv>-r{rxefnn;M>r*p>IR$uVQxm+J)a+7IvdmKdvzV000JJ zOGiWi{{a60|De66lK=n!32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0~HB0DE%#d za{vGUElET{R0!8&U?3JSGB7awN8>XvA#^>bP0l+XkKTrd}K diff --git a/mods/ITEMS/mcl_signs/textures/_q_.png b/mods/ITEMS/mcl_signs/textures/_q_.png index 8ad1851274a05921921488d95d3b480f8928153b..67479941363fa703edd3fa35b2673a4d9b37c011 100644 GIT binary patch literal 883 zcmV-(1C0EMP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?QqcT1e}R1RlRKbEq4P`nUI*~2ob;ZpQ% z*MjO;Vgs=bnipydREQDHNr^gDnlyIXs9}nU2OC=EhPW@8i*ez$p`=x5vH?#I;-Jw$ zO(5pSTxk0(+g~Gx=T6XMf-%B~pKAC@_&fDsXwH?oMA7d!AuTX3UOA0vEOP4(Eg+zI zVyZj7yM~v%i7#LmGu>f!EU?DwHgPFEb4xa7fu6<`4rH=^3?M}Ct(Xi62*iv-f-*&8 zHX_8)!KY&8EQv1=AXV-ZCfJB%z;Rx_F~(@?vhpp)(E<=ESqx~ffdDHdMgCZFC;lvmYX$irPa<|I<|k$-9qy|5ldUop41>V`(c9CaiWVEh;bqiw?zO6&5K!d zN{JV_#Vi)arceeo(gml}A_jtK5bLA|yC=C{atoUN6*vATa$%wSKgflJ?vVSL+ZWV& z-Cq>hfYvTtF^w{Dut8yXWv}a-^xJLtuLiyieH;2VwEik)#}8Kc8?U2wtOq~zOaK4? z24YJ`L;(K){{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@32{bX8 zM%J?c0019JL_t&t*JEIy3iuDjC;}*KCT!Y>7sP526BbDl003q-2Lh#w(-Hsx002ov JPDHLkV1nEXf*k+= literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|!3HE<7s&_%DJf4E$B+ufWCi&@?FlUG=hT83 g5;ZpQ$OyAAsJ-F))V$`rHBc3Ur>mdKI;Vst0A^$oRR910 diff --git a/mods/ITEMS/mcl_signs/textures/_qo.png b/mods/ITEMS/mcl_signs/textures/_qo.png index 27cae96a288a60b1c4ea9fc0f74fa22a4517d6e9..c7b87be683ec2176864799569e095e54e935b823 100644 GIT binary patch literal 873 zcmV-v1D5=WP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(sJw_j~i}lFmJrp74qmVyh zbmXKTa(TGnw-wRT^V<(1F~!&N61zFO&pGbh)szvb9L}bGY-Nw2cp;Rsr)5;bqZr$+ z1=X>|24WpFFVq&O5F?tC5_PIHY3#mH!x9q@HuTI5abGeQtUAfS0- zsyn{BhL^mFFJKol-C=fYu*T~)aVb4>OEzbLp2idoWU_t?AVl!3SPTgW#EeUVGDTxH zBE-?br()$Si7yZ!Rqhlf*ob7nabCVL$7t)a@-4>I0uU-$3}|qG04pU${#bJ4P}OxG zscKeJ*P=B`PFZu#me(CsO)QyOHZ!+k)y0#mXE%2*UJDn&6{aN@3&l$*wZdtI>5ADE z8ns@0$(1g>@@1D_<*E(o(^Auxn>BBx)y`cyj(^YHLib*J9W;GOIy#L)F3wdVS?6mqKg@baUu}6MF0uSi&=C^ zi5I!WEEdM0PzE*91*g*@27+l2>!b&}C%Ip83!45FH~uGbVWIm!$c2UOko%e27u0&) z|0uEnty8#S8fD^QgTnC2Ue|xpZ};K98u&K!ZRp$3`l^^6pLXGIucdaZ>U+tM?Qpd^E*tDnm{r-UW|5fKsa diff --git a/mods/ITEMS/mcl_signs/textures/_qu.png b/mods/ITEMS/mcl_signs/textures/_qu.png index 26cf5b4590ae4616637ae0fd86faf13868326dfb..1458c7e104af8c9b9a0e996d310ecde3b4383080 100644 GIT binary patch literal 876 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 diff --git a/mods/ITEMS/mcl_signs/textures/_s_.png b/mods/ITEMS/mcl_signs/textures/_s_.png index d5281d78d165d51f720000941cebf9f5e1ddc6ac..08cf6ff68013bc70f3d5b359e44366143383e886 100644 GIT binary patch literal 885 zcmV-*1B(2KP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGk|ZY#MgLiamw+UM#BxX;5#E89?+eM)YuXdx zu|FH45>h1u+#{$8{d%_tJAv3wAbJGeMb^x#fBgIe629$p-a|R#YI@nu`EWa7Pw>z8 zWDuh(;t2;HLK5-xHH%;cQlz34JXwgBC8Dp}l0?4NF68>Pc#qzPcCjA2yh{;cJ`VXq zqhlxiu*+i_ep?YeXMXzvTS)P>yl6LP_c_PCyP7hT%HeG4$5wU^ju)i7)ySxZkD_n8 z7F5R;8;Et#yii-9LJT!0CF)dZ(%5aIh9xE*Y-pJqbYC_Xu6#do-X@Pa|%4sZPky}rA0RhdU zscwCD4KH~UU%)PAx@C53u*T~SaVb4>OEzbLpT-mpWU_t&KqAboSPTgW#EeUVGDTxH zBIxMgQ?YWE#1{yVDt8JKY(z5PIIp=e#%TMp@@>Y|0uU-$3}|qG04pU${#bJ4P}OxG zscKeJ*P=B`PFZu#me(CsO)QyOHZ!+k)y0#mXE%2*UJDn&6{aN@3&l$*wPMnW&=sRA zJZio8k}F+$<;yO=%2gZEr=_MXH*4NXtDU=a9RHrXh3>udI%pu3MjATuu;HVOI+1Hr zW|}(lwCS_V`k+SV*uGJt4|2bzMu*xWmbRZgsljaaBLuDML>Ds<<3u2CivSXu7qjS; z5-)O#SuBi0p$uxI3r?p+3y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@32{kKy zKOTqx001FLL_t&t*JEIy2rxqF|L9`>aq0L^NRojGn+is3mQV-)j%x=1b!g*N00000 LNkvXXu0mjf%UFeQ literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|!3HE<7s&_%DJf4E$B+ufWCi&@?a2a-(X46* hu6&Ze>hOtyVPP`&*GYHp`vFxkc)I$ztaD0e0sy%56{G+F diff --git a/mods/ITEMS/mcl_signs/textures/_sl.png b/mods/ITEMS/mcl_signs/textures/_sl.png index d825f1aaaf4b5641098cb2fb4fe9e33d78126f39..413aa5778e2fe516e0b82922e760a8a1a69284a0 100644 GIT binary patch literal 882 zcmV-&1C9KNP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?QqcBO!2k6#BR>+bB=p;HDyF9hqI_3OW8drUI?Y^VHwqMDf+f+ zL3J##fmjF43$+C*#E9mkM4c*48oO=OFvY}!4J~s++?UM7xNzH0(yBDsfTss>uxX$s z5c6X$wEdRtuaU!ZCulOk7-7UuHGC!fo%%2|=Sp3o=y#lu7MK^WoW?X3xpjvY5YRj^ z)g9km!%N=87qE+&?l3zRSmSk@xRjo`C7ZKAPh$!PGFd+c5F+?iOojvmV#XmsnW8Zp z5#s3JQ!#Uv#1{yVDt8JKY(z5PI4|EAW3+Wy`4;170SJ{W1~k|}fR&OWe=Iq2sOmb8 zR5h!qYtfn|r>r?=%j=A)CYDSso0(g&>f*`OvzxmYuZ4@?2-A{_h2o`@TH&<9bj9cj zjao0hB;YUeH;+rQ^-p?fdA4jM?Mk%o>uZ1^anPUPB@ znWoM>ZTc*;KB&>zwr|wvgWRvF(V@18rLAXAY7m?KFhT1$(ZvkJI1z~3B7lVE#Vk6d z#EaZw77JrjD1#d5g41ac1Hm+ib<%^~liV-41x^2o8~+ozu+aS<M?Kb>Z1K)BDG^T>$B+ufT1eRDu=zOx22pdI6}^J zsgY3(KSkTlQcxUAY#`P_^FV2V3Nh52l&DjsN#m>=HB2$_U_;H^p!>497#D6Ql(Y&> zHsI+&9Bdk>3Cw((3!USZbG$~5kvqYY3Bd?GK9ul(%J`LX3pD3SU83lhPDl&Pi&su# z8jIYz!wU##ZcX*n_blNdZ{h>k#Y|6`9Sf}SxI!FC_uP_`v%pVd3L7$6-vJ;I##T&* z1O#HnAwij(8 zB}M*!SaRf0)pZ`JYF1O%qBToSS#!>o*BMn!ESXw1Gq+;Z#gnUNH+L^y3m3r=rX?2( z#Y-u*V$h1v6}>AwYCZUnBOQ9=!wx^nQ5({yrKT-6Yu-w$ox5~w|DL;r?!ELnXdsnF z8anc@;iHT?k!w?CnmY5e>9fpwqegq%K2f88cjP{&Mw{9qmQFvrQ-j&;Ed;IOL>Ds< z<3u2CivSXu7qjS;5-)O#SuBiAp$uxI3r?p+3iKld2^1Hm2HOwUFR^G7jV4e`ffGi(>JR)I67*Bd%0`QsIh$$NRc_ifP~Pi%(Cl z_7K~{fuf+7`!SE>Ut!nh1WU($z1oAFK

bTV`3A*ZBDP2_$^m={$#W=GF9JJLkvk zggwFEpOZn1u81cbcnC?v-B%XD3ZzIyFSxT1FH79xWg*F5YZtb-Ux@b@y=fQgvCFFz zA?D+d-!wXZcG5SyJks#Xis+g7ke@#J!?xgXMvx_6yp7Ako6M)5+S!@F(e=m zGl^2BXv{_g9UXisR?d?60s&IxPGN$LNCq6|l^b)6wl6E+W*jX5p_0Xb1}_j`rKG4I zOO6_Usw$d-s%ABHEn2hWlr`sUd7V+!#FD9HGjl6eT|BvZc60aQwQvy}VOnyrP`s2< zE0R`(u9#inQR~H*Tt)aX!K#M1V&CpDPOeuSWPoakZ(Vw?!X zZ4p30^I{gAQsPB!F^gp#RLY=6y5MwL#6U0&Vx9D0_aygAZb8#;apRwn3k%(UK`tzG zhumjwUr_6He^F!uT5sXfG|I%m28ZF5y{>Q4ANS#J1N`p;O;Ex&J$wgv()h?1h*Lq6 z0s}BH7Z7WPv5Wu!024_>K~xCWV_?7l|Cw-${YMrA0842D0{lKu9smFU07*qoM6N<$ Ef&j^eBme*a diff --git a/mods/ITEMS/mcl_signs/textures/_sp.png b/mods/ITEMS/mcl_signs/textures/_sp.png index c51f26b16756c41caf2f2fc7221b626ea859fded..4aae0ea85940327b5ab89820bd325dff7368d023 100644 GIT binary patch delta 801 zcmV++1K#}L2HplGiBL{Q4GJ0x0000DNk~Le000050000C2m}BC003#frT_o}*O4V4 zf089B2!`KX#VkQU1earaiI^SC^5@sI&ZWA#Bf4iEOXH|XA}Al4Cyamop5ZSP5=|kg zc`i9elvGmTih;+w+&#s#+q>xL>0KUTJ1-a_K`-}X9!I}IuFnaUj{JI;2Rnw?kD(9G z$Dl0FjKR_KV@UXx(|Hc%%&X~TJLfkWfA80N-LF1BCqpp0!k%#8AtVv4FE4@>NRf(O z(6SIONyJzsp(XiA>_V&;kOQC#JgNyK8vKoA?5DG1DDp#|CS> zZWEW%Gq+@O7U*eA;Xo$q#{fbEf8UD5kbpqUxFjf3G-e}0936ZrR?d?60s&IxPGN$L zNCq6|ayp&QaoK~2wm|dY!>&2H`>C!7-e|Gs*uG)}3 zEj4YqS@Tv}?cAl~`1jl`bnm6tK?A8Y($JBI4IgFHiCmj9)6|)#O`m1f2Q@m!_Kg~S zBKK=*bf_(2Y3tdO8pLKFCTLwJx|o3&CjxO>1d!0Ym_?_Qc#&JoVqqK#Wl$qsa5^nw zAeaWRPI|C=lKUmMpy{``MDfqag@x|_AQu+8L+(dzUr_6He^F!uTBmTuG|I%q28H33 zy{>Q4ANS$E8u&K!ZRp$3`d2YK{;P$50V&IOi}Bje^OFVxFe)|*8hc$80000CNklKipIG4aWUp1C3JQ|4k^xGgAYRvK);(}OtJG*Aw$K6)8at-C;=5{i$eZ{8RzOf!m>nCe@wiMJ zO84B7#d*@zm_odc23g+*5F+?ie=LRs1Y#!9c~2O#5h0EaJ{2oxNqm3+sdA?Gh-&sdT1O&wSeHXF2OYt_>M!=*Yu{k230w8tr5IM2%j^ z{h1nVYLi%6dUmGUw8`YUeyMmut0qWd4@!bG>p{mShVYQ3&6iY!3$6wa7N8MxS>aC&90 z^PBYLKK!eJx1qP8x1qP8x1rS!+}ZetAASPU4fMqhjQ{SF1OqTCBQ6omU(f&m01Qb) hK~xCWV_+CQ0002Y00Feu_&ops002ovPDHLkV1m3fb*umY diff --git a/mods/ITEMS/mcl_signs/textures/_sr.png b/mods/ITEMS/mcl_signs/textures/_sr.png index dd192f5434c09996e2b6fb9d14483093d7c2db21..afefa91b214957091a690c366a991c17c8a6bb89 100644 GIT binary patch literal 879 zcmV-#1CacQP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HWvfdyFhX1>YEpnuPP$&k=s0kZ1}?&2z~)qNI`vS9CmHh>jJo{VEw;|z6PWw5OJ+7vQTEU%#cuFGrDrreRh+W9_{ovhtFR_bt%jG!~A?B@+Ut+Z7 zq%U&0x#6c7(cSaY3z3-OV|j?(7~RJ>uhrF*5vd&ZqW&yp^`Lkll(L3pRKum{+o}cC zvBU;q9W)Qr7N`&-nu8K`sx;_aZKH-MCO+BFGB?D1%3O>Kw*@85N`nn}dJqSR25JH^ z-{wNgZ(05tIXriQCKHSiM!c!vJ>ggC&CnP#b%~;1aY9;PUOaOe)0pJu9a=y@W5-li zd{+$*c@rPNPG-8o>{wup$7SMBy62WG&H_D+DQw7OeH%cC;9D^n5)g-p1Xzaz4Ut0iBvk%sb@az^s}6GAlHVB zG<4))!$%qQMveBieWFG$S^L?CXH01}!fv*?r( zPjZu4ER0Q|3~HnkPNzu>1k*{ZgKq5Z7+}Fwt#tZ@Ilgt=IKM zkp*b(!Wq*j0|y%vPOt2Bev`i3hJQ8iZRp$3x1sr0F*<(j!f#t1cBA@kAR+(&00v@9 zM??Vs0RI60puMM)00009a7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6$v&J;B;Vi z0000UNklBDG^T>$B+uf zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(A?{1&VqCawC}~xiY{1ilIM_5$ z0}tWHT4?(%+g~Gx=T6XMf-%C3pKAC@_&fDsXwH?oMA7d!AuX^jUOA0rEOM)b77)-p zG1VR4UBgS>#22uOneH$;5aYem}9hcS@{;@Y5@q9ECw_J zrNoQeVipVIP$+{M>4MW~5d*9_mvUk!X4`Zn}!Xnj@8j!(PrH;Nf{sCyl(V*mgE z24YJ`L;(K){{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@32{s}x x&h_sA000w7L_t&t*JEIy9r%w%V+sr`002zP1O01oTL}OF002ovPDHLkV1lLXl4bw^ literal 74 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|!3HE<7s&_%DM3#c$B+uf zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(tm9JwLa{W4ZkI_f$Vm)$s4@HRiDCCbA z9XaWTTpn)tZAJ9-{PqL3km753iQSyt=N$L$YRZUI4rfz8wz5Z1yb#Je8X48_D8{yH zL3M1gfmjF43$+C*#E9mkM4c*48oO`Qu*AfJ4Lx&1+?UM7xNzH0(yBDsfTss>uxX$s z5c6X#wEdRtuaU!ZCulOk7-7awHGC!fo%%2|=Sp3o=y#lu7FZXroW?R1xz$1o2xy*| z>W=TO;U#b43)sa>cbFX;tns={TuRT}lFeD5r!j>CnXDfJ2oZcM7DEC8G2@b;OwpK) z2yt}qsaQEn;tK>wl{b@Alt+0EUH*TO|`g=xvfLh({ct#Ddlx?*;P zMy(fLa-~bJeA(q!xoSiDwA8faX3bk^wR4w_+Hhh#(Cvt7d zOjBo`Hhq>^AJpg^+c#?TLGIVo=ulh4($=#lHHgiAn4oo?=wb$9oCw5i5kNxoViuiJ z;ze#Ti-mD0ltGPj!RfS!fnXZMI_bggN$!{2f~J4PjsJ;USm^!_a$%u6lCh-Mwz(SpfJ3$*Y%(D+kN=22EGk_8~Qf1zA9$Nr(O6PlY(}sr zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGt|TW6hTmC5mVj-H&2lI%Qg)E#=Z9kYHYX!x zlE;J91?4t2_%n2e@zC@M_3%P!syvOJxcd;J5yr&|>d<^nO zj*g!6Lobgo{I()`Mt=K3B&PVek?g^sOq|p zR5h!qYtfn|r>r?=%j=G+CYDSso0(g&>f*`OvzxmYuZ4@?3e%E{h2o`@S`oCub;axo zi&`(fB;YUeH;$G_)pp?fdA4jL$>k%o>uZ1^anPSo0z znWoM>ZTc*;KB&<-wr|wvgWRvF(V@18rEOWFAVN=CKv=K}+a3cVZRs{m1ZiE#80000s5FWM2-1XRV~>FVdQ&MBb@0QaXB>Hq)$ diff --git a/mods/ITEMS/mcl_signs/textures/_w_.png b/mods/ITEMS/mcl_signs/textures/_w_.png index 8848484d4a3c2f964588eeee90435981e9e7d6cc..f1e26c10830034a393a5fd954d1350d8a93c3a94 100644 GIT binary patch literal 889 zcmV-<1BU#GP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGt|TW6hTmC5mVj-H&2lI%Qg)E#=Z9kYHYX!x zlE;J91?4t2_%n2e@zA@57)VqCawC}{~zHsI+&9Bdk> z3Do>p3+=dN$7|$>+zFOUa7LK%lZ3C7zatMvbFR`Qihkz_Wr20^s%b1^ky}q#0RhdE zQ{DO95?<;izJOiKbf?*|!5XjI#ijJDE!ms}b{bPSkjeUSfD|FNVlgBj5Hl_b$`p;+ zh>%AIpNf^UB)&j^RJl`_U?Y+N$9cuZ9HVW^%C{O<3qYu3F`&T#0<4r2^<&9VLsi#( zq^em>U5nN%Ic3c`TV8imHL+xB+05LERTodLp55HNcr9E6SD2PuEEF%L)QX@Lt}A9& zSk!v)C0Dxi%9mY!m8&+CPfJZ(Zq~e&Ry%j;IQ~6%3*CF^bbjSjU%ENwe`QiIy;hYMQQi7sX!#)&}O76BAAFJ{px zC0^tfvsf61LK)OZ7o1Lu7zn08tdkz>p5%VXEok~z-1wi!g@x|_AQu+8L+)p8Ur_6H z|DwnSv`*p5X_SeJ4Ffqbax1(=I>tDs}_-hyb29tnxsRG`aqW}N^ z24YJ`L;(K){{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@32{#b_ z0+lWR001RPL_t&t*JEIy2rx1*F#N~DMlfJ}CS(qb!GzE3|Hw2G1N8v_;DQGNJI=3`<1>J_yw;d;nC+;OXk;vd$@?2>?M$7e@d9 diff --git a/mods/ITEMS/mcl_signs/textures/_z.png b/mods/ITEMS/mcl_signs/textures/_z.png index 86eb502ce0092157643edac4c2cfb0e83ab2f66e..8a710780add05766126ad5655fd0799dde7f842a 100644 GIT binary patch literal 886 zcmV-+1Bv{JP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGt|TW6hTmC5mVj-H&2lI%Qg)E#=Z9kYHYX!x zlE;J91?4t2_%n2e@ztF_FS(nu`<&z6T}>I8%HeG4$5!?Th8I#Pds>DVK8mqz zDGcbXj=tns>CTuRT{lFeCQr!j>CnXDfNND*Qy7DEC8G2@b;OwpK) z2zhkysaQEn;tK>wl{b@Alt+0EUH*TO|`g=xvfLh({ctq5A-x?*;P zMXeWKa-~bJeA(q!xoSiCwA8faX3bk^wR4w_+Hhh#(Cu(iV zOjBo`Hhq>^AJpg^+c#?TLGIVo=ulh4(zdfFHK@&gxS(~N=wb$9oCw5i5kNunViuiJ z;ze#Ti-mD0ltGPj!RfS!fnXZMI_bggN$!{2f~J4PjsJ;USm^!_a$%u6lCh>Mwz(SU@*M0*Y%t9+kN=24!#|IJNkCC{#DG5zjonorc8FLb;sVp00006 zVoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z25Hydft zOr`(;03%66K~xCWV_={@U}Rum_>V;l4$vj>3;btbU|?XurIG>w0IT~30R@mbZ~y=R M07*qoM6N<$g3bk$F8}}l literal 79 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|!3HE<7s&_%DKSqM$B+ufgn-$8&CymdKI;Vst0AY(0bpQYW diff --git a/mods/ITEMS/mcl_signs/textures/_z_.png b/mods/ITEMS/mcl_signs/textures/_z_.png index 9bff400222db3fa7cbf5a698818246f818de22a2..6192800b4c98ae11b552c46f7c91c06534182442 100644 GIT binary patch literal 887 zcmV--1Bm>IP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGt|TW6hTmC5mVj-H&2lI%Qg)E#=Z9kYHYX!x zlE;J91?4t2_%n2e@zA@57)VqCawC}{~zHsI+&9Bdk> zfrs#8Ewtm79j}oiawk|a!5Lx3PZGXT{*F8x&ACdKDEgfzlm*tstERDxMQ%M|1q3ut zPIc#ZOL(c9_yTq@)179=25Y=-7njnrwq$b_*lA4RKql+Q0aAq6ip7wCK+L!#C{r|M zBSIb>d@5GXlK27vQsquzf{jQ99Oo4qbBwkvE8l8dEdZgC#efC}2(VI8)Q=@c4OLzD zk*a1jbuC)6~;Mn{dOPztAlSx-;TZ=t$!7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@32{$4( z)x@p<001LNL_t&t*JEIy2rx1*F#N|Nh9ZcrfJA}+3=9kmEVxus008^r2mb?j(7XTu N002ovPDHLkV1mkYiq8N5 literal 81 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b|!3HE<7s&_%DG5&($B+ufWCi{|?gs;y6g`ce e+b>(Vgqfjg2Jh#YWrD6iH4L7velF{r5}E*HeiFt2 From 579e52661579fb2da4066c8772d7712743e57504 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 21 Mar 2019 11:25:14 +0100 Subject: [PATCH 230/379] Signs: Add replacement character --- mods/ITEMS/mcl_signs/init.lua | 6 +++++- mods/ITEMS/mcl_signs/textures/_rc.png | Bin 0 -> 902 bytes 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 mods/ITEMS/mcl_signs/textures/_rc.png diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index f83e63396..e878d16ea 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -85,6 +85,7 @@ local generate_line = function(s, ypos) local printed_char_width = CHAR_WIDTH + 1 while chars <= LINE_LENGTH and i <= #s do local file = nil + -- Get and render character if charmap[s:sub(i, i)] ~= nil then file = charmap[s:sub(i, i)] i = i + 1 @@ -92,8 +93,11 @@ local generate_line = function(s, ypos) file = charmap[s:sub(i, i + 1)] i = i + 2 else - minetest.log("warning", "[mcl_signs] Unknown symbol in '"..s.."' at "..i.." (probably "..s:sub(i, i)..")") + -- No character image found. + -- Use replacement character: + file = "_rc" i = i + 1 + minetest.log("verbose", "[mcl_signs] Unknown symbol in '"..s.."' at "..i) end if file ~= nil then width = width + printed_char_width diff --git a/mods/ITEMS/mcl_signs/textures/_rc.png b/mods/ITEMS/mcl_signs/textures/_rc.png new file mode 100644 index 0000000000000000000000000000000000000000..8b66915e65362b2aad96f275bd0c7d9de2319bcc GIT binary patch literal 902 zcmV;119|+3P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwm0s_Y=k&jmC6N@uF_ z_#9Jhuq*`JBXEcF$M+Gw;Udu#lA7m|bHtTODqPX8|P79%9=s7$!k2 z*JD1ne}!G|9V~78@oW#a1F`QwA0zL8GDl`Kwx91n!k3-)b11uCO%Kc2ztMQT*5i8h z`kV}6bVWSjz^9Nz+3i*#LXR_|`^Zl(L}H4M*Q0i$`xxi7x|%YS%3&|+V=1czN649Eb;~G*pQ3H6 z6coo28;Et#JWyJoLJYMBCF)dZ(7EbH4O2{fvY}>f(0$rmj0?8~CCx&E4S0GG2Z;u1 z0yE#{LTlWz#%tslxf48@5R4|f*Am_t|EAmmjWJV~DEg%n(gO41nKhWkBscHy0skV2#HW;!wKhmMqQ!KaDAD$Ygy7fJ7KuF&SiZqL^_=P^M_i zMg$!ld@5$nlK21tQsquzfQ?879OpSU`WP)=R=&(QS^z?^MGR=LfdDHdMgCZFdzVdgQ|nKgv-X(x;`SEjMf4N~@i_bZq~gyM^w(^m@{XR65hCXFl!pvz&Dx z*M^KVbmU>fM;Y}-jrO*EqDC*|KBq>T+9Z~ipWUg!Z1xd?=5eBv8HjNr5VuJH3C)vP zbV`XQxydXR#->mPHPQ*E(z=qu1yp!u(2bo^HfKLI?Cca7m=3IYHC z00v@9M??Vs0RI60puMM)00009a7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6$%g* z&*D5M0000nNklDD&X2PPKfeG0xm?R^*Dr_oo cI|-}f0hh}R1fPdjIRF3v07*qoM6N<$f&&nYr~m)} literal 0 HcmV?d00001 From 78fc9565c011d246c992eb5dd429c9a3a72107f6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 21 Mar 2019 11:35:53 +0100 Subject: [PATCH 231/379] Make sign formspec translatable --- mods/ITEMS/mcl_signs/init.lua | 3 ++- mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr | 4 ++++ mods/ITEMS/mcl_signs/locale/template.txt | 4 ++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index e878d16ea..4d0139990 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("mcl_signs") +local F = minetest.formspec_escape -- Font: 04.jp.org @@ -236,7 +237,7 @@ local show_formspec = function(player, pos) minetest.show_formspec( player:get_player_name(), "mcl_signs:set_text_"..pos.x.."_"..pos.y.."_"..pos.z, - "size[6,3]textarea[0.25,0.25;6,1.5;text;Edit sign text:;]label[0,1.5;Maximum line length: 15\nMaximum lines: 4]button_exit[0,2.5;6,1;submit;Done]" + "size[6,3]textarea[0.25,0.25;6,1.5;text;"..F(S("Edit sign text:"))..";]label[0,1.5;"..F(S("Maximum line length: 15")).."\n"..F(S("Maximum lines: 4")).."]button_exit[0,2.5;6,1;submit;"..F(S("Done")).."]" ) end diff --git a/mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr b/mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr index 27f06a9f8..dec4360cd 100644 --- a/mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr +++ b/mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr @@ -2,3 +2,7 @@ Sign=Schild 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.=Schilder können beschrieben werden und kommen in zwei Varianten: Wandschild und stehendes Schild. Sie können auf und an den Seiten von anderen Blöclen platziert werden, aber nicht unter ihnen. 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.=Nachdem das Schild platziert wurde, kann man etwas darauf schreiben. 4 Zeilen mit je 15 Zeichen pro Zeile sind verfügbar, alles darüber geht verloren. Es werden nicht alle Zeichen unterstützt. Der Text kann nicht geändert werden, sobald er geschrieben wurde; man muss das Schild erneut platzieren. +Edit sign text:=Schildtext bearbeiten: +Maximum line length: 15=Maximale Zeilenlänge: 15 +Maximum lines: 4=Maximale Zeilen: 4 +Done=Fertig diff --git a/mods/ITEMS/mcl_signs/locale/template.txt b/mods/ITEMS/mcl_signs/locale/template.txt index 2cf0ef998..e6d90b2db 100644 --- a/mods/ITEMS/mcl_signs/locale/template.txt +++ b/mods/ITEMS/mcl_signs/locale/template.txt @@ -2,3 +2,7 @@ Sign= 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.= 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.= +Edit sign text:= +Maximum line length: 15= +Maximum lines: 4= +Done= From ae5f5fe3b71fa0d85d59574a504f0da926fc1d70 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 21 Mar 2019 11:37:36 +0100 Subject: [PATCH 232/379] Slightly change wording in sign formspec --- mods/ITEMS/mcl_signs/init.lua | 2 +- mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr | 2 +- mods/ITEMS/mcl_signs/locale/template.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index 4d0139990..793eed60b 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -237,7 +237,7 @@ local show_formspec = function(player, pos) minetest.show_formspec( player:get_player_name(), "mcl_signs:set_text_"..pos.x.."_"..pos.y.."_"..pos.z, - "size[6,3]textarea[0.25,0.25;6,1.5;text;"..F(S("Edit sign text:"))..";]label[0,1.5;"..F(S("Maximum line length: 15")).."\n"..F(S("Maximum lines: 4")).."]button_exit[0,2.5;6,1;submit;"..F(S("Done")).."]" + "size[6,3]textarea[0.25,0.25;6,1.5;text;"..F(S("Enter sign text:"))..";]label[0,1.5;"..F(S("Maximum line length: 15")).."\n"..F(S("Maximum lines: 4")).."]button_exit[0,2.5;6,1;submit;"..F(S("Done")).."]" ) end diff --git a/mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr b/mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr index dec4360cd..5129696ba 100644 --- a/mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr +++ b/mods/ITEMS/mcl_signs/locale/mcl_signs.de.tr @@ -2,7 +2,7 @@ Sign=Schild 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.=Schilder können beschrieben werden und kommen in zwei Varianten: Wandschild und stehendes Schild. Sie können auf und an den Seiten von anderen Blöclen platziert werden, aber nicht unter ihnen. 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.=Nachdem das Schild platziert wurde, kann man etwas darauf schreiben. 4 Zeilen mit je 15 Zeichen pro Zeile sind verfügbar, alles darüber geht verloren. Es werden nicht alle Zeichen unterstützt. Der Text kann nicht geändert werden, sobald er geschrieben wurde; man muss das Schild erneut platzieren. -Edit sign text:=Schildtext bearbeiten: +Enter sign text:=Schildtext eingeben: Maximum line length: 15=Maximale Zeilenlänge: 15 Maximum lines: 4=Maximale Zeilen: 4 Done=Fertig diff --git a/mods/ITEMS/mcl_signs/locale/template.txt b/mods/ITEMS/mcl_signs/locale/template.txt index e6d90b2db..f4f4827bc 100644 --- a/mods/ITEMS/mcl_signs/locale/template.txt +++ b/mods/ITEMS/mcl_signs/locale/template.txt @@ -2,7 +2,7 @@ Sign= 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.= 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.= -Edit sign text:= +Enter sign text:= Maximum line length: 15= Maximum lines: 4= Done= From 262457f2401c81c74a41def629e780c178337cec Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 21 Mar 2019 12:13:18 +0100 Subject: [PATCH 233/379] Fix German translation of shulker box formspec --- mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr b/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr index 972dc91a7..9a3d363f8 100644 --- a/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr +++ b/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr @@ -25,6 +25,6 @@ Grey Shulker Box=Graue Schulkerkiste Black Shulker Box=Schwarze Schulkerkiste A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.=Eine Schulkerkiste ist ein tragbarer Behälter der 27 Inventarplätze für alle Gegenstände außer Schulkerkisten bietet. Schulkerkisten behalten ihr Inventar, wenn sie abgebaut werden, also können Schulkerkisten so wie ihr Inhalt als einzelne Gegenstände mitgenommen werden. Schulkerkisten gibt es in vielen verschiedenen Farben. To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out.=Um auf das Inventar einer Schulkerkiste zuzugreifen, platzieren Sie sie und rechtsklicken sie auf ihr. Um eine Schulkerkiste und ihren Inhalt mitzunehmen, bauen Sie sie einfach ab und sammeln Sie sie auf, der Inhalt will nicht hinausfallen. -Shulker Box=Shulkerkiste +Shulker Box=Schulkerkiste Large Chest=Große Truhe Inventory=Inventar From d12356794ff6b7aeeb20bc82a6072282669c5d3c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 21 Mar 2019 12:28:48 +0100 Subject: [PATCH 234/379] Close editing formspec if sign is destroyed --- mods/ITEMS/mcl_signs/init.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index 793eed60b..6cbec59e9 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -187,6 +187,10 @@ local destruct_sign = function(pos) v:remove() end end + local players = minetest.get_connected_players() + for p=1, #players do + minetest.close_formspec(players[p]:get_player_name(), "mcl_signs:set_text_"..pos.x.."_"..pos.y.."_"..pos.z) + end end local update_sign = function(pos, fields, sender) From 8019315eaa6d3f2ec24c9c745580f047ff038a0b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 21 Mar 2019 12:52:13 +0100 Subject: [PATCH 235/379] Fix character cutoff in standing signs --- mods/ITEMS/mcl_signs/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index 6cbec59e9..d009b287c 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -121,9 +121,9 @@ local generate_texture = function(lines, signnodename) local texture = "[combine:"..SIGN_WIDTH.."x"..SIGN_WIDTH local ypos if signnodename == "mcl_signs:wall_sign" then - ypos = 29 + ypos = 30 else - ypos = -2 + ypos = 0 end for i = 1, #lines do texture = texture..generate_line(lines[i], ypos) From 65a61398b50159e197db2ec65e1d5c09d669204a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 21 Mar 2019 14:35:56 +0100 Subject: [PATCH 236/379] Add some Latin-1 characters for signs --- mods/ITEMS/mcl_signs/characters.txt | 87 ++++++++++++++++++ mods/ITEMS/mcl_signs/init.lua | 5 +- mods/ITEMS/mcl_signs/textures/_ae.png | Bin 0 -> 866 bytes mods/ITEMS/mcl_signs/textures/_ae_.png | Bin 0 -> 872 bytes mods/ITEMS/mcl_signs/textures/_broken_bar.png | Bin 0 -> 857 bytes mods/ITEMS/mcl_signs/textures/_cent.png | Bin 0 -> 873 bytes mods/ITEMS/mcl_signs/textures/_copyright.png | Bin 0 -> 883 bytes mods/ITEMS/mcl_signs/textures/_currency.png | Bin 0 -> 866 bytes mods/ITEMS/mcl_signs/textures/_diaresis.png | Bin 0 -> 852 bytes mods/ITEMS/mcl_signs/textures/_div.png | Bin 0 -> 858 bytes mods/ITEMS/mcl_signs/textures/_ee.png | Bin 0 -> 869 bytes mods/ITEMS/mcl_signs/textures/_ee_.png | Bin 0 -> 869 bytes mods/ITEMS/mcl_signs/textures/_ex_inv.png | Bin 0 -> 855 bytes mods/ITEMS/mcl_signs/textures/_guill_left.png | Bin 0 -> 856 bytes .../ITEMS/mcl_signs/textures/_guill_right.png | Bin 0 -> 855 bytes mods/ITEMS/mcl_signs/textures/_mu.png | Bin 0 -> 869 bytes mods/ITEMS/mcl_signs/textures/_oe.png | Bin 0 -> 865 bytes mods/ITEMS/mcl_signs/textures/_oe_.png | Bin 0 -> 866 bytes mods/ITEMS/mcl_signs/textures/_paragraph.png | Bin 0 -> 871 bytes mods/ITEMS/mcl_signs/textures/_plus_minus.png | Bin 0 -> 858 bytes mods/ITEMS/mcl_signs/textures/_pound.png | Bin 0 -> 868 bytes mods/ITEMS/mcl_signs/textures/_qu_inv.png | Bin 0 -> 858 bytes mods/ITEMS/mcl_signs/textures/_registered.png | Bin 0 -> 882 bytes mods/ITEMS/mcl_signs/textures/_sz.png | Bin 0 -> 874 bytes .../ITEMS/mcl_signs/textures/_times_cross.png | Bin 0 -> 860 bytes mods/ITEMS/mcl_signs/textures/_times_dot.png | Bin 0 -> 849 bytes mods/ITEMS/mcl_signs/textures/_ue.png | Bin 0 -> 870 bytes mods/ITEMS/mcl_signs/textures/_ue_.png | Bin 0 -> 872 bytes mods/ITEMS/mcl_signs/textures/_yen.png | Bin 0 -> 866 bytes 29 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 mods/ITEMS/mcl_signs/textures/_ae.png create mode 100644 mods/ITEMS/mcl_signs/textures/_ae_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_broken_bar.png create mode 100644 mods/ITEMS/mcl_signs/textures/_cent.png create mode 100644 mods/ITEMS/mcl_signs/textures/_copyright.png create mode 100644 mods/ITEMS/mcl_signs/textures/_currency.png create mode 100644 mods/ITEMS/mcl_signs/textures/_diaresis.png create mode 100644 mods/ITEMS/mcl_signs/textures/_div.png create mode 100644 mods/ITEMS/mcl_signs/textures/_ee.png create mode 100644 mods/ITEMS/mcl_signs/textures/_ee_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_ex_inv.png create mode 100644 mods/ITEMS/mcl_signs/textures/_guill_left.png create mode 100644 mods/ITEMS/mcl_signs/textures/_guill_right.png create mode 100644 mods/ITEMS/mcl_signs/textures/_mu.png create mode 100644 mods/ITEMS/mcl_signs/textures/_oe.png create mode 100644 mods/ITEMS/mcl_signs/textures/_oe_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_paragraph.png create mode 100644 mods/ITEMS/mcl_signs/textures/_plus_minus.png create mode 100644 mods/ITEMS/mcl_signs/textures/_pound.png create mode 100644 mods/ITEMS/mcl_signs/textures/_qu_inv.png create mode 100644 mods/ITEMS/mcl_signs/textures/_registered.png create mode 100644 mods/ITEMS/mcl_signs/textures/_sz.png create mode 100644 mods/ITEMS/mcl_signs/textures/_times_cross.png create mode 100644 mods/ITEMS/mcl_signs/textures/_times_dot.png create mode 100644 mods/ITEMS/mcl_signs/textures/_ue.png create mode 100644 mods/ITEMS/mcl_signs/textures/_ue_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_yen.png diff --git a/mods/ITEMS/mcl_signs/characters.txt b/mods/ITEMS/mcl_signs/characters.txt index 8574b781b..3f597b20c 100644 --- a/mods/ITEMS/mcl_signs/characters.txt +++ b/mods/ITEMS/mcl_signs/characters.txt @@ -283,3 +283,90 @@ _co ` _gr 2 +ä +_ae +5 +ë +_ee +5 +ï +_ie +5 +ö +_oe +5 +ü +_ue +5 +Ä +_ae_ +5 +Ë +_ee_ +5 +Ï +_ie_ +5 +Ö +_oe_ +5 +Ü +_ue_ +5 +ß +_sz +5 +× +_times_cross +5 +· +_times_dot +5 +÷ +_div +5 +» +_guill_right +5 +« +_guill_left +5 +¢ +_cent +5 +¿ +_qu_inv +5 +± +_plus_minus +5 +© +_copyright +5 +® +_registered +5 +¨ +_diaresis +5 +§ +_paragraph +5 +¦ +_broken_bar +5 +¥ +_yen +5 +¤ +_currency +5 +£ +_pound +5 +µ +_mu +5 +¡ +_ex_inv +5 diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index d009b287c..7567f9a77 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -56,8 +56,7 @@ local string_to_line_array = function(str) current = current + 1 tab[current] = "" linechar = 1 - -- This check cuts off overlong lines - elseif linechar <= LINE_LENGTH then + else tab[current] = tab[current]..char linechar = linechar + 1 end @@ -84,7 +83,7 @@ local generate_line = function(s, ypos) local width = 0 local chars = 0 local printed_char_width = CHAR_WIDTH + 1 - while chars <= LINE_LENGTH and i <= #s do + while chars < LINE_LENGTH and i <= #s do local file = nil -- Get and render character if charmap[s:sub(i, i)] ~= nil then diff --git a/mods/ITEMS/mcl_signs/textures/_ae.png b/mods/ITEMS/mcl_signs/textures/_ae.png new file mode 100644 index 0000000000000000000000000000000000000000..7f199e477502d225240c45ca93d1af4245f6bd79 GIT binary patch literal 866 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 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_copyright.png b/mods/ITEMS/mcl_signs/textures/_copyright.png new file mode 100644 index 0000000000000000000000000000000000000000..7cfdf217ea3ef1e22be1112389d363244d1633a7 GIT binary patch literal 883 zcmV-(1C0EMP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HYa@-&chW~Sl9sx-RiQ`}}Grd8N-xo~wBiUxA zX@ADd0v197JpykyfBhWc2ObhlA*p#TIY&IHq{0;)kJodx6w|7&M|Vrl@(|k|V2A{* zT(9}u`W14$Pq4J*$Fn@xHpIRSy?NdSWqM|Gww`Z8!k3)(dnkKeO%L1IztMON>v0Xe ze@}*BbcH?Pz^9Nz)IPlkRv<+xT0zZ1JSDTQ;;1qDI(8w~*TK8>-o-A~Etls|gqXKN zeix%HCw(2e6`{u!(cSaYfJjX7@p+8h=sw1I?XISbNae6M^|qDOgCfG2WKGK`hM%Hu zs}vN+78{6l&^%CDphApj4@%Uj(x7v-jT)Ai_+&%N+z|IEb1^R57L+s#4L0EE0W4S= zs0qY;TMI3}W%+C5@Z1TSOfW{6@u7rQ!mpH@p)qFa5=Fn_gtWlAc;+;gG0DvuT0lT! z$5dB*R|yY!6Cc1%X1c=c*kFyvW#Uk}=awwa0zHi>Y{+DN8$gKQTd^1t5QrI<1Z9fG zY($8ogHOfESrQ*0K&sp+46qT&fa5%UV~)|%W#vnZs|6rbvKY|d00CA?iu|$U$f2t9 zK2p`JrmjV6mYlNYoGs5gs+w3bwQOc?#j1-ZSI=(lUc44Af-6i*E*6THQfh_M3ey#{ zD>Q07_>dzVdgQ|nKgv-X(x;`SEjMf4N~@i_bR7SlyM^w(^m@{XR65hCXFl!pvz&Dx z*M^KVbmU>fM;Y}-jrOs9qDJq?eNK%wwMi^3J-btb*zC;&&Fe%bGZ5oMAa0WY5}GHo z=#&yqa+6ssj6L!J=-be@q4}?3bo{{zzX8Bkcbi@*Y&ie` z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z28Iu$()-3I^w05C~JK~xCWV_?7n z7@_okbg} zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HYa@-&chW~Sl9sx-RiQ`}}Grd8N-xo~wBiUxA zX@3T00n0)HJpykyfBhWc2MUR%kkmYvoFhsqsc^-><5jMnVp{E0bocZu53%hR43VIh z>oK2Oze29}36{3}c$Np-hS;~EH_zLkOwWwL*7I#h_>$9p4rR})>0vwjHyW?kdR(vG zKPN*ly274t;8RE4ra(NC#h($}$D5qew^-910O5Q!;1mdDtQ?qi(S?rO@2R1SMnZ(CU-C?cFm*0hXj_$kJ= zYC&~uv4L0z%>%UsD#VEPphTT24LVofs9}kTPd4<-4RN0`7vsWhK}oaHU;~~W#KES4 znn29Awb1fgmcK?0&z+#j1Y?95A8L3d{7StU8e^s|QS>WLNDHisXHH`oliX~f1q3v9 zOm)R~)$ouv@d4~)rYp>j4c2&ECJv>0Zpq>-(9@X0hD_GC0fY#?6^kJOftYbgP^M_i zMua#z_*AT%CGi0Qq{^Mb02`4EIL^~I<`^wqR=&izS^z>NivbM|5MZUG$RA6N9I86+ zBUR06>RPmB$ti2j+48)js);32%Vy?Qth#t|_3Y;E#cSarxWcsLVxf2`rB*ntFkLab zLZjA$4>{7IM?UQEqa3v%eOhYTaIr8Av+=F?6;%UK6< zZOBMNM;WgXdl}rYV?lW=hSFZo5a%6vpY42&E8DVyiRm712Ikn;x-8&p?NZk zPATyuH<`u4I26jDMmphin#4dboy0om#_mq;Q*J@iUvc9C1iiR|DUMz72gFn*S@~ z32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0~HK4F@}~U82|tPAW1|)R0!8&V4xWM sN9QwQkziy(=D-+CxQzKvzz(Va059MM0!CvvasU7T07*qoM6N<$f>9@h6aWAK literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_diaresis.png b/mods/ITEMS/mcl_signs/textures/_diaresis.png new file mode 100644 index 0000000000000000000000000000000000000000..d092503a610a8fd305635eb1d86881c25bbfa55f GIT binary patch literal 852 zcmV-a1FQUrP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=G}k{lrnMfaS-M@UHsiQ|wA5x#+s?+;1W)a{P& zu<)WGDxs7@z<+|O(0_a%;TsA?@(|TL<&+MTm}BOGjvrUKS~}u-UM208p6%hN`vt=! zXl48N?O$Nm`v8mEem>iS?Lh21(A&&Apv;*Wo$cp4knm-v{XOJ8uEdA!?9ZsYUh8?i zdi@>^Vl+iO;lN!;4m^F%B3OZBDQE>x7UF4{eMK$k@yFVQH(g)FyY*hQJIc1pvlQV* zA-!m{?W7-Tw-kC@5#48gdSPYJvc(nC~H_kHGC9( zTQ#FPwpc-|f#!)?17%{UJ&>J^3JvP3tyHnZ$ej%>bA|5H=3<<=E+}zU8f?JRf;iYz zP!pK>wia6R<~3g>$IOl3$%J5p5$|gF$oMDq7HEu_xZ9H9X|a@c?!*(ia7^CIO%9j~e3qYtOF`&T#0<0Jn`D4+MLj|WN z231XJ>YBAANik_k$ejvIUIub) z$cRHn8a907QEt>|AKNEt^g`})YP6|MVsZJ|of^z$Zy{)2Cpwvd7)Jten*@;1JeeI% zG4dognH`yND3n2sbi!#giGg73#5(B4?oRGgZb9R3apPZ+3lrVHAQvXOP3}Fn52&@W zeo4y1>81@Dm_)mak`aEO!6^ z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z28HzBDPSN{M201-( zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HYa@-&chW~Sl9sx-RiQ`}}Grd8N-xo~wBiUxA zX@3T00n0)HJpykyfBhWc2MUR%kkmYvoFhsqsc^-><5jMnVp{E0bocZu53%hR43VIh z>oK2Oze29}36{3}c$Np-hS;~EH_zLkOwWwL*7I#h_>$9p4rR})>0vwjHyW?kdR(vG zKPN*ly274t;8RE=Vi)U{%X26~%v&M9 zi_w;ozK-3B(Bq2e?)mA3NKEmuJjQNxALG1sS5ro$a@d=C+sYb25#da-re##aPcgPt z3#wy_4a7QV9;hu)Ax5+ZCF)dZ(7F0X4NFXXvY}^gi2Ibe7#D7GAwZ?U20T58gG~c9 zftYV=q2;$Me~lcTJ3*5P#t1V$)bL99m3lKY#!OwJ=vSPO7FZY0tiduSx!FPs2x#n> z>Wc5G;URD01K7z-SC}0etns)^97^}xlEqn|r!j>MnXGRE2oZcM7DEC8G2@b;OwpK) z2yt}qsaQEn;sXRol{5ADE z8nqsL$dL{`@?nP`<){tm(^Auxn>BBx)y`cyj(^YHLib*JJ?TU$o$1swpLY6L&N`55 zLq-}p^048fjC!L+``A8Fqj%&!r$(FFB$k$*-Kjxr_GW_Sb)u6Qh;bqiw@CmA&68Pl zN{J`A$t)Jep-=`j(g~;2BnE=%B-TMUc6V~0atoUNiW~olT$t$o2e~lOZE_#Ey`a|X z`l84JG*97-X_SGB4GO1M_By{wU+%-d8u&K!ZRp$3{8uqL{;P%GMiO_9imK>K00009 za7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6%7Xh)%1Ev0000PNkl zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwm0s_Y=k&jmC6nCVPa zCixswZLll^+#_&@^ViQ2e&8a}6q1_fl5@nBN-A8@@OWKUO);(eb?L6@*&brsFBm34 zE!Sf{w||9Q?;R{{`|)fKwga*6KyM@OfHFsBG`64bK*E=u_H!t^Uri6o*}u_vz1HJ; z_5L{-#OR86!hugAiMab5MKA*?Qc(-;EX30?+p_E|{#v_`>ud3Dt#{hRy6y5TMTmJj zTM~j1xLu4WOd6ZhM%Hs zs}vN+5*vth&^%CDph66_2PNuMY0$aqMh#O;e6pctZqR+&T#O611trZwgAEvZ5C@3{ zY63Ig=0a=Svc_xV7`YQXnGlT7<3kCrj9)3YKx53*C5nFOgtWlCc;+;wG0Dw4ynukl z)>N0itAvNVi4R~WGhH$}7FgqPg*cS%xh0FUz)xce8!}nn0U!~^R!oKj1Y*V^L7Ad4 z8xeGL@Tr(NOX33rNR>N<0X8BTaGdAZ=wq~eS@|;KXaNY7ECw{#D1eocB7ZD7a;WM& zk5o0QscX@iC8w-8XUp@9swS39Et{EJvFhT<)w7$s7q5kj;0V)_i-qE)lv*)pMd*s& z6&|%7e8`awJ@R3PALXbG>C;lvmYX$irPa<|I<|k$-9qnQKNU{KBq>T+9Z~ipWUg!Z1xs{=5eBv8HjNr5VuJH3C)vP zbV`XQxydXR#->mPHPQ*E(-wU|0yKBw)HKS#!3KxZD|?;aq%YUuUjuvx`VRCRX#T4h9skwBZ?@`pnpt~$lmGw# z32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0~HJ>9J{> zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?Qqc>vD-!sQ%pSA&@wl~eaT#m3%3m=txA&(7->6SR&KUCcm?6M?ub0!V0H%%W3D zyvQwPu`o7;GN_R*IGq+T5KMzuCq39b$^DXB(Dbjk@jsCZ3*G-gE-ZA1+|S&;pw{dD zqR0lccHxR?l!=243d1XVUEieNZo_{y@NMYZ(6^!WS1~(&?ZV&83U;s0cpG8>000Sa zNLh0L04^f{04^f|c%?sf00007bV*G`2jc@33?~uA40Qqk001RPL_t&t*JEJ71OB7Y vn1B(VEV9IZMl6Di*i zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwl?s_Y=k&&6i?G1Hl< zO!7IV+F)4-xJTd)(X7*vpvMNUocF9 zTCT@Dwtt0P?;R{{`|)fKwga*6KyM@OfU-trG`64bK*E=u_H!t^Uri6o*}vKNe67dz z>iu&vh|v}CgaZ#DiMab3MKA*?Qc(-;EX2!_ZWfXBTDy?zYw>QaciP3e?eZ)|h1*vyg&t=__mQ7oh{O~huSe}>_c_P4x|%YS%3&|+Z7F99j*v6S*)5|Oeu}o8 zrJy*L*g&j<=7G`z6=JA8DN(0Nlg3#$YM5f;!G@Z-LHA{IF)rNXLV!Y(4S0GG2b%_J z;30gQ3!USZbG$~5kvqYY3Bd?GK9umv_?2=CH0MfPqUe`SNDIu1S59LZi`=@y3kYa# zP4(3GEa4$<;se;lOi!5|3#{?DLL5r>+>(>Cz)xce8!}nn0U!~^R!oKj1Y*V^L7Ad4 z8xeGL@Tr(NOX33rNR>N<2{s}baGclJ=wo#Hvhrod(E<=ESqx~ffdDHdMgCZFdzVdgQ|nKgv-X(x;`SEjMf4N~@i_bZq~gyM^w(^g3uDl|~vm^048fj5?8P zQ)Zev^R(%+%zC3nd)q!yqj%&!r$(FFB9=}+yHkVN>@5VX<3txT5aUE3Zi@gCnisR^ zloBs;i&-p;O`!~Gqzg``MGOSfAl6AYc6V~0atoUNiW~olTv+J-2f47&ZE_#Ey`a|X z`9+Zv(AtGd(6nP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwm0s_Y=k&jmC6nCVPa zCixswZLll^+#_&@^ViQ2e&8a}6q1_fl5@nBN-A8@@OWKUO);(eb?L6@*&brsFBm34 zE!Sf{w||9Q?;R{{`|)fKwga*6KyM@OfHFsBG`64bK*E=u_H!t^Uri6o*}u_vz1HJ; z_5L{-#OR86!hugAiMab5MKA*?Qc(-;EX30?+iBU8=xgmluCK+rwccqL>$c0Y6d~sA zkl$&v?WC`@TM9kSi0&gly%32hK3gAXV-Z2H1#Xz;T{qqmR+@W#!9^qh)Rl$zni*jRIIHDe}jXBZsQa z^GH>*nz|OPS#rvnbGAIssA^)#)Uuhm6{{|uTs^zFd+}Ph2#zoW_lAFw8VQdOzP$QjiI!$6Am`-9HbYpiX_bIoa>94r)pU8!Y?thRA6Wu2Fk=qMu zy{<2cEI@M?PEDf>9Bgnny|UN&P5N>j{x!gNpzlE6f#$!8(eYm`{06r6cbbD#3ex}p z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z28F)nZN?dSji02N6@K~xCWV_={f i_>V>tAwa$aH2?rQ2?_U?(oHP@0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwm0s_Y=k&jmC6nCVPa zCixswZLll^+#_&@^ViQ2e&8a}6q1_fl5@nBN-A8@@OWKUO);(eb?L6@*&brsFBm34 zE!Sf{w||9Q?;R{{`|)fKwga*6KyM@OfHFsBG`64bK*E=u_H!t^Uri6o*}u_vz1HJ; z_5L{-#OR86!hugAiMab5MKA*?Qc(-;EX30?+iBTF{Izx=*Vp3RTJN-rb=&1xiV*X5 z$nP}TcGB0{ErlLuME8-OUWmjLAFoI4M)xt!YjrhcD3!xr)Z0>43yzR8$?BF-3_nHN zRw*csB{mT2pn0IQK!q4;4@%Uj(x7wIjT)wy_+&%P+@SlkxfmC23rd=W1{*N+APzPS z)C6X}&4t#uWsTR!F>)t(G9ehD$A=PL8NX6)fyS7rOBDUm32A|O@yuyVW0IS9cmV;8 zt*I`3R|yY!6Cc1%X1Zi{EU?Do3UMgib4wOyfuF_{He|BC13)5-t(Xi62*iv-f-*&8 zHX`Wg;8QVkmc$1LkSccy18hVx;5g5*(Z^`{vhrod(E<=ESqx~fQ2;9?MgCZFdzVdgQ|nKgv-X(x;`SEjMf4N~@i_bZq~gyM^w(^m@{XR65hCXFl!pvz&Dx z*M^KVbmU>fM;Y}-jrO*EqDJq?eNK%wwMi^3Kf6# literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_mu.png b/mods/ITEMS/mcl_signs/textures/_mu.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8c1b89045af84033d98b7ea43c99ee93dc3e80 GIT binary patch literal 869 zcmV-r1DgDaP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=G}lHDK-hWDHzN3bM>#Bne~Rc?^u=Lgeo>P}Z> zSY**q53npG&?oQ<{m1tazM)Vg4^hoiPU%32Ic6>x_;Ho1rz5WRDrxuhEDuNBFBl?0 zFI&HF{Q|k(Cs^F_^I0Bj8)Dyv=w^5onV#o(>-jb$e937)hrH*N_^_S*IK+1aSjpuYM_6-$iV+0Zjr#C^(Kj5Alc5TMdv1D+PdL8F42 zK+Lzb(DIv?ze*0zjiAW{V}u#+YWPU_C-r7%jG4MbhhK5>1(;{nU>TF#Y@r1NG4kT=Hz*vU*+m>nA|$9b7JmF~GEi?cvaj~F&&vbGH%MDVRx3<(Gvi9{*UVa!H^ zI6C+gtehqC2?C_bjluvMkpwu-(>LZAEnQZ=#JE}jLM4d-4Gs`s#i+<1i;f&BDjI{T zCN*`A9<7;HQLAai5k6-`H`;=SI_*>lgSLDJ(_b4>W5V00009 za7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6%7J3XE_^{0000aNkl=nI`M^00000NkvXXu0mjfJL!X7 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_oe.png b/mods/ITEMS/mcl_signs/textures/_oe.png new file mode 100644 index 0000000000000000000000000000000000000000..9b68921555abe765aa5925be6be41fae7e41e1ba GIT binary patch literal 865 zcmV-n1D^beP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwm0s_Y=k&jmC6nCVPa zCixswHdqz{?h$l{^ViQ2e&8a}6q1_fl5@nBN-A8@@OWKUO);(Kb?L6@*&brs9~dS< zE!S&4w||9Q?;R{{`|)fKwga*6KyM@OfHFsBG`64bK*E=u_IoJ1Uri6o+4pF?KI?IP zdjFmbVsu43;lQVmL_B?tBA9^`si*}{7UF4{Z9!der`OtrTwjZKYrWGh)@_$(DMHNK zA-~gT+eu$*w-kDu5#2|A`XCZhe7qjD8{Nk^uhrF*p;QigQEy9GEjU8XB&%CSG2Du_ ztx`}NOKc$4LGwUqfeJCy9+aq4r9tPa8#PQZ@yUjoxk2}7b1^R57L+s#4L0EEK^$xv zs0qw`n+vUR%NnndW8_ZoWI`}Pj}IlhGJd7p0*x_KmnizB6Vd|n;+fN!#w0hN@B#uF zTT@;7t`Z*dCO&|j%yh}@SYVCE72;63=awwa0zZu@Y{+DN2Y^HvTQM0D5QrIv1Z9fG zY(&t}!KY&8EQt>gAXV-Z2H1#Xz;T{qqmR+@W#!9^qXi&TvKY`{0|8b_iu|$U$f2t9 zJW|!HrmjV6mYlNYoGs5Ys+w3bwQOc?#j1-ZSI=(lUc44Af+I{zE*6THQfkGZ6`?D7 zS9sKV@F7P!^vH)Dew3p&q)$stTW;38l~y}<>Dc}~cMIKn>Gh-&sdT1O&wSeHXF2OY zt_>M!=*Yu{k230w8trZSM2+5&`~@7NEHcr>0Q`4mLQPUfJvXP5N>j{x!gNpzlE6f#$!8(eYm`{02Oica67&f;<2K z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z289}Zue#0&rc03Jz1K~xCWV_+Z^ r{70kltNf2mE1b=QO&b$QW>NqEY?ufAX#GX!00000NkvXXu0mjfDKmoH literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_oe_.png b/mods/ITEMS/mcl_signs/textures/_oe_.png new file mode 100644 index 0000000000000000000000000000000000000000..73b4da80ed711d15fa30bcc5b4b58d64030d7ac6 GIT binary patch literal 866 zcmV-o1D*VdP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwm0s_Y=k&jmC6nCVPa zCixswZLll^+#_&@^ViQ2e&8a}6q1_fl5@nBN-A8@@OWKUO);(eb?L6@*&brsFBm34 zE!Sf{w||9Q?;R{{`|)fKwga*6KyM@OfHFsBG`64bK*E=u_H!t^Uri6o*}u_vz1HJ; z_5L{-#OR86!hugAiMab5MKA*?Qc(-;EX30?+k$%9^K0!wuCK+rwccqL>$c0Y6d~sA zkl$&v?WC`@TM9kSi0&gly%32hK3gAXV-Z2H1#Xz;T{qqmR+@W#!9^qXi&TvKY`{0|8b_iu|$U$f2t9 zJW|!HrmjV6mYlNYoGs5Ys+w3bwQOc?#j1-ZSI=(lUc44Af+I{zE*6THQfkGZ6`?D7 zS9sKV@F7P!^vH)Dew3p&q)$stTW;38l~y}<>Dc}~cMIKn>Gh-&sdT1O&wSeHXF2OY zt_>M!=*Yu{k230w8trZSM2+5&`*=sVDNp!u(2bo^HfzX3)1caFMm2p0eV z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z289|loCOg;br03S(2K~xCWV_?7o s{-e?ORsP4O70zbDrj2+(oEA|40P8>p|ED$Q=>Px#07*qoM6N<$f)9g=*#H0l literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_paragraph.png b/mods/ITEMS/mcl_signs/textures/_paragraph.png new file mode 100644 index 0000000000000000000000000000000000000000..52c162120bd0ded0a621214e569db8855eaca11d GIT binary patch literal 871 zcmV-t1DO1YP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=G}k{lrnMfaS-M@UHsiQ|wA5x#+s?+;1W)a{P& zu<)WGDxs7@z<+|O(0_a%;TsA?@(|TL<&+MTm}BOGjvrUKS~}u-UM208p6%hN`vt=! zXl48N?O$Nm`v8mEem>iS?Lh21(A&&Apv;*Wo$cp4knm-v{XOJ8uEdA!?9ZsYUh8?i zdi@>^Vl+iO;lN!;4m^F%B3OZBDQE>x7UF4{eU-E<>0|A}o35|o-Fh$D9cA0)S&DF@ zkX|&}cG8cvTM9j{i0(5#y)ZfA@mL~r{g$DK2R;pNH5|#8!E&5eh*RmFTe3I{{Pc)nLndoG03^cPip7wCz>!Fl5*@~D zM9|T}r(oqQkxvjHRc;gp*oY*+ah`KyjM4IC<;#q#1t8`TF`&T#0<0Jn`D4+MLq$bn zP}QWSu31Zx6qBZuEX_Nrm{>HmWM*#Jii<~APj2p>y=2aUD@=3B7P9A@OTnZCp$kSA zc$9MTDQ7(OOsAcG=Cf3!PmNV;s#d+`S{gTLIQ}g)3(Z?@rBg>L_1LwiZrywCWgypv zj5u_pVZ%orA8NdO7WliA@E zBTsUZ*^wECLK)OZC!9u;7zoBrtb=as?&Ln@7Bv1AH~tm5Fwy-Ba$%y|-tZUE)?BN6ghx6007vV4)iVd4OsvH002ovPDHLkV1f-8ik|=g literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_plus_minus.png b/mods/ITEMS/mcl_signs/textures/_plus_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c3f12003109b14f4aad710b16598b8ea2f7553 GIT binary patch literal 858 zcmV-g1Eu_lP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGk|ZY#MgLiamw+UM#BxX;5#E89?+eM)YuXdx zu|FH45>h1u+#{$8{d%_tJAv3wAbJGeMb^x#fBgIe629$p-a|R#YI@nu`EWa7Pw>z8 zWDuh(;t2;HLK5-xHH%;cQlz34JXwgBW%YI2(f?Yzkn7jtJ$fJ7#d_@WE=7p>IOGqF zj-B+wE{|#WZAJ8)`RxmAA;s77qTQU`=N$L$YRXV5hqI|4TiHE0UXb!uBcmEVioWey zP#s%rAl5GP zy7k>PyyQ)M0lS##mf5kv8m~LVrS!}#*_;J_8dErs$@&QZi7>ZfF(e=mGcF0r6ph)4 zpreCN#mZR{Um!rL+$l`35y^n#yynIjqwUMew;5LpK&WIfpus@_tdtb_W66<2Ro8u_ zs##54i`FbTWz9KTUUyVAv1Dr5%-o7q7f-I9-Q2x+EnEawn3h~D6fdRJib*R%SB$Rk zsP*DYu5{^@FT4CIS8Yh2mYTNQta&S~cJ9(~{Cn;ey7$uSpn+5xY3RtqhL1ApM6OMl zY3j_=rq43#gBqP<`$mmE$o-lc9cqhM+J5$=2D90Z5VWonUCcm?6M?ub0!V0H%%W3D zyvQwPu`mvWGN_R*IGq+T5KMzuCq39b$^DXB(Dbjk@jsCZ3*G-gE-ZA1+|S&;pw{dD zMUf3?ox-JQl!=QC4#O*ZUB5}c-G=`f;5*QFpzlEIU&ZYBYZv|oxlnekN=_{&00009 za7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6%0EKH+pms0000PNklH9RL6T literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_pound.png b/mods/ITEMS/mcl_signs/textures/_pound.png new file mode 100644 index 0000000000000000000000000000000000000000..31d38d392878a7f52cc31750687a8b4c660ee09c GIT binary patch literal 868 zcmV-q1DpJbP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGk|ik!hTmPqEI~j7mt%T~m>taW=hw8(rMkK! zx@R6stO(CgyE;&b(R8rxJfycYtJ;k)!yXfiZT^?dPFBl?0 zFZW{}N54X@&k2@}{CbxMJBHYgp%2f;pe)af!O`<$Ncfi1c@E{wtLbGs=QkVg*LvNr zK0hZzFuKB?aNr>%5v?yTf)z-SieAvN5HHCZ>uyPY61$M=*TH*?KE*E9BbWD3gqV*) z{uHAlC;d8hJ3_B3qNnG#7a}pm*YX;>*?rD&@2;kdNab)g^|6&bf+E71WKYYehM!_= zyB1W(78{6l(7aGvphAoYPD<3N(xkEbMh#0$JlN1PH^hC(T#O614JEBglMQ%!5C@wE zY63Ao)X76O0jN{7}PJ!au1GLvyawC5nE>32A|K@ycl|W06}ew19x- ziK*`R?iyb5Ccc1O%yfs@vB4Uz+r*{x%q`iR1$r7&IFQNuF@O-kw_-6QAP_Sy3Ca|W z*@zHF2cL?Svn0MifK<6tm|!E40mpgy#vG%q%gVPHR|`O>WHF$@0RpU)6!~MxkwaD2 zeWa>cOq)$stTW;38l~y}<={Wv9cMIKn>2=URDvdOBT=4sPsne{=9&ar)?MxV(2ni?Hyi&)xv_M`@}*@p>Q*NHA>AjXM6+!g^OG%se+ zDJ5Ry7PD9whe8?DNEe(=ix>!|L9CM=?4IO)$t`I5EpGfXa$%wSKgflJ?vVSD+ZWV& z-Cq>hfYvEoF^w{Du|Z*YWv}a-^v8YpuLiyieH;2VwEk7hj{j=mUp%vSjW&N91poj5 z32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0~HK43OAk1JpcdzB1uF+R0!8&U?2zl uhhh`~3^s}iCT!*~qN!rUWhQajNdy3!l?VU{yfk3|0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmS9N;iREA(RoOw7p9^OCG1Hl< zO!7IV+F)4-xJTd){nyVCe&8a}7^0e|oYH|S=9syl;m37dH63x?uS<7L&-QTC{eoc< z)N(zhzWodAdhcLy+s|ivupNkf2YMTM2b4K7qp|&b2NJ&Qw4X!X{YrdT&i;+c>$RTO ztM|{*AVyQf6As*k?V$kH_m#yU~1%eyy&=1f^2gi+WqiYQYh5#!HQaV)!ZA zwn|2EEU|)E1I-hq2Fk=xdr+iCg$DIiSE`s|)4K`qCK^$x< zs0qw`n+vUR^BS*`W8_BgWI`}Pj}IlhGJd7p0*x_Km+0_IC!_`D#WSZdjY)3a;ROUV zwx+uDT_rr^&G7(sGSelqV}a#3uMnrwJ-1|W7WnBA!-h=Ob^u6(u@#dc0f8gokf20| zF&hzdbnq#dIZNad1W1(|g#k7q32>a}*yv-ld|CN2<7fd0l_Ul<*eHM%qauGSI&!G! zJdad0si|w$k|f2XDJ4tuj4CD;O)Z(3Tejlj(bbciyJs(%v)~BRoU(=NIp{vqrGjPsL?xepHrhvZ4!&i&+gPV`Zv~0w*UYD07*qoM6N<$f`iVBQ~&?~ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_registered.png b/mods/ITEMS/mcl_signs/textures/_registered.png new file mode 100644 index 0000000000000000000000000000000000000000..9a78dda3c273acd778edc3de7730f0d5b8235921 GIT binary patch literal 882 zcmV-&1C9KNP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGk|ik!hTmPqEI~j7mt%T~m>taW=hw8(rMkK! zx@R6stO(CgyE;&b(R8rxJfycYtJ;k)!yXfiZT^?dPFBl?0 zFZW{}N54X@&k2@}{CbxMJBHYgp%2f;pe)af!O`<$Ncfi1c@E{wtLbGs=QkVg*LvNr zK0hZzFuKB?aNr>%5v?yTf)z-SieAvN5HHCZtN3nz61$M=*TH*?KE*E9BbWD3gqV*) z{uHAlC;d8hJ3_B3qNnG#7a}pm*YX;>*?rD&@2;kdNab)g^|6&bf+E71WKYYehM!_= zyB1W(78{6l(7aGvphApjPfFCO(xkEbMh#0$JlN1PH^hC(T#O614JEBglMQ%!01K7| zY63Ao)X76O0jN{7}PJ!au1GLvyawC5nE>32A|K@ycl|W06}ew19x- ziK*`R?iyb5Ccc1O%yfs@vB4Uz+r*{x%q`iR1$r7&IFQNuF@O-kw_-6QAP_Sy3Ca|W z*@zHF2cL?Svn0MifK<6tm|!E40mpgy#vG%q%gVPHR|`O>WHF$@0RpU)6!~MxkwaD2 zeWa>cOq)$stTW;38l~y}<={Wv9cMIKn>2=URDvdOBT=4sPsne{=9&ar)?MxV(2ni?Hyi&)xv_M`@}*@p>Q*NHA>AjXM6+!g^OG%se+ zDJ5Ry7PD9whe8?DNEe(=ix>!|L9CM=?4IO)$t`I5EpGfXa$%wSKgflJ?vVSD+ZWV& z-Cq>hfYvEoF^w{Du|Z*YWv}a-^v8YpuLiyieH;2VwEk7hj{j=mUy){amMHv82LJ#7 z32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0~HK9GMEQwYybcNFiAu~R0!8&V88+x zq4a-rvHxfa|1%+}giA7^Y5R{Z$be1df0!l2Yscy&oQ}r;0KrlV3E#V0q5uE@07*qo IM6N<$g6sQ_g8%>k literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_sz.png b/mods/ITEMS/mcl_signs/textures/_sz.png new file mode 100644 index 0000000000000000000000000000000000000000..56d2847a1517a7346a218bf19d413c17be8525e3 GIT binary patch literal 874 zcmV-w1C{)VP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwm0s_Y=k&jmC6nCVPa zCixswZLll^+#_&@^ViQ2e&8a}6q1_fl5@nBN-A8@@OWKUO);(eb?L6@*&brsFBm34 zE!Sf{w||9Q?;R{{`|)fKwga*6KyM@OfHFsBG`64bK*E=u_H!t^Uri6o*}u_vz1HJ; z_5L{-#OR86!hugAiMab5MKA*?Qc(-;EX30?+k&SmD*jr#kn3ylZmoCP#k%eCEJcWU zJLGp7Z9C~}?Uq81Got&*PcKAbijUW$cBA_k=e4?;GL*_;FY0Y6s|82MnPhd#D2AV+ zZL1U%#}XTebP8JyOnkDTW^T}Z+FXnaw*@85LW2!>dJqSV z25JH`-{wMV+_J`N4dbvym;m`rZLIQJG_8^ z#@1AqzN>_XyonEBCo^3#I~G{uafLXP?ztt4v%pVd3L7$6-vJ;I##T&*1O#HnAwij< zF&hzdbnvN|IZNUL1W1)Tg#k7q8E~BE*yv-ld|CN2<7fd0l`IA{*g$}lk|KXBIdZ7# zJdad0tEp?znkA>KIcLlBjH)J;l8c4nrIcDRXhrCX z-W49T9(>4=4n6W=hacsr4e8TT)0UexZ>81FT{^aZ&)q`zUV1(0L@J%>)H9!U`dQ98 zkZVIm8anc@;iHUtqegq%K2f807+}Fwt#tAGy7t z*6aGB$O1HX;nXzBz`+KG(<^(O-=r_s;a>xM2l@{59cccm7#;uB!f%l>ca~8%&7A-M z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z28AUjd^DiZ(z04GUAK~xCWV_+Z_ zFfuSO{72(6FrW$kM`yqVm~fekp`D=0{|wXt0Q1lY{+LaY761SM07*qoM6N<$f;2{r A+yDRo literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_times_cross.png b/mods/ITEMS/mcl_signs/textures/_times_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..25af91b680ac4f48163cdbaa80c50d692d8f81db GIT binary patch literal 860 zcmV-i1Ec(jP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwm0s_Y=k&jmC6nCVPa zCixswZLll^+#_&@^ViQ2e&8a}6q1_fl5@nBN-A8@@OWKUO);(eb?L6@*&brsFBm34 zE!Sf{w||9Q?;R{{`|)fKwga*6KyM@OfHFsBG`64bK*E=u_H!t^Uri6o*}u_vz1HJ; z_5L{-#OR86!hugAiMab5MKA*?Qc(-;EX322mc^FEUTYU}eJ$Rt^-jB3w_Tp42r+Mm z{7$27Cw;BmQs{9;bRYTYg-A^C@p{y5bRXlqR##JoQaS8Jy)9+6;0QUBtZo^_@KdyH zm4f0}Vgs=bng>b?REVMWphTT24LVods9}nUPd3!d4Z2U8i*ey57XlO-Y{1ilI7l>5 z6PWon7h2<%HC`jf$erNHgkXdoA4+&-{7Sh68e^s|QS?hEqy^^1Gp8|)Np9ZZ1q3v< zrn>Z9B|PL!d;mL{>5|#8z#5M$#G!Q0Em@oeei~EQkjeTE0EsZRVlpHk5Hk)5$`p;+ zh@hi`PsPkx5+5Kys@y3Iuo20C<2=VkAEV{V%9j~O3qYu3Y!aUv2(VI8{7IM?UQEqa3v%eOhYTaIr8Av+=F?6;%UK6< zZOBMNM;WgXm8smYV?lW=hSFZo5a%cvpY4I&E7)LJWg~n12Ikn;x-8&p?NZk zPATyuH<`u4*c8g3Mmphin#4dboy0om#_mq;Q*J@iUvc9<{9 z32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0~HMi8?m3#i2wiq8c9S!R0!8&V4xWM m$Ho7TLji7q{{+pXCIA4tc?kHN)f;920000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(uE3)0o16OxBM9gb2PBiy;Alm~lx^rfAGY zgg83*RIHpO@dW~;%ALXl8<7k+&dWFE7;RlvzQwp&077v@3}|qG04pU${#bJ4P}OxG zscKeJ*P=B`PFZu#me(CsO)QyOHZ!+k)y0#mXE%2*UJDn&6{aN@3&l$*wZdtI>5ADE z8ns@0$(1g>@@1D_<*E(o(^Auxn>BBx)y`cyj(^YHLib*J9W;GOIy#L)F3wdVS?6mqKg@baUu}6MF0uSi&=C^ zi5I!WEEdM0PzE*91*g*@27+l2>!b&}C%Ip83!45FH~uGbVWIm!$c2UOko%e27u0&) z|0uEnty8#S8fD^QgTnC2Ue|xpZ};K98u&K!ZRp$3`l^^6pLXGIreJofW67rV00009 za7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6%7VAnp}@70000GNkl zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=H0k{l@vhWDJpM?exn;y5Iah`GTW-#-*xFSi|G zdls{3hyqe6B+w_w3gh2@X849ei994V&n4%Gl1eIEG4OaRx1M6!?XBd~)2lqhc3v<< zf?kgPIQkWGeN3=)NRf(O(6SIO$r=k}t1X|$E_}rGJ$U!gTkK*za(N9!xKqe) zF*}eU*@KcO! z*MjQUVgs=bnipydREQDniR|oDY0}tzqlP6W9&G5D8{)oXF2;r1hLTpL$p$<3Mq8JaZ(>|60HKn_fCdK$uu@Xwk0nPARTWJ^ zRkND97Oh!w%9?YwyzZ!KV#(C9nYk6KE}mRHySaPuTDSznk)efV1gUxvO6eHr>c7@D{)@E0$92hq}%#>LT%mjD0& z32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0~HJ&Cj>HWApigXBuPX;R2b7^U?3O# wN23X={*Q%?VZ?t11_lNuT*fewV;8jm00OlN`T@RRJ^%m!07*qoM6N<$g5P6>Qvd(} literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_ue_.png b/mods/ITEMS/mcl_signs/textures/_ue_.png new file mode 100644 index 0000000000000000000000000000000000000000..3193a941293a78e674a862d33904d05af9fec8c7 GIT binary patch literal 872 zcmV-u1DE`XP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=H0l3XbaMdz%-OF$ArVmUlM5xs+6zAq$|KbIY0 zy9Yfeh3k36jH~HsJLkjgggwFE zzbAtjT@g<>@DP%Sr>|KAE07`;t>DQ*yez9PuvJOopKBLBbbS}^-h0z7)?=4fDZ-sX ze$(jKN#E>ppN3ynM30$YUYNubpUabWb9SF|+;&$}hEh44O?_--_uzOzO4-9Qs^O#P z+pY!GvBd^r9W*c07N`(I?TPH{RB6)KZKH-ICLU~PnHzLpHW%Zl?> zfttX~_qEWTx9s^EIcDwzPbLH-jQF93&y0Uk?}6rAsY?|7rju{LymA`LSmf3dUO+(e zXsTP^UBgq}#3!(enQoaK8?5oVg}9U+xh0#kz)xce2Qpbd0U#0PRxE}D1Y#yp$`p;+ zh@hi`PsPev5?>%ds@y3|uo20C!5*D8foar!-kJC>O`(h znQ7|G)27cd>zx{%WBWpl-pKu$8XanjSlWK}pa!$qM+jQii7sX!#)&}O76BwQFJ{px zC0^tfvsf61LK)OZ7o1Lu7zn08tds8S9^`(>Eok~JZu~QHVWImk$c2UOko%F_C)9e~ zzbLW+ty8!(jWThu!C`o1uj@DIkK6FK0lor#1^No~e+V>jUEt4U_zuz3mBtmfeh&Zu z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z289x#XD=;i zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(47#1vo4OYG+CKIgc1S5ro$ayXm%v6Vf7;)PJko|aJ!k78`Q z7F5R;8;Et#yii-9LX2onO4O;+q_O)(4NFWs*w8aK#C^$Jj0?97C9O)64S0GG2b%_J z0x>_DBnbFS1SihjolX@Pa|%4sZPky|aafPm(S zsqXmh8eZ}yzJOiKbcflo!5XjI#HIAiE!ms}dKyzWkjeTnfDpmAVlgBj5Hl_b$`p;+ zh!95ypNf^UB)&j^RJl`_V1v8|9Ova5bBwkwE8k*VEdZgC#efC}2(VI8~;Mo{dOPztATGr--f;ot*?sN@o5+S2DvtNtsiqC3IG5A z32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0~HK5CAVRsrvLx|AW1|)R0!8&U?2tj sN9QwPQ^iD#5&v Date: Thu, 21 Mar 2019 15:45:54 +0100 Subject: [PATCH 237/379] Signs: Add support for all Latin-1 printable chars --- mods/ITEMS/mcl_signs/characters.txt | 195 ++++++++++++++++++ mods/ITEMS/mcl_signs/textures/_1_2.png | Bin 0 -> 876 bytes mods/ITEMS/mcl_signs/textures/_1_4.png | Bin 0 -> 881 bytes mods/ITEMS/mcl_signs/textures/_1_sup.png | Bin 0 -> 868 bytes mods/ITEMS/mcl_signs/textures/_2_sup.png | Bin 0 -> 865 bytes mods/ITEMS/mcl_signs/textures/_3_4.png | Bin 0 -> 886 bytes mods/ITEMS/mcl_signs/textures/_3_sup.png | Bin 0 -> 863 bytes mods/ITEMS/mcl_signs/textures/_a_acute.png | Bin 0 -> 862 bytes mods/ITEMS/mcl_signs/textures/_a_acute_.png | Bin 0 -> 882 bytes .../mcl_signs/textures/_a_circumflex.png | Bin 0 -> 866 bytes .../mcl_signs/textures/_a_circumflex_.png | Bin 0 -> 876 bytes mods/ITEMS/mcl_signs/textures/_a_grave.png | Bin 0 -> 865 bytes mods/ITEMS/mcl_signs/textures/_a_grave_.png | Bin 0 -> 880 bytes mods/ITEMS/mcl_signs/textures/_a_ring.png | Bin 0 -> 867 bytes mods/ITEMS/mcl_signs/textures/_a_ring_.png | Bin 0 -> 880 bytes mods/ITEMS/mcl_signs/textures/_a_sup.png | Bin 0 -> 867 bytes mods/ITEMS/mcl_signs/textures/_a_tilde.png | Bin 0 -> 868 bytes mods/ITEMS/mcl_signs/textures/_a_tilde_.png | Bin 0 -> 874 bytes mods/ITEMS/mcl_signs/textures/_acute.png | Bin 0 -> 853 bytes mods/ITEMS/mcl_signs/textures/_ae_lig.png | Bin 0 -> 866 bytes mods/ITEMS/mcl_signs/textures/_ae_lig_.png | Bin 0 -> 868 bytes mods/ITEMS/mcl_signs/textures/_c_cedille.png | Bin 0 -> 868 bytes mods/ITEMS/mcl_signs/textures/_c_cedille_.png | Bin 0 -> 873 bytes mods/ITEMS/mcl_signs/textures/_cedille.png | Bin 0 -> 854 bytes mods/ITEMS/mcl_signs/textures/_d_dash.png | Bin 0 -> 876 bytes mods/ITEMS/mcl_signs/textures/_d_dash_.png | Bin 0 -> 872 bytes mods/ITEMS/mcl_signs/textures/_degree.png | Bin 0 -> 859 bytes mods/ITEMS/mcl_signs/textures/_diaresis.png | Bin 852 -> 852 bytes mods/ITEMS/mcl_signs/textures/_e_acute.png | Bin 0 -> 870 bytes mods/ITEMS/mcl_signs/textures/_e_acute_.png | Bin 0 -> 871 bytes .../mcl_signs/textures/_e_circumflex.png | Bin 0 -> 874 bytes .../mcl_signs/textures/_e_circumflex_.png | Bin 0 -> 872 bytes mods/ITEMS/mcl_signs/textures/_e_grave.png | Bin 0 -> 869 bytes mods/ITEMS/mcl_signs/textures/_e_grave_.png | Bin 0 -> 874 bytes mods/ITEMS/mcl_signs/textures/_i_acute.png | Bin 0 -> 863 bytes mods/ITEMS/mcl_signs/textures/_i_acute_.png | Bin 0 -> 866 bytes .../mcl_signs/textures/_i_circumflex.png | Bin 0 -> 867 bytes .../mcl_signs/textures/_i_circumflex_.png | Bin 0 -> 867 bytes mods/ITEMS/mcl_signs/textures/_i_grave.png | Bin 0 -> 863 bytes mods/ITEMS/mcl_signs/textures/_i_grave_.png | Bin 0 -> 870 bytes mods/ITEMS/mcl_signs/textures/_macron.png | Bin 0 -> 855 bytes mods/ITEMS/mcl_signs/textures/_n_tilde.png | Bin 0 -> 873 bytes mods/ITEMS/mcl_signs/textures/_n_tilde_.png | Bin 0 -> 879 bytes mods/ITEMS/mcl_signs/textures/_not.png | Bin 0 -> 1301 bytes mods/ITEMS/mcl_signs/textures/_o_acute.png | Bin 0 -> 870 bytes mods/ITEMS/mcl_signs/textures/_o_acute_.png | Bin 0 -> 867 bytes .../mcl_signs/textures/_o_circumflex.png | Bin 0 -> 872 bytes .../mcl_signs/textures/_o_circumflex_.png | Bin 0 -> 875 bytes mods/ITEMS/mcl_signs/textures/_o_dash.png | Bin 0 -> 874 bytes mods/ITEMS/mcl_signs/textures/_o_dash_.png | Bin 0 -> 878 bytes mods/ITEMS/mcl_signs/textures/_o_grave.png | Bin 0 -> 870 bytes mods/ITEMS/mcl_signs/textures/_o_grave_.png | Bin 0 -> 873 bytes mods/ITEMS/mcl_signs/textures/_o_sup.png | Bin 0 -> 865 bytes mods/ITEMS/mcl_signs/textures/_o_tilde.png | Bin 0 -> 867 bytes mods/ITEMS/mcl_signs/textures/_o_tilde_.png | Bin 0 -> 869 bytes mods/ITEMS/mcl_signs/textures/_pilcrow.png | Bin 0 -> 872 bytes mods/ITEMS/mcl_signs/textures/_thorn.png | Bin 0 -> 2480 bytes mods/ITEMS/mcl_signs/textures/_thorn_.png | Bin 0 -> 153 bytes mods/ITEMS/mcl_signs/textures/_u_acute.png | Bin 0 -> 873 bytes mods/ITEMS/mcl_signs/textures/_u_acute_.png | Bin 0 -> 876 bytes .../mcl_signs/textures/_u_circumflex.png | Bin 0 -> 874 bytes .../mcl_signs/textures/_u_circumflex_.png | Bin 0 -> 876 bytes mods/ITEMS/mcl_signs/textures/_u_grave.png | Bin 0 -> 870 bytes mods/ITEMS/mcl_signs/textures/_u_grave_.png | Bin 0 -> 878 bytes mods/ITEMS/mcl_signs/textures/_y_acute.png | Bin 0 -> 875 bytes mods/ITEMS/mcl_signs/textures/_y_acute_.png | Bin 0 -> 871 bytes mods/ITEMS/mcl_signs/textures/_y_diaresis.png | Bin 0 -> 874 bytes 67 files changed, 195 insertions(+) create mode 100644 mods/ITEMS/mcl_signs/textures/_1_2.png create mode 100644 mods/ITEMS/mcl_signs/textures/_1_4.png create mode 100644 mods/ITEMS/mcl_signs/textures/_1_sup.png create mode 100644 mods/ITEMS/mcl_signs/textures/_2_sup.png create mode 100644 mods/ITEMS/mcl_signs/textures/_3_4.png create mode 100644 mods/ITEMS/mcl_signs/textures/_3_sup.png create mode 100644 mods/ITEMS/mcl_signs/textures/_a_acute.png create mode 100644 mods/ITEMS/mcl_signs/textures/_a_acute_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_a_circumflex.png create mode 100644 mods/ITEMS/mcl_signs/textures/_a_circumflex_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_a_grave.png create mode 100644 mods/ITEMS/mcl_signs/textures/_a_grave_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_a_ring.png create mode 100644 mods/ITEMS/mcl_signs/textures/_a_ring_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_a_sup.png create mode 100644 mods/ITEMS/mcl_signs/textures/_a_tilde.png create mode 100644 mods/ITEMS/mcl_signs/textures/_a_tilde_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_acute.png create mode 100644 mods/ITEMS/mcl_signs/textures/_ae_lig.png create mode 100644 mods/ITEMS/mcl_signs/textures/_ae_lig_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_c_cedille.png create mode 100644 mods/ITEMS/mcl_signs/textures/_c_cedille_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_cedille.png create mode 100644 mods/ITEMS/mcl_signs/textures/_d_dash.png create mode 100644 mods/ITEMS/mcl_signs/textures/_d_dash_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_degree.png create mode 100644 mods/ITEMS/mcl_signs/textures/_e_acute.png create mode 100644 mods/ITEMS/mcl_signs/textures/_e_acute_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_e_circumflex.png create mode 100644 mods/ITEMS/mcl_signs/textures/_e_circumflex_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_e_grave.png create mode 100644 mods/ITEMS/mcl_signs/textures/_e_grave_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_i_acute.png create mode 100644 mods/ITEMS/mcl_signs/textures/_i_acute_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_i_circumflex.png create mode 100644 mods/ITEMS/mcl_signs/textures/_i_circumflex_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_i_grave.png create mode 100644 mods/ITEMS/mcl_signs/textures/_i_grave_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_macron.png create mode 100644 mods/ITEMS/mcl_signs/textures/_n_tilde.png create mode 100644 mods/ITEMS/mcl_signs/textures/_n_tilde_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_not.png create mode 100644 mods/ITEMS/mcl_signs/textures/_o_acute.png create mode 100644 mods/ITEMS/mcl_signs/textures/_o_acute_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_o_circumflex.png create mode 100644 mods/ITEMS/mcl_signs/textures/_o_circumflex_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_o_dash.png create mode 100644 mods/ITEMS/mcl_signs/textures/_o_dash_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_o_grave.png create mode 100644 mods/ITEMS/mcl_signs/textures/_o_grave_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_o_sup.png create mode 100644 mods/ITEMS/mcl_signs/textures/_o_tilde.png create mode 100644 mods/ITEMS/mcl_signs/textures/_o_tilde_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_pilcrow.png create mode 100644 mods/ITEMS/mcl_signs/textures/_thorn.png create mode 100644 mods/ITEMS/mcl_signs/textures/_thorn_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_u_acute.png create mode 100644 mods/ITEMS/mcl_signs/textures/_u_acute_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_u_circumflex.png create mode 100644 mods/ITEMS/mcl_signs/textures/_u_circumflex_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_u_grave.png create mode 100644 mods/ITEMS/mcl_signs/textures/_u_grave_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_y_acute.png create mode 100644 mods/ITEMS/mcl_signs/textures/_y_acute_.png create mode 100644 mods/ITEMS/mcl_signs/textures/_y_diaresis.png diff --git a/mods/ITEMS/mcl_signs/characters.txt b/mods/ITEMS/mcl_signs/characters.txt index 3f597b20c..3e30994aa 100644 --- a/mods/ITEMS/mcl_signs/characters.txt +++ b/mods/ITEMS/mcl_signs/characters.txt @@ -370,3 +370,198 @@ _mu ¡ _ex_inv 5 +¬ +_not +5 +¯ +_macron +5 +° +_degree +5 +¹ +_1_sup +5 +² +_2_sup +5 +³ +_3_sup +5 +´ +_acute +5 +¶ +_pilcrow +5 +¼ +_1_4 +5 +½ +_1_2 +5 +¾ +_3_4 +5 +À +_a_grave_ +5 +Á +_a_acute_ +5 +Â +_a_circumflex_ +5 +Ã +_a_tilde_ +5 +Å +_a_ring +5 +Æ +_ae_lig_ +5 +ª +_a_sup +5 +º +_o_sup +5 +¸ +_cedille +5 +Ç +_c_cedille_ +5 +ç +_c_cedille +5 +È +_e_grave_ +5 +É +_e_acute_ +5 +Ê +_e_circumflex_ +5 +Ì +_i_grave_ +5 +Í +_i_acute_ +5 +Î +_i_circumflex_ +5 +Ð +_d_dash_ +5 +Ñ +_n_tilde_ +5 +Ò +_o_grave_ +5 +Ó +_o_acute_ +5 +Ô +_o_circumflex_ +5 +Õ +_o_tilde_ +5 +Ø +_o_dash_ +5 +Ù +_u_grave_ +5 +Ú +_u_acute_ +5 +Û +_u_circumflex_ +5 +Ý +_y_acute_ +5 +Þ +_thorn_ +5 +à +_a_grave +5 +á +_a_acute +5 +â +_a_circumflex +5 +ã +_a_tilde +5 +å +_a_ring +5 +æ +_ae_lig +5 +è +_e_grave +5 +é +_e_acute +5 +ê +_e_circumflex +5 +ì +_i_grave +5 +í +_i_acute +5 +î +_i_circumflex +5 +ð +_d_dash +5 +ñ +_n_tilde +5 +ò +_o_grave +5 +ó +_o_acute +5 +ô +_o_circumflex +5 +õ +_o_tilde +5 +ø +_o_dash +5 +ù +_u_grave +5 +ú +_u_acute +5 +û +_u_circumflex +5 +ý +_y_acute +5 +þ +_thorn +5 +ÿ +_y_diaresis +5 diff --git a/mods/ITEMS/mcl_signs/textures/_1_2.png b/mods/ITEMS/mcl_signs/textures/_1_2.png new file mode 100644 index 0000000000000000000000000000000000000000..52d025e87431013183593bc80f5f6f41cf85a987 GIT binary patch literal 876 zcmV-y1C#uTP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwm0s_Y=k&jmC6nCVPa zCixswZLll^+#_&@^ViQ2e&8a}6q1_fl5@nBN-A8@@OWKUO);(eb?L6@*&brsFBm34 zE!Sf{w||9Q?;R{{`|)fKwga*6KyM@OfHFsBG`64bK*E=u_H!t^Uri6o*}u_vz1HJ; z_5L{-#OR86!hugAiMab5MKA*?Qc(-;EX322(3WLavDey#TwjZKYrWGh)@_$(DMHNK zA-~gT+eu$*w-kDu5#2|AdLa^1e7qjD8{Nk^uhrF*p;QigQEy9GEjU8XB&%CSG5i#5 zTcw~lme@e7gXV$K0u^GYJt$G9N`uZ-H)@z-;*$+EbA#^F=3-p9$%O!g1{*N+APzPS z)C6X}&4t#uWsTR!F>)t(G9ehD$A=PL8NX6)fyS7rOBDUm32A|O@yuyVW0IS9cmV;8 zt*I`3R|yY!6Cc1%X1Zi{EU?Do3UMgib4wOyfuF_{He|BC13)5-t(Xi62*iv-f-*&8 zHX`Wg;8QVkmc$1LkSccy18hVx;5g5*(Z^`{vhrod(E<=ESqx~fQ2;9?MgCZFdzVdgQ|nKgv-X(x;`SEjMf4N~@i_bZq~gyM^w(^m@{XR65hCXFl!pvz&Dx z*M^KVbmU>fM;Y}-jrO*EqDJq?eNK%wwMi^3Kf6Hq)$ z32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0~HM?Iq`e9&j0`bDoI2^R0!8&U|?YQ z&wvJ)7_b0rg8v!NwExGdf;0hi$^W=ilVCO@HWdI@gbn!X2-`6L0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwl?s_Y=k&&6i?G1Hl< zO!7IV+F)4-xJTd)(X7*vpvMNUocF9 zTCT@Dwtt0P?;R{{`|)fKwga*6KyM@OfU-trG`64bK*E=u_H!t^Uri6o*}vKNe67dz z>iu&vh|v}CgaZ#DiMab3MKA*?Qc(-;EX2!_&`z)|i@(+`@rxzkI#mDPWyV-rtajmYV45f0|i+Wqi*@7eFOmcS1D2AV+ zZD%PcjwLn_>!5j{v_ORzYEMeksnVoz){Ppbn0ThVS zfttX~x4F4dbvym;j_rm@JaJG_8^ z=GIhCea{je@+LljUCi{9*|ESHk1NEXbk8k0ISc$Wrm!KC^&J2bVQj@@NI)QF91@f% z8nY2WM+cvZnX@E5K!8-aQayp&Qa2CWEP z(YwN<)`Jf@(xFE_?C_%;wIO|4YT9zM=B>2axl70P@3~v(-b=5822yFHp(76)KFX*Q zxi)2{sWVTTKFh2(YP7fQ6E%8A?sICisV!pZ^s_rPn9bfo&^k_ZF#|D91md;`Afb6N zi%u!=BDa{u!q^nbphmjjbXvqfFb!gzbYpiX_bIoa>94r)pU8!U?thRA3*9F7k=qMu zy`EnbIRUL*xHOG2aj?N*cxA8aoAl*6{A+;kK;MDB1Fe4*v*W*7_ziUhca!ufFIE5m z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z29C>%ZKe@6fS04_;HK~xCWjgPSn z05A-~oc#Z@yGI_%2nGoNIa)$x%Bh>gw~?Vm3oup5{e1KQ#A^-uw5Y_P00000NkvXX Hu0mjf0IHTu literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_1_sup.png b/mods/ITEMS/mcl_signs/textures/_1_sup.png new file mode 100644 index 0000000000000000000000000000000000000000..6be5fdcb1c82353b035fc97ce7940222a21d8525 GIT binary patch literal 868 zcmV-q1DpJbP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwm0s_Y=k&jmC6nCVPa zCixswZLll^+#_&@^ViQ2e&8a}6q1_fl5@nBN-A8@@OWKUO);(eb?L6@*&brsFBm34 zE!Sf{w||9Q?;R{{`|)fKwga*6KyM@OfHFsBG`64bK*E=u_H!t^Uri6o*}u_vz1HJ; z_5L{-#OR86!hugAiMab5MKA*?Qc(-;EX322&`!&ul3r^Ua(yk{t@Td3ShroCr3f)^ zhx|^XZ6|%L-BRdrMsy$f>4iv4@$q`pZgd~xyjE9JhEh4~MZGO$wcrRjldNtT#qd+K zZIy!JSYiXQ4w?r_3si`q_Mk+aDh)bU-Kb%TiBC4v%niCvn~QPbCKmz}8f?JRgE-hU zP!pK>HWymsmNi}@$H<-F$%J5p9v@10W&BFH1sY?fE>ZMLC!_`D#WSZdjY)3a;ROUV zwx+uDT_rr^O?&`5ndy?*vA`OSE5xC6&n;P;1%4V+*pSKk4giTTwqi0QAP_SS3Ca|W z*@&Q{gHOfGSrQ*0K&sp+46qT&fa5&JMjxZ)%gUD-M+-oxWHF$@1_G><6!~MxkwaDI zd8DdYOmp82%X&vMp* zTpKdd(2<7?A7#`VHQL+ui5k5l_c=A%)F!dC{OnE*X0x{tG>;RV%s`A2fw)ZqNNAqS zqEkvd$xUXlFgArUsF6-MohC65Oee7py0N>H`;=SI^jF;YPvpWx_dm#miEfko$n6ES zUe^~z7NEHcr>0Q`4mLQPUfJvXCVjaM{~F*s(08EkK=WV4==iS|eglW+ca>UShlv0H z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z29D>lt> zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwl?s_Y=k&&6i?G1Hl< zO!7IV+F)4-xJTd)(X7*vpvMNUocF9 zTCT@Dwtt0P?;R{{`|)fKwga*6KyM@OfU-trG`64bK*E=u_H!t^Uri6o*}vKNe67dz z>iu&vh|v}CgaZ#DiMab3MKA*?Qc(-;EX2!_&`zi;tmU{;K_twgdQJCcxC)bxdobYr7ltQODCiS=EWU);(kT>xG>|&;;%#H=tcw8Y4rF(A4$ywm1F@+78tnUDj2xBWILjnRZN<~9HLIy>(V8WvtT|`P>x`-p#so4XgUg^S<_(~^sY;-!>YF=$2T ziry6-wH|!Pkq$lbVTT{(s151UQqz{3HE*TW&RsgTf6v`Q_g;D(G>}Ro4IO#d@KHvc z$h9dmO`Un#^jT)TQKP+WpQzD0a-UP9O>GfNr=Q)a!EE*xg4S`Oiy4S-GGi$O&le!lh}HiGvLe!z+7T-=r_s;a>xM2l@{59ccZlm>qwx!f%m0ca|%AV2uC( z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z29DJTUS?8m%txo00000NkvXXu0mjf&Mt`N literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_3_4.png b/mods/ITEMS/mcl_signs/textures/_3_4.png new file mode 100644 index 0000000000000000000000000000000000000000..46e17104995b2f3646af911061a74767533bf36e GIT binary patch literal 886 zcmV-+1Bv{JP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwl?s_Y=k&&6i?G1Hl< zO!7IVY_Kc@+#~1?(X7*vpvMNKQK&! zTCUeTwtt0P?;R{{`|)fKwga*6KyM@OfU-trG`64bK*E=u_IoJ1Uri6o+4pRGe%9mq z^!_~=#OR86!hwg7L_B?sBA9^`si*}{7UE?|XeZPaH@(&_@rw<}A#mDPWyV-rtajmYV45f0|i+Wqi*@7eFOmcS1D27|n zwzCuz#}XTebqZSzOgz|7GdJkIY%a!yn_LJ`XtDuM58`0c zKuuug+g#`zx18fOa*W&wo=gZv=<%V1SH`cDTc9~t>Jml2bV6ESUc7P|(^%xz6J9_- zb8D)nzGn#!c@rPNE@pbl>{wup#}(pGy62XhoCSUwQ`nHn`VIhzFt%bc$l^pXN<~9HLIy>(V8WvtT|`P>x`-p#so4XgUg^S<_(~^sY;-!>YF=$2T ziry6-wH|!Pkq$lbVTT{(s151UQqz{3HE*TW&RsgTf6v`Q_g;D(G>}Ro4IO#d@KHvc z$h9dmO`Un#^jT)TQKP+WpQzD0a-UP9O>GfNr=Q)a!EE*xg4S`Oiy4S-GFakrU9`g-g>Y69*d{hFA8wev`gjhkp(59q2pIccAsJVs`vj3%>y~Mt6*y)sMCS z000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@34JiycOI~6C001&cL_t&t*JEH{ zVE7Nk7yw0(370B#mH!#g%>0knT!I2vCI4en{hxt>fq@a9J5h810Hmf8@j2wT9RL6T M07*qoM6N<$f?YV2sQ>@~ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_3_sup.png b/mods/ITEMS/mcl_signs/textures/_3_sup.png new file mode 100644 index 0000000000000000000000000000000000000000..add337326dac50fa418d861b6a470db0df06645e GIT binary patch literal 863 zcmV-l1EBngP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmS9N;iREA(RoOw7p9^OCG1Hl< zO!7IV+F)4-xJTd){nyVCe&8a}7^0e|oYH|S=9syl;m37dH63x?uS<7L&-QTC{eoc< z)N(zhzWodAdhcLy+s|ivupNkf2YMTM2b4K7qp|&b2NJ&Qw4X!X{YrdT&i;+c>$RTO ztM|{*AVyQf6As*kCgyBX>5`%oVy%n~QPgDi;D28f?JRf;ebY zP?O2!HWyms<~3d=$H@0s=?EAwh`_ zV>Tk_=-^W@bC$>_2#_i_3Il9J65u$`vC+q9`Lgn5#?b;0DoG4zuz>(8Mn(QubmUOc zc^;{1Qd8HgB}s}&Q%aWR8C6Uynp!e5w`|45qpK%3ch6ojXTcGsIb{pkbIzq;(1Oqf zy$d`_Ir)?`o_eO!PCxTmD$=LMsx?)sUUMytn>1|ymYRj;Ew|FCBb9pW+EcggJ@+z@ zYePmHI?}M=Bad>UMtj>nQKNU{KBq>T+9Vd2pWUg!Z1xs{=5eBv8HjNt5VuJH3C)w) z;S?iJa+BGS8Jj{G)JP|sMw1u_#!jq*ZtU*lKIIlP{uMX=6S*+a{SR_sqTA#?a(h9o zmGwoD1!(TVsp%mD2OAu^7xps0NnftRzXtdY^d0Cs(EL|18vd(=-$oR7j=+-NwEzGB z32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0~HM_1A^HQFaQ7m9Z5t%R0!8&U|?YQ p55-u)e{>FEl}z|l;M7ik001U@2m4mAfz<#2002ovPDHLkV1l~>gFXNN literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_a_acute.png b/mods/ITEMS/mcl_signs/textures/_a_acute.png new file mode 100644 index 0000000000000000000000000000000000000000..b72b4853e2f4f3befbebfb15f04cfc5932320767 GIT binary patch literal 862 zcmV-k1EKthP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HWvfdyFhX1>YEpnuPP$&k=s0kZ1}?&2z~)qNI`vS9CmHh>jJo{VEw;|z6PWw5OJ+7vQTEU%#cuI6hbV)vlUC8zQ;N5yJv5R%f{sT}sA{w!tnpm-pZvW8_;!=>okss+`t z#0Fv=G!N7ks1PICgA#SBH0WGyqlPIaKH1PRH^hC)T#O611trZ&gAI6k5C@3{Y63Ce z=0eMFS^gS1Ja>X76O0i?ys6Y{+DN8$gKQTQM0D5QrIxO_`!G8xi8@ z;8QVkmc$1LkSccy18hVx;5bj;7-O__S@{yZlQZGy`FR;mCkhPnNK_YEN30awIL%7 z9eLRBQAWK{qrGjPsL>0#&#BR-Hi@OBXLo84oBc6C^ElDT48%AQh}$H9gyzXCI;F&u z++-FDV^b)D8tH`7X%Yj$bQ0^J8@oHXPq_t6f5nYIA{QpQ|3NNHber5;Ztqa*b$wA} z0h+sT#x%;n!3KrXD|?;aq%XJOUk!X4`Zn}!X#Q1i_@%07*qoM6N<$f@j=_1ONa4 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_a_acute_.png b/mods/ITEMS/mcl_signs/textures/_a_acute_.png new file mode 100644 index 0000000000000000000000000000000000000000..d038b45ce74892404307c2a8336f96aa2b50cd47 GIT binary patch literal 882 zcmV-&1C9KNP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=G}lHDK-hWDHzN3bM>#Bne~Rc?^u=Lgeo>P}Z> zSY**q53npG&?oQ<{m1tazM)Vg4^hoiPU%32Ic6>x_;Ho1rz5WRDrxuhEDuNBFBl?0 zFI&HF{Q|k(Cs^F_^I0Bj8)Dyv=w^5onV#o(>-jb$e937)hrH*N_^_S*mj=SI+Ef-%C3cQt$@{F8b!G{#I_qQkE^`2x%{r?HGlZnn?@0vbD} zy5hTPc*vXM0qkU^E6k1!mgBrkoJ#lHlEqn|r$-DMGFjUO5F+?iEQSOGjzprA=rCp@ zLL41@3Rcb%`2+z{>wqLNpuqtGtQZyfW6_aAMMYy! z)ug7bSxb@>lctm`%{!`?STwa{W^UPvi$_;aZtkAFWX^&sOmoT>vge#jfztxh1+xn@ zN;&zIGoE^;(@sD0St`<}#;P?{t6p<0jhi$a|CXAC<}J6Gj3OV94qAU1n5LGwD%$qd9e5{TO*fQ07B>~M;a zC%MV&$c#gw3~HnkPNPW-1Y;-GK{s}Ha-VVw8h?u$|B76g=>7${Fwt#t@40ev|&V4}WXm%g~phFGK%>p@HiHe=fsM@3oc5H`Xw~00009 za7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6%8#BJ|XwN0000nNkl)@(bYp6bayj=PrFm1HhpR{k_sJcK`qY07*qo IM6N<$g21ngg#Z8m literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_a_circumflex.png b/mods/ITEMS/mcl_signs/textures/_a_circumflex.png new file mode 100644 index 0000000000000000000000000000000000000000..f9b80df66dae50b8372c2e7ca46e651482836758 GIT binary patch literal 866 zcmV-o1D*VdP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(7|kRzy$FZ$F5{6kp3r?B?t~=eT!QQ%0n6IGg&hl|6#ug;2_#mQf9lVr;t> zRL2$@h;`7sP+OovjA&0v)Tz>>vHM01OH4f2&@(s0eaT#m3%3m=txA&(czO^An+9qE zF+bKq+i%(a8aX_7f+iD;5oY{U!&k!JsSiVQuGA%pe#Z%Efpzi9X)I%rTP?JJfaZy* z?)dH+Uh*csfL+XVhuN{g8n4^LrS!}#*_;J>8dErs$@(#X5W%-%F(e=mGZLFJMPoK1 z#L>a0V&yD}FAyMA?i422h-AQVUcNEMXzQ}_EymRX5Gq*=XmEf4Do*Bw<&ESXw1Gq+;Z#gnUNH+L^y3m3r^rX?2(#Y-u*!fA!+irEz! zwO)M5l`g&VWtU&&stxJWQqz{3HE*TW&Rsf=f6v`Q_g;D(G>}Ro4IO#d@KHvc$h9dm zO`Un#^jT(oP@{8f->A_CxnEPGLv0aDThE@qQ@COpW#VFk!tlyo*MHJ)_u;=9_%`%y=-bfxs+b+0cHwWY%XX|Mp>DGP000Sa zNLh0L04^f{04^f|c%?sf00007bV*G`2jc@34h1+Ph<_je001IML_t&t*JEHH0RH0= s_|HI$*8h0TWg%npF literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_a_circumflex_.png b/mods/ITEMS/mcl_signs/textures/_a_circumflex_.png new file mode 100644 index 0000000000000000000000000000000000000000..8b35bdf7c849a714ea650c9164654a9b29626c75 GIT binary patch literal 876 zcmV-y1C#uTP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=G}lHDK-hWDHzN3bM>#Bne~Rc?^u=Lgeo>P}Z> zSY**q53npG&?oQ<{m1tazM)Vg4^hoiPU%32Ic6>x_;Ho1rz5WRDrxuhEDuNBFBl?0 zFI&HF{Q|k(Cs^F_^I0Bj8)Dyv=w^5onV#o(>-jb$e937)hrH*N_^_S*mj=SI+Ef-%C3cQt$@{F8b!G{#I_qQkE^`2x%{Yp{$-Znn?@0vbD} zy5hTPc*vXM0qkU^E6k1!mgBrkoJ#lHlEqn|r$-DMGFjUO5F+?iEQSOGjzprA=rCp@ zLL41@3Rcb%`2+z{>wqLNpuqtGtQZyfW6_aAMMYy! z)ug7bSxb@>lctm`%{!`?STwa{W^UPvi$_;aZtkAFWX^&sOmoT>vge#jfztxh1+xn@ zN;&zIGoE^;(@sD0St`<}#;P?{t6p<0jhi$a|CXAC<}J6Gj3OV94qAU1n5LGwD%$qd9e5{TO*fQ07B>~M;a zC%MV&$c#gw3~HnkPNPW-1Y;-GK{s}Ha-VVw8h?u$|B76g=>7${Fwt#t@40ev|&V4}WXm%g~phFGK%>p@HiHe=fsM(gc;pccD<400009 za7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6%8#QZ~ym&0000hNkl8P literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_a_grave.png b/mods/ITEMS/mcl_signs/textures/_a_grave.png new file mode 100644 index 0000000000000000000000000000000000000000..3f0de45a5b02b364dcb3e3c447ca877911893914 GIT binary patch literal 865 zcmV-n1D^beP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(7|kRzy$FZ$DrQDZZAM*v;8}&T;Rqri@7Ca5nX0D|-aR3!%KDkx>ngVr;t> zRL2$@h;`7sP+OovjA&0v)Tz>>vHM01OH4f2&@(s0eaT#m3%3m=txA&(czO^An+9qE zF+bKq+i%(a8aX_7f+iD;5oY{U!&k!JsSiVQuGA%pe#Z%Efpzi9X)I%rTP?JJfaZy* z?)dH+Uh*csfL+XVhuN{g8n4^LrS!}#*_;J>8dErs$@(#X5W%-%F(e=mGZLFJMPoK1 z#L>a0V&yD}FAyMA?i422h-AQVUcNEMXzQ}_EymRX5Gq*=XmEf4Do*Bw<&ESXw1Gq+;Z#gnUNH+L^y3m3r^rX?2(#Y-u*!fA!+irEz! zwO)M5l`g&VWtU&&stxJWQqz{3HE*TW&Rsf=f6v`Q_g;D(G>}Ro4IO#d@KHvc$h9dm zO`Un#^jT(oP@{8f->A_CxnEPGLv0aDThE@qQ@COpW#VFk!tlyo*MHJ)_u;=9_%`%y=-bfxs+b+0cHwV#Wp<{@+1_RV000Sa zNLh0L04^f{04^f|c%?sf00007bV*G`2jc@34h0Q$JG%n_001FLL_t&t*JEJ71OAgN rfuRb&5iGdO`;W^qWHX6#1#SQUY10b&$L6G;00000NkvXXu0mjfgpi9H literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_a_grave_.png b/mods/ITEMS/mcl_signs/textures/_a_grave_.png new file mode 100644 index 0000000000000000000000000000000000000000..8176f51c52e6f3f68a828cf56d6a6e144617d953 GIT binary patch literal 880 zcmV-$1CRWPP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=G}k{lrnMfaS-M@UHsiQ|wA5x#+s?+;1W)a{P& zu<)WGDxs7@z<+|O(0_a%;TsA?@(|TL<&+MTm}BOGjvrUKS~}u-UM208p6%hN`vt=! zXl48N?O$Nm`v8mEem>iS?Lh215ZwZ=B6H^1-+sOW314>F-$UNxN_^PP{&3x4cktKm z(I7@s#1jtOh2+4~=PZI1NS1$=0@;jLNLOJcQt%u{F8bMG{#I_qQftpd;#W}(^$qNH=pnV0vcOW zUHYyX9`fdR06UrKlG(Ara-3I)Q|X>tvN#L;^oU_YCTlwYB*NT^#gKr&kw}yh9mZ@# z(9yxCVC5{4PY@tgZWIRCh$O&qo^xZ2(eh>G%Z#gK9grjjG&n$j6{8}5EIM+isAvqT zn$*-aYe|w~(v*^=c}Eo!i>8*$%q?4S@#yNw&E2z?%vo@SX-?Tf_MCGmn6w~t!RP{y zQcgbQjHjOIwA0UgmWuSLv1(1#s@Ggg<0cKqzollOdCRSI>PV#?yY|$rd(XWL#|8bfBpMimafrXIe7&@46s3gwm!~p=vnG5}6;GjPM0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(uE3)0o16OxBM9gb2PBiy;Aln333&DH^j8 zA&w3{6)R^+e1QO|a;GrCMkE7{^YV>3Mq8JaZ!xYGfKbU|K!XDWSScy;$C4w5s;>J; zRkND97Oh!w%9?YwyzZ!KV#(C9nYk6KE}mRHySaPuTDS->6SS@qUCcm?6M?ub0!V0H%%W3D zyvQwPu`mvWGN_R*IGq+T5KMzuCq39b$^DXB(Dbjk@jsCZ3*G-gE-ZA1+|S&;pw{dD zN0AL^ox&Bz_+1qL*IthSH|$L9hP0RTZ;3;W3bY%u@;002ovPDHLkV1jg{kzoJ; literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_a_ring_.png b/mods/ITEMS/mcl_signs/textures/_a_ring_.png new file mode 100644 index 0000000000000000000000000000000000000000..d3e9b7e9646ccca175498207ca8314a91204ad8d GIT binary patch literal 880 zcmV-$1CRWPP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=G}k{lrnMfaS-M@UHsiQ|wA5x#+s?+;1W)a{P& zu<)WGDxs7@z<+|O(0_a%;TsA?@(|TL<&+MTm}BOGjvrUKS~}u-UM208p6%hN`vt=! zXl48N?O$Nm`v8mEem>iS?Lh215ZwZ=B6H^1-+sOW314>F-$UNxN_^PP{&3x4cktKm z(I7@s#1jtOh2+4~=PZI1NS1ACKz24NG^nq(QpFM@cQ&-l6}nHGi*e>E7XnloY{1ikIM`HB z6PWq77FzS>HD4vi%#Gm5gkXdb?`rtS_$T!iXpEVU- zswOpc&03PAm^7tiY2H!A#Gl`pQR#wYOGpQwdyt3(zr>(@o%YFXx?%wojOvf$F4nf>)vxO1GzS2 z#GxY%8$R+VH)^zx?GrV6A@?~o+SDeoxcux+4Q8{q5Hzn7oy zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?Qqci@bn-KHVxDS zVt&kpw%@Y-HF9|F1WhIwBaHZ|hOdObQy+%rT&YVG{f-mT0`uaP)0oC0x9-pa0-7hL zy5qZRc*&di0(LRe9cIS@YrJj~m(nx0WOEkiX-wfjChNxlLImH6$&i3R%s3<{Q#58H zLL41@DrU}-_yPe^1d!0Ym_?_Q zc#&JoVqt6wWl$qsa5^nwAeaWRPI|C=lKUmMpy^+6<9{L-7P|j~Tv+H1xu3axL9N&Q zMUf3??ZOq)C=&-86oyy!y1q%j-G={a;M>r*p>IR$uVQxm+J(OXuhVv{*Gxb200009 za7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6%92KB{M!;0000YNklb;8BZvS1002ovPDHLkV1imTgiQbd literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_a_tilde.png b/mods/ITEMS/mcl_signs/textures/_a_tilde.png new file mode 100644 index 0000000000000000000000000000000000000000..567632c37777180fe8fc5e2b033d8698b6c5279a GIT binary patch literal 868 zcmV-q1DpJbP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(+bB=p=HDyF9hqI|4TiGKhUI?Y^X&KeuxX$s z5c6X#wEdRtuaU!ZCulOk7-7awHGC!fo%%2|=Sp3o=y#lu7FZXroW?R1xz$1o2xy*| z>W=TO;U#b43)sa>cbFX;tns={TuRT}lFeD5r!j>CnXDfJ2oZcM7DEC8F(a`lQ#58H zLL41@Dpt;t_yPe^r?=%j=G+CYDSso0(g&>f*`OvzxmYuZ4@?3e%E{h2o`@TH&<9bj9on zjao0hB;YUeH;$G_)pp?fdA4jM?Mk%o>uZ1^anPUPB@ znWoM>ZTc*;KB&<-wr|wvgWRvF(V@18rLAXAY7m?KFhT1&(ZvkJI1z~3B7lVE#Vk6d z#EaZw77OE0D1#d5g41ac1Hm+ib<%^~liV-41x^2o8~+ozu+aS< zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=G}lHDK-hWDHzN3bM>#Bne~Rc?^u=Lgeo>P}Z> zSY**q53npG&?oQ<{m1tazM)Vg4^hoiPU%32Ic6>x_;Ho1rz5WRDrxuhEDuNBFBl?0 zFI&HF{Q|k(Cs^F_^I0Bj8)Dyv=w^5onV#o(>-jb$e937)hrH*N_^_S*6@?2fYK@*IkAqmW)= zwB@8Pa=E$TrxnrN^V18HBOZ_CA$DUlAERHpD={HbDeO(XZDoz1cp{XtrX^IvPcgPt zGpb{Y6~r27o~SiYCPuUeva?a4L4Ea=DwY_zv!Q3Mi2Ibe7-z0>AwZ?U20Sf@gG~iB zftYV=q2)I(f0Z1b8$pu^#t1Xs)$ozRo^vh*P76#I%r4L< z<>XV&cJN?XOsYst1tJYMldd;;oZqji4TWS`Xx7M+ z=t#qck37na8tr5IM2%j^eNK%wwMi^4J-btb*zC;&&Fe%bGZ5oQAa0WY5}GHo!zo6d zf zG;TqxfDwyIMs!7Z?SQjca7g0T!GuF4VP_K$0O6bs` zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH@21MgLjFECERfiREA(5wn9?{#-DXkLv1< z=$`p36KSw41l%KVhVjqeGyH{%L{ms=o=eUVS1PG+MZ@EL-8IFu@AsvrrgwXY?Yv-^ z1hw3cc^v-=yFNQuI`-?`9_$2SKY>0*J^^Ko%xD}xKY@gAJDulHPQRL7mUDiy@qVq> z{p#~`GKkR?@q_~pA&I#A8bvSzDN<1j?kvR1lF&|gs<8ez0Qc9Bfq`C8d7|{UbUOu=N$LyYRXV5hqI`UrR)|QA!m}^Eu$EI zini@iP#jBaAl5{v07YL9lcM211L^9wwud&g`X#2AAZN||85Gq*=Xt03*Do*BMn!ESXw1Gq+;Z#gnUNH+L^y3m3r=rX?2(#Y-u*V$h1v z6}>AwYQ6Z9D_wf!%PzmlRU6W$rKT-6Yu-w$ox5~w|DL;r?!ELnXdsnF8anc@;iHT? zk!w?CnmY5e>9frGphjogzEPu3Ex9sX;8??B&yz5}g)6|>{NTKE@68h4H!Z4kr& z000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@34Jsd&*i3%_000q5L_t&t*JEHH f7yKtEFxUYAa+m@CEqeS-00000NkvXXu0mjfH+*`6 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_ae_lig.png b/mods/ITEMS/mcl_signs/textures/_ae_lig.png new file mode 100644 index 0000000000000000000000000000000000000000..a02bd30cf57f09da1585c383d623f38450fc9d6b GIT binary patch literal 866 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 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_cedille.png b/mods/ITEMS/mcl_signs/textures/_cedille.png new file mode 100644 index 0000000000000000000000000000000000000000..0de32ed0c977571b422aa2adfb36795954a78391 GIT binary patch literal 854 zcmV-c1F8IpP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HYa@-&chW~Sl9sx-RiQ`}}Grd8N-xo~wBiUxA zX@3T00n0)HJpykyfBhWc2MUR%kkmYvoFhsqsc^-><5jMnVp{E0bocZu53%hR43VIh z>oK2Oze29}36{3}c$Np-hS;~EH_zLkOwWwL*7I#h_>$9p4rR})>0vwjHyW?kdR(vG zKPN*ly274t;8REG!N7ks1PICgA#SBH0WG?qlP6WKH1PSH^hC)T#O4hxe%bzU;~~W#KES4 znn29Awb1fgmcK?0&z+#j1Y?95A8L3d{7StU8e^s|QS>WLNDHisXHH`oliX~f1q3v9 zOm)R~)$ouv@d4~)rYp>j4c2&ECJv>0Zpq>-(9@X0hD_GC0fY#?6^kJOftYbgP^M_i zMua#z_*AT%CGi0Qq{^Mb02|~z;5bj;m}9hbS@{yGLg gKa9bIE`SpN09E?}0ei~basU7T07*qoM6N<$g82P~LjV8( literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_d_dash.png b/mods/ITEMS/mcl_signs/textures/_d_dash.png new file mode 100644 index 0000000000000000000000000000000000000000..73f5a1246c1951aefe727c9a3aa4622c92ca2390 GIT binary patch literal 876 zcmV-y1C#uTP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(uE3)0o16OxBM9gb2PBiy;Aln333&DH^j8 zA&w3{6)R^+e1QO|a;GrC26+!S&dWFE7;RlvzQwp&074~;0SyiiV5OwUA4`rLs=DqY zRn2PZTC`@#DQnKz^17p{i6v9ZX69C`x_EN+?B?#pYvCfe!nEXKp?E2!RyeINT`{{t zqt=TrxzeRqzU=a=T(u#6T58&Iv*xX|+PO=|@$b1?=-x}Og9cJ*q@g1Z8$QaY6S+2J zrl~Ven?B2|4{CId?He`vAopu(bf_(2Y3tdO8pLKlOwhVcbTI=lP6Xn%2q2+(F^f(q z@gldF#lkog%AiKN;B;EVKrjtro%CS$B=<{hLDRqD#{WbvEOh?|xv>-tan?LPch1K) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(+bB=p=HDyF9hqI|4TiGKhUI?Y^X&KeNx z5c6X#wEdRtuaU!ZCulOk7-7awHGC!fo%%2|=Sp3o=y#lu7FZXroW?R1xz$1o2xy*| z>W=TO;U#b43)sa>cbFX;tns={TuRT}lFeD5r!j>CnXDfJ2oZcM7DEC8F(a`lQ#58H zLL41@Dpt;t_yPe^1d!0Ym_?_Q zc#&JoVqqK#Wl$qsa5^nwAeaWRPI|C=lKUmMpy^+6<9{L-7P|j~Tv+H1xu3axL9N&Q zk0Kk;I)y8yQ6?@nC=9Rcb^Ry(b|3z$fp0_KhQ1B0uZr36fffD+=s9+>2j(&e00009 za7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6%Gh8cJt_S0000dNkl zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwl?s_Y=k&&6i?G1Hl< zO!7HUZLll^+#}--y!72Pd8+e2*o0mCF{ z<+{yd`&ZcYKETqpAJ6t+I}rO0^fvPjC~Ia$XZ!gMBz)Ov--oit)%38P{hN)?$9i0k z-rpyK7+n!hIPegXh^wzz1S^mt6|LaPLcA;qeG$hsiM-Y>rw7wiY_)E$4iV95Z)J2qJ3afLXP?ztr=XMvx_6gFhCz5_ra%&k}q2?)fDLxM6z zV>Tk_=-^Yaa+bsg2#_jw3KMKZGT=C`xiQA*^kwDCjH3l0RI(V*-~|G#loa`6$&o`< z*LkF>SxsGw)+{+?%{g0MXH+$@WNO*W+=^8fPp+Qb+`V`$Tm(m$mRu|pFQwFqNh?BE zjIQvg_25H}bm)-}JNzg|ZAhP%nzr1mc`L1U?$Yu4_uMUX@1@s41F1C9(2<7?A7#{u zT$?h})S0JEpJmn?HQKN36E%8A?sICisV!pZ^s_rPn9bfo&^k_ZF#|D91md;`Afb6N zi%u!=BDa{u!gwi^L5+05>9mM}U>d|a>BjC(?o)0-(_eApKamRy-TxpL7P?LDBexgS zdOg1=aspa!;nFn9#K8uK;g!9vZ_=0B@UH>B1APbj4z&JN%#QzR;WwJacb6$WVO#(J z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z29CMz4+_r?GK02oO`K~xCWV_+Z^ l{D)!`0Teb9N!kYv000Jn1^w!15Q6{!002ovPDHLkV1kN+hnoNZ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_diaresis.png b/mods/ITEMS/mcl_signs/textures/_diaresis.png index d092503a610a8fd305635eb1d86881c25bbfa55f..f8b75d38d077fa8c432a3619f37d9c1f58053c4a 100644 GIT binary patch delta 803 zcmV+;1Kj-72Gj;2iBL{Q4GJ0x0000DNk~Le000050000C2nGNE0IFbjEs-H3e_N8= zAPhzSSw)tBB!t9rFpsM2Aj{9iX8JMHnW{|kIi?!0EDN|t;11*0&l!H;BGD9*n&*;p z#Fa`aT+#7(T~|vno%MC;Zt2+`V%rZGCP6FLZ64dd!mjrhEN%PoY!9{rvF|`{BkzE+ zMrL%jpYK4zm!0-~DEqyd9+tCzf3xxVSdZ(``}<@NqbuSG2OdHaQTrN2Fas%4(F$r7 z;$=zbix}!8@>;u)>ud3Dy?5Hhy6y5TMTmJjl?>fttX~x4F6Ba#8f zd5w*Cj80!xzRWmU074~Wlla;|fR&OWe=Iq2sOmb8R5h!qYtfn|r>r?=%j=A)CYDSs zo0(g&>f*`OvzxmYuZ4@?2-A{_h2o`@S}|xv=!&;1JZe4okRu&>f8@gsKgv-X(x;`S zEjMf4N~@i_bZq~gyM^w(^g3uDl|~vm^048fj5?8PQ)Zev^R(%+%zC3nd)q!yqj%&! zr$(FFB9=}+yHkVN>@5VX<3txT5aUE3Zi@gCnisR^loBs;i&-p;O`!~Gqzg``MGOSf zAl6AYc6V~0atoUNM2Z{#iCkFd{s+0R&~0)bxxJv)>-j~I6VTd)OVcP52OAuQSN6KT zNndWmzXtdY^d0Cs(E3*~JN~PM-;r8(meKmWagzfBAutUkD=_q=1poj55lKWrR0!8& hV88?ZqtU|*006aB0sofsgbDxv002ovPDHLkV1m`Q(3Pth|)jZ{t z4wRT<=7NqNSGig`;(A^s?UtVH;i&rs!z5^B`}gf%VAuNqi`#xa+k@>u>^sog%sZgW znHin!=R1(_WvBf;v_F;{T>ZsG(|k&z+FfVJblh0Sb=0IXa!Fe z;%S+EMJ?#@$J&KAU0=n!^%w znvc=1-IbW2R0?}jZ(CVCI6}@SYgj@xd=!0KHKRJVSV63T=80MZWn!p3e~_Jx3JvP3 ztyHnZ$ej%>bA|5H=3<<=E+}zU8f?JRf;iYzP!pK>wia6R<~3g>$IOl3$%J5p5$|gF z$oMDq7HEu_xZ9H9X|a@c?!*(Br%}D0RpTT75QV)kwXQiCk9nbYU-M`BuO!8O3Bi^ql$?|Q%h#% zmaVvWboJ!s?%7M`EV#lnr)(j6&bbs!S`fNmbb&`HC!cc0Q_pnTf9YpFOGWzBShc2V z)oZS$ag&DQ-%_*CyyaFpb)-^{U3==*z2{yAa&5?nLq{4meB@DX)My{uCu;OU?sICi zsZC;W`PrQs%w}&PXkI5enSmHb0&$xJkkCAt9ZoUwBsZBInQ5$6WzZc7bdz*?mf2;sI{_wQDgy{r*LX|$iT%0hwg>F%-^Ix zZo}UO_zLtD=qu3w5NP1Kz`w=t6Cib#uV;2FcasAHAutR#A*mNv{{R305lKWrR2b7^ hU?2egqtPQ6000d<0sjLPcP{_{002ovPDHLkV1n!$c*y_& diff --git a/mods/ITEMS/mcl_signs/textures/_e_acute.png b/mods/ITEMS/mcl_signs/textures/_e_acute.png new file mode 100644 index 0000000000000000000000000000000000000000..911207f866bf9e089cdd352f8ac3f0f545fe1d0c GIT binary patch literal 870 zcmV-s1DX7ZP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwm0s_Y=k&jmC6nCVPa zCixswZLll^+#_&@^ViQ2e&8a}6q1_fl5@nBN-A8@@OWKUO);(eb?L6@*&brsFBm34 zE!Sf{w||9Q?;R{{`|)fKwga*6KyM@OfHFsBG`64bK*E=u_H!t^Uri6o*}u_vz1HJ; z_5L{-#OR86!hugAiMab5MKA*?Qc(-;EX32I%Tg}OYwbd=uf@By-f0)>w#%~=A?EFn z-)Xe%q_4GG3O&wT1eRDu=zOx23EW93f|t)h(kKeu}oO zQcxUAY#`P_^FV2V3Nh3kl&DjsLFcL)HB2$_$%dM_LFH+4F)rK|lr#$sHel#M93&d3 z3Cw((3$1a>8n2OKkV2#HW;!wKhmMqQ!KaDAD$Ygy7fJ7KuF&PpNh#84ZnW8Zp z5p;C$shBxS;sXRol{r?=%kzw?CYDSso0(g&>f*`OvzxmYuZ4@?2-A{_h2o`@S}|xv=!)JI z9BBx)y`cywtvsvLib*JJ?TU$o$1swpLY6L&N`55 zLq-}p^048fjC!L+d)q!yqj%&!r$(FFB$k$+-KoKB_7;NXaiWtMh;bqiw@CmA&68Pl zN{J`A$t)Jerceeo(g~;2BnE=%B-TMUc6V~0atoUNiW~olT$t$o2e~lOZE_#Ey`a|X z`l84JGk07*qoM6N<$f}o#?fdBvi literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_e_acute_.png b/mods/ITEMS/mcl_signs/textures/_e_acute_.png new file mode 100644 index 0000000000000000000000000000000000000000..b6019374024b953e0b19fe8913bd52b851bb207f GIT binary patch literal 871 zcmV-t1DO1YP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?QqcpT)z(9qxTWJSdU!ZLlI&=3i%^O zM^5@7mxmjEn-M)dzr7HNDZZAM*v;8}&T+46Ba#8fdHKc|qpi!zw-`qYK&WIfput7~tdtb_W66<2Ro8i> zs##54i`FbTWz9KTUT0J_v1Dr5%-o7q7f-I9-Q2x+EnEagn3h~D6fdRJ3a1sOD@Ipn z)OztHSGx4dmtB69t2U%hOHEsD*1VNgJ9p{W{yldK-FxYE&_F7UG<4))!$%o)BG;zO zGq52|9&z003Cx2>#&g(UbrH002ovPDHLkV1oYngdzX{ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_e_circumflex.png b/mods/ITEMS/mcl_signs/textures/_e_circumflex.png new file mode 100644 index 0000000000000000000000000000000000000000..2b5ace3c42076e0e01204f226569fe002344daf6 GIT binary patch literal 874 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 ARR910 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_i_acute.png b/mods/ITEMS/mcl_signs/textures/_i_acute.png new file mode 100644 index 0000000000000000000000000000000000000000..20bdafb62980f1139aff953d1720a53bc505d1b2 GIT binary patch literal 863 zcmV-l1EBngP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?Qqc6Ba#8fdHKc|qpi!zw-`qYK&WIfpuq+Ltdtb_W66<2Ro8i> zs##54i`FbTWz9KTUT0J_v1Dr5%-o7q7f-I9-Q2x+EnEagn3h~D6fdRJ3a1sOD@Ipn z)OztHSGx4dmtB69t2U%hOHEsD*1VNgJ9p{W{yldK-FxYE&_F7UG<4))!$%o)BG;zO zG~^IPg&&px000Sa zNLh0L04^f{04^f|c%?sf00007bV*G`2jc@34hk9Qd2_J<0019JL_t&t*JEHH0{kZ^ pfK%Ilyyh`slf^2?NVKiQ0|2j^1^{@C761SM002ovPDHLkV1hC~fsX(H literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_i_acute_.png b/mods/ITEMS/mcl_signs/textures/_i_acute_.png new file mode 100644 index 0000000000000000000000000000000000000000..4cdc943d9c206194d9fe4cf81df8560f1010f7ac GIT binary patch literal 866 zcmV-o1D*VdP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(47#1vo4OYG+CKIgc1S5ro$ayXm%v6Vf7;)PJko|aJ!k78`Q z7F5R;8;Et#yii-9LX0?0O4O;+q_O)(4NFWs*w8aK#C^$Jj0?97C9O)64S0GG2b%_J z0x>_DBnbFS1SihjolX@Pa|%4sZPky|aafPm(S zsqXmh8eZ}yzJOiKbcflo!5XjI#HIAiE!ms}dKyzWkjeTnfDpmAVlgBj5Hk{+GDTxH zBE-?br()$Si7yZ!Rqhlf*ob7nabCVL$7t)a@-4>I0uVSHVnBlf1Xw94^2d@RhpMjo zNL90%x)!Zja>|->w!H4BYGTRMvYELRt1g~gJ-fMk@mjbDt}rdRSSVgfsTEEuOjpdV z(5Us|ORjY3l`p&eDpzetpO%`o+^l&kt#!5*D8foar!-kJC>O`(h znQ7|G)27cd>w_AdWBW#pKFIx=8XanjSlW8_qz19s4->Sm6J5+ej1z&lEdoerUd*CX zO1#J|X0b31g)*p-E;yYQF%V3HSSLN$J<0u&ThR2cxbZ)c3k%)p;s__Pau1Cxe!sdaI}F8}}l z32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0~HPmIHV9`?*IS*AW1|)R0!8&U_b@` s83+lW07gP8;F3((WQi9fXb~9z0Bynr1jfGZ`~Uy|07*qoM6N<$f^p1`EC2ui literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_i_circumflex.png b/mods/ITEMS/mcl_signs/textures/_i_circumflex.png new file mode 100644 index 0000000000000000000000000000000000000000..f0e7127251938af0f79d84c80a7077ca2bffdb64 GIT binary patch literal 867 zcmV-p1DyPcP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(47#1vo4OYG+CKIgc1S5ro$ayXm%v6Vf7;)PJko|aJ!k78`Q z7F5R;8;Et#yii-9LX0?0O4O;+q_O)(4NFWs*w8aK#C^$Jj0?97C9O)64S0GG2b%_J z0x>_DBnbFS1SihjolX@Pa|%4sZPky|aafPm(S zsqXmh8eZ}yzJOiKbcflo!5XjI#HIAiE!ms}dKyzWkjeTnfDpmAVlgBj5Hk{+GDTxH zBE-?br()$Si7yZ!Rqhlf*dXr#$9eh29HXtv%C{I-3qYu3F`&T#0<4r2`D4kELsi#( zq^em>U5nN%Ic3c`TV8imHL+xB+05LERTodLp55HNcr9E6SD2PuEEF%L)C#8+rYmMw zXw-V~C0Dxi%9mY!m8&+SPfJZ(Zq~e&Ry%j;IQ~6%3*CF^bbjSjU%ENwk|QiIs+hY4EOi7sX!#)&}O76BwQFJ{px zC0^tfvsf61LK)OZ7o1Lu7zn08tdkz>p5%VXEok~z-1wi!g@x|_AQu+8L+)p8Ur_6H z|D(tTv`*oQX_SeJ4GP06dtLuYzukxbYT(<@x1n!C>#JgReA`+KmY&$ z32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0~HPmCC3&IHUIzsAxT6*R0!8&U?2eg t;}ZDKK#bP^c+F(OCW}>&ktiEU0|0p72LC5lTKxb3002ovPDHLkV1fYaix2<+ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_i_circumflex_.png b/mods/ITEMS/mcl_signs/textures/_i_circumflex_.png new file mode 100644 index 0000000000000000000000000000000000000000..dc46f3ff55b170ee73561da372b24f19169a3681 GIT binary patch literal 867 zcmV-p1DyPcP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGt|TW6hTmC5mVj-H&2lI%Qg)E#=Z9kYHYX!x zlE;J91?4t2_%n2e@zMSLqT(zw?B$z`A(VG?uZ*ttYI2fab}m z?)+{EFLe`Nz%FLG)9lz_jo0nsQhL^wY|a8ZjVT<+Wc@fmiV$0|7}Rp2m{Hi2DH^j8 zA&(9|6)R^+e1QO|a;GrCMkE7{^NNi*M%$K^Z#AwKfKbU|K!XDWSScy$$C9Ils;>J; zRkND97Oh!w%9?YwyzZ!KV#(C9nYk6KE}mRHySaPuTDSyAS`>!MCGtN8gUtzlz!M*Dm}GQNMPgM?juG00009 za7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6%Gpol4LF^0000YNklTHD~l}2giV%sL4p>M0RT(#1_S83?_2-?002ovPDHLkV1gk)lLP<& literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_i_grave.png b/mods/ITEMS/mcl_signs/textures/_i_grave.png new file mode 100644 index 0000000000000000000000000000000000000000..7254cd7d229dc5acd482cbcc77766ec362a99bc0 GIT binary patch literal 863 zcmV-l1EBngP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(9frGphoA|zEPtOa=)fVhuR{Rww^tyL2UNJ1g+~t7c&s!L?CX901}!Pv*?r( zFLH}nEQ~{;3~HncPNzi-1k)haNe^~Ua=+vjH2o`X{7>Y1^}z&hams}002ovPDHLkV1ldQj;#Oy literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_i_grave_.png b/mods/ITEMS/mcl_signs/textures/_i_grave_.png new file mode 100644 index 0000000000000000000000000000000000000000..1e22126791698a919a29b070ea8dc01555a03930 GIT binary patch literal 870 zcmV-s1DX7ZP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvg9TVhTmC5mVhLL#Bwl~s_Y=k&ktt$HYZb+ zNgfZB0jq@s`ULGT{`zx18|T;daa(<3uBMDg<#0CjV=H?E#S5X7JuRae9>v&p zEvSwyHW2Hed7-vIg&1+1l&DjsNn`ho8kU%Nu%Tyei2IVc7#D6EN?MgB8}RfX4mJ(c z1Y&-yg|^?a{WWrU?gULH7$eO1sfMqFzf&KE=3J>u6#b49(gN$^mD5sWs1gZ zM2Mq%ds@y3|uo20CoU-PeEw4MOnpiTmY-Vo7s*5LA&u;EsycRBkD@;o+7K)crYK7AZ(-pHT zG-|#0k}F+$<;yO=%2gZEr=_MXH*4NXtDU=a9RHrXh3>udI%pu3MjATuu;HVOI+1Hr zW|}(lwCS_V`k+SV*uGJt4|2bzMu*xWmbRWfsX=V^!vwACL>Ds<<3u2CivSXu7qjS; z5-)O#SuBi0p$uxI3r?p+3xw1_lNO21Y_E;F3((WQi9fXb~9z0Cl_#%*8l(j literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_macron.png b/mods/ITEMS/mcl_signs/textures/_macron.png new file mode 100644 index 0000000000000000000000000000000000000000..ffb9dfd77c16545a593c7054314a9164f4b54932 GIT binary patch literal 855 zcmV-d1E~CoP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGavUKHMgLhvmVhLL#ByjJRoOw7pG!BMhdpss zoO~K;fL03$bOb$N{Q5b=4-^tjA*p#TIY*RKQsIh$$E#dD#dNk;(cROtJjAwNFhqi0 zuE#vKeuZ4`6D)1{@hlIv4Y6-SZ=Sb7S)Lh#t>@d2@Fl1H9Lkv6q$ z|C|iL=n8wnfrpSpw7$FuRv<+xdO^!Vyd()@5ks5AU&k)w`Z{>G(Yx5iy5;g5iV*Ww z$nRpb<)p7;cSh)OMRfQ4^g<-2_*foeH@nX{uHDs?5vd&Zrrx%4j-ZHeCOM~NRKrg( zwzC#g#}*rib5`Z#n%na(M0pO(qy4%=l2lE8$n_&Cr}Hb%~;1aY9;PUA%G{%UI-A3oRg^ zxnrtle9syl@+LljUCi_hvtxrb9+!zj>7HA1au(=mOkqPN>)QZA1mB9qkbpqUxFjf3 zG-e}0936ZrR?d?600C0vPGN$LNCq6|bj3qHLIy>(V8WvtT|`P>yD}>mP{?1nOm{y;>p#so4XgUg^S<{(~^sY;-!>Y;k3eZ z#q0`=S`R+tNQWNzu)~jX)Q0qFscFm2nzzzw=Pn(`zvphDdoR5X8c3y)hK@XJ_$Z@J zvJs!f(J+cbjLYVTk|$ z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z29B{9vGU4H-o02E0?K~xCWV_?7n h7#SEC{xb}F0086w0Rj7pLD>KR002ovPDHLkV1gKzhMWKZ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_n_tilde.png b/mods/ITEMS/mcl_signs/textures/_n_tilde.png new file mode 100644 index 0000000000000000000000000000000000000000..47166911691819df67bcb65375f3992fddf7c767 GIT binary patch literal 873 zcmV-v1D5=WP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=H0k{l@vhWDJpM?exn;y5Iah`GTW-#-*xFSi|G zdls{3hyqe6B+w_w3gh2@X849ei994V&n4%Gl1eIEG4OaRx1M6!?XBd~)2lqhc3v<< zf?kgPIQkWGeN3=)NRf(O(6SIOiDFEstM$)g7e3@(@ci<^B&PUWo?Rt774RK#G7vsWhLrJUBWCNZa#KES4 znn29=wb1rkw!cOW&z+#j1Y?95Kh*G<@K5U9(3~rEiK5@)W=TO;VEz86WGN}cbFX;tns>;xRf5bC7ZKAPh$!PGFd+c5F+?iEC#upC}t!!Ws1gZ zM2Mq%ds@y3|uo20CoU-PeEw4MOnpiTmY-Vo7s*5LA&u;EsycRBkD@;o+7K)crYK7AZ(-pHT zG-|#0k}F+$<;yO=%2gZEr=_MXH*4NXtDU=a9RHrXh3>udI%pu3MjATuu;HVOI+1Hr zW|}(lwCS_VdZ$L`*uGGsH*&wGMu*xWmbRWfs6lM@VS?6mqKg@baUu}6MF0uSi&=C^ zi5I!WEEdM0PzE*91*g*@27+l2>!dro2f1Hz3z~k58~==4Sm^!>a$%u6>-r}BaUcHHz?Y#fLtlpe4~8bL3;ekZ-vPc3mBe8$Q+5CV z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z2A3lkBytL^{*047O9K~xyiV_+Zx z{70j43le3-e_WDqHWMyma7r+u8N*1l%ZLX62zCnmU5GUK00000NkvXXu0mjfj*f}W literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_n_tilde_.png b/mods/ITEMS/mcl_signs/textures/_n_tilde_.png new file mode 100644 index 0000000000000000000000000000000000000000..0dba0d471242402e9d2a0d48dc712cec02fe1703 GIT binary patch literal 879 zcmV-#1CacQP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=H0k{l@vhWDJpM?exn;y5Iah`GTW-#-*xFSi|G zdls{36qQg)A%Q+YRT%&NGs8DDO5`D_c`i9ev{X{zih;*lyY&>)e%@L>J-zBfZ07|- zCFteYk7Hk<*T)1)M}NKQgB?fg#}VBf?6>2eVfbZ5^oacO!X&2n+@5kbXZJbBZFerOBb1^R5Hk7o4CL8edAPy1@ z)C6k2uZ4Epvg0*!MD7GjCO9L^_(8&F%0H32qd8aU5=Fn|$v0qLHH~E~a_b2zAfS12 zsyn}1!c*PEC$Ni|?le0#SmSkbaVb4&OEzbLoyHUnWU_u7AVr9+SPW`8QOqc8$`p;+ zh>%AIpNf^UB)&j^RJl`_U?Y+N$9cuZ9HVW^$~QHx7JyL6VnBlf1Xw94>c^6!hN_CD zpsHC-U5nN%Ic3c`TV8imHL+xB+05LERTodLp55HNcr9E6SD2PuEEF%L)QX@Lt}A9& zSk!v)C0Dxi%9mY!m8&+CPfJZ(Zq~e&Ry%j;IQ~6%3*CF^bv3;RNZ{&VWjSjU%ENwe`P=ng+!v(GDL>Ds<<3u2CivS9m7qjS; z5-)O#SuBi0p$uxI3r?p+3}g0K@Q0|4->3j+8CVc-A&002ovPDHLk FV1jOXf>Hng literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_not.png b/mods/ITEMS/mcl_signs/textures/_not.png new file mode 100644 index 0000000000000000000000000000000000000000..a98f885e99bdf749d09ce02130ff521ac54249f5 GIT binary patch literal 1301 zcmV+w1?u{VP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-_bk|n1O{AU$j0zwFhd})6-{rh~s&X zU}E%qZ_9e-H`wL<1`VtefT zITaz6XF~asqsLD2eeO<%J|d#`$e$i~dlCI(?tGg2x~prsAX6ngi+Wqi8DS#Qnfbg{ z&=miIv7T1Z3`-nfY=X^>HUd>j$hK3aNsXM==?4u!%xNV>pVC0yx6N2nO@l85Xyi#j z&kStfW`H$@IlZvZiCa&+fh{oOB+N_%XM{I?XyH5Kue6sV_bpwbXg5!g1#qRUX~5Xb z?JH)15b`Ida`Jmx_@JBkfmjBEa?)&AV2k~_=tA$>;=?mzp2QsD-5R9xaex#dwg3z< z7>I>fs8H0Dln8k=@Y8@iaZVi!kVu*o9NaJ$kYj1b#yd)9ZjyA(C@mmDxL}jm-asHL zXMuh+8#L5}B?l2HqGD2|6)w3*DMib!QB7I1iWXHht=fz&n^-Y5vudrT$|zw{OVv=V z*4i3^Hn?thyJ1FaJ$3H6OD|o!_1fEjd`2EJ%Ftn>jyBWeiS0kj)G%$<*%mEGY2_uW zEM2zhY7VVAdv@{S>gLtki#2+-?I+gg3v++Y8a=FS#`2k`@2tVB`sRXmIg!m77)zPJ zxNZg@=(IVDMmeX=+~zFSgiRp{tdVSTCT+&RU|y8O>BZeUbAQTPko=c;OFv^SZ0i0A z=EA1#VeUuXzF}>)bE5DeXz#+E)5wm(h6&4BvbN8pU+%--b?|?7``}$=P3c3F9N_p2OAEMsW4&Z91vmX4UUfpUZze-4abBp?yF966P)-?!y(F9da{{m zWhf_SrMmBI;LKv2{i>yi;1j?gj{&XlhBzQ9K4@C3(D5FruX0j=LZ%Bd+>=DdpZ5?Y z*E1bevU!6Pfvn(>6~!qB4>RU|;iCjFJW@N$tPpoOX~~pkz$+h%TcJjXKdA$#(v6r9+Tup|Jinx|q#)d+vISLUZ3*VSNgxhdKC7_BUFoQhrNoKA@ zC>uUn$Q8vZTgqjhEOTd3Fah#PYr5?$=bLosQu?8u`c_oiit-xw0=0xU9W=Vkq}=A! z)tnn_@4C`ec^rJv%i+#PIm~qAps$cmG?RI?w`^x_)YSD7t)IZ14-EGQ+!pE^xbOkp z1$UucU^~PG7GKaVunX%Db76&pYr}eh0uHe+ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_o_acute.png b/mods/ITEMS/mcl_signs/textures/_o_acute.png new file mode 100644 index 0000000000000000000000000000000000000000..cda99b3a6fb7d4c4ac188515c9f9bea1f44fba39 GIT binary patch literal 870 zcmV-s1DX7ZP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwm0s_Y=k&jmC6nCVPa zCixswZLll^+#_&@^ViQ2e&8a}6q1_fl5@nBN-A8@@OWKUO);(eb?L6@*&brsFBm34 zE!Sf{w||9Q?;R{{`|)fKwga*6KyM@OfHFsBG`64bK*E=u_H!t^Uri6o*}u_vz1HJ; z_5L{-#OR86!hugAiMab5MKA*?Qc(-;EX32IXcJ16B>Gyrkn3ylZmoCP#k%eCEJcWU zJLGp7Z9C~}?Uq81Got&*PcKAbijUW$cBA_k=e4?;GL*_;FY0Y6s|82MnPhd#D2AV+ zZL1U%#}XTebP8JyOnkDTW^T}Z+FXnaw*@85LW2!>dJqSj z25JH`-{wMV+_J`N4dbvym;m`rZLIQJG_8^ z#@1AqzN>_XyonEBCo^3#I~G{uafLXP?ztt4v%pVd3L7$6-vJ;I##T%Qxtu6wBsOJ= z#%x5;(ZQ!;<}8U15Fl0V6b9IcWWaHrW22AJ@@3`AjH6|44as6agAD{&DJk;Dk|T$z z&htoBvzodVtyyx)nsc^1&!}o*$<(r$xfQD}o?Jb%oT{>Cht|cKA__+K@giHEp?B^Hy5z+@)jt_uMUX@1@t1PNdSAPCfH!r=R7l z1GzS2q@g1Z8$QaYH)^!E?GrV6NA7cKw5d&EY5Ccm8q8*IA!r^aI+=kOCjxPs1dz}? znMJ3Rc#@mUVqt6wWl$rXa5_z5Aec^K9du)NC-*70py{u;@t??riSB=p3lrTY_mSHR zYQ3&6iY!2L7fwy13><85IK8sh`AzzA9sV`IccAY;-+|`8iqY|3E&K*zId_qHnS7c6 z000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@34ht>N*0x0e001IML_t&t*JEHH w0{kZ^fK%IlT-yFKFfcGMVbjJ$l9?0$0DXrC{c&W3p8x;=07*qoM6N<$f<^a=-T(jq literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_o_acute_.png b/mods/ITEMS/mcl_signs/textures/_o_acute_.png new file mode 100644 index 0000000000000000000000000000000000000000..e25a3a7f4bc6539faa439be3823ee92cd263c5f7 GIT binary patch literal 867 zcmV-p1DyPcP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HYa@-&chW~Sl9sx-RiQ`}}Grd8N-xo~wBiUxA zX@3T00n0)HJpykyfBhWc2MUR%kkmYvoFhsqsc^-><5jMnVp{E0bocZu53%hR43VIh z>oK2Oze29}36{3}c$Np-hS;~EH_zLkOwWwL*7I#h_>$9p4rR})>0vwjHyW?kdR(vG zKPN*ly274t;8REI(8w~*TK7u-o-A~Etls|gqXKN zeix%HCw(2e6`{u!(cSaY3z3-OV|k3-=sw1I?XISbNae6M^|qBYf+E71WKGMchM!_= zs}@wp78{6l&^%CEphApj4@%Uj(x7wojT)Ai_+&%R+z|IEb1^R57L+tA4L0EEK^!z1 zs0qY;TMI3}W%+C5@Z1TSOfWY2eW>A;@GJFZXpEVJLl zMua#z_*AT%CGi0Qq{^Mb02`4EIL^~I<`^wqR=&izS^z>NivbM|5MZUG$RA6N9I86+ zBUR06>RPmB$ti2j+48)js);32%Vy?Qth#t|_3Y;E#cSarxWcsLVxf2`rB*ntFkLab zLZjA$4>{7IM?UQEqa3v%eOhYTaIr8Av+=F?6;%UK6< zZOBMNM;WgXdl}rYV?lW=hSFZo5a%6vpY42&E8DVyiRm712Ikn;x-8&p?NZk zPATyuH<`u4I26jDMmphin#4dboy0om#_mq;Q*J@iUvc9C1iiR|DUMz72gFn*S}i{zqpsVbeyuAWn-Y008_i2meIeBR~KE002ovPDHLkV1gTSh*JOn literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_o_circumflex.png b/mods/ITEMS/mcl_signs/textures/_o_circumflex.png new file mode 100644 index 0000000000000000000000000000000000000000..2f7a188df1de50e465b41cfd43a7c42d6d78a1ea GIT binary patch literal 872 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 Ef+En3djJ3c literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_o_grave.png b/mods/ITEMS/mcl_signs/textures/_o_grave.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b31a9a6e170f83435023537ef12bd73a388893 GIT binary patch literal 870 zcmV-s1DX7ZP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwm0s_Y=k&jmC6nCVPa zCixswZLll^+#_&@^ViQ2e&8a}6q1_fl5@nBN-A8@@OWKUO);(eb?L6@*&brsFBm34 zE!Sf{w||9Q?;R{{`|)fKwga*6KyM@OfHFsBG`64bK*E=u_H!t^Uri6o*}u_vz1HJ; z_5L{-#OR86!hugAiMab5MKA*?Qc(-;EX32IXcJ16B;~bsA=lU9-CFOoi*?)OS&9(z zcF6BE+IG^{+AW11XGHgrpI(T>6d$ig?MC-8&TDlwWhj-yUew!CRtt`hGs)_fQ4Bvt z+g2$kjwLn_>!5j{v_ORzY7a`(snVcx)r}ganD}Hv&D@~-w7D1;ZVO79g$5h&^dJs4 z4b%i?zRiW!xMhvk$T4y!crqavp~r_3UKzhqZh^*_sY?|7(g|sSdGX9?OkQ;|g&o-E&J8XMvx_6gFhCz5_rajIEdqaye1VNNma! zjoFBxqk~Vy%vlm2AV8|zDGaa?$$;ZL$3`Ec<;%*K8Al61sAMsq!3F}Xloa`6$&o`< z=Xs>6SxsGw)+{+?%{g11XH+$@WNO*W+=^8fPp+Qb+`V`$Tm(m$mRu|pFQwFqK`TO6 z^sexz_25H}bm)-}JNzg|ZAhP%nzr1mc`L1U?$WXSd+rvx_tNW0CsOH5r=Iz=)6a6& zfm|Ch($JBI4IgFH8#UV7_K6z3BlkHq+SDeowEXN&4Q8{q5Hybyoy001IML_t&t*JEJ7 w1OAgNfuZU@E^YrA7#J9suxVo=$xI3W0EK@C{a zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH@21MgLjFECERfiREA(5wn9?{#-DXkLv1< z=$`p36KSw41l%KVhVjqeGyH{%L{ms=o=eUVS1PG+MZ@EL-8IFu@AsvrrgwXY?Yv-^ z1hw3cc^v-=yFNQuI`-?`9_$2SKY>0*J^^Ko%xD}xKY@gAJDulHPQRL7mUDiy@qVq> z{p#~`GKkR?@q_~pA&I#A8bvSzDN<1j?kvR1qG%JImgOhfg0Y`R#>BO!4)4)oym5bKI+|DMP6o&Z0h+vRiP3oJn@KjAHmH z+O|tUaV)WcSO?7ur3EU)PvamyaBkz?de@MJ=;#qWm_zB2wvc?6nsr7ltQTPLIi=EW@jb_1z`Bx`UwDuFt%bcBp?to5}Ptb zV>Tk_=-^W^bC$#x2#_jw3KMKZGT=C`vC+q9`?B(F#?b;0Dp?F@uz>(8B}M*Na^z6e zbsni|R#VraHA_xebIz968C6XznOZh8w_?@BldESpcQ0NG7r_yxB^L|DODVNt(2CF% zy(>Iwz4($VU3%rqF2BlE8`7txrY$#X-b$;TyL4>-p1Xzaz4SV0AeBZMI`XjLql`L{ zYg1;LI`g#Yv&{OSMrYf;QKL`feoc)IwM8s#KYLPx+3X_(t>Z)&GZ5oMAa08Q5}FsY z=#&yKa*J6kj7^~oYNQKJr$r0|(;(JK4|Y#-zvLD){T4U=8M&~~{U7AQLU+jh$n6Vi zz3wlHY(Q%lE={9M9BgnHUfJvVCjD_8{%e5mK;MDB1Fe4*v*W*7_!lYNcZ;tqkl+9S z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z2A3>3hUsEPmp047O9K~xCWV_<-Q z{|q<)P6-TE|8Z&i&%nUIz=Ta3@q#!lq5uE@1U3i%C%vKU00000NkvXXu0mjfNWh7+ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_o_sup.png b/mods/ITEMS/mcl_signs/textures/_o_sup.png new file mode 100644 index 0000000000000000000000000000000000000000..eeff0a2959aace16dc63543f2b8dbd3bb98080d8 GIT binary patch literal 865 zcmV-n1D^beP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwm0s_Y=k&jmC6nCVPa zCixswZLll^+#_&@^ViQ2e&8a}6q1_fl5@nBN-A8@@OWKUO);(eb?L6@*&brsFBm34 zE!Sf{w||9Q?;R{{`|)fKwga*6KyM@OfHFsBG`64bK*E=u_H!t^Uri6o*}u_vz1HJ; z_5L{-#OR86!hugAiMab5MKA*?Qc(-;EX322(AH&%l3!~Va(yk{t@Td3ShroCr3f)^ zhx|^XZ6|%L-BRdrMsy$f>4iv4@$q`pZgd~xyjE9JhEh4~MZGO$wcrRjldNtT#qd+K zZIy!JSYiXQ4w?r_3si`q_Mk+aDh)bU-Kb%TiBC4v%niCvn~QPbCKmz}8f?JRgE-hU zP!pK>HWymsmNi}@$H<-F$%J5p9v@10W&BFH1sY?fE>ZMLC!_`D#WSZdjY)3a;ROUV zwx+uDT_rr^O?&`5ndy?*vA`OSE5xC6&n;P;1%4V+*pSKk4giTTwqi0QAP_SS3Ca|W z*@&Q{gHOfGSrQ*0K&sp+46qT&fa5&JMjxZ)%gUD-M+-oxWHF$@1_G><6!~MxkwaDI zd8DdYOmp82%X&vMp* zTpKdd(2<7?A7#`VHQL+ui5k5l_c=A%)F!dC{OnE*X0x{tG>;RV%s`A2fw)ZqNNAqS zqEkvd$xUXlFgArUsF6-MohC65Oee7py0N>H`;=SI^jF;YPvpWx_dm#miEfko$n6ES zUe^~z7NEHcr>0Q`4mLQPUfJvXCVjaM{~F*s(08EkK=WV4==iS|egkzIcasiN^s@i} z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z29H3mQF>LCCC03Jz1K~xCWV_<-Q r|4 zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmS9N;iREA(RoOw7p9^OCG1Hl< zO!7HUZLlm0xJTd){nyVCexQ(O3{lNfPU%32Ic6^C_;Ho1r6aEERdl!XY!64>4;Usv zE7xu6+rPlB_ZKW~`}u4Swga*6KyM@OfHFsBbhe-GK*E=u_I=3vy%Hamvwx%VdaUR5 z=>2^(h|v`BgadaWIdJtkieLtkrJxmDS%{}a(I?z3`)ln&DzC-6_1%1DZ-Jq zLwcvtwv)crZYlIQBf5|L^Z-kU$76ZaZZsdGU#lxIL8%n>qTZIWdT@lC@lqq98h(nt zt(s9CORON)K=VYcfif}F9u%ojp+SAMl`5tfxwD~VuF!qjT#Pf<1trc(gAI6E5C@G4 zY63Ig=0a=SyvD2K7`YKVnGkI9`%uFx<5%h}&=@myi4MPXLRw&6JaZb;nB?XaUO+%& zYpP4%Rl`Hx91mb8GhH$}7Fdq+3UMmkb4wOyfu9~RY{+D72Y^HvTQM0D5I7PNn-U$y zY(&t}!KYy6ERjzTAXRP@2H1!sz;T{q;~k^r%gUD-M+-oxBr%}D1_G=Y75QV)kwZo2 zd8DdIOIhTS#3qlvX zUEop5$)}w0)H9uS`kBvCkv=t6t*Kh|nrms?q+$EF)GRb_xs^^GsnlcFp1O7KxtD=l z8#3b1k%kQ)d6XM9+S~St8oeX;IW^kUCb78u>`o14v$qg5j}x8DK#U`SxJ?2`Xr9at zrxu+Y4%~ ztS^czKyw#PO%EA3*x=B;u$TEw`f?loHNbbE??B&y=D&*3@Lw(b1~Wc)jIx6Xod5s; z32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0~HPo14BVAO#lD@AxT6*R0!8&V88?Z tqtTcG41~1*$7UX!&4f)G6G>)L001cX3Hx%m3BdpW002ovPDHLkV1gVegb@G$ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_o_tilde_.png b/mods/ITEMS/mcl_signs/textures/_o_tilde_.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0616918e4bab3fd1410b3027f8e26eec5485bb GIT binary patch literal 869 zcmV-r1DgDaP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+MgLhvmVhLL#Bwm0s_Y=k&jmC6nCVPa zCixswZLll^+#_&@^ViQ2e&8a}6q1_fl5@nBN-A8@@OWKUO);(eb?L6@*&brsFBm34 zE!Sf{w||9Q?;R{{`|)fKwga*6KyM@OfHFsBG`64bK*E=u_H!t^Uri6o*}u_vz1HJ; z_5L{-#OR86!hugAiMab5MKA*?Qc(-;EX32IXcL|)tmU6d$ig?MC-8&TDlwWhj-yUew!CRtt`hGs)_fQ4Bvt z+g2$kjwLn_>!5j{v_ORzY7a`(snVcx)r}ganD}Hv&D@~-w7D1;ZVO79g$5h&^dJrz z4b%i?zRiW!xMhvk$T4y!crqc_Jml2bV6ESUOaOe)0pJu9bP~{ zV{58Q-&Mjx-oyv6lbJ4=9Sf}SxI!FC_uP`jS>UHJg$@0s=83u_;qD zW+Q@*4n7q#XGwg30I71PFu+D61CH|?8-0wHFDqYW94!E$lEr`q8wjvcQsj>%M-Ek; z=aH&rHFYgov*eUD=WKbNQPsqfsbw>BD^^`Rxq5bU_u{p15gcJ!a+Lq{Gqe3Vgd)M#(pCu;PL+~?G2Q=7!n^0PZNn9bfo&^%6bG6OMA1mZRcAfb6O zi%u!=BsZDG!q^nbphi03behCKFrCCY=*I3&?o)0-(_eApKamR)-TxpLCb~`TBexgS zdR<=>S%Bs)oSH@%IN0EDdS$QkoAl*6{A+;kK;MDB1I>RGqvH=&_zj2Aca>N_F`WPa z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z2A3@3j=$(#TH03u05K~xCWV_<-Q v|7bL(0ABDPUFCmtHWM~�%oIhynlr(RK;_bfnG$00000NkvXXu0mjf#eIhi literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_pilcrow.png b/mods/ITEMS/mcl_signs/textures/_pilcrow.png new file mode 100644 index 0000000000000000000000000000000000000000..9764ff8b5709e537df6e112e345b9a94be0f911b GIT binary patch literal 872 zcmV-u1DE`XP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGavUKHMgLhvmVhLL#ByjJRoOw7pG!BMmmOEd z$)};Fp*2FlJ%X7qe*K)`2MUR%kkmYvoFhsqsc=Qd<5jMfVmhB!(cRLsJ;b)ZV3-80 zT(5a-{|dX_2UyznAPdM-pl8C3TSp+MPA{DLR$wIs=3H@|hNaSPfLarZ+ck8`q7wfjmvlJob?T}wI z+IG?xyWFPXrxnqC=BF>Pg%lslgLZRvpL1Nht0_aN9QLN(wsQ91ctFZajf`seDEfBR zg6h~}1F;U82Wksch@tkRM4c*48fV+6VTp+c8(QWD-IvY9xNwsT0V+*4;ORjeY#OKu z%zRr5o%5D+zDACjJHe9)!3ZPX)$oz=EA5YXJ3 z>Z$Kp!$aQ02e6Boo-#W&SmSYpIF#oU-PeEw4MOnpiTmY-Vo7s*5LA&u;EsycRBkD@;o+7K)crYQ>}#p({pL zc+`6EAxAp&$cG(%l%qDJPfJZ(Zq~e&Ry%j;IQ~6%3*CF^bDs<<3u2CivSXu7qjS; z5-)O#SuBi0p$uxI3r?p+3l7|cqfA_Ea2Q_M>-tUlavT0Nz;~eUK;MDZzlz!M*Dm}9fYNrSLz6eX00009 za7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6%8v5e0mIa0000dNklHo-rOlSg(FhLB!gk%JYAOpGtPVK}AVg&$TpaKy}Wdpwe0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=NYavQM`g#Y6dIl|&Oz;W=b$_;Y-d;=^cQ6_CG zmHZ1?=B_{xz;yTY%-YO<{d1Xr@bWGv6Qbl)Qo4AB5{j$b#oD_Icb~ z{rkAh^*(GanoCW@tJiO&k20-m8<8|dFyl}a&Nut@$?!ylj>{m zKJLC@ch!5`KSN=zbWcd%FuKQWe2v{k==gv=GfNi_JzP@6&MqX>4=xRtHmCPN~ zBb0r|L>38t|19wq{zdL(zYFh7h#kfTJ2u|k*kT=MFB|Nz)h;{twcE}SgPTscI@iHn z$Fdh!T;HSwecR;(dWP{CZaS=ahTX?m?B2KR{kqNUJS;PvWiiVyetDZ$ga66tQf%m@@&^tDPlUw4d7Yn`h6w zcm;Ev)UYz{1%QaXBZsjb2Cjs#ZL*g*C)R>vhM&sGoe!?TfQ``&YZlyipCBhY-J9Qt z-E&=ZXBcaNi0BhZk~M)KD};!CBxE#HqmRMF7*mv(V~I8S6jDqnNm7rh;w4CwBqCXg z)a-M}F{dm!=aOr2#baTyq#~x|QcA6CT3NdC>≦n`^#>7F%l4ax1NN#B$YT2(`g$I}o(o7b2O>b3bJVi7v`?dbhU1 zK{d1xRq7F^yPEesu8mQ!!f;7>Ps`vA><#rIAW-Uk_376LOY!kQwRCxp$gqr$@ zwq2{VC(WDpqW_uZ&3n;*YW~{y;j%NsG|^}*8p;V|hhcUceE&yG2EMzplbO&TAk$S~ z68X?LyYVyix7@zT-0#FH6y`e?-`UlK-2A?zH^xa#v2GM2L>5PxtWjN=A=l7Sq6ucU zP2^4Vqh~CSays+S+$v;=-dui4)dR1ZPp;**Pve>{VK zE2t6`A@Cb+7FJ4BIHb(FEd;C0C)<0WU;_Q}BjO~at0rk2Y9AKR25wEd?X&X7x}f#6GS+>s9a!4nL~v5^B=rm&=wXv{SX5oql)gHgX2A+43mzWFVY+!( z~BIvz6;-?ksF0i|lN==_OCEIbQ_%N^Jow}EGP0VBlN*-D}yyD&{ZV)go zw}W&k#b-|MoxkqOt_F$2AGT3JXa>EmjJFr+!P+LXfEff;sQghBfCtZ!gAD{0WORWg+T?JqAY_?y0f56PU}tFHQPz zj0wS(oBgPSsrzIoQ%j&KWy=whfu;4v0?kL>k3Nz-YLn~QuEfwL^(_F>^`$UfAqg3Y zS-I5Ix@He!x5xBTR3_4=2>lx^eWn|8wS_T8doE3v$KW1)iJtG;KG3rnOExMP%SJ^X zWYwYdl#7R|jg*(cd=g7DFykssWj^Z0oC4e>lWXe04&yz}90!Rr^24QlyZ_Jmvb*+l5ML@wFCfms#Zph?Wx;VZPwER2j0=0OP5ev`xY--l+I9=&i znc5;<&!^M{?I#af9$27$I!lmA7qbP2EPc*R9*+>zfX}YwU7t?VGJGDsmfk3B7I*4? z!Q4>Yke5cA(h|qQP|KYpq)tm;azOa*8eZ#+^uV(w{SSKJ*}74))U$lhTx+AykJ@pm zIWRAy87=AG?E9EE*4=6?JP`_kVf86%r+rQ1ECRapIqISg7cUrdiEZhOGLt^*kcwm+ zHWy$!TcicRZewR9+&h{#6@#LRK5HAG6=|w;*0Jh`QTOsxeawGae(Y26(d=(od%A)V zi>fK$TIoE$(a-exYis_xfipjE&0lxs=I5>X>(1Q#yfuH_nVX-t=C3<*^YhmHb!TpV z-kQJe%+1eR^VglZ`PzEBei!Lm-!gyr4~E|m`YccL{mJpc>+eeV zcUra0Fn_`9|C9EAleEeYkCp!h-=y)BK+Os*00009a7bBm001r{001r{0eGc9b^rhX z2XskIMF-;p6%G*w%ty7}0000tNklS|1kw|fd6oe uWIlug5%^D7X$!?9Tf%4#xW%T0000?V2Yn5K}T$Bo_& wr%!iS*v%Gbi`O3ez128={mw2|Q#&TJ-hMug6^Ti~Kr zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=H0l3XbaMdz%-OF$ArVmUlM5xs+6zAq$|KbIY0 zy9Yfeh#@tL6yZ)G zziD*rq;Gb)Ps1-OqQ}fHUzo%cpUabWb9SF|+;&$}hEh44O?_--_uzOzO4-9Qs^O#P z+pY!GvBd^r9W*c07N`(I?TPH{RB6)KZKH-ICLU~PnHzLpHW%ZhVT zfttX~_qEWTx9s^EIcDwzPbLIg{C=q6GvlAsd!RX2>Jml2>Es(Qubjp*7P<9=7ZA`q zn(Eef*YK1#@d@l=rdwvm25Y=-AugpyZpr2>@Y9&WflSs<07!(n6^kJOftZollqnjs z5kW@>pNf^UB)&j^RJl`_U?Y+N$9c_-F-F^$m2YNTEdZgC#efC}2(VI8C;lvmYX$irPa<|I*xzO-9qy|5lh?89@Jnq`v^hnI?=@p#5fU%+aiF3=EW>J zrNoQeVipVIP$+{M>4MW~5d*~;Mn{c#)qHo#Y)uRvdc{ttmBt_%FR4Br9K>XpVPcD6kL z000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jc@34h%P9_1X9U001RPL_t&-(_>&D z68tAx5U2M4SlAfG{AXZbU|_;!3==taQ40V77oZCIR}YC~00000NkvXXu0mjfKvs*a literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_u_acute_.png b/mods/ITEMS/mcl_signs/textures/_u_acute_.png new file mode 100644 index 0000000000000000000000000000000000000000..9237d3caff35c6f167cfd02a9a543c57dd48b812 GIT binary patch literal 876 zcmV-y1C#uTP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=H0l3XbaMdz%-OF$ArVmUlM5xs+6zAq$|KbIY0 zy9Yfeh3k36jH~HsJLkjgggwFE zzbAtjT@g<>@DP%Sr>|KAE07`;t>DQ*yex`7ZHowfu3h-h^h(E>GIc*?rD&+g(i=O671i^|6)RgX0A$We>}!hL56e zyB1W(78{6l(7aGvph66_C$h6srAcGAjT)Aic(9>mZqR+%T#O614JEBglMQ%!5C@wE zY63Ig*Ft;Vvgd2$n7I=?nGlRH;)fbOGyX}v2by!GE>ZNGPQC&2%4sZPky}rA0RhdU zscwCD4NrL!pTI6=x@C53u*T~a;!=9#mTb-fKaD9I$YlKlfJB&Eu^18%h#84ZnW8Zp z5p;C$saQEn;tK>wl{r?=%j=G+CYDSso0(g&>f*`OvzxmYuZ4@?3e%E{h2o`@S}|!w=!(%5 z9<^S4$(1g>@@1D_<*E(o(^Auxn>BBx)y`cyj(^YHLib*J9W;GOWV&L)L=II2tn&Q(ZvkJI1z~3B7lVE#Vk6d z#EaZw77OE0D1#d5g41ac1Hm+ib<&;PgWNB<1x>%jjekZiEOh?`xv`*-W^MB3%OA9^#x#8UO(8#0UW`yTi)>00005 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_u_circumflex.png b/mods/ITEMS/mcl_signs/textures/_u_circumflex.png new file mode 100644 index 0000000000000000000000000000000000000000..2b238be12fdcc71e59c6e7067bd08c755e20832d GIT binary patch literal 874 zcmV-w1C{)VP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=H0l3XbaMdz%-OF$ArVmUlM5xs+6zAq$|KbIY0 zy9Yfeh3k36jH~HsJLkjgggwFE zzbAtjT@g<>@DP%Sr>|KAE07`;t>DQ*yex`7ZA%pYT)Xh0>$`aO-kWx@9=p6s5$+W7 zn?}b@`ev8=H2kt6dd&Rt!X&2nT%NR>v-_Omw!4}#l*-|3>SHUr2geIi${v@z)G9egY#1A!mX8eadWU83kWoqPl4mD5udI%pu3MjATuu;HVOI+1Hr zW|}(lwCS_VdZ$L`*uGGsH*&wGMu*xWmbRZgsKIRZ5rWorqKg@baUu}6MF0uSi&=C^ zi5I!WEEdM0PzE*91*g*@27+l2>!dro2f1Hz3z~k58~==4Sm^!>a$%u6l7|cqfA_Ea2Q_M>-tUl<2L+lfUiJbfxZI$9|BEW7x;4-z5~bqmBsFUWwQVP z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z2A4G7JM#e@I=04GUAK~xyiV_+Zx z{KqHwpMh8-{$pWd81bKhfq{VumoZG_*hMV>00_Mc`N@OurT_o{07*qoM6N<$f|zxU ABme*a literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_u_circumflex_.png b/mods/ITEMS/mcl_signs/textures/_u_circumflex_.png new file mode 100644 index 0000000000000000000000000000000000000000..1608ecf17306931ae19942a3dafdb622e3a54f6a GIT binary patch literal 876 zcmV-y1C#uTP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=H0l3XbaMdz%-OF$ArVmUlM5xs+6zAq$|KbIY0 zy9Yfeh3k36jH~HsJLkjgggwFE zzbAtjT@g<>@DP%Sr>|KAE07`;t>DQ*yex`7ZHq|xT)Xh0>$`aO-kWx@9=p6s5$+W7 zn?}b@`ev8=H2kt6dd&Rt!X&2nT%NR>v-_Omw!4}#l*-|3>SHUr2geIi${v@z)G9egY#1A!mX8eadWU83kWoqPl4mD5udI%pu3MjATuu;HVOI+1Hr zW|}(lwCS_VdZ$L`*uGGsH*&wGMu*xWmbRZgsKIRZ5rWorqKg@baUu}6MF0uSi&=C^ zi5I!WEEdM0PzE*91*g*@27+l2>!dro2f1Hz3z~k58~==4Sm^!>a$%u6l7|cqfA_Ea2Q_M>-tUl<2L+lfUiJbfxZI$9|BEW7x;@8z60-}mB}z!j=ul^ z010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{z2A4JT$<_}u^i04YgCK~xyiV_-ml z{|s2be|(ZCfDuU*BQ{ zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=G}k{lrnMfaS-M@UHsiQ|wA5x#+s?+;1W)a{P& zu<)WGDxs7@z<+|O(0_a%;TsA?@(|TL<&+MTm}BOGjvrUKS~}u-UM208p6%hN`vt=! zXl48N?O$Nm`v8mEem>iS?Lh215ZwZ=B6H^1-+sOW314>F-$UNxN_^PP{&3x4cktKm z(I7@s#1jtOh2+4~=PZI1NS1l;iKr= zsu|U>#R_5#G*8qTC=)~Nf$VHlXi#5mrHUm+?rdn8D|DYW7vs!zL5Z`{U;~~O#KES5 zn!wDrwa}V3ulXuDW^M#eCIlmlcvr(m#y_dIKx53*B|7}l$roUrIgMpZa`OoC}-*J$CJ>Tlb!O8OXIE zBMu#D*zl1@xlyBiY@evn3%Sp!(WW+u#pP#rYA~C!2IEJGoD}1&zPOjekWhOmzQ(T$t!Kx%b>Ypw`Oz zMUe$)p2Df=Ap;j19J&|wGJli)xD9_B;49EqpszsxL!g1{0)H;UPk6_by>Y-0)c^nh z32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0~HPp0kl+oAOHXWBuPX;R2b7^U?2eg wlP!s%@;??fhB5yc7#J9sa2dlyj$PCO03VnN`f$7;O#lD@07*qoM6N<$f>X_lsQ>@~ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_u_grave_.png b/mods/ITEMS/mcl_signs/textures/_u_grave_.png new file mode 100644 index 0000000000000000000000000000000000000000..6686857933c5b2e7741c29f45afa4a3491eb5361 GIT binary patch literal 878 zcmV-!1CjiRP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=H0l3XbaMdz%-OF$ArVmUlM5xs+6zAq$|KbIY0 zy9Yfeh3k36jH~HsJLkjgggwFE zzbAtjT@g<>@DP%Sr>|KAE07`;t>DQ*yex`79gBXhUHH)TUA%kmO}ki+U0$UKcMADU zqhlw1v&(%NepwMcW`22L5>tFGPuk7dea>;)T}>HE<#0Cjv6bC};{_>Y56h^AkD_n8 z7F5R;8;Et#yii-9LJYMhva?gANn^K-8kU%Nu%Tsc(0$olj0?97C9O)64S0GG2Z;u1 z0yE#&LVMn_=WFDcxf48@5R5S5hZ;UJ{z<(DnscQtQS_Tmz5(;fX)I%rTTgfa0nMYS zZhdzRPk9rcz%FLGWp-?^#_Ja1QhMZ;Y|a8djVT<+Wc>tyM3`H#7!nYO8Hr7qqA?p0 zbae2kSUF4L3j|1&JB0~0A{lU;*W4Imw0&9mX2#V55Gq*=XmEf4D(V8WvtT|`P>yD}>mP{?1nOm{y;>p#so4XgUg^S<{(~^sY;-!>YF=<8UiqRDw zwO)M5l`g&VWtU&&stxJWQqz{3HE*TW&Rsf=f6v`Q_g;D(G>}Ro4IO#d@KHvc$h9dm zO`Un#^jT)TQ=@ZiU#QU=xnEPGLv0aD+s_`*LF+ov#SFwa5s2F&fQ077EIOsc zi`-%s3*%5IgBt0A(`gX{!8C|<(w*Id+%LHWO~1vBe?~4WbpHjpu+SZHKXUtoTCe*T zMK+*y3YVr)CN4HO46p2U{U-f!8~!%HSD>#zUxEG)fhMjC{J9L@0lplS#0-o6*#H0l z32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Re0~HPp8K*eqb^rhXEJ;K`R2b7^U_gNX z40r%uNd^W61_nkXRgBnl{YPgr;WCPJ33Pk@Gf*D@0PVyG0nXBS$^ZZW07*qoM6N<$ Ef}nJO{r~^~ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_y_acute.png b/mods/ITEMS/mcl_signs/textures/_y_acute.png new file mode 100644 index 0000000000000000000000000000000000000000..37cb54b3046f735c3445bcc2a3bda5e9451fadd7 GIT binary patch literal 875 zcmV-x1C;!UP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?Qqc!mOfm6bL(AL{_a$>NF5EVhv?@(D;ORjeY#OKu z#Qc~GZNFvvYvl0U37SkWMi}u^4POa=r#=kLxl)%X`W+{v1?I&or!kF1Zrz~;1T;@f zb;ozt@RB$21?*y`JIsy+)_C0}E~RH~$>uE3)0o16OxBM9gb2PBlOX|tn333&DH^j8 zA&w3{6*Ff^e1QO|a;GrCMkE7{^YV=`Mq8JaZ!wM*fKbU|K!XhgSScy;$C4w5s;=`$ zRkND97Oh!w%9?Ywyw0d->6SR&KUCcm?6M?ub0!V0H%%W3D zyvQwPu`o7;GN_R*IGq+T5KMzuCq39b$^DXB(Dbjk@jsCZ3*G-gE-ZA1+|S&;pw{dD zqR0lccHxR?l!=243d1XVUEieNZo_{y@NMYZ(6^!WS1~(&?ZV%tVs@)Jb_xRk000Sa zNLh0L04^f{04^f|c%?sf00007bV*G`2jc@34h=VZ?&!Gy001jVL_t&t*JEHH0{kZ^ zfC3niR4}5eM&|ry!ls>x80X-3(tm<(WME)m008M=3jBf4sp9|u002ovPDHLkV1m7o BiW2|; literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_signs/textures/_y_acute_.png b/mods/ITEMS/mcl_signs/textures/_y_acute_.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc15c41c725e58f5c34b0e7f18c35aa15be6dd1 GIT binary patch literal 871 zcmV-t1DO1YP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?QqcBO!2k6#BR>+bB=p;HDyF9hqI_3OW8drUI?Y^VHwqMDf+f+ zL3J##fmjF43$+C*#EAB!M4c*48oO=OFvY}!4J~s++?UM7xNzH0(yBDsfTss>kZ7PL z5c6X$wEdRtuaU!ZCulOk7-7UuHGC!fo%%2|=Sp3o=y#lu7MK^WoW?X3xpjvY5YRj^ z)g9km!%N=87qE+&?l3zRSmSk@xRjo`C7ZKAPh$!PGFd+c5F+?iOojvmVn$+9rfAGY zgg83*RLq&HC=9Rcb$ye5yAA)6&&Xe0000cNkl zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGvgIZWMgJK^hJYl5#BeZ=s>~q6&j!=y)i+(0 zPChS`4VHxjS^_(azy6%z4-^tjA*p#TIY*RKQsIh@$GhAu#kB8t(bLkqJj8ZhFhqh@ z?#DcieuZ4011uf+^)3%~46z?W^f0`OEYGWd^!ykSzU6eDLpkGWdRfl7xE-^{_~&yn z1fwhL2?riR5^?wCMKA*?QqcW=TO;U#b43)sa>cbFXutns={TuRT}lFeD5r!j>CnXDfJ2oZcMCPM-OF(a`lQ#58H zLL41@DrU}-_yPe^1d!0Ym_?_Q zc#&JoVqt6wWl$qsa5^nwAeaWRPI|C=lKUmMpy^+6<9{L-7P|j~Tv+H1xu3axL9N&Q zMUf3??ZOq)C=&-86oyy!y1q%j-G={a;M>r*p>IR$uVQxm+J(OXfXa5K=2>Q?00009 za7bBm001r{001r{0eGc9b^rhX2XskIMF-;p6%Gysm=x;z0000fNklb%7 literal 0 HcmV?d00001 From 1719c3e4e13c591111c3626ef0d8dc7a80fccc18 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 21 Mar 2019 16:08:29 +0100 Subject: [PATCH 238/379] Add LBMs to update formspecs of 4 nodes Dispenser, dropper, ender chest, shulker box. --- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 10 + .../REDSTONE/mcl_dispensers/init_new.lua | 372 ++++++++ mods/ITEMS/REDSTONE/mcl_droppers/init.lua | 10 + mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua | 219 +++++ mods/ITEMS/mcl_chests/init.lua | 10 + mods/ITEMS/mcl_chests/init_new.lua | 878 ++++++++++++++++++ 6 files changed, 1499 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mcl_dispensers/init_new.lua create mode 100644 mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua create mode 100644 mods/ITEMS/mcl_chests/init_new.lua diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 1575c3fc6..2e5e3c6a1 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -359,3 +359,13 @@ if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mcl_dispensers:dispenser", "nodes", "mcl_dispensers:dispenser_down") doc.add_entry_alias("nodes", "mcl_dispensers:dispenser", "nodes", "mcl_dispensers:dispenser_up") end + +minetest.register_lbm({ + label = "Update dispenser formspecs (0.51.0)", + name = "mcl_dispensers:update_formspecs_0_51_0", + nodenames = { "mcl_dispensers:dispenser", "mcl_dispensers:dispenser_down", "mcl_dispensers:dispenser_up" }, + action = function(pos, node) + setup_dispenser(pos) + minetest.log("action", "[mcl_dispenser] Node formspec updated at "..minetest.pos_to_string(pos)) + end, +}) diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init_new.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init_new.lua new file mode 100644 index 000000000..dbe802c2c --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init_new.lua @@ -0,0 +1,372 @@ +--[[ This mod registers 3 nodes: +- One node for the horizontal-facing dispensers (mcl_dispensers:dispenser) +- One node for the upwards-facing dispensers (mcl_dispenser:dispenser_up) +- One node for the downwards-facing dispensers (mcl_dispenser:dispenser_down) + +3 node definitions are needed because of the way the textures are defined. +All node definitions share a lot of code, so this is the reason why there +are so many weird tables below. +]] +local S = minetest.get_translator("mcl_dispensers") + +-- For after_place_node +local setup_dispenser = function(pos) + -- Set formspec and inventory + local form = "size[9,8.75]".. + "background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]".. + mcl_vars.inventory_header.. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + "list[current_player;main;0,7.74;9,1;]".. + "label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dispenser"))).."]".. + "list[current_name;main;3,0.5;3,3;]".. + "listring[current_name;main]".. + "listring[current_player;main]" + local meta = minetest.get_meta(pos) + meta:set_string("formspec", form) + local inv = meta:get_inventory() + inv:set_size("main", 9) +end + +local orientate_dispenser = function(pos, placer) + -- Not placed by player + if not placer then return end + + -- Pitch in degrees + local pitch = placer:get_look_vertical() * (180 / math.pi) + + local node = minetest.get_node(pos) + if pitch > 55 then + minetest.swap_node(pos, {name="mcl_dispensers:dispenser_up", param2 = node.param2}) + elseif pitch < -55 then + minetest.swap_node(pos, {name="mcl_dispensers:dispenser_down", param2 = node.param2}) + end +end + +local on_rotate +if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.rotate_simple +end + +-- Shared core definition table +local dispenserdef = { + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return count + end + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + local meta2 = meta + meta:from_table(oldmetadata) + local inv = meta:get_inventory() + for i=1, inv:get_size("main") do + local stack = inv:get_stack("main", i) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end + meta:from_table(meta2:to_table()) + end, + _mcl_blast_resistance = 17.5, + _mcl_hardness = 3.5, + mesecons = {effector = { + -- Dispense random item when triggered + action_on = function (pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local droppos, dropdir + if node.name == "mcl_dispensers:dispenser" then + dropdir = vector.multiply(minetest.facedir_to_dir(node.param2), -1) + droppos = vector.add(pos, dropdir) + elseif node.name == "mcl_dispensers:dispenser_up" then + dropdir = {x=0, y=1, z=0} + droppos = {x=pos.x, y=pos.y+1, z=pos.z} + elseif node.name == "mcl_dispensers:dispenser_down" then + dropdir = {x=0, y=-1, z=0} + droppos = {x=pos.x, y=pos.y-1, z=pos.z} + end + local dropnode = minetest.get_node(droppos) + local dropnodedef = minetest.registered_nodes[dropnode.name] + local stacks = {} + for i=1,inv:get_size("main") do + local stack = inv:get_stack("main", i) + if not stack:is_empty() then + table.insert(stacks, {stack = stack, stackpos = i}) + end + end + if #stacks >= 1 then + local r = math.random(1, #stacks) + local stack = stacks[r].stack + local dropitem = ItemStack(stack) + dropitem:set_count(1) + local stack_id = stacks[r].stackpos + local stackdef = stack:get_definition() + local iname = stack:get_name() + local igroups = minetest.registered_items[iname].groups + + --[===[ Dispense item ]===] + + -- Hardcoded dispensions -- + + -- Armor, mob heads and pumpkins + if igroups.armor_head or igroups.armor_torso or igroups.armor_legs or igroups.armor_feet then + local armor_type, armor_slot + local armor_dispensed = false + if igroups.armor_head then + armor_type = "armor_head" + armor_slot = 2 + elseif igroups.armor_torso then + armor_type = "armor_torso" + armor_slot = 3 + elseif igroups.armor_legs then + armor_type = "armor_legs" + armor_slot = 4 + elseif igroups.armor_feet then + armor_type = "armor_feet" + armor_slot = 5 + end + + local droppos_below = {x=droppos.x, y=droppos.y-1, z=droppos.z} + local dropnode_below = minetest.get_node(droppos_below) + -- Put armor on player or armor stand + local standpos + if dropnode.name == "3d_armor_stand:armor_stand" then + standpos = droppos + elseif dropnode_below.name == "3d_armor_stand:armor_stand" then + standpos = droppos_below + end + if standpos then + local dropmeta = minetest.get_meta(standpos) + local dropinv = dropmeta:get_inventory() + if dropinv:room_for_item(armor_type, dropitem) then + dropinv:add_item(armor_type, dropitem) + --[[ FIXME: For some reason, this function is not called after calling add_item, + so we call it manually to update the armor stand entity. + This may need investigation and the following line may be a small hack. ]] + minetest.registered_nodes["3d_armor_stand:armor_stand"].on_metadata_inventory_put(standpos) + stack:take_item() + inv:set_stack("main", stack_id, stack) + armor_dispensed = true + end + else + -- Put armor on nearby player + -- First search for player in front of dispenser (check 2 nodes) + local objs1 = minetest.get_objects_inside_radius(droppos, 1) + local objs2 = minetest.get_objects_inside_radius(droppos_below, 1) + local objs_table = {objs1, objs2} + local player + for oi=1, #objs_table do + local objs_inner = objs_table[oi] + for o=1, #objs_inner do + --[[ First player in list is the lucky one. The other player get nothing :-( + If multiple players are close to the dispenser, it can be a bit + -- unpredictable on who gets the armor. ]] + if objs_inner[o]:is_player() then + player = objs_inner[o] + break + end + end + if player then + break + end + end + -- If player found, add armor + if player then + local ainv = minetest.get_inventory({type="detached", name=player:get_player_name().."_armor"}) + local pinv = player:get_inventory() + if ainv:get_stack("armor", armor_slot):is_empty() and pinv:get_stack("armor", armor_slot):is_empty() then + ainv:set_stack("armor", armor_slot, dropitem) + pinv:set_stack("armor", armor_slot, dropitem) + armor:set_player_armor(player) + armor:update_inventory(player) + + stack:take_item() + inv:set_stack("main", stack_id, stack) + armor_dispensed = true + end + end + + -- Place head or pumpkin as node, if equipping it as armor has failed + if not armor_dispensed then + if igroups.head or iname == "mcl_farming:pumpkin_face" then + if dropnodedef.buildable_to then + minetest.set_node(droppos, {name = iname, param2 = node.param2}) + stack:take_item() + inv:set_stack("main", stack_id, stack) + end + end + end + end + + -- Spawn Egg + elseif igroups.spawn_egg then + -- Spawn mob + if not dropnodedef.walkable then + pointed_thing = { above = droppos, under = { x=droppos.x, y=droppos.y-1, z=droppos.z } } + minetest.add_entity(droppos, stack:get_name()) + + stack:take_item() + inv:set_stack("main", stack_id, stack) + end + + -- Generalized dispension + elseif (not dropnodedef.walkable or stackdef._dispense_into_walkable) then + --[[ _on_dispense(stack, pos, droppos, dropnode, dropdir) + * stack: Itemstack which is dispense + * pos: Position of dispenser + * droppos: Position to which to dispense item + * dropnode: Node of droppos + * dropdir: Drop direction + + _dispense_into_walkable: If true, can dispense into walkable nodes + ]] + if stackdef._on_dispense then + -- Item-specific dispension (if defined) + local od_ret = stackdef._on_dispense(dropitem, pos, droppos, dropnode, dropdir) + if od_ret then + local newcount = stack:get_count() - 1 + stack:set_count(newcount) + inv:set_stack("main", stack_id, stack) + if newcount == 0 then + inv:set_stack("main", stack_id, od_ret) + elseif inv:room_for_item("main", od_ret) then + inv:add_item("main", od_ret) + else + minetest.add_item(droppos, dropitem) + end + else + stack:take_item() + inv:set_stack("main", stack_id, stack) + end + else + -- Drop item otherwise + minetest.add_item(droppos, dropitem) + stack:take_item() + inv:set_stack("main", stack_id, stack) + end + end + + + end + end, + rules = mesecon.rules.alldirs, + }}, + on_rotate = on_rotate, +} + +-- Horizontal dispenser + +local horizontal_def = table.copy(dispenserdef) +horizontal_def.description = S("Dispenser") +horizontal_def._doc_items_longdesc = S("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.") +horizontal_def._doc_items_usagehelp = S("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.").."\n\n".. + +S("The dispenser will do different things, depending on the dispensed item:").."\n\n".. + +S("• Arrows: Are launched").."\n".. +S("• Eggs and snowballs: Are thrown").."\n".. +S("• Fire charges: Are fired in a straight line").."\n".. +S("• Armor: Will be equipped to players and armor stands").."\n".. +S("• Boats: Are placed on water or are dropped").."\n".. +S("• Minecart: Are placed on rails or are dropped").."\n".. +S("• Bone meal: Is applied on the block it is facing").."\n".. +S("• Empty buckets: Are used to collect a liquid source").."\n".. +S("• Filled buckets: Are used to place a liquid source").."\n".. +S("• Heads, pumpkins: Equipped to players and armor stands, or placed as a block").."\n".. +S("• Shulker boxes: Are placed as a block").."\n".. +S("• TNT: Is placed and ignited").."\n".. +S("• Flint and steel: Is used to ignite a fire in air and to ignite TNT").."\n".. +S("• Spawn eggs: Will summon the mob they contain").."\n".. +S("• Other items: Are simply dropped") + +horizontal_def.after_place_node = function(pos, placer, itemstack, pointed_thing) + setup_dispenser(pos) + orientate_dispenser(pos, placer) +end +horizontal_def.tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "mcl_dispensers_dispenser_front_horizontal.png" +} +horizontal_def.paramtype2 = "facedir" +horizontal_def.groups = {pickaxey=1, container=2, material_stone=1} + +minetest.register_node("mcl_dispensers:dispenser", horizontal_def) + +-- Down dispenser +local down_def = table.copy(dispenserdef) +down_def.description = S("Downwards-Facing Dispenser") +down_def.after_place_node = setup_dispenser +down_def.tiles = { + "default_furnace_top.png", "mcl_dispensers_dispenser_front_vertical.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_side.png" +} +down_def.groups = {pickaxey=1, container=2,not_in_creative_inventory=1, material_stone=1} +down_def._doc_items_create_entry = false +down_def.drop = "mcl_dispensers:dispenser" +minetest.register_node("mcl_dispensers:dispenser_down", down_def) + +-- Up dispenser +-- The up dispenser is almost identical to the down dispenser , it only differs in textures +local up_def = table.copy(down_def) +up_def.description = S("Upwards-Facing Dispenser") +up_def.tiles = { + "mcl_dispensers_dispenser_front_vertical.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_side.png" +} +minetest.register_node("mcl_dispensers:dispenser_up", up_def) + + +minetest.register_craft({ + output = 'mcl_dispensers:dispenser', + recipe = { + {"mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble",}, + {"mcl_core:cobble", "mcl_bows:bow", "mcl_core:cobble",}, + {"mcl_core:cobble", "mesecons:redstone", "mcl_core:cobble",}, + } +}) + +-- Add entry aliases for the Help +if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_dispensers:dispenser", "nodes", "mcl_dispensers:dispenser_down") + doc.add_entry_alias("nodes", "mcl_dispensers:dispenser", "nodes", "mcl_dispensers:dispenser_up") +end + +minetest.register_lbm({ + label = "Update dispenser formspecs (0.51.0)", + name = "mcl_dispensers:update_formspecs_0_51_0", + nodenames = { "mcl_dispensers:dispenser", "mcl_dispensers:dispenser_down", "mcl_dispensers:dispenser_up" }, + action = function(pos, node) + minetest.registered_nodes[node.name].on_construct(pos) + minetest.log("action", "[mcl_dispenser] Node formspec updated at "..minetest.pos_to_string(pos)) + end, +}) + diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua index 157ce6801..7167de19f 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua @@ -206,3 +206,13 @@ if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mcl_droppers:dropper", "nodes", "mcl_droppers:dropper_down") doc.add_entry_alias("nodes", "mcl_droppers:dropper", "nodes", "mcl_droppers:dropper_up") end + +minetest.register_lbm({ + label = "Update dropper formspecs (0.51.0)", + name = "mcl_droppers:update_formspecs_0_51_0", + nodenames = { "mcl_droppers:dropper", "mcl_droppers:dropper_down", "mcl_droppers:dropper_up" }, + action = function(pos, node) + setup_dropper(pos) + minetest.log("action", "[mcl_droppers] Node formspec updated at "..minetest.pos_to_string(pos)) + end, +}) diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua new file mode 100644 index 000000000..a36a2dbe9 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua @@ -0,0 +1,219 @@ +--[[ This mod registers 3 nodes: +- One node for the horizontal-facing dropper (mcl_droppers:dropper) +- One node for the upwards-facing droppers (mcl_droppers:dropper_up) +- One node for the downwards-facing droppers (mcl_droppers:dropper_down) + +3 node definitions are needed because of the way the textures are defined. +All node definitions share a lot of code, so this is the reason why there +are so many weird tables below. +]] + +local S = minetest.get_translator("mcl_droppers") + +-- For after_place_node +local setup_dropper = function(pos) + -- Set formspec and inventory + local form = "size[9,8.75]".. + "background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]".. + mcl_vars.inventory_header.. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + "list[current_player;main;0,7.74;9,1;]".. + "label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dropper"))).."]".. + "list[current_name;main;3,0.5;3,3;]".. + "listring[current_name;main]".. + "listring[current_player;main]" + local meta = minetest.get_meta(pos) + meta:set_string("formspec", form) + local inv = meta:get_inventory() + inv:set_size("main", 9) +end + +local orientate_dropper = function(pos, placer) + -- Not placed by player + if not placer then return end + + -- Pitch in degrees + local pitch = placer:get_look_vertical() * (180 / math.pi) + + if pitch > 55 then + minetest.swap_node(pos, {name="mcl_droppers:dropper_up"}) + elseif pitch < -55 then + minetest.swap_node(pos, {name="mcl_droppers:dropper_down"}) + end +end + +local on_rotate +if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.rotate_simple +end + +-- Shared core definition table +local dropperdef = { + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + local meta2 = meta + meta:from_table(oldmetadata) + local inv = meta:get_inventory() + for i=1, inv:get_size("main") do + local stack = inv:get_stack("main", i) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end + meta:from_table(meta2:to_table()) + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return count + end + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + _mcl_blast_resistance = 17.5, + _mcl_hardness = 3.5, + mesecons = {effector = { + -- Drop random item when triggered + action_on = function (pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local droppos + if node.name == "mcl_droppers:dropper" then + droppos = vector.subtract(pos, minetest.facedir_to_dir(node.param2)) + elseif node.name == "mcl_droppers:dropper_up" then + droppos = {x=pos.x, y=pos.y+1, z=pos.z} + elseif node.name == "mcl_droppers:dropper_down" then + droppos = {x=pos.x, y=pos.y-1, z=pos.z} + end + 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 + return + end + local stacks = {} + for i=1,inv:get_size("main") do + local stack = inv:get_stack("main", i) + if not stack:is_empty() then + table.insert(stacks, {stack = stack, stackpos = i}) + end + end + if #stacks >= 1 then + local r = math.random(1, #stacks) + local stack = stacks[r].stack + 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 + minetest.add_item(droppos, dropitem) + stack:take_item() + inv:set_stack("main", stack_id, stack) + end + end + end, + rules = mesecon.rules.alldirs, + }}, + on_rotate = on_rotate, +} + +-- Horizontal dropper + +local horizontal_def = table.copy(dropperdef) +horizontal_def.description = S("Dropper") +horizontal_def._doc_items_longdesc = S("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.") +horizontal_def._doc_items_usagehelp = S("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.") +horizontal_def.after_place_node = function(pos, placer, itemstack, pointed_thing) + setup_dropper(pos) + orientate_dropper(pos, placer) +end +horizontal_def.tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "mcl_droppers_dropper_front_horizontal.png" +} +horizontal_def.paramtype2 = "facedir" +horizontal_def.groups = {pickaxey=1, container=2, material_stone=1} + +minetest.register_node("mcl_droppers:dropper", horizontal_def) + +-- Down dropper +local down_def = table.copy(dropperdef) +down_def.description = S("Downwards-Facing Dropper") +down_def.after_place_node = setup_dropper +down_def.tiles = { + "default_furnace_top.png", "mcl_droppers_dropper_front_vertical.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_side.png" +} +down_def.groups = {pickaxey=1, container=2,not_in_creative_inventory=1, material_stone=1} +down_def._doc_items_create_entry = false +down_def.drop = "mcl_droppers:dropper" +minetest.register_node("mcl_droppers:dropper_down", down_def) + +-- Up dropper +-- The up dropper is almost identical to the down dropper, it only differs in textures +local up_def = table.copy(down_def) +up_def.description = S("Upwards-Facing Dropper") +up_def.tiles = { + "mcl_droppers_dropper_front_vertical.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_side.png" +} +minetest.register_node("mcl_droppers:dropper_up", up_def) + + + +-- Ladies and gentlemen, I present to you: the crafting recipe! +minetest.register_craft({ + output = 'mcl_droppers:dropper', + recipe = { + {"mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble",}, + {"mcl_core:cobble", "", "mcl_core:cobble",}, + {"mcl_core:cobble", "mesecons:redstone", "mcl_core:cobble",}, + } +}) + +-- Add entry aliases for the Help +if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_droppers:dropper", "nodes", "mcl_droppers:dropper_down") + doc.add_entry_alias("nodes", "mcl_droppers:dropper", "nodes", "mcl_droppers:dropper_up") +end + +minetest.register_lbm({ + label = "Update dropper formspecs (0.51.0)", + name = "mcl_droppers:update_formspecs_0_51_0", + nodenames = { "mcl_droppers:dropper", "mcl_droppers:dropper_down", "mcl_droppers:dropper_up" }, + action = function(pos, node) + minetest.registered_nodes[node.name].on_construct(pos) + minetest.log("action", "[mcl_droppers] Node formspec updated at "..minetest.pos_to_string(pos)) + end, +}) + diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index f04fb6527..496740b5b 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -675,6 +675,16 @@ minetest.register_node("mcl_chests:ender_chest", { on_rotate = simple_rotate, }) +minetest.register_lbm({ + label = "Update ender chest + shulker box formspecs (0.51.0)", + name = "mcl_chests:update_formspecs_0_51_0", + nodenames = { "mcl_chests:ender_chest", "group:shulker_box" }, + action = function(pos, node) + minetest.registered_nodes[node.name].on_construct(pos) + minetest.log("action", "[mcl_chests] Node formspec updated at "..minetest.pos_to_string(pos)) + end, +}) + minetest.register_on_joinplayer(function(player) local inv = player:get_inventory() inv:set_size("enderchest", 9*3) diff --git a/mods/ITEMS/mcl_chests/init_new.lua b/mods/ITEMS/mcl_chests/init_new.lua new file mode 100644 index 000000000..496740b5b --- /dev/null +++ b/mods/ITEMS/mcl_chests/init_new.lua @@ -0,0 +1,878 @@ +local S = minetest.get_translator("mcl_chests") + +local no_rotate, simple_rotate +if minetest.get_modpath("screwdriver") then + no_rotate = screwdriver.disallow + simple_rotate = screwdriver.rotate_simple +end + +--[[ List of open chests. +Key: Player name +Value: + If player is using a chest: { pos = } + Otherwise: nil ]] +local open_chests = {} +-- To be called if a player opened a chest +local player_chest_open = function(player, pos) + open_chests[player:get_player_name()] = { pos = pos } +end + +-- Simple protection checking functions +local protection_check_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return count + end +end +local protection_check_put_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end +end + +local trapped_chest_mesecons_rules = mesecon.rules.pplate + +-- To be called when a chest is closed (only relevant for trapped chest atm) +local chest_update_after_close = function(pos) + local node = minetest.get_node(pos) + + if node.name == "mcl_chests:trapped_chest_on" then + minetest.swap_node(pos, {name="mcl_chests:trapped_chest", param2 = node.param2}) + mesecon.receptor_off(pos, trapped_chest_mesecons_rules) + elseif node.name == "mcl_chests:trapped_chest_on_left" then + minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) + mesecon.receptor_off(pos, trapped_chest_mesecons_rules) + + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") + minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) + mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) + elseif node.name == "mcl_chests:trapped_chest_on_right" then + minetest.swap_node(pos, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) + mesecon.receptor_off(pos, trapped_chest_mesecons_rules) + + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") + minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) + mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) + end +end + +-- To be called if a player closed a chest +local player_chest_close = function(player) + local name = player:get_player_name() + if open_chests[name] == nil then + return + end + local pos = open_chests[name].pos + chest_update_after_close(pos) + + open_chests[name] = nil +end + +-- This is a helper function to register both chests and trapped chests. Trapped chests will make use of the additional parameters +local register_chest = function(basename, desc, longdesc, usagehelp, tiles_table, hidden, mesecons, on_rightclick_addendum, on_rightclick_addendum_left, on_rightclick_addendum_right, drop, canonical_basename) +-- START OF register_chest FUNCTION BODY +if not drop then + drop = "mcl_chests:"..basename +else + drop = "mcl_chests:"..drop +end +-- The basename of the "canonical" version of the node, if set (e.g.: trapped_chest_on → trapped_chest). +-- Used to get a shared formspec ID and to swap the node back to the canonical version in on_construct. +if not canonical_basename then + canonical_basename = basename +end + +minetest.register_node("mcl_chests:"..basename, { + description = desc, + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usagehelp, + _doc_items_hidden = hidden, + tiles = tiles_table.small, + paramtype = "light", + paramtype2 = "facedir", + stack_max = 64, + drop = drop, + groups = {handy=1,axey=1, container=2, deco_block=1, material_wood=1}, + is_ground_content = false, + sounds = mcl_sounds.node_sound_wood_defaults(), + on_construct = function(pos) + local param2 = minetest.get_node(pos).param2 + local meta = minetest.get_meta(pos) + --[[ This is a workaround for Minetest issue 5894 + . + Apparently if we don't do this, double chests initially don't work when + placed at chunk borders, and some chests randomly don't work after + placing. ]] + -- FIXME: Remove this workaround when the bug has been fixed. + -- BEGIN OF WORKAROUND -- + meta:set_string("workaround", "ignore_me") + meta:set_string("workaround", nil) -- Done to keep metadata clean + -- END OF WORKAROUND -- + local inv = meta:get_inventory() + inv:set_size("main", 9*3) + --[[ The "input" list is *another* workaround (hahahaha!) around the fact that Minetest + does not support listrings to put items into an alternative list if the first one + happens to be full. See . + This list is a hidden input-only list and immediately puts items into the appropriate chest. + It is only used for listrings and hoppers. This workaround is not that bad because it only + requires a simple “inventory allows” check for large chests.]] + -- FIXME: Refactor the listrings as soon Minetest supports alternative listrings + -- BEGIN OF LISTRING WORKAROUND + inv:set_size("input", 1) + -- END OF LISTRING WORKAROUND + if minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "right")).name == "mcl_chests:"..canonical_basename then + minetest.swap_node(pos, {name="mcl_chests:"..canonical_basename.."_right",param2=param2}) + local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") + minetest.swap_node(p, { name = "mcl_chests:"..canonical_basename.."_left", param2 = param2 }) + elseif minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "left")).name == "mcl_chests:"..canonical_basename then + minetest.swap_node(pos, {name="mcl_chests:"..canonical_basename.."_left",param2=param2}) + local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") + minetest.swap_node(p, { name = "mcl_chests:"..canonical_basename.."_right", param2 = param2 }) + else + minetest.swap_node(pos, { name = "mcl_chests:"..canonical_basename, param2 = param2 }) + end + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + local meta2 = meta + meta:from_table(oldmetadata) + local inv = meta:get_inventory() + for i=1,inv:get_size("main") do + local stack = inv:get_stack("main", i) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end + meta:from_table(meta2:to_table()) + end, + allow_metadata_inventory_move = protection_check_move, + allow_metadata_inventory_take = protection_check_put_take, + allow_metadata_inventory_put = protection_check_put_take, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to chest at "..minetest.pos_to_string(pos)) + -- BEGIN OF LISTRING WORKAROUND + if listname == "input" then + local inv = minetest.get_inventory({type="node", pos=pos}) + inv:add_item("main", stack) + end + -- END OF LISTRING WORKAROUND + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from chest at "..minetest.pos_to_string(pos)) + end, + _mcl_blast_resistance = 2.5, + _mcl_hardness = 2.5, + + on_rightclick = function(pos, node, clicker) + minetest.show_formspec(clicker:get_player_name(), + "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, + "size[9,8.75]".. + mcl_vars.inventory_header.. + "background[-0.19,-0.25;9.41,10.48;mcl_chests_inventory_chest.png]".. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Chest"))).."]".. + "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + "list[current_player;main;0,7.74;9,1;]".. + "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main]".. + "listring[current_player;main]") + + if on_rightclick_addendum then + on_rightclick_addendum(pos, node, clicker) + end + end, + + on_destruct = function(pos) + local players = minetest.get_connected_players() + for p=1, #players do + minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) + end + end, + mesecons = mesecons, + on_rotate = simple_rotate, +}) + +minetest.register_node("mcl_chests:"..basename.."_left", { + tiles = tiles_table.left, + paramtype = "light", + paramtype2 = "facedir", + groups = {handy=1,axey=1, container=5,not_in_creative_inventory=1, material_wood=1}, + drop = drop, + is_ground_content = false, + sounds = mcl_sounds.node_sound_wood_defaults(), + on_construct = function(pos) + local n = minetest.get_node(pos) + local param2 = n.param2 + local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") + if not p or minetest.get_node(p).name ~= "mcl_chests:"..canonical_basename.."_right" then + n.name = "mcl_chests:"..canonical_basename + minetest.swap_node(pos, n) + end + end, + on_destruct = function(pos) + local n = minetest.get_node(pos) + if n.name == "mcl_chests:"..basename then + return + end + + local players = minetest.get_connected_players() + for p=1, #players do + minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) + end + + local param2 = n.param2 + local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") + if not p or minetest.get_node(p).name ~= "mcl_chests:"..basename.."_right" then + return + end + for pl=1, #players do + minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..p.x.."_"..p.y.."_"..p.z) + end + minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 }) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + local meta2 = meta + meta:from_table(oldmetadata) + local inv = meta:get_inventory() + for i=1,inv:get_size("main") do + local stack = inv:get_stack("main", i) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end + meta:from_table(meta2:to_table()) + end, + allow_metadata_inventory_move = protection_check_move, + allow_metadata_inventory_take = protection_check_put_take, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + -- BEGIN OF LISTRING WORKAROUND + elseif listname == "input" then + local inv = minetest.get_inventory({type="node", pos=pos}) + if inv:room_for_item("main", stack) then + return -1 + else + local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "left") + local other_inv = minetest.get_inventory({type="node", pos=other_pos}) + if other_inv:room_for_item("main", stack) then + return -1 + else + return 0 + end + end + -- END OF LISTRING WORKAROUND + else + return stack:get_count() + end + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to chest at "..minetest.pos_to_string(pos)) + -- BEGIN OF LISTRING WORKAROUND + if listname == "input" then + local inv = minetest.get_inventory({type="node", pos=pos}) + local leftover = inv:add_item("main", stack) + if not leftover:is_empty() then + local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "left") + local other_inv = minetest.get_inventory({type="node", pos=other_pos}) + other_inv:add_item("main", leftover) + end + end + -- END OF LISTRING WORKAROUND + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from chest at "..minetest.pos_to_string(pos)) + end, + _mcl_blast_resistance = 2.5, + _mcl_hardness = 2.5, + + on_rightclick = function(pos, node, clicker) + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") + + minetest.show_formspec(clicker:get_player_name(), + "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, + "size[9,11.5]".. + "background[-0.19,-0.25;9.41,12.5;mcl_chests_inventory_chest_large.png]".. + mcl_vars.inventory_header.. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Large Chest"))).."]".. + "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. + "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,3.5;9,3;]".. + "label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,7.5;9,3;9]".. + "list[current_player;main;0,10.75;9,1;]".. + -- BEGIN OF LISTRING WORKAROUND + "listring[current_player;main]".. + "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";input]".. + -- END OF LISTRING WORKAROUND + "listring[current_player;main]".. + "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main]".. + "listring[current_player;main]".. + "listring[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main]") + + if on_rightclick_addendum_left then + on_rightclick_addendum_left(pos, node, clicker) + end + end, + mesecons = mesecons, + on_rotate = no_rotate, +}) + +minetest.register_node("mcl_chests:"..basename.."_right", { + tiles = tiles_table.right, + paramtype = "light", + paramtype2 = "facedir", + groups = {handy=1,axey=1, container=6,not_in_creative_inventory=1, material_wood=1}, + drop = drop, + is_ground_content = false, + sounds = mcl_sounds.node_sound_wood_defaults(), + on_construct = function(pos) + local n = minetest.get_node(pos) + local param2 = n.param2 + local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") + if not p or minetest.get_node(p).name ~= "mcl_chests:"..canonical_basename.."_left" then + n.name = "mcl_chests:"..canonical_basename + minetest.swap_node(pos, n) + end + end, + on_destruct = function(pos) + local n = minetest.get_node(pos) + if n.name == "mcl_chests:"..basename then + return + end + + local players = minetest.get_connected_players() + for p=1, #players do + minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) + end + + local param2 = n.param2 + local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") + if not p or minetest.get_node(p).name ~= "mcl_chests:"..basename.."_left" then + return + end + for pl=1, #players do + minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..p.x.."_"..p.y.."_"..p.z) + end + minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 }) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + local meta2 = meta + meta:from_table(oldmetadata) + local inv = meta:get_inventory() + for i=1,inv:get_size("main") do + local stack = inv:get_stack("main", i) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end + meta:from_table(meta2:to_table()) + end, + allow_metadata_inventory_move = protection_check_move, + allow_metadata_inventory_take = protection_check_put_take, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + -- BEGIN OF LISTRING WORKAROUND + elseif listname == "input" then + local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "right") + local other_inv = minetest.get_inventory({type="node", pos=other_pos}) + if other_inv:room_for_item("main", stack) then + return -1 + else + local inv = minetest.get_inventory({type="node", pos=pos}) + if inv:room_for_item("main", stack) then + return -1 + else + return 0 + end + end + -- END OF LISTRING WORKAROUND + else + return stack:get_count() + end + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to chest at "..minetest.pos_to_string(pos)) + -- BEGIN OF LISTRING WORKAROUND + if listname == "input" then + local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "right") + local other_inv = minetest.get_inventory({type="node", pos=other_pos}) + local leftover = other_inv:add_item("main", stack) + if not leftover:is_empty() then + local inv = minetest.get_inventory({type="node", pos=pos}) + inv:add_item("main", leftover) + end + end + -- END OF LISTRING WORKAROUND + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from chest at "..minetest.pos_to_string(pos)) + end, + _mcl_blast_resistance = 2.5, + _mcl_hardness = 2.5, + + on_rightclick = function(pos, node, clicker) + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") + + minetest.show_formspec(clicker:get_player_name(), + "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, + + "size[9,11.5]".. + "background[-0.19,-0.25;9.41,12.5;mcl_chests_inventory_chest_large.png]".. + mcl_vars.inventory_header.. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Large Chest"))).."]".. + "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,0.5;9,3;]".. + "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,3.5;9,3;]".. + "label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,7.5;9,3;9]".. + "list[current_player;main;0,10.75;9,1;]".. + -- BEGIN OF LISTRING WORKAROUND + "listring[current_player;main]".. + "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";input]".. + -- END OF LISTRING WORKAROUND + "listring[current_player;main]".. + "listring[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main]".. + "listring[current_player;main]".. + "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main]") + + if on_rightclick_addendum_right then + on_rightclick_addendum_right(pos, node, clicker) + end + end, + mesecons = mesecons, + on_rotate = no_rotate, +}) + +if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_chests:"..basename, "nodes", "mcl_chests:"..basename.."_left") + doc.add_entry_alias("nodes", "mcl_chests:"..basename, "nodes", "mcl_chests:"..basename.."_right") +end + +-- END OF register_chest FUNCTION BODY +end + +local chestusage = S("To access its inventory, rightclick it. When broken, the items will drop out.") + +register_chest("chest", + S("Chest"), + S("Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other."), + chestusage, + { + small = {"default_chest_top.png", "mcl_chests_chest_bottom.png", + "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", + "mcl_chests_chest_back.png", "default_chest_front.png"}, + left = {"default_chest_top_big.png", "default_chest_top_big.png", + "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", + "default_chest_side_big.png^[transformFX", "default_chest_front_big.png"}, + right = {"default_chest_top_big.png^[transformFX", "default_chest_top_big.png^[transformFX", + "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", + "default_chest_side_big.png", "default_chest_front_big.png^[transformFX"}, + }, + false +) + +local traptiles = { + small = {"mcl_chests_chest_trapped_top.png", "mcl_chests_chest_trapped_bottom.png", + "mcl_chests_chest_trapped_right.png", "mcl_chests_chest_trapped_left.png", + "mcl_chests_chest_trapped_back.png", "mcl_chests_chest_trapped_front.png"}, + left = {"mcl_chests_chest_trapped_top_big.png", "mcl_chests_chest_trapped_top_big.png", + "mcl_chests_chest_trapped_right.png", "mcl_chests_chest_trapped_left.png", + "mcl_chests_chest_trapped_side_big.png^[transformFX", "mcl_chests_chest_trapped_front_big.png"}, + right = {"mcl_chests_chest_trapped_top_big.png^[transformFX", "mcl_chests_chest_trapped_top_big.png^[transformFX", + "mcl_chests_chest_trapped_right.png", "mcl_chests_chest_trapped_left.png", + "mcl_chests_chest_trapped_side_big.png", "mcl_chests_chest_trapped_front_big.png^[transformFX"}, +} + +register_chest("trapped_chest", + S("Trapped Chest"), + S("A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other."), + chestusage, + traptiles, + nil, + {receptor = { + state = mesecon.state.off, + rules = trapped_chest_mesecons_rules, + }}, + function(pos, node, clicker) + minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on", param2 = node.param2}) + mesecon.receptor_on(pos, trapped_chest_mesecons_rules) + player_chest_open(clicker, pos) + end, + function(pos, node, clicker) + local meta = minetest.get_meta(pos) + meta:set_int("players", 1) + + minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2}) + mesecon.receptor_on(pos, trapped_chest_mesecons_rules) + + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") + minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_on_right", param2 = node.param2}) + mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules) + + player_chest_open(clicker, pos) + end, + function(pos, node, clicker) + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") + + minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_right", param2 = node.param2}) + mesecon.receptor_on(pos, trapped_chest_mesecons_rules) + + minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2}) + mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules) + + player_chest_open(clicker, pos) + end +) + +register_chest("trapped_chest_on", + nil, nil, nil, traptiles, true, + {receptor = { + state = mesecon.state.on, + rules = trapped_chest_mesecons_rules, + }}, + function(pos, node, clicker) + player_chest_open(clicker, pos) + end, + function(pos, node, clicker) + player_chest_open(clicker, pos) + end, + function(pos, node, clicker) + player_chest_open(clicker, pos) + end, + "trapped_chest", + "trapped_chest" +) + +local function close_if_trapped_chest(pos, player) + local node = minetest.get_node(pos) + + if node.name == "mcl_chests:trapped_chest_on" then + minetest.swap_node(pos, {name="mcl_chests:trapped_chest", param2 = node.param2}) + mesecon.receptor_off(pos, trapped_chest_mesecons_rules) + + player_chest_close(player) + elseif node.name == "mcl_chests:trapped_chest_on_left" then + minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) + mesecon.receptor_off(pos, trapped_chest_mesecons_rules) + + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") + minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) + mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) + + player_chest_close(player) + elseif node.name == "mcl_chests:trapped_chest_on_right" then + minetest.swap_node(pos, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) + mesecon.receptor_off(pos, trapped_chest_mesecons_rules) + + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") + minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) + mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) + + player_chest_close(player) + end +end + +-- Disable trapped chest when it has been closed +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname:find("mcl_chests:trapped_chest_") == 1 then + if fields.quit then + player_chest_close(player) + end + end +end) + +minetest.register_on_leaveplayer(function(player) + player_chest_close(player) +end) + +minetest.register_craft({ + output = 'mcl_chests:chest', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'group:wood', '', 'group:wood'}, + {'group:wood', 'group:wood', 'group:wood'}, + } +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'mcl_chests:chest', + burntime = 15 +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'mcl_chests:trapped_chest', + burntime = 15 +}) + +minetest.register_node("mcl_chests:ender_chest", { + description = S("Ender Chest"), + _doc_items_longdesc = S("Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players."), + _doc_items_usagehelp = S("Rightclick the ender chest to access your personal interdimensional inventory."), + tiles = {"mcl_chests_ender_chest_top.png", "mcl_chests_ender_chest_bottom.png", + "mcl_chests_ender_chest_right.png", "mcl_chests_ender_chest_left.png", + "mcl_chests_ender_chest_back.png", "mcl_chests_ender_chest_front.png"}, + -- Note: The “container” group is missing here because the ender chest does not + -- have an inventory on its own + groups = {pickaxey=1, deco_block=1, material_stone=1}, + is_ground_content = false, + paramtype = "light", + light_source = 7, + paramtype2 = "facedir", + sounds = mcl_sounds.node_sound_stone_defaults(), + drop = "mcl_core:obsidian 8", + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", + "size[9,8.75]".. + mcl_vars.inventory_header.. + "background[-0.19,-0.25;9.41,10.48;mcl_chests_inventory_chest.png]".. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Ender Chest"))).."]".. + "list[current_player;enderchest;0,0.5;9,3;]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + "list[current_player;main;0,7.74;9,1;]".. + "listring[current_player;enderchest]".. + "listring[current_player;main]") + end, + _mcl_blast_resistance = 3000, + _mcl_hardness = 22.5, + on_rotate = simple_rotate, +}) + +minetest.register_lbm({ + label = "Update ender chest + shulker box formspecs (0.51.0)", + name = "mcl_chests:update_formspecs_0_51_0", + nodenames = { "mcl_chests:ender_chest", "group:shulker_box" }, + action = function(pos, node) + minetest.registered_nodes[node.name].on_construct(pos) + minetest.log("action", "[mcl_chests] Node formspec updated at "..minetest.pos_to_string(pos)) + end, +}) + +minetest.register_on_joinplayer(function(player) + local inv = player:get_inventory() + inv:set_size("enderchest", 9*3) +end) + +minetest.register_craft({ + output = 'mcl_chests:ender_chest', + recipe = { + {'mcl_core:obsidian', 'mcl_core:obsidian', 'mcl_core:obsidian'}, + {'mcl_core:obsidian', 'mcl_end:ender_eye', 'mcl_core:obsidian'}, + {'mcl_core:obsidian', 'mcl_core:obsidian', 'mcl_core:obsidian'}, + } +}) + +-- Shulker boxes +local boxtypes = { + white = S("White Shulker Box"), + grey = S("Light Grey Shulker Box"), + orange = S("Orange Shulker Box"), + cyan = S("Cyan Shulker Box"), + magenta = S("Magenta Shulker Box"), + violet = S("Purple Shulker Box"), + lightblue = S("Light Blue Shulker Box"), + blue = S("Blue Shulker Box"), + yellow = S("Yellow Shulker Box"), + brown = S("Brown Shulker Box"), + green = S("Lime Shulker Box"), + dark_green = S("Green Shulker Box"), + pink = S("Pink Shulker Box"), + red = S("Red Shulker Box"), + dark_grey = S("Grey Shulker Box"), + black = S("Black Shulker Box"), +} + +local shulker_mob_textures = { + white = "mobs_mc_shulker_white.png", + grey = "mobs_mc_shulker_silver.png", + orange = "mobs_mc_shulker_orange.png", + cyan = "mobs_mc_shulker_cyan.png", + magenta = "mobs_mc_shulker_magenta.png", + violet = "mobs_mc_shulker_purple.png", + lightblue = "mobs_mc_shulker_light_blue.png", + blue = "mobs_mc_shulker_blue.png", + yellow = "mobs_mc_shulker_yellow.png", + brown = "mobs_mc_shulker_brown.png", + green = "mobs_mc_shulker_lime.png", + dark_green = "mobs_mc_shulker_green.png", + pink = "mobs_mc_shulker_pink.png", + red = "mobs_mc_shulker_red.png", + dark_grey = "mobs_mc_shulker_gray.png", + black = "mobs_mc_shulker_black.png", +} + +for color, desc in pairs(boxtypes) do + local mob_texture = shulker_mob_textures[color] + minetest.register_node("mcl_chests:"..color.."_shulker_box", { + description = desc, + _doc_items_longdesc = S("A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors."), + _doc_items_usagehelp = S("To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out."), + tiles = { + "mcl_chests_"..color.."_shulker_box_top.png", -- top + "[combine:16x16:-32,-28="..mob_texture, -- bottom + "[combine:16x16:0,-36="..mob_texture..":0,-16="..mob_texture, -- side + "[combine:16x16:-32,-36="..mob_texture..":-32,-16="..mob_texture, -- side + "[combine:16x16:-16,-36="..mob_texture..":-16,-16="..mob_texture, -- side + "[combine:16x16:-48,-36="..mob_texture..":-48,-16="..mob_texture, -- side + }, + groups = {handy=1,pickaxey=1, container=3, deco_block=1, dig_by_piston=1, shulker_box=1}, + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + stack_max = 1, + drop = "", + paramtype = "light", + paramtype2 = "facedir", +-- TODO: Make shulker boxes rotatable +-- This doesn't work, it just destroys the inventory: +-- on_place = minetest.rotate_node, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", + "size[9,8.75]".. + mcl_vars.inventory_header.. + "background[-0.19,-0.25;9.41,10.48;mcl_chests_inventory_chest.png]".. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Shulker Box"))).."]".. + "list[current_name;main;0,0.5;9,3;]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + "list[current_player;main;0,7.74;9,1;]".. + "listring[current_name;main]".. + "listring[current_player;main]") + local inv = meta:get_inventory() + inv:set_size("main", 9*3) + end, + _on_dispense = function(stack, pos, droppos, dropnode, dropdir) + -- Place shulker box as node + if minetest.registered_nodes[dropnode.name].buildable_to then + minetest.set_node(droppos, {name = stack:get_name(), param2 = minetest.dir_to_facedir(dropdir)}) + local imeta = stack:get_metadata() + local iinv_main = minetest.deserialize(imeta) + local ninv = minetest.get_inventory({type="node", pos=droppos}) + ninv:set_list("main", iinv_main) + stack:take_item() + end + return stack + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + local nmeta = minetest.get_meta(pos) + local ninv = nmeta:get_inventory() + local imeta = itemstack:get_metadata() + local iinv_main = minetest.deserialize(imeta) + ninv:set_list("main", iinv_main) + ninv:set_size("main", 9*3) + if minetest.settings:get_bool("creative_mode") then + if not ninv:is_empty("main") then + return nil + else + return itemstack + end + else + return nil + end + end, + on_destruct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local items = {} + for i=1, inv:get_size("main") do + local stack = inv:get_stack("main", i) + items[i] = stack:to_string() + end + local data = minetest.serialize(items) + local boxitem = ItemStack("mcl_chests:"..color.."_shulker_box") + boxitem:set_metadata(data) + + if minetest.settings:get_bool("creative_mode") then + if not inv:is_empty("main") then + minetest.add_item(pos, boxitem) + end + else + minetest.add_item(pos, boxitem) + end + end, + allow_metadata_inventory_move = protection_check_move, + allow_metadata_inventory_take = protection_check_put_take, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + -- Do not allow to place shulker boxes into shulker boxes + local group = minetest.get_item_group(stack:get_name(), "shulker_box") + if group == 0 or group == nil then + return stack:get_count() + else + return 0 + end + end, + _mcl_blast_resistance = 30, + _mcl_hardness = 6, + }) + + minetest.register_craft({ + type = "shapeless", + output = 'mcl_chests:'..color..'_shulker_box', + recipe = { 'group:shulker_box', 'mcl_dye:'..color } + }) +end + +minetest.register_craft({ + output = 'mcl_chests:violet_shulker_box', + recipe = { + {'mcl_mobitems:shulker_shell'}, + {'mcl_chests:chest'}, + {'mcl_mobitems:shulker_shell'}, + } +}) + +minetest.register_lbm({ + -- Disable active/open trapped chests when loaded because nobody could + -- have them open at loading time. + -- Fixes redstone weirdness. + label = "Disable active trapped chests", + name = "mcl_chests:reset_trapped_chests", + nodenames = { "mcl_chests:trapped_chest_on", "mcl_chests:trapped_chest_on_left", "mcl_chests:trapped_chest_on_right" }, + run_at_every_load = true, + action = function(pos, node) + minetest.log("error", "lbm!" ..minetest.pos_to_string(pos)) + chest_update_after_close(pos) + end, +}) From 5647fbf6e0a090d12264915b761861270b8c5b78 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 21 Mar 2019 20:13:35 +0100 Subject: [PATCH 239/379] Add German translation for mcl_cocoas --- mods/ITEMS/mcl_cocoas/init.lua | 12 ++++++------ mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.de.tr | 6 ++++++ mods/ITEMS/mcl_cocoas/locale/template.txt | 10 +++++----- 3 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.de.tr diff --git a/mods/ITEMS/mcl_cocoas/init.lua b/mods/ITEMS/mcl_cocoas/init.lua index cd780b917..ae9d5cf11 100644 --- a/mods/ITEMS/mcl_cocoas/init.lua +++ b/mods/ITEMS/mcl_cocoas/init.lua @@ -72,9 +72,9 @@ end --[[ TODO: Use a mesh for cocoas for perfect texture compability. ]] local crop_def = { - description = S("Premature Cocoa"), + description = S("Premature Cocoa Pod"), _doc_items_create_entry = true, - _doc_items_longdesc = S("Cocoas are plants which grow on the side of jungle trees in 3 stages."), + _doc_items_longdesc = S("Cocoa pods grow on the side of jungle trees in 3 stages."), drawtype = "nodebox", tiles = { "[combine:16x16:6,1=mcl_cocoas_cocoa_stage_0.png", "[combine:16x16:6,11=mcl_cocoas_cocoa_stage_0.png", @@ -117,7 +117,7 @@ local crop_def = { -- 2nd stage minetest.register_node("mcl_cocoas:cocoa_1", table.copy(crop_def)) -crop_def.description = S("Medium Cocoa") +crop_def.description = S("Medium Cocoa Pod") crop_def._doc_items_create_entry = false crop_def.groups.cocoa = 2 crop_def.tiles = { @@ -148,8 +148,8 @@ crop_def.selection_box = { minetest.register_node("mcl_cocoas:cocoa_2", table.copy(crop_def)) -- Final stage -crop_def.description = S("Mature Cocoa") -crop_def._doc_items_longdesc = S("A mature cocoa is a plant which grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.") +crop_def.description = S("Mature Cocoa Pod") +crop_def._doc_items_longdesc = S("A mature cocoa pod grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.") crop_def._doc_items_create_entry = true crop_def.groups.cocoa = 3 crop_def.tiles = { @@ -183,7 +183,7 @@ minetest.register_node("mcl_cocoas:cocoa_3", table.copy(crop_def)) minetest.register_abm({ - label = "Cocoa growth", + label = "Cocoa pod growth", nodenames = {"mcl_cocoas:cocoa_1", "mcl_cocoas:cocoa_2"}, -- Same as potatoes -- TODO: Tweak/balance the growth speed diff --git a/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.de.tr b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.de.tr new file mode 100644 index 000000000..479e3845e --- /dev/null +++ b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.de.tr @@ -0,0 +1,6 @@ +# textdomain: mcl_cocoas +Premature Cocoa Pod=Junge Kakaoschote +Cocoa pods grow on the side of jungle trees in 3 stages.=Kakaoschoten wachsen an der Seite von Dschungelbäumen in 3 Stufen. +Medium Cocoa Pod=Mittelgroße Kakaoschote +Mature Cocoa Pod=Ausgewachsene Kakaoschote +A mature cocoa pod grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.=Eine ausgewachsene Kakaoschote wuchs an einem Dschugelbaum zur vollen Größe heran. Sie ist erntereif und kann für Kakaobohnen geerntet werden. Sie wird nicht weiter wachsen. diff --git a/mods/ITEMS/mcl_cocoas/locale/template.txt b/mods/ITEMS/mcl_cocoas/locale/template.txt index ff9fb5889..f68318cae 100644 --- a/mods/ITEMS/mcl_cocoas/locale/template.txt +++ b/mods/ITEMS/mcl_cocoas/locale/template.txt @@ -1,6 +1,6 @@ # textdomain: mcl_cocoas -Premature Cocoa= -Cocoas are plants which grow on the side of jungle trees in 3 stages.= -Medium Cocoa= -Mature Cocoa= -A mature cocoa is a plant which grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.= +Premature Cocoa Pod= +Cocoa pods grow on the side of jungle trees in 3 stages.= +Medium Cocoa Pod= +Mature Cocoa Pod= +A mature cocoa pod grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.= From c49efcf9ade3223676af718e769191e1740711c5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 22 Mar 2019 11:20:34 +0100 Subject: [PATCH 240/379] Fix floating vines rarely generating in jungles --- mods/MAPGEN/mcl_mapgen_core/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index b537be2a0..7d3fbf21d 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1392,7 +1392,7 @@ local function generate_tree_decorations(minp, maxp, seed, data, param2_data, ar -- Pass 1: Generate cocoas at jungle trees for n = 1, #jungletree do - pos = jungletree[n] + pos = table.copy(jungletree[n]) treepos = table.copy(pos) if minetest.find_node_near(pos, 1, {"mcl_core:jungleleaves"}) then From c78b1d13548d68837db9a51b109a544c66394417 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 22 Mar 2019 22:02:23 +0100 Subject: [PATCH 241/379] Add missing translation for pumpkin usagehelp --- mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr | 1 + mods/ITEMS/mcl_farming/locale/template.txt | 1 + mods/ITEMS/mcl_farming/pumpkin.lua | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr index 4d05bf80f..90226967f 100644 --- a/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr +++ b/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr @@ -89,3 +89,4 @@ Cookie=Keks Bread=Brot Hay Bale=Heuballen Hay bales are decorative blocks made from wheat.=Heuballen sind dekorative Blöcke, die aus Weizen gemacht sind. +To carve a face into the pumpkin, use the shears on the side you want to carve.=Um ein Gesicht in den Kürbis zu schnitzen, benutzen Sie die Schere an der Seite, die Sie schnitzen wollen. diff --git a/mods/ITEMS/mcl_farming/locale/template.txt b/mods/ITEMS/mcl_farming/locale/template.txt index 089fd5069..81a52b010 100644 --- a/mods/ITEMS/mcl_farming/locale/template.txt +++ b/mods/ITEMS/mcl_farming/locale/template.txt @@ -89,3 +89,4 @@ Cookie= Bread= Hay Bale= Hay bales are decorative blocks made from wheat.= +To carve a face into the pumpkin, use the shears on the side you want to carve.= diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua index acab756ff..e40d267fb 100644 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ b/mods/ITEMS/mcl_farming/pumpkin.lua @@ -87,7 +87,7 @@ local stem_def = { local pumpkin_base_def = { description = S("Faceless Pumpkin"), _doc_items_longdesc = S("A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds."), - _doc_items_usagehelp = "To carve a face into the pumpkin, use the shears on the side you want to carve.", + _doc_items_usagehelp = S("To carve a face into the pumpkin, use the shears on the side you want to carve."), stack_max = 64, paramtype2 = "facedir", tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png"}, From 833f58ff4e190a565e0b508007bb3e4c2c33da43 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 22 Mar 2019 22:04:22 +0100 Subject: [PATCH 242/379] Fix incorrect usagehelp for pumpkin (with face) --- mods/ITEMS/mcl_farming/pumpkin.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua index e40d267fb..9050bdab7 100644 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ b/mods/ITEMS/mcl_farming/pumpkin.lua @@ -101,6 +101,7 @@ minetest.register_node("mcl_farming:pumpkin", pumpkin_base_def) local pumpkin_face_base_def = table.copy(pumpkin_base_def) pumpkin_face_base_def.description = S("Pumpkin") pumpkin_face_base_def._doc_items_longdesc = S("A pumpkin can be worn as a helmet for fun, but it doesn't offer any protection. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.") +pumpkin_face_base_def._doc_items_usagehelp = nil pumpkin_face_base_def.tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_face.png"} pumpkin_face_base_def.groups.armor_head=1 pumpkin_face_base_def.groups.non_combat_armor=1 From 1b24b02e319b1e550443318c212a71d7b2def2dd Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 23 Mar 2019 00:19:17 +0100 Subject: [PATCH 243/379] Bone meal grows flowers matching to biome --- mods/ITEMS/mcl_dye/init.lua | 43 +++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua index e90f51875..11a6f6570 100644 --- a/mods/ITEMS/mcl_dye/init.lua +++ b/mods/ITEMS/mcl_dye/init.lua @@ -82,6 +82,8 @@ dyelocal.dyes = { {"pink", "dye_pink", S("Pink Dye"), {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}}, } +local mg_name = minetest.get_mapgen_setting("mg_name") + dyelocal.unicolor_to_dye_id = {} for d=1, #dyelocal.dyes do for k, _ in pairs(dyelocal.dyes[d][4]) do @@ -125,10 +127,8 @@ end -- Bone Meal mcl_dye.apply_bone_meal = function(pointed_thing) - -- TODO: Only spawn flowers specific to the biome - -- Bone meal currently spawns all flowers found in the plains. - local flowers_table = { + local flowers_table_plains = { "mcl_flowers:dandelion", "mcl_flowers:dandelion", "mcl_flowers:poppy", @@ -139,15 +139,25 @@ mcl_dye.apply_bone_meal = function(pointed_thing) "mcl_flowers:tulip_white", "mcl_flowers:tulip_pink", "mcl_flowers:azure_bluet", - - -- Allium and blue orchid intentionally left out, - -- those must be found by the player. } - -- Special case for dry lands - local flowers_table_dry = { + local flowers_table_simple = { "mcl_flowers:dandelion", "mcl_flowers:poppy", } + local flowers_table_swampland = { + "mcl_flowers:blue_orchid", + } + local flowers_table_flower_forest = { + "mcl_flowers:dandelion", + "mcl_flowers:poppy", + "mcl_flowers:oxeye_daisy", + "mcl_flowers:tulip_orange", + "mcl_flowers:tulip_red", + "mcl_flowers:tulip_white", + "mcl_flowers:tulip_pink", + "mcl_flowers:azure_bluet", + "mcl_flowers:allium", + } local pos = pointed_thing.under local n = minetest.get_node(pos) @@ -248,11 +258,22 @@ mcl_dye.apply_bone_meal = function(pointed_thing) local col = minetest.registered_nodes[n2.name]._mcl_grass_palette_index minetest.add_node(pos, {name="mcl_flowers:tallgrass", param2=col}) else - if n2.name == "mcl_core:dirt_with_dry_grass" then - minetest.add_node(pos, {name=flowers_table_dry[math.random(1, #flowers_table_dry)]}) + local flowers_table + if mg_name == "v6" then + flowers_table = flowers_table_plains else - minetest.add_node(pos, {name=flowers_table[math.random(1, #flowers_table)]}) + local biome = minetest.get_biome_name(minetest.get_biome_data(pos).biome) + if biome == "Swampland" or biome == "Swampland_shore" or biome == "Swampland_ocean" or biome == "Swampland_deep_ocean" or biome == "Swampland_underground" then + flowers_table = flowers_table_swampland + elseif biome == "FlowerForest" or biome == "FlowerForest_beach" or biome == "FlowerForest_ocean" or biome == "FlowerForest_deep_ocean" or biome == "FlowerForest_underground" then + flowers_table = flowers_table_flower_forest + elseif biome == "Plains" or biome == "Plains_beach" or biome == "Plains_ocean" or biome == "Plains_deep_ocean" or biome == "Plains_underground" or biome == "SunflowerPlains" or biome == "SunflowerPlains_ocean" or biome == "SunflowerPlains_deep_ocean" or biome == "SunflowerPlains_underground" then + flowers_table = flowers_table_plains + else + flowers_table = flowers_table_simple + end end + minetest.add_node(pos, {name=flowers_table[math.random(1, #flowers_table)]}) end end end From a54abc7de9d033d040c342e0690b985823045d0f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 24 Mar 2019 08:03:50 +0100 Subject: [PATCH 244/379] Add translation for water/lava interactions --- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 8 +++++++- mods/ITEMS/mcl_core/locale/template.tr | 8 +++++++- mods/ITEMS/mcl_core/nodes_liquid.lua | 20 ++++++++++---------- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index b2c77e444..44d380707 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -56,7 +56,6 @@ Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It Chiseled Stone Bricks=Gemeißelte Steinziegel Chiseled Red Sandstone=Gemeißelter roter Sandstein Chiseled Sandstone=Gemeißelter Sandstein -Chiseled Stone Bricks=Gemeißelte Steinziegel Chiseled red sandstone is a decorative building block.=Gemeißelter roter Sandstein ist ein dekorativer Block zum Bauen. Chiseled sandstone is a decorative building block.=Gemeißelter Sandstein ist ein dekorativer Block zum Bauen. Clay=Ton @@ -238,3 +237,10 @@ When you hold a barrier in hand, you reveal all placed barriers in a short dista White Stained Glass=Weißes Buntglas Yellow Stained Glass=Gelbes Buntglas “Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.=„Kohle“ meint Kohleklumpen, die herausfallen, wenn Kohleerz gegraben wird, was im Untergrund gefunden werden kann. Kohle ist der klassische Brennstoff für den Ofen, aber er kann auch benutzt werden, um Fackeln, Kohleblöcke und einige andere Dinge herzustellen. +Water interacts with lava in various ways:=Wasser reagiert mit Lava auf unterschiedliche Arten: +• When water is directly above or horizontally next to a lava source, the lava turns into obsidian.=• Wenn sich Wasser direkt über oder horizontal neben einer Wasserquelle befindet, verwandelt sich die Lava zu Obsidian. +• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.=• Wenn fließendes Wasser fließende Lava von oben oder horizontal berührt, verwandelt sich die Lava zu Kopfsteinpflaster. +• When water is directly below lava, the water turns into stone.=• Wenn sich Wasser direkt unter Lava befindet, verwandelt sich das Wasser zu Stein. +Lava interacts with water various ways:=Lava reagiert mit Wasser auf verschiedene Arten: +• When a lava source is directly below or horizontally next to water, the lava turns into obsidian.=• Wenn sich eine Lavaquelle direkt unter oder horizontal neben Wasser befindet, verwandelt sich die Lava zu Obsidian. +• When lava is directly above water, the water turns into stone.=• Wenn sich Lava direkt über Wasser befindet, verwandelt sich das Wasser zu Stein. diff --git a/mods/ITEMS/mcl_core/locale/template.tr b/mods/ITEMS/mcl_core/locale/template.tr index 8976d3cfe..175107b74 100644 --- a/mods/ITEMS/mcl_core/locale/template.tr +++ b/mods/ITEMS/mcl_core/locale/template.tr @@ -56,7 +56,6 @@ Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It Chiseled Stone Bricks= Chiseled Red Sandstone= Chiseled Sandstone= -Chiseled Stone Bricks= Chiseled red sandstone is a decorative building block.= Chiseled sandstone is a decorative building block.= Clay= @@ -237,3 +236,10 @@ When you hold a barrier in hand, you reveal all placed barriers in a short dista White Stained Glass= Yellow Stained Glass= “Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.= +Water interacts with lava in various ways:= +• When water is directly above or horizontally next to a lava source, the lava turns into obsidian.= +• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.= +• When water is directly below lava, the water turns into stone.= +Lava interacts with water various ways:= +• When a lava source is directly below or horizontally next to water, the lava turns into obsidian.= +• When lava is directly above water, the water turns into stone.= diff --git a/mods/ITEMS/mcl_core/nodes_liquid.lua b/mods/ITEMS/mcl_core/nodes_liquid.lua index cdcae4b97..8910c389c 100644 --- a/mods/ITEMS/mcl_core/nodes_liquid.lua +++ b/mods/ITEMS/mcl_core/nodes_liquid.lua @@ -58,11 +58,11 @@ minetest.register_node("mcl_core:water_source", { description = S("Water Source"), _doc_items_entry_name = S("Water"), _doc_items_longdesc = -S("Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.").."\n".. -S([[Water interacts with lava in various ways: -• When water is directly above or horizontally next to a lava source, the lava turns into obsidian. -• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone. -• When water is directly below lava, the water turns into stone.]]), +S("Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.").."\n\n".. +S("Water interacts with lava in various ways:").."\n".. +S("• When water is directly above or horizontally next to a lava source, the lava turns into obsidian.").."\n".. +S("• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.").."\n".. +S("• When water is directly below lava, the water turns into stone."), _doc_items_hidden = false, drawtype = "liquid", tiles = { @@ -150,11 +150,11 @@ minetest.register_node("mcl_core:lava_source", { _doc_items_entry_name = "Lava", _doc_items_longdesc = S("Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.").."\n".. -S("A lava source sets fire to a couple of air blocks above when they're next to a flammable block.").."\n".. -S([[Lava interacts with water various ways: -• When a lava source is directly below or horizontally next to water, the lava turns into obsidian. -• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone. -• When lava is directly above water, the water turns into stone.]]), +S("A lava source sets fire to a couple of air blocks above when they're next to a flammable block.").."\n\n".. +S("Lava interacts with water various ways:").."\n".. +S("• When a lava source is directly below or horizontally next to water, the lava turns into obsidian.").."\n".. +S("• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.").."\n".. +S("• When lava is directly above water, the water turns into stone."), drawtype = "liquid", tiles = { {name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}} From 7df5ef097c4b61b5691f1623a69077e9272e20f2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 24 Mar 2019 08:06:08 +0100 Subject: [PATCH 245/379] Translate river water --- mods/ITEMS/mclx_core/locale/mclx_core.de.tr | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 mods/ITEMS/mclx_core/locale/mclx_core.de.tr diff --git a/mods/ITEMS/mclx_core/locale/mclx_core.de.tr b/mods/ITEMS/mclx_core/locale/mclx_core.de.tr new file mode 100644 index 000000000..f4591810c --- /dev/null +++ b/mods/ITEMS/mclx_core/locale/mclx_core.de.tr @@ -0,0 +1,5 @@ +# textdomain: mclx_core +River Water Source=Flusswasserquelle +River water has the same properties as water, but has a reduced flowing distance and is not renewable.=Flusswasser hat die gleichen Eigenschaften wie Wasser, aber es hat eine reduzierte Fließweite und ist nicht erneuerbar. +River Water=Flusswasser +Flowing River Water=Fließendes Flusswasser From ea23f05c22b4ba2d9573b945df91434bb31b8fae Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 24 Mar 2019 08:16:04 +0100 Subject: [PATCH 246/379] Add missing translations for huge mushroom blocks --- mods/ITEMS/mcl_mushrooms/huge.lua | 2 +- mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.de.tr | 7 ++++--- mods/ITEMS/mcl_mushrooms/locale/template.txt | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_mushrooms/huge.lua b/mods/ITEMS/mcl_mushrooms/huge.lua index 8355ffcc9..54e719a5d 100644 --- a/mods/ITEMS/mcl_mushrooms/huge.lua +++ b/mods/ITEMS/mcl_mushrooms/huge.lua @@ -69,7 +69,7 @@ local register_mushroom = function(color, species_id, template, d_cap, d_stem, d -- All-faces cap. This block is exposed to the player block.description = d_cap block._doc_items_longdesc = longdesc_cap - block._doc_items_uagehelp = "By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently." + block._doc_items_usagehelp = S("By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently.") block.tiles = { "mcl_mushrooms_mushroom_block_skin_"..color..".png" } block.on_construct = function(pos) diff --git a/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.de.tr b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.de.tr index 442b46fca..8402e280a 100644 --- a/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.de.tr +++ b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.de.tr @@ -5,13 +5,13 @@ The stem part of a huge red mushroom.=Der Stängelteil eines roten Riesenpilzes. Huge Red Mushroom Block=Roter Riesenpilzblock Huge Red Mushroom Stem=Roter Riesenpilzstängel Huge Red Mushroom All-Faces Stem=Roter allseitiger Riesenpilzstängel -Huge brown mushroom blocks are the cap parts of huge red mushrooms. It consists of a brown skin and can have pores on each of its sides.=Braune Riesenpilzblöcke sind die Kappenteile von braunen Riesenpilzen. Sie bestehen aus einer braunen Haut und können Poren an jede ihrer Seiten haben. +Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides.=Braune Riesenpilzblöcke sind die Kappenteile von braunen Riesenpilzen. Sie bestehen aus einer braunen Haut und können Poren an jede ihrer Seiten haben. The stem part of a huge brown mushroom.=Der Stängelteil eines braunen Riesenpilzes. Huge Brown Mushroom Block=Brauner Riesenpilzblock Huge Brown Mushroom Stem=Brauner Riesenpilzstängel Huge Brown Mushroom All-Faces Stem=Brauner allseitiger Riesenpilzstängel -Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Braune Pilze wachsen und breiten sich in der Dunkelheit aus, aber sie sind Lichtempfindlich. Als solche sind sie ungenießbar, aber sie können benutzt werden, um Lebensmittel herzustellen. -Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Rote Pilze wachsen und breiten sich in der Dunkelheit aus, aber sie sind Lichtempfindlich. Als solche sind sie ungenießbar, aber sie können benutzt werden, um Lebensmittel herzustellen. +Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Braune Pilze wachsen und breiten sich in der Dunkelheit aus, aber sie sind lichtempfindlich. Als solche sind sie ungenießbar, aber sie können benutzt werden, um Lebensmittel herzustellen. +Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Rote Pilze wachsen und breiten sich in der Dunkelheit aus, aber sie sind lichtempfindlich. Als solche sind sie ungenießbar, aber sie können benutzt werden, um Lebensmittel herzustellen. A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom.=Ein einzelner Pilz dieser Art wird sich im Laufe der Zeit zu einem zufälligen festem undurchsichtigem Block mit einer Lichtstärke von 12 oder weniger in einem 3×3×3-Würfel um den Pilz hin ausbreiten. Er wird sich nicht weiter ausbreiten, wenn sich 5 oder mehr Pilze der gleichen Art innerhalb eines Bereichs von 9×3×9 Blöcken um den Pilz befinden. Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.=Pilze werden sich bei einer Lichtstärke von mindestens 12 irgendwann selbst entwurzeln. Auf Myzel oder Podsol überleben sie und breiten sich bei jeder Lichtstärke aus. This mushroom can be placed on mycelium and podzol at any light level. It can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.=Diser Pilz kann auf Myzel und Podsol in jeder Lichtstärke platziert werden. Er kann auch auf Blöcken platziert werden, die sowohl fest als auch undurchsichtig sind, solange die Lichtstärke des Tageslichts nicht höher als 12 ist. @@ -19,3 +19,4 @@ Brown Mushroom=Brauner Pilz Red Mushroom=Roter Pilz Mushroom Stew=Pilzsuppe Mushroom stew is a healthy soup which can be consumed to restore some hunger points.=Pilzsuppe ist eine gesunde Suppe, die für ein paar Hungerpunkte konsumiert werden kann. +By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently.=Wenn Riesenpilzblöcke der selben Art nebeneinander platziert werden, werden sich die Seiten, die sich berühren, dauerhaft zu Poren verwandeln. diff --git a/mods/ITEMS/mcl_mushrooms/locale/template.txt b/mods/ITEMS/mcl_mushrooms/locale/template.txt index 2c4c3ba63..cbd1f600a 100644 --- a/mods/ITEMS/mcl_mushrooms/locale/template.txt +++ b/mods/ITEMS/mcl_mushrooms/locale/template.txt @@ -19,3 +19,4 @@ Brown Mushroom= Red Mushroom= Mushroom Stew= Mushroom stew is a healthy soup which can be consumed to restore some hunger points.= +By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently.= From 8636b94c74ba73eac45c3a1d9cf159c04e95feec Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 24 Mar 2019 08:55:42 +0100 Subject: [PATCH 247/379] Squash help entries of colorblocks --- mods/ITEMS/mcl_colorblocks/depends.txt | 1 + mods/ITEMS/mcl_colorblocks/init.lua | 42 ++++++++++++++++--- .../locale/mcl_colorblocks.de.tr | 6 ++- .../ITEMS/mcl_colorblocks/locale/template.txt | 4 ++ mods/ITEMS/mclx_stairs/depends.txt | 1 + mods/ITEMS/mclx_stairs/init.lua | 18 ++++++++ .../mclx_stairs/locale/mclx_stairs.de.tr | 3 ++ mods/ITEMS/mclx_stairs/locale/template.txt | 3 ++ 8 files changed, 72 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_colorblocks/depends.txt b/mods/ITEMS/mcl_colorblocks/depends.txt index 7f3fdc37e..c9db3b289 100644 --- a/mods/ITEMS/mcl_colorblocks/depends.txt +++ b/mods/ITEMS/mcl_colorblocks/depends.txt @@ -1,4 +1,5 @@ mcl_core mcl_sounds mcl_dye +doc? screwdriver? diff --git a/mods/ITEMS/mcl_colorblocks/init.lua b/mods/ITEMS/mcl_colorblocks/init.lua index a4471fe47..15c12ab37 100644 --- a/mods/ITEMS/mcl_colorblocks/init.lua +++ b/mods/ITEMS/mcl_colorblocks/init.lua @@ -1,5 +1,6 @@ local init = os.clock() local S = minetest.get_translator("mcl_colorblocks") +local doc_mod = minetest.get_modpath("doc") local block = {} @@ -21,6 +22,7 @@ block.dyes = { {"lime", S("Lime Terracotta"), S("Lime Glazed Terracotta"), S("Lime Concrete Powder"), S("Lime Concrete"), "green"}, {"light_blue", S("Light Blue Terracotta"), S("Light Blue Glazed Terracotta"), S("Light Blue Concrete Powder"), S("Light Blue Concrete"), "lightblue"}, } +local canonical_color = "yellow" local hc_desc = S("Terracotta is a basic building material. It comes in many different colors.") local gt_desc = S("Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.") @@ -52,15 +54,33 @@ end for _, row in ipairs(block.dyes) do local name = row[1] + local is_canonical = name == canonical_color local sdesc_hc = row[2] local sdesc_gt = row[3] local sdesc_cp = row[4] local sdesc_c = row[5] + local ldesc_hc, ldesc_gt, ldesc_cp, ldesc_c + local create_entry + local ename_hc, ename_gt, ename_cp, ename_c + if is_canonical then + ldesc_hc = hc_desc + ldesc_gt = gt_desc + ldesc_cp = cp_desc + ldesc_c = c_desc + ename_hc = S("Colored Terracotta") + ename_gt = S("Glazed Terracotta") + ename_cp = S("Concrete Powder") + ename_c = S("Concrete") + else + create_entry = false + end local craft_color_group = row[6] -- Node Definition minetest.register_node("mcl_colorblocks:hardened_clay_"..name, { description = sdesc_hc, - _doc_items_longdesc = hc_desc, + _doc_items_longdesc = ldesc_hc, + _doc_items_create_entry = create_entry, + _doc_items_entry_name = ename_hc, tiles = {"hardened_clay_stained_"..name..".png"}, groups = {pickaxey=1, hardened_clay=1,building_block=1, material_stone=1}, stack_max = 64, @@ -71,7 +91,9 @@ for _, row in ipairs(block.dyes) do minetest.register_node("mcl_colorblocks:concrete_powder_"..name, { description = sdesc_cp, - _doc_items_longdesc = cp_desc, + _doc_items_longdesc = ldesc_cp, + _doc_items_create_entry = create_entry, + _doc_items_entry_name = ename_cp, tiles = {"mcl_colorblocks_concrete_powder_"..name..".png"}, groups = {handy=1,shovely=1, concrete_powder=1,building_block=1,falling_node=1, material_sand=1}, stack_max = 64, @@ -109,7 +131,9 @@ for _, row in ipairs(block.dyes) do minetest.register_node("mcl_colorblocks:concrete_"..name, { description = sdesc_c, - _doc_items_longdesc = c_desc, + _doc_items_longdesc = ldesc_c, + _doc_items_create_entry = create_entry, + _doc_items_entry_name = ename_c, tiles = {"mcl_colorblocks_concrete_"..name..".png"}, groups = {handy=1,pickaxey=1, concrete=1,building_block=1, material_stone=1}, stack_max = 64, @@ -123,7 +147,9 @@ for _, row in ipairs(block.dyes) do local texes = { tex, tex, tex.."^[transformR180", tex, tex.."^[transformR270", tex.."^[transformR90" } minetest.register_node("mcl_colorblocks:glazed_terracotta_"..name, { description = sdesc_gt, - _doc_items_longdesc = gt_desc, + _doc_items_longdesc = ldesc_gt, + _doc_items_create_entry = create_entry, + _doc_items_entry_name = ename_gt, tiles = texes, groups = {handy=1,pickaxey=1, glazed_terracotta=1,building_block=1, material_stone=1}, paramtype2 = "facedir", @@ -135,6 +161,13 @@ for _, row in ipairs(block.dyes) do on_rotate = on_rotate, }) + if not is_canonical and doc_mod then + doc.add_entry_alias("nodes", "mcl_colorblocks:hardened_clay_"..canonical_color, "nodes", "mcl_colorblocks:hardened_clay_"..name) + doc.add_entry_alias("nodes", "mcl_colorblocks:glazed_terracotta_"..canonical_color, "nodes", "mcl_colorblocks:glazed_terracotta_"..name) + doc.add_entry_alias("nodes", "mcl_colorblocks:concrete_"..canonical_color, "nodes", "mcl_colorblocks:concrete_"..name) + doc.add_entry_alias("nodes", "mcl_colorblocks:concrete_powder_"..canonical_color, "nodes", "mcl_colorblocks:concrete_powder_"..name) + end + -- Crafting recipes if craft_color_group then minetest.register_craft({ @@ -184,4 +217,3 @@ minetest.register_abm({ local time_to_load= os.clock() - init print(string.format("[MOD] "..minetest.get_current_modname().." loaded in %.4f s", time_to_load)) - diff --git a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr index 372bd3462..f0d771970 100644 --- a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr +++ b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr @@ -68,4 +68,8 @@ Glazed terracotta is a decorative block with a complex pattern. It can be rotate Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=Betonpulver wird benutzt, um Beton herzustellen, aber es kann auch selbst als Dekoration benutzt werden. Es kommt in verschiedenen Farben daher. Betonpulver verwandelt sich in Beton der selben Farbe, wenn es mit Wasser in Berührung kommt. Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.=Beton ist ein dekorativer Block, der in verschiedenen Farben daherkommt. Er hat eine besonders kräftige und klare Farbe. Terracotta=Terrakotta -Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.=Terrakotta ist ein Baumaterial, welches in vielen verschiedenen Farben vorkommt. Dieser Block ist farblos. +Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.=Terrakotta ist ein Baumaterial, welches in vielen verschiedenen Farben vorkommt. Diese Variante ist ungefärbt. +Colored Terracotta=Gefärbte Terrakotta +Glazed Terracotta=Glasierte Terrakotta +Concrete Powder=Betonpulver +Concrete=Beton diff --git a/mods/ITEMS/mcl_colorblocks/locale/template.txt b/mods/ITEMS/mcl_colorblocks/locale/template.txt index 2736a54bd..f20c7965c 100644 --- a/mods/ITEMS/mcl_colorblocks/locale/template.txt +++ b/mods/ITEMS/mcl_colorblocks/locale/template.txt @@ -69,3 +69,7 @@ Concrete powder is used for creating concrete, but it can also be used as decora Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.= Terracotta= Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.= +Colored Terracotta= +Glazed Terracotta= +Concrete Powder= +Concrete= diff --git a/mods/ITEMS/mclx_stairs/depends.txt b/mods/ITEMS/mclx_stairs/depends.txt index 89eb864a6..49805c174 100644 --- a/mods/ITEMS/mclx_stairs/depends.txt +++ b/mods/ITEMS/mclx_stairs/depends.txt @@ -5,3 +5,4 @@ mcl_nether mcl_end mcl_colorblocks mcl_stairs +doc? diff --git a/mods/ITEMS/mclx_stairs/init.lua b/mods/ITEMS/mclx_stairs/init.lua index 70ffdc33c..d43fa9c51 100644 --- a/mods/ITEMS/mclx_stairs/init.lua +++ b/mods/ITEMS/mclx_stairs/init.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("mclx_stairs") +local doc_mod = minetest.get_modpath("doc") mcl_stairs.register_stair_and_slab_simple("tree_bark", "mcl_core:tree_bark", S("Oak Bark Stairs"), S("Oak Bark Slab"), S("Double Oak Bark Slab"), "woodlike") mcl_stairs.register_stair_and_slab_simple("acaciatree_bark", "mcl_core:acaciatree_bark", S("Acacia Bark Stairs"), S("Acacia Bark Slab"), S("Double Acacia Bark Slab"), "woodlike") @@ -47,12 +48,29 @@ block.dyes = { {"lime", S("Lime Concrete Stairs"), S("Lime Concrete Slab"), S("Double Lime Concrete Slab"), "green"}, {"light_blue", S("Light Blue Concrete Stairs"), S("Light Blue Concrete Slab"), S("Double Light Blue Concrete Slab"), "lightblue"}, } +local canonical_color = "yellow" for i=1, #block.dyes do local c = block.dyes[i][1] + local is_canonical = c == canonical_color mcl_stairs.register_stair_and_slab_simple("concrete_"..c, "mcl_colorblocks:concrete_"..c, block.dyes[i][2], block.dyes[i][3], block.dyes[i][4]) + + if doc_mod then + if not is_canonical then + doc.add_entry_alias("nodes", "mcl_stairs:slab_concrete_"..canonical_color, "nodes", "mcl_stairs:slab_concrete_"..c) + doc.add_entry_alias("nodes", "mcl_stairs:slab_concrete_"..canonical_color.."_double", "nodes", "mcl_stairs:slab_concrete_"..c.."_double") + doc.add_entry_alias("nodes", "mcl_stairs:stair_concrete_"..canonical_color, "nodes", "mcl_stairs:stair_concrete_"..c) + minetest.override_item("mcl_stairs:slab_concrete_"..c, { _doc_items_create_entry = false }) + minetest.override_item("mcl_stairs:slab_concrete_"..c.."_double", { _doc_items_create_entry = false }) + minetest.override_item("mcl_stairs:stair_concrete_"..c, { _doc_items_create_entry = false }) + else + minetest.override_item("mcl_stairs:slab_concrete_"..c, { _doc_items_entry_name = S("Concrete Slab") }) + minetest.override_item("mcl_stairs:slab_concrete_"..c.."_double", { _doc_items_entry_name = S("Double Concrete Slab") }) + minetest.override_item("mcl_stairs:stair_concrete_"..c, { _doc_items_entry_name = S("Concrete Stairs") }) + end + end end diff --git a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr index a9973c77f..c6f9f65d7 100644 --- a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr +++ b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr @@ -77,3 +77,6 @@ Double Lime Concrete Slab=Doppelte Betonplatte Light Blue Concrete Stairs=Hellblaue Betontreppe Light Blue Concrete Slab=Hellblaue Betonplatte Double Light Blue Concrete Slab=Doppelte hellblaue Betonplatte +Concrete Slab=Betonplatte +Double Concrete Slab=Doppelte Betonplatte +Concrete Stairs=Betontreppe diff --git a/mods/ITEMS/mclx_stairs/locale/template.txt b/mods/ITEMS/mclx_stairs/locale/template.txt index fcadd57ec..b6272dbcf 100644 --- a/mods/ITEMS/mclx_stairs/locale/template.txt +++ b/mods/ITEMS/mclx_stairs/locale/template.txt @@ -77,3 +77,6 @@ Double Lime Concrete Slab= Light Blue Concrete Stairs= Light Blue Concrete Slab= Double Light Blue Concrete Slab= +Concrete Slab= +Double Concrete Slab= +Concrete Stairs= From 423d5f8ab85b9fd8d2b905c82321749d1e2d1ca1 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 24 Mar 2019 09:06:35 +0100 Subject: [PATCH 248/379] Squash help entries of beds --- mods/ITEMS/mcl_beds/api.lua | 2 ++ mods/ITEMS/mcl_beds/beds.lua | 17 +++++++++++++++++ mods/ITEMS/mcl_beds/depends.txt | 1 + mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr | 1 + mods/ITEMS/mcl_beds/locale/template.txt | 1 + 5 files changed, 22 insertions(+) diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index 7d76b76eb..777fa2225 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -66,6 +66,8 @@ function mcl_beds.register_bed(name, def) description = def.description, _doc_items_longdesc = def._doc_items_longdesc or beddesc, _doc_items_usagehelp = def._doc_items_usagehelp or beduse, + _doc_items_create_entry = def._doc_items_create_entry, + _doc_items_entry_name = def._doc_items_entry_name, inventory_image = def.inventory_image, wield_image = def.wield_image, drawtype = "nodebox", diff --git a/mods/ITEMS/mcl_beds/beds.lua b/mods/ITEMS/mcl_beds/beds.lua index 6ac2071e5..8f41c7a3f 100644 --- a/mods/ITEMS/mcl_beds/beds.lua +++ b/mods/ITEMS/mcl_beds/beds.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("mcl_beds") +local mod_doc = minetest.get_modpath("doc") local nodebox = { bottom = { @@ -32,9 +33,11 @@ local colors = { { "light_blue", S("Light Blue Bed"), "mcl_wool:light_blue", "mcl_dye:lightblue" }, { "white", S("White Bed"), "mcl_wool:white", "mcl_dye:white" }, } +local canonical_color = "red" for c=1, #colors do local colorid = colors[c][1] + local is_canonical = colorid == canonical_color -- Recoloring recipe for white bed if minetest.get_modpath("mcl_dye") then @@ -54,9 +57,19 @@ for c=1, #colors do } end + local entry_name, create_entry + if mod_doc then + if is_canonical then + entry_name = S("Bed") + else + create_entry = false + end + end -- Register bed mcl_beds.register_bed("mcl_beds:bed_"..colorid, { description = colors[c][2], + _doc_items_entry_name = entry_name, + _doc_items_create_entry = create_entry, inventory_image = "mcl_beds_bed_"..colorid..".png", wield_image = "mcl_beds_bed_"..colorid..".png", tiles = { @@ -89,6 +102,10 @@ for c=1, #colors do }, recipe = main_recipe, }) + if mod_doc and not is_canonical then + doc.add_entry_alias("nodes", "mcl_beds:bed_"..canonical_color.."_bottom", "nodes", "mcl_beds:bed_"..colorid.."_bottom") + doc.add_entry_alias("nodes", "mcl_beds:bed_"..canonical_color.."_bottom", "nodes", "mcl_beds:bed_"..colorid.."_top") + end end diff --git a/mods/ITEMS/mcl_beds/depends.txt b/mods/ITEMS/mcl_beds/depends.txt index 3285e5914..34e12adc5 100644 --- a/mods/ITEMS/mcl_beds/depends.txt +++ b/mods/ITEMS/mcl_beds/depends.txt @@ -6,3 +6,4 @@ mcl_dye? mcl_tnt? mcl_weather? mcl_spawn? +doc? diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr index bcf26fc3e..079951c8d 100644 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr @@ -5,6 +5,7 @@ You have heard of other worlds in which a bed would set the start point for your By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.=Indem Sie ein Bett benutzen, setzen Sie den Startpunkt Ihres nächsten Lebens. Wenn Sie sterben, werden Sie Ihr nächstes Leben auf diesem Bett beginnen, es sei denn, es ist blockiert oder zerstört. In this world, going to bed won't skip the night, but it will skip thunderstorms.=In dieser Welt können mit dem Bett Nächte nicht übersprungen werden, nur Gewitterstürme. Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=Mit Schlaf können Sie die Nacht überspringen. Die Nacht wird übersprungen, wenn alle Spieler in dieser Welt sich schlafen gelegt haben. Die Nacht wird dann nach ein paar Sekunden übersprungen. Gewitterstürme werden auf die gleiche Weise übersprungen. +Bed=Bett Red Bed=Rotes Bett Blue Bed=Blaues Bett Cyan Bed=Türkises Bett diff --git a/mods/ITEMS/mcl_beds/locale/template.txt b/mods/ITEMS/mcl_beds/locale/template.txt index 0cba8424f..9664c8001 100644 --- a/mods/ITEMS/mcl_beds/locale/template.txt +++ b/mods/ITEMS/mcl_beds/locale/template.txt @@ -5,6 +5,7 @@ You have heard of other worlds in which a bed would set the start point for your By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.= In this world, going to bed won't skip the night, but it will skip thunderstorms.= Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.= +Bed= Red Bed= Blue Bed= Cyan Bed= From 5caa4b365946cb5b2b2a9c2de608da40ec94c0d7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 24 Mar 2019 09:07:42 +0100 Subject: [PATCH 249/379] Fix bed help WRT Minetest settings --- mods/ITEMS/mcl_beds/api.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index 777fa2225..39a80e316 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -35,12 +35,12 @@ end local beddesc = S("Beds allow you to sleep at night and make the time pass faster.") local beduse = S("To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.") -if true or minetest.settings:get_bool("enable_bed_respawn") == false then +if minetest.settings:get_bool("enable_bed_respawn") == false then beddesc = beddesc .. "\n" .. S("You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.") else beddesc = beddesc .. "\n" .. S("By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.") end -if true or minetest.settings:get_bool("enable_bed_night_skip") == false then +if minetest.settings:get_bool("enable_bed_night_skip") == false then beddesc = beddesc .. "\n" .. S("In this world, going to bed won't skip the night, but it will skip thunderstorms.") else beddesc = beddesc .. "\n" .. S("Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.") From 3a5df885e9da3abf01befd5bce7ec88c2bb8f1d0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 24 Mar 2019 09:23:26 +0100 Subject: [PATCH 250/379] Squash help entries for wool and carpet --- mods/ITEMS/mcl_wool/depends.txt | 1 + mods/ITEMS/mcl_wool/init.lua | 27 +++++++++++++++++++++-- mods/ITEMS/mcl_wool/locale/mcl_wool.de.tr | 2 ++ mods/ITEMS/mcl_wool/locale/template.txt | 2 ++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_wool/depends.txt b/mods/ITEMS/mcl_wool/depends.txt index 3d96266de..9699080ad 100644 --- a/mods/ITEMS/mcl_wool/depends.txt +++ b/mods/ITEMS/mcl_wool/depends.txt @@ -1 +1,2 @@ mcl_sounds +doc? diff --git a/mods/ITEMS/mcl_wool/init.lua b/mods/ITEMS/mcl_wool/init.lua index 40c2340b9..912a6ccd1 100644 --- a/mods/ITEMS/mcl_wool/init.lua +++ b/mods/ITEMS/mcl_wool/init.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("mcl_wool") +local mod_doc = minetest.get_modpath("doc") -- minetest/wool/init.lua @@ -29,6 +30,7 @@ wool.dyes = { {"lime", "mcl_wool_lime", S("Lime Wool"), S("Lime Carpet"), "green", "basecolor_green"}, {"light_blue", "mcl_wool_light_blue", S("Light Blue Wool"), S("Light Blue Carpet"), "lightblue", "unicolor_light_blue"}, } +local canonical_color = "white" for _, row in ipairs(wool.dyes) do local name = row[1] @@ -37,10 +39,24 @@ for _, row in ipairs(wool.dyes) do local desc_carpet = row[4] local dye = row[5] local color_group = row[6] + local longdesc_wool, longdesc_carpet, create_entry, name_wool, name_carpet + local is_canonical = name == canonical_color + if mod_doc then + if is_canonical then + longdesc_wool = S("Wool is a decorative block which comes in many different colors.") + longdesc_carpet = S("Carpets are thin floor covers which come in many different colors.") + name_wool = S("Wool") + name_carpet = S("Carpet") + else + create_entry = false + end + end -- Node Definition minetest.register_node("mcl_wool:"..name, { description = desc_wool, - _doc_items_longdesc = S("Wool is a decorative block which comes in many different colors."), + _doc_items_create_entry = create_entry, + _doc_items_entry_name = name_wool, + _doc_items_longdesc = longdesc_wool, stack_max = 64, is_ground_content = false, tiles = {texture..".png"}, @@ -51,7 +67,10 @@ for _, row in ipairs(wool.dyes) do }) minetest.register_node("mcl_wool:"..name.."_carpet", { description = desc_carpet, - _doc_items_longdesc = S("Carpets are thin floor covers which come in many different colors."), + _doc_items_create_entry = create_entry, + _doc_items_entry_name = name_carpet, + _doc_items_longdesc = longdesc_carpet, + walkable = false, -- See is_ground_content = false, tiles = {texture..".png"}, @@ -72,6 +91,10 @@ for _, row in ipairs(wool.dyes) do _mcl_hardness = 0.1, _mcl_blast_resistance = 0.5, }) + if mod_doc and not is_canonical then + doc.add_entry_alias("nodes", "mcl_wool:"..canonical_color, "nodes", "mcl_wool:"..name) + doc.add_entry_alias("nodes", "mcl_wool:"..canonical_color.."_carpet", "nodes", "mcl_wool:"..name.."_carpet") + end if dye then -- Crafting from dye and white wool minetest.register_craft({ diff --git a/mods/ITEMS/mcl_wool/locale/mcl_wool.de.tr b/mods/ITEMS/mcl_wool/locale/mcl_wool.de.tr index de758d1e0..5b979d51b 100644 --- a/mods/ITEMS/mcl_wool/locale/mcl_wool.de.tr +++ b/mods/ITEMS/mcl_wool/locale/mcl_wool.de.tr @@ -1,4 +1,6 @@ # textdomain: mcl_wool +Wool=Wolle +Carpet=Teppich White Wool=Weiße Wolle White Carpet=Weißer Teppich Grey Wool=Graue Wolle diff --git a/mods/ITEMS/mcl_wool/locale/template.txt b/mods/ITEMS/mcl_wool/locale/template.txt index 0358fb503..26de1ec7a 100644 --- a/mods/ITEMS/mcl_wool/locale/template.txt +++ b/mods/ITEMS/mcl_wool/locale/template.txt @@ -1,4 +1,6 @@ # textdomain: mcl_wool +Wool= +Carpet= White Wool= White Carpet= Grey Wool= From 25048050a0c8e82c85e075f5305da8e340f19495 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 24 Mar 2019 09:23:56 +0100 Subject: [PATCH 251/379] Remove dead code in mcl_chests --- mods/ITEMS/mcl_chests/init_new.lua | 878 ----------------------------- 1 file changed, 878 deletions(-) delete mode 100644 mods/ITEMS/mcl_chests/init_new.lua diff --git a/mods/ITEMS/mcl_chests/init_new.lua b/mods/ITEMS/mcl_chests/init_new.lua deleted file mode 100644 index 496740b5b..000000000 --- a/mods/ITEMS/mcl_chests/init_new.lua +++ /dev/null @@ -1,878 +0,0 @@ -local S = minetest.get_translator("mcl_chests") - -local no_rotate, simple_rotate -if minetest.get_modpath("screwdriver") then - no_rotate = screwdriver.disallow - simple_rotate = screwdriver.rotate_simple -end - ---[[ List of open chests. -Key: Player name -Value: - If player is using a chest: { pos = } - Otherwise: nil ]] -local open_chests = {} --- To be called if a player opened a chest -local player_chest_open = function(player, pos) - open_chests[player:get_player_name()] = { pos = pos } -end - --- Simple protection checking functions -local protection_check_move = function(pos, from_list, from_index, to_list, to_index, count, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - else - return count - end -end -local protection_check_put_take = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - else - return stack:get_count() - end -end - -local trapped_chest_mesecons_rules = mesecon.rules.pplate - --- To be called when a chest is closed (only relevant for trapped chest atm) -local chest_update_after_close = function(pos) - local node = minetest.get_node(pos) - - if node.name == "mcl_chests:trapped_chest_on" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest", param2 = node.param2}) - mesecon.receptor_off(pos, trapped_chest_mesecons_rules) - elseif node.name == "mcl_chests:trapped_chest_on_left" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - mesecon.receptor_off(pos, trapped_chest_mesecons_rules) - - local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") - minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) - mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) - elseif node.name == "mcl_chests:trapped_chest_on_right" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) - mesecon.receptor_off(pos, trapped_chest_mesecons_rules) - - local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") - minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) - end -end - --- To be called if a player closed a chest -local player_chest_close = function(player) - local name = player:get_player_name() - if open_chests[name] == nil then - return - end - local pos = open_chests[name].pos - chest_update_after_close(pos) - - open_chests[name] = nil -end - --- This is a helper function to register both chests and trapped chests. Trapped chests will make use of the additional parameters -local register_chest = function(basename, desc, longdesc, usagehelp, tiles_table, hidden, mesecons, on_rightclick_addendum, on_rightclick_addendum_left, on_rightclick_addendum_right, drop, canonical_basename) --- START OF register_chest FUNCTION BODY -if not drop then - drop = "mcl_chests:"..basename -else - drop = "mcl_chests:"..drop -end --- The basename of the "canonical" version of the node, if set (e.g.: trapped_chest_on → trapped_chest). --- Used to get a shared formspec ID and to swap the node back to the canonical version in on_construct. -if not canonical_basename then - canonical_basename = basename -end - -minetest.register_node("mcl_chests:"..basename, { - description = desc, - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usagehelp, - _doc_items_hidden = hidden, - tiles = tiles_table.small, - paramtype = "light", - paramtype2 = "facedir", - stack_max = 64, - drop = drop, - groups = {handy=1,axey=1, container=2, deco_block=1, material_wood=1}, - is_ground_content = false, - sounds = mcl_sounds.node_sound_wood_defaults(), - on_construct = function(pos) - local param2 = minetest.get_node(pos).param2 - local meta = minetest.get_meta(pos) - --[[ This is a workaround for Minetest issue 5894 - . - Apparently if we don't do this, double chests initially don't work when - placed at chunk borders, and some chests randomly don't work after - placing. ]] - -- FIXME: Remove this workaround when the bug has been fixed. - -- BEGIN OF WORKAROUND -- - meta:set_string("workaround", "ignore_me") - meta:set_string("workaround", nil) -- Done to keep metadata clean - -- END OF WORKAROUND -- - local inv = meta:get_inventory() - inv:set_size("main", 9*3) - --[[ The "input" list is *another* workaround (hahahaha!) around the fact that Minetest - does not support listrings to put items into an alternative list if the first one - happens to be full. See . - This list is a hidden input-only list and immediately puts items into the appropriate chest. - It is only used for listrings and hoppers. This workaround is not that bad because it only - requires a simple “inventory allows” check for large chests.]] - -- FIXME: Refactor the listrings as soon Minetest supports alternative listrings - -- BEGIN OF LISTRING WORKAROUND - inv:set_size("input", 1) - -- END OF LISTRING WORKAROUND - if minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "right")).name == "mcl_chests:"..canonical_basename then - minetest.swap_node(pos, {name="mcl_chests:"..canonical_basename.."_right",param2=param2}) - local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") - minetest.swap_node(p, { name = "mcl_chests:"..canonical_basename.."_left", param2 = param2 }) - elseif minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "left")).name == "mcl_chests:"..canonical_basename then - minetest.swap_node(pos, {name="mcl_chests:"..canonical_basename.."_left",param2=param2}) - local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") - minetest.swap_node(p, { name = "mcl_chests:"..canonical_basename.."_right", param2 = param2 }) - else - minetest.swap_node(pos, { name = "mcl_chests:"..canonical_basename, param2 = param2 }) - end - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - local meta2 = meta - meta:from_table(oldmetadata) - local inv = meta:get_inventory() - for i=1,inv:get_size("main") do - local stack = inv:get_stack("main", i) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end - meta:from_table(meta2:to_table()) - end, - allow_metadata_inventory_move = protection_check_move, - allow_metadata_inventory_take = protection_check_put_take, - allow_metadata_inventory_put = protection_check_put_take, - on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - minetest.log("action", player:get_player_name().. - " moves stuff in chest at "..minetest.pos_to_string(pos)) - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " moves stuff to chest at "..minetest.pos_to_string(pos)) - -- BEGIN OF LISTRING WORKAROUND - if listname == "input" then - local inv = minetest.get_inventory({type="node", pos=pos}) - inv:add_item("main", stack) - end - -- END OF LISTRING WORKAROUND - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " takes stuff from chest at "..minetest.pos_to_string(pos)) - end, - _mcl_blast_resistance = 2.5, - _mcl_hardness = 2.5, - - on_rightclick = function(pos, node, clicker) - minetest.show_formspec(clicker:get_player_name(), - "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, - "size[9,8.75]".. - mcl_vars.inventory_header.. - "background[-0.19,-0.25;9.41,10.48;mcl_chests_inventory_chest.png]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Chest"))).."]".. - "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - "list[current_player;main;0,7.74;9,1;]".. - "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main]".. - "listring[current_player;main]") - - if on_rightclick_addendum then - on_rightclick_addendum(pos, node, clicker) - end - end, - - on_destruct = function(pos) - local players = minetest.get_connected_players() - for p=1, #players do - minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) - end - end, - mesecons = mesecons, - on_rotate = simple_rotate, -}) - -minetest.register_node("mcl_chests:"..basename.."_left", { - tiles = tiles_table.left, - paramtype = "light", - paramtype2 = "facedir", - groups = {handy=1,axey=1, container=5,not_in_creative_inventory=1, material_wood=1}, - drop = drop, - is_ground_content = false, - sounds = mcl_sounds.node_sound_wood_defaults(), - on_construct = function(pos) - local n = minetest.get_node(pos) - local param2 = n.param2 - local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") - if not p or minetest.get_node(p).name ~= "mcl_chests:"..canonical_basename.."_right" then - n.name = "mcl_chests:"..canonical_basename - minetest.swap_node(pos, n) - end - end, - on_destruct = function(pos) - local n = minetest.get_node(pos) - if n.name == "mcl_chests:"..basename then - return - end - - local players = minetest.get_connected_players() - for p=1, #players do - minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) - end - - local param2 = n.param2 - local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") - if not p or minetest.get_node(p).name ~= "mcl_chests:"..basename.."_right" then - return - end - for pl=1, #players do - minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..p.x.."_"..p.y.."_"..p.z) - end - minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 }) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - local meta2 = meta - meta:from_table(oldmetadata) - local inv = meta:get_inventory() - for i=1,inv:get_size("main") do - local stack = inv:get_stack("main", i) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end - meta:from_table(meta2:to_table()) - end, - allow_metadata_inventory_move = protection_check_move, - allow_metadata_inventory_take = protection_check_put_take, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - -- BEGIN OF LISTRING WORKAROUND - elseif listname == "input" then - local inv = minetest.get_inventory({type="node", pos=pos}) - if inv:room_for_item("main", stack) then - return -1 - else - local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "left") - local other_inv = minetest.get_inventory({type="node", pos=other_pos}) - if other_inv:room_for_item("main", stack) then - return -1 - else - return 0 - end - end - -- END OF LISTRING WORKAROUND - else - return stack:get_count() - end - end, - on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - minetest.log("action", player:get_player_name().. - " moves stuff in chest at "..minetest.pos_to_string(pos)) - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " moves stuff to chest at "..minetest.pos_to_string(pos)) - -- BEGIN OF LISTRING WORKAROUND - if listname == "input" then - local inv = minetest.get_inventory({type="node", pos=pos}) - local leftover = inv:add_item("main", stack) - if not leftover:is_empty() then - local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "left") - local other_inv = minetest.get_inventory({type="node", pos=other_pos}) - other_inv:add_item("main", leftover) - end - end - -- END OF LISTRING WORKAROUND - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " takes stuff from chest at "..minetest.pos_to_string(pos)) - end, - _mcl_blast_resistance = 2.5, - _mcl_hardness = 2.5, - - on_rightclick = function(pos, node, clicker) - local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") - - minetest.show_formspec(clicker:get_player_name(), - "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, - "size[9,11.5]".. - "background[-0.19,-0.25;9.41,12.5;mcl_chests_inventory_chest_large.png]".. - mcl_vars.inventory_header.. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Large Chest"))).."]".. - "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. - "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,3.5;9,3;]".. - "label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,7.5;9,3;9]".. - "list[current_player;main;0,10.75;9,1;]".. - -- BEGIN OF LISTRING WORKAROUND - "listring[current_player;main]".. - "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";input]".. - -- END OF LISTRING WORKAROUND - "listring[current_player;main]".. - "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main]".. - "listring[current_player;main]".. - "listring[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main]") - - if on_rightclick_addendum_left then - on_rightclick_addendum_left(pos, node, clicker) - end - end, - mesecons = mesecons, - on_rotate = no_rotate, -}) - -minetest.register_node("mcl_chests:"..basename.."_right", { - tiles = tiles_table.right, - paramtype = "light", - paramtype2 = "facedir", - groups = {handy=1,axey=1, container=6,not_in_creative_inventory=1, material_wood=1}, - drop = drop, - is_ground_content = false, - sounds = mcl_sounds.node_sound_wood_defaults(), - on_construct = function(pos) - local n = minetest.get_node(pos) - local param2 = n.param2 - local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") - if not p or minetest.get_node(p).name ~= "mcl_chests:"..canonical_basename.."_left" then - n.name = "mcl_chests:"..canonical_basename - minetest.swap_node(pos, n) - end - end, - on_destruct = function(pos) - local n = minetest.get_node(pos) - if n.name == "mcl_chests:"..basename then - return - end - - local players = minetest.get_connected_players() - for p=1, #players do - minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) - end - - local param2 = n.param2 - local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") - if not p or minetest.get_node(p).name ~= "mcl_chests:"..basename.."_left" then - return - end - for pl=1, #players do - minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..p.x.."_"..p.y.."_"..p.z) - end - minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 }) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - local meta2 = meta - meta:from_table(oldmetadata) - local inv = meta:get_inventory() - for i=1,inv:get_size("main") do - local stack = inv:get_stack("main", i) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end - meta:from_table(meta2:to_table()) - end, - allow_metadata_inventory_move = protection_check_move, - allow_metadata_inventory_take = protection_check_put_take, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - -- BEGIN OF LISTRING WORKAROUND - elseif listname == "input" then - local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "right") - local other_inv = minetest.get_inventory({type="node", pos=other_pos}) - if other_inv:room_for_item("main", stack) then - return -1 - else - local inv = minetest.get_inventory({type="node", pos=pos}) - if inv:room_for_item("main", stack) then - return -1 - else - return 0 - end - end - -- END OF LISTRING WORKAROUND - else - return stack:get_count() - end - end, - on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - minetest.log("action", player:get_player_name().. - " moves stuff in chest at "..minetest.pos_to_string(pos)) - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " moves stuff to chest at "..minetest.pos_to_string(pos)) - -- BEGIN OF LISTRING WORKAROUND - if listname == "input" then - local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "right") - local other_inv = minetest.get_inventory({type="node", pos=other_pos}) - local leftover = other_inv:add_item("main", stack) - if not leftover:is_empty() then - local inv = minetest.get_inventory({type="node", pos=pos}) - inv:add_item("main", leftover) - end - end - -- END OF LISTRING WORKAROUND - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " takes stuff from chest at "..minetest.pos_to_string(pos)) - end, - _mcl_blast_resistance = 2.5, - _mcl_hardness = 2.5, - - on_rightclick = function(pos, node, clicker) - local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") - - minetest.show_formspec(clicker:get_player_name(), - "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, - - "size[9,11.5]".. - "background[-0.19,-0.25;9.41,12.5;mcl_chests_inventory_chest_large.png]".. - mcl_vars.inventory_header.. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Large Chest"))).."]".. - "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,0.5;9,3;]".. - "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,3.5;9,3;]".. - "label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,7.5;9,3;9]".. - "list[current_player;main;0,10.75;9,1;]".. - -- BEGIN OF LISTRING WORKAROUND - "listring[current_player;main]".. - "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";input]".. - -- END OF LISTRING WORKAROUND - "listring[current_player;main]".. - "listring[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main]".. - "listring[current_player;main]".. - "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main]") - - if on_rightclick_addendum_right then - on_rightclick_addendum_right(pos, node, clicker) - end - end, - mesecons = mesecons, - on_rotate = no_rotate, -}) - -if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_chests:"..basename, "nodes", "mcl_chests:"..basename.."_left") - doc.add_entry_alias("nodes", "mcl_chests:"..basename, "nodes", "mcl_chests:"..basename.."_right") -end - --- END OF register_chest FUNCTION BODY -end - -local chestusage = S("To access its inventory, rightclick it. When broken, the items will drop out.") - -register_chest("chest", - S("Chest"), - S("Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other."), - chestusage, - { - small = {"default_chest_top.png", "mcl_chests_chest_bottom.png", - "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", - "mcl_chests_chest_back.png", "default_chest_front.png"}, - left = {"default_chest_top_big.png", "default_chest_top_big.png", - "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", - "default_chest_side_big.png^[transformFX", "default_chest_front_big.png"}, - right = {"default_chest_top_big.png^[transformFX", "default_chest_top_big.png^[transformFX", - "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", - "default_chest_side_big.png", "default_chest_front_big.png^[transformFX"}, - }, - false -) - -local traptiles = { - small = {"mcl_chests_chest_trapped_top.png", "mcl_chests_chest_trapped_bottom.png", - "mcl_chests_chest_trapped_right.png", "mcl_chests_chest_trapped_left.png", - "mcl_chests_chest_trapped_back.png", "mcl_chests_chest_trapped_front.png"}, - left = {"mcl_chests_chest_trapped_top_big.png", "mcl_chests_chest_trapped_top_big.png", - "mcl_chests_chest_trapped_right.png", "mcl_chests_chest_trapped_left.png", - "mcl_chests_chest_trapped_side_big.png^[transformFX", "mcl_chests_chest_trapped_front_big.png"}, - right = {"mcl_chests_chest_trapped_top_big.png^[transformFX", "mcl_chests_chest_trapped_top_big.png^[transformFX", - "mcl_chests_chest_trapped_right.png", "mcl_chests_chest_trapped_left.png", - "mcl_chests_chest_trapped_side_big.png", "mcl_chests_chest_trapped_front_big.png^[transformFX"}, -} - -register_chest("trapped_chest", - S("Trapped Chest"), - S("A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other."), - chestusage, - traptiles, - nil, - {receptor = { - state = mesecon.state.off, - rules = trapped_chest_mesecons_rules, - }}, - function(pos, node, clicker) - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on", param2 = node.param2}) - mesecon.receptor_on(pos, trapped_chest_mesecons_rules) - player_chest_open(clicker, pos) - end, - function(pos, node, clicker) - local meta = minetest.get_meta(pos) - meta:set_int("players", 1) - - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2}) - mesecon.receptor_on(pos, trapped_chest_mesecons_rules) - - local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") - minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_on_right", param2 = node.param2}) - mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules) - - player_chest_open(clicker, pos) - end, - function(pos, node, clicker) - local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") - - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_right", param2 = node.param2}) - mesecon.receptor_on(pos, trapped_chest_mesecons_rules) - - minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2}) - mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules) - - player_chest_open(clicker, pos) - end -) - -register_chest("trapped_chest_on", - nil, nil, nil, traptiles, true, - {receptor = { - state = mesecon.state.on, - rules = trapped_chest_mesecons_rules, - }}, - function(pos, node, clicker) - player_chest_open(clicker, pos) - end, - function(pos, node, clicker) - player_chest_open(clicker, pos) - end, - function(pos, node, clicker) - player_chest_open(clicker, pos) - end, - "trapped_chest", - "trapped_chest" -) - -local function close_if_trapped_chest(pos, player) - local node = minetest.get_node(pos) - - if node.name == "mcl_chests:trapped_chest_on" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest", param2 = node.param2}) - mesecon.receptor_off(pos, trapped_chest_mesecons_rules) - - player_chest_close(player) - elseif node.name == "mcl_chests:trapped_chest_on_left" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - mesecon.receptor_off(pos, trapped_chest_mesecons_rules) - - local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") - minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) - mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) - - player_chest_close(player) - elseif node.name == "mcl_chests:trapped_chest_on_right" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) - mesecon.receptor_off(pos, trapped_chest_mesecons_rules) - - local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") - minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) - - player_chest_close(player) - end -end - --- Disable trapped chest when it has been closed -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname:find("mcl_chests:trapped_chest_") == 1 then - if fields.quit then - player_chest_close(player) - end - end -end) - -minetest.register_on_leaveplayer(function(player) - player_chest_close(player) -end) - -minetest.register_craft({ - output = 'mcl_chests:chest', - recipe = { - {'group:wood', 'group:wood', 'group:wood'}, - {'group:wood', '', 'group:wood'}, - {'group:wood', 'group:wood', 'group:wood'}, - } -}) - -minetest.register_craft({ - type = 'fuel', - recipe = 'mcl_chests:chest', - burntime = 15 -}) - -minetest.register_craft({ - type = 'fuel', - recipe = 'mcl_chests:trapped_chest', - burntime = 15 -}) - -minetest.register_node("mcl_chests:ender_chest", { - description = S("Ender Chest"), - _doc_items_longdesc = S("Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players."), - _doc_items_usagehelp = S("Rightclick the ender chest to access your personal interdimensional inventory."), - tiles = {"mcl_chests_ender_chest_top.png", "mcl_chests_ender_chest_bottom.png", - "mcl_chests_ender_chest_right.png", "mcl_chests_ender_chest_left.png", - "mcl_chests_ender_chest_back.png", "mcl_chests_ender_chest_front.png"}, - -- Note: The “container” group is missing here because the ender chest does not - -- have an inventory on its own - groups = {pickaxey=1, deco_block=1, material_stone=1}, - is_ground_content = false, - paramtype = "light", - light_source = 7, - paramtype2 = "facedir", - sounds = mcl_sounds.node_sound_stone_defaults(), - drop = "mcl_core:obsidian 8", - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", - "size[9,8.75]".. - mcl_vars.inventory_header.. - "background[-0.19,-0.25;9.41,10.48;mcl_chests_inventory_chest.png]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Ender Chest"))).."]".. - "list[current_player;enderchest;0,0.5;9,3;]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - "list[current_player;main;0,7.74;9,1;]".. - "listring[current_player;enderchest]".. - "listring[current_player;main]") - end, - _mcl_blast_resistance = 3000, - _mcl_hardness = 22.5, - on_rotate = simple_rotate, -}) - -minetest.register_lbm({ - label = "Update ender chest + shulker box formspecs (0.51.0)", - name = "mcl_chests:update_formspecs_0_51_0", - nodenames = { "mcl_chests:ender_chest", "group:shulker_box" }, - action = function(pos, node) - minetest.registered_nodes[node.name].on_construct(pos) - minetest.log("action", "[mcl_chests] Node formspec updated at "..minetest.pos_to_string(pos)) - end, -}) - -minetest.register_on_joinplayer(function(player) - local inv = player:get_inventory() - inv:set_size("enderchest", 9*3) -end) - -minetest.register_craft({ - output = 'mcl_chests:ender_chest', - recipe = { - {'mcl_core:obsidian', 'mcl_core:obsidian', 'mcl_core:obsidian'}, - {'mcl_core:obsidian', 'mcl_end:ender_eye', 'mcl_core:obsidian'}, - {'mcl_core:obsidian', 'mcl_core:obsidian', 'mcl_core:obsidian'}, - } -}) - --- Shulker boxes -local boxtypes = { - white = S("White Shulker Box"), - grey = S("Light Grey Shulker Box"), - orange = S("Orange Shulker Box"), - cyan = S("Cyan Shulker Box"), - magenta = S("Magenta Shulker Box"), - violet = S("Purple Shulker Box"), - lightblue = S("Light Blue Shulker Box"), - blue = S("Blue Shulker Box"), - yellow = S("Yellow Shulker Box"), - brown = S("Brown Shulker Box"), - green = S("Lime Shulker Box"), - dark_green = S("Green Shulker Box"), - pink = S("Pink Shulker Box"), - red = S("Red Shulker Box"), - dark_grey = S("Grey Shulker Box"), - black = S("Black Shulker Box"), -} - -local shulker_mob_textures = { - white = "mobs_mc_shulker_white.png", - grey = "mobs_mc_shulker_silver.png", - orange = "mobs_mc_shulker_orange.png", - cyan = "mobs_mc_shulker_cyan.png", - magenta = "mobs_mc_shulker_magenta.png", - violet = "mobs_mc_shulker_purple.png", - lightblue = "mobs_mc_shulker_light_blue.png", - blue = "mobs_mc_shulker_blue.png", - yellow = "mobs_mc_shulker_yellow.png", - brown = "mobs_mc_shulker_brown.png", - green = "mobs_mc_shulker_lime.png", - dark_green = "mobs_mc_shulker_green.png", - pink = "mobs_mc_shulker_pink.png", - red = "mobs_mc_shulker_red.png", - dark_grey = "mobs_mc_shulker_gray.png", - black = "mobs_mc_shulker_black.png", -} - -for color, desc in pairs(boxtypes) do - local mob_texture = shulker_mob_textures[color] - minetest.register_node("mcl_chests:"..color.."_shulker_box", { - description = desc, - _doc_items_longdesc = S("A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors."), - _doc_items_usagehelp = S("To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out."), - tiles = { - "mcl_chests_"..color.."_shulker_box_top.png", -- top - "[combine:16x16:-32,-28="..mob_texture, -- bottom - "[combine:16x16:0,-36="..mob_texture..":0,-16="..mob_texture, -- side - "[combine:16x16:-32,-36="..mob_texture..":-32,-16="..mob_texture, -- side - "[combine:16x16:-16,-36="..mob_texture..":-16,-16="..mob_texture, -- side - "[combine:16x16:-48,-36="..mob_texture..":-48,-16="..mob_texture, -- side - }, - groups = {handy=1,pickaxey=1, container=3, deco_block=1, dig_by_piston=1, shulker_box=1}, - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - stack_max = 1, - drop = "", - paramtype = "light", - paramtype2 = "facedir", --- TODO: Make shulker boxes rotatable --- This doesn't work, it just destroys the inventory: --- on_place = minetest.rotate_node, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", - "size[9,8.75]".. - mcl_vars.inventory_header.. - "background[-0.19,-0.25;9.41,10.48;mcl_chests_inventory_chest.png]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Shulker Box"))).."]".. - "list[current_name;main;0,0.5;9,3;]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - "list[current_player;main;0,7.74;9,1;]".. - "listring[current_name;main]".. - "listring[current_player;main]") - local inv = meta:get_inventory() - inv:set_size("main", 9*3) - end, - _on_dispense = function(stack, pos, droppos, dropnode, dropdir) - -- Place shulker box as node - if minetest.registered_nodes[dropnode.name].buildable_to then - minetest.set_node(droppos, {name = stack:get_name(), param2 = minetest.dir_to_facedir(dropdir)}) - local imeta = stack:get_metadata() - local iinv_main = minetest.deserialize(imeta) - local ninv = minetest.get_inventory({type="node", pos=droppos}) - ninv:set_list("main", iinv_main) - stack:take_item() - end - return stack - end, - after_place_node = function(pos, placer, itemstack, pointed_thing) - local nmeta = minetest.get_meta(pos) - local ninv = nmeta:get_inventory() - local imeta = itemstack:get_metadata() - local iinv_main = minetest.deserialize(imeta) - ninv:set_list("main", iinv_main) - ninv:set_size("main", 9*3) - if minetest.settings:get_bool("creative_mode") then - if not ninv:is_empty("main") then - return nil - else - return itemstack - end - else - return nil - end - end, - on_destruct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local items = {} - for i=1, inv:get_size("main") do - local stack = inv:get_stack("main", i) - items[i] = stack:to_string() - end - local data = minetest.serialize(items) - local boxitem = ItemStack("mcl_chests:"..color.."_shulker_box") - boxitem:set_metadata(data) - - if minetest.settings:get_bool("creative_mode") then - if not inv:is_empty("main") then - minetest.add_item(pos, boxitem) - end - else - minetest.add_item(pos, boxitem) - end - end, - allow_metadata_inventory_move = protection_check_move, - allow_metadata_inventory_take = protection_check_put_take, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end - -- Do not allow to place shulker boxes into shulker boxes - local group = minetest.get_item_group(stack:get_name(), "shulker_box") - if group == 0 or group == nil then - return stack:get_count() - else - return 0 - end - end, - _mcl_blast_resistance = 30, - _mcl_hardness = 6, - }) - - minetest.register_craft({ - type = "shapeless", - output = 'mcl_chests:'..color..'_shulker_box', - recipe = { 'group:shulker_box', 'mcl_dye:'..color } - }) -end - -minetest.register_craft({ - output = 'mcl_chests:violet_shulker_box', - recipe = { - {'mcl_mobitems:shulker_shell'}, - {'mcl_chests:chest'}, - {'mcl_mobitems:shulker_shell'}, - } -}) - -minetest.register_lbm({ - -- Disable active/open trapped chests when loaded because nobody could - -- have them open at loading time. - -- Fixes redstone weirdness. - label = "Disable active trapped chests", - name = "mcl_chests:reset_trapped_chests", - nodenames = { "mcl_chests:trapped_chest_on", "mcl_chests:trapped_chest_on_left", "mcl_chests:trapped_chest_on_right" }, - run_at_every_load = true, - action = function(pos, node) - minetest.log("error", "lbm!" ..minetest.pos_to_string(pos)) - chest_update_after_close(pos) - end, -}) From b404e8b5bd56e3a6b032f3ea8de70aa838f702a9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 24 Mar 2019 09:30:15 +0100 Subject: [PATCH 252/379] Squash help entries for shulker boxes --- mods/ITEMS/mcl_chests/init.lua | 26 ++++++++++++++++--- mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr | 2 +- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 496740b5b..39af9a21c 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("mcl_chests") +local mod_doc = minetest.get_modpath("doc") local no_rotate, simple_rotate if minetest.get_modpath("screwdriver") then @@ -477,7 +478,7 @@ minetest.register_node("mcl_chests:"..basename.."_right", { on_rotate = no_rotate, }) -if minetest.get_modpath("doc") then +if mod_doc then doc.add_entry_alias("nodes", "mcl_chests:"..basename, "nodes", "mcl_chests:"..basename.."_left") doc.add_entry_alias("nodes", "mcl_chests:"..basename, "nodes", "mcl_chests:"..basename.."_right") end @@ -737,13 +738,28 @@ local shulker_mob_textures = { dark_grey = "mobs_mc_shulker_gray.png", black = "mobs_mc_shulker_black.png", } +local canonical_shulker_color = "violet" for color, desc in pairs(boxtypes) do local mob_texture = shulker_mob_textures[color] + local is_canonical = color == canonical_shulker_color + local longdesc, usagehelp, create_entry, entry_name + if mod_doc then + if is_canonical then + longdesc = S("A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.") + usagehelp = S("To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out.") + entry_name = S("Shulker Box") + else + create_entry = false + end + end + minetest.register_node("mcl_chests:"..color.."_shulker_box", { description = desc, - _doc_items_longdesc = S("A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors."), - _doc_items_usagehelp = S("To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out."), + _doc_items_create_entry = create_entry, + _doc_items_entry_name = entry_name, + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usagehelp, tiles = { "mcl_chests_"..color.."_shulker_box_top.png", -- top "[combine:16x16:-32,-28="..mob_texture, -- bottom @@ -847,6 +863,10 @@ for color, desc in pairs(boxtypes) do _mcl_hardness = 6, }) + if mod_doc and not is_canonical then + doc.add_entry_alias("nodes", "mcl_chests:"..canonical_shulker_color.."_shulker_box", "nodes", "mcl_chests:"..color.."_shulker_box") + end + minetest.register_craft({ type = "shapeless", output = 'mcl_chests:'..color..'_shulker_box', diff --git a/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr b/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr index 9a3d363f8..6141c96a6 100644 --- a/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr +++ b/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr @@ -23,7 +23,7 @@ Pink Shulker Box=Rosa Schulkerkiste Red Shulker Box=Rote Schulkerkiste Grey Shulker Box=Graue Schulkerkiste Black Shulker Box=Schwarze Schulkerkiste -A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.=Eine Schulkerkiste ist ein tragbarer Behälter der 27 Inventarplätze für alle Gegenstände außer Schulkerkisten bietet. Schulkerkisten behalten ihr Inventar, wenn sie abgebaut werden, also können Schulkerkisten so wie ihr Inhalt als einzelne Gegenstände mitgenommen werden. Schulkerkisten gibt es in vielen verschiedenen Farben. +A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.=Eine Schulkerkiste ist ein tragbarer Behälter, der 27 Inventarplätze für alle Gegenstände außer Schulkerkisten bietet. Schulkerkisten behalten ihr Inventar, wenn sie abgebaut werden, also können Schulkerkisten so wie ihr Inhalt als einzelne Gegenstände mitgenommen werden. Schulkerkisten gibt es in vielen verschiedenen Farben. To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out.=Um auf das Inventar einer Schulkerkiste zuzugreifen, platzieren Sie sie und rechtsklicken sie auf ihr. Um eine Schulkerkiste und ihren Inhalt mitzunehmen, bauen Sie sie einfach ab und sammeln Sie sie auf, der Inhalt will nicht hinausfallen. Shulker Box=Schulkerkiste Large Chest=Große Truhe From 7604b77dd6497a4d0e225473d44e57201ebc0562 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 24 Mar 2019 09:37:15 +0100 Subject: [PATCH 253/379] Add generic strings for stained glass --- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 1 + mods/ITEMS/mcl_core/locale/template.tr | 1 + mods/ITEMS/xpanes/locale/template.txt | 1 + mods/ITEMS/xpanes/locale/xpanes.de.tr | 1 + 4 files changed, 4 insertions(+) diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index 44d380707..e53bbf294 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -244,3 +244,4 @@ Water interacts with lava in various ways:=Wasser reagiert mit Lava auf untersch Lava interacts with water various ways:=Lava reagiert mit Wasser auf verschiedene Arten: • When a lava source is directly below or horizontally next to water, the lava turns into obsidian.=• Wenn sich eine Lavaquelle direkt unter oder horizontal neben Wasser befindet, verwandelt sich die Lava zu Obsidian. • When lava is directly above water, the water turns into stone.=• Wenn sich Lava direkt über Wasser befindet, verwandelt sich das Wasser zu Stein. +Stained Glass=Buntglas diff --git a/mods/ITEMS/mcl_core/locale/template.tr b/mods/ITEMS/mcl_core/locale/template.tr index 175107b74..e8313e800 100644 --- a/mods/ITEMS/mcl_core/locale/template.tr +++ b/mods/ITEMS/mcl_core/locale/template.tr @@ -243,3 +243,4 @@ Water interacts with lava in various ways:= Lava interacts with water various ways:= • When a lava source is directly below or horizontally next to water, the lava turns into obsidian.= • When lava is directly above water, the water turns into stone.= +Stained Glass= diff --git a/mods/ITEMS/xpanes/locale/template.txt b/mods/ITEMS/xpanes/locale/template.txt index ad8c1b5ea..1c227e1c6 100644 --- a/mods/ITEMS/xpanes/locale/template.txt +++ b/mods/ITEMS/xpanes/locale/template.txt @@ -3,6 +3,7 @@ Glass panes are thin layers of glass which neatly connect to their neighbors as Iron Bars= Iron bars neatly connect to their neighbors as you build them.= Glass Pane= +Stained Glass Pane= Red Stained Glass Pane= Green Stained Glass Pane= Blue Stained Glass Pane= diff --git a/mods/ITEMS/xpanes/locale/xpanes.de.tr b/mods/ITEMS/xpanes/locale/xpanes.de.tr index 1a024e740..c6e8bbfa8 100644 --- a/mods/ITEMS/xpanes/locale/xpanes.de.tr +++ b/mods/ITEMS/xpanes/locale/xpanes.de.tr @@ -3,6 +3,7 @@ Glass panes are thin layers of glass which neatly connect to their neighbors as Iron Bars=Eisenstangen Iron bars neatly connect to their neighbors as you build them.=Eisenstangen verbinden sich mit den Nachbarn, wenn sie gebaut werden. Glass Pane=Glasscheibe +Stained Glass Pane=Buntglasscheibe Red Stained Glass Pane=Rote Buntglasscheibe Green Stained Glass Pane=Grüne Buntglasscheibe Blue Stained Glass Pane=Blaue Buntglasscheibe From 258235050434babea059d45bdc4e21e91faab482 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 24 Mar 2019 09:37:48 +0100 Subject: [PATCH 254/379] mcl_core: Rename locale template --- mods/ITEMS/mcl_core/locale/{template.tr => template.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename mods/ITEMS/mcl_core/locale/{template.tr => template.txt} (100%) diff --git a/mods/ITEMS/mcl_core/locale/template.tr b/mods/ITEMS/mcl_core/locale/template.txt similarity index 100% rename from mods/ITEMS/mcl_core/locale/template.tr rename to mods/ITEMS/mcl_core/locale/template.txt From 5c1717971b4b02fa2568e294149489eba2bc9640 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 24 Mar 2019 10:31:58 +0100 Subject: [PATCH 255/379] Squash help entries for stained glass and panes --- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 2 +- mods/ITEMS/mcl_core/nodes_glass.lua | 55 +++++++++++++++-------- mods/ITEMS/xpanes/init.lua | 25 +++++++++-- 3 files changed, 58 insertions(+), 24 deletions(-) diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index e53bbf294..e5e528654 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -199,7 +199,7 @@ Spruce Sapling=Fichtensetzling Spruce Wood=Fichtenholz Spruce Wood Planks=Fichtenholzplanken Spruce leaves are grown from spruce trees.=Fichtenblätter wachsen an Fichten. -Stained glass is a decorative and mostly transparent block which comes in various different colors.=Farbglas ist ein dekorativer und größtenteils durchsichtiger Block, der in verschiedenen Farben daherkommt. +Stained glass is a decorative and mostly transparent block which comes in various different colors.=Buntglas ist ein dekorativer und größtenteils durchsichtiger Block, der in verschiedenen Farben daherkommt. Stick=Stock Sticks are a very versatile crafting material; used in countless crafting recipes.=Stöcke sind ein vielseitiges Material, sie werden in zahllosen Fertigungsrezepten gebraucht. Stone=Stein diff --git a/mods/ITEMS/mcl_core/nodes_glass.lua b/mods/ITEMS/mcl_core/nodes_glass.lua index f87ce79ba..d1ab99861 100644 --- a/mods/ITEMS/mcl_core/nodes_glass.lua +++ b/mods/ITEMS/mcl_core/nodes_glass.lua @@ -1,5 +1,6 @@ -- Glass nodes local S = minetest.get_translator("mcl_core") +local mod_doc = minetest.get_modpath("doc") minetest.register_node("mcl_core:glass", { description = S("Glass"), @@ -20,11 +21,23 @@ minetest.register_node("mcl_core:glass", { ------------------------ -- Create Color Glass -- ------------------------ -function mcl_core.add_glass(desc, recipeitem, colorgroup, color) +local canonical_color = "blue" +function mcl_core.add_stained_glass(desc, recipeitem, colorgroup, color) + local longdesc, create_entry, entry_name + if mod_doc then + if color == canonical_color then + longdesc = S("Stained glass is a decorative and mostly transparent block which comes in various different colors.") + entry_name = S("Stained Glass") + else + create_entry = false + end + end minetest.register_node("mcl_core:glass_"..color, { description = desc, - _doc_items_longdesc = S("Stained glass is a decorative and mostly transparent block which comes in various different colors."), + _doc_items_create_entry = create_entry, + _doc_items_entry_name = entry_name, + _doc_items_longdesc = longdesc, drawtype = "glasslike", is_ground_content = false, tiles = {"mcl_core_glass_"..color..".png"}, @@ -48,23 +61,27 @@ function mcl_core.add_glass(desc, recipeitem, colorgroup, color) {'mcl_core:glass','mcl_core:glass','mcl_core:glass'}, } }) + + if mod_doc and color ~= canonical_color then + doc.add_entry_alias("nodes", "mcl_core:glass_"..canonical_color, "nodes", "mcl_core:glass_"..color) + end + end ---- colored glass -mcl_core.add_glass( S("Red Stained Glass"), "mcl_dye:red", "basecolor_red", "red") -mcl_core.add_glass( S("Green Stained Glass"), "mcl_dye:dark_green", "unicolor_dark_green", "green") -mcl_core.add_glass( S("Blue Stained Glass"), "mcl_dye:blue", "basecolor_blue", "blue") -mcl_core.add_glass( S("Light Blue Stained Glass"), "mcl_dye:lightblue", "unicolor_light_blue", "light_blue") -mcl_core.add_glass( S("Black Stained Glass"), "mcl_dye:black", "basecolor_black", "black") -mcl_core.add_glass( S("White Stained Glass"), "mcl_dye:white", "basecolor_white", "white") -mcl_core.add_glass( S("Yellow Stained Glass"), "mcl_dye:yellow", "basecolor_yellow", "yellow") -mcl_core.add_glass( S("Brown Stained Glass"), "mcl_dye:brown", "unicolor_dark_orange", "brown") -mcl_core.add_glass( S("Orange Stained Glass"), "mcl_dye:orange", "excolor_orange", "orange") -mcl_core.add_glass( S("Pink Stained Glass"), "mcl_dye:pink", "unicolor_light_red", "pink") -mcl_core.add_glass( S("Grey Stained Glass"), "mcl_dye:dark_grey", "unicolor_darkgrey", "gray") -mcl_core.add_glass( S("Lime Stained Glass"), "mcl_dye:green", "basecolor_green", "lime") -mcl_core.add_glass( S("Light Grey Stained Glass"), "mcl_dye:grey", "basecolor_grey", "silver") -mcl_core.add_glass( S("Magenta Stained Glass"), "mcl_dye:magenta", "basecolor_magenta", "magenta") -mcl_core.add_glass( S("Purple Stained Glass"), "mcl_dye:violet", "excolor_violet", "purple") -mcl_core.add_glass( S("Cyan Stained Glass"), "mcl_dye:cyan", "basecolor_cyan", "cyan") - +mcl_core.add_stained_glass( S("Red Stained Glass"), "mcl_dye:red", "basecolor_red", "red") +mcl_core.add_stained_glass( S("Green Stained Glass"), "mcl_dye:dark_green", "unicolor_dark_green", "green") +mcl_core.add_stained_glass( S("Blue Stained Glass"), "mcl_dye:blue", "basecolor_blue", "blue") +mcl_core.add_stained_glass( S("Light Blue Stained Glass"), "mcl_dye:lightblue", "unicolor_light_blue", "light_blue") +mcl_core.add_stained_glass( S("Black Stained Glass"), "mcl_dye:black", "basecolor_black", "black") +mcl_core.add_stained_glass( S("White Stained Glass"), "mcl_dye:white", "basecolor_white", "white") +mcl_core.add_stained_glass( S("Yellow Stained Glass"), "mcl_dye:yellow", "basecolor_yellow", "yellow") +mcl_core.add_stained_glass( S("Brown Stained Glass"), "mcl_dye:brown", "unicolor_dark_orange", "brown") +mcl_core.add_stained_glass( S("Orange Stained Glass"), "mcl_dye:orange", "excolor_orange", "orange") +mcl_core.add_stained_glass( S("Pink Stained Glass"), "mcl_dye:pink", "unicolor_light_red", "pink") +mcl_core.add_stained_glass( S("Grey Stained Glass"), "mcl_dye:dark_grey", "unicolor_darkgrey", "gray") +mcl_core.add_stained_glass( S("Lime Stained Glass"), "mcl_dye:green", "basecolor_green", "lime") +mcl_core.add_stained_glass( S("Light Grey Stained Glass"), "mcl_dye:grey", "basecolor_grey", "silver") +mcl_core.add_stained_glass( S("Magenta Stained Glass"), "mcl_dye:magenta", "basecolor_magenta", "magenta") +mcl_core.add_stained_glass( S("Purple Stained Glass"), "mcl_dye:violet", "excolor_violet", "purple") +mcl_core.add_stained_glass( S("Cyan Stained Glass"), "mcl_dye:cyan", "basecolor_cyan", "cyan") diff --git a/mods/ITEMS/xpanes/init.lua b/mods/ITEMS/xpanes/init.lua index e5e72b3ec..d4c7370f3 100644 --- a/mods/ITEMS/xpanes/init.lua +++ b/mods/ITEMS/xpanes/init.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("xpanes") +local mod_doc = minetest.get_modpath("doc") local function is_pane(pos) return minetest.get_item_group(minetest.get_node(pos).name, "pane") > 0 @@ -162,24 +163,35 @@ function xpanes.register_pane(name, def) recipe = def.recipe }) - if minetest.get_modpath("doc") then + if mod_doc and def._doc_items_create_entry ~= false then doc.add_entry_alias("nodes", "xpanes:" .. name .. "_flat", "nodes", "xpanes:" .. name) end end +local canonical_color = "blue" -- Register glass pane (stained and unstained) local pane = function(description, node, append) - local texture1 - + local texture1, longdesc, entry_name, create_entry + longdesc = S("Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.") + local is_canonical = true -- Special case: Default (unstained) glass texture if append == "_natural" then texture1 = "default_glass.png" else + if append ~= "_"..canonical_color then + is_canonical = false + longdesc = nil + create_entry = false + else + entry_name = S("Stained Glass Pane") + end texture1 = "mcl_core_glass"..append..".png" end xpanes.register_pane("pane"..append, { description = description, - _doc_items_longdesc = S("Glass panes are thin layers of glass which neatly connect to their neighbors as you build them."), + _doc_items_create_entry = create_entry, + _doc_items_entry_name = entry_name, + _doc_items_longdesc = longdesc, textures = {texture1, texture1, "xpanes_top_glass"..append..".png"}, use_texture_alpha = true, inventory_image = texture1, @@ -194,6 +206,11 @@ local pane = function(description, node, append) _mcl_blast_resistance = 1.5, _mcl_hardness = 0.3, }) + + if mod_doc and not is_canonical then + doc.add_entry_alias("nodes", "xpanes:pane_".. canonical_color .. "_flat", "nodes", "xpanes:pane"..append) + doc.add_entry_alias("nodes", "xpanes:pane_".. canonical_color .. "_flat", "nodes", "xpanes:pane"..append.."_flat") + end end -- Iron Bars From 15880db54810c4df1f1734c8b43d3db238a69474 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 24 Mar 2019 10:40:07 +0100 Subject: [PATCH 256/379] Add new help text for stained glass panes --- mods/ITEMS/xpanes/init.lua | 4 ++-- mods/ITEMS/xpanes/locale/template.txt | 1 + mods/ITEMS/xpanes/locale/xpanes.de.tr | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/xpanes/init.lua b/mods/ITEMS/xpanes/init.lua index d4c7370f3..dd8eae756 100644 --- a/mods/ITEMS/xpanes/init.lua +++ b/mods/ITEMS/xpanes/init.lua @@ -172,17 +172,17 @@ local canonical_color = "blue" -- Register glass pane (stained and unstained) local pane = function(description, node, append) local texture1, longdesc, entry_name, create_entry - longdesc = S("Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.") local is_canonical = true -- Special case: Default (unstained) glass texture if append == "_natural" then texture1 = "default_glass.png" + longdesc = S("Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.") else if append ~= "_"..canonical_color then is_canonical = false - longdesc = nil create_entry = false else + longdesc = S("Stained glass panes are thin layers of stained glass which neatly connect to their neighbors as you build them. They come in many different colors.") entry_name = S("Stained Glass Pane") end texture1 = "mcl_core_glass"..append..".png" diff --git a/mods/ITEMS/xpanes/locale/template.txt b/mods/ITEMS/xpanes/locale/template.txt index 1c227e1c6..cae83797b 100644 --- a/mods/ITEMS/xpanes/locale/template.txt +++ b/mods/ITEMS/xpanes/locale/template.txt @@ -1,5 +1,6 @@ # textdomain: xpanes Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.= +Stained glass panes are thin layers of stained glass which neatly connect to their neighbors as you build them. They come in many different colors.= Iron Bars= Iron bars neatly connect to their neighbors as you build them.= Glass Pane= diff --git a/mods/ITEMS/xpanes/locale/xpanes.de.tr b/mods/ITEMS/xpanes/locale/xpanes.de.tr index c6e8bbfa8..3c840b08c 100644 --- a/mods/ITEMS/xpanes/locale/xpanes.de.tr +++ b/mods/ITEMS/xpanes/locale/xpanes.de.tr @@ -1,5 +1,6 @@ # textdomain: xpanes Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.=Glasscheiben sind dünne Glasschichten, die sich mit ihren Nachbarn automatisch verbinden. +Stained glass panes are thin layers of stained glass which neatly connect to their neighbors as you build them. They come in many different colors.=Farbglasscheiben sind dünne Schichten aus Farbglas, die sich mit ihren Nachbarn automatisch verbinden. Es gibt sie in vielen verschiedenen Farben. Iron Bars=Eisenstangen Iron bars neatly connect to their neighbors as you build them.=Eisenstangen verbinden sich mit den Nachbarn, wenn sie gebaut werden. Glass Pane=Glasscheibe From 2f346cfc1db73d4d92c4c50827b0f8788a4388af Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 24 Mar 2019 10:51:45 +0100 Subject: [PATCH 257/379] Change stained glass canonical color --- mods/ITEMS/mcl_core/nodes_glass.lua | 2 +- mods/ITEMS/xpanes/init.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_glass.lua b/mods/ITEMS/mcl_core/nodes_glass.lua index d1ab99861..3ac2cb394 100644 --- a/mods/ITEMS/mcl_core/nodes_glass.lua +++ b/mods/ITEMS/mcl_core/nodes_glass.lua @@ -21,7 +21,7 @@ minetest.register_node("mcl_core:glass", { ------------------------ -- Create Color Glass -- ------------------------ -local canonical_color = "blue" +local canonical_color = "yellow" function mcl_core.add_stained_glass(desc, recipeitem, colorgroup, color) local longdesc, create_entry, entry_name diff --git a/mods/ITEMS/xpanes/init.lua b/mods/ITEMS/xpanes/init.lua index dd8eae756..42dbb807d 100644 --- a/mods/ITEMS/xpanes/init.lua +++ b/mods/ITEMS/xpanes/init.lua @@ -168,7 +168,7 @@ function xpanes.register_pane(name, def) end end -local canonical_color = "blue" +local canonical_color = "yellow" -- Register glass pane (stained and unstained) local pane = function(description, node, append) local texture1, longdesc, entry_name, create_entry From 2d34a2982a593f67d44785a95bc4e68dd94817c6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 25 Mar 2019 09:04:41 +0100 Subject: [PATCH 258/379] Add biome type to biome metadata --- mods/MAPGEN/mcl_biomes/init.lua | 88 +++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index dee12faa0..b0c8b2a25 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -15,6 +15,10 @@ local deco_id_chorus_plant -- Register biomes -- +--[[ Special biome field: _mcl_biome_type: +Rough categorization of biomes: One of "snowy", "cold", "medium" and "hot" +Based off ]] + local function register_classic_superflat_biome() -- Classic Superflat: bedrock (not part of biome), 2 dirt, 1 grass block minetest.register_biome({ @@ -28,6 +32,7 @@ local function register_classic_superflat_biome() y_max = mcl_vars.mg_overworld_max, humidity_point = 50, heat_point = 50, + _mcl_biome_type = "medium", }) end @@ -133,6 +138,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 24, heat_point = -5, + _mcl_biome_type = "snowy", }) minetest.register_biome({ name = "IcePlainsSpikes_ocean", @@ -147,6 +153,7 @@ local function register_biomes() y_max = 0, humidity_point = 24, heat_point = -5, + _mcl_biome_type = "snowy", }) -- Cold Taiga @@ -163,6 +170,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 58, heat_point = 8, + _mcl_biome_type = "snowy", }) -- A cold beach-like biome, implemented as low part of Cold Taiga @@ -181,6 +189,7 @@ local function register_biomes() y_max = 2, humidity_point = 58, heat_point = 8, + _mcl_biome_type = "snowy", }) -- Water part of the beach. Added to prevent snow being on the ice. minetest.register_biome({ @@ -197,6 +206,7 @@ local function register_biomes() y_max = 0, humidity_point = 58, heat_point = 8, + _mcl_biome_type = "snowy", }) minetest.register_biome({ name = "ColdTaiga_ocean", @@ -211,6 +221,7 @@ local function register_biomes() humidity_point = 58, heat_point = 8, vertical_blend = 1, + _mcl_biome_type = "snowy", }) -- Mega Taiga @@ -226,6 +237,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 76, heat_point = 10, + _mcl_biome_type = "cold", }) minetest.register_biome({ name = "MegaTaiga_ocean", @@ -239,6 +251,7 @@ local function register_biomes() y_max = 0, humidity_point = 76, heat_point = 10, + _mcl_biome_type = "cold", }) -- Mega Spruce Taiga @@ -254,6 +267,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 100, heat_point = 8, + _mcl_biome_type = "cold", }) minetest.register_biome({ name = "MegaSpruceTaiga_ocean", @@ -267,6 +281,7 @@ local function register_biomes() y_max = 0, humidity_point = 100, heat_point = 8, + _mcl_biome_type = "cold", }) -- Extreme Hills @@ -283,6 +298,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 10, heat_point = 45, + _mcl_biome_type = "cold", }) minetest.register_biome({ name = "ExtremeHills_beach", @@ -297,6 +313,7 @@ local function register_biomes() y_max = 3, humidity_point = 10, heat_point = 45, + _mcl_biome_type = "cold", }) minetest.register_biome({ name = "ExtremeHills_ocean", @@ -311,6 +328,7 @@ local function register_biomes() vertical_blend = 1, humidity_point = 10, heat_point = 45, + _mcl_biome_type = "cold", }) -- Extreme Hills M @@ -327,6 +345,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 0, heat_point = 25, + _mcl_biome_type = "cold", }) minetest.register_biome({ name = "ExtremeHillsM_ocean", @@ -340,6 +359,7 @@ local function register_biomes() y_max = 0, humidity_point = 0, heat_point = 25, + _mcl_biome_type = "cold", }) -- Extreme Hills+ @@ -358,6 +378,7 @@ local function register_biomes() humidity_point = 24, heat_point = 25, vertical_blend = 6, + _mcl_biome_type = "cold", }) ---- Sub-biome for Extreme Hills+ for those snow forests minetest.register_biome({ @@ -374,6 +395,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 24, heat_point = 25, + _mcl_biome_type = "cold", }) minetest.register_biome({ name = "ExtremeHills+_ocean", @@ -387,6 +409,7 @@ local function register_biomes() y_max = 0, humidity_point = 24, heat_point = 25, + _mcl_biome_type = "cold", }) -- Stone beach @@ -400,6 +423,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 0, heat_point = 8, + _mcl_biome_type = "cold", }) minetest.register_biome({ @@ -413,6 +437,7 @@ local function register_biomes() vertical_blend = 2, humidity_point = 0, heat_point = 8, + _mcl_biome_type = "cold", }) -- Ice Plains @@ -432,6 +457,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 24, heat_point = 8, + _mcl_biome_type = "snowy", }) minetest.register_biome({ name = "IcePlains_ocean", @@ -445,6 +471,7 @@ local function register_biomes() y_max = 0, humidity_point = 24, heat_point = 8, + _mcl_biome_type = "snowy", }) -- Plains @@ -460,6 +487,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 39, heat_point = 58, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "Plains_beach", @@ -473,6 +501,7 @@ local function register_biomes() y_max = 2, humidity_point = 39, heat_point = 58, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "Plains_ocean", @@ -486,6 +515,7 @@ local function register_biomes() y_max = -1, humidity_point = 39, heat_point = 58, + _mcl_biome_type = "medium", }) -- Sunflower Plains @@ -501,6 +531,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 28, heat_point = 45, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "SunflowerPlains_ocean", @@ -514,6 +545,7 @@ local function register_biomes() y_max = 0, humidity_point = 28, heat_point = 45, + _mcl_biome_type = "medium", }) -- Taiga @@ -529,6 +561,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 58, heat_point = 22, + _mcl_biome_type = "cold", }) minetest.register_biome({ name = "Taiga_beach", @@ -542,6 +575,7 @@ local function register_biomes() y_max = 3, humidity_point = 58, heat_point = 22, + _mcl_biome_type = "cold", }) minetest.register_biome({ name = "Taiga_ocean", @@ -555,6 +589,7 @@ local function register_biomes() y_max = 0, humidity_point = 58, heat_point = 22, + _mcl_biome_type = "cold", }) -- Forest @@ -570,6 +605,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 61, heat_point = 45, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "Forest_beach", @@ -583,6 +619,7 @@ local function register_biomes() y_max = 0, humidity_point = 61, heat_point = 45, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "Forest_ocean", @@ -596,6 +633,7 @@ local function register_biomes() y_max = -2, humidity_point = 61, heat_point = 45, + _mcl_biome_type = "medium", }) -- Flower Forest @@ -611,6 +649,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 44, heat_point = 32, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "FlowerForest_beach", @@ -624,6 +663,7 @@ local function register_biomes() y_max = 2, humidity_point = 44, heat_point = 32, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "FlowerForest_ocean", @@ -637,6 +677,7 @@ local function register_biomes() y_max = -3, humidity_point = 44, heat_point = 32, + _mcl_biome_type = "medium", }) -- Birch Forest @@ -652,6 +693,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 78, heat_point = 31, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "BirchForest_ocean", @@ -665,6 +707,7 @@ local function register_biomes() y_max = 0, humidity_point = 78, heat_point = 31, + _mcl_biome_type = "medium", }) -- Birch Forest M @@ -680,6 +723,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 77, heat_point = 27, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "BirchForestM_ocean", @@ -693,6 +737,7 @@ local function register_biomes() y_max = 0, humidity_point = 77, heat_point = 27, + _mcl_biome_type = "medium", }) -- Desert @@ -709,6 +754,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 26, heat_point = 94, + _mcl_biome_type = "hot", }) minetest.register_biome({ name = "Desert_ocean", @@ -722,6 +768,7 @@ local function register_biomes() y_max = 0, humidity_point = 26, heat_point = 94, + _mcl_biome_type = "hot", }) -- Roofed Forest @@ -737,6 +784,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 94, heat_point = 27, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "RoofedForest_ocean", @@ -750,6 +798,7 @@ local function register_biomes() y_max = 0, humidity_point = 94, heat_point = 27, + _mcl_biome_type = "medium", }) -- Mesa: Starts with a couple of sand-covered layers (the "sandlevel"), @@ -766,6 +815,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 0, heat_point = 100, + _mcl_biome_type = "hot", }) -- Helper biome for the red sand at the bottom of Mesas. minetest.register_biome({ @@ -781,6 +831,7 @@ local function register_biomes() y_max = 10, humidity_point = 0, heat_point = 100, + _mcl_biome_type = "hot", }) minetest.register_biome({ name = "Mesa_ocean", @@ -795,6 +846,7 @@ local function register_biomes() vertical_blend = 1, humidity_point = 0, heat_point = 100, + _mcl_biome_type = "hot", }) -- Mesa Bryce: Variant of Mesa, but with perfect strata and a much smaller red sand desert @@ -810,6 +862,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = -5, heat_point = 100, + _mcl_biome_type = "hot", }) minetest.register_biome({ name = "MesaBryce_sandlevel", @@ -824,6 +877,7 @@ local function register_biomes() y_max = 3, humidity_point = -5, heat_point = 100, + _mcl_biome_type = "hot", }) minetest.register_biome({ name = "MesaBryce_ocean", @@ -838,6 +892,7 @@ local function register_biomes() vertical_blend = 1, humidity_point = -5, heat_point = 100, + _mcl_biome_type = "hot", }) @@ -857,6 +912,7 @@ local function register_biomes() humidity_point = 0, heat_point = 60, vertical_blend = 0, -- we want a sharp transition + _mcl_biome_type = "hot", }) -- The oak forest plateau of this biome. -- This is a plateau for grass blocks, dry shrubs, tall grass, coarse dirt and oaks. @@ -874,6 +930,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 0, heat_point = 60, + _mcl_biome_type = "hot", }) minetest.register_biome({ name = "MesaPlateauF_sandlevel", @@ -888,6 +945,7 @@ local function register_biomes() y_max = 10, humidity_point = 0, heat_point = 60, + _mcl_biome_type = "hot", }) minetest.register_biome({ name = "MesaPlateauF_ocean", @@ -902,6 +960,7 @@ local function register_biomes() vertical_blend = 1, humidity_point = 0, heat_point = 60, + _mcl_biome_type = "hot", }) -- Mesa Plateau FM @@ -921,6 +980,7 @@ local function register_biomes() humidity_point = -5, heat_point = 60, vertical_blend = 5, + _mcl_biome_type = "hot", }) -- Grass plateau minetest.register_biome({ @@ -936,6 +996,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = -5, heat_point = 60, + _mcl_biome_type = "hot", }) minetest.register_biome({ name = "MesaPlateauFM_sandlevel", @@ -952,6 +1013,7 @@ local function register_biomes() humidity_point = -5, heat_point = 60, vertical_blend = 4, + _mcl_biome_type = "hot", }) minetest.register_biome({ name = "MesaPlateauFM_ocean", @@ -966,6 +1028,7 @@ local function register_biomes() vertical_blend = 2, humidity_point = -5, heat_point = 60, + _mcl_biome_type = "hot", }) @@ -982,6 +1045,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 36, heat_point = 79, + _mcl_biome_type = "hot", }) minetest.register_biome({ name = "Savanna_beach", @@ -995,6 +1059,7 @@ local function register_biomes() y_max = 0, humidity_point = 36, heat_point = 79, + _mcl_biome_type = "hot", }) minetest.register_biome({ name = "Savanna_ocean", @@ -1008,6 +1073,7 @@ local function register_biomes() y_max = -2, humidity_point = 36, heat_point = 79, + _mcl_biome_type = "hot", }) -- Savanna M @@ -1025,6 +1091,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 48, heat_point = 100, + _mcl_biome_type = "hot", }) minetest.register_biome({ name = "SavannaM_ocean", @@ -1038,6 +1105,7 @@ local function register_biomes() y_max = 0, humidity_point = 48, heat_point = 100, + _mcl_biome_type = "hot", }) -- Jungle @@ -1053,6 +1121,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 88, heat_point = 81, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "Jungle_shore", @@ -1066,6 +1135,7 @@ local function register_biomes() y_max = 0, humidity_point = 88, heat_point = 81, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "Jungle_ocean", @@ -1080,6 +1150,7 @@ local function register_biomes() vertical_blend = 1, humidity_point = 88, heat_point = 81, + _mcl_biome_type = "medium", }) -- Jungle M @@ -1096,6 +1167,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 92, heat_point = 81, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "JungleM_shore", @@ -1109,6 +1181,7 @@ local function register_biomes() y_max = 0, humidity_point = 92, heat_point = 81, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "JungleM_ocean", @@ -1123,6 +1196,7 @@ local function register_biomes() vertical_blend = 1, humidity_point = 92, heat_point = 81, + _mcl_biome_type = "medium", }) -- Jungle Edge @@ -1138,6 +1212,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 88, heat_point = 76, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "JungleEdge_ocean", @@ -1151,6 +1226,7 @@ local function register_biomes() y_max = 0, humidity_point = 88, heat_point = 76, + _mcl_biome_type = "medium", }) -- Jungle Edge M (very rare). @@ -1169,6 +1245,7 @@ local function register_biomes() y_max = mcl_vars.mg_overworld_max, humidity_point = 90, heat_point = 79, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "JungleEdgeM_ocean", @@ -1182,6 +1259,7 @@ local function register_biomes() y_max = 0, humidity_point = 90, heat_point = 79, + _mcl_biome_type = "medium", }) -- Swampland @@ -1198,6 +1276,7 @@ local function register_biomes() y_max = 23, humidity_point = 90, heat_point = 50, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "Swampland_shore", @@ -1211,6 +1290,7 @@ local function register_biomes() y_max = 0, humidity_point = 90, heat_point = 50, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "Swampland_ocean", @@ -1225,6 +1305,7 @@ local function register_biomes() vertical_blend = 1, humidity_point = 90, heat_point = 50, + _mcl_biome_type = "medium", }) -- Mushroom Island / Mushroom Island Shore (rare) @@ -1243,6 +1324,7 @@ local function register_biomes() vertical_blend = 1, humidity_point = 106, heat_point = 50, + _mcl_biome_type = "medium", }) minetest.register_biome({ @@ -1257,6 +1339,7 @@ local function register_biomes() y_max = 3, humidity_point = 106, heat_point = 50, + _mcl_biome_type = "medium", }) minetest.register_biome({ name = "MushroomIsland_ocean", @@ -1270,6 +1353,7 @@ local function register_biomes() y_max = 0, humidity_point = 106, heat_point = 50, + _mcl_biome_type = "medium", }) -- Add deep ocean and underground biomes automatically. @@ -1290,6 +1374,7 @@ local function register_biomes() node_riverbed = "mcl_core:gravel", depth_riverbed = 2, vertical_blend = 5, + _mcl_biome_type = minetest.registered_biomes[biome]._mcl_biome_type, }) -- Underground biomes are used to identify the underground and to prevent nodes from the surface @@ -1300,6 +1385,7 @@ local function register_biomes() humidity_point = minetest.registered_biomes[biome].humidity_point, y_min = mcl_vars.mg_overworld_min, y_max = DEEP_OCEAN_MIN - 1, + _mcl_biome_type = minetest.registered_biomes[biome]._mcl_biome_type, }) end @@ -1322,6 +1408,7 @@ local function register_dimension_biomes() y_max = mcl_vars.mg_nether_max + 80, heat_point = 100, humidity_point = 0, + _mcl_biome_type = "hot", }) --[[ THE END ]] @@ -1337,6 +1424,7 @@ local function register_dimension_biomes() y_max = mcl_vars.mg_end_max + 80, heat_point = 50, humidity_point = 50, + _mcl_biome_type = "medium", }) end From 1b7c41fc81d40cb43eee24631d65bba61b3dd98b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 25 Mar 2019 09:22:08 +0100 Subject: [PATCH 259/379] Grass block: Change grass color depending on biome --- mods/ITEMS/mcl_core/functions.lua | 20 ++++++++++++++++++++ mods/ITEMS/mcl_core/nodes_base.lua | 15 +++------------ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index c040ce7e8..bad9f3bd2 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -639,6 +639,23 @@ end local grass_spread_randomizer = PseudoRandom(minetest.get_mapgen_setting("seed")) +-- Return appropriate grass block node for pos. Dry grass for dry/hot biomes, normal grass otherwise. +function mcl_core.get_grass_block_type(pos) + local biome_data = minetest.get_biome_data(pos) + local dry = false + if biome_data then + local biome = biome_data.biome + local biome_name = minetest.get_biome_name(biome) + local biome_type = minetest.registered_biomes[biome_name]._mcl_biome_type + dry = biome_type == "hot" + end + if dry then + return {name="mcl_core:dirt_with_dry_grass"} + else + return {name="mcl_core:dirt_with_grass"} + end +end + ------------------------------ -- Spread grass blocks and mycelium on neighbor dirt ------------------------------ @@ -681,6 +698,9 @@ minetest.register_abm({ if light_self >= 4 and light_source >= 9 then -- All checks passed! Let's spread the grass/mycelium! local n2 = minetest.get_node(p2) + if minetest.get_item_group(n2.name, "grass_block") ~= 0 then + n2 = mcl_core.get_grass_block_type(pos) + end minetest.set_node(pos, {name=n2.name}) -- If this was mycelium, uproot plant above diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 0661bb43d..bcef7d74f 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -321,18 +321,9 @@ minetest.register_node("mcl_core:dirt_with_grass", { footstep = {name="default_grass_footstep", gain=0.4}, }), on_construct = function(pos) - local dim = mcl_worlds.pos_to_dimension(pos) - local dry - if dim == "nether" then - dry = true - else - local found_node = minetest.find_node_near(pos, 1, {"mcl_core:dirt_with_dry_grass", "mcl_core:dirt_with_dry_grass_snow"}) - if found_node then - dry = true - end - end - if dry then - minetest.set_node(pos, {name="mcl_core:dirt_with_dry_grass"}) + local new_node = mcl_core.get_grass_block_type(pos) + if new_node.name ~= "mcl_core:dirt_with_grass" then + minetest.set_node(pos, new_node) end return mcl_core.on_snowable_construct(pos) end, From 435ae85d68e832331a8e725badb87f11cdd99262 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 25 Mar 2019 09:38:39 +0100 Subject: [PATCH 260/379] Fix grass block crash in v6 --- mods/ITEMS/mcl_core/functions.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index bad9f3bd2..bcbab0e70 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -646,8 +646,11 @@ function mcl_core.get_grass_block_type(pos) if biome_data then local biome = biome_data.biome local biome_name = minetest.get_biome_name(biome) - local biome_type = minetest.registered_biomes[biome_name]._mcl_biome_type - dry = biome_type == "hot" + local reg_biome = minetest.registered_biomes[biome_name] + if reg_biome then + biome_type = reg_biome._mcl_biome_type + dry = biome_type == "hot" + end end if dry then return {name="mcl_core:dirt_with_dry_grass"} From c5db9987c3e1962c856820b2e22aa1df6675754b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 25 Mar 2019 11:01:52 +0100 Subject: [PATCH 261/379] Fix various typos in German translation --- .../mcl_minecarts/locale/mcl_minecarts.de.tr | 4 ++-- mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr | 2 +- mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr | 2 +- mods/HELP/mcl_doc/locale/mcl_doc.de.tr | 2 +- .../mcl_dispensers/locale/mcl_dispensers.de.tr | 16 ++++++++-------- .../locale/mesecons_commandblock.de.tr | 2 +- mods/ITEMS/mcl_books/locale/mcl_books.de.tr | 2 +- mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 17 +++++++++-------- mods/ITEMS/mcl_core/locale/template.txt | 1 + mods/ITEMS/mcl_core/nodes_base.lua | 2 +- mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr | 4 ++-- mods/ITEMS/mcl_end/locale/mcl_end.de.tr | 4 ++-- mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr | 6 +++--- mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr | 2 +- mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr | 2 +- mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr | 2 +- mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr | 2 +- .../mcl_throwing/locale/mcl_throwing.de.tr | 2 +- mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr | 2 +- 20 files changed, 40 insertions(+), 38 deletions(-) diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr index 9eb3d1a8e..65df678e8 100644 --- a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr +++ b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr @@ -9,11 +9,11 @@ Minecart with Furnace=Lore mit Ofen Minecart with Command Block=Lore mit Befehlsblock Minecart with Hopper=Lore mit Trichter Minecart with TNT=Lore mit 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.=Bauen Sie sie auf den Boden, um Ihre Schienennetzwerk zu errichten, die Schienen werden sich automatisch verbinden und sich nach Bedarf in Kurven, Einmündungen, Kreuzungen und Steigungen verwandeln. +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.=Bauen Sie sie auf den Boden, um Ihr Schienennetzwerk zu errichten, die Schienen werden sich automatisch verbinden und sich nach Bedarf in Kurven, Einmündungen, Kreuzungen und Steigungen verwandeln. Rail=Schiene Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=Schienen können benutzt werden, um Strecken für Loren zu bauen. Normale Schienen werden Loren aufgrund von Reibung leicht verlangsamen. Powered Rail=Antriebsschiene -Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Schienen können benutzt werden, um Strecken für Loren zu bauen. Antribsschienen können Loren beschleunigen und abbremsen. +Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Schienen können benutzt werden, um Strecken für Loren zu bauen. Antriebsschienen können Loren beschleunigen und abbremsen. Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Ohne Redstone-Energie wird die Schiene Loren abbremsen. Mit Redstone-Energie wird sie sie beschleunigen. Activator Rail=Aktivierungsschiene Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Schienen können benutzt werden, um Strecken für Loren zu bauen. Aktivierungsschienen werden benutzt, um besondere Loren zu aktivieren. diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr index f423547b2..59f65eae8 100644 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr @@ -1,6 +1,6 @@ # textdomain: mcl_mobs Peaceful mode active! No monsters will spawn.=Friedlicher Modus aktiv! Es werden keine Monster auftauchen. -This allows you to place a single mob.=Damit kann man eine Mob platzieren. +This allows you to place a single mob.=Damit kann man einen Mob platzieren. 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.=Platzieren Sie dies einfach dort, wo der Mob auftauchen soll. Tiere werden zahm erscheinen, außer, wenn Sie beim Platzieren die Schlichtaste drücken. Platzieren Sie dies auf einem Mobspawner, um den Mob im Mobspawner zu wechseln. You need the “maphack” privilege to change the mob spawner.=Sie brauchen das „maphack“-Privileg, um den Mobspawner ändern zu können. Name Tag=Namensschild diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr index ecf058b4a..a81891e22 100644 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr @@ -1,7 +1,7 @@ # textdomain: mobs_mc Totem of Undying=Totem der Unsterblichkeit A totem of undying is a rare artifact which may safe you from certain death.=Ein Totem der Unsterblichkeit ist ein seltenes Artefakt, dass Sie vor dem sicheren Tod bewahren kann. -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.=Der Totem funktioneirt nur, während Sie ihn halten. Wenn Sie normalerweise tödlich hohen Schaden erhalten, werden Sie vor dem Tod bewahrt und Sie erhalten eine zweite Chance mit 1 TP. Der Totem wird dabei zerstört. +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.=Der Totem funktioniert nur, während Sie ihn halten. Wenn Sie normalerweise tödlich hohen Schaden erhalten, werden Sie vor dem Tod bewahrt und Sie erhalten eine zweite Chance mit 1 TP. Der Totem wird dabei zerstört. Agent=Akteur Bat=Fledermaus Blaze=Lohe diff --git a/mods/HELP/mcl_doc/locale/mcl_doc.de.tr b/mods/HELP/mcl_doc/locale/mcl_doc.de.tr index ff88f98a6..b9207b4a6 100644 --- a/mods/HELP/mcl_doc/locale/mcl_doc.de.tr +++ b/mods/HELP/mcl_doc/locale/mcl_doc.de.tr @@ -19,7 +19,7 @@ To drink it, wield it, then rightclick.=Um dies zu trinken, halten Sie es, dann You cannot drink this when your hunger bar is full.=Sie können dies nicht trinken, wenn Ihre Hungerleiste voll ist. To consume it, wield it, then rightclick.=Um dies zu konsumieren, halten Sie es, dann rechtsklicken Sie. You cannot consume this when your hunger bar is full.=Sie können dies nicht konsumieren, wenn Ihre Hungerleiste voll ist. -You have to wait for about 2 seconds before you can eat or drink again.=Sie müssen für etwa 2 Sekunden warten, bevor Sie erneut essen oder trinken können- +You have to wait for about 2 seconds before you can eat or drink again.=Sie müssen für etwa 2 Sekunden warten, bevor Sie erneut essen oder trinken können. Hunger points restored: @1=Erhaltene Hungerpunkte: @1 Saturation points restored: @1%.1f=Erhaltene Sättigungspunkte: @1 This item can be repaired at an anvil with: @1.=Dieser Gegenstand kann an einem Amboss repariert werden mit: @1 diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.de.tr b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.de.tr index a1f7b7885..1fd2959dd 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.de.tr +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.de.tr @@ -1,21 +1,21 @@ # textdomain: mcl_dispensers Dispenser=Werfer -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.=Ein Werfer ist eine Block, der als eine Redstonekomponente fungiert die, wenn sie mit Redstoneenergie versorgt ist, einen Gegenstand auswirft. Er hat einen Behälter mit 9 Inventarplätzen. -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.=Platzieren Sie den Werfer in einer von 6 möglichen Richtungen. Das „Loch“ ist die Stelle, aus der Gegenstände aus dem Werfer fliegen. Benutzen Sie den Werfer, um auf das Inventar zuzugreifen. +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.=Ein Werfer ist ein Block, der als eine Redstonekomponente fungiert, die, wenn sie mit Redstoneenergie versorgt ist, einen Gegenstand auswirft. Er hat einen Behälter mit 9 Inventarplätzen. +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.=Platzieren Sie den Werfer in einer von 6 möglichen Richtungen. Das „Loch“ ist die Stelle, aus der Dinge aus dem Werfer fliegen. Benutzen Sie den Werfer, um auf das Inventar zuzugreifen. The dispenser will do different things, depending on the dispensed item:=Der Werfer wird, abhängig vom geworfenem Gegenstand, unterschiedliche Dinge tun: • Arrows: Are launched=• Pfeile: Werden gefeuert • Eggs and snowballs: Are thrown=• Eier und Schneebälle: Werden geworfen • Fire charges: Are fired in a straight line=• Feuerkugeln: Werden schnurgerade abgefeuert • Armor: Will be equipped to players and armor stands=• Rüstung: Spieler und Rüstungsständer werden ausgerüstet -• Boats: Are placed on water or are dropped=• Werden auf Wasser platziert oder abgeworfen -• Minecart: Are placed on rails or are dropped=• Werden auf Schienen platziert oder abgeworfen +• Boats: Are placed on water or are dropped=• Boote: Werden auf Wasser platziert oder abgeworfen +• Minecart: Are placed on rails or are dropped=• Loren: Werden auf Schienen platziert oder abgeworfen • Bone meal: Is applied on the block it is facing=• Knochenmehl: Wird auf den Block, auf den er zeigt, angewandt • Empty buckets: Are used to collect a liquid source=• Leere Eimer: Sammeln Flüssigkeitsquelle auf • Filled buckets: Are used to place a liquid source=• Volle Eimer: Platzieren eine Flüssigkeitsquelle -• Heads, pumpkins: Equipped to players and armor stands, or placed as a block=• Köpfe, Kürbisse: Spieler und Rüstungsständer werden ausgerüstet, oder wird als Block platziert -• Shulker boxes: Are placed as a block=Schulkerkisten: Werden als Block platziert -• TNT: Is placed and ignited=• TNT: Wird platzierd unt angezündet -• Flint and steel: Is used to ignite a fire in air and to ignite TNT=• Endzündet ein Feuer in der Luft und zündet TNT an +• Heads, pumpkins: Equipped to players and armor stands, or placed as a block=• Köpfe, Kürbisse: Spieler und Rüstungsständer werden ausgerüstet, alternativ werden diese Gegenstände als Block platziert +• Shulker boxes: Are placed as a block=• Schulkerkisten: Werden als Block platziert +• TNT: Is placed and ignited=• TNT: Wird platziert und angezündet +• Flint and steel: Is used to ignite a fire in air and to ignite TNT=• Feuerzeuge: Endzündet ein Feuer in der Luft und zündet TNT an • Spawn eggs: Will summon the mob they contain=• Spawn-Eier: Beschwören einen Mob • Other items: Are simply dropped=• Andere Gegenstände: Werden fallen gelassen Downwards-Facing Dispenser=Nach unten zeigender Werfer diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr index 4517be9c2..fe10965f3 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr @@ -13,7 +13,7 @@ Command Block=Befehlsblock Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power.=Befehlsblöcke sind mächtige Redstonekomponenten, die das Gefüge der Realität selbst verändern können. Mit anderen Worten, sie lassen den Server Serverbefehle ausführen, wenn sie mit Redstoneenergie versorgt werden. Everyone can activate a command block and look at its commands, but not everyone can edit and place them.=Jeder kann einen Befehlsblock aktivieren und sich seine Befehle ansehen, aber nicht jeder kann sie bearbeiten und platzieren. To view the commands in a command block, use it. To activate the command block, just supply it with redstone power. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.=Um die Befehle in einem Befehlsblock zu betrachten, benutzen Sie ihn. Um ihn zu aktivieren, versorgen Sie ihn einfach mit Redstoneenergie. Das wird die Befehle einmalig ausführen. Um sie erneut auszuführen, schalten Sie die Redstoneenergie aus und wieder ein. -To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.=Um einen Befehlsblock platzieren und die Befehle ändern zu können, müssen Sie im Kreativmodus sein und das „maphack“-Privileg habe. Ein neuer Befehlsblock hat keine Befehle und tut gar nichts. Benutzen Sie den Befehlsblock (im Kreativmodus!), um seine Befehle zu bearbeiten. Lesen Sie den Hilfeeintrag „Fortgeschrittenes > Serverbefehle“, um zu verstehen, wie Befehle funktionieren. Jede Zeile enthält einen einzigen Befehl. Sie geben Sie wie in der Konsole ein, aber ohne den Schrägstrich am Anfang. +To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.=Um einen Befehlsblock platzieren und die Befehle ändern zu können, müssen Sie im Kreativmodus sein und das „maphack“-Privileg haben. Ein neuer Befehlsblock hat keine Befehle und tut gar nichts. Benutzen Sie den Befehlsblock (im Kreativmodus!), um seine Befehle zu bearbeiten. Lesen Sie den Hilfeeintrag „Fortgeschrittenes > Serverbefehle“, um zu verstehen, wie Befehle funktionieren. Jede Zeile enthält einen einzigen Befehl. Sie geben Sie wie in der Konsole ein, aber ohne den Schrägstrich am Anfang. All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.=Alle Befehle werden im Namen des Spielers, der den Befehlsblock platziert hat, ausgeführt, als ob der Spieler die Befehle eingegeben hätte. Diesen Spieler nennen wir den „Kommandanten“ des Blocks. Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:=Befehlsblöcke unterstützen Platzhalter, geben sie einen dieser Platzhalter ein und sie werden durch einen anderen Text ersetzt: • “@c”: commander of this command block=• „@c“: Befehlshaber dieses Befehlsblocks diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.de.tr b/mods/ITEMS/mcl_books/locale/mcl_books.de.tr index 261c099a4..398843d97 100644 --- a/mods/ITEMS/mcl_books/locale/mcl_books.de.tr +++ b/mods/ITEMS/mcl_books/locale/mcl_books.de.tr @@ -9,7 +9,7 @@ by @1=von @1 Sign=Signieren Done=Fertig This item can be used to write down some notes.=Dies kann benutzt werden, um ein paar Notizen aufzuschreiben. -Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Halten Sie es in der Hand, dann rechtsklicken Sie, um die Notizen zu sehen zu zu ändern. Sie können den Text beliebig ändern. Sie können das Buch auch signieren und in ein geschriebenes Buch verwandeln, das gestapelt, aber nicht mehr geändert werden kann. +Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Halten Sie es in der Hand, dann rechtsklicken Sie, um die Notizen zu sehen und zu ändern. Sie können den Text beliebig ändern. Sie können das Buch auch signieren und in ein geschriebenes Buch verwandeln, das gestapelt, aber nicht mehr geändert werden kann. A book can hold up to 4500 characters. The title length is limited to 64 characters.=Ein Buch kann bis zu 4500 Zeichen enthalten. Die Titellänge ist begrenzt auf 64 Zeichen. Enter book title:=Buchtitel eingeben: Note: The book will no longer@nbe editable after signing.=Anmerkung: Das Buch kann nach@nder Signierung nicht länger@nbearbeitet werden. diff --git a/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr b/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr index 6141c96a6..2fac283e9 100644 --- a/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr +++ b/mods/ITEMS/mcl_chests/locale/mcl_chests.de.tr @@ -5,7 +5,7 @@ To access its inventory, rightclick it. When broken, the items will drop out.=Um Trapped Chest=Mechanismustruhe A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.=Mechanismustruhen sind Behälter, die 27 Inventarplätze Platz bieten. Wenn sie geöffnet wird, sendet sie ein Redstone-Signal zu benachbarten Blöcken, solange sie geöffnet bleibt. Mechanismustruhen verwandeln sich in große Mechanismustruhen mit der doppelten Kapazität, wenn zwei Mechanismustruhen nebeneinander platziert werden. Ender Chest=Endertruhe -Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.=Endertruhen gewähren Ihnen Zugriff zu einem einzigartigen persönlichem interdimensionalem Inventar mit 27 Plätzen. Dieses Inventar ist das gleiche, egal, welche Endertruhe sie benutzen. Wenn Sie einen Gegenstand in eine Endertruhe platzieren, werden Sie sie in allen anderen Endertruhen vorhinden. Jeder Spieler wird nur seine eigenen Gegenstände sehen, aber nicht die der anderen Spieler. +Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.=Endertruhen gewähren Ihnen Zugriff zu einem einzigartigen persönlichen interdimensionalen Inventar mit 27 Plätzen. Dieses Inventar ist das selbe, egal, welche Endertruhe sie benutzen. Wenn Sie einen Gegenstand in eine Endertruhe platzieren, werden Sie sie in allen anderen Endertruhen vorhinden. Jeder Spieler wird nur seine eigenen Gegenstände sehen, aber nicht die der anderen Spieler. Rightclick the ender chest to access your personal interdimensional inventory.=Rechtsklicken Sie die Endertruhe, um auf Ihr persönliches interdimensionales Inventar zuzugreifen. White Shulker Box=Weiße Schulkerkiste Light Grey Shulker Box=Hellgraue Schulkerkiste diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index e5e528654..bb7fc6d26 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -3,10 +3,10 @@ @1 died in lava.=@1 starb in Lava. @1 melted in lava.=@1 schmolz in der Lava. @1 took a bath in a hot lava tub.=@1 nahm ein Bad in einer heißen Lavawanne. -A block of diamond is mostly a shiny decorative block but also useful as a compact storage of diamonds.=Ein Diamantblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Diamanten. -A block of emerald is mostly a shiny decorative block but also useful as a compact storage of emeralds.=Ein Smaragdblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Smaragden. +A block of diamond is mostly a shiny decorative block but also useful as a compact storage of diamonds.=Ein Diamantblock ist hauptsächlich ein schicker Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Diamanten. +A block of emerald is mostly a shiny decorative block but also useful as a compact storage of emeralds.=Ein Smaragdblock ist hauptsächlich ein schicker Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Smaragden. A block of gold is mostly a shiny decorative block but also useful as a compact storage of gold ingots.=Ein Goldblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Goldbarren. -A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots.=Ein Eisenblock ist hauptsächlich ein glänzender Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Eisenbarren. +A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots.=Ein Eisenblock ist hauptsächlich ein Dekorationsblock, aber er ist auch nützlich zur kompakten Aufbewahrung von Eisenbarren. A cactus can only be placed on top of another cactus or any sand.=Ein Kaktus kann nur auf einem anderen Kaktus oder auf beliebigem Sand platziert werden. A decorative and mostly transparent block.=Ein Dekoblock, der größtenteils transparent ist. A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.=Ein Grasblock ist Erde mit einer Grasschicht. Grasblöcke sind vielseitige Blöcke, die das Wachstum aller möglichen Pflanzen fördern. Mit einer Hacke kann man das Land bestellen und einen Ackerboden machen. Mit einer Schaufel verwandelt man ihn in einen Graspfad. Im Licht wird das Gras sich langsam auf benachbarte Erde ausbreiten. Unter einem lichtundurchlässigen Block kann sich dieser Block wieder zurück zu Erde verwandeln. @@ -65,7 +65,7 @@ Clay is a versatile kind of earth commonly found at beaches underwater.=Ton ist Coal=Kohle Coal Ore=Kohleerz Coarse Dirt=Grobe Erde -Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.=Große Erde ist für einige Pflanzen ein Erdboden und ähnlich wie Erde, aber auf ihr wird nie eine Grasschicht oder ähnliches wachsen. +Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.=Grobe Erde ist für einige Pflanzen ein Erdboden und ähnlich wie Erde, aber auf ihr wird nie eine Grasschicht oder ähnliches wachsen. Cobblestone=Kopfsteinpflaster Cobweb=Spinnennetz Cobwebs can be walked through, but significantly slow you down.=Spinnennetze können passiert werden, aber sie verlangsamen Sie beträchtlich. @@ -112,12 +112,12 @@ Golden apples are precious food items which can be eaten.=Goldene Äpfel sind ko Granite=Granit Grass Block=Grasblock Grass Path=Graspfad -Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Graspfade sind eine dekorative Variante von Grasblöcken. Ihre Oberseite hat eine andere Farbe und sie sind etwas niedriger als Grasblöcke, wodurch sie nützlich sind, um Fußwege zu errichten. Graspfade werden mit einer Schaufel errichtet. Ein Grasphad verwandelt sich in Erde, wenn er sich unter einem festen Block befindet. +Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Graspfade sind eine dekorative Variante von Grasblöcken. Ihre Oberseite hat eine andere Farbe und sie sind etwas niedriger als Grasblöcke, wodurch sie nützlich sind, um Fußwege zu errichten. Graspfade werden mit einer Schaufel errichtet. Ein Graspfad verwandelt sich in Erde, wenn er sich unter einem festen Block befindet. Gravel=Kies Green Stained Glass=Grünes Buntglas Grey Stained Glass=Graues Buntglas Ice=Eis -Ice is a translucent solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.=Eis ist ein durchscheinender fester Block, der oft in kalten Gebieten gefunden werden kann. Er schmitzt in der nähe von Block-Lichtquellen bei einer Helligkeit von 12 oder höher. Wenn es schmilzt oder abgeaut wird, und darunter ein anderer Block war, wird er sich in eine Wasserquelle verwandeln. +Ice is a translucent solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.=Eis ist ein durchscheinender fester Block, der oft in kalten Gebieten gefunden werden kann. Er schmilzt in der Nähe von Block-Lichtquellen bei einer Helligkeit von 12 oder höher. Wenn es schmilzt oder abgebaut wird, und darunter ein anderer Block war, wird er sich in eine Wasserquelle verwandeln. In the End dimension, starting a fire on this block will create an eternal fire.=In der Ende-Dimension wird Feuer auf diesem Block ewig brennen. Iron Ingot=Eisenbarren Iron Nugget=Eisenklumpen @@ -155,7 +155,7 @@ Oak Wood Planks=Eichenholzplanken Oak leaves are grown from oak trees.=Eichenblätter wachsen von Eichen. Obsidian=Obsidian Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava.=Obsidian ist ein extrem hartes Mineral mit einem enormen Sprengwiderstand. -One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.=Eines der häufigsten Blöcke der Welt, fast der ganze Untergrund besteht aus stein. Er enthält manchmal Erze. Stein kann entstehen, wenn Wasser auf Lava trifft. +One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.=Eines der häufigsten Blöcke der Welt, fast der ganze Untergrund besteht aus Stein. Er enthält manchmal Erze. Stein kann entstehen, wenn Wasser auf Lava trifft. Orange Stained Glass=Orange Buntglas Packed Ice=Packeis Packed ice is a compressed form of ice. It is opaque and solid.=Packeis ist eine kompakte Eisform. Es ist undurchsichtig und fest. @@ -192,7 +192,7 @@ Smooth red sandstone is a decorative building block.=Glatter roter Sandstein ist Smooth sandstone is compressed sand and is a rather soft kind of stone.=Glatter Sandstein ist komprimierter Sand und ein relativ weiches Gestein. Snow=Schnee Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=Etwas Kohle im Stein, es kommt sehr häufig vor und kann in mittelgroßen bis großen Ansammlungen im Stein bei fast jeder Höhe gefunden werden. -Some iron contained in stone, it is prety common and can be found below sea level.=Etwas Eisen umschlossen von Stein, es ist recht verbreitet und kann unter der Meeresoberfläche gefunden werden. +Some iron contained in stone, it is prety common and can be found below sea level.=Etwas Eisen umschlossen von Stein, es ist recht verbreitet und kann unter dem Meeresspiegel gefunden werden. Spruce Bark=Fichtenrinde Spruce Leaves=Fichtenblätter Spruce Sapling=Fichtensetzling @@ -245,3 +245,4 @@ Lava interacts with water various ways:=Lava reagiert mit Wasser auf verschieden • When a lava source is directly below or horizontally next to water, the lava turns into obsidian.=• Wenn sich eine Lavaquelle direkt unter oder horizontal neben Wasser befindet, verwandelt sich die Lava zu Obsidian. • When lava is directly above water, the water turns into stone.=• Wenn sich Lava direkt über Wasser befindet, verwandelt sich das Wasser zu Stein. Stained Glass=Buntglas +Granite is an igneous rock.=Granit ist ein magmatisches Gestein. diff --git a/mods/ITEMS/mcl_core/locale/template.txt b/mods/ITEMS/mcl_core/locale/template.txt index e8313e800..005aa6736 100644 --- a/mods/ITEMS/mcl_core/locale/template.txt +++ b/mods/ITEMS/mcl_core/locale/template.txt @@ -244,3 +244,4 @@ Lava interacts with water various ways:= • When a lava source is directly below or horizontally next to water, the lava turns into obsidian.= • When lava is directly above water, the water turns into stone.= Stained Glass= +Granite is an igneous rock.= diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index bcef7d74f..8c7db7714 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -237,7 +237,7 @@ minetest.register_node("mcl_core:stone_smooth", { minetest.register_node("mcl_core:granite", { description = S("Granite"), - _doc_items_longdesc = "Granite is an igneous rock.", + _doc_items_longdesc = S("Granite is an igneous rock."), tiles = {"mcl_core_granite.png"}, is_ground_content = true, stack_max = 64, diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr index 6b9273b75..7cb502c69 100644 --- a/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr @@ -1,5 +1,5 @@ # textdomain: mcl_doors -Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Holztüren sind 2-Block hohe Barrieren, die von Hand oder mit einem Redstone-Signal geöffnet oder geschlossen werden können. +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Holztüren sind 2 Blöcke hohe Barrieren, die von Hand oder mit einem Redstone-Signal geöffnet oder geschlossen werden können. To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Um die Holztür zu öffnen oder zu schließen, rechtsklicken Sie sie oder versorgen Sie sie mit einem Redstone-Signal. Oak Door=Eichentür Acacia Door=Akazientür @@ -8,7 +8,7 @@ Dark Oak Door=Schwarzeichentür Jungle Door=Dschungeltür Spruce Door=Fichtentür Iron Door=Eisentür -Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.=Eisentüren sind 2-Block hohe Barrieren, die nur von einem Redstone-Signal geöffnet oder geschlossen werden können. +Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.=Eisentüren sind 2 Blöcke hohe Barrieren, die nur von einem Redstone-Signal geöffnet oder geschlossen werden können. To open or close an iron door, supply its lower half with a redstone signal.=Um eine Eisentür zu öffnen oder zu schließen, versorgen Sie die untere Hälfte mit einem Redstone-Signal. Oak Trapdoor=Eichenfalltür Acacia Trapdoor=Akazienfalltür diff --git a/mods/ITEMS/mcl_end/locale/mcl_end.de.tr b/mods/ITEMS/mcl_end/locale/mcl_end.de.tr index 08119ae77..1ed9858cf 100644 --- a/mods/ITEMS/mcl_end/locale/mcl_end.de.tr +++ b/mods/ITEMS/mcl_end/locale/mcl_end.de.tr @@ -11,9 +11,9 @@ Chorus Flower=Chorusblume A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow.=Eine Chorusblume ist der lebendige Teil einer Choruspflanze. Sie kann zu einer großen Choruspflanze heranwachsen, Schritt für Schritt. Wenn sie wächst, wird sie irgendwann am Alter absterben. Sie stirbt auch ab, wenn sie nicht weiterwachsen kann. Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly one chorus plant stem.=Platzieren Sie sie und warten Sie darauf, dass sie wächst. Sie kann nur auf Endstein, auf einen anderen Choruspflanzenstängel oder an der Seite von genau einem Choruspflanzenstängel platziert werden. Dead Chorus Flower=Tote Chorusblume -This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again.=Dies ist ein Teil einer Choruspflanze. Er wächst nicht. Choruspflanzen werden mit der Zeit alt und sterben ab, sie sterben auch ab, wenn sie nicht weiterwachsen können. Eine tote Chorusblume kann geerntet werden, um eine frische neue Choruspflanze zu erhalten, die wieder wachsen kann. +This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again.=Dies ist ein Teil einer Choruspflanze. Er wächst nicht. Chorusblumen werden mit der Zeit alt und sterben ab, sie sterben auch ab, wenn sie nicht weiterwachsen können. Eine tote Chorusblume kann geerntet werden, um eine frische neue Choruspflanze zu erhalten, die wieder wachsen kann. Chorus Plant Stem=Choruspflanzenstängel -A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers.=Ein Choruspflanzenstängel ist der Teil einer Choruspflanze, der die gesamte Pflanze zusammenhält. Sie braucht Endstein als Unterground. Stängel wachsen aus Chorusblumen. +A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers.=Ein Choruspflanzenstängel ist der Teil einer Choruspflanze, der die gesamte Pflanze zusammenhält. Sie braucht Endstein als Untergrund. Stängel wachsen aus Chorusblumen. Chorus Fruit=Chorusfrucht A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to.=Eine Chorusfrucht ist eine essbare Frucht von der Choruspflanze, die im Ende beheimatet ist. Wenn man sie isst, wird man auf einen zufälligen festen Block in der Nähe teleportiert, solange man nicht in eine Flüssigkeit, einen festen oder gefährlichen Block landen würde. Die Teleportation könnte fehlschlagen, wenn es sehr wenige oder keine Orte gibt, zu denen sie einen hinteleportieren könnte. Popped Chorus Fruit=Aufgeploppte Chorusfrucht diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr index 90226967f..f6e83573b 100644 --- a/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr +++ b/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr @@ -13,12 +13,12 @@ Beetroot=Rote-Beete-Rübe Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.=Rote-Beete-Rüben sind eine Speise und nützlich zur Herstellung von Farbstoffen. Schweine mögen sie auch. Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=Halten Sie es in der Hand und rechtsklicken Sie, um es zu essen. Rechtsklicken Sie auf ein Tier, um es zu füttern. Beetroot Soup=Rote-Beete-Suppe -Beetroot soup is a food item.=Rote-Beete-Suppe ist ein Lebensmittel +Beetroot soup is a food item.=Rote-Beete-Suppe ist ein Lebensmittel. Premature Carrot Plant=Junge Karottenpflanze Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Karottenpflanzen sind Pflanzen, die auf Ackerboden im Sonnenlicht in 8 Stufen wachsen, aber es gibt nur 4 sichtbar unterscheidbare Stufen. Auf bewässertem Ackerboden wachsen sie etwas schneller. Sie können jederzeit abgeerntet werden, aber werden nur einen Ertrag abwerfen, wenn sie ausgewachsen sind. Premature Carrot Plant (Stage @1)=Junge Karottenpflanze (@1. Stufe) Mature Carrot Plant=Ausgewachsene Karottenpflanze -Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=Ausgewachsene Karottenpflanze können für Karotten abgeerntet werden. Sie werden nicht weiter wachsen. +Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=Ausgewachsene Karottenpflanzen können für Karotten abgeerntet werden. Sie werden nicht weiter wachsen. Carrot=Karotte Carrots can be eaten and planted. Pigs and rabbits like carrots.=Karotten können gegessen und gepflanzt werden. Schweine und Kaninchen mögen Karotten. Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Halten Sie es in ihrer Hand und rechtsklicken Sie, um es zu essen. Platzieren Sie sie auf Ackerboden, um sie einzupflanzen. Sie wächst im Sonnenlicht und wächst auf bewässertem Ackerboden schneller. Rechtsklicken Sie auf ein Tier, um es zu füttern. @@ -76,7 +76,7 @@ Farmland is used for farming, a necessary surface to plant crops. It is created Hydrated Farmland=Bewässerter Ackerboden Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Bewässerter Ackerboden wird für den Ackerbau benutzt, auf ihm kann man Nutzpflanzen züchten. Er entsteht, wenn sich Ackerboden unter Regen oder in der Nähe von Wasser befindet. Ohne Wasser wird dieser Block irgendwann austrocknen. Dieser Block verwandelt sich zurück zu Erde, wenn über ihm ein fester Block auftaucht, oder ein Kolbenarm sich über ihn bewegt. Wheat Seeds=Weizensamen -Grows into a wheat plant. Chickens like wheat seeds.=Wachsen zu einer Weizenpflanze heran +Grows into a wheat plant. Chickens like wheat seeds.=Wachsen zu einer Weizenpflanze heran. Hühner mögen Weizensamen. Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=Platzieren Sie die Weizensamen auf Ackerboden (welcher mit einer Hacke gemacht werden kann), um eine Weizenpflanze zu pflanzen. Sie wächst im Sonnenlicht und wächst schneller auf bewässertem Ackerboden. Rechtsklicken Sie auf ein Tier, um es mit Weizensamen zu füttern. Premature Wheat Plant=Junge Weizenpflanze Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.=Junge Weizenpflanzen wachsen auf Ackerboden im Sonnenlicht in 8 Stufen. Auf bewässertem Ackerboden wachsen sie schneller. Sie können jederzeit abgeerntet werden, aber werden nur ertragreich sein, wenn sie ausgewachsen sind. diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr index 6185ad46a..feca70085 100644 --- a/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr @@ -7,7 +7,7 @@ Flint and steel is a tool to start fires and ignite blocks.=Ein Feuerzeug ist ei 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.=Rechtsklicken Sie auf die Oberfläche eines Blocks, um zu versuchen, ein Feuer auf ihm zu entfachen, oder den Block selbst anzuzünden. Ein paar Blocke reagieren besonders, wenn sie angezündet werden. 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.=Feuer ist ein schädlicher und destruktiver aber kurzlebiger Block. Es wird sich zu entzündlichen Blöcken ausbreiten und sie zerstören, aber Feuer wird verschwinden, wenn es nichts brennbares mehr gibt. Es wird von Wasser und Regen gelöscht. Feuer kann sicher mit einem Schlag zerstört werden, aber es tut weh, wenn man direkt in ihm steht. Wird ein Feuer über Netherrack oder einem Magmablock entfacht, wird er sich sofort zu einem ewigen Feuer verwandeln. 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.=Feuer ist ein schädlicher aber nicht-destruktiver kurzlebiger Block. Es wird verschwinden, wenn sich keine entzündlichen Blöcke in der Nähe befinden. Feuer breitet sich nicht aus und zerstört keine Blöcke, zumindest nicht in dieser Welt. Es wird von Wasser und Regen gelöscht. Feuer kann sicher mit einem Schlag zerstört werden, aber es tut weh, wenn man direkt in ihm steht. Wird ein Feuer über Netherrack oder einem Magmablock entfacht, wird er sich sofort zu einem ewigen Feuer verwandeln. -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.=Ewiges Feuer ist ein schädlicher Block, der mehr Feuer machen kann. Er wird um sich Feuer machen, wenn entflammbare Blöcke in der Nähe sind. Ewiges Feuer kann von Schlägen und Wasserblöcken in der Nähe gelöscht werden. Anders als (normales) Feuer geht ein ewiges Fuer nicht von alleine aus, auf nicht unter Regen. Es ist sicher, ein ewiges Feuer zu schlagen, aber es tut weh, wenn man direkt in einem steht. +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.=Ewiges Feuer ist ein schädlicher Block, der mehr Feuer machen kann. Er wird um sich Feuer machen, wenn entflammbare Blöcke in der Nähe sind. Ewiges Feuer kann von Schlägen und Wasserblöcken in der Nähe gelöscht werden. Anders als (normales) Feuer geht ein ewiges Feuer nicht von alleine aus, auch nicht unter Regen. Es ist sicher, ein ewiges Feuer zu schlagen, aber es tut weh, wenn man direkt in einem steht. @1 has been cooked crisp.=@1 wurde knusprig gebraten. @1 felt the burn.=@1 ist völlig verbrannt. @1 died in the flames.=@1 starb in den Flammen. diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr index 58634ad1c..cf12fd51a 100644 --- a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr +++ b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr @@ -29,4 +29,4 @@ Large fern is a variant of fern and occupies two blocks. It can be harvested for Double Tallgrass=Doppelhohes Gras Large Fern=Großer Farn Lily Pad=Seerosenblatt -A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Ein Seerosenblatt ist eine flache Pflanze, die eine stabile begehbare Oberfläche sind. Sie können auf Wasserquellen, auf Eis und brüchigem Eis platziert werden. +A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Ein Seerosenblatt ist eine flache Pflanze, die eine stabile begehbare Oberfläche ist. Sie kann auf Wasserquellen, auf Eis und brüchigem Eis platziert werden. diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr index 237740624..6c16d66df 100644 --- a/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr @@ -4,7 +4,7 @@ An End portal teleports creatures and objects to the mysterious End dimension (a Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=Springen Sie ins Portal, um sich zu teleportieren. Von der Oberwelt aus werden Sie zu einer festen Position im Ende hin teleportiert. Eine 5×5-Obsidianplattform wird am Zielort erzeugt. Im Ende werden Sie zurück zu Ihrem Startpunkt in der Oberwelt teleportiert. End Portal Frame=Endportalrahmen End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=Endportalrahmen werden in der Konstruktion von Endportalen benutzt. Jeder Block hat einen Sockel für ein Enderauge. -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.=Um ein Endportal zu pauen, brauchen sie 12 Endportalrahmen und 12 Enderaugen. Die Endportalrahmenblöcke muss um ein horizontales Feld von 3×3 platziert sein, wobei jeder von ihnen nach innen zeigt. Jede andere Anordnung wird nicht funktionieren. +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.=Um ein Endportal zu bauen, brauchen sie 12 Endportalrahmen und 12 Enderaugen. Die Endportalrahmenblöcke muss um ein horizontales Feld von 3×3 platziert sein, wobei jeder von ihnen nach innen zeigt. Jede andere Anordnung wird nicht funktionieren. Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.=Platzieren Sie ein Enderauge in jeden Block. Das Endportal wird sich in der Mitte öffnen, wenn das letzte Auge platziert wurde. End Portal Frame with Eye of Ender=Endportalrahmen mit Enderauge Nether Portal=Netherportal diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr index efe6688cb..324ac5dc8 100644 --- a/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr +++ b/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr @@ -6,7 +6,7 @@ A glass bottle is used as a container for liquids and can be used to collect wat To collect water, it on a cauldron with water (which removes a level of water) or any water source (which removes no water).=Um Wasser aufzusammen, benutzen Sie sie an einem Kessel mit Wasser (was etwas Wasser entfernt) oder einer Wasserquelle (was kein Wasser entfernt). Water Bottle=Wasserflasche Water bottles can be used to fill cauldrons. Drinking water has no effect.=Wasserflaschen können benutzt werden, um Kessel aufzufüllen. Trinken hat keine Wirkung. -Rightclick to drink. Rightclick a cauldron to pour the water into the cauldron.=Rechtsklicken zum Trinken. Auf einem Kessel rechtsklicken, um das Wasser in den Kessen zu schütten. +Rightclick to drink. Rightclick a cauldron to pour the water into the cauldron.=Rechtsklicken zum Trinken. Auf einem Kessel rechtsklicken, um das Wasser in den Kessel zu schütten. River Water Bottle=Flusswasserflasche River water bottles can be used to fill cauldrons. Drinking it has no effect.=Flusswasserflaschen können benutzt werden, um Kessel aufzufüllen. Trinken hat keine Wirkung. Awkward Potion=Seltsamer Trank diff --git a/mods/ITEMS/mcl_throwing/locale/mcl_throwing.de.tr b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.de.tr index 04eb6be25..61ad254f2 100644 --- a/mods/ITEMS/mcl_throwing/locale/mcl_throwing.de.tr +++ b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.de.tr @@ -6,4 +6,4 @@ Snowballs can be thrown or launched from a dispenser for fun. Hitting something Egg=Ei 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.=Eier können geworfen werden oder aus einem Werfer abgefeuert werden. Sie zerbrechen beim Einschlag. Mit etwas Glück werden aus dem Ei eines oder sogar 4 Küken hinausfallen. Ender Pearl=Enderperle -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.=Eine Enderperle ist eine Gegenstand, der zur Teleportation benutzt werden kann auf Kosten der Gesundheit. Sie kann geworfen werden und teleportiert den Werfer zur Einschlagsstelle, wenn sie einen Block oder eine Pflanze trifft. Jede Teleportation verletzt den Werfer um 5 Trefferpunkte. +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.=Eine Enderperle ist ein Gegenstand, der zur Teleportation benutzt werden kann auf Kosten der Gesundheit. Sie kann geworfen werden und teleportiert den Werfer zur Einschlagsstelle, wenn sie einen Block oder eine Pflanze trifft. Jede Teleportation verletzt den Werfer um 5 Trefferpunkte. diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr index adb73a23e..25ca32c4e 100644 --- a/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr @@ -1,5 +1,5 @@ # 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.=Sie benutzen Ihre nackte Hand, wenn Sie keinen Gegenstand halten. Mit Ihrer Hand können Sie die meisten Blöcke abbauen, aber dies ist die langsamste Methode und nur aus den schwächsten Blöcken werden ihren brauchbaren Gegenstände hinausfallen. Die Hand richtet auch geringfügigen Schaden mit Schlägen an. Die Hand ist oft die letzte Wahl, da richtige Grabewerkzeuge und Waffen viel besser sind. +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.=Sie benutzen Ihre nackte Hand, wenn Sie keinen Gegenstand halten. Mit Ihrer Hand können Sie die meisten Blöcke abbauen, aber dies ist die langsamste Methode und nur aus den schwächsten Blöcken werden ihre brauchbaren Gegenstände hinausfallen. Die Hand richtet auch geringfügigen Schaden mit Schlägen an. Die Hand ist oft die letzte Wahl, da richtige Grabewerkzeuge und Waffen viel besser sind. 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.=Wenn Sie einen Gegenstand tragen, der kein Grabewerkzeug oder eine Waffe ist, wird sie sich verhalten, als ob Sie die Hand benutzen würden, wenn Sie etwas abbauen oder schlagen. In Creative Mode, the hand is able to break all blocks instantly.=Im Kreativmodus kann die Hand alle Blöcke sofort zerstören. Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.=Spitzhacken sind Grabewerkzeuge, um harte Blöcke wie Stein abzubauen. Eine Spitzhacke kann auch als Waffe benutzt werden, aber das ist recht ineffizient. From 967905264ddf652feefe5c57ac73d5fa2b091fe2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 25 Mar 2019 12:05:57 +0100 Subject: [PATCH 262/379] Make many help texts translatable and fix bugs --- mods/ENTITIES/mobs_mc/1_items_default.lua | 2 +- mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr | 1 + mods/ENTITIES/mobs_mc/locale/template.txt | 1 + .../mcl_comparators/locale/mcl_comparators.de.tr | 2 +- .../mesecons_button/locale/mesecons_button.de.tr | 2 +- mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua | 12 ++++++------ .../locale/mesecons_commandblock.de.tr | 12 ++++++------ .../mesecons_commandblock/locale/template.txt | 10 +++++----- .../mesecons_delayer/locale/mesecons_delayer.de.tr | 3 +-- .../REDSTONE/mesecons_delayer/locale/template.txt | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 2 ++ mods/ITEMS/mcl_core/locale/template.txt | 2 ++ mods/ITEMS/mcl_core/nodes_base.lua | 4 ++-- mods/ITEMS/mcl_end/eye_of_ender.lua | 2 +- mods/ITEMS/mcl_end/locale/mcl_end.de.tr | 3 ++- mods/ITEMS/mcl_end/locale/template.txt | 1 + mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr | 5 +++-- mods/ITEMS/mcl_farming/locale/template.txt | 5 +++-- mods/ITEMS/mcl_farming/wheat.lua | 2 +- mods/ITEMS/mcl_mobitems/init.lua | 4 ++-- mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr | 2 ++ mods/ITEMS/mcl_mobitems/locale/template.txt | 2 ++ mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr | 1 + mods/ITEMS/mcl_nether/locale/template.txt | 1 + mods/ITEMS/mcl_nether/nether_wart.lua | 2 +- mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr | 2 ++ mods/ITEMS/mcl_portals/locale/template.txt | 4 ++-- mods/ITEMS/mcl_portals/portal_end.lua | 4 ++-- mods/ITEMS/mcl_potions/init.lua | 7 ++++--- mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr | 3 +++ mods/ITEMS/mcl_potions/locale/template.txt | 3 +++ mods/ITEMS/mcl_tnt/locale/mcl_tnt.de.tr | 4 ++-- mods/ITEMS/mcl_tools/init.lua | 2 +- mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr | 1 + mods/ITEMS/mcl_tools/locale/template.txt | 1 + mods/ITEMS/mcl_torches/init.lua | 6 +----- 36 files changed, 72 insertions(+), 50 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/1_items_default.lua b/mods/ENTITIES/mobs_mc/1_items_default.lua index 9a36256ac..f0e1301e9 100644 --- a/mods/ENTITIES/mobs_mc/1_items_default.lua +++ b/mods/ENTITIES/mobs_mc/1_items_default.lua @@ -274,7 +274,7 @@ if c("saddle") and c("lether") and c("string") and c("iron_ingot") then end -- Horse Armor -local horse_armor_use = "Rightclick a horse to put on the horse armor. Donkeys and mules can't wear horse armor." +local horse_armor_use = S("Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.") -- TODO: Balance the horse armor strength, compare with MC armor strength if c("iron_horse_armor") then minetest.register_craftitem("mobs_mc:iron_horse_armor", { diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr index a81891e22..1e5140280 100644 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr @@ -58,6 +58,7 @@ Golden Horse Armor=Goldpferderüstung Golden horse armor can be worn by horses to increase their protection from harm.=Eine Goldpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden zu erhöhen. Diamond Horse Armor=Diamantpferderüstung Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Eine Diamantpferderüstung kann von Pferden getragen werden, um ihren Schutz vor Schaden beträchtlich zu erhöhen. +Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Platzieren Sie es auf einem Pferd, um die Pferderüstung aufzusetzen. Esel und Maultiere können keine Pferderüstung tragen. Farmer=Bauer Fisherman=Fischer Fletcher=Pfeilmacher diff --git a/mods/ENTITIES/mobs_mc/locale/template.txt b/mods/ENTITIES/mobs_mc/locale/template.txt index d2c7c2393..3cd260ce9 100644 --- a/mods/ENTITIES/mobs_mc/locale/template.txt +++ b/mods/ENTITIES/mobs_mc/locale/template.txt @@ -58,6 +58,7 @@ Golden Horse Armor= Golden horse armor can be worn by horses to increase their protection from harm.= Diamond Horse Armor= Diamond horse armor can be worn by horses to greatly increase their protection from harm.= +Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.= Farmer= Fisherman= Fletcher= diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.de.tr b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.de.tr index 2e378ef7b..dbbd51a23 100644 --- a/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.de.tr +++ b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.de.tr @@ -3,7 +3,7 @@ Redstone comparators are multi-purpose redstone components.=Redstonekomparatoren They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.=Sie können ein Redstonesignal übertragen, erkennen, ob ein Block Gegenstände enthält und mehrere Signale vergleichen. 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.=Ein Redstonekomparator hat 1 Haupteingang, 2 Seiteneingänge und 1 Ausgang. Der Ausgang ist in Pfeilrichtung, der Haupteingang ist in der gegenüberliegenden Richtung. Die anderen 2 Seiten sind die Seiteneingänge. 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.=Der Haupteingang kann auf 2 Weisen versorgt werden: Erstens, kann er direkt von Redstoneenergie wie bei jeder anderen Komponente versorgt werden. Zweitens wird er versorgt, wenn, und nur wenn ein Behälter (wie eine Truhe) vor dem Komporator platziert wurde und der Behälter mindestens einen Gegenstand enthält. -The side inputs are only powered by normal redstone power. The redstone 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.=Die Seiteneingänge akzeptieren nur normale Redstoneenergie. Der Redstonekomparator kann in zwei Modi agieren: Übertragungsmodus und Subtraktionsmodus. Er fängt im Übertragungsmodus an. Der Modus wird beim Benutzen des Blocks geändert. +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.=Die Seiteneingänge akzeptieren nur normale Redstoneenergie. Der Redstonekomparator kann in zwei Modi agieren: Übertragungsmodus und Subtraktionsmodus. Er fängt im Übertragungsmodus an. Der Modus wird beim Benutzen des Blocks geändert. 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.=Übertragungsmodus:@nDie vordere Fackel ist eingefahren und leuchtet nicht auf. Die Ausgabe gibt ein Signal, wenn, nur nur wenn der Haupteingang bestromt wird. Die zwei Seiteneingänge werden ignoriert. 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.=Subtraktionsmodus:@nDie vordere Fackel leuchtet auf. Die Ausgabe gibt ein Signal wenn, nur nur wenn der Haupteingang versorgt wird und keiner der Seiteneingänge bestromt ist. Redstone Comparator=Redstonekomparator diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.de.tr b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.de.tr index da25ab73e..60d644378 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.de.tr +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.de.tr @@ -1,7 +1,7 @@ # textdomain: mesecons_button Use the button to push it.=Benutzen Sie den Knopf, um ihn zu drücken. Stone Button=Steinknopf -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. =Ein Steinknopf ist eine Redstonekomponente aus Stein. Er kann gedrückt werden, um ein Redstonesignal zu senden. Im gedrückten Zustand versorgt er benachbarte Redstonekomponenten für 1 Sekunde mit Redstoneenergie. +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.=Ein Steinknopf ist eine Redstonekomponente aus Stein. Er kann gedrückt werden, um ein Redstonesignal zu senden. Im gedrückten Zustand versorgt er benachbarte Redstonekomponenten für 1 Sekunde mit Redstoneenergie. Oak Button=Eichenknopf Acacia Button=Akazienknopf Birch Button=Birkenknopf diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index e8749f026..855eb86d0 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -217,15 +217,15 @@ S("To be able to place a command block and change the commands, you need to be i S("All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.").."\n\n".. S("Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:").."\n".. -S("• “@c”: commander of this command block").."\n".. -S("• “@n” or “@p”: nearest player from the command block").."\n".. -S("• “@f” farthest player from the command block").."\n".. -S("• “@r”: random player currently in the world").."\n".. -S("• “@@”: literal “@” sign").."\n\n".. +S("• “@@c”: commander of this command block").."\n".. +S("• “@@n” or “@@p”: nearest player from the command block").."\n".. +S("• “@@f” farthest player from the command block").."\n".. +S("• “@@r”: random player currently in the world").."\n".. +S("• “@@@@”: literal “@@” sign").."\n\n".. S("Example 1:\n time 12000\nSets the game clock to 12:00").."\n\n".. -S("Example 2:\n give @n mcl_core:apple 5\n→ Gives the nearest player 5 apples"), +S("Example 2:\n give @@n mcl_core:apple 5\n→ Gives the nearest player 5 apples"), tiles = {{name="jeija_commandblock_off.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=2}}}, groups = {creative_breakable=1, mesecon_effector_off=1}, diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr index fe10965f3..307f26c64 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr @@ -15,12 +15,12 @@ Everyone can activate a command block and look at its commands, but not everyone To view the commands in a command block, use it. To activate the command block, just supply it with redstone power. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.=Um die Befehle in einem Befehlsblock zu betrachten, benutzen Sie ihn. Um ihn zu aktivieren, versorgen Sie ihn einfach mit Redstoneenergie. Das wird die Befehle einmalig ausführen. Um sie erneut auszuführen, schalten Sie die Redstoneenergie aus und wieder ein. To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.=Um einen Befehlsblock platzieren und die Befehle ändern zu können, müssen Sie im Kreativmodus sein und das „maphack“-Privileg haben. Ein neuer Befehlsblock hat keine Befehle und tut gar nichts. Benutzen Sie den Befehlsblock (im Kreativmodus!), um seine Befehle zu bearbeiten. Lesen Sie den Hilfeeintrag „Fortgeschrittenes > Serverbefehle“, um zu verstehen, wie Befehle funktionieren. Jede Zeile enthält einen einzigen Befehl. Sie geben Sie wie in der Konsole ein, aber ohne den Schrägstrich am Anfang. All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.=Alle Befehle werden im Namen des Spielers, der den Befehlsblock platziert hat, ausgeführt, als ob der Spieler die Befehle eingegeben hätte. Diesen Spieler nennen wir den „Kommandanten“ des Blocks. -Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:=Befehlsblöcke unterstützen Platzhalter, geben sie einen dieser Platzhalter ein und sie werden durch einen anderen Text ersetzt: -• “@c”: commander of this command block=• „@c“: Befehlshaber dieses Befehlsblocks -• “@n” or “@p”: nearest player from the command block=• „@n“ oder „@p“: Nächster Spieler am Befehlsblock -• “@f” farthest player from the command block=• Der vom Befehelsblock am weitesten entfernte Spieler -• “@r”: random player currently in the world=• „@r“: Zufälliger Spieler in der Welt -• “@@”: literal “@” sign=• Nur das „@“-Zeichen +Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:=Befehlsblöcke unterstützen Platzhalter. Geben Sie einen dieser Platzhalter ein und sie werden durch einen anderen Text ersetzt: +• “@@c”: commander of this command block=• „@@c“: Befehlshaber dieses Befehlsblocks +• “@@n” or “@@p”: nearest player from the command block=• „@@n“ oder „@@p“: Nächster Spieler am Befehlsblock +• “@@f” farthest player from the command block=• „@@f“: Der vom Befehlsblock am weitesten entfernte Spieler +• “@@r”: random player currently in the world=• „@@r“: Zufälliger Spieler in der Welt +• “@@@@”: literal “@@” sign=• „@@@@“: Nur das „@@“-Zeichen Example 1:@n time 12000@nSets the game clock to 12:00=1. Beispiel:@n time 12000@nSetzt die Spieluhr auf 12:00 Uhr Example 2:@n give @@n mcl_core:apple 5@n→ Gives the nearest player 5 apples=2. Beispiel:@n give @@n mcl_core:apple 5@n→ Gibt dem nächsten Spieler 5 Äpfel Access denied. You need the “maphack” privilege to edit command blocks.=Zugriff verweigert. Sie brauchen das „maphack“-Privileg, um Befehlsblöcke zu bearbeiten. diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt index c20f5f08a..a2ce9ebec 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt @@ -16,11 +16,11 @@ To view the commands in a command block, use it. To activate the command block, To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.= All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.= Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:= -• “@c”: commander of this command block= -• “@n” or “@p”: nearest player from the command block= -• “@f” farthest player from the command block= -• “@r”: random player currently in the world= -• “@@”: literal “@” sign= +• “@@c”: commander of this command block= +• “@@n” or “@@p”: nearest player from the command block= +• “@@f” farthest player from the command block= +• “@@r”: random player currently in the world= +• “@@@@”: literal “@@” sign= Example 1:@n time 12000@nSets the game clock to 12:00= Example 2:@n give @@n mcl_core:apple 5@n→ Gives the nearest player 5 apples= Access denied. You need the “maphack” privilege to edit command blocks.= diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.de.tr b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.de.tr index 1f031c645..db17d7f69 100644 --- a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.de.tr +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.de.tr @@ -1,9 +1,8 @@ # 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.=Redstoneverstärker sind vielseitige Komponenten mit den folgenden Verwendungszwecken: 1.: Sie lassen Signale nur in eine Richtung durch. 2.: Sie verzögern das Signal. 3.: Sie können optional ihr Ausgangssignal sperren -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, user 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.=Um einen Redstoneverstärker zu versorgen, senden Sie ein Signal in „Pfeilrichtung“ (dem Eingang). Das Signal geht aus der gegenüberliegenden Seite (dem Ausgang) mit einer Verzögerung hinaus. Um die Verzögerung zu ändern, benutzen Sie den Redstoneverstärker. Die Verzögerung ist zwischen 0,1 bis 0,4 Sekunden lang und kann in Schritten von 0,1 Sekunden geändert werden. Das wird mit der Position der verschiebbaren Redstonefackel angezeigt. +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.=Um einen Redstoneverstärker zu versorgen, senden Sie ein Signal in „Pfeilrichtung“ (dem Eingang). Das Signal geht aus der gegenüberliegenden Seite (dem Ausgang) mit einer Verzögerung hinaus. Um die Verzögerung zu ändern, benutzen Sie den Redstoneverstärker. Die Verzögerung ist zwischen 0,1 bis 0,4 Sekunden lang und kann in Schritten von 0,1 Sekunden geändert werden. Das wird mit der Position der verschiebbaren Redstonefackel angezeigt. 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.=Um einen Verstärker zu sperren, senden Sie ein Signal eines benachbarten Verstärkers in eines der Seiten. Im gesperrten Zustand verschwindet die verschiebbare Redstonefackel, die Ausgabe ändert sich nicht mehr und der Eingang wird ignoriert. Redstone Repeater=Redstoneverstärker Redstone Repeater (Powered)=Redstoneverstärker (bestromt) Redstone Repeater (Locked)=Redstoneverstärker (gesperrt) Redstone Repeater (Locked, Powered)=Redstoneverstärker (gesperrt, bestromt) - diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/template.txt index 596a5b38d..e694d70a7 100644 --- a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/template.txt @@ -1,6 +1,6 @@ # 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.= -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, user 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.= +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.= 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.= Redstone Repeater= Redstone Repeater (Powered)= diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index bb7fc6d26..3460001d6 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -246,3 +246,5 @@ Lava interacts with water various ways:=Lava reagiert mit Wasser auf verschieden • When lava is directly above water, the water turns into stone.=• Wenn sich Lava direkt über Wasser befindet, verwandelt sich das Wasser zu Stein. Stained Glass=Buntglas Granite is an igneous rock.=Granit ist ein magmatisches Gestein. +Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.=Eine Schneeschicht kann gestapelt werden und hat eine von 8 verschiedenen Höhestufen. Bei den Höhestufen 2-8 ist die Schneeschnicht kollidierbar. Schneeschichten werfen 2-9 Schneebälle ab, abhängig von ihrer Höhe. +This block can only be placed on full solid blocks and on another top snow (which increases its height).=Dieser Block kann nur auf ganzen festen Blöcken und auf anderen Schneeschichten (was die Höhe erhöht) platziert werden. diff --git a/mods/ITEMS/mcl_core/locale/template.txt b/mods/ITEMS/mcl_core/locale/template.txt index 005aa6736..8460b90f0 100644 --- a/mods/ITEMS/mcl_core/locale/template.txt +++ b/mods/ITEMS/mcl_core/locale/template.txt @@ -245,3 +245,5 @@ Lava interacts with water various ways:= • When lava is directly above water, the water turns into stone.= Stained Glass= Granite is an igneous rock.= +Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.= +This block can only be placed on full solid blocks and on another top snow (which increases its height).= diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 8c7db7714..9062c8e71 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -881,8 +881,8 @@ for i=1,8 do if i == 1 then id = "mcl_core:snow" desc = S("Top Snow") - longdesc = S("Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.".."\n".."Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.") - usagehelp = "This block can only be placed on full solid blocks and on another top snow (which increases its height)." + longdesc = S("Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.").."\n"..S("Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.") + usagehelp = S("This block can only be placed on full solid blocks and on another top snow (which increases its height).") walkable = false else id = "mcl_core:snow_"..i diff --git a/mods/ITEMS/mcl_end/eye_of_ender.lua b/mods/ITEMS/mcl_end/eye_of_ender.lua index 3dbebebf6..d074e3923 100644 --- a/mods/ITEMS/mcl_end/eye_of_ender.lua +++ b/mods/ITEMS/mcl_end/eye_of_ender.lua @@ -74,7 +74,7 @@ minetest.register_entity("mcl_end:ender_eye", { minetest.register_craftitem("mcl_end:ender_eye", { description = S("Eye of Ender"), - _doc_items_longdesc = S("This item is used to locate End portal shrines in the Overworld and to activate End portals." .. "\n" .. "NOTE: The End dimension is currently incomplete and might change in future versions."), + _doc_items_longdesc = S("This item is used to locate End portal shrines in the Overworld and to activate End portals.") .. "\n" .. S("NOTE: The End dimension is currently incomplete and might change in future versions."), _doc_items_usagehelp = S("Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.") .. "\n" .. S("To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame."), wield_image = "mcl_end_ender_eye.png", inventory_image = "mcl_end_ender_eye.png", diff --git a/mods/ITEMS/mcl_end/locale/mcl_end.de.tr b/mods/ITEMS/mcl_end/locale/mcl_end.de.tr index 1ed9858cf..b63cc8497 100644 --- a/mods/ITEMS/mcl_end/locale/mcl_end.de.tr +++ b/mods/ITEMS/mcl_end/locale/mcl_end.de.tr @@ -19,5 +19,6 @@ A chorus fruit is an edible fruit from the chorus plant which is home to the End Popped Chorus Fruit=Aufgeploppte Chorusfrucht Eye of Ender=Enderauge This item is used to locate End portal shrines in the Overworld and to activate End portals.=Dieser Gegenstand wird benutzt, um Endportalschreine in der Oberwelt zu finden und Endportale zu aktivieren. -Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.=Benutzen Sie die Angriffstaste, um das Enderauge loszulassen. Er wird aufsteigen und in einer horizontalen Richtung zum nächsten Endportalschrein fliegen. Wenn Sie sehr nah dran sind, wird das Enderauge stattdessen den direkten Weg zum Endportalschrein nehmen. Nach ein paar Sekunden hält er an. Es könnte als Gegenstand wieder herunterfalle, aber er wird mit einer 20%-Chance zerbrechen. +Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.=Benutzen Sie die Angriffstaste, um das Enderauge loszulassen. Es wird aufsteigen und in einer horizontalen Richtung zum nächsten Endportalschrein fliegen. Wenn Sie sehr nah dran sind, wird das Enderauge stattdessen den direkten Weg zum Endportalschrein nehmen. Nach ein paar Sekunden hält es an. Es könnte als Gegenstand wieder herunterfallen, aber es wird mit einer 20%-Chance zerbrechen. To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.=Um ein Endportal zu aktivieren, müssen Enderaugen in jeden Block eines intakten Endportalrahmens platziert werden. +NOTE: The End dimension is currently incomplete and might change in future versions.=ANMERKUNG: Die Ende-Dimension ist momentan unfertig und könnte sich in künftigen Versionen ändern. diff --git a/mods/ITEMS/mcl_end/locale/template.txt b/mods/ITEMS/mcl_end/locale/template.txt index 1d74608a5..5e605eeac 100644 --- a/mods/ITEMS/mcl_end/locale/template.txt +++ b/mods/ITEMS/mcl_end/locale/template.txt @@ -21,3 +21,4 @@ Eye of Ender= This item is used to locate End portal shrines in the Overworld and to activate End portals.= Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.= To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.= +NOTE: The End dimension is currently incomplete and might change in future versions.= diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr index f6e83573b..bdb496621 100644 --- a/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr +++ b/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr @@ -34,7 +34,7 @@ Diamond Hoe=Diamanthacke Melon Seeds=Melonensamen Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=Platzieren Sie die Melonensamen auf Ackerboden (der mit einer Hacke gemacht werden kann), um einen Melonenstängel zu pflanzen. Melonenstängel wachsen im Sonnenlicht und wachen auf bewässertem Ackerboden schneller. Ausgewachsen wird der Melonenstängel versuchen, an der Seite eine Melone wachsen zu lassen. Rechtsklicken Sie auf ein Tier, um es mit Melonensamen zu füttern. Melon=Melone -Grows into a melon stem which in turn is able to grow melons. Chickens like melon seeds.=Wächst zu einem Melonenstängel heran, aus dem wiederum Melonen wachsen können. Hühner mögen Melonensamen. +Grows into a melon stem which in turn grows melons. Chickens like melon seeds.=Wächst zu einem Melonenstängel heran, aus dem wiederum Melonen wachsen. Hühner mögen Melonensamen. A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=Eine Melone ist ein Block, der von Melonenstängeln wächst, der wiederum aus Melonensamen wächst. Er kann für Melonenstücke abgeerntet werden. Premature Melon Stem=Junger Melonenstängel Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=Melonenstängel wachsen auf Ackerboden in 8 Stufen. Auf bewässertem Ackerboden ist das Wachstum etwas schneller. Aus ausgewachsenen Melonenstängeln können Melonen wachsen. @@ -56,7 +56,7 @@ Baked potatoes are food items which are more filling than the unbaked ones.=Ofen Poisonous Potato=Giftige Kartoffel This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=Diese Kartoffel sieht nicht gerade gesund aus. Sie kann gegessen werden, um Hungerpunkte zu erhalten, aber es gibt eine Chance von 60%, dass das Sie kurz vergiften wird. Pumpkin Seeds=Kürbissamen -Grows into a pumpkin stem which in turn is able to grow pumpkins. Chickens like pumpkin seeds.=Wächst zu einem Kürbisstängel heran, aus dem wiederum Kürbisse wachsen können. Hühner mögen Kürbissamen. +Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.=Wächst zu einem Kürbisstängel heran, aus dem wiederum Kürbisse wachsen. Hühner mögen Kürbissamen. Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=Platzieren Sie die Kürbissamen auf Ackerboden (der mit einer Hacke gemacht werden kann), um einen Kürbisstängel zu pflanzen. Kürbisstängel wachsen im Sonnenlicht und wachsen auf bewässertem Ackerboden schneller. Ausgewachsen wird der Kürbisstängel versuchen, einen Kürbis an einem benachbartem Feld wachsen zu lassen. Rechtsklicken Sie auf ein Tier, um es mit Kürbissamen zu füttern. Premature Pumpkin Stem=Junger Kürbisstängel Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.=Kürbisstängel wachsen auf Ackerboden in 8 Stufen. Auf bewässertem Ackerboden ist das Wachstum etwas schneller. Aus ausgewachsenen Kürbisstängeln können Kürbisse wachsen. @@ -90,3 +90,4 @@ Bread=Brot Hay Bale=Heuballen Hay bales are decorative blocks made from wheat.=Heuballen sind dekorative Blöcke, die aus Weizen gemacht sind. To carve a face into the pumpkin, use the shears on the side you want to carve.=Um ein Gesicht in den Kürbis zu schnitzen, benutzen Sie die Schere an der Seite, die Sie schnitzen wollen. +Use the “Place” key on an animal to try to feed it wheat.=Benutzen Sie die „Platzieren“-Taste auf einem Tier, um zu versuchen, es zu füttern. diff --git a/mods/ITEMS/mcl_farming/locale/template.txt b/mods/ITEMS/mcl_farming/locale/template.txt index 81a52b010..fb124df67 100644 --- a/mods/ITEMS/mcl_farming/locale/template.txt +++ b/mods/ITEMS/mcl_farming/locale/template.txt @@ -32,7 +32,7 @@ Iron Hoe= Golden Hoe= Diamond Hoe= Melon Seeds= -Grows into a melon stem which in turn is able to grow melons. Chickens like melon seeds.= +Grows into a melon stem which in turn grows melons. Chickens like melon seeds.= Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.= Melon= A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.= @@ -56,7 +56,7 @@ Baked potatoes are food items which are more filling than the unbaked ones.= Poisonous Potato= This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.= Pumpkin Seeds= -Grows into a pumpkin stem which in turn is able to grow pumpkins. Chickens like pumpkin seeds.= +Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.= Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.= Premature Pumpkin Stem= Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.= @@ -90,3 +90,4 @@ Bread= Hay Bale= Hay bales are decorative blocks made from wheat.= To carve a face into the pumpkin, use the shears on the side you want to carve.= +Use the “Place” key on an animal to try to feed it wheat.= diff --git a/mods/ITEMS/mcl_farming/wheat.lua b/mods/ITEMS/mcl_farming/wheat.lua index 41c31c347..1a65d1d16 100644 --- a/mods/ITEMS/mcl_farming/wheat.lua +++ b/mods/ITEMS/mcl_farming/wheat.lua @@ -90,7 +90,7 @@ mcl_farming:add_plant("plant_wheat", "mcl_farming:wheat", {"mcl_farming:wheat_1" minetest.register_craftitem("mcl_farming:wheat_item", { description = S("Wheat"), _doc_items_longdesc = S("Wheat is used in crafting. Some animals like wheat."), - _doc_items_usagehelp = "Rightclick an animal to try to feed it wheat.", + _doc_items_usagehelp = S("Use the “Place” key on an animal to try to feed it wheat."), inventory_image = "farming_wheat_harvested.png", groups = { craftitem = 1 }, }) diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index 27c2a538b..f25043116 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -172,7 +172,7 @@ minetest.register_craftitem("mcl_mobitems:spider_eye", { minetest.register_craftitem("mcl_mobitems:bone", { description = S("Bone"), _doc_items_longdesc = S("Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient."), - _doc_items_usagehelp = "Hold the bone in your hand near wolves to attract them. Rightclick the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by rightclicking it.", + _doc_items_usagehelp = S("Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it."), inventory_image = "mcl_mobitems_bone.png", stack_max = 64, groups = { craftitem=1 }, @@ -317,7 +317,7 @@ minetest.register_craftitem("mcl_mobitems:gunpowder", { minetest.register_tool("mcl_mobitems:carrot_on_a_stick", { description = S("Carrot on a Stick"), _doc_items_longdesc = S("A carrot on a stick can be used on saddled pigs to ride them."), - _doc_items_usagehelp = "Rightclick a saddled pig with the carrot on a stick to mount it. You can now ride it like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.", + _doc_items_usagehelp = S("Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick."), wield_image = "mcl_mobitems_carrot_on_a_stick.png", inventory_image = "mcl_mobitems_carrot_on_a_stick.png", groups = { transport = 1 }, diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr index 95e91814d..a392ffc27 100644 --- a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.de.tr @@ -58,3 +58,5 @@ Slimeballs are used in crafting. They are dropped from slimes.=Schleimkugeln wer Gunpowder=Schießpulver Carrot on a Stick=Karottenrute A carrot on a stick can be used on saddled pigs to ride them.=Eine Karottenrute kann auf gesattelten Schweinen angewendet werden, um sie zu reiten. +Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Platzieren Sie sie auf einem Schwein mit Sattel, um sich aufzusatteln. Sie können nun das Schwein wie ein Pferd reiten. Schweine werden auch auf Sie zugehen, wenn Sie einfach nur die Karottenrute halten. +Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=Halten Sie den Knochen in der Nähe von Wölfen, um sie anzulocken. Benutzen Sie die „Platzieren“-Taste auf dem Wolf, um ihm den Knochen zu geben und ihn zu zähmen. Sie können dem gezähmten Wolf Befehle erteilen, indem Sie die „Platzieren“-Taste auf ihm benutzen. diff --git a/mods/ITEMS/mcl_mobitems/locale/template.txt b/mods/ITEMS/mcl_mobitems/locale/template.txt index aa28e6b03..2c2c15d16 100644 --- a/mods/ITEMS/mcl_mobitems/locale/template.txt +++ b/mods/ITEMS/mcl_mobitems/locale/template.txt @@ -58,3 +58,5 @@ Slimeballs are used in crafting. They are dropped from slimes.= Gunpowder= Carrot on a Stick= A carrot on a stick can be used on saddled pigs to ride them.= +Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.= +Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.= diff --git a/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr b/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr index c114f8f3c..4ceafbd91 100644 --- a/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr +++ b/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr @@ -34,3 +34,4 @@ Mature Nether Wart=Ausgewachsener Netherwurz The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items.=Der ausgewachsene Netherwurz ist eine Pflanze aus dem Nether. Er hat seine volle Größe erreicht, ist erntereif und wächst nicht weiter. Nether Wart=Netherwurz Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages.=Netherwurze sind Pflanzen, die im Nether beheimatet sind. Sie können auf Seelensand gepflanzt werden und wachsen in 4 Stufen. +Place this item on soul sand to plant it and watch it grow.=Platzieren Sie den Gegenstand auf Seelensand, um ihn zu pflanzen und sehen Sie dabei zu, wie es wächst. diff --git a/mods/ITEMS/mcl_nether/locale/template.txt b/mods/ITEMS/mcl_nether/locale/template.txt index 7ad879fd3..cb0ba600a 100644 --- a/mods/ITEMS/mcl_nether/locale/template.txt +++ b/mods/ITEMS/mcl_nether/locale/template.txt @@ -34,3 +34,4 @@ Mature Nether Wart= The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items.= Nether Wart= Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages.= +Place this item on soul sand to plant it and watch it grow.= diff --git a/mods/ITEMS/mcl_nether/nether_wart.lua b/mods/ITEMS/mcl_nether/nether_wart.lua index 6e9b21c90..7b01e4621 100644 --- a/mods/ITEMS/mcl_nether/nether_wart.lua +++ b/mods/ITEMS/mcl_nether/nether_wart.lua @@ -98,7 +98,7 @@ minetest.register_node("mcl_nether:nether_wart", { minetest.register_craftitem("mcl_nether:nether_wart_item", { description = S("Nether Wart"), _doc_items_longdesc = S("Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages."), - _doc_items_usagehelp = "Place this item on soul sand to plant it and watch it grow.", + _doc_items_usagehelp = S("Place this item on soul sand to plant it and watch it grow."), inventory_image = "mcl_nether_nether_wart.png", wield_image = "mcl_nether_nether_wart.png", on_place = function(itemstack, placer, pointed_thing) diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr index 6c16d66df..55150a961 100644 --- a/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr @@ -4,6 +4,7 @@ An End portal teleports creatures and objects to the mysterious End dimension (a Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=Springen Sie ins Portal, um sich zu teleportieren. Von der Oberwelt aus werden Sie zu einer festen Position im Ende hin teleportiert. Eine 5×5-Obsidianplattform wird am Zielort erzeugt. Im Ende werden Sie zurück zu Ihrem Startpunkt in der Oberwelt teleportiert. End Portal Frame=Endportalrahmen End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=Endportalrahmen werden in der Konstruktion von Endportalen benutzt. Jeder Block hat einen Sockel für ein Enderauge. +NOTE: The End dimension is currently incomplete and might change in future versions.=ANMERKUNG: Die Ende-Dimension ist momentan unfertig und könnte sich in künftigen Versionen ändern. 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.=Um ein Endportal zu bauen, brauchen sie 12 Endportalrahmen und 12 Enderaugen. Die Endportalrahmenblöcke muss um ein horizontales Feld von 3×3 platziert sein, wobei jeder von ihnen nach innen zeigt. Jede andere Anordnung wird nicht funktionieren. Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.=Platzieren Sie ein Enderauge in jeden Block. Das Endportal wird sich in der Mitte öffnen, wenn das letzte Auge platziert wurde. End Portal Frame with Eye of Ender=Endportalrahmen mit Enderauge @@ -12,3 +13,4 @@ A Nether portal teleports creatures and objects to the hot and dangerous Nether 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.=Stellen Sie sich ins Portal für einen Moment, um sich zu teleportieren. Beim ersten Mal wird auch ein Portal in der anderen Dimension erschaffen. Wenn ein Netherportal im Nether gebaut wird, wird es zurück zur Oberwelt führen. Ein Netherportal wird zerstört, wenn das Obsidian, das ihn umgibt, zerstört wird, oder, wenn es einer Explosion ausgesetzt war. Obsidian is also used as the frame of Nether portals.=Obsidian wird auch als Rahmen von Netherportalen benutzt. To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Um ein Netherportal zu öffnen, platzieren Sie einen aufrechten Rahmen aus Obsidian mit einer Breite von 4 Blöcken und einer Höhe von 5 Blöcken, nur mit Luft in der Mitte. Nachdem Sie den Rahmen gebaut haben, entfachen Sie ein Feuer im Obsidianrahmen. Netherportale funktionieren nur in der Oberwelt und im Nether. +Once placed, an eye of ender can not be taken back.=Sobald platziert, kann ein Enderauge nicht mehr zurück genommen werden. diff --git a/mods/ITEMS/mcl_portals/locale/template.txt b/mods/ITEMS/mcl_portals/locale/template.txt index 3283da3f4..02482652e 100644 --- a/mods/ITEMS/mcl_portals/locale/template.txt +++ b/mods/ITEMS/mcl_portals/locale/template.txt @@ -4,11 +4,11 @@ An End portal teleports creatures and objects to the mysterious End dimension (a Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.= End Portal Frame= End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.= -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.= +NOTE: The End dimension is currently incomplete and might change in future versions.= End Portal Frame with Eye of Ender= Nether Portal= A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!= 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.= Obsidian is also used as the frame of Nether portals.= To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.= +Once placed, an eye of ender can not be taken back.= diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index eeb20dfe8..84e98fee9 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -302,8 +302,8 @@ end minetest.register_node("mcl_portals:end_portal_frame", { description = S("End Portal Frame"), - _doc_items_longdesc = S("End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender." .. "\n" .. "NOTE: The End dimension is currently incomplete and might change in future versions."), - _doc_items_usagehelp = S("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.") .. "\n" .. S("Place an eye of ender into each block. The end portal appears in the middle after placing the final eye." .. "\n" .. "Once placed, an eye of ender can not be taken back."), + _doc_items_longdesc = S("End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.") .. "\n" .. S("NOTE: The End dimension is currently incomplete and might change in future versions."), + _doc_items_usagehelp = S("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.") .. "\n" .. S("Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.") .. "\n" .. S("Once placed, an eye of ender can not be taken back."), groups = { creative_breakable = 1, deco_block = 1 }, tiles = { "mcl_portals_endframe_top.png", "mcl_portals_endframe_bottom.png", "mcl_portals_endframe_side.png" }, paramtype2 = "facedir", diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua index 6c51840e8..0fc24d650 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -160,7 +160,7 @@ end minetest.register_craftitem("mcl_potions:potion_water", { description = S("Water Bottle"), _doc_items_longdesc = S("Water bottles can be used to fill cauldrons. Drinking water has no effect."), - _doc_items_usagehelp = S("Rightclick to drink. Rightclick a cauldron to pour the water into the cauldron."), + _doc_items_usagehelp = S("Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron."), stack_max = 1, inventory_image = potion_image("#0000FF"), wield_image = potion_image("#0000FF"), @@ -204,7 +204,8 @@ minetest.register_craftitem("mcl_potions:potion_water", { minetest.register_craftitem("mcl_potions:potion_river_water", { description = S("River Water Bottle"), _doc_items_longdesc = S("River water bottles can be used to fill cauldrons. Drinking it has no effect."), - _doc_items_usagehelp = "Rightclick to drink. Rightclick a cauldron to pour the river water into the cauldron.", + _doc_items_usagehelp = S("Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron."), + stack_max = 1, inventory_image = potion_image("#0044FF"), wield_image = potion_image("#0044FF"), @@ -247,7 +248,7 @@ minetest.register_craftitem("mcl_potions:potion_river_water", { -local how_to_drink = "To drink it, wield it, then rightclick." +local how_to_drink = S("Use the “Place” key to drink it.") minetest.register_craftitem("mcl_potions:potion_awkward", { description = S("Awkward Potion"), diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr index 324ac5dc8..87db24a03 100644 --- a/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr +++ b/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr @@ -18,3 +18,6 @@ This potion has a bitter taste and is used for brewing more potions. Drinking it Glistering Melon=Glitzermelone This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.=Diese glänzende Melone ist voller winziger Goldnuggets und sähe ganz nett in einem Rahmen aus. Er ist nicht essbar und auch sonst zu nichts zu gebrauchen. Dragon's Breath=Drachenatem +Use the “Place” key to drink it.=Benutzen Sie die „Platzieren“-Taste zum Trinken. +Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.=Benutzen Sie die „Platzieren“-Taste zum Trinken. Platzieren Sie diesen Gegenstand auf einen Kessel, um das Wasser in den Kessel zu schütten. +Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.=Benutzen Sie die „Platzieren“-Taste zum Trinken. Platzieren Sie diesen Gegenstand auf einen Kessel, um das Flusswasser in den Kessel zu schütten. diff --git a/mods/ITEMS/mcl_potions/locale/template.txt b/mods/ITEMS/mcl_potions/locale/template.txt index 850637b37..b7e08ebf7 100644 --- a/mods/ITEMS/mcl_potions/locale/template.txt +++ b/mods/ITEMS/mcl_potions/locale/template.txt @@ -18,3 +18,6 @@ This potion has a bitter taste and is used for brewing more potions. Drinking it Glistering Melon= This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.= Dragon's Breath= +Use the “Place” key to drink it.= +Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.= +Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.= diff --git a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.de.tr b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.de.tr index 51a8ffabc..d2378a8a9 100644 --- a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.de.tr +++ b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.de.tr @@ -1,5 +1,5 @@ # textdomain: mcl_tnt @1 was caught in an explosion.=@1 wurde Opfer einer Explosion. 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.=Ein Sprengstoff. Wenn er explodiert, wird er Lebewesen verletzen und Blöcke in der Nähe zerstören. TNT hat einen Explosionsradius von @1. Mit einer geringen Wahrscheinlichkeit werden Blöcke als Gegenstand abfallen (als ob sie abgebaut worden wären), anstatt völlig zerstört zu werden. -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.=Platizeren sie das TNT und zünden Sie es mit einer der obigen Methoden ab. Begeben Sie sich rasch in eine sichere Entfernung. Das TNT wird anfangen, von der Schwerkraft beeinflusst zu sein und explodiert in 4 Sekunden. +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.=Ein Sprengstoff. Wenn er explodiert, wird er Lebewesen verletzen und Blöcke in der Nähe zerstören. TNT hat einen Explosionsradius von @1. Mit einer geringen Wahrscheinlichkeit werden Blöcke als Gegenstand abfallen (als ob sie abgebaut worden wären), anstatt völlig zerstört zu werden. TNT kann mit Werkzeugen, Explosionen, Feuer, Lava und Redstone-Signalen angezündet werden. +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.=Platizeren sie das TNT und zünden Sie es mit einer der obigen Methoden an. Begeben Sie sich rasch in eine sichere Entfernung. Das TNT wird anfangen, von der Schwerkraft beeinflusst zu sein und explodiert in 4 Sekunden. diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index 0a568cb75..f660c12e4 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -60,7 +60,7 @@ local sword_longdesc = S("Swords are great in melee combat, as they are fast, de local shovel_longdesc = S("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.") local shovel_use = S("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.") local shears_longdesc = S("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.") -local shears_use = "To shear a sheep and obtain its wool, rightclick it. To carve a face into a pumpkin and obtain 4 pumpkin seeds, rightclick it on one of its sides. Mining works are usual, but the drops are different for a few blocks." +local shears_use = S("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.") -- Picks minetest.register_tool("mcl_tools:pick_wood", { diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr index 25ca32c4e..6c061dd00 100644 --- a/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.de.tr @@ -8,6 +8,7 @@ Swords are great in melee combat, as they are fast, deal high damage and can end 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.=Schaufeln sind Werkzeuge zum Ausgraben von groben Blöcken, wie Erde, Sand und Kies. Sie können auch benutzt werden, um Grasblöcke zu Graspfaden zu verwandeln. Schaufeln können als Waffen benutzt werden, aber sie sind sehr schwach. 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.=Um einen Grasblock in einen Graspfad zu verwandeln, benutzen Sie sie auf der Oberseite oder einer Seite eines Grasblocks. Das funktioniert nur, wenn sich Luft über dem Grasblock befindet. 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.=Eine Schere ist ein Werkzeug, um Schafe zu scheren und ein paar Blocktypen abzubauen. Sie ist ein besonderes Grabewerkzeug, das benutzt werden kann, um den ursprünglichen Gegenstand von Gras, Blättern und ähnlichen Blöcken, die abgeschnitten werden müssen, zu erhalten. +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.=Um Schafe zu scheren oder gesichtslose Kürbisse zu schnitzen, benutzen Sie die „Platzieren“-Taste auf ihnen. Gesichter können nur an der Seite von gesichtslosen Kürbissen eingeschnitzt werden. Das Abbauen funktioniert wie bei anderen Werkzeugen, nur, dass die Abwürfe für ein paar Blöcke anders sind. Wooden Pickaxe=Holzspitzhacke Stone Pickaxe=Steinspitzhacke Iron Pickaxe=Eisenspitzhacke diff --git a/mods/ITEMS/mcl_tools/locale/template.txt b/mods/ITEMS/mcl_tools/locale/template.txt index 8e3fa90e6..ecb94105f 100644 --- a/mods/ITEMS/mcl_tools/locale/template.txt +++ b/mods/ITEMS/mcl_tools/locale/template.txt @@ -8,6 +8,7 @@ Swords are great in melee combat, as they are fast, deal high damage and can end 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.= 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.= 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.= +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.= Wooden Pickaxe= Stone Pickaxe= Iron Pickaxe= diff --git a/mods/ITEMS/mcl_torches/init.lua b/mods/ITEMS/mcl_torches/init.lua index 62a009406..24d61f9d9 100644 --- a/mods/ITEMS/mcl_torches/init.lua +++ b/mods/ITEMS/mcl_torches/init.lua @@ -172,11 +172,7 @@ end mcl_torches.register_torch("torch", S("Torch"), S("Torches are light sources which can be placed at the side or on the top of most blocks."), - S([[Torches can generally be placed on full solid opaque blocks. The following exceptions apply: -• Glass, fence, wall, hopper: Can only be placed on top -• Upside-down slab/stair: Can only be placed on top -• Soul sand, mob spawner: Placement possible -• Glowstone and pistons: No placement possible]]), + nil, "default_torch_on_floor.png", "mcl_torches_torch_floor.obj", "mcl_torches_torch_wall.obj", {{ From 418368fbc532e455b5ed74cf491f10bd338768bb Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 25 Mar 2019 12:15:37 +0100 Subject: [PATCH 263/379] Squash daylight sensor help pages to 1 page --- mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua | 12 +++++++----- .../locale/mesecons_solarpanel.de.tr | 7 +++---- .../REDSTONE/mesecons_solarpanel/locale/template.txt | 5 ++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua index fa29e05c5..0ea8ba63d 100644 --- a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua @@ -59,8 +59,9 @@ minetest.register_node("mesecons_solarpanel:solar_panel_off", { }, groups = {handy=1,axey=1, material_wood=1}, description=S("Daylight Sensor"), - _doc_items_longdesc = S("Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted."), - _doc_items_usagehelp = S("Use the daylight sensor to turn it into an inverted daylight sensor, which supplies redstone energy when it is in moonlight."), + _doc_items_longdesc = S("Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.").."\n".. + S("In inverted state, they provide redstone power when they are not in sunlight and no power otherwise."), + _doc_items_usagehelp = S("Use the daylight sensor to toggle its state."), sounds = mcl_sounds.node_sound_glass_defaults(), mesecons = {receptor = { state = mesecon.state.off, @@ -177,8 +178,7 @@ minetest.register_node("mesecons_solarpanel:solar_panel_inverted_off", { drop = "mesecons_solarpanel:solar_panel_off", groups = {handy=1,axey=1, not_in_creative_inventory=1, material_wood=1}, description=S("Inverted Daylight Sensor"), - _doc_items_longdesc = S("An inverted daylight sensor is a variant of the daylight sensor. It is a redstone component which provides redstone power when it in moonlight and no power otherwise. It can turned back into an ordinary daylight sensor."), - _doc_items_usagehelp = S("Use the inverted daylight sensor to turn it into a daylight sensor."), + _doc_items_create_entry = false, sounds = mcl_sounds.node_sound_glass_defaults(), mesecons = {receptor = { state = mesecon.state.off, @@ -235,5 +235,7 @@ minetest.register_craft({ if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mesecons_solarpanel:solar_panel_off", "nodes", "mesecons_solarpanel:solar_panel_on") - doc.add_entry_alias("nodes", "mesecons_solarpanel:solar_panel_inverted_off", "nodes", "mesecons_solarpanel:solar_panel_inverted_on") + doc.add_entry_alias("nodes", "mesecons_solarpanel:solar_panel_off", "nodes", "mesecons_solarpanel:solar_panel_inverted_off") + doc.add_entry_alias("nodes", "mesecons_solarpanel:solar_panel_off", "nodes", "mesecons_solarpanel:solar_panel_inverted_off") + doc.add_entry_alias("nodes", "mesecons_solarpanel:solar_panel_off", "nodes", "mesecons_solarpanel:solar_panel_inverted_on") end diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.de.tr b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.de.tr index 8b1a342c7..b9272882a 100644 --- a/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.de.tr +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.de.tr @@ -1,7 +1,6 @@ # textdomain: mesecons_solarpanel Daylight Sensor=Tageslichtsensor -Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.=Tageslichtsensoren sind Redstonekomponenten, die Redstoneenergie liefern, wenn sie im Sonnenlicht stehen, sonst nicht. -Use the daylight sensor to turn it into an inverted daylight sensor, which supplies redstone energy when it is in moonlight.=Benutzen Sie den Tageslichtsensor, um ihn zu einen invertierten Tageslichtsensor umzuwandeln, der Redstoneenergie liefert, wenn er sich im Mondlicht befindet. +Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.=Tageslichtsensoren sind Redstonekomponenten, die Redstoneenergie liefern, wenn sie im Sonnenlicht stehen, sonst nicht. Sie können auch invertiert werden. Inverted Daylight Sensor=Invertierter Tageslichtsensor -An inverted daylight sensor is a variant of the daylight sensor. It is a redstone component which provides redstone power when it in moonlight and no power otherwise. It can turned back into an ordinary daylight sensor.=Ein invertierter Tageslichtsensor ist eine Variante des Tageslichtsensors. Er ist eine Redstonekomponente, die Redstoneenergie liefert, wenn er sich im Mondlicht befindet, sonst nicht. Er kann zurück zu einem gewöhnlichen Tageslichtsensor umgewandelt werden. -Use the inverted daylight sensor to turn it into a daylight sensor.=Benutzen Sie den Tageslichtsensor, um ihn zu einem Tageslichtsensor umzuwandeln. +Use the daylight sensor to toggle its state.=Benutzen Sie den Tageslichtsensor, um seinen Zustand umzuschalten. +In inverted state, they provide redstone power when they are not in sunlight and no power otherwise.=Im invertierten Zustand erzeugen sie Redstoneenergie, wenn sie sich nicht im Tageslicht befinden, ansonsten nicht. diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/template.txt index 4ad3b24c4..b776f5074 100644 --- a/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/template.txt @@ -1,7 +1,6 @@ # textdomain: mesecons_solarpanel Daylight Sensor= Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.= -Use the daylight sensor to turn it into an inverted daylight sensor, which supplies redstone energy when it is in moonlight.= +Use the daylight sensor to toggle its state.= Inverted Daylight Sensor= -An inverted daylight sensor is a variant of the daylight sensor. It is a redstone component which provides redstone power when it in moonlight and no power otherwise. It can turned back into an ordinary daylight sensor.= -Use the inverted daylight sensor to turn it into a daylight sensor.= +In inverted state, they provide redstone power when they are not in sunlight and no power otherwise.= From d0a6244be90d0944418a93d7a0d39b7096ba1420 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 25 Mar 2019 12:31:22 +0100 Subject: [PATCH 264/379] Books: Move sign warning to tooltip Done because of translation problems with the newline --- mods/ITEMS/mcl_books/init.lua | 6 +++--- mods/ITEMS/mcl_books/locale/mcl_books.de.tr | 2 +- mods/ITEMS/mcl_books/locale/template.txt | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index 645033b8c..87ca31949 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -136,10 +136,10 @@ minetest.register_on_player_receive_fields(function ( player, formname, fields ) local name = player:get_player_name() local formspec = "size[8,9]".. "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]".. - "field[0.75,1;7.25,1;title;"..core.colorize("#000000", S("Enter book title:"))..";]".. - "label[0.75,1.5;"..core.colorize("#404040", minetest.formspec_escape(S("by @1", name))).."]".. - "label[0.75,6.95;"..core.colorize("#000000", minetest.formspec_escape(S("Note: The book will no longer\nbe editable after signing."))).."]".. + "field[0.75,1;7.25,1;title;"..minetest.formspec_escape(core.colorize("#000000", S("Enter book title:")))..";]".. + "label[0.75,1.5;"..minetest.formspec_escape(core.colorize("#404040", S("by @1", name))).."]".. "button_exit[0.75,7.95;3,1;sign;"..minetest.formspec_escape(S("Sign and Close")).."]".. + "tooltip[sign;"..minetest.formspec_escape(S("Note: The book will no longer be editable after signing")).."]".. "button[4.25,7.95;3,1;cancel;"..minetest.formspec_escape(S("Cancel")).."]" minetest.show_formspec(player:get_player_name(), "mcl_books:signing", formspec) end diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.de.tr b/mods/ITEMS/mcl_books/locale/mcl_books.de.tr index 398843d97..c4613fd9a 100644 --- a/mods/ITEMS/mcl_books/locale/mcl_books.de.tr +++ b/mods/ITEMS/mcl_books/locale/mcl_books.de.tr @@ -12,7 +12,7 @@ This item can be used to write down some notes.=Dies kann benutzt werden, um ein Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Halten Sie es in der Hand, dann rechtsklicken Sie, um die Notizen zu sehen und zu ändern. Sie können den Text beliebig ändern. Sie können das Buch auch signieren und in ein geschriebenes Buch verwandeln, das gestapelt, aber nicht mehr geändert werden kann. A book can hold up to 4500 characters. The title length is limited to 64 characters.=Ein Buch kann bis zu 4500 Zeichen enthalten. Die Titellänge ist begrenzt auf 64 Zeichen. Enter book title:=Buchtitel eingeben: -Note: The book will no longer@nbe editable after signing.=Anmerkung: Das Buch kann nach@nder Signierung nicht länger@nbearbeitet werden. +Note: The book will no longer be editable after signing=Anmerkung: Das Buch kann nach der Signierung nicht länger@nbearbeitet werden Sign and Close=Signieren und schließen Cancel=Abbrechen Nameless Book=Namenloses Buch diff --git a/mods/ITEMS/mcl_books/locale/template.txt b/mods/ITEMS/mcl_books/locale/template.txt index acf614cdb..22c4dae9f 100644 --- a/mods/ITEMS/mcl_books/locale/template.txt +++ b/mods/ITEMS/mcl_books/locale/template.txt @@ -14,7 +14,7 @@ Hold it in the hand, then rightclick to read the current notes and edit then. Yo A book can hold up to 4500 characters. The title length is limited to 64 characters.= Enter book title:= by @1= -Note: The book will no longer@nbe editable after signing.= +Note: The book will no longer be editable after signing= Sign and Close= Cancel= Nameless Book= From 5b6cb0a44109fd921487a19fad2d3dfad1720489 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 25 Mar 2019 12:32:59 +0100 Subject: [PATCH 265/379] Minor tweaks in commandblock help texts --- mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua | 2 +- .../mesecons_commandblock/locale/mesecons_commandblock.de.tr | 4 ++-- mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index 855eb86d0..91c682cbc 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -225,7 +225,7 @@ S("• “@@@@”: literal “@@” sign").."\n\n".. S("Example 1:\n time 12000\nSets the game clock to 12:00").."\n\n".. -S("Example 2:\n give @@n mcl_core:apple 5\n→ Gives the nearest player 5 apples"), +S("Example 2:\n give @@n mcl_core:apple 5\nGives the nearest player 5 apples"), tiles = {{name="jeija_commandblock_off.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=2}}}, groups = {creative_breakable=1, mesecon_effector_off=1}, diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr index 307f26c64..35df49980 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.de.tr @@ -16,13 +16,13 @@ To view the commands in a command block, use it. To activate the command block, To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.=Um einen Befehlsblock platzieren und die Befehle ändern zu können, müssen Sie im Kreativmodus sein und das „maphack“-Privileg haben. Ein neuer Befehlsblock hat keine Befehle und tut gar nichts. Benutzen Sie den Befehlsblock (im Kreativmodus!), um seine Befehle zu bearbeiten. Lesen Sie den Hilfeeintrag „Fortgeschrittenes > Serverbefehle“, um zu verstehen, wie Befehle funktionieren. Jede Zeile enthält einen einzigen Befehl. Sie geben Sie wie in der Konsole ein, aber ohne den Schrägstrich am Anfang. All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.=Alle Befehle werden im Namen des Spielers, der den Befehlsblock platziert hat, ausgeführt, als ob der Spieler die Befehle eingegeben hätte. Diesen Spieler nennen wir den „Kommandanten“ des Blocks. Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:=Befehlsblöcke unterstützen Platzhalter. Geben Sie einen dieser Platzhalter ein und sie werden durch einen anderen Text ersetzt: -• “@@c”: commander of this command block=• „@@c“: Befehlshaber dieses Befehlsblocks +• “@@c”: commander of this command block=• „@@c“: Kommandant dieses Befehlsblocks • “@@n” or “@@p”: nearest player from the command block=• „@@n“ oder „@@p“: Nächster Spieler am Befehlsblock • “@@f” farthest player from the command block=• „@@f“: Der vom Befehlsblock am weitesten entfernte Spieler • “@@r”: random player currently in the world=• „@@r“: Zufälliger Spieler in der Welt • “@@@@”: literal “@@” sign=• „@@@@“: Nur das „@@“-Zeichen Example 1:@n time 12000@nSets the game clock to 12:00=1. Beispiel:@n time 12000@nSetzt die Spieluhr auf 12:00 Uhr -Example 2:@n give @@n mcl_core:apple 5@n→ Gives the nearest player 5 apples=2. Beispiel:@n give @@n mcl_core:apple 5@n→ Gibt dem nächsten Spieler 5 Äpfel +Example 2:@n give @@n mcl_core:apple 5@nGives the nearest player 5 apples=2. Beispiel:@n give @@n mcl_core:apple 5@nGibt dem nächsten Spieler 5 Äpfel Access denied. You need the “maphack” privilege to edit command blocks.=Zugriff verweigert. Sie brauchen das „maphack“-Privileg, um Befehlsblöcke zu bearbeiten. Editing the command block has failed! You can only change the command block in Creative Mode!=Bearbeitung des Befehlsblocks fehlgeschlagen! Sie können den Befehlsblock nur im Kreativmodus ändern! Editing the command block has failed! The command block is gone.=Bearbeiten des Befehlsblocks fehlgeschlagen! Der Befehlsblock ist verschwunden. diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt index a2ce9ebec..ffa7d2ab0 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/template.txt @@ -22,7 +22,7 @@ Command blocks support placeholders, insert one of these placeholders and they w • “@@r”: random player currently in the world= • “@@@@”: literal “@@” sign= Example 1:@n time 12000@nSets the game clock to 12:00= -Example 2:@n give @@n mcl_core:apple 5@n→ Gives the nearest player 5 apples= +Example 2:@n give @@n mcl_core:apple 5@nGives the nearest player 5 apples= Access denied. You need the “maphack” privilege to edit command blocks.= Editing the command block has failed! You can only change the command block in Creative Mode!= Editing the command block has failed! The command block is gone.= From 7e9a9821c9a3273c71f0a2063bacd2670f3f47bb Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 25 Mar 2019 12:39:09 +0100 Subject: [PATCH 266/379] Fix progressive mode not disabable --- mods/HELP/mcl_craftguide/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 9fed76422..fab6aa531 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -10,7 +10,7 @@ local recipes_cache = {} local usages_cache = {} local fuel_cache = {} -local progressive_mode = M.settings:get_bool("mcl_craftguide_progressive_mode") or true +local progressive_mode = M.settings:get_bool("mcl_craftguide_progressive_mode", true) local sfinv_only = false local colorize = M.colorize From 6188d7b528ff7d814d0c514440ec00067fb1729c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 25 Mar 2019 12:42:37 +0100 Subject: [PATCH 267/379] Fix other boolean settings default fails --- mods/ENTITIES/mcl_item_entity/init.lua | 2 +- mods/MAPGEN/mcl_biomes/init.lua | 2 +- mods/PLAYER/mcl_death_drop/init.lua | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 54a568f99..f44917ccf 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -212,7 +212,7 @@ function minetest.handle_node_drops(pos, drops, digger) -- This means there is no digger. This is a special case which allows this function to be called -- by hand. Creative Mode is intentionally ignored in this case. - local doTileDrops = minetest.settings:get_bool("mcl_doTileDrops") or true + local doTileDrops = minetest.settings:get_bool("mcl_doTileDrops", true) if (digger ~= nil and minetest.settings:get_bool("creative_mode")) or doTileDrops == false then return end diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index b0c8b2a25..19880f5b9 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -4,7 +4,7 @@ local mg_seed = minetest.get_mapgen_setting("seed") -- Some mapgen settings local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" -local generate_fallen_logs = minetest.settings:get_bool("mcl_generate_fallen_logs") or false +local generate_fallen_logs = minetest.settings:get_bool("mcl_generate_fallen_logs", false) -- Jungle bush schematic. In PC/Java Edition it's Jungle Wood + Oak Leaves local jungle_bush_schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_jungle_bush_oak_leaves.mts" diff --git a/mods/PLAYER/mcl_death_drop/init.lua b/mods/PLAYER/mcl_death_drop/init.lua index 5f4b1ddb9..54672a5db 100644 --- a/mods/PLAYER/mcl_death_drop/init.lua +++ b/mods/PLAYER/mcl_death_drop/init.lua @@ -1,5 +1,5 @@ minetest.register_on_dieplayer(function(player) - local keep = minetest.settings:get_bool("mcl_keepInventory") or false + local keep = minetest.settings:get_bool("mcl_keepInventory", false) if keep == false then -- Drop inventory, crafting grid and armor local inv = player:get_inventory() From 42a7baf4b4ac41c4865be0f550cbc56b28feaa68 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 25 Mar 2019 12:47:16 +0100 Subject: [PATCH 268/379] Version 0.53.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 268a530df..e1cae882f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.52.1 +Version: 0.53.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 719f7b5b779e6ebaf6287053e8be443123b85d54 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 25 Mar 2019 13:28:45 +0100 Subject: [PATCH 269/379] Explain how characters work in mcl_signs --- mods/ITEMS/mcl_signs/README.txt | 7 +++++-- mods/ITEMS/mcl_signs/init.lua | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_signs/README.txt b/mods/ITEMS/mcl_signs/README.txt index 8950bead7..780875561 100644 --- a/mods/ITEMS/mcl_signs/README.txt +++ b/mods/ITEMS/mcl_signs/README.txt @@ -1,9 +1,12 @@ Mod based on reworked signs mod by PilzAdam: https://forum.minetest.net/viewtopic.php?t=3289 -License of code: WTFPL +License of code and font: MIT License -License of textures: See README.me in top directory. +Font source: 04.jp.org, some modifications and additions were made (added support for Latin-1 Supplement) +Original font license text states: “YOU MAY USE THEM AS YOU LIKE” (in about.gif file distributed with the font) + +License of textures: See README.me in top directory of MineClone 2. License of models: GPLv3 (https://www.gnu.org/licenses/gpl-3.0.html) Models author: 22i. diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index 7567f9a77..133c8dc61 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -1,11 +1,20 @@ local S = minetest.get_translator("mcl_signs") local F = minetest.formspec_escape --- Font: 04.jp.org +-- Load the characters map (characters.txt) +--[[ File format of characters.txt: +It's an UTF-8 encoded text file that contains metadata for all supported characters. It contains a sequence of info blocks, one for each character. Each info block is made out of 3 lines: +Line 1: The literal UTF-8 encoded character +Line 2: Name of the texture file for this character minus the “.png” suffix; found in the “textures/” sub-directory +Line 3: Currently ignored. Previously this was for the character width in pixels + +After line 3, another info block may follow. This repeats until the end of the file. + +All character files must be 5 or 6 pixels wide (5 pixels are preferred) +]] --- load characters map local chars_file = io.open(minetest.get_modpath("mcl_signs").."/characters.txt", "r") --- FIXME: Support more characters (many characters are missing) +-- FIXME: Support more characters (many characters are missing). Currently ASCII and Latin-1 Supplement are supported. local charmap = {} if not chars_file then minetest.log("error", "[mcl_signs] : character map file not found") From ba97dfd02ff849f8df53126834a8907b51794711 Mon Sep 17 00:00:00 2001 From: Oil_boi Date: Tue, 26 Mar 2019 10:23:52 +0100 Subject: [PATCH 270/379] Make item entities a bit more efficient --- mods/ENTITIES/mcl_item_entity/init.lua | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index f44917ccf..7491285c3 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -88,6 +88,15 @@ minetest.register_globalstep(function(dtime) -- Magnet else + --move this to the front so players can see animation before collection + if not collected then + if object:get_luaentity()._magnet_timer > 1 then + object:get_luaentity()._magnet_timer = -item_drop_settings.magnet_time + object:get_luaentity()._magnet_active = false + elseif object:get_luaentity()._magnet_timer < 0 then + object:get_luaentity()._magnet_timer = object:get_luaentity()._magnet_timer + dtime + end + end object:get_luaentity()._magnet_active = true object:get_luaentity()._collector_timer = 0 @@ -95,11 +104,7 @@ minetest.register_globalstep(function(dtime) -- Move object to player disable_physics(object, object:get_luaentity()) - local opos = object:get_pos() - local vec = vector.subtract(checkpos, opos) - vec = vector.add(opos, vector.divide(vec, 2)) - object:move_to(vec) - + object:move_to(checkpos) --fix eternally falling items minetest.after(0, function(object) @@ -143,15 +148,6 @@ minetest.register_globalstep(function(dtime) end end - if not collected then - if object:get_luaentity()._magnet_timer > 1 then - object:get_luaentity()._magnet_timer = -item_drop_settings.magnet_time - object:get_luaentity()._magnet_active = false - elseif object:get_luaentity()._magnet_timer < 0 then - object:get_luaentity()._magnet_timer = object:get_luaentity()._magnet_timer + dtime - end - end - end end From c6e671376d19467cdbbdc23fb48a7fc996698265 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 26 Mar 2019 12:24:30 +0100 Subject: [PATCH 271/379] Make lightning glow in the dark --- mods/ENVIRONMENT/lightning/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 0d0b7d1e0..bf077105d 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -117,6 +117,7 @@ lightning.strike = function(pos) -- to make the texture lightning bolt hit exactly in the middle of the -- texture (e.g. 127/128 on a 256x wide texture) texture = "lightning_lightning_" .. rng:next(1,3) .. ".png", + glow = minetest.LIGHT_MAX, }) minetest.sound_play({ pos = pos, name = "lightning_thunder", gain = 10, max_hear_distance = 500 }) From 8533ff0b750056e77fd1ab5037d59482b1bc8e13 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 27 Mar 2019 13:07:33 +0100 Subject: [PATCH 272/379] Hoes and shovels now respect protection That is, their special action do so. --- mods/ITEMS/mcl_farming/hoes.lua | 109 +++++++++----------------------- mods/ITEMS/mcl_tools/init.lua | 8 ++- 2 files changed, 36 insertions(+), 81 deletions(-) diff --git a/mods/ITEMS/mcl_farming/hoes.lua b/mods/ITEMS/mcl_farming/hoes.lua index 453ede39b..04105b0ad 100644 --- a/mods/ITEMS/mcl_farming/hoes.lua +++ b/mods/ITEMS/mcl_farming/hoes.lua @@ -25,6 +25,30 @@ local function create_soil(pos, inv) return false end +local hoe_on_place_function = function(wear_divisor) + return function(itemstack, user, pointed_thing) + -- Call on_rightclick if the pointed node defines it + local node = minetest.get_node(pointed_thing.under) + if user and not user: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, user, itemstack) or itemstack + end + end + + if minetest.is_protected(pointed_thing.under, user:get_player_name()) then + minetest.record_protection_violation(pointed_thing.under, user:get_player_name()) + return itemstack + end + + if create_soil(pointed_thing.under, user:get_inventory()) then + if not minetest.settings:get_bool("creative_mode") then + itemstack:add_wear(65535/wear_divisor) + end + return itemstack + end + end +end + local hoe_longdesc = S("Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.") local hoe_usagehelp = S("Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.") @@ -34,22 +58,7 @@ minetest.register_tool("mcl_farming:hoe_wood", { _doc_items_usagehelp = hoe_usagehelp, _doc_items_hidden = false, inventory_image = "farming_tool_woodhoe.png", - on_place = function(itemstack, user, pointed_thing) - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - if user and not user: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, user, itemstack) or itemstack - end - end - - if create_soil(pointed_thing.under, user:get_inventory()) then - if not minetest.settings:get_bool("creative_mode") then - itemstack:add_wear(65535/60) - end - return itemstack - end - end, + on_place = hoe_on_place_function(60), groups = { tool=1, hoe=1 }, tool_capabilities = { full_punch_interval = 1, @@ -85,22 +94,7 @@ minetest.register_tool("mcl_farming:hoe_stone", { _doc_items_longdesc = hoe_longdesc, _doc_items_usagehelp = hoe_usagehelp, inventory_image = "farming_tool_stonehoe.png", - on_place = function(itemstack, user, pointed_thing) - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - if user and not user: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, user, itemstack) or itemstack - end - end - - if create_soil(pointed_thing.under, user:get_inventory()) then - if not minetest.settings:get_bool("creative_mode") then - itemstack:add_wear(65535/132) - end - return itemstack - end - end, + on_place = hoe_on_place_function(132), groups = { tool=1, hoe=1 }, tool_capabilities = { full_punch_interval = 0.5, @@ -131,22 +125,7 @@ minetest.register_tool("mcl_farming:hoe_iron", { _doc_items_longdesc = hoe_longdesc, _doc_items_usagehelp = hoe_usagehelp, inventory_image = "farming_tool_steelhoe.png", - on_place = function(itemstack, user, pointed_thing) - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - if user and not user: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, user, itemstack) or itemstack - end - end - - if create_soil(pointed_thing.under, user:get_inventory()) then - if not minetest.settings:get_bool("creative_mode") then - itemstack:add_wear(65535/251) - end - return itemstack - end - end, + on_place = hoe_on_place_function(251), groups = { tool=1, hoe=1 }, tool_capabilities = { -- 1/3 @@ -185,22 +164,7 @@ minetest.register_tool("mcl_farming:hoe_gold", { _doc_items_longdesc = hoe_longdesc, _doc_items_usagehelp = hoe_usagehelp, inventory_image = "farming_tool_goldhoe.png", - on_place = function(itemstack, user, pointed_thing) - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - if user and not user: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, user, itemstack) or itemstack - end - end - - if create_soil(pointed_thing.under, user:get_inventory()) then - if not minetest.settings:get_bool("creative_mode") then - itemstack:add_wear(65535/33) - end - return itemstack - end - end, + on_place = hoe_on_place_function(33), groups = { tool=1, hoe=1 }, tool_capabilities = { full_punch_interval = 1, @@ -240,22 +204,7 @@ minetest.register_tool("mcl_farming:hoe_diamond", { _doc_items_longdesc = hoe_longdesc, _doc_items_usagehelp = hoe_usagehelp, inventory_image = "farming_tool_diamondhoe.png", - on_place = function(itemstack, user, pointed_thing) - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - if user and not user: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, user, itemstack) or itemstack - end - end - - if create_soil(pointed_thing.under, user:get_inventory()) then - if not minetest.settings:get_bool("creative_mode") then - itemstack:add_wear(65535/1562) - end - return itemstack - end - end, + on_place = hoe_on_place_function(1562), groups = { tool=1, hoe=1 }, tool_capabilities = { full_punch_interval = 0.25, diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index f660c12e4..3078d7f59 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -179,12 +179,18 @@ local make_grass_path = function(itemstack, placer, pointed_thing) -- Only make grass path if tool used on side or top of target node if pointed_thing.above.y < pointed_thing.under.y then - return + return itemstack end + if (minetest.get_item_group(node.name, "grass_block") == 1) then local above = table.copy(pointed_thing.under) above.y = above.y + 1 if minetest.get_node(above).name == "air" then + if minetest.is_protected(pointed_thing.under, placer:get_player_name()) then + minetest.record_protection_violation(pointed_thing.under, placer:get_player_name()) + return itemstack + end + if not minetest.settings:get_bool("creative_mode") then -- Add wear, as if digging a level 0 shovely node local toolname = itemstack:get_name() From 2203d0df530c559dc21e2f064b341694c264c22c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 1 Apr 2019 10:59:36 +0200 Subject: [PATCH 273/379] Revert "Make item entities a bit more efficient" This reverts commit ba97dfd02ff849f8df53126834a8907b51794711 because it broke item entities. --- mods/ENTITIES/mcl_item_entity/init.lua | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 7491285c3..f44917ccf 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -88,15 +88,6 @@ minetest.register_globalstep(function(dtime) -- Magnet else - --move this to the front so players can see animation before collection - if not collected then - if object:get_luaentity()._magnet_timer > 1 then - object:get_luaentity()._magnet_timer = -item_drop_settings.magnet_time - object:get_luaentity()._magnet_active = false - elseif object:get_luaentity()._magnet_timer < 0 then - object:get_luaentity()._magnet_timer = object:get_luaentity()._magnet_timer + dtime - end - end object:get_luaentity()._magnet_active = true object:get_luaentity()._collector_timer = 0 @@ -104,7 +95,11 @@ minetest.register_globalstep(function(dtime) -- Move object to player disable_physics(object, object:get_luaentity()) - object:move_to(checkpos) + local opos = object:get_pos() + local vec = vector.subtract(checkpos, opos) + vec = vector.add(opos, vector.divide(vec, 2)) + object:move_to(vec) + --fix eternally falling items minetest.after(0, function(object) @@ -148,6 +143,15 @@ minetest.register_globalstep(function(dtime) end end + if not collected then + if object:get_luaentity()._magnet_timer > 1 then + object:get_luaentity()._magnet_timer = -item_drop_settings.magnet_time + object:get_luaentity()._magnet_active = false + elseif object:get_luaentity()._magnet_timer < 0 then + object:get_luaentity()._magnet_timer = object:get_luaentity()._magnet_timer + dtime + end + end + end end From 219ec1ddcbc9ac88c83f4d2ba59dc5037a61ab2c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 1 Apr 2019 15:16:33 +0200 Subject: [PATCH 274/379] Remove old workaround in mcl_stairs --- mods/ITEMS/mcl_stairs/api.lua | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/mods/ITEMS/mcl_stairs/api.lua b/mods/ITEMS/mcl_stairs/api.lua index 5c892f61b..a6e6c6594 100644 --- a/mods/ITEMS/mcl_stairs/api.lua +++ b/mods/ITEMS/mcl_stairs/api.lua @@ -4,19 +4,8 @@ local S = minetest.get_translator("mcl_stairs") -- Wrapper around mintest.pointed_thing_to_face_pos. local function get_fpos(placer, pointed_thing) - local fpos - -- Workaround: minetest.pointed_thing_to_face_pos crashes in MT 0.4.16 if - -- pointed_thing.under and pointed_thing.above are equal - -- FIXME: Remove this when MT got fixed. - if not vector.equals(pointed_thing.under, pointed_thing.above) then - -- The happy case: Everything is normal - local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) - fpos = finepos.y % 1 - else - -- Fallback if both above and under are equal - fpos = 0 - end - return fpos + local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) + return finepos.y % 1 end local function place_slab_normal(itemstack, placer, pointed_thing) From a7ceb2462a1ec03c6b0c53d15616baf95bd598a8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 1 Apr 2019 15:22:44 +0200 Subject: [PATCH 275/379] Deal ender pearl damage as fall damage --- mods/ITEMS/mcl_throwing/init.lua | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_throwing/init.lua b/mods/ITEMS/mcl_throwing/init.lua index d7e236600..7205a17b5 100644 --- a/mods/ITEMS/mcl_throwing/init.lua +++ b/mods/ITEMS/mcl_throwing/init.lua @@ -268,11 +268,7 @@ local pearl_on_step = function(self, dtime) local oldpos = player:get_pos() -- Teleport and hurt player player:set_pos(telepos) - if mod_death_messages then - mcl_death_messages.player_damage(player, S("@1 used the ender pearl too often.", player:get_player_name())) - end - -- TODO: Deal as fall damage - player:set_hp(player:get_hp() - 5) + player:set_hp(player:get_hp() - 5, { type = "fall", origin = "mod" }) -- 5% chance to spawn endermite at the player's origin local r = math.random(1,20) From fbba40fe5c2f9a991f37a80e46734398d5ed58df Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 5 Apr 2019 15:30:32 +0200 Subject: [PATCH 276/379] Fix item container transfer destroying item metadata --- mods/CORE/mcl_util/init.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 54d5e363d..b5d5e1bb8 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -174,14 +174,15 @@ function mcl_util.move_item(source_inventory, source_list, source_stack_id, dest if not source_inventory:is_empty(source_list) then local stack = source_inventory:get_stack(source_list, source_stack_id) - local item = stack:get_name() if not stack:is_empty() then - if not destination_inventory:room_for_item(destination_list, item) then + local new_stack = ItemStack(stack) + new_stack:set_count(1) + if not destination_inventory:room_for_item(destination_list, new_stack) then return false end stack:take_item() source_inventory:set_stack(source_list, source_stack_id, stack) - destination_inventory:add_item(destination_list, item) + destination_inventory:add_item(destination_list, new_stack) return true end end From ab81dfb4b471bc17eb241ad851fee2f2f6c5f859 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 9 Apr 2019 15:25:27 +0200 Subject: [PATCH 277/379] Stop fire spread if enable_fire=false --- mods/ITEMS/mcl_core/nodes_liquid.lua | 10 ++- mods/ITEMS/mcl_fire/init.lua | 98 +++++++++-------------- mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr | 1 + mods/ITEMS/mcl_fire/locale/template.txt | 1 + settingtypes.txt | 6 +- 5 files changed, 52 insertions(+), 64 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_liquid.lua b/mods/ITEMS/mcl_core/nodes_liquid.lua index 8910c389c..815fd6fe1 100644 --- a/mods/ITEMS/mcl_core/nodes_liquid.lua +++ b/mods/ITEMS/mcl_core/nodes_liquid.lua @@ -145,12 +145,20 @@ minetest.register_node("mcl_core:lava_flowing", { _mcl_hardness = -1, }) +local fire_text +local fire_enabled = minetest.settings:get_bool("enable_fire", true) +if fire_enabled then + fire_text = S("A lava source sets fire to a couple of air blocks above when they're next to a flammable block.") +else + fire_text = "" +end + minetest.register_node("mcl_core:lava_source", { description = S("Lava Source"), _doc_items_entry_name = "Lava", _doc_items_longdesc = S("Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.").."\n".. -S("A lava source sets fire to a couple of air blocks above when they're next to a flammable block.").."\n\n".. +fire_text.."\n\n".. S("Lava interacts with water various ways:").."\n".. S("• When a lava source is directly below or horizontally next to water, the lava turns into obsidian.").."\n".. S("• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.").."\n".. diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index bbf1e4cdb..cefeb046c 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -14,30 +14,24 @@ local N = function(s) return s end -- Fire settings -- When enabled, fire destroys other blocks. -local fire_enabled = minetest.settings:get_bool("enable_fire") -if fire_enabled == nil then - -- New setting not specified, check for old setting. - -- If old setting is also not specified, 'not nil' is true. - fire_enabled = not minetest.settings:get_bool("disable_fire") -end +local fire_enabled = minetest.settings:get_bool("enable_fire", true) -- Enable sound -local flame_sound = minetest.settings:get_bool("flame_sound") -if flame_sound == nil then - -- Enable if no setting present - flame_sound = true -end - +local flame_sound = minetest.settings:get_bool("flame_sound", true) -- Help texts -local fire_help +local fire_help, eternal_fire_help if fire_enabled then fire_help = S("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.") else fire_help = S("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.") end -local eternal_fire_help = S("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.") +if fire_enabled then + eternal_fire_help = S("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.") +else + eternal_fire_help = S("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.") +end local fire_death_messages = { N("@1 has been cooked crisp."), @@ -79,10 +73,15 @@ minetest.register_node("mcl_fire:fire", { end, on_timer = function(pos) local airs = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+4, z=pos.z+1}, {"air"}) - if #airs == 0 then + if (#airs == 0) or ((not fire_enabled) and math.random(1,3) == 1) then minetest.remove_node(pos) return end + if (not fire_enabled) then + -- Restart timer + minetest.get_node_timer(pos):start(math.random(3, 7)) + return + end local burned = false if math.random(1,2) == 1 then while #airs > 0 do @@ -158,14 +157,16 @@ minetest.register_node("mcl_fire:eternal_fire", { end end, on_timer = function(pos) - local airs = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+4, z=pos.z+1}, {"air"}) - while #airs > 0 do - local r = math.random(1, #airs) - if minetest.find_node_near(airs[r], 1, {"group:flammable"}) then - minetest.set_node(airs[r], {name="mcl_fire:fire"}) - break - else - table.remove(airs, r) + if fire_enabled then + local airs = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+4, z=pos.z+1}, {"air"}) + while #airs > 0 do + local r = math.random(1, #airs) + if minetest.find_node_near(airs[r], 1, {"group:flammable"}) then + minetest.set_node(airs[r], {name="mcl_fire:fire"}) + break + else + table.remove(airs, r) + end end end -- Restart timer @@ -184,36 +185,6 @@ minetest.register_node("mcl_fire:eternal_fire", { _mcl_blast_resistance = 0, }) --- Also make lava set fire to air blocks above -minetest.override_item("mcl_core:lava_source", { - on_timer = function(pos) - local function try_ignite(airs) - while #airs > 0 do - local r = math.random(1, #airs) - if minetest.find_node_near(airs[r], 1, {"group:flammable", "group:flammable_lava"}) then - minetest.set_node(airs[r], {name="mcl_fire:fire"}) - return true - else - table.remove(airs, r) - end - end - return false - end - local airs1 = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y+1, z=pos.z-1}, {x=pos.x+1, y=pos.y+1, z=pos.z+1}, {"air"}) - local ok = try_ignite(airs1) - if not ok then - local airs2 = minetest.find_nodes_in_area({x=pos.x-2, y=pos.y+2, z=pos.z-2}, {x=pos.x+2, y=pos.y+2, z=pos.z+2}, {"air"}) - try_ignite(airs2) - end - - -- Restart timer - minetest.get_node_timer(pos):start(math.random(5, 10)) - end, - on_construct = function(pos) - minetest.get_node_timer(pos):start(math.random(5, 10)) - end -}) - -- -- Sound -- @@ -350,28 +321,37 @@ minetest.register_abm({ if not fire_enabled then - -- Remove fire only if fire disabled + -- Occasionally remove fire if fire disabled + -- NOTE: Fire is normally extinguished in timer function minetest.register_abm({ label = "Remove disabled fire", nodenames = {"mcl_fire:fire"}, - interval = 7, - chance = 3, + interval = 10, + chance = 10, catch_up = false, action = minetest.remove_node, }) +else -- Fire enabled + -- Set fire to air nodes (inverse pyramid pattern) above lava source minetest.register_abm({ label = "Ignite fire by lava", - nodenames = {"mcl_core:lava_source"}, + nodenames = {"group:lava"}, interval = 7, chance = 2, catch_up = false, action = function(pos) + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + -- Check if liquid source node + if def and def.liquidtype ~= "source" then + return + end local function try_ignite(airs) while #airs > 0 do local r = math.random(1, #airs) - if minetest.find_node_near(airs[r], 1, {"group:flammable", "group:flammable_lava"}) then + if minetest.find_node_near(airs[r], 1, {"group:flammable"}) then minetest.set_node(airs[r], {name="mcl_fire:fire"}) return true else @@ -389,8 +369,6 @@ if not fire_enabled then end, }) -else -- Fire enabled - -- Turn flammable nodes around fire into fire minetest.register_abm({ label = "Remove flammable nodes", diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr index feca70085..22d91a5be 100644 --- a/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.de.tr @@ -8,6 +8,7 @@ Rightclick the surface of a block to attempt to light a fire in front of it or i 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.=Feuer ist ein schädlicher und destruktiver aber kurzlebiger Block. Es wird sich zu entzündlichen Blöcken ausbreiten und sie zerstören, aber Feuer wird verschwinden, wenn es nichts brennbares mehr gibt. Es wird von Wasser und Regen gelöscht. Feuer kann sicher mit einem Schlag zerstört werden, aber es tut weh, wenn man direkt in ihm steht. Wird ein Feuer über Netherrack oder einem Magmablock entfacht, wird er sich sofort zu einem ewigen Feuer verwandeln. 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.=Feuer ist ein schädlicher aber nicht-destruktiver kurzlebiger Block. Es wird verschwinden, wenn sich keine entzündlichen Blöcke in der Nähe befinden. Feuer breitet sich nicht aus und zerstört keine Blöcke, zumindest nicht in dieser Welt. Es wird von Wasser und Regen gelöscht. Feuer kann sicher mit einem Schlag zerstört werden, aber es tut weh, wenn man direkt in ihm steht. Wird ein Feuer über Netherrack oder einem Magmablock entfacht, wird er sich sofort zu einem ewigen Feuer verwandeln. 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.=Ewiges Feuer ist ein schädlicher Block, der mehr Feuer machen kann. Er wird um sich Feuer machen, wenn entflammbare Blöcke in der Nähe sind. Ewiges Feuer kann von Schlägen und Wasserblöcken in der Nähe gelöscht werden. Anders als (normales) Feuer geht ein ewiges Feuer nicht von alleine aus, auch nicht unter Regen. Es ist sicher, ein ewiges Feuer zu schlagen, aber es tut weh, wenn man direkt in einem steht. +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.=Ewiges Feuer ist ein schädlicher Block. Ewiges Feuer kann von Schlägen und Wasserblöcken in der Nähe gelöscht werden. Anders als (normales) Feuer geht ein ewiges Feuer nicht von alleine aus, auch nicht unter Regen. Es ist sicher, ein ewiges Feuer zu schlagen, aber es tut weh, wenn man direkt in einem steht. @1 has been cooked crisp.=@1 wurde knusprig gebraten. @1 felt the burn.=@1 ist völlig verbrannt. @1 died in the flames.=@1 starb in den Flammen. diff --git a/mods/ITEMS/mcl_fire/locale/template.txt b/mods/ITEMS/mcl_fire/locale/template.txt index 035834a37..065135ef9 100644 --- a/mods/ITEMS/mcl_fire/locale/template.txt +++ b/mods/ITEMS/mcl_fire/locale/template.txt @@ -8,6 +8,7 @@ Rightclick the surface of a block to attempt to light a fire in front of it or i 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.= 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.= 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.= +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.= @1 has been cooked crisp.= @1 felt the burn.= @1 died in the flames.= diff --git a/settingtypes.txt b/settingtypes.txt index d39f33794..f30ae36ec 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -13,9 +13,9 @@ creative_mode (Creative mode) bool false # Fire spreads and flammable blocks might be destroyed by nearby fire. # Destructive fire may cause severe destruction. -# Fire blocks will be non-destructive when this setting is disabled, but they -# still deal damage to creatures. Eternal fire is unaffected. -enable_fire (Destructive fire) bool true +# Fire blocks will be non-destructive and stops spreading when this +# setting is disabled, but they still deal damage to creatures. +enable_fire (Destructive and spreading fire) bool true # If enabled, the weather will change naturally over time. mcl_doWeatherCycle (Change weather) bool true From 6842c4262526d32152495c13acb849ab81695b28 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 9 Apr 2019 17:05:16 +0200 Subject: [PATCH 278/379] Version 0.53.2 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e1cae882f..52e5be50b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.53.0 +Version: 0.53.2 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 1ed1bdfadb2da0577061b4d1a903ccab8f88b9bf Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 11 Apr 2019 17:03:41 +0200 Subject: [PATCH 279/379] Use minetest.raillike_group for rails --- mods/ENTITIES/mcl_minecarts/rails.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_minecarts/rails.lua b/mods/ENTITIES/mcl_minecarts/rails.lua index f288ce049..cf1ebacf1 100644 --- a/mods/ENTITIES/mcl_minecarts/rails.lua +++ b/mods/ENTITIES/mcl_minecarts/rails.lua @@ -2,7 +2,7 @@ local S = minetest.get_translator("mcl_minecarts") -- Template rail function local register_rail = function(itemstring, tiles, def_extras, creative) - local groups = {handy=1,pickaxey=1, attached_node=1,rail=1,connect_to_raillike=1,dig_by_water=1,destroy_by_lava_flow=1, transport=1} + local groups = {handy=1,pickaxey=1, attached_node=1,rail=1,connect_to_raillike=minetest.raillike_group("rail"),dig_by_water=1,destroy_by_lava_flow=1, transport=1} if creative == false then groups.not_in_creative_inventory = 1 end From b0c457f2ec67cb14e9eb3d9f2e2a4c567448c86a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 4 May 2019 12:59:53 +0200 Subject: [PATCH 280/379] Fix chorus plant stems not break in protected land --- mods/ITEMS/mcl_end/chorus_plant.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index be20e74a4..d2071a619 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -26,7 +26,7 @@ end -- This detaches all chorus plants that are/were attached -- at start_pos. -mcl_end.detach_chorus_plant = function(start_pos) +mcl_end.detach_chorus_plant = function(start_pos, digger) local neighbors = { { x=0, y=1, z=0 }, { x=0, y=0, z=1 }, @@ -75,14 +75,14 @@ mcl_end.detach_chorus_plant = function(start_pos) -- If we traversed the entire chorus plant and it was not attached to end stone: -- Drop ALL the chorus nodes we found. for c=1, #chorus_nodes do - minetest.dig_node(chorus_nodes[c]) + minetest.node_dig(chorus_nodes[c], { name = "mcl_end:chorus_plant" }, digger) end end end end -mcl_end.check_detach_chorus_plant = function(pos) - mcl_end.detach_chorus_plant(pos) +mcl_end.check_detach_chorus_plant = function(pos, oldnode, oldmetadata, digger) + mcl_end.detach_chorus_plant(pos, digger) end minetest.register_node("mcl_end:chorus_flower", { From 80ee8172fe16049d275f1e5d00432a81218bc80f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 4 May 2019 13:33:37 +0200 Subject: [PATCH 281/379] Only allow placement of chorus stems on valid node --- mods/ITEMS/mcl_end/chorus_plant.lua | 53 +++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index d2071a619..076fab303 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -103,7 +103,7 @@ minetest.register_node("mcl_end:chorus_flower", { node_box = chorus_flower_box, selection_box = { type = "regular" }, sounds = mcl_sounds.node_sound_wood_defaults(), - groups = {handy=1,axey=1, deco_block = 1, dig_by_piston = 1, destroy_by_lava_flow = 1,chorus_plant = 1}, + groups = {handy=1,axey=1, deco_block = 1, not_in_creative_inventory = 1, dig_by_piston = 1, destroy_by_lava_flow = 1,chorus_plant = 1}, node_placement_prediction = "", on_place = function(itemstack, placer, pointed_thing) @@ -116,7 +116,7 @@ minetest.register_node("mcl_end:chorus_flower", { end end - --[[ Part 1: Check placement rules. Placement is legal is one of the following + --[[ Part 1: Check placement rules. Placement is legal if one of the following conditions is met: 1) On top of end stone or chorus plant 2) On top of air and horizontally adjacent to exactly 1 chorus plant ]] @@ -159,8 +159,11 @@ minetest.register_node("mcl_end:chorus_flower", { end if plant_ok then -- Placement OK! Proceed normally - minetest.sound_play(mcl_sounds.node_sound_wood_defaults().place, {pos = pos}) - return minetest.item_place_node(itemstack, placer, pointed_thing) + local it, suc = minetest.item_place_node(itemstack, placer, pointed_thing) + if suc then + minetest.sound_play(mcl_sounds.node_sound_wood_defaults().place, {pos = pos}) + end + return it else return itemstack end @@ -219,14 +222,52 @@ minetest.register_node("mcl_end:chorus_plant", { connect_back = { -0.1875, -0.1875, 0.25, 0.1875, 0.1875, 0.5 }, }, connect_sides = { "top", "bottom", "front", "back", "left", "right" }, - connects_to = {"mcl_end:chorus_plant", "mcl_end:chorus_flower", "mcl_end:chorus_flower_dead", "mcl_end:end_stone"}, + connects_to = {"group:chorus_plant", "mcl_end:end_stone"}, sounds = mcl_sounds.node_sound_wood_defaults(), drop = { items = { { items = { "mcl_end:chorus_fruit"}, rarity = 2 }, } }, - groups = {handy=1,axey=1, not_in_creative_inventory = 1, dig_by_piston = 1, destroy_by_lava_flow = 1, chorus_plant = 1 }, + groups = {handy=1,axey=1, dig_by_piston = 1, destroy_by_lava_flow = 1, chorus_plant = 1 }, + + node_placement_prediction = "", + on_place = function(itemstack, placer, pointed_thing) + local node_under = minetest.get_node(pointed_thing.under) + local node_above = minetest.get_node(pointed_thing.above) + if placer and not placer:get_player_control().sneak then + -- Use pointed node's on_rightclick function first, if present + if minetest.registered_nodes[node_under.name] and minetest.registered_nodes[node_under.name].on_rightclick then + return minetest.registered_nodes[node_under.name].on_rightclick(pointed_thing.under, node_under, placer, itemstack) or itemstack + end + end + + --[[ Part 1: Check placement rules. Placement is legal if this + condition is met: + - placed on end stone or any chorus node ]] + local pos_place, node_check + if minetest.registered_nodes[node_under.name].buildable_to then + pos_place = pointed_thing.under + node_check = node_above + else + pos_place = pointed_thing.above + node_check = node_under + end + local plant_ok = false + if node_check.name == "mcl_end:end_stone" or minetest.get_item_group(node_check.name, "chorus_plant") > 0 then + plant_ok = true + end + if plant_ok then + -- Placement OK! Proceed normally + local it, suc = minetest.item_place_node(itemstack, placer, pointed_thing) + if suc then + minetest.sound_play(mcl_sounds.node_sound_wood_defaults().place, {pos = pos_place}) + end + return it + else + return itemstack + end + end, after_dig_node = mcl_end.check_detach_chorus_plant, _mcl_blast_resistance = 2, _mcl_hardness = 0.4, From 8830edfdf9240b8349879dc6039c95cb1161fffa Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 4 May 2019 13:39:11 +0200 Subject: [PATCH 282/379] Add chorus plant stem usagehelp --- mods/ITEMS/mcl_end/chorus_plant.lua | 1 + mods/ITEMS/mcl_end/locale/mcl_end.de.tr | 1 + mods/ITEMS/mcl_end/locale/template.txt | 1 + 3 files changed, 3 insertions(+) diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index 076fab303..99c2b1463 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -200,6 +200,7 @@ minetest.register_node("mcl_end:chorus_flower_dead", { minetest.register_node("mcl_end:chorus_plant", { description = S("Chorus Plant Stem"), _doc_items_longdesc = S("A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers."), + _doc_items_usagehelp = S("The stem attaches itself to end stone and other chorus blocks."), tiles = { "mcl_end_chorus_plant.png", "mcl_end_chorus_plant.png", diff --git a/mods/ITEMS/mcl_end/locale/mcl_end.de.tr b/mods/ITEMS/mcl_end/locale/mcl_end.de.tr index b63cc8497..0290bbfd5 100644 --- a/mods/ITEMS/mcl_end/locale/mcl_end.de.tr +++ b/mods/ITEMS/mcl_end/locale/mcl_end.de.tr @@ -22,3 +22,4 @@ This item is used to locate End portal shrines in the Overworld and to activate Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.=Benutzen Sie die Angriffstaste, um das Enderauge loszulassen. Es wird aufsteigen und in einer horizontalen Richtung zum nächsten Endportalschrein fliegen. Wenn Sie sehr nah dran sind, wird das Enderauge stattdessen den direkten Weg zum Endportalschrein nehmen. Nach ein paar Sekunden hält es an. Es könnte als Gegenstand wieder herunterfallen, aber es wird mit einer 20%-Chance zerbrechen. To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.=Um ein Endportal zu aktivieren, müssen Enderaugen in jeden Block eines intakten Endportalrahmens platziert werden. NOTE: The End dimension is currently incomplete and might change in future versions.=ANMERKUNG: Die Ende-Dimension ist momentan unfertig und könnte sich in künftigen Versionen ändern. +The stem attaches itself to end stone and other chorus blocks.=Der Stängel muss sich neben anderen Chorusblöcken oder Endstein befinden. diff --git a/mods/ITEMS/mcl_end/locale/template.txt b/mods/ITEMS/mcl_end/locale/template.txt index 5e605eeac..14cc9ff4b 100644 --- a/mods/ITEMS/mcl_end/locale/template.txt +++ b/mods/ITEMS/mcl_end/locale/template.txt @@ -22,3 +22,4 @@ This item is used to locate End portal shrines in the Overworld and to activate Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.= To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.= NOTE: The End dimension is currently incomplete and might change in future versions.= +The stem attaches itself to end stone and other chorus blocks.= From 23630bbac04f2b41b5d3a4b46ad5c02ec3c1d4cb Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 31 May 2019 12:15:34 +0200 Subject: [PATCH 283/379] Version 0.53.3 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 52e5be50b..f3c3b8980 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.53.2 +Version: 0.53.3 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 6e9d712c5eefd98a32b9a56f7bc615d448eca86b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 2 Jun 2019 10:12:36 +0200 Subject: [PATCH 284/379] Fix ice not melting properly by non-Sun light --- mods/ITEMS/mcl_core/functions.lua | 19 ++++++++++++++++++- mods/ITEMS/mcl_core/nodes_base.lua | 8 +------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index bcbab0e70..215db3f08 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -1175,7 +1175,11 @@ minetest.register_abm({ chance = 8, action = function(pos, node) if minetest.get_node_light(pos, 0) >= 12 then - minetest.remove_node(pos) + if node.name == "mcl_core:ice" then + mcl_core.melt_ice(pos) + else + minetest.remove_node(pos) + end end end }) @@ -1206,6 +1210,19 @@ function mcl_core.check_vines_supported(pos, node) return supported end +-- Melt ice at pos. mcl_core:ice MUST be a post if you call this! +function mcl_core.melt_ice(pos) + -- Create a water source if ice is destroyed and there was something below it + local below = {x=pos.x, y=pos.y-1, z=pos.z} + local belownode = minetest.get_node(below) + local dim = mcl_worlds.pos_to_dimension(below) + if dim ~= "nether" and belownode.name ~= "air" and belownode.name ~= "ignore" and belownode.name ~= "mcl_core:void" then + minetest.set_node(pos, {name="mcl_core:water_source"}) + else + minetest.remove_node(pos) + end +end + ---- FUNCTIONS FOR SNOWED NODES ---- -- These are nodes which change their appearence when they are below a snow cover -- and turn back into “normal” when the snow cover is removed. diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 9062c8e71..50c1d1cc7 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -781,13 +781,7 @@ minetest.register_node("mcl_core:ice", { sounds = mcl_sounds.node_sound_glass_defaults(), node_dig_prediction = "mcl_core:water_source", after_dig_node = function(pos, oldnode) - -- Create a water source if ice is destroyed and there was something below it - local below = {x=pos.x, y=pos.y-1, z=pos.z} - local belownode = minetest.get_node(below) - local dim = mcl_worlds.pos_to_dimension(below) - if dim ~= "nether" and belownode.name ~= "air" and belownode.name ~= "ignore" and belownode.name ~= "mcl_core:void" then - minetest.set_node(pos, {name="mcl_core:water_source"}) - end + mcl_core.melt_ice(pos) end, _mcl_blast_resistance = 2.5, _mcl_hardness = 0.5, From 6cd1fb111992bb78ea43265ae8c6642578b1119f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 2 Jun 2019 10:21:35 +0200 Subject: [PATCH 285/379] Change German translation of Jack'o lantern --- mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr index bdb496621..7f14774cc 100644 --- a/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr +++ b/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr @@ -67,8 +67,8 @@ Faceless Pumpkin=Gesichtsloser Kürbis A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=Ein gesichtsloser Kürbis ist ein dekorativer Block. Mit einer Schere kann man in ihm ein Muster schnitzen, um Kürbissamen zu erhalten. Pumpkin=Kürbis A pumpkin can be worn as a helmet for fun, but it doesn't offer any protection. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=Einen Kürbis kann zum Spaß als Helm getragen werden, aber er bietet keinen Schutz. Kürbisse wachsen aus Kürbisstängeln, welche wiederum aus Kürbissamen wachsen. -Jack o'Lantern=Halloweenkürbis -A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=Ein Halloweenkürbis ist eine traditionelle Dekoration für Halloween. Er leuchtet hell. +Jack o'Lantern=Kürbislaterne +A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=Eine Kürbislaterne ist eine traditionelle Dekoration für Halloween. Sie leuchtet hell. Pumpkin Pie=Kürbiskuchen A pumpkin pie is a tasty food item which can be eaten.=Ein Kürbiskuchen ist ein leckeres essbares Lebensmittel. Farmland=Ackerboden From 36adba2e0bc17a3eb282693ef9ab9cddb80d7ec1 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 13 Jun 2019 20:44:04 +0200 Subject: [PATCH 286/379] Add chorus plant stem to deco_block group --- mods/ITEMS/mcl_end/chorus_plant.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index 99c2b1463..02ab50d47 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -230,7 +230,7 @@ minetest.register_node("mcl_end:chorus_plant", { { items = { "mcl_end:chorus_fruit"}, rarity = 2 }, } }, - groups = {handy=1,axey=1, dig_by_piston = 1, destroy_by_lava_flow = 1, chorus_plant = 1 }, + groups = {handy=1,axey=1, deco_block = 1, dig_by_piston = 1, destroy_by_lava_flow = 1, chorus_plant = 1 }, node_placement_prediction = "", on_place = function(itemstack, placer, pointed_thing) From c623860af88ce29a1e552a9b9dd536ced8703c54 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 14 Jun 2019 23:01:50 +0200 Subject: [PATCH 287/379] Add wool sounds --- mods/CORE/mcl_sounds/README.txt | 7 +++++++ mods/CORE/mcl_sounds/init.lua | 14 ++++++++++++++ .../mcl_sounds/sounds/mcl_sounds_cloth.1.ogg | Bin 0 -> 8903 bytes .../mcl_sounds/sounds/mcl_sounds_cloth.2.ogg | Bin 0 -> 8991 bytes .../mcl_sounds/sounds/mcl_sounds_cloth.3.ogg | Bin 0 -> 8652 bytes .../mcl_sounds/sounds/mcl_sounds_cloth.4.ogg | Bin 0 -> 7890 bytes mods/ITEMS/mcl_wool/init.lua | 4 ++-- 7 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.1.ogg create mode 100644 mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.2.ogg create mode 100644 mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.3.ogg create mode 100644 mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.4.ogg diff --git a/mods/CORE/mcl_sounds/README.txt b/mods/CORE/mcl_sounds/README.txt index 43e6cf30c..9fc2ba28f 100644 --- a/mods/CORE/mcl_sounds/README.txt +++ b/mods/CORE/mcl_sounds/README.txt @@ -4,6 +4,9 @@ Licenses of sounds Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) http://creativecommons.org/licenses/by-sa/3.0/ +Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +http://creativecommons.org/licenses/by-sa/4.0/ + Creative Commons Attribution 3.0 Unported (CC BY-SA 3.0) http://creativecommons.org/licenses/by/3.0/ @@ -86,5 +89,9 @@ Adam_N (CC0 1.0): player_falling_damage.ogg Source: +Alecia Shepherd (CC BY-SA 4.0): + mcl_sounds_cloth.ogg + Source: SnowSong sound and music pack + Unknown authors (WTFPL): pedology_snow_soft_footstep.*.ogg diff --git a/mods/CORE/mcl_sounds/init.lua b/mods/CORE/mcl_sounds/init.lua index cd3ca96f8..70010fda0 100644 --- a/mods/CORE/mcl_sounds/init.lua +++ b/mods/CORE/mcl_sounds/init.lua @@ -97,6 +97,20 @@ function mcl_sounds.node_sound_wood_defaults(table) return table end +function mcl_sounds.node_sound_wool_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name="mcl_sounds_cloth", gain=0.5} + table.dug = table.dug or + {name="mcl_sounds_cloth", gain=1.0} + table.dig = table.dig or + {name="mcl_sounds_cloth", gain=0.9} + table.place = table.dig or + {name="mcl_sounds_cloth", gain=1.0} + mcl_sounds.node_sound_defaults(table) + return table +end + function mcl_sounds.node_sound_leaves_defaults(table) table = table or {} table.footstep = table.footstep or diff --git a/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.1.ogg b/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cc304a414050d9ae55edd85c3fc5054aa3f218a4 GIT binary patch literal 8903 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 F{tHQ=Hdz1w literal 0 HcmV?d00001 diff --git a/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.3.ogg b/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2f682c72b969910d5b1c78f39897b685647ed550 GIT binary patch literal 8652 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 literal 0 HcmV?d00001 diff --git a/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.4.ogg b/mods/CORE/mcl_sounds/sounds/mcl_sounds_cloth.4.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cc60b8f6ed74afcb303bd06fee285d039af271f6 GIT binary patch literal 7890 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 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_wool/init.lua b/mods/ITEMS/mcl_wool/init.lua index 912a6ccd1..aabeb2e61 100644 --- a/mods/ITEMS/mcl_wool/init.lua +++ b/mods/ITEMS/mcl_wool/init.lua @@ -61,7 +61,7 @@ for _, row in ipairs(wool.dyes) do is_ground_content = false, tiles = {texture..".png"}, groups = {handy=1,shearsy_wool=1, flammable=1,wool=1,building_block=1}, - sounds = mcl_sounds.node_sound_defaults(), + sounds = mcl_sounds.node_sound_wool_defaults(), _mcl_hardness = 0.8, _mcl_blast_resistance = 4, }) @@ -77,7 +77,7 @@ for _, row in ipairs(wool.dyes) do wield_image = texture..".png", wield_scale = { x=1, y=1, z=0.5 }, groups = {handy=1, carpet=1,attached_node=1,dig_by_water=1,deco_block=1}, - sounds = mcl_sounds.node_sound_defaults(), + sounds = mcl_sounds.node_sound_wool_defaults(), paramtype = "light", sunlight_propagates = true, stack_max = 64, From d4facaf503335310d137d5cf4ac35ef20c364e5e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 14 Jun 2019 23:03:12 +0200 Subject: [PATCH 288/379] Add wool sound for beds --- mods/ITEMS/mcl_beds/api.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index 39a80e316..efc27b3ea 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -48,7 +48,9 @@ end local default_sounds if minetest.get_modpath("mcl_sounds") then - default_sounds = mcl_sounds.node_sound_wood_defaults() + default_sounds = mcl_sounds.node_sound_wood_defaults({ + footstep = { gain = 0.5, name = "mcl_sounds_cloth" }, + }) end function mcl_beds.register_bed(name, def) From b1f201f5383ca98390eb2d0c07dcb8199fdbcb38 Mon Sep 17 00:00:00 2001 From: Rootyjr <41842051+Rootyjr@users.noreply.github.com> Date: Mon, 29 Jul 2019 00:13:16 -0500 Subject: [PATCH 289/379] Fix #530 (Players were stuck in sitting animation after being out of minecart). --- mods/ENTITIES/mcl_minecarts/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index 0305dba2e..2f9d67302 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -492,6 +492,7 @@ register_minecart( self._start_pos = nil clicker:set_detach() clicker:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) + mcl_player.player_set_animation(clicker, "stand" , 30) elseif not self._driver then self._driver = player_name self._start_pos = self.object:get_pos() From 1d5cdfe544ee0a7f777fd400a04edf19eaf9542a Mon Sep 17 00:00:00 2001 From: aligator Date: Wed, 31 Jul 2019 14:48:48 +0200 Subject: [PATCH 290/379] enable double doors (mirror) if left block is also a door of the same type --- mods/ITEMS/mcl_doors/api_doors.lua | 67 ++++++++++++++++++------------ 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/mods/ITEMS/mcl_doors/api_doors.lua b/mods/ITEMS/mcl_doors/api_doors.lua index e3e882794..1b32d2389 100644 --- a/mods/ITEMS/mcl_doors/api_doors.lua +++ b/mods/ITEMS/mcl_doors/api_doors.lua @@ -123,21 +123,25 @@ function mcl_doors:register_door(name, def) return itemstack end + -- get left coordinate for checking if another door is there + local pt_left = {x=pt.x, y=pt.y, z=pt.z} local p2 = minetest.dir_to_facedir(placer:get_look_dir()) - local pt3 = {x=pt.x, y=pt.y, z=pt.z} + if p2 == 0 then - pt3.x = pt3.x-1 + pt_left.x = pt_left.x-1 elseif p2 == 1 then - pt3.z = pt3.z+1 + pt_left.z = pt_left.z+1 elseif p2 == 2 then - pt3.x = pt3.x+1 + pt_left.x = pt_left.x+1 elseif p2 == 3 then - pt3.z = pt3.z-1 + pt_left.z = pt_left.z-1 end + + local left_node = minetest.get_node(pt_left) + -- Set door nodes minetest.set_node(pt, {name=name.."_b_1", param2=p2}) minetest.set_node(pt2, {name=name.."_t_1", param2=p2}) - -- TODO: Mirror door when 2 doors are placed next to each other, to create double doors if def.sounds and def.sounds.place then minetest.sound_play(def.sounds.place, {pos=pt}) @@ -150,12 +154,19 @@ function mcl_doors:register_door(name, def) meta:set_string("doors_owner", "") end - -- Save open state. 1 = open. 0 = closed - local meta = minetest.get_meta(pt) - meta:set_int("is_open", 0) - meta = minetest.get_meta(pt2) - meta:set_int("is_open", 0) + local meta1 = minetest.get_meta(pt) + local meta2 = minetest.get_meta(pt2) + -- save mirror state for the correct door + if left_node.name:sub(1, #name) == name then + meta1:set_int("is_mirrored", 1) + meta2:set_int("is_mirrored", 1) + end + -- Save open state. 1 = open. 0 = closed + meta1:set_int("is_open", 0) + meta2:set_int("is_open", 0) + + if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() end @@ -170,24 +181,28 @@ function mcl_doors:register_door(name, def) local tt = def.tiles_top local tb = def.tiles_bottom - local function on_open_close(pos, dir, check_name, replace, replace_dir, params) + local function on_open_close(pos, dir, check_name, replace, replace_dir) local meta1 = minetest.get_meta(pos) pos.y = pos.y+dir local meta2 = minetest.get_meta(pos) - if not minetest.get_node(pos).name == check_name then + + -- if name of other door is not the same as check_name -> return + if not minetest.get_node(pos).name == check_name then return end + + -- swap directions if mirrored + local params = {3,0,1,2} + if meta1:get_int("is_open") == 0 and meta2:get_int("is_mirrored") == 0 or meta1:get_int("is_open") == 1 and meta2:get_int("is_mirrored") == 1 then + params = {1,2,3,0} + end + local p2 = minetest.get_node(pos).param2 local np2 = params[p2+1] - local metatable = minetest.get_meta(pos):to_table() - minetest.set_node(pos, {name=replace_dir, param2=np2}) - minetest.get_meta(pos):from_table(metatable) - + minetest.swap_node(pos, {name=replace_dir, param2=np2}) pos.y = pos.y-dir - metatable = minetest.get_meta(pos):to_table() - minetest.set_node(pos, {name=replace, param2=np2}) - minetest.get_meta(pos):from_table(metatable) + minetest.swap_node(pos, {name=replace, param2=np2}) local door_switching_sound if meta1:get_int("is_open") == 1 then @@ -203,11 +218,11 @@ function mcl_doors:register_door(name, def) end local function on_mesecons_signal_open(pos, node) - on_open_close(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) + on_open_close(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2") end local function on_mesecons_signal_close(pos, node) if not mesecon.is_powered({x=pos.x,y=pos.y+1,z=pos.z}) then - on_open_close(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2}) + on_open_close(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1") end end local function on_mesecons_signal_open_top(pos, node) @@ -233,7 +248,7 @@ function mcl_doors:register_door(name, def) if not def.only_redstone_can_open then on_rightclick = function(pos, node, clicker) if check_player_priv(pos, clicker) then - on_open_close(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) + on_open_close(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2") end end end @@ -282,7 +297,7 @@ function mcl_doors:register_door(name, def) else on_rightclick = function(pos, node, clicker) if check_player_priv(pos, clicker) then - on_open_close(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2", {1,2,3,0}) + on_open_close(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2") end end end @@ -331,7 +346,7 @@ function mcl_doors:register_door(name, def) else on_rightclick = function(pos, node, clicker) if check_player_priv(pos, clicker) then - on_open_close(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2}) + on_open_close(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1") end end end @@ -380,7 +395,7 @@ function mcl_doors:register_door(name, def) else on_rightclick = function(pos, node, clicker) if check_player_priv(pos, clicker) then - on_open_close(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1", {3,0,1,2}) + on_open_close(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1") end end end From 839d74329cb564be33a8a717412b7a3f7c043389 Mon Sep 17 00:00:00 2001 From: Rootyjr <41842051+Rootyjr@users.noreply.github.com> Date: Wed, 31 Jul 2019 11:14:11 -0500 Subject: [PATCH 291/379] Fix #534.3 (Dyeing a sheep did not remove the dye from inventory.) --- mods/ENTITIES/mobs_mc/sheep.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index bf321bcc7..2f069f85b 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -185,6 +185,10 @@ mobs:register_mob("mobs_mc:sheep", { minetest.log("verbose", "[mobs_mc] " ..item:get_name() .. " " .. minetest.get_item_group(item:get_name(), "dye")) for group, colordata in pairs(colors) do if minetest.get_item_group(item:get_name(), group) == 1 then + if not minetest.settings:get_bool("creative_mode") then + item:take_item() + clicker:set_wielded_item(item) + end self.base_texture = sheep_texture(group) self.object:set_properties({ textures = self.base_texture, From 379dd847eedc1c93a28be53ca4a6c1504cc2382e Mon Sep 17 00:00:00 2001 From: Rootyjr <41842051+Rootyjr@users.noreply.github.com> Date: Tue, 30 Jul 2019 21:22:28 -0500 Subject: [PATCH 292/379] Completely rework fishing rod to simulate a much more MC-like behaviour --- mods/ITEMS/mcl_fishing/init.lua | 309 +++++++++++++++++- .../textures/mcl_fishing_bobber.png | Bin 0 -> 2281 bytes .../textures/mcl_fishing_fishing_rod.png | Bin 299 -> 2397 bytes mods/ITEMS/mcl_throwing/init.lua | 45 +++ 4 files changed, 342 insertions(+), 12 deletions(-) create mode 100644 mods/ITEMS/mcl_fishing/textures/mcl_fishing_bobber.png diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index 0c23daae7..0d34779d4 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -1,4 +1,9 @@ local S = minetest.get_translator("mcl_fishing") +local mod_throwing = minetest.get_modpath("mcl_throwing") + +local entity_mapping = { + ["mcl_fishing:bobber"] = "mcl_fishing:bobber_entity", +} local go_fishing = function(itemstack, user, pointed_thing) if pointed_thing and pointed_thing.under then @@ -83,26 +88,308 @@ local go_fishing = function(itemstack, user, pointed_thing) return nil end +local bobber_ENTITY={ + physical = false, + timer=0, + textures = {"mcl_fishing_bobber.png"}, + visual_size = {x=0.5, y=0.5}, + collisionbox = {0.45,0.45,0.45,0.45,0.45,0.45}, + pointable = false, + + get_staticdata = get_staticdata, + on_activate = on_activate, + + _lastpos={}, + _dive = false, + _waittick = nil, + _tick = 0, + player=nil, + _oldy = nil, + objtype="fishing", +} + +local fish = function(itemstack, player) + local pos = player:get_pos() + + local objs = minetest.get_objects_inside_radius(pos, 250) + local num = 0 + local ent = nil + local noent = true + + --Check for bobber if so handle. + for n = 1, #objs do + ent = objs[n]:get_luaentity() + if ent then + if ent.player and ent.objtype=="fishing" then + if (player:get_player_name() == ent.player) then + noent = false + if ent._dive == true then + local itemname + local itemcount = 1 + local itemwear = 0 + -- FIXME: Maybe use a better seeding + local pr = PseudoRandom(os.time() * math.random(1, 100)) + local r = pr:next(1, 100) + if r <= 85 then + -- Fish + items = mcl_loot.get_loot({ + items = { + { itemstring = "mcl_fishing:fish_raw", weight = 60 }, + { itemstring = "mcl_fishing:salmon_raw", weight = 25 }, + { itemstring = "mcl_fishing:clownfish_raw", weight = 2 }, + { itemstring = "mcl_fishing:pufferfish_raw", weight = 13 }, + } + }, pr) + elseif r <= 95 then + -- Junk + items = mcl_loot.get_loot({ + items = { + { itemstring = "mcl_core:bowl", weight = 10 }, + { itemstring = "mcl_fishing:fishing_rod", weight = 2, wear_min = 6554, wear_max = 65535 }, -- 10%-100% damage + { itemstring = "mcl_mobitems:leather", weight = 10 }, + { itemstring = "3d_armor:boots_leather", weight = 10, wear_min = 6554, wear_max = 65535 }, -- 10%-100% damage + { itemstring = "mcl_mobitems:rotten_flesh", weight = 10 }, + { itemstring = "mcl_core:stick", weight = 5 }, + { itemstring = "mcl_mobitems:string", weight = 5 }, + { itemstring = "mcl_potions:potion_water", weight = 10 }, + { itemstring = "mcl_mobitems:bone", weight = 10 }, + { itemstring = "mcl_dye:black", weight = 1, amount_min = 10, amount_max = 10 }, + { itemstring = "mcl_mobitems:string", weight = 10 }, -- TODO: Tripwire Hook + } + }, pr) + else + -- Treasure + items = mcl_loot.get_loot({ + items = { + -- TODO: Enchanted Bow + { itemstring = "mcl_bows:bow", wear_min = 49144, wear_max = 65535 }, -- 75%-100% damage + -- TODO: Enchanted Book + { itemstring = "mcl_books:book" }, + -- TODO: Enchanted Fishing Rod + { itemstring = "mcl_fishing:fishing_rod", wear_min = 49144, wear_max = 65535 }, -- 75%-100% damage + { itemstring = "mcl_mobs:nametag", }, + { itemstring = "mcl_mobitems:saddle", }, + { itemstring = "mcl_flowers:waterlily", }, + } + }, pr) + end + local item + if #items >= 1 then + item = ItemStack(items[1]) + else + item = ItemStack() + end + local inv = player:get_inventory() + if inv:room_for_item("main", item) then + inv:add_item("main", item) + end + if not minetest.settings:get_bool("creative_mode") then + local idef = itemstack:get_definition() + itemstack:add_wear(65535/65) -- 65 uses + if itemstack:get_count() == 0 and idef.sound and idef.sound.breaks then + minetest.sound_play(idef.sound.breaks, {pos=player.get_pos(), gain=0.5}) + end + end + end + --Check if object is on land. + local epos = ent.object:get_pos() + epos.y = math.floor(epos.y) + local node = minetest.get_node(epos) + local def = minetest.registered_nodes[node.name] + if def.walkable then + if not minetest.settings:get_bool("creative_mode") then + local idef = itemstack:get_definition() + itemstack:add_wear((65535/65)*2) -- if so and not creative then wear double like in MC. + if itemstack:get_count() == 0 and idef.sound and idef.sound.breaks then + minetest.sound_play(idef.sound.breaks, {pos=player.get_pos(), gain=0.5}) + end + end + end + --Destroy bobber. + ent.object:remove() + return itemstack + end + end + end + end + --Check for flying bobber. + for n = 1, #objs do + ent = objs[n]:get_luaentity() + if ent then + if ent._thrower and ent.objtype=="fishing" then + if player:get_player_name() == ent._thrower then + noent = false + break + end + end + end + end + --If no bobber or flying_bobber exists then throw bobber. + if noent == true then + local playerpos = player:get_pos() + local dir = player:get_look_dir() + local obj = mcl_throwing.throw("mcl_throwing:flying_bobber", {x=playerpos.x, y=playerpos.y+1.5, z=playerpos.z}, dir, 15) + obj:get_luaentity()._thrower = player:get_player_name() + end +end + +-- Movement function of bobber +local bobber_on_step = function(self, dtime) + self.timer=self.timer+dtime + local epos = self.object:get_pos() + epos.y = math.floor(epos.y) + local node = minetest.get_node(epos) + local def = minetest.registered_nodes[node.name] + + --If we have no player remove self. + if self.player == nil then + self.object:remove() + end + + --Check if player is nearby + if self._tick % 5 == 0 and self.player ~= nil then + --Destroy bobber if item not wielded. + if (minetest.get_player_by_name(self.player):get_wielded_item():get_name() ~= "mcl_fishing:fishing_rod") then + self.object:remove() + end + + --Destroy bobber if player is too far away. + local objpos = self.object:get_pos() + local playerpos = minetest.get_player_by_name(self.player):get_pos() + if (((playerpos.y - objpos.y) >= 33) or ((playerpos.y - objpos.y) <= -33)) then + self.object:remove() + elseif (((playerpos.x - objpos.x) >= 33) or ((playerpos.x - objpos.x) <= -33)) then + self.object:remove() + elseif (((playerpos.z - objpos.z) >= 33) or ((playerpos.z - objpos.z) <= -33)) then + self.object:remove() + elseif ((((playerpos.z + playerpos.x) - (objpos.z + objpos.x)) >= 33) or ((playerpos.z + playerpos.x) - (objpos.z + objpos.x)) <= -33) then + self.object:remove() + elseif ((((playerpos.y + playerpos.x) - (objpos.y + objpos.x)) >= 33) or ((playerpos.y + playerpos.x) - (objpos.y + objpos.x)) <= -33) then + self.object:remove() + elseif ((((playerpos.z + playerpos.y) - (objpos.z + objpos.y)) >= 33) or ((playerpos.z + playerpos.y) - (objpos.z + objpos.y)) <= -33) then + self.object:remove() + end + + end + --if in liquid then bob. + if def.liquidtype == "source" then + if self._oldy == nil then + self.object:set_pos({x=self.object:get_pos().x,y=math.floor(self.object:get_pos().y)+.5,z=self.object:get_pos().z}) + self._oldy = self.object:get_pos().y + end + minetest.log(self.object:get_pos().y.." "..self._oldy) + -- reset to original position after dive. + if self.object:get_pos().y > self._oldy then + self.object:set_pos({x=self.object:get_pos().x,y=self._oldy,z=self.object:get_pos().z}) + self.object:set_velocity({x=0,y=0,z=0}) + self.object:set_acceleration({x=0,y=0,z=0}) + end + if self._dive then + for i=1,2 do + --spray bubbles there's a fish. + minetest.add_particle({ + pos = {x=epos["x"]+math.random(-1,1)*math.random()/2,y=epos["y"]+0.1,z=epos["z"]+math.random(-1,1)*math.random()/2}, + velocity = {x=0, y=4, z=0}, + acceleration = {x=0, y=-5, z=0}, + expirationtime = math.random(), + size = math.random()+0.5, + collisiondetection = true, + vertical = false, + texture = "mcl_particles_bubble.png", + }) + end + if self._tick ~= self._waittick then + self._tick = self._tick + 1 + else + self._waittick = nil + self._tick = 0 + self._dive = false + end + else if self._waittick == nil then + --wait for random number of ticks. + self._waittick = math.random(50,800) + else + if self._tick ~= self._waittick then + self._tick = self._tick + 1 + else + --wait time is over time to dive. + self._dive = true + self.object:set_velocity({x=0,y=-2,z=0}) + self.object:set_acceleration({x=0,y=5,z=0}) + self._waittick = 30 + self._tick = 0 + end + end + end +end + + -- Destroy when hitting a solid node + --if self._lastpos.x~=nil then + -- if (def and def.walkable) or not def then + --self.object:remove() + -- return + -- end + --end + --self._lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set lastpos-->Node will be added at last pos outside the node +end + +bobber_ENTITY.on_step = bobber_on_step + +minetest.register_entity("mcl_fishing:bobber_entity", bobber_ENTITY) + +--If player leaves area remove bobber. +minetest.register_on_leaveplayer(function(player) + local objs = minetest.get_objects_inside_radius(player:get_pos(), 250) + local num = 0 + local ent = nil + local noent = true + + for n = 1, #objs do + ent = objs[n]:get_luaentity() + if ent then + if ent.player and ent.objtype=="fishing" then + ent.object:remove() + elseif ent._thrower and ent.objtype=="fishing" then + ent.object:remove() + end + end + end +end) + +--if player dies remove bobber. +minetest.register_on_dieplayer(function(player) + local objs = minetest.get_objects_inside_radius(player:get_pos(), 250) + local num = 0 + local ent = nil + local noent = true + + for n = 1, #objs do + ent = objs[n]:get_luaentity() + if ent then + if ent.player and ent.objtype=="fishing" then + ent.object:remove() + elseif ent._thrower and ent.objtype=="fishing" then + ent.object:remove() + end + end + end +end) + -- Fishing Rod minetest.register_tool("mcl_fishing:fishing_rod", { description = S("Fishing Rod"), _doc_items_longdesc = S("Fishing rods can be used to catch fish."), - _doc_items_usagehelp = S("Rightclick a water source to try to go fishing. Who knows what you're going to catch?"), + _doc_items_usagehelp = S("Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?"), -- This item is incomplete, hide it from creative inventory - groups = { tool=1, not_in_creative_inventory=1 }, + groups = { tool=1}, inventory_image = "mcl_fishing_fishing_rod.png", stack_max = 1, - liquids_pointable = true, - on_place = go_fishing, + on_place = fish, + on_secondary_use = fish, sound = { breaks = "default_tool_breaks" }, }) ---[[ - -Temporarily removed from crafting as the fishing rod is massively overpowered atm. - -TODO: Re-enable crafting when fishing rod has been improved. - +--Make fishing rods craftable again. minetest.register_craft({ output = "mcl_fishing:fishing_rod", recipe = { @@ -119,8 +406,6 @@ minetest.register_craft({ {'mcl_mobitems:string','','mcl_core:stick'}, } }) -]] - minetest.register_craft({ type = "fuel", recipe = "mcl_fishing:fishing_rod", diff --git a/mods/ITEMS/mcl_fishing/textures/mcl_fishing_bobber.png b/mods/ITEMS/mcl_fishing/textures/mcl_fishing_bobber.png new file mode 100644 index 0000000000000000000000000000000000000000..0c93fd4f9009a8d22f4cee482f1f6ed2a425b57a GIT binary patch literal 2281 zcmV zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1dTbu>2&{Ld;}0s%0V!}y*%aQPmF4VR=(vTvm$ zi31U4z_6syVR;*r;hE8?JIHNFc*$vxRpix4?v~E}?}g(K*}Q&w9vcrZ zs)apa#Z5@`{O09J5QRiZXg$6~rXogZ=uCNd#ZT!whED*Vy(j#1*>btyScZKUD(QC}2(? z<}((We&g^5X91ooL6Zr_27eEadKUclc`(%bD03nmPOK0YkNQFwgSqhyEf7L|V`?Y9 zq*kM!KZ95SgLc9kkYLhznaGx|+LFn$Xse)V^ja_E>ox$0;M*b?5-^}0i6uwcGkYT7 z7{E_L3qFJpLy8;)+n80+MIS?qF(o)n zCc##Meu5x#mTa=kF8dsE%&DM!iYd0Z;!7y8q{>w)wg6RK^)=L3Q=^7bYNpxdns1@S zmO5&!OE=wi*L@E?_H?qgS$$;fnYpi7qslsMoI$I0(n_1lTke4X9geCf$4X@R#O=pLgqDQg@{ z&+%n`+S;LX6u^+Bak?foJDq9$T#auLhC+eq`T3;>^ckHI%5@gpHx1o+3n=dHy zDWF)3x3UI?O7L41x7j<;ozt0X5ZV~EaTC3A^?4^yibVnDHAt9}Hch66VwNF`>nm_u zhAQ&>X)%L>b5ZBelG|G?j&j|$Y9i`(2W3p`e1cB3ZLsB@L0rmeYCBmfT4b+1TxLq& zSaPh+@v@h2us84L4>*nGV20F}RQxFu=egE4B#}-Jg;od#?*uo#?9R!Yo6N}?Tw+7q zjKF;Lu2r8F2#JD<#1yDaEqx$0Ki zSxZk@s3VQM*J1&K?dx@W`nYd3>T~HgYmY;GocUqhptA6_KgHdxI()nzN%m_Z;reM8 zi~(;Ec_)e_YPm(Oz6$-m^<1mxibC4u7X|rWFMaForateC*TE|L$SS3D&u>o0RoSmD zz~;HJcab%dC52B1%eh3(lG^~6EHy~SML4Q|0gk$O+LD;v>i_@&glR)VP)S2WAaHVT zW@&6?004NLeUUv#!$2IxUsI(b6$d+r2+dHPEQpFaY88r5A=C=3I+$GgAv9@7Qd}Gb z*Mfr|i&X~~XI&j!1wrrw#KqM~(M3x9Us7lh}W*M`Rl!EX0x<`PocX6KOf9}uGqvkCJ1VrK)W|%hdI`QPDZE)Tv zjTnMuzPM~KB@8!K(hN~T6UK^#*xo$`gO$13M7 z&RV(3n)l={4CnRbC9cyPL=p>Fgai=^s@OmoHsZAEq*zGPe!|B;;QA$UDdgG!BgZ@{ z&>*{h@IUz7tyLHw^OC{|p!3CXK8AqMF3_ks&iAq7G){ovGjOH1{FOQ|{YiSQrNxeb z-fiIGx}_<5z~v6m|76If>`FnJLZJY>pV2qvfWBLxd)4c$xsTHaAVXcHZh(VBV7N%x zYd-JpYVYmeGtK^f0G)(#xPUZWX8-^I24YJ`L;zF(Q2l~`L%?J@^aT+|XpB3xgGwZH7Y zeCBt0dwSmA`#kUaK0->#Z;85X=m0|H7B#3;>eaR7?D$i`{-}}_j_45|&N(Zrc5`fnB z9^rEKNq`nhqqx6JbNBF4P*AXi-PJklN(TVlU2UWLk2;W?g z3I781CWA(zd4<7&e)aSm)Bb=2xX)ySxuy!I!^*}{>Z9QHB!OM&1faoG!sYcV04`^r z%n8RlTL9!FnhIj^Bx{jP_QLawdAwpi;FH;nUiAwfrcMEC>wq*qXzL`b5<0IOM+g>KIzEV)2=pT6lgnMt;#%gXx00000NkvXXu0mjf DnAuiz literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_fishing/textures/mcl_fishing_fishing_rod.png b/mods/ITEMS/mcl_fishing/textures/mcl_fishing_fishing_rod.png index f8b4f871498da37a2f57fb78e0030a5b17a4e7ff..2fbcc73445a20508c2283c2365f16e23f681663f 100644 GIT binary patch delta 2387 zcmV-Z39R<30^JgjBYy>^dQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvmgFc5 z{O1&N1Pif9$6qXZ4%z~R)X zO}LR`9jm3o&Fk(Q=gouNTt8Tt7%i`EXnTBu-QOOFZrk&t-G9Wg{m6Dim*aWxn0egS z9prYzcG+q7jqV3hxJzgM+p^tm=g)l?0Y>%k$JW@!#K*kaH4`HWR!(RmuFPZLvUr^1 zDj)GP$32Em0A6=b_#J0te1l^-I@1bIIBh%mCp%x$*oTP7UNhVKh-yFLaev(5*L#)T z+sZCE=ty1INq?QG%sULsfRpEA0cXU&$9L&$2UOS2f!ACD%eF_|0@F9d4Mx9EL zql-R<7=NQgjY(LXcnK0kL?x+JMj7))gGLoqO$n1Gm*6X5e1aj{%-Ln1LylRp=2Re` z;)*Y!#3DsYsv41Yk-c5rqGIcEoRgR?^|8)k12r61%} z8jOKK*U0)#7k4-2KIP2--JkMiUomF}b^ix*W>9y>+(+JCuvXJ7w>$|Ns}Pu?LNb;g z1|=)_!|UXCt@-VP++v-#xy8~`FxTr07)%YW@W2xDZ8vc-1bEB!5$s0sH!46wL`#8XK>lwWdD`^jV)g)Hr2% zRM({}9$Lm`>QZhQL(Dlw>l#y!%wdZ}>XG`)6}yMN=C(OWb00NezF1LTXrbG*yo)JK zxcVJ&VJ&CUU9S9lN*hH6yv;8=9%RD18hzdbk`CCnwQr)aak+hbW z*7S}9g?c|3sI-*>J{_2#JZKd9B#R%nPv484EYHr0Wnt{$LJE%obH%(b@FkRT>wtnp6Rl?NA z-oQ))b`zyw5%BU_@Or+Hw*4R20Hm}$REezZ4r=U1$}5U)yvSO#4s~Z$2^HX0_k;}*7VXxM+Xc3mfuYZr=wQ#S@$I-UVjYZbs&CC zYhix-YB2NNpg)q*E%}{n!q&!wdivJFr>w`$=N$+|`C)u6{2$Ag2BrJwDRzQ8z!`chp@@$5KcOIENxt%_7h@z~8>o%IVAPNKiR0 zqiGw-Anu`7##Kwl(uWl8# z_wtx+*Z?=Lt>9C%D&F<~0USd^V%eruVE_ODglR)VP)S2WAaHVTW@&6?004NLeUUv# z!$2IxUsI(b6$d+r2+dHPEQpFaY88r5A=C=3I+$GgAv9@7Qd}Gb*MEY8AB$B77iV1^ zTm?b!1H{GENzp}0{9jUN5#zyeKi=JY+`R*YdYNff$0(rbwwX>Q#B6Rw480@B#c@7{fY2_`s5#E}vEwvOfZ#K5rMLW*Ixzi7dVj5@#g2g9ZQ$a%r73&B zorH3@fHYla00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6 z000McNliru<9`Pq05>|YRUy*=00F2;L_t(I%bkrV=o^Ae5ORm%Md=_JGK7Ip7x8B1Mer9C4rB)_q*IZ)iymBPT|DT)c}Q`nT^8#f z_;?um()jvoJ@6df&-3B+c|Xtlc|=wD-;s<4F$$u)t$$g=<|7pmE;@lcV0~p??>01X z-R-2~Nkd7N41lXnC;qydr1uX?h8O^Ub2&nt{qkmX2;Y4_HC{Jep~qU11Au@Tk?^yp z>>gzCxE%C`Tl7MJz4SJ!imFmq-zqO&c5&_YLn_M4&V?8NsfDDhugoiesuJq#mlo5{ z?m?D{@_({3k7LF7=l4<3M!<|%PCPEhsSpd`s;agY7e0;ySWY%}GI(5$6VtH(UuP4t z_-Vpc5HKS$GCs|~=sRk>ZX3k-SN!UG&*r^G8zeCk=f_%#jh&3`om?vF_H7Ke_ZFG& zi$#E`ctWP)iGtKSz8eLI6ge1vJBimgNw90-7sx90S*mj#3&dDIx#>002ovPDHLk FV1n8hiC+K! delta 273 zcmV+s0q*|Y5~~7`BYyz$Nkl`S_ z07w%d7a%l0ee&S{$>Rs%nh^#dY)3W#Bc9i015yANkvXXu0mjf^cH%e diff --git a/mods/ITEMS/mcl_throwing/init.lua b/mods/ITEMS/mcl_throwing/init.lua index 7205a17b5..1c579bd8d 100644 --- a/mods/ITEMS/mcl_throwing/init.lua +++ b/mods/ITEMS/mcl_throwing/init.lua @@ -2,6 +2,7 @@ mcl_throwing = {} local S = minetest.get_translator("mcl_throwing") local mod_death_messages = minetest.get_modpath("mcl_death_messages") +local mod_fishing = minetest.get_modpath("mcl_fishing") -- -- Snowballs and other throwable items @@ -10,12 +11,14 @@ local mod_death_messages = minetest.get_modpath("mcl_death_messages") local GRAVITY = tonumber(minetest.settings:get("movement_gravity")) local entity_mapping = { + ["mcl_throwing:flying_bobber"] = "mcl_throwing:flying_bobber_entity", ["mcl_throwing:snowball"] = "mcl_throwing:snowball_entity", ["mcl_throwing:egg"] = "mcl_throwing:egg_entity", ["mcl_throwing:ender_pearl"] = "mcl_throwing:ender_pearl_entity", } local velocities = { + ["mcl_throwing:flying_bobber_entity"] = 5, ["mcl_throwing:snowball_entity"] = 22, ["mcl_throwing:egg_entity"] = 22, ["mcl_throwing:ender_pearl_entity"] = 22, @@ -117,6 +120,22 @@ local pearl_ENTITY={ _thrower = nil, -- Player ObjectRef of the player who threw the ender pearl } +local flying_bobber_ENTITY={ + physical = false, + timer=0, + textures = {"mcl_fishing_bobber.png"}, --FIXME: Replace with correct texture. + visual_size = {x=0.5, y=0.5}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + + get_staticdata = get_staticdata, + on_activate = on_activate, + + _lastpos={}, + _thrower = nil, + objtype="fishing", +} + -- Snowball on_step()--> called when snowball is moving. local snowball_on_step = function(self, dtime) self.timer=self.timer+dtime @@ -284,13 +303,39 @@ local pearl_on_step = function(self, dtime) self._lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set lastpos-->Node will be added at last pos outside the node end +-- Movement function of flying bobber +local flying_bobber_on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:get_pos() + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + --local player = minetest.get_player_by_name(self._thrower) + + -- Destroy when hitting a solid node + if self._lastpos.x~=nil then + if (def and (def.walkable or def.liquidtype == "flowing" or def.liquidtype == "source")) or not def then + local make_child= function(object) + local ent = object:get_luaentity() + ent.player = self._thrower + ent.child = true + end + make_child(minetest.add_entity(self._lastpos, "mcl_fishing:bobber_entity")) + self.object:remove() + return + end + end + self._lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set lastpos-->Node will be added at last pos outside the node +end + snowball_ENTITY.on_step = snowball_on_step egg_ENTITY.on_step = egg_on_step pearl_ENTITY.on_step = pearl_on_step +flying_bobber_ENTITY.on_step = flying_bobber_on_step minetest.register_entity("mcl_throwing:snowball_entity", snowball_ENTITY) minetest.register_entity("mcl_throwing:egg_entity", egg_ENTITY) minetest.register_entity("mcl_throwing:ender_pearl_entity", pearl_ENTITY) +minetest.register_entity("mcl_throwing:flying_bobber_entity", flying_bobber_ENTITY) local how_to_throw = S("Use the punch key to throw.") From 3da1c551a1d9c3515914d56771051503b2a70ea7 Mon Sep 17 00:00:00 2001 From: Rootyjr <41842051+Rootyjr@users.noreply.github.com> Date: Tue, 30 Jul 2019 22:24:27 -0500 Subject: [PATCH 293/379] Remove WIP and update descriptions. --- mods/ITEMS/mcl_fishing/depends.txt | 1 + mods/ITEMS/mcl_fishing/locale/template.txt | 2 +- mods/ITEMS/mcl_mobitems/init.lua | 3 --- mods/ITEMS/mcl_throwing/depends.txt | 1 + mods/MISC/mcl_wip/init.lua | 1 - 5 files changed, 3 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_fishing/depends.txt b/mods/ITEMS/mcl_fishing/depends.txt index 93ef0bf52..1fd904fe1 100644 --- a/mods/ITEMS/mcl_fishing/depends.txt +++ b/mods/ITEMS/mcl_fishing/depends.txt @@ -2,3 +2,4 @@ mcl_core mcl_sounds mcl_loot mcl_mobs +mcl_throwing diff --git a/mods/ITEMS/mcl_fishing/locale/template.txt b/mods/ITEMS/mcl_fishing/locale/template.txt index c958e0b40..d2bac9807 100644 --- a/mods/ITEMS/mcl_fishing/locale/template.txt +++ b/mods/ITEMS/mcl_fishing/locale/template.txt @@ -1,7 +1,7 @@ # textdomain: mcl_fishing Fishing Rod= Fishing rods can be used to catch fish.= -Rightclick a water source to try to go fishing. Who knows what you're going to catch?= +Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?= Raw Fish= Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.= Cooked Fish= diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index f25043116..8a670766a 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -359,8 +359,6 @@ minetest.register_craft({ }, }) ---[[ -TODO: Re-enable this when fishing rod is available again minetest.register_craft({ output = "mcl_mobitems:carrot_on_a_stick", recipe = { @@ -376,7 +374,6 @@ minetest.register_craft({ { "mcl_farming:carrot_item", "" }, }, }) -]] minetest.register_craft({ type = "shapeless", diff --git a/mods/ITEMS/mcl_throwing/depends.txt b/mods/ITEMS/mcl_throwing/depends.txt index faf0d2d4f..2787220ee 100644 --- a/mods/ITEMS/mcl_throwing/depends.txt +++ b/mods/ITEMS/mcl_throwing/depends.txt @@ -1,3 +1,4 @@ mcl_core? mcl_mobitems? doc? +mcl_fishing diff --git a/mods/MISC/mcl_wip/init.lua b/mods/MISC/mcl_wip/init.lua index 0b042e212..4f8f0a562 100644 --- a/mods/MISC/mcl_wip/init.lua +++ b/mods/MISC/mcl_wip/init.lua @@ -3,7 +3,6 @@ local S = minetest.get_translator("mcl_wip") local wip_items = { - "mcl_fishing:fishing_rod", "mcl_maps:empty_map", "mcl_comparators:comparator_off_comp", "mcl_minecarts:hopper_minecart", From c50958a6407555471d2c8030fd64dfac4d004dc0 Mon Sep 17 00:00:00 2001 From: Rootyjr <41842051+Rootyjr@users.noreply.github.com> Date: Tue, 30 Jul 2019 22:39:07 -0500 Subject: [PATCH 294/379] Fix fishing depends.txt --- mods/ITEMS/mcl_fishing/depends.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/ITEMS/mcl_fishing/depends.txt b/mods/ITEMS/mcl_fishing/depends.txt index 1fd904fe1..93ef0bf52 100644 --- a/mods/ITEMS/mcl_fishing/depends.txt +++ b/mods/ITEMS/mcl_fishing/depends.txt @@ -2,4 +2,3 @@ mcl_core mcl_sounds mcl_loot mcl_mobs -mcl_throwing From 48b73f5f2e11c73be39655c79fd7667a138bf65c Mon Sep 17 00:00:00 2001 From: Rootyjr <41842051+Rootyjr@users.noreply.github.com> Date: Tue, 30 Jul 2019 22:47:40 -0500 Subject: [PATCH 295/379] Add self-credit. --- mods/ITEMS/mcl_fishing/init.lua | 85 +-------------------------------- 1 file changed, 2 insertions(+), 83 deletions(-) diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index 0d34779d4..65c2590e9 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -1,3 +1,5 @@ +--Fishing Rod, Bobber, and Flying Bobber mechanics and Bobber artwork by Rootyjr. + local S = minetest.get_translator("mcl_fishing") local mod_throwing = minetest.get_modpath("mcl_throwing") @@ -5,89 +7,6 @@ local entity_mapping = { ["mcl_fishing:bobber"] = "mcl_fishing:bobber_entity", } -local go_fishing = function(itemstack, user, pointed_thing) - if pointed_thing and pointed_thing.under then - -- Use pointed node's on_rightclick function first, if present - local node = minetest.get_node(pointed_thing.under) - if user and not user: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, user, itemstack) or itemstack - end - end - - if string.find(node.name, "mcl_core:water") then - local itemname - local itemcount = 1 - local itemwear = 0 - -- FIXME: Maybe use a better seeding - local pr = PseudoRandom(os.time() * math.random(1, 100)) - local r = pr:next(1, 100) - if r <= 85 then - -- Fish - items = mcl_loot.get_loot({ - items = { - { itemstring = "mcl_fishing:fish_raw", weight = 60 }, - { itemstring = "mcl_fishing:salmon_raw", weight = 25 }, - { itemstring = "mcl_fishing:clownfish_raw", weight = 2 }, - { itemstring = "mcl_fishing:pufferfish_raw", weight = 13 }, - } - }, pr) - elseif r <= 95 then - -- Junk - items = mcl_loot.get_loot({ - items = { - { itemstring = "mcl_core:bowl", weight = 10 }, - { itemstring = "mcl_fishing:fishing_rod", weight = 2, wear_min = 6554, wear_max = 65535 }, -- 10%-100% damage - { itemstring = "mcl_mobitems:leather", weight = 10 }, - { itemstring = "3d_armor:boots_leather", weight = 10, wear_min = 6554, wear_max = 65535 }, -- 10%-100% damage - { itemstring = "mcl_mobitems:rotten_flesh", weight = 10 }, - { itemstring = "mcl_core:stick", weight = 5 }, - { itemstring = "mcl_mobitems:string", weight = 5 }, - { itemstring = "mcl_potions:potion_water", weight = 10 }, - { itemstring = "mcl_mobitems:bone", weight = 10 }, - { itemstring = "mcl_dye:black", weight = 1, amount_min = 10, amount_max = 10 }, - { itemstring = "mcl_mobitems:string", weight = 10 }, -- TODO: Tripwire Hook - } - }, pr) - else - -- Treasure - items = mcl_loot.get_loot({ - items = { - -- TODO: Enchanted Bow - { itemstring = "mcl_bows:bow", wear_min = 49144, wear_max = 65535 }, -- 75%-100% damage - -- TODO: Enchanted Book - { itemstring = "mcl_books:book" }, - -- TODO: Enchanted Fishing Rod - { itemstring = "mcl_fishing:fishing_rod", wear_min = 49144, wear_max = 65535 }, -- 75%-100% damage - { itemstring = "mcl_mobs:nametag", }, - { itemstring = "mcl_mobitems:saddle", }, - { itemstring = "mcl_flowers:waterlily", }, - } - }, pr) - end - local item - if #items >= 1 then - item = ItemStack(items[1]) - else - item = ItemStack() - end - local inv = user:get_inventory() - if inv:room_for_item("main", item) then - inv:add_item("main", item) - end - if not minetest.settings:get_bool("creative_mode") then - local idef = itemstack:get_definition() - itemstack:add_wear(65535/65) -- 65 uses - if itemstack:get_count() == 0 and idef.sound and idef.sound.breaks then - minetest.sound_play(idef.sound.breaks, {pos=pointed_thing.above, gain=0.5}) - end - end - return itemstack - end - end - return nil -end - local bobber_ENTITY={ physical = false, timer=0, From 37af2dbba1b89945bce2ca51b923c65784924141 Mon Sep 17 00:00:00 2001 From: Rootyjr <41842051+Rootyjr@users.noreply.github.com> Date: Wed, 31 Jul 2019 22:34:53 -0500 Subject: [PATCH 296/379] Fix fishing allowed in lava. --- mods/ITEMS/mcl_fishing/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index 65c2590e9..6b5554f16 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -15,8 +15,8 @@ local bobber_ENTITY={ collisionbox = {0.45,0.45,0.45,0.45,0.45,0.45}, pointable = false, - get_staticdata = get_staticdata, - on_activate = on_activate, + --get_staticdata = get_staticdata, + --on_activate = on_activate, _lastpos={}, _dive = false, @@ -191,7 +191,7 @@ local bobber_on_step = function(self, dtime) end --if in liquid then bob. - if def.liquidtype == "source" then + if def.liquidtype == "source" and def.name == "mcl_core:water" then if self._oldy == nil then self.object:set_pos({x=self.object:get_pos().x,y=math.floor(self.object:get_pos().y)+.5,z=self.object:get_pos().z}) self._oldy = self.object:get_pos().y From 58d9fb874d96c1d0be599cf27f61324634189dc2 Mon Sep 17 00:00:00 2001 From: Rootyjr <41842051+Rootyjr@users.noreply.github.com> Date: Thu, 1 Aug 2019 01:18:53 -0500 Subject: [PATCH 297/379] Mobs now flash red when hurt. --- mods/ENTITIES/mcl_mobs/api.lua | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index b7a8e22f3..fc1288859 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -453,8 +453,14 @@ local check_for_death = function(self, cause, cmi_cause) self.health = self.hp_max end - -- play damage sound if health was reduced + -- play damage sound if health was reduced and make mob flash red. if damaged then + self.object:set_texture_mod("^[colorize:#FF000040") + minetest.after(.2, function() + if self then + self.object:set_texture_mod("") + end + end) mob_sound(self, self.sounds.damage) end From d11b089baca4005f8ff3941c2d00e257d43a4b68 Mon Sep 17 00:00:00 2001 From: Rootyjr <41842051+Rootyjr@users.noreply.github.com> Date: Fri, 2 Aug 2019 14:38:00 -0500 Subject: [PATCH 298/379] Split search distance in half. --- mods/ITEMS/mcl_fishing/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index 6b5554f16..c27012f34 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -30,7 +30,7 @@ local bobber_ENTITY={ local fish = function(itemstack, player) local pos = player:get_pos() - local objs = minetest.get_objects_inside_radius(pos, 250) + local objs = minetest.get_objects_inside_radius(pos, 125) local num = 0 local ent = nil local noent = true From a765d3dd4f37b74d4a3619384e8f5ada3870b27c Mon Sep 17 00:00:00 2001 From: Rootyjr <41842051+Rootyjr@users.noreply.github.com> Date: Sat, 3 Aug 2019 21:34:33 -0500 Subject: [PATCH 299/379] Update init.lua --- mods/ITEMS/mcl_fishing/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index c27012f34..c5e351e49 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -191,7 +191,7 @@ local bobber_on_step = function(self, dtime) end --if in liquid then bob. - if def.liquidtype == "source" and def.name == "mcl_core:water" then + if def.liquidtype == "source" and def.name == "mcl_core:water_source" then if self._oldy == nil then self.object:set_pos({x=self.object:get_pos().x,y=math.floor(self.object:get_pos().y)+.5,z=self.object:get_pos().z}) self._oldy = self.object:get_pos().y From 248a6357498471878236aea07b6e9dc4427cb4f0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 15 Aug 2019 02:45:35 +0200 Subject: [PATCH 300/379] =?UTF-8?q?Fix=20typo:=20daredevils=20=E2=86=92=20?= =?UTF-8?q?davedevils?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f3c3b8980..6c2e2a598 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # MineClone 2 -An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. +An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. Version: 0.53.3 @@ -198,7 +198,7 @@ There are so many people to list (sorry). Check out the respective mod directori ### Coding * [Wuzzy](https://forum.minetest.net/memberlist.php?mode=viewprofile&u=3082): Main programmer of most mods -* daredevils: Creator of MineClone on which MineClone 2 is based on +* davedevils: Creator of MineClone on which MineClone 2 is based on * [ex-bart](https://github.com/ex-bart): Redstone comparators * Lots of other people: TO BE WRITTEN (see mod directories for details) @@ -219,7 +219,7 @@ Various sources. See the respective mod directories for details. ### Special thanks -* daredevils for starting MineClone, the original version of this game +* davedevils for starting MineClone, the original version of this game * celeron55 for creating Minetest * Minetest's modding community for providing a huge selection of mods, some of which ended up in MineClone 2 * Jordach for the jukebox music compilation from Big Freaking Dig @@ -242,10 +242,10 @@ Here's the detailed legalese for those who need it: ### License of source code MineClone 2 is a clean-room implementation of Minecraft and licensed under the -GNU LGPL v2.1 (Wuzzy, daredevils and countless others) (see `LICENSE.txt`). +GNU LGPL v2.1 (Wuzzy, davedevils and countless others) (see `LICENSE.txt`). MineClone 2 is a direct continuation of the discontinued MineClone -project by daredevils which fell under the same license. +project by davedevils which fell under the same license. Mods credit: See `README.txt` or `README.md` in each mod directory for information about other authors. From ce7015bb35d1941eb359bb157509f98de700638e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 27 Aug 2019 03:34:13 +0200 Subject: [PATCH 301/379] Remove TNT sounds --- mods/ITEMS/mcl_tnt/sounds/tnt_explode.ogg | Bin 12808 -> 0 bytes mods/ITEMS/mcl_tnt/sounds/tnt_ignite.ogg | Bin 29271 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mods/ITEMS/mcl_tnt/sounds/tnt_explode.ogg delete mode 100644 mods/ITEMS/mcl_tnt/sounds/tnt_ignite.ogg diff --git a/mods/ITEMS/mcl_tnt/sounds/tnt_explode.ogg b/mods/ITEMS/mcl_tnt/sounds/tnt_explode.ogg deleted file mode 100644 index a414ea046bf76298f6f1406d574f15741c515248..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12808 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 Date: Tue, 27 Aug 2019 05:26:46 +0200 Subject: [PATCH 302/379] Add new sounds for mcl_tnt mod --- mods/ITEMS/mcl_tnt/README.txt | 22 +++++----------------- mods/ITEMS/mcl_tnt/sounds/tnt_explode.ogg | Bin 0 -> 48361 bytes mods/ITEMS/mcl_tnt/sounds/tnt_ignite.ogg | Bin 0 -> 92125 bytes 3 files changed, 5 insertions(+), 17 deletions(-) create mode 100644 mods/ITEMS/mcl_tnt/sounds/tnt_explode.ogg create mode 100644 mods/ITEMS/mcl_tnt/sounds/tnt_ignite.ogg diff --git a/mods/ITEMS/mcl_tnt/README.txt b/mods/ITEMS/mcl_tnt/README.txt index 14c73e079..5b1c10798 100644 --- a/mods/ITEMS/mcl_tnt/README.txt +++ b/mods/ITEMS/mcl_tnt/README.txt @@ -10,22 +10,10 @@ There are different ways to blow up TNT: 2. Activate it with redstone circuits Be aware of the damage radius! -License: -WTFPL (see below) +License of mod code and media: +MIT License -See also: -http://minetest.net/ +Sound credits: - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - Version 2, December 2004 - - Copyright (C) 2004 Sam Hocevar - - Everyone is permitted to copy and distribute verbatim or modified - copies of this license document, and changing it is allowed as long - as the name is changed. - - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. You just DO WHAT THE FUCK YOU WANT TO. +* tnt_explode.ogg: Jose Ortiz 'MindChamber' (CC0) +* tnt_ignite.ogg: Own derivate work of sound by Ned Bouhalassa (CC0) created in 2005, source: diff --git a/mods/ITEMS/mcl_tnt/sounds/tnt_explode.ogg b/mods/ITEMS/mcl_tnt/sounds/tnt_explode.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1691a41bc02ec629d24d4b883a7ce797b7ceccde GIT binary patch literal 48361 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 literal 0 HcmV?d00001 From 1e354f63c0ce46c58de9be4aa74b06598790a0b5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 9 Dec 2019 12:17:51 +0100 Subject: [PATCH 378/379] Add chick sounds --- mods/ENTITIES/mcl_mobs/api.lua | 37 ++++++++++++------ mods/ENTITIES/mcl_mobs/api.txt | 2 + mods/ENTITIES/mobs_mc/LICENSE-media.md | 3 ++ mods/ENTITIES/mobs_mc/chicken.lua | 6 +++ .../mobs_mc/sounds/mobs_mc_chicken_child.ogg | Bin 0 -> 9978 bytes 5 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_child.ogg diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index b9b67078d..fb823270a 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -96,19 +96,29 @@ local mod_mobspawners = minetest.get_modpath("mcl_mobspawners") ~= nil local mod_hunger = minetest.get_modpath("mcl_hunger") ~= nil -- play sound -local mob_sound = function(self, sound, is_opinion, fixed_pitch) +local mob_sound = function(self, soundname, is_opinion, fixed_pitch) + local soundinfo + if self.sounds_child and self.child then + soundinfo = self.sounds_child + elseif self.sounds then + soundinfo = self.sounds + end + if not soundinfo then + return + end + local sound = soundinfo[soundname] if sound then if is_opinion and self.opinion_sound_cooloff > 0 then return end local pitch if not fixed_pitch then - local base_pitch = self.sounds.base_pitch + local base_pitch = soundinfo.base_pitch if not base_pitch then base_pitch = 1 end - if self.child then + if self.child and (not self.sounds_child) then -- Children have higher pitch pitch = base_pitch * 1.5 else @@ -140,7 +150,7 @@ local do_attack = function(self, player) -- TODO: Implement war_cry sound without being annoying --if random(0, 100) < 90 then - --mob_sound(self, self.sounds.war_cry, true) + --mob_sound(self, "war_cry", true) --end end @@ -512,7 +522,7 @@ local check_for_death = function(self, cause, cmi_cause) remove_texture_mod(self, "^[colorize:#FF000040") end end, self) - mob_sound(self, self.sounds.damage) + mob_sound(self, "damage") end -- backup nametag so we can show health stats @@ -539,7 +549,7 @@ local check_for_death = function(self, cause, cmi_cause) item_drop(self, nil) end - mob_sound(self, self.sounds.death) + mob_sound(self, "death") local pos = self.object:get_pos() @@ -928,7 +938,7 @@ local do_jump = function(self) end, self, v) if self.jump_sound_cooloff <= 0 then - mob_sound(self, self.sounds.jump) + mob_sound(self, "jump") self.jump_sound_cooloff = 0.5 end else @@ -1443,7 +1453,7 @@ local smart_mobs = function(self, s, p, dist, dtime) else -- yay i found path -- TODO: Implement war_cry sound without being annoying - --mob_sound(self, self.sounds.war_cry, true) + --mob_sound(self, "war_cry", true) set_velocity(self, self.walk_velocity) -- follow path now that it has it @@ -2058,7 +2068,7 @@ local do_states = function(self, dtime) self.v_start = true self.timer = 0 self.blinktimer = 0 - mob_sound(self, self.sounds.fuse, nil, false) + mob_sound(self, "fuse", nil, false) -- stop timer if out of reach or direct line of sight elseif self.allow_fuse_reset @@ -2290,7 +2300,7 @@ local do_states = function(self, dtime) if line_of_sight(self, p2, s2) == true then -- play attack sound - mob_sound(self, self.sounds.attack) + mob_sound(self, "attack") -- punch player (or what player is attached to) local attached = self.attack:get_attach() @@ -2344,7 +2354,7 @@ local do_states = function(self, dtime) set_animation(self, "shoot") -- play shoot attack sound - mob_sound(self, self.sounds.shoot_attack) + mob_sound(self, "shoot_attack") local p = self.object:get_pos() @@ -3017,7 +3027,7 @@ local mob_step = function(self, dtime) -- mob plays random sound at times if random(1, 100) == 1 then - mob_sound(self, self.sounds.random, true) + mob_sound(self, "random", true) end -- environmental damage timer (every 1 second) @@ -3228,6 +3238,7 @@ minetest.register_entity(name, { child = def.child or false, texture_mods = {}, shoot_arrow = def.shoot_arrow, + sounds_child = def.sounds_child, -- End of MCL2 extensions on_spawn = def.on_spawn, @@ -3857,7 +3868,7 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) end -- make sound when fed so many times - mob_sound(self, self.sounds.random, true) + mob_sound(self, "random", true) end return true diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 0430bbc00..96ae363b4 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -229,6 +229,8 @@ functions needed for the mob to work properly which contains the following: 'shoot_arrow(self, pos, dir)' function that is called when mob wants to shoot an arrow. You can spawn your own arrow here. pos is mob position, dir is mob's aiming direction + 'sounds_child' same as sounds, but for childs. If not defined, childs will use same + sound as adults but with higher pitch Node Replacement diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index 7cad2241c..696150480 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -81,6 +81,9 @@ Origin of those models: * PilzAdam and Wuzzy (CC0) * `mobs_mc_chicken_lay_egg.ogg` +* [AGFX](http://www.freesound.org/people/DrMinky/sounds/) (CC0) + * `mobs_mc_chicken_child.ogg` + * Source: * Randomation (CC0) * `green_slime_damage.ogg` * `green_slime_attack.ogg` diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua index c6ce85507..e5c9ba80b 100644 --- a/mods/ENTITIES/mobs_mc/chicken.lua +++ b/mods/ENTITIES/mobs_mc/chicken.lua @@ -42,6 +42,12 @@ mobs:register_mob("mobs_mc:chicken", { -- TODO: death, damage distance = 16, }, + sounds_child = { + random = "mobs_mc_chicken_child", + damage = "mobs_mc_chicken_child", + death = "mobs_mc_chicken_child", + distance = 16, + }, animation = { stand_speed = 25, walk_speed = 25, run_speed = 50, stand_start = 0, stand_end = 0, diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_child.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_child.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5ea33fc0781f1cd52b3b6427b0e75fc3f8d925ff GIT binary patch literal 9978 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 Date: Mon, 9 Dec 2019 12:35:24 +0100 Subject: [PATCH 379/379] Tweak parrot colors --- .../mobs_mc/textures/mobs_mc_parrot_blue.png | Bin 312 -> 573 bytes .../mobs_mc/textures/mobs_mc_parrot_green.png | Bin 306 -> 547 bytes .../textures/mobs_mc_parrot_red_blue.png | Bin 312 -> 561 bytes .../textures/mobs_mc_parrot_yellow_blue.png | Bin 302 -> 558 bytes .../textures/mobs_mc_spawn_icon_parrot.png | Bin 444 -> 440 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_blue.png index b21c4f25fe35fdec303a46cbbf2012ae6b514ebf..9181de260592c11756a7010a2ba676598fc0082a 100644 GIT binary patch delta 560 zcmV-00?+-p0=)!~7=H)`0001UdV2H#000JJOGiWi;{g8v<@nDeY5)KL32;bRa{vGf z6951U69E94oEQKA00(qQO+^Re3<(P%1r%IwiU0rs%1J~)R9M69R!vI+Q4~FI6tNlx zgQ$!|m`!9ZB4`o*f)-l)XxXM;(8@)$XwwfUH*MM%F8T#w5PwOFK4>F|(ufd>7@0P{ z7BSN}~BCxPejehQKhd7DjMjs(BC3KQwQ1=CvU1X+k?nBfSB=F z!C7`YHCR*7Y;y@1gR^YA$t6*MBnn&-Lc5yVQH7UWDK?-K8(b1@Ud=mE;^Hi9X|fyq zbsQZZ&|g79n-TI-f=1SE>FUNkwKWHNeL_3%bm0I1 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_green.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_green.png index 448444e34c4f2ccd3304922a8cf3e0819dc83fd2..152acb8f412765da7c8c9ed9ed82984bc27801be 100644 GIT binary patch delta 534 zcmV+x0_pv-0;2?w7=H)`0001UdV2H#000JJOGiWi;{g8v<@nDeY5)KL32;bRa{vGf z6951U69E94oEQKA00(qQO+^Re3<(P$9)}{ACjbBeut`KgR9M69R?AAmKomU_9aF@G ziz-x*V!(y#c2N+i_#bZc2L#cbD|bqNKu`pKK>UMJ3KiOQ7k@&a6dJ1A5FJA^E^1;D zGfbL3#h%rjgxq`Xxi^O)NQg{*hx^Y)zDbhgS;QEjwR0ZH{89lc$}#}pZta=~3HUz( z0DZGThAj>N_0L-1ott-T3hb(T0Dvm1c(MPiqY+dLqszR zBk3-T99b>Hvs#ABp2Y=;v%xNU#ZKVd(hU+W+|mu=&mmK8puZr!z8WSlw4y=+j4`OH z8hF;I{a!@3OV delta 291 zcmV+;0o?wh1hN8<7=Hu<0001iRAzG~Ylpi7) zmE*3kA__A&DI45pnxKst$X*nqOsi;Y`Jf`6s0?Vi9R$}AX|%CG$A z4HkJ0OGC!G!Gv4_Cnks!2cR79%#+T058yaH2=#2cy2biw1?&g>WMmnJ5WqE@-mh(l zETEP^GLmUHAE=@RnM1``rG=B*y3in<%pvLo*!lCd-!A_80M-GM!ZkMZmmWsCe|O*l psvxES4==j;XB^Q5?l90C0055DBDepd5^Mkf002ovPDHLkV1nH_en$WR diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_red_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_red_blue.png index 03eefc74f5e429ce6c3dd09aaa80f621ea7ae7bf..2f14ef1a59f808e04ec61cafa3863cdec4b5d248 100644 GIT binary patch delta 548 zcmV+<0^9w#0;7=H)`0001UdV2H#000JJOGiWi;{g8v<@nDeY5)KL32;bRa{vGf z6951U69E94oEQKA00(qQO+^Re3<(P%9-cX-W&i*IzDYzuR9M69R=-ceKp1^Tt1(y- z2V=rS=u$T0>Y|Bm3_9q*;y>UHiT?pjOk8wuGA<4-E^G`ArhjoU1Q&6EFhSf*u^|CG z2WitDJ+4#%fAE%m-zEL--Fx4CIf9V5QKQtI?^Z1mrjCp;!q60lWOnNjvXTG*-0G4; zmJIs|0M?&dB#Z)V9Ts-ou_>@xX#oJrDaDCBIbkd?G=*k5F_em@004dC5La`ibCQ?N z`$#>J&Y1v!LVra_z(dAoa~vj+p0Uhv+>=T zN(Kl7@oefysBxN5<5aX36hw4=+{kodp1fXd5O(8wwL#o9M9PhH3zk=wSOQ;GluN*( z1X1D@;^F>j;57D$!$R1EenfcEhH2!8h#|YVMM>a60GZr@rIL#_<0^g718Exvx&CZ6q1ldo{yr$BC(rV@~-Rn!#KYGs)Guxwq=D>G9P>yz9QBEl+*VK)Mvu==)YHh1>gZ{x;89?|W)Yjj m)GVmAyB$a_$e3Y88$&XOR%V21w?z#zp?5(yOC=;`7ZQo-1AT3w9E zP^9&t``4R{&o5nk{BqVW6IuWJOhVmfjb7AyE9cId6~FiM)3z9=9m-sp6}q*|d<(i5 zr|(>I?o=vg;w#_f!K_zL%PrYmRvkC}(EN|vrp%ulFSR1)`E6armS2CxSUZ_s$}mi5 zkbK3?JIiE4D_hE8ol`b^;!-<~i!GTa@O0Vve+HX8-hG$f#lYVY5K!tM%2B}O5Xv@f s{|AOp0j1!E>HK&9RKH-#m(1W}$YfUDnzBk$66kyePgg&ebxsLQ0Q4kxQ2+n{ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_yellow_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_yellow_blue.png index 1979d9076c893357d8f1cf66c34fc749b70b38a5..f35adfd029f202acd5d7bd9cd37b5dd448c51fc5 100644 GIT binary patch delta 544 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 literal 0 HcmV?d00001 From f67c302c3d983bee21195c650fbac46e8567c2d3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 27 Aug 2019 05:35:26 +0200 Subject: [PATCH 303/379] Version 0.53.4 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6c2e2a598..50f08f4de 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.53.3 +Version: 0.53.4 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 1cbee9de18325a9e7c6208e96ec37d5dc096ed37 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 27 Aug 2019 13:08:54 +0200 Subject: [PATCH 304/379] Fix item entity force-out bias to positive dir --- mods/ENTITIES/mcl_item_entity/init.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index f44917ccf..362824494 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -543,8 +543,8 @@ core.register_entity(":__builtin:item", { -- Push item out when stuck inside solid opaque node if def and def.walkable and def.groups and def.groups.opaque == 1 then local shootdir - local cx = p.x % 1 - local cz = p.z % 1 + local cx = (p.x % 1) - 0.5 + local cz = (p.z % 1) - 0.5 local order = {} -- First prepare the order in which the 4 sides are to be checked. @@ -552,7 +552,7 @@ core.register_entity(":__builtin:item", { -- 2nd: other direction -- 3rd and 4th: other axis local cxcz = function(o, cw, one, zero) - if cw > 0 then + if cw < 0 then table.insert(o, { [one]=1, y=0, [zero]=0 }) table.insert(o, { [one]=-1, y=0, [zero]=0 }) else @@ -561,7 +561,7 @@ core.register_entity(":__builtin:item", { end return o end - if math.abs(cx) > math.abs(cz) then + if math.abs(cx) < math.abs(cz) then order = cxcz(order, cx, "x", "z") order = cxcz(order, cz, "z", "x") else From 2478d8817eeddb9d1fe9682b17f911bb67e0c433 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 27 Aug 2019 22:01:51 +0200 Subject: [PATCH 305/379] Apply pitch to arrows --- mods/ITEMS/mcl_bows/arrow.lua | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 0b41a282e..a4ecb7e0d 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -9,6 +9,12 @@ local GRAVITY = 9.81 local YAW_OFFSET = -math.pi/2 +local dir_to_pitch = function(dir) + local dir2 = vector.normalize(dir) + local xz = math.abs(dir.x) + math.abs(dir.z) + return -math.atan2(-dir.y, xz) +end + local mod_awards = minetest.get_modpath("awards") and minetest.get_modpath("mcl_achievements") local mod_button = minetest.get_modpath("mesecons_button") @@ -108,7 +114,7 @@ ARROW_ENTITY.on_step = function(self, dtime) return end -- Drop arrow as item when it is no longer stuck - -- FIXME: Arrows are a bit slot to react and continue to float in mid air for a few seconds. + -- FIXME: Arrows are a bit slow to react and continue to float in mid air for a few seconds. if self._stuckrechecktimer > STUCK_RECHECK_TIME then local stuckin_def if self._stuckin then @@ -290,7 +296,9 @@ ARROW_ENTITY.on_step = function(self, dtime) -- Update yaw if not self._stuck then local vel = self.object:get_velocity() - self.object:set_yaw(minetest.dir_to_yaw(vel)+YAW_OFFSET) + local yaw = minetest.dir_to_yaw(vel)+YAW_OFFSET + local pitch = dir_to_pitch(vel) + self.object:set_rotation({ x = 0, y = yaw, z = pitch }) end -- Update internal variable From c7d111219d84e6c0e5343934b86261d98961e15e Mon Sep 17 00:00:00 2001 From: Nicholas Niro Date: Fri, 30 Aug 2019 04:30:22 +0200 Subject: [PATCH 306/379] Make fence collisionbox larger --- mods/ITEMS/mcl_fences/init.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_fences/init.lua b/mods/ITEMS/mcl_fences/init.lua index c46997e7f..e40e7cf4d 100644 --- a/mods/ITEMS/mcl_fences/init.lua +++ b/mods/ITEMS/mcl_fences/init.lua @@ -14,11 +14,11 @@ local z2 = {-1/16, 4/16, 2/16, 1/16, 7/16, 0.5} --oben(quer) z local z22 = {-1/16, -2/16, 2/16, 1/16, 1/16, 0.5} --unten(quer) z -- Collision box -local cp = {-2/16, -0.5, -2/16, 2/16, 1.01, 2/16} -local cx1 = {-0.5, -2/16, -2/16, -2/16, 1.01, 2/16} --unten(quer) -x -local cx2 = {2/16, -2/16, -2/16, 0.5, 1.01, 2/16} --unten(quer) x -local cz1 = {-2/16, -2/16, -0.5, 2/16, 1.01, -2/16} --unten(quer) -z -local cz2 = {-2/16, -2/16, 2/16, 2/16, 1.01, 0.5} --unten(quer) z +local cp = {-0.5, -0.5, -0.5, 0.5, 1.01, 0.5} +local cx1 = {-0.5, -0.5, -0.5, -0.5, 1.01, 0.5} --unten(quer) -x +local cx2 = {0.5, -0.5, -0.5, 0.5, 1.01, 0.5} --unten(quer) x +local cz1 = {-0.5, -0.5, -0.5, 0.5, 1.01, -0.5} --unten(quer) -z +local cz2 = {-0.5, -0.5, 0.5, 0.5, 1.01, 0.5} --unten(quer) z mcl_fences = {} From 995024b47bc2c79b272cc6f2d8ab411fbef9a8de Mon Sep 17 00:00:00 2001 From: Nicholas Niro Date: Fri, 30 Aug 2019 04:31:14 +0200 Subject: [PATCH 307/379] Teach mobs not to jump if they'd hurt their head --- mods/ENTITIES/mcl_mobs/api.lua | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index b7a8e22f3..c5cacd923 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -781,6 +781,19 @@ local do_jump = function(self) z = pos.z + dir_z }) + -- this is used to detect if there's a block on top of the block in front of the mob. + -- If there is, there is no point in jumping as we won't manage. + local nodTop = node_ok({ + x = pos.x + dir_x, + y = pos.y + 1.5, + z = pos.z + dir_z + }) + + -- we don't attempt to jump if there's a stack of blocks blocking + if nodTop ~= nil then + return false + end + -- thin blocks that do not need to be jumped if nod.name == node_snow then return false From 2627742b365d9351b06bd8fa2af493bb88d47057 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 30 Aug 2019 04:43:25 +0200 Subject: [PATCH 308/379] Restore original fence collisionbox, but deeper --- mods/ITEMS/mcl_fences/init.lua | 10 +- mods/ITEMS/mcl_fences/init.lua.orig | 312 ++++++++++++++++++++++++++++ mods/ITEMS/mcl_fences/init.lua.rej | 19 ++ 3 files changed, 336 insertions(+), 5 deletions(-) create mode 100644 mods/ITEMS/mcl_fences/init.lua.orig create mode 100644 mods/ITEMS/mcl_fences/init.lua.rej diff --git a/mods/ITEMS/mcl_fences/init.lua b/mods/ITEMS/mcl_fences/init.lua index e40e7cf4d..bb2ca0fc6 100644 --- a/mods/ITEMS/mcl_fences/init.lua +++ b/mods/ITEMS/mcl_fences/init.lua @@ -14,11 +14,11 @@ local z2 = {-1/16, 4/16, 2/16, 1/16, 7/16, 0.5} --oben(quer) z local z22 = {-1/16, -2/16, 2/16, 1/16, 1/16, 0.5} --unten(quer) z -- Collision box -local cp = {-0.5, -0.5, -0.5, 0.5, 1.01, 0.5} -local cx1 = {-0.5, -0.5, -0.5, -0.5, 1.01, 0.5} --unten(quer) -x -local cx2 = {0.5, -0.5, -0.5, 0.5, 1.01, 0.5} --unten(quer) x -local cz1 = {-0.5, -0.5, -0.5, 0.5, 1.01, -0.5} --unten(quer) -z -local cz2 = {-0.5, -0.5, 0.5, 0.5, 1.01, 0.5} --unten(quer) z +local cp = {-2/16, -0.5, -2/16, 2/16, 1.01, 2/16} +local cx1 = {-0.5, -0.5, -2/16, -2/16, 1.01, 2/16} --unten(quer) -x +local cx2 = {2/16, -0.5, -2/16, 0.5, 1.01, 2/16} --unten(quer) x +local cz1 = {-2/16, -0.5, -0.5, 2/16, 1.01, -2/16} --unten(quer) -z +local cz2 = {-2/16, -0.5, 2/16, 2/16, 1.01, 0.5} --unten(quer) z mcl_fences = {} diff --git a/mods/ITEMS/mcl_fences/init.lua.orig b/mods/ITEMS/mcl_fences/init.lua.orig new file mode 100644 index 000000000..c46997e7f --- /dev/null +++ b/mods/ITEMS/mcl_fences/init.lua.orig @@ -0,0 +1,312 @@ +local init = os.clock() + +local S = minetest.get_translator("mcl_fences") + +-- Node box +local p = {-2/16, -0.5, -2/16, 2/16, 0.5, 2/16} +local x1 = {-0.5, 4/16, -1/16, -2/16, 7/16, 1/16} --oben(quer) -x +local x12 = {-0.5, -2/16, -1/16, -2/16, 1/16, 1/16} --unten(quer) -x +local x2 = {2/16, 4/16, -1/16, 0.5, 7/16, 1/16} --oben(quer) x +local x22 = {2/16, -2/16, -1/16, 0.5, 1/16, 1/16} --unten(quer) x +local z1 = {-1/16, 4/16, -0.5, 1/16, 7/16, -2/16} --oben(quer) -z +local z12 = {-1/16, -2/16, -0.5, 1/16, 1/16, -2/16} --unten(quer) -z +local z2 = {-1/16, 4/16, 2/16, 1/16, 7/16, 0.5} --oben(quer) z +local z22 = {-1/16, -2/16, 2/16, 1/16, 1/16, 0.5} --unten(quer) z + +-- Collision box +local cp = {-2/16, -0.5, -2/16, 2/16, 1.01, 2/16} +local cx1 = {-0.5, -2/16, -2/16, -2/16, 1.01, 2/16} --unten(quer) -x +local cx2 = {2/16, -2/16, -2/16, 0.5, 1.01, 2/16} --unten(quer) x +local cz1 = {-2/16, -2/16, -0.5, 2/16, 1.01, -2/16} --unten(quer) -z +local cz2 = {-2/16, -2/16, 2/16, 2/16, 1.01, 0.5} --unten(quer) z + +mcl_fences = {} + +mcl_fences.register_fence = function(id, fence_name, texture, groups, hardness, blast_resistance, connects_to, sounds) + local cgroups = table.copy(groups) + if cgroups == nil then cgroups = {} end + cgroups.fence = 1 + cgroups.deco_block = 1 + if connects_to == nil then + connects_to = {} + else + connects_to = table.copy(connects_to) + end + local fence_id = minetest.get_current_modname()..":"..id + table.insert(connects_to, "group:solid") + table.insert(connects_to, "group:fence_gate") + table.insert(connects_to, fence_id) + minetest.register_node(fence_id, { + description = fence_name, + _doc_items_longdesc = S("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."), + tiles = {texture}, + inventory_image = "mcl_fences_fence_mask.png^" .. texture .. "^mcl_fences_fence_mask.png^[makealpha:255,126,126", + wield_image = "mcl_fences_fence_mask.png^" .. texture .. "^mcl_fences_fence_mask.png^[makealpha:255,126,126", + paramtype = "light", + is_ground_content = false, + groups = cgroups, + stack_max = 64, + sunlight_propagates = true, + drawtype = "nodebox", + connect_sides = { "front", "back", "left", "right" }, + connects_to = connects_to, + node_box = { + type = "connected", + fixed = {p}, + connect_front = {z1,z12}, + connect_back = {z2,z22,}, + connect_left = {x1,x12}, + connect_right = {x2,x22}, + }, + collision_box = { + type = "connected", + fixed = {cp}, + connect_front = {cz1}, + connect_back = {cz2,}, + connect_left = {cx1}, + connect_right = {cx2}, + }, + sounds = sounds, + _mcl_blast_resistance = blast_resistance, + _mcl_hardness = hardness, + }) + + return fence_id +end + +mcl_fences.register_fence_gate = function(id, fence_gate_name, texture, groups, hardness, blast_resistance, sounds, sound_open, sound_close, sound_gain_open, sound_gain_close) + local meta2 + local state2 = 0 + + local function update_gate(pos, node) + minetest.set_node(pos, node) + end + + local gate_id = minetest.get_current_modname()..":"..id.."_gate" + local open_gate_id = gate_id .. "_open" + if not sound_open then + sound_open = "doors_fencegate_open" + end + if not sound_close then + sound_close = "doors_fencegate_close" + end + if not sound_gain_open then + sound_gain_open = 0.3 + end + if not sound_gain_close then + sound_gain_close = 0.3 + end + local function punch_gate(pos, node) + meta2 = minetest.get_meta(pos) + state2 = meta2:get_int("state") + local tmp_node2 + if state2 == 1 then + state2 = 0 + minetest.sound_play(sound_close, {gain = sound_gain_close, max_hear_distance = 10, pos = pos}) + tmp_node2 = {name=gate_id, param1=node.param1, param2=node.param2} + else + state2 = 1 + minetest.sound_play(sound_open, {gain = sound_gain_open, max_hear_distance = 10, pos = pos}) + tmp_node2 = {name=open_gate_id, param1=node.param1, param2=node.param2} + end + update_gate(pos, tmp_node2) + meta2:set_int("state", state2) + end + + local on_rotate + if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.rotate_simple + end + + local cgroups = table.copy(groups) + if cgroups == nil then cgroups = {} end + cgroups.fence_gate = 1 + cgroups.deco_block = 1 + + cgroups.mesecon_ignore_opaque_dig = 1 + cgroups.mesecon_effector_on = 1 + cgroups.fence_gate = 1 + minetest.register_node(open_gate_id, { + tiles = {texture}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + sunlight_propagates = true, + walkable = false, + groups = cgroups, + drop = gate_id, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -3/16, -1/16, -6/16, 0.5, 1/16}, --links abschluss + {6/16, -3/16, -1/16, 0.5, 0.5, 1/16}, --rechts abschluss + {-0.5, 4/16, 1/16, -6/16, 7/16, 6/16}, --oben-links(quer) x + {-0.5, -2/16, 1/16, -6/16, 1/16, 6/16}, --unten-links(quer) x + {6/16, 4/16, 1/16, 0.5, 7/16, 0.5}, --oben-rechts(quer) x + {6/16, -2/16, 1/16, 0.5, 1/16, 0.5}, --unten-rechts(quer) x + {-0.5, -2/16, 6/16, -6/16, 7/16, 0.5}, --mitte links + {6/16, 1/16, 0.5, 0.5, 4/16, 6/16}, --mitte rechts + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -3/16, -1/16, 0.5, 0.5, 1/16}, --gate + } + }, + on_rightclick = function(pos, node, clicker) + punch_gate(pos, node) + end, + mesecons = {effector = { + action_off = (function(pos, node) + punch_gate(pos, node) + end), + }}, + on_rotate = on_rotate, + sounds = sounds, + _mcl_blast_resistance = blast_resistance, + _mcl_hardness = hardness, + }) + + local cgroups_closed = table.copy(cgroups) + cgroups_closed.mesecon_effector_on = nil + cgroups_closed.mesecon_effector_off = nil + minetest.register_node(gate_id, { + description = fence_gate_name, + _doc_items_longdesc = S("Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates."), + _doc_items_usagehelp = S("Right-click the fence gate to open or close it."), + tiles = {texture}, + inventory_image = "mcl_fences_fence_gate_mask.png^" .. texture .. "^mcl_fences_fence_gate_mask.png^[makealpha:255,126,126", + wield_image = "mcl_fences_fence_gate_mask.png^" .. texture .. "^mcl_fences_fence_gate_mask.png^[makealpha:255,126,126", + paramtype = "light", + is_ground_content = false, + stack_max = 64, + paramtype2 = "facedir", + sunlight_propagates = true, + walkable = true, + groups = cgroups_closed, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -3/16, -1/16, -6/16, 0.5, 1/16}, --links abschluss + {6/16, -3/16, -1/16, 0.5, 0.5, 1/16}, --rechts abschluss + {-2/16, -2/16, -1/16, 0, 7/16, 1/16}, --mitte links + {0, -2/16, -1/16, 2/16, 7/16, 1/16}, --mitte rechts + {-0.5, 4/16, -1/16, -2/16, 7/16, 1/16}, --oben(quer) -z + {-0.5, -2/16, -1/16, -2/16, 1/16, 1/16}, --unten(quer) -z + {2/16, 4/16, -1/16, 0.5, 7/16, 1/16}, --oben(quer) z + {2/16, -2/16, -1/16, 0.5, 1/16, 1/16}, --unten(quer) z + } + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -3/16, -2/16, 0.5, 1, 2/16}, --gate + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -3/16, -1/16, 0.5, 0.5, 1/16}, --gate + } + }, + on_construct = function(pos) + meta2 = minetest.get_meta(pos) + meta2:set_int("state", 0) + state2 = 0 + end, + mesecons = {effector = { + action_on = (function(pos, node) + punch_gate(pos, node) + end), + }}, + on_rotate = on_rotate, + on_rightclick = function(pos, node, clicker) + punch_gate(pos, node) + end, + sounds = sounds, + _mcl_blast_resistance = blast_resistance, + _mcl_hardness = hardness, + }) + + if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", gate_id, "nodes", open_gate_id) + end + + return gate_id, open_gate_id +end + +mcl_fences.register_fence_and_fence_gate = function(id, fence_name, fence_gate_name, texture_fence, groups, hardness, blast_resistance, connects_to, sounds, sound_open, sound_close, sound_gain_open, sound_gain_close, texture_fence_gate) + if texture_fence_gate == nil then + texture_fence_gate = texture_fence + end + local fence_id = mcl_fences.register_fence(id, fence_name, texture_fence, groups, hardness, blast_resistance, connects_to, sounds) + local gate_id, open_gate_id = mcl_fences.register_fence_gate(id, fence_gate_name, texture_fence_gate, groups, hardness, blast_resistance, sounds, sound_open, sound_close, sound_gain_open, sound_gain_close) + return fence_id, gate_id, open_gate_id +end + +local wood_groups = {handy=1,axey=1, flammable=2,fence_wood=1} +local wood_connect = {"group:fence_wood"} +local wood_sounds = mcl_sounds.node_sound_wood_defaults() + +local woods = { + {"", S("Oak Fence"), S("Oak Fence Gate"), "mcl_fences_fence_oak.png", "mcl_fences_fence_gate_oak.png", "mcl_core:wood"}, + {"spruce", S("Spruce Fence"), S("Spruce Fence Gate"), "mcl_fences_fence_spruce.png", "mcl_fences_fence_gate_spruce.png", "mcl_core:sprucewood"}, + {"birch", S("Birch Fence"), S("Birch Fence Gate"), "mcl_fences_fence_birch.png", "mcl_fences_fence_gate_birch.png", "mcl_core:birchwood"}, + {"jungle", S("Jungle Fence"), S("Jungle Fence Gate"), "mcl_fences_fence_jungle.png", "mcl_fences_fence_gate_jungle.png", "mcl_core:junglewood"}, + {"dark_oak", S("Dark Oak Fence"), S("Dark Oak Fence Gate"), "mcl_fences_fence_big_oak.png", "mcl_fences_fence_gate_big_oak.png", "mcl_core:darkwood"}, + {"acacia", S("Acacia Fence"), S("Acacia Fence Gate"), "mcl_fences_fence_acacia.png", "mcl_fences_fence_gate_acacia.png", "mcl_core:acaciawood"}, +} + +for w=1, #woods do + local wood = woods[w] + local id, id_gate + if wood[1] == "" then + id = "fence" + id_gate = "fence_gate" + else + id = wood[1].."_fence" + id_gate = wood[1].."_fence_gate" + end + mcl_fences.register_fence_and_fence_gate(id, wood[2], wood[3], wood[4], wood_groups, 2, 15, wood_connect, wood_sounds) + + minetest.register_craft({ + output = 'mcl_fences:'..id..' 3', + recipe = { + {wood[6], 'mcl_core:stick', wood[6]}, + {wood[6], 'mcl_core:stick', wood[6]}, + } + }) + minetest.register_craft({ + output = 'mcl_fences:'..id_gate, + recipe = { + {'mcl_core:stick', wood[6], 'mcl_core:stick'}, + {'mcl_core:stick', wood[6], 'mcl_core:stick'}, + } + }) +end + + +-- Nether Brick Fence (without fence gate!) +mcl_fences.register_fence("nether_brick_fence", S("Nether Brick Fence"), "mcl_fences_fence_nether_brick.png", {pickaxey=1, deco_block=1, fence_nether_brick=1}, 2, 30, {"group:fence_nether_brick"}, mcl_sounds.node_sound_stone_defaults()) + +minetest.register_craft({ + output = 'mcl_fences:nether_brick_fence 6', + recipe = { + {"mcl_nether:nether_brick", "mcl_nether:netherbrick", "mcl_nether:nether_brick"}, + {"mcl_nether:nether_brick", "mcl_nether:netherbrick", "mcl_nether:nether_brick"}, + } +}) + +minetest.register_craft({ + type = "fuel", + recipe = "group:fence_wood", + burntime = 15, +}) + +local time_to_load= os.clock() - init +print(string.format("[MOD] "..minetest.get_current_modname().." loaded in %.4f s", time_to_load)) + + diff --git a/mods/ITEMS/mcl_fences/init.lua.rej b/mods/ITEMS/mcl_fences/init.lua.rej new file mode 100644 index 000000000..0d85f640c --- /dev/null +++ b/mods/ITEMS/mcl_fences/init.lua.rej @@ -0,0 +1,19 @@ +--- mods/ITEMS/mcl_fences/init.lua ++++ mods/ITEMS/mcl_fences/init.lua +@@ -14,11 +14,11 @@ local z2 = {-1/16, 4/16, 2/16, 1/16, 7/16, 0.5} --oben(quer) z + local z22 = {-1/16, -2/16, 2/16, 1/16, 1/16, 0.5} --unten(quer) z + + -- Collision box +-local cp = {-2/16, -0.5, -2/16, 2/16, 1.01, 2/16} +-local cx1 = {-0.5, -2/16, -2/16, -2/16, 1.01, 2/16} --unten(quer) -x +-local cx2 = {2/16, -2/16, -2/16, 0.5, 1.01, 2/16} --unten(quer) x +-local cz1 = {-2/16, -2/16, -0.5, 2/16, 1.01, -2/16} --unten(quer) -z +-local cz2 = {-2/16, -2/16, 2/16, 2/16, 1.01, 0.5} --unten(quer) z ++local cp = {-0.5, -0.5, -0.5, 0.5, 1.01, 0.5} ++local cx1 = {-0.5, -0.5, -0.5, -0.5, 1.01, 0.5} --unten(quer) -x ++local cx2 = {0.5, -0.5, -0.5, 0.5, 1.01, 0.5} --unten(quer) x ++local cz1 = {-0.5, -0.5, -0.5, 0.5, 1.01, -0.5} --unten(quer) -z ++local cz2 = {-0.5, -0.5, 0.5, 0.5, 1.01, 0.5} --unten(quer) z + + mcl_fences = {} + From aced401c6c78b12917cd29011f525ee7aed72ac9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 30 Aug 2019 19:42:47 +0200 Subject: [PATCH 309/379] Remove useless files --- mods/ITEMS/mcl_fences/init.lua.orig | 312 ---------------------------- mods/ITEMS/mcl_fences/init.lua.rej | 19 -- 2 files changed, 331 deletions(-) delete mode 100644 mods/ITEMS/mcl_fences/init.lua.orig delete mode 100644 mods/ITEMS/mcl_fences/init.lua.rej diff --git a/mods/ITEMS/mcl_fences/init.lua.orig b/mods/ITEMS/mcl_fences/init.lua.orig deleted file mode 100644 index c46997e7f..000000000 --- a/mods/ITEMS/mcl_fences/init.lua.orig +++ /dev/null @@ -1,312 +0,0 @@ -local init = os.clock() - -local S = minetest.get_translator("mcl_fences") - --- Node box -local p = {-2/16, -0.5, -2/16, 2/16, 0.5, 2/16} -local x1 = {-0.5, 4/16, -1/16, -2/16, 7/16, 1/16} --oben(quer) -x -local x12 = {-0.5, -2/16, -1/16, -2/16, 1/16, 1/16} --unten(quer) -x -local x2 = {2/16, 4/16, -1/16, 0.5, 7/16, 1/16} --oben(quer) x -local x22 = {2/16, -2/16, -1/16, 0.5, 1/16, 1/16} --unten(quer) x -local z1 = {-1/16, 4/16, -0.5, 1/16, 7/16, -2/16} --oben(quer) -z -local z12 = {-1/16, -2/16, -0.5, 1/16, 1/16, -2/16} --unten(quer) -z -local z2 = {-1/16, 4/16, 2/16, 1/16, 7/16, 0.5} --oben(quer) z -local z22 = {-1/16, -2/16, 2/16, 1/16, 1/16, 0.5} --unten(quer) z - --- Collision box -local cp = {-2/16, -0.5, -2/16, 2/16, 1.01, 2/16} -local cx1 = {-0.5, -2/16, -2/16, -2/16, 1.01, 2/16} --unten(quer) -x -local cx2 = {2/16, -2/16, -2/16, 0.5, 1.01, 2/16} --unten(quer) x -local cz1 = {-2/16, -2/16, -0.5, 2/16, 1.01, -2/16} --unten(quer) -z -local cz2 = {-2/16, -2/16, 2/16, 2/16, 1.01, 0.5} --unten(quer) z - -mcl_fences = {} - -mcl_fences.register_fence = function(id, fence_name, texture, groups, hardness, blast_resistance, connects_to, sounds) - local cgroups = table.copy(groups) - if cgroups == nil then cgroups = {} end - cgroups.fence = 1 - cgroups.deco_block = 1 - if connects_to == nil then - connects_to = {} - else - connects_to = table.copy(connects_to) - end - local fence_id = minetest.get_current_modname()..":"..id - table.insert(connects_to, "group:solid") - table.insert(connects_to, "group:fence_gate") - table.insert(connects_to, fence_id) - minetest.register_node(fence_id, { - description = fence_name, - _doc_items_longdesc = S("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."), - tiles = {texture}, - inventory_image = "mcl_fences_fence_mask.png^" .. texture .. "^mcl_fences_fence_mask.png^[makealpha:255,126,126", - wield_image = "mcl_fences_fence_mask.png^" .. texture .. "^mcl_fences_fence_mask.png^[makealpha:255,126,126", - paramtype = "light", - is_ground_content = false, - groups = cgroups, - stack_max = 64, - sunlight_propagates = true, - drawtype = "nodebox", - connect_sides = { "front", "back", "left", "right" }, - connects_to = connects_to, - node_box = { - type = "connected", - fixed = {p}, - connect_front = {z1,z12}, - connect_back = {z2,z22,}, - connect_left = {x1,x12}, - connect_right = {x2,x22}, - }, - collision_box = { - type = "connected", - fixed = {cp}, - connect_front = {cz1}, - connect_back = {cz2,}, - connect_left = {cx1}, - connect_right = {cx2}, - }, - sounds = sounds, - _mcl_blast_resistance = blast_resistance, - _mcl_hardness = hardness, - }) - - return fence_id -end - -mcl_fences.register_fence_gate = function(id, fence_gate_name, texture, groups, hardness, blast_resistance, sounds, sound_open, sound_close, sound_gain_open, sound_gain_close) - local meta2 - local state2 = 0 - - local function update_gate(pos, node) - minetest.set_node(pos, node) - end - - local gate_id = minetest.get_current_modname()..":"..id.."_gate" - local open_gate_id = gate_id .. "_open" - if not sound_open then - sound_open = "doors_fencegate_open" - end - if not sound_close then - sound_close = "doors_fencegate_close" - end - if not sound_gain_open then - sound_gain_open = 0.3 - end - if not sound_gain_close then - sound_gain_close = 0.3 - end - local function punch_gate(pos, node) - meta2 = minetest.get_meta(pos) - state2 = meta2:get_int("state") - local tmp_node2 - if state2 == 1 then - state2 = 0 - minetest.sound_play(sound_close, {gain = sound_gain_close, max_hear_distance = 10, pos = pos}) - tmp_node2 = {name=gate_id, param1=node.param1, param2=node.param2} - else - state2 = 1 - minetest.sound_play(sound_open, {gain = sound_gain_open, max_hear_distance = 10, pos = pos}) - tmp_node2 = {name=open_gate_id, param1=node.param1, param2=node.param2} - end - update_gate(pos, tmp_node2) - meta2:set_int("state", state2) - end - - local on_rotate - if minetest.get_modpath("screwdriver") then - on_rotate = screwdriver.rotate_simple - end - - local cgroups = table.copy(groups) - if cgroups == nil then cgroups = {} end - cgroups.fence_gate = 1 - cgroups.deco_block = 1 - - cgroups.mesecon_ignore_opaque_dig = 1 - cgroups.mesecon_effector_on = 1 - cgroups.fence_gate = 1 - minetest.register_node(open_gate_id, { - tiles = {texture}, - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = false, - sunlight_propagates = true, - walkable = false, - groups = cgroups, - drop = gate_id, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5, -3/16, -1/16, -6/16, 0.5, 1/16}, --links abschluss - {6/16, -3/16, -1/16, 0.5, 0.5, 1/16}, --rechts abschluss - {-0.5, 4/16, 1/16, -6/16, 7/16, 6/16}, --oben-links(quer) x - {-0.5, -2/16, 1/16, -6/16, 1/16, 6/16}, --unten-links(quer) x - {6/16, 4/16, 1/16, 0.5, 7/16, 0.5}, --oben-rechts(quer) x - {6/16, -2/16, 1/16, 0.5, 1/16, 0.5}, --unten-rechts(quer) x - {-0.5, -2/16, 6/16, -6/16, 7/16, 0.5}, --mitte links - {6/16, 1/16, 0.5, 0.5, 4/16, 6/16}, --mitte rechts - } - }, - selection_box = { - type = "fixed", - fixed = { - {-0.5, -3/16, -1/16, 0.5, 0.5, 1/16}, --gate - } - }, - on_rightclick = function(pos, node, clicker) - punch_gate(pos, node) - end, - mesecons = {effector = { - action_off = (function(pos, node) - punch_gate(pos, node) - end), - }}, - on_rotate = on_rotate, - sounds = sounds, - _mcl_blast_resistance = blast_resistance, - _mcl_hardness = hardness, - }) - - local cgroups_closed = table.copy(cgroups) - cgroups_closed.mesecon_effector_on = nil - cgroups_closed.mesecon_effector_off = nil - minetest.register_node(gate_id, { - description = fence_gate_name, - _doc_items_longdesc = S("Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates."), - _doc_items_usagehelp = S("Right-click the fence gate to open or close it."), - tiles = {texture}, - inventory_image = "mcl_fences_fence_gate_mask.png^" .. texture .. "^mcl_fences_fence_gate_mask.png^[makealpha:255,126,126", - wield_image = "mcl_fences_fence_gate_mask.png^" .. texture .. "^mcl_fences_fence_gate_mask.png^[makealpha:255,126,126", - paramtype = "light", - is_ground_content = false, - stack_max = 64, - paramtype2 = "facedir", - sunlight_propagates = true, - walkable = true, - groups = cgroups_closed, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5, -3/16, -1/16, -6/16, 0.5, 1/16}, --links abschluss - {6/16, -3/16, -1/16, 0.5, 0.5, 1/16}, --rechts abschluss - {-2/16, -2/16, -1/16, 0, 7/16, 1/16}, --mitte links - {0, -2/16, -1/16, 2/16, 7/16, 1/16}, --mitte rechts - {-0.5, 4/16, -1/16, -2/16, 7/16, 1/16}, --oben(quer) -z - {-0.5, -2/16, -1/16, -2/16, 1/16, 1/16}, --unten(quer) -z - {2/16, 4/16, -1/16, 0.5, 7/16, 1/16}, --oben(quer) z - {2/16, -2/16, -1/16, 0.5, 1/16, 1/16}, --unten(quer) z - } - }, - collision_box = { - type = "fixed", - fixed = { - {-0.5, -3/16, -2/16, 0.5, 1, 2/16}, --gate - } - }, - selection_box = { - type = "fixed", - fixed = { - {-0.5, -3/16, -1/16, 0.5, 0.5, 1/16}, --gate - } - }, - on_construct = function(pos) - meta2 = minetest.get_meta(pos) - meta2:set_int("state", 0) - state2 = 0 - end, - mesecons = {effector = { - action_on = (function(pos, node) - punch_gate(pos, node) - end), - }}, - on_rotate = on_rotate, - on_rightclick = function(pos, node, clicker) - punch_gate(pos, node) - end, - sounds = sounds, - _mcl_blast_resistance = blast_resistance, - _mcl_hardness = hardness, - }) - - if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", gate_id, "nodes", open_gate_id) - end - - return gate_id, open_gate_id -end - -mcl_fences.register_fence_and_fence_gate = function(id, fence_name, fence_gate_name, texture_fence, groups, hardness, blast_resistance, connects_to, sounds, sound_open, sound_close, sound_gain_open, sound_gain_close, texture_fence_gate) - if texture_fence_gate == nil then - texture_fence_gate = texture_fence - end - local fence_id = mcl_fences.register_fence(id, fence_name, texture_fence, groups, hardness, blast_resistance, connects_to, sounds) - local gate_id, open_gate_id = mcl_fences.register_fence_gate(id, fence_gate_name, texture_fence_gate, groups, hardness, blast_resistance, sounds, sound_open, sound_close, sound_gain_open, sound_gain_close) - return fence_id, gate_id, open_gate_id -end - -local wood_groups = {handy=1,axey=1, flammable=2,fence_wood=1} -local wood_connect = {"group:fence_wood"} -local wood_sounds = mcl_sounds.node_sound_wood_defaults() - -local woods = { - {"", S("Oak Fence"), S("Oak Fence Gate"), "mcl_fences_fence_oak.png", "mcl_fences_fence_gate_oak.png", "mcl_core:wood"}, - {"spruce", S("Spruce Fence"), S("Spruce Fence Gate"), "mcl_fences_fence_spruce.png", "mcl_fences_fence_gate_spruce.png", "mcl_core:sprucewood"}, - {"birch", S("Birch Fence"), S("Birch Fence Gate"), "mcl_fences_fence_birch.png", "mcl_fences_fence_gate_birch.png", "mcl_core:birchwood"}, - {"jungle", S("Jungle Fence"), S("Jungle Fence Gate"), "mcl_fences_fence_jungle.png", "mcl_fences_fence_gate_jungle.png", "mcl_core:junglewood"}, - {"dark_oak", S("Dark Oak Fence"), S("Dark Oak Fence Gate"), "mcl_fences_fence_big_oak.png", "mcl_fences_fence_gate_big_oak.png", "mcl_core:darkwood"}, - {"acacia", S("Acacia Fence"), S("Acacia Fence Gate"), "mcl_fences_fence_acacia.png", "mcl_fences_fence_gate_acacia.png", "mcl_core:acaciawood"}, -} - -for w=1, #woods do - local wood = woods[w] - local id, id_gate - if wood[1] == "" then - id = "fence" - id_gate = "fence_gate" - else - id = wood[1].."_fence" - id_gate = wood[1].."_fence_gate" - end - mcl_fences.register_fence_and_fence_gate(id, wood[2], wood[3], wood[4], wood_groups, 2, 15, wood_connect, wood_sounds) - - minetest.register_craft({ - output = 'mcl_fences:'..id..' 3', - recipe = { - {wood[6], 'mcl_core:stick', wood[6]}, - {wood[6], 'mcl_core:stick', wood[6]}, - } - }) - minetest.register_craft({ - output = 'mcl_fences:'..id_gate, - recipe = { - {'mcl_core:stick', wood[6], 'mcl_core:stick'}, - {'mcl_core:stick', wood[6], 'mcl_core:stick'}, - } - }) -end - - --- Nether Brick Fence (without fence gate!) -mcl_fences.register_fence("nether_brick_fence", S("Nether Brick Fence"), "mcl_fences_fence_nether_brick.png", {pickaxey=1, deco_block=1, fence_nether_brick=1}, 2, 30, {"group:fence_nether_brick"}, mcl_sounds.node_sound_stone_defaults()) - -minetest.register_craft({ - output = 'mcl_fences:nether_brick_fence 6', - recipe = { - {"mcl_nether:nether_brick", "mcl_nether:netherbrick", "mcl_nether:nether_brick"}, - {"mcl_nether:nether_brick", "mcl_nether:netherbrick", "mcl_nether:nether_brick"}, - } -}) - -minetest.register_craft({ - type = "fuel", - recipe = "group:fence_wood", - burntime = 15, -}) - -local time_to_load= os.clock() - init -print(string.format("[MOD] "..minetest.get_current_modname().." loaded in %.4f s", time_to_load)) - - diff --git a/mods/ITEMS/mcl_fences/init.lua.rej b/mods/ITEMS/mcl_fences/init.lua.rej deleted file mode 100644 index 0d85f640c..000000000 --- a/mods/ITEMS/mcl_fences/init.lua.rej +++ /dev/null @@ -1,19 +0,0 @@ ---- mods/ITEMS/mcl_fences/init.lua -+++ mods/ITEMS/mcl_fences/init.lua -@@ -14,11 +14,11 @@ local z2 = {-1/16, 4/16, 2/16, 1/16, 7/16, 0.5} --oben(quer) z - local z22 = {-1/16, -2/16, 2/16, 1/16, 1/16, 0.5} --unten(quer) z - - -- Collision box --local cp = {-2/16, -0.5, -2/16, 2/16, 1.01, 2/16} --local cx1 = {-0.5, -2/16, -2/16, -2/16, 1.01, 2/16} --unten(quer) -x --local cx2 = {2/16, -2/16, -2/16, 0.5, 1.01, 2/16} --unten(quer) x --local cz1 = {-2/16, -2/16, -0.5, 2/16, 1.01, -2/16} --unten(quer) -z --local cz2 = {-2/16, -2/16, 2/16, 2/16, 1.01, 0.5} --unten(quer) z -+local cp = {-0.5, -0.5, -0.5, 0.5, 1.01, 0.5} -+local cx1 = {-0.5, -0.5, -0.5, -0.5, 1.01, 0.5} --unten(quer) -x -+local cx2 = {0.5, -0.5, -0.5, 0.5, 1.01, 0.5} --unten(quer) x -+local cz1 = {-0.5, -0.5, -0.5, 0.5, 1.01, -0.5} --unten(quer) -z -+local cz2 = {-0.5, -0.5, 0.5, 0.5, 1.01, 0.5} --unten(quer) z - - mcl_fences = {} - From ed336829b4ad355e8b051757411d222e7a1c1276 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 5 Sep 2019 00:07:32 +0200 Subject: [PATCH 310/379] Fade out rain and fire sounds --- mods/ENVIRONMENT/mcl_weather/rain.lua | 4 ++-- mods/ITEMS/mcl_fire/init.lua | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ENVIRONMENT/mcl_weather/rain.lua b/mods/ENVIRONMENT/mcl_weather/rain.lua index 8a4cff087..76e386084 100644 --- a/mods/ENVIRONMENT/mcl_weather/rain.lua +++ b/mods/ENVIRONMENT/mcl_weather/rain.lua @@ -127,7 +127,7 @@ mcl_weather.rain.update_sound = function(player) if player_meta.sound_handler ~= nil then if mcl_weather.rain.last_rp_count == 0 then - minetest.sound_stop(player_meta.sound_handler) + minetest.sound_fade(player_meta.sound_handler, -0.5, 0.0) player_meta.sound_handler = nil end elseif mcl_weather.rain.last_rp_count > 0 then @@ -142,7 +142,7 @@ end mcl_weather.rain.remove_sound = function(player) local player_meta = mcl_weather.players[player:get_player_name()] if player_meta ~= nil and player_meta.sound_handler ~= nil then - minetest.sound_stop(player_meta.sound_handler) + minetest.sound_fade(player_meta.sound_handler, -0.5, 0.0) player_meta.sound_handler = nil player_meta.sound_updated = nil end diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index cefeb046c..ea36d1ce1 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -217,7 +217,7 @@ if flame_sound then (num["mcl_fire:eternal_fire"] or 0) -- Stop previous sound if handles[player_name] then - minetest.sound_stop(handles[player_name]) + minetest.sound_fade(handles[player_name], -0.4, 0.0) handles[player_name] = nil end -- If flames From 2423acb297a47a7d36eb3f4b10a3beafc6f57233 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 5 Sep 2019 00:17:52 +0200 Subject: [PATCH 311/379] Fix slimes not jumping at all --- mods/ENTITIES/mcl_mobs/api.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index c5cacd923..80d5745d5 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -787,10 +787,10 @@ local do_jump = function(self) x = pos.x + dir_x, y = pos.y + 1.5, z = pos.z + dir_z - }) + }, "air") -- we don't attempt to jump if there's a stack of blocks blocking - if nodTop ~= nil then + if minetest.registered_nodes[nodTop.name] == true then return false end From c7908cc020c812314ef0d968460a679371554649 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 10 Sep 2019 15:10:12 +0200 Subject: [PATCH 312/379] Fishing: Clean up comments --- mods/ITEMS/mcl_fishing/init.lua | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index c5e351e49..e3eea80ab 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -15,9 +15,6 @@ local bobber_ENTITY={ collisionbox = {0.45,0.45,0.45,0.45,0.45,0.45}, pointable = false, - --get_staticdata = get_staticdata, - --on_activate = on_activate, - _lastpos={}, _dive = false, _waittick = nil, @@ -242,7 +239,7 @@ local bobber_on_step = function(self, dtime) end end - -- Destroy when hitting a solid node + -- TODO: Destroy when hitting a solid node --if self._lastpos.x~=nil then -- if (def and def.walkable) or not def then --self.object:remove() @@ -256,7 +253,7 @@ bobber_ENTITY.on_step = bobber_on_step minetest.register_entity("mcl_fishing:bobber_entity", bobber_ENTITY) ---If player leaves area remove bobber. +-- If player leaves area, remove bobber. minetest.register_on_leaveplayer(function(player) local objs = minetest.get_objects_inside_radius(player:get_pos(), 250) local num = 0 @@ -275,7 +272,7 @@ minetest.register_on_leaveplayer(function(player) end end) ---if player dies remove bobber. +-- If player dies, remove bobber. minetest.register_on_dieplayer(function(player) local objs = minetest.get_objects_inside_radius(player:get_pos(), 250) local num = 0 @@ -308,7 +305,6 @@ minetest.register_tool("mcl_fishing:fishing_rod", { sound = { breaks = "default_tool_breaks" }, }) ---Make fishing rods craftable again. minetest.register_craft({ output = "mcl_fishing:fishing_rod", recipe = { From 055d6ecc96b6764062224a68a0c0ebe72594059c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 10 Sep 2019 15:12:36 +0200 Subject: [PATCH 313/379] Allow fishing in river water, too --- mods/ITEMS/mcl_fishing/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index e3eea80ab..f02b8f8bd 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -187,8 +187,8 @@ local bobber_on_step = function(self, dtime) end end - --if in liquid then bob. - if def.liquidtype == "source" and def.name == "mcl_core:water_source" then + -- If in water, then bob. + if def.liquidtype == "source" and minetest.get_item_group(def.name, "water") ~= 0 then if self._oldy == nil then self.object:set_pos({x=self.object:get_pos().x,y=math.floor(self.object:get_pos().y)+.5,z=self.object:get_pos().z}) self._oldy = self.object:get_pos().y From 06be98a676e4b184f1cac72a9a63ffdf58bc311f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 10 Sep 2019 15:14:46 +0200 Subject: [PATCH 314/379] Remove legacy carrot on a stick recipe --- mods/MISC/mcl_temp_helper_recipes/init.lua | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/mods/MISC/mcl_temp_helper_recipes/init.lua b/mods/MISC/mcl_temp_helper_recipes/init.lua index 139e6d500..fc18727a5 100644 --- a/mods/MISC/mcl_temp_helper_recipes/init.lua +++ b/mods/MISC/mcl_temp_helper_recipes/init.lua @@ -73,24 +73,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "mcl_mobitems:carrot_on_a_stick", - recipe = { - { "", "", "mcl_core:stick", }, - { "", "mcl_core:stick", "mcl_mobitems:string", }, - { "mcl_core:stick", "", "mcl_farming:carrot_item" }, - }, -}) - -minetest.register_craft({ - output = "mcl_mobitems:carrot_on_a_stick", - recipe = { - { "mcl_core:stick", "", "" }, - { "mcl_mobitems:string", "mcl_core:stick", "", }, - { "mcl_farming:carrot_item", "", "mcl_core:stick" }, - }, -}) - -- Make red sand, red sandstone and more craftable in v6 -- NOTE: When you change these, also update mcl_craftguide for the "v6" icon in -- the craft guide! From 5dd002b598b2a4d91dbd0343702103ea537d8f41 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 10 Sep 2019 15:16:49 +0200 Subject: [PATCH 315/379] Fishing: More comment cleanup --- mods/ITEMS/mcl_fishing/init.lua | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index f02b8f8bd..be7bdbda1 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -193,7 +193,6 @@ local bobber_on_step = function(self, dtime) self.object:set_pos({x=self.object:get_pos().x,y=math.floor(self.object:get_pos().y)+.5,z=self.object:get_pos().z}) self._oldy = self.object:get_pos().y end - minetest.log(self.object:get_pos().y.." "..self._oldy) -- reset to original position after dive. if self.object:get_pos().y > self._oldy then self.object:set_pos({x=self.object:get_pos().x,y=self._oldy,z=self.object:get_pos().z}) @@ -202,7 +201,7 @@ local bobber_on_step = function(self, dtime) end if self._dive then for i=1,2 do - --spray bubbles there's a fish. + -- Spray bubbles when there's a fish. minetest.add_particle({ pos = {x=epos["x"]+math.random(-1,1)*math.random()/2,y=epos["y"]+0.1,z=epos["z"]+math.random(-1,1)*math.random()/2}, velocity = {x=0, y=4, z=0}, @@ -222,7 +221,7 @@ local bobber_on_step = function(self, dtime) self._dive = false end else if self._waittick == nil then - --wait for random number of ticks. + -- wait for random number of ticks. self._waittick = math.random(50,800) else if self._tick ~= self._waittick then @@ -296,8 +295,7 @@ minetest.register_tool("mcl_fishing:fishing_rod", { description = S("Fishing Rod"), _doc_items_longdesc = S("Fishing rods can be used to catch fish."), _doc_items_usagehelp = S("Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?"), - -- This item is incomplete, hide it from creative inventory - groups = { tool=1}, + groups = { tool=1 }, inventory_image = "mcl_fishing_fishing_rod.png", stack_max = 1, on_place = fish, From 18069b069c200e58c3ec5d8a9ab78594602a7b07 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 10 Sep 2019 15:19:18 +0200 Subject: [PATCH 316/379] Update German fishing rod translation --- mods/ITEMS/mcl_fishing/locale/mcl_fishing.de.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_fishing/locale/mcl_fishing.de.tr b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.de.tr index 32500e0b7..75120cd3c 100644 --- a/mods/ITEMS/mcl_fishing/locale/mcl_fishing.de.tr +++ b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.de.tr @@ -1,7 +1,7 @@ # textdomain: mcl_fishing Fishing Rod=Angel Fishing rods can be used to catch fish.=Mit Angeln fängt man Fische. -Rightclick a water source to try to go fishing. Who knows what you're going to catch?=Rechtsklicken sie auf eine Wasserquelle, um zu angeln. Wer weiß, was Sie wohl fangen werfen? +Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?=Rechtsklicken, um den Schwimmer auszuwerfen. Wenn er sinkt, erneut rechtsklicken, um etwas zu fangen. Wer weiß, was Sie fangen werden? Raw Fish=Roher Fisch Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Rohen Fisch kann man mit Angeln fangen. Er ist ein Lebensmittel, den man sicher verzehren kann. Er kann gekocht werden, um seinen Nährwert zu erhöhen. Cooked Fish=Gekochter Fisch From 955638bccd53528d03ea63c214e1ebc965f8e0e2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 10 Sep 2019 15:45:26 +0200 Subject: [PATCH 317/379] Harden minetest.after check --- mods/ENTITIES/mcl_mobs/api.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index b3e87178b..912cfaf83 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -453,14 +453,14 @@ local check_for_death = function(self, cause, cmi_cause) self.health = self.hp_max end - -- play damage sound if health was reduced and make mob flash red. + -- play damage sound if health was reduced and make mob flash red. if damaged then self.object:set_texture_mod("^[colorize:#FF000040") - minetest.after(.2, function() - if self then + minetest.after(.2, function(self) + if self and self.object then self.object:set_texture_mod("") end - end) + end, self) mob_sound(self, self.sounds.damage) end From 2fecf0336c546c216050ee234a9635b3a3145a39 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 10 Sep 2019 16:00:41 +0200 Subject: [PATCH 318/379] Mobs: Stack texture mod effects --- mods/ENTITIES/mcl_mobs/api.lua | 43 ++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 912cfaf83..4324aa69d 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -199,6 +199,36 @@ function mobs:yaw(self, yaw, delay) set_yaw(self, yaw, delay) end +local add_texture_mod = function(self, mod) + local full_mod = "" + local already_added = false + for i=1, #self.texture_mods do + if mod == self.texture_mods[i] then + already_added = true + end + full_mod = full_mod .. self.texture_mods[i] + end + if not already_added then + full_mod = full_mod .. mod + table.insert(self.texture_mods, mod) + end + self.object:set_texture_mod(full_mod) +end +local remove_texture_mod = function(self, mod) + local full_mod = "" + local remove = {} + for i=1, #self.texture_mods do + if self.texture_mods[i] ~= mod then + full_mod = full_mod .. self.texture_mods[i] + else + table.insert(remove, i) + end + end + for i=#remove, 1 do + table.remove(self.texture_mods, remove[i]) + end + self.object:set_texture_mod(full_mod) +end -- set defined animation local set_animation = function(self, anim) @@ -455,10 +485,10 @@ local check_for_death = function(self, cause, cmi_cause) -- play damage sound if health was reduced and make mob flash red. if damaged then - self.object:set_texture_mod("^[colorize:#FF000040") + add_texture_mod(self, "^[colorize:#FF000040") minetest.after(.2, function(self) if self and self.object then - self.object:set_texture_mod("") + remove_texture_mod(self, "^[colorize:#FF000040") end end, self) mob_sound(self, self.sounds.damage) @@ -1978,7 +2008,7 @@ local do_states = function(self, dtime) self.timer = 0 self.blinktimer = 0 self.blinkstatus = false - self.object:set_texture_mod("") + remove_texture_mod(self, "^[brighten") end -- walk right up to player unless the timer is active @@ -2004,9 +2034,9 @@ local do_states = function(self, dtime) self.blinktimer = 0 if self.blinkstatus then - self.object:set_texture_mod("") + remove_texture_mod(self, "^[brighten") else - self.object:set_texture_mod("^[brighten") + add_texture_mod(self, "^[brighten") end self.blinkstatus = not self.blinkstatus @@ -2773,6 +2803,8 @@ local mob_activate = function(self, staticdata, def, dtime) self.jump_sound_cooloff = 0 -- used to prevent jump sound from being played too often in short time self.opinion_sound_cooloff = 0 -- used to prevent sound spam of particular sound types + self.texture_mods = {} + -- check existing nametag if not self.nametag then self.nametag = def.nametag @@ -3127,6 +3159,7 @@ minetest.register_entity(name, { glow = def.glow, can_despawn = can_despawn, child = def.child or false, + texture_mods = {}, -- End of MCL2 extensions on_spawn = def.on_spawn, From cf47e7de9e00278d140e4d875323393a4cac6e8f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 10 Sep 2019 16:13:11 +0200 Subject: [PATCH 319/379] Add Rootyjr to credits --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 50f08f4de..c748769c3 100644 --- a/README.md +++ b/README.md @@ -200,6 +200,7 @@ There are so many people to list (sorry). Check out the respective mod directori * [Wuzzy](https://forum.minetest.net/memberlist.php?mode=viewprofile&u=3082): Main programmer of most mods * davedevils: Creator of MineClone on which MineClone 2 is based on * [ex-bart](https://github.com/ex-bart): Redstone comparators +* [Rootyjr](https://github.com/Rootyjr): Fishing rod and bugfixes * Lots of other people: TO BE WRITTEN (see mod directories for details) ### Textures From dae4dc6924c5d91b8a0dbed79f540556379eae80 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 10 Sep 2019 16:27:32 +0200 Subject: [PATCH 320/379] Remove legacy polished stone recipe --- mods/MISC/mcl_temp_helper_recipes/init.lua | 8 -------- 1 file changed, 8 deletions(-) diff --git a/mods/MISC/mcl_temp_helper_recipes/init.lua b/mods/MISC/mcl_temp_helper_recipes/init.lua index fc18727a5..2bb7ff61e 100644 --- a/mods/MISC/mcl_temp_helper_recipes/init.lua +++ b/mods/MISC/mcl_temp_helper_recipes/init.lua @@ -112,14 +112,6 @@ minetest.register_craft({ }, }) -minetest.register_craft({ - output = "mcl_core:stone_smooth 2", - recipe = { - { "mcl_stairs:slab_stone" }, - { "mcl_stairs:slab_stone" }, - }, -}) - minetest.register_craft({ output = "mcl_core:gold_ingot 9", recipe = {{ "mcl_core:emerald" }}, From 9416305fa60118d9f4a8d60e823d2ce46901766c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 10 Sep 2019 17:09:17 +0200 Subject: [PATCH 321/379] Fix sheep not regrow wool if mobs_griefing=false --- mods/ENTITIES/mcl_mobs/api.lua | 7 ++++--- mods/ENTITIES/mcl_mobs/api.txt | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 4324aa69d..0cb272fb2 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -1101,8 +1101,7 @@ end -- find and replace what mob is looking for (grass, wheat etc.) local replace = function(self, pos) - if not mobs_griefing - or not self.replace_rate + if not self.replace_rate or not self.replace_what or self.child == true or self.object:get_velocity().y ~= 0 @@ -1139,7 +1138,9 @@ local replace = function(self, pos) if on_replace_return ~= false then - minetest.set_node(pos, {name = with}) + if mobs_griefing then + minetest.set_node(pos, {name = with}) + end -- when cow/sheep eats grass, replace wool and milk if self.gotten == true then diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index b3e2f03e7..999ba4a85 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -243,8 +243,9 @@ eating. 'replace_rate' how random should the replace rate be (typically 10) 'replace_offset' +/- value to check specific node to replace - 'on_replace(self, pos, oldnode, newnode)' is called when mob is about to - replace a node. + 'on_replace(self, pos, oldnode, newnode)' + is called when mob is about to replace a node. Also called + when not actually replacing due to mobs_griefing setting being false. 'self' ObjectRef of mob 'pos' Position of node to replace 'oldnode' Current node From 44bd5dba6c4d1bdb962f3fffb4231c7ff0d827c4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 10 Sep 2019 17:14:34 +0200 Subject: [PATCH 322/379] Mobs: Don't set gotten in API anymore --- mods/ENTITIES/mcl_mobs/api.lua | 7 ------- mods/ENTITIES/mcl_mobs/api.txt | 6 ++++-- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 0cb272fb2..0f028e8da 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -1142,11 +1142,6 @@ local replace = function(self, pos) minetest.set_node(pos, {name = with}) end - -- when cow/sheep eats grass, replace wool and milk - if self.gotten == true then - self.gotten = false - self.object:set_properties(self) - end end end end @@ -3780,8 +3775,6 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) self.horny = true end - self.gotten = false - if tame then self.tamed = true diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 999ba4a85..7c2f658e2 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -303,8 +303,10 @@ for each mob. 'self.child_texture' contains mob child texture when growing up 'self.base_texture' contains current skin texture which was randomly selected from textures list - 'self.gotten' this is used for obtaining milk from cow and wool from - sheep + 'self.gotten' this is used to track whether some special item has been + gotten from the mob, for example, wool from sheep. + Initialized as false, and the mob must set this value + manually. 'self.horny' when animal fed enough it is set to true and animal can breed with same animal 'self.hornytimer' background timer that controls breeding functions and From b3bbf38fd76dd092fc35c1cdddb0bbe45785b090 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 10 Sep 2019 17:36:47 +0200 Subject: [PATCH 323/379] Add aligator to credits --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c748769c3..ab2d7c53c 100644 --- a/README.md +++ b/README.md @@ -201,6 +201,7 @@ There are so many people to list (sorry). Check out the respective mod directori * davedevils: Creator of MineClone on which MineClone 2 is based on * [ex-bart](https://github.com/ex-bart): Redstone comparators * [Rootyjr](https://github.com/Rootyjr): Fishing rod and bugfixes +* [aligator](https://github.com/aligator): Improvement of doors * Lots of other people: TO BE WRITTEN (see mod directories for details) ### Textures From 3cba55703a2c7caf0e054d1e265fb5ce22eb144b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 11 Sep 2019 11:17:42 +0200 Subject: [PATCH 324/379] Boats: Allow very slow movement on ground --- mods/ENTITIES/mcl_boats/init.lua | 47 +++++++++++++++++--------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index 32815855b..56f6e5ec7 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -34,6 +34,7 @@ local boat_visual_size = {x = 3, y = 3} local driver_visual_size = { x = 1/boat_visual_size.x, y = 1/boat_visual_size.y } local paddling_speed = 22 local boat_y_offset = 0.35 +local boat_y_offset_ground = boat_y_offset + 0.6 -- -- Boat entity @@ -145,12 +146,21 @@ end function boat.on_step(self, dtime) self._v = get_v(self.object:get_velocity()) * get_sign(self._v) + local in_water = true + local v_factor = 1 + local v_slowdown = 0.02 + local p = self.object:get_pos() + if not is_water({x=p.x, y=p.y-boat_y_offset, z=p.z}) then + in_water = false + v_factor = 0.405 + v_slowdown = 0.04 + end if self._driver then local ctrl = self._driver:get_player_control() local yaw = self.object:get_yaw() if ctrl.up then -- Forwards - self._v = self._v + 0.1 + self._v = self._v + 0.1 * v_factor -- Paddling animation if self._animation ~= 1 then @@ -159,7 +169,7 @@ function boat.on_step(self, dtime) end elseif ctrl.down then -- Backwards - self._v = self._v - 0.1 + self._v = self._v - 0.1 * v_factor -- Paddling animation, reversed if self._animation ~= -1 then @@ -175,15 +185,15 @@ function boat.on_step(self, dtime) end if ctrl.left then if self._v < 0 then - self.object:set_yaw(yaw - (1 + dtime) * 0.03) + self.object:set_yaw(yaw - (1 + dtime) * 0.03 * v_factor) else - self.object:set_yaw(yaw + (1 + dtime) * 0.03) + self.object:set_yaw(yaw + (1 + dtime) * 0.03 * v_factor) end elseif ctrl.right then if self._v < 0 then - self.object:set_yaw(yaw + (1 + dtime) * 0.03) + self.object:set_yaw(yaw + (1 + dtime) * 0.03 * v_factor) else - self.object:set_yaw(yaw - (1 + dtime) * 0.03) + self.object:set_yaw(yaw - (1 + dtime) * 0.03 * v_factor) end end else @@ -193,13 +203,11 @@ function boat.on_step(self, dtime) self._animation = 0 end end - local velo = self.object:get_velocity() - if self._v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then - self.object:set_pos(self.object:get_pos()) - return - end local s = get_sign(self._v) - self._v = self._v - 0.02 * s + if not in_water and math.abs(self._v) > 0.1 then + v_slowdown = v_slowdown * 5 + end + self._v = self._v - v_slowdown * s if s ~= get_sign(self._v) then self.object:set_velocity({x = 0, y = 0, z = 0}) self._v = 0 @@ -209,18 +217,12 @@ function boat.on_step(self, dtime) self._v = 5 * get_sign(self._v) end - local p = self.object:get_pos() p.y = p.y - boat_y_offset local new_velo local new_acce = {x = 0, y = 0, z = 0} if not is_water(p) then local nodedef = minetest.registered_nodes[minetest.get_node(p).name] - if (not nodedef) or nodedef.walkable then - self._v = 0 - new_acce = {x = 0, y = 1, z = 0} - else - new_acce = {x = 0, y = -9.8, z = 0} - end + new_acce = {x = 0, y = -9.8, z = 0} new_velo = get_velocity(self._v, self.object:get_yaw(), self.object:get_velocity().y) self.object:set_pos(self.object:get_pos()) @@ -302,10 +304,11 @@ for b=1, #boat_ids do end end - if not is_water(pointed_thing.under) then - return + if is_water(pointed_thing.under) then + pointed_thing.under.y = pointed_thing.under.y + boat_y_offset + else + pointed_thing.under.y = pointed_thing.under.y + boat_y_offset_ground end - pointed_thing.under.y = pointed_thing.under.y + boat_y_offset local boat = minetest.add_entity(pointed_thing.under, "mcl_boats:boat") boat:get_luaentity()._itemstring = itemstring boat:set_properties({textures = { "mcl_boats_texture_"..images[b].."_boat.png" }}) From b6c3cc0ed78b8b6bac0b6e1dc4e23236e35f9a7c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 11 Sep 2019 12:11:04 +0200 Subject: [PATCH 325/379] Tweak boat physics when inside water --- mods/ENTITIES/mcl_boats/init.lua | 41 ++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index 56f6e5ec7..eeba2b6c1 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -146,15 +146,22 @@ end function boat.on_step(self, dtime) self._v = get_v(self.object:get_velocity()) * get_sign(self._v) - local in_water = true + local on_water = true + local in_water = false local v_factor = 1 local v_slowdown = 0.02 local p = self.object:get_pos() - if not is_water({x=p.x, y=p.y-boat_y_offset, z=p.z}) then - in_water = false - v_factor = 0.405 + if (not is_water({x=p.x, y=p.y-boat_y_offset, z=p.z})) then + on_water = false + v_factor = 0.5 v_slowdown = 0.04 + elseif (is_water({x=p.x, y=p.y-boat_y_offset+1, z=p.z})) then + on_water = false + in_water = true + v_factor = 0.75 + v_slowdown = 0.05 end + if self._driver then local ctrl = self._driver:get_player_control() local yaw = self.object:get_yaw() @@ -204,14 +211,14 @@ function boat.on_step(self, dtime) end end local s = get_sign(self._v) - if not in_water and math.abs(self._v) > 0.1 then - v_slowdown = v_slowdown * 5 + if not on_water and not in_water and math.abs(self._v) > 0.25 then + v_slowdown = math.min(self._v - 0.25, v_slowdown * 5) + elseif in_water and math.abs(self._v) > 0.5 then + v_slowdown = math.min(self._v - 0.5, v_slowdown * 5) end self._v = self._v - v_slowdown * s if s ~= get_sign(self._v) then - self.object:set_velocity({x = 0, y = 0, z = 0}) self._v = 0 - return end if math.abs(self._v) > 5 then self._v = 5 * get_sign(self._v) @@ -221,35 +228,33 @@ function boat.on_step(self, dtime) local new_velo local new_acce = {x = 0, y = 0, z = 0} if not is_water(p) then + -- Not on water or inside water: Free fall local nodedef = minetest.registered_nodes[minetest.get_node(p).name] new_acce = {x = 0, y = -9.8, z = 0} new_velo = get_velocity(self._v, self.object:get_yaw(), self.object:get_velocity().y) - self.object:set_pos(self.object:get_pos()) else p.y = p.y + 1 if is_water(p) then + -- Inside water: Slowly sink local y = self.object:get_velocity().y - if y >= 5 then - y = 5 - elseif y < 0 then - new_acce = {x = 0, y = 20, z = 0} - else - new_acce = {x = 0, y = 5, z = 0} + y = y - 0.01 + if y < -0.2 then + y = -0.2 end + new_acce = {x = 0, y = 0, z = 0} new_velo = get_velocity(self._v, self.object:get_yaw(), y) - self.object:set_pos(self.object:get_pos()) else + -- On top of water new_acce = {x = 0, y = 0, z = 0} if math.abs(self.object:get_velocity().y) < 1 then local pos = self.object:get_pos() pos.y = math.floor(pos.y) + boat_y_offset - self.object:set_pos(pos) new_velo = get_velocity(self._v, self.object:get_yaw(), 0) + self.object:set_pos(pos) else new_velo = get_velocity(self._v, self.object:get_yaw(), self.object:get_velocity().y) - self.object:set_pos(self.object:get_pos()) end end end From df7acfc8ae68c39227aa3c5bd33bbccb4783ff2e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 11 Sep 2019 12:23:56 +0200 Subject: [PATCH 326/379] Boats: Can place properly at all sides --- mods/ENTITIES/mcl_boats/init.lua | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index eeba2b6c1..58b8d5b27 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -35,6 +35,7 @@ local driver_visual_size = { x = 1/boat_visual_size.x, y = 1/boat_visual_size.y local paddling_speed = 22 local boat_y_offset = 0.35 local boat_y_offset_ground = boat_y_offset + 0.6 +local boat_side_offset = 1.001 -- -- Boat entity @@ -298,7 +299,7 @@ for b=1, #boat_ids do stack_max = 1, on_place = function(itemstack, placer, pointed_thing) if pointed_thing.type ~= "node" then - return + return itemstack end -- Call on_rightclick if the pointed node defines it @@ -309,12 +310,17 @@ for b=1, #boat_ids do end end - if is_water(pointed_thing.under) then - pointed_thing.under.y = pointed_thing.under.y + boat_y_offset + local pos = table.copy(pointed_thing.under) + local dir = vector.subtract(pointed_thing.above, pointed_thing.under) + + if math.abs(dir.x) > 0.9 or math.abs(dir.z) > 0.9 then + pos = vector.add(pos, vector.multiply(dir, boat_side_offset)) + elseif is_water(pos) then + pos = vector.add(pos, vector.multiply(dir, boat_y_offset)) else - pointed_thing.under.y = pointed_thing.under.y + boat_y_offset_ground + pos = vector.add(pos, vector.multiply(dir, boat_y_offset_ground)) end - local boat = minetest.add_entity(pointed_thing.under, "mcl_boats:boat") + local boat = minetest.add_entity(pos, "mcl_boats:boat") boat:get_luaentity()._itemstring = itemstring boat:set_properties({textures = { "mcl_boats_texture_"..images[b].."_boat.png" }}) boat:set_yaw(placer:get_look_horizontal()) From e633f15eedab750525b06d840307598d02979b75 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 11 Sep 2019 12:50:58 +0200 Subject: [PATCH 327/379] Fix boat behavior a bit when falling on water --- mods/ENTITIES/mcl_boats/init.lua | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index 58b8d5b27..9ce552c97 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -248,11 +248,8 @@ function boat.on_step(self, dtime) else -- On top of water new_acce = {x = 0, y = 0, z = 0} - if math.abs(self.object:get_velocity().y) < 1 then - local pos = self.object:get_pos() - pos.y = math.floor(pos.y) + boat_y_offset + if math.abs(self.object:get_velocity().y) < 0 then new_velo = get_velocity(self._v, self.object:get_yaw(), 0) - self.object:set_pos(pos) else new_velo = get_velocity(self._v, self.object:get_yaw(), self.object:get_velocity().y) From 30a954b8749f1b7363a799e2328f3c2ace716ea3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 11 Sep 2019 13:28:14 +0200 Subject: [PATCH 328/379] Increase max. speed of boats --- mods/ENTITIES/mcl_boats/init.lua | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index 9ce552c97..f5c149408 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -221,9 +221,6 @@ function boat.on_step(self, dtime) if s ~= get_sign(self._v) then self._v = 0 end - if math.abs(self._v) > 5 then - self._v = 5 * get_sign(self._v) - end p.y = p.y - boat_y_offset local new_velo @@ -256,6 +253,14 @@ function boat.on_step(self, dtime) end end end + + -- Terminal velocity: 8 m/s per axis of travel + for _,axis in pairs({"z","y","x"}) do + if math.abs(new_velo[axis]) > 8 then + new_velo[axis] = 8 * get_sign(new_velo[axis]) + end + end + self.object:set_velocity(new_velo) self.object:set_acceleration(new_acce) end From 2913acc6e9598cd4a673ddd00ba10a0806b5ac05 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 11 Sep 2019 13:45:32 +0200 Subject: [PATCH 329/379] Version 0.54.0 --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index ab2d7c53c..aef3a4292 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.53.4 +Version: 0.54.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore @@ -67,7 +67,6 @@ an explanation. #### Incomplete items These items do not work yet, but you can get them with `/giveme` for testing: -* Fishing Rod: `mcl_fishing:fishing_rod` * Activator Rail: `mcl_minecarts:activator_rail` * Minecart with Chest: `mcl_minecarts:chest_minecart` * Minecart with Furnace: `mcl_minecarts:furnace_minecart` From 25e2bd106f1ae6a3e7c5922a7faf3e1d9bba9ef3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 11 Sep 2019 13:56:52 +0200 Subject: [PATCH 330/379] Re-enable cookFish achievement --- mods/HUD/mcl_achievements/init.lua | 3 --- 1 file changed, 3 deletions(-) diff --git a/mods/HUD/mcl_achievements/init.lua b/mods/HUD/mcl_achievements/init.lua index cfeea18be..7473568d2 100644 --- a/mods/HUD/mcl_achievements/init.lua +++ b/mods/HUD/mcl_achievements/init.lua @@ -132,14 +132,11 @@ awards.register_achievement("mcl:acquireIron", { description = S("Take an iron ingot from a furnace's output slot.\nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace."), icon = "default_steel_ingot.png", }) ---[[ --- TODO: Re-enable when fishing rod is available awards.register_achievement("mcl:cookFish", { title = S("Delicious Fish"), description = S("Take a cooked fish from a furnace.\nHint: Use a fishing rod to catch a fish and cook it in a furnace."), icon = "mcl_fishing_fish_cooked.png", }) -]] -- Other achievements triggered outside of mcl_achievements From 31ae28e66ef159651b161844ba2f4f69ac4a076a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 11 Sep 2019 14:07:15 +0200 Subject: [PATCH 331/379] Add fishing rod in mob mods --- mods/ENTITIES/mobs_mc/villager.lua | 4 ++-- mods/ENTITIES/mobs_mc_gameconfig/init.lua | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 4c73524f9..e42cb690e 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -98,9 +98,9 @@ local professions = { { { { "mcl_fishing:fish_raw", 6, 6, "mcl_core:emerald", 1, 1 }, { "mcl_fishing:fish_cooked", 6, 6 } }, { { "mcl_mobitems:string", 15, 20 }, E1 }, - { { "mcl_core:coal_lump", 16, 24 }, E1 }, + -- TODO: replace with enchanted fishing rod + { { "mcl_core:emerald", 3, 11 }, { "mcl_fishing:fishing_rod", 1, 1} }, }, - -- TODO: enchanted fishing rod }, }, fletcher = { diff --git a/mods/ENTITIES/mobs_mc_gameconfig/init.lua b/mods/ENTITIES/mobs_mc_gameconfig/init.lua index f24952e91..4fe025bb0 100644 --- a/mods/ENTITIES/mobs_mc_gameconfig/init.lua +++ b/mods/ENTITIES/mobs_mc_gameconfig/init.lua @@ -88,8 +88,7 @@ mobs_mc.override.items = { mycelium = "mcl_core:mycelium", carrot = "mcl_farming:carrot_item", golden_carrot = "mcl_farming:carrot_item_gold", - fishing_rod = "mcl_core:stick", - --TODO: Re-enable: fishing_rod = "mcl_fishing:fishing_rod", + fishing_rod = "mcl_fishing:fishing_rod", fish_raw = "mcl_fishing:fish_raw", salmon_raw = "mcl_fishing:salmon_raw", clownfish_raw = "mcl_fishing:clownfish_raw", From a8a875a7b419e613735db3ac9c0d0413f89b59b4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 11 Sep 2019 16:06:34 +0200 Subject: [PATCH 332/379] Add biomeinfo mod --- mods/CORE/biomeinfo/API.md | 42 ++++++++ mods/CORE/biomeinfo/README.md | 11 +++ mods/CORE/biomeinfo/init.lua | 179 ++++++++++++++++++++++++++++++++++ mods/CORE/biomeinfo/mod.conf | 2 + 4 files changed, 234 insertions(+) create mode 100644 mods/CORE/biomeinfo/API.md create mode 100644 mods/CORE/biomeinfo/README.md create mode 100644 mods/CORE/biomeinfo/init.lua create mode 100644 mods/CORE/biomeinfo/mod.conf diff --git a/mods/CORE/biomeinfo/API.md b/mods/CORE/biomeinfo/API.md new file mode 100644 index 000000000..7713bf2a8 --- /dev/null +++ b/mods/CORE/biomeinfo/API.md @@ -0,0 +1,42 @@ +# Biome Info API +This document explains the API of this mod. + +## v6 mapgen functions +These are functions for the v6 mapgen only. + +Use these functions only in worlds in which the v6 mapgen is used. +If you use these in any other mapgen, bad things might happen. + +### `biomeinfo.get_v6_humidity(pos)` +Get the biome humidity at pos (for v6 mapgen). + +### `biomeinfo.get_v6_heat(pos)` +Get the biome heat/temperature at pos (for v6 mapgen). + +### `biomeinfo.get_v6_biome(pos)` +Get the v6 biome at pos. +Returns a string, which is the unique biome name. + +Note: This function currently ignores the `biomeblend` v6 mapgen flag, +it just pretends this setting is disabled. +This is normally not a problem, but at areas where biomes blend, +the result is not perfectly accurate and just an estimate. + +### `biomeinfo.get_active_v6_biomes()` +Returns a table containing the names of all v6 biomes that are actively +used in the current world, e.g. those that have been activated +by the use of the mapgen v6 flags (`mgv6_spflags`). + +### `biomeinfo.all_v6_biomes` +This is a table containing all v6 biomes (as strings), even those that +might not be used in the current world. + +### v6 biome names + +These are the biome names used in this mod: + +* Normal +* Desert +* Jungle +* Tundra +* Taiga diff --git a/mods/CORE/biomeinfo/README.md b/mods/CORE/biomeinfo/README.md new file mode 100644 index 000000000..d895dadb5 --- /dev/null +++ b/mods/CORE/biomeinfo/README.md @@ -0,0 +1,11 @@ +# Biome Info API [`biomeinfo`] +This is an API mod for mod developers to add a couple of missing +biome-related functions. +Currently, this mod only adds v6-related functions. +Most importantly, you can get the heat, humidity and biome in the v6 mapgen. + +See `API.md` for the API documentation. + +Current version: 1.0.1 (this is a [SemVer](https://semver.org/)) + +License: MIT License diff --git a/mods/CORE/biomeinfo/init.lua b/mods/CORE/biomeinfo/init.lua new file mode 100644 index 000000000..1ba182840 --- /dev/null +++ b/mods/CORE/biomeinfo/init.lua @@ -0,0 +1,179 @@ +biomeinfo = {} + +-- Copied from mapgen_v6.h +local MGV6_FREQ_HOT = 0.4 +local MGV6_FREQ_SNOW = -0.4 +local MGV6_FREQ_TAIGA = 0.5 +local MGV6_FREQ_JUNGLE = 0.5 + +-- Biome types +local BT_NORMAL = "Normal" +local BT_TUNDRA = "Tundra" +local BT_TAIGA = "Taiga" +local BT_DESERT = "Desert" +local BT_JUNGLE = "Jungle" + +-- Get mapgen settings + +local seed = tonumber(minetest.get_mapgen_setting("seed")) or 0 + +local mgv6_perlin_biome, mgv6_perlin_humidity, mgv6_np_biome + +local v6_flags_str = minetest.get_mapgen_setting("mgv6_spflags") +if v6_flags_str == nil then + v6_flags_str = "" +end +local v6_flags = string.split(v6_flags_str) +local v6_use_snow_biomes = true +local v6_use_jungles = true +-- TODO: Implement biome blend. +-- Currently we pretend biome blend is disabled. +-- This just makes the calculations inaccurate near biome boundaries, +-- but should be fine otherwise. +local v6_use_biome_blend = false +for f=1, #v6_flags do + local flag = v6_flags[f]:trim() + if flag == "nosnowbiomes" then + v6_use_snow_biomes = false + end + if flag == "snowbiomes" then + v6_use_snow_biomes = true + end + if flag == "nojungles" then + v6_use_jungles = false + end + if flag == "jungles" then + v6_use_jungles = true + end + if flag == "nobiomeblend" then + v6_use_biome_blend = false + end +-- TODO +-- if flag == "biomeblend" then +-- v6_use_biome_blend = true +-- end +end +-- Force-enable jungles when snowbiomes flag is set +if v6_use_snow_biomes then + v6_use_jungles = true +end +local v6_freq_desert = tonumber(minetest.get_mapgen_setting("mgv6_freq_desert") or 0.45) + +local NOISE_MAGIC_X = 1619 +local NOISE_MAGIC_Y = 31337 +local NOISE_MAGIC_Z = 52591 +local NOISE_MAGIC_SEED = 1013 +local noise2d = function(x, y, seed) + -- TODO: implement noise2d function for biome blend + return 0 +--[[ + local n = (NOISE_MAGIC_X * x + NOISE_MAGIC_Y * y + + NOISE_MAGIC_SEED * seed) & 0x7fffffff; + n = (n >> 13) ^ n; + n = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff; + return 1.0 - n / 0x40000000; +]] +end + +biomeinfo.all_v6_biomes = { + BT_NORMAL, + BT_DESERT, + BT_JUNGLE, + BT_TUNDRA, + BT_TAIGA +} + +local function init_perlins() + if not mgv6_perlin_biome then + mgv6_np_biome = minetest.get_mapgen_setting_noiseparams("mgv6_np_biome") + if mgv6_np_biome then + mgv6_perlin_biome = minetest.get_perlin(mgv6_np_biome) + end + end + if not mgv6_perlin_humidity then + local np_humidity = minetest.get_mapgen_setting_noiseparams("mgv6_np_humidity") + if np_humidity then + mgv6_perlin_humidity = minetest.get_perlin(np_humidity) + end + end +end + +function biomeinfo.get_active_v6_biomes() + local biomes = { BT_NORMAL, BT_DESERT } + if v6_use_jungles then + table.insert(biomes, BT_JUNGLE) + end + if v6_use_snow_biomes then + table.insert(biomes, BT_TUNDRA) + table.insert(biomes, BT_TAIGA) + end + return biomes +end + +function biomeinfo.get_v6_heat(pos) + init_perlins() + local bpos = vector.floor(pos) + -- The temperature noise needs a special offset (see calculateNoise in mapgen_v6.cpp) + return mgv6_perlin_biome:get_2d({x=bpos.x + mgv6_np_biome.spread.x*0.6, y=bpos.z + mgv6_np_biome.spread.z*0.2}) +end + +function biomeinfo.get_v6_humidity(pos) + init_perlins() + local bpos = vector.floor(pos) + return mgv6_perlin_humidity:get_2d({x=bpos.x, y=bpos.z}) +end + +-- Returns the v6 biome at pos. +-- Returns a string representing the biome name. +function biomeinfo.get_v6_biome(pos) + init_perlins() + local bpos = vector.floor(pos) + -- Based on the algorithm MapgenV6::getBiome in mapgen_v6.cpp + + local pos2d = {x=bpos.x, y=bpos.z} + if not mgv6_perlin_biome or not mgv6_perlin_humidity then + return "???" + end + local d = biomeinfo.get_v6_heat(bpos) + local h = biomeinfo.get_v6_humidity(bpos) + + if (v6_use_snow_biomes) then + local blend + if v6_use_biome_blend then + blend = noise2d(pos2d.x, pos2d.y, seed) / 40 + else + blend = 0 + end + + if (d > MGV6_FREQ_HOT + blend) then + if (h > MGV6_FREQ_JUNGLE + blend) then + return BT_JUNGLE + end + return BT_DESERT + end + if (d < MGV6_FREQ_SNOW + blend) then + if (h > MGV6_FREQ_TAIGA + blend) then + return BT_TAIGA + end + return BT_TUNDRA + end + return BT_NORMAL + end + + if (d > v6_freq_desert) then + return BT_DESERT + end + + if ((v6_use_biome_blend) and (d > v6_freq_desert - 0.10) and + ((noise2d(pos2d.x, pos2d.y, seed) + 1.0) > (v6_freq_desert - d) * 20.0)) then + return BT_DESERT + end + + if ((v6_use_jungles) and (h > 0.75)) then + return BT_JUNGLE + end + + return BT_NORMAL +end + + diff --git a/mods/CORE/biomeinfo/mod.conf b/mods/CORE/biomeinfo/mod.conf new file mode 100644 index 000000000..95be561a3 --- /dev/null +++ b/mods/CORE/biomeinfo/mod.conf @@ -0,0 +1,2 @@ +name = biomeinfo +description = Simple API to get data about biomes. From 76ed6ff8263f6b645a722179604d5bf91024d275 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 11 Sep 2019 16:06:41 +0200 Subject: [PATCH 333/379] MGV6: Generate witch huts only in Normal biome --- mods/MAPGEN/mcl_mapgen_core/depends.txt | 1 + mods/MAPGEN/mcl_mapgen_core/init.lua | 16 +++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/depends.txt b/mods/MAPGEN/mcl_mapgen_core/depends.txt index 9dc58fe69..783a7da49 100644 --- a/mods/MAPGEN/mcl_mapgen_core/depends.txt +++ b/mods/MAPGEN/mcl_mapgen_core/depends.txt @@ -1,5 +1,6 @@ mcl_init mcl_core +biomeinfo mclx_core? mcl_worlds mcl_cocoas diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 7d3fbf21d..8675b1238 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1170,7 +1170,8 @@ local function generate_structures(minp, maxp, seed, biomemap) -- Witch hut if ground_y <= 0 and nn == "mcl_core:dirt" then - local prob = minecraft_chunk_probability(48, minp, maxp) + local prob = minecraft_chunk_probability(48, minp, maxp) + if math.random(1, prob) == 1 then local swampland = minetest.get_biome_id("Swampland") local swampland_shore = minetest.get_biome_id("Swampland_shore") @@ -1179,19 +1180,19 @@ local function generate_structures(minp, maxp, seed, biomemap) local here_be_witches = false if mg_name == "v6" then - -- In ye good ol' landes of v6, witches will settle at any - -- shores of dirt. - here_be_witches = true + -- v6: In Normal biome + if biomeinfo.get_v6_biome(p) == "Normal" then + here_be_witches = true + end else - -- The townsfolk told me that witches live in the swamplands! + -- Other mapgens: In swampland biome local bi = xz_to_biomemap_index(p.x, p.z, minp, maxp) if biomemap[bi] == swampland or biomemap[bi] == swampland_shore then here_be_witches = true end end - -- We still need a bit of luck! - if here_be_witches and math.random(1, prob) == 1 then + if here_be_witches then local r = tostring(math.random(0, 3) * 90) -- "0", "90", "180" or 270" local p1 = {x=p.x-1, y=WITCH_HUT_HEIGHT+2, z=p.z-1} local size @@ -1268,6 +1269,7 @@ local function generate_structures(minp, maxp, seed, biomemap) end end end + end -- Ice spikes in v6 -- In other mapgens, ice spikes are generated as decorations. From 748b5d4a4bee6d876b5c346af69771f3b67b24dd Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 19 Sep 2019 00:35:28 +0200 Subject: [PATCH 334/379] Localize a variable --- mods/ITEMS/mcl_core/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index 215db3f08..9eec03d07 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -648,7 +648,7 @@ function mcl_core.get_grass_block_type(pos) local biome_name = minetest.get_biome_name(biome) local reg_biome = minetest.registered_biomes[biome_name] if reg_biome then - biome_type = reg_biome._mcl_biome_type + local biome_type = reg_biome._mcl_biome_type dry = biome_type == "hot" end end From e64ef6e2546700c1b094a53fd981d26bf7567bea Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 19 Sep 2019 12:04:41 +0200 Subject: [PATCH 335/379] Prevent placement of meshhand nodes --- mods/PLAYER/mcl_meshhand/init.lua | 37 ++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/mods/PLAYER/mcl_meshhand/init.lua b/mods/PLAYER/mcl_meshhand/init.lua index 0ef9e2010..2ccbc0b92 100644 --- a/mods/PLAYER/mcl_meshhand/init.lua +++ b/mods/PLAYER/mcl_meshhand/init.lua @@ -6,18 +6,34 @@ local def = minetest.registered_items[""] if has_mcl_skins == true then --generate a node for every skin for _,texture in pairs(mcl_skins.list) do + -- This is a fake node that should never be placed in the world minetest.register_node("mcl_meshhand:"..texture, { description = "", tiles = {texture..".png"}, - inventory_image = "blank.png", + inventory_image = "wieldhand.png", visual_scale = 1, wield_scale = {x=1,y=1,z=1}, paramtype = "light", drawtype = "mesh", mesh = "mcl_meshhand.b3d", + -- Prevent placement node_placement_prediction = "", + on_construct = function(pos) + minetest.log("error", "[mcl_meshhand] Trying to construct mcl_meshhand:"..texture.." at "..minetest.pos_to_string(pos)) + minetest.remove_node(pos) + end, + on_place = function(itemstack, placer, pointed_thing) + local spos = "" + if pointed_thing.above then + spos = minetest.pos_to_string(pointed_thing.above) + end + minetest.log("error", "[mcl_meshhand] Player tried to place mcl_meshhand:"..texture.." at "..spos) + itemstack:set_count(0) + return itemstack + end, + groups = { dig_immediate = 3, not_in_creative_inventory = 1 }, range = def.range, - }) + }) end --change the player's hand to their skin mcl_skins.register_on_set_skin(function(player, skin) @@ -30,13 +46,28 @@ else minetest.register_node("mcl_meshhand:hand", { description = "", tiles = {"character.png"}, - inventory_image = "blank.png", + inventory_image = "wieldhand.png", visual_scale = 1, wield_scale = {x=1,y=1,z=1}, paramtype = "light", drawtype = "mesh", mesh = "mcl_meshhand.b3d", + -- Prevent placement node_placement_prediction = "", + on_construct = function(pos) + minetest.log("error", "[mcl_meshhand] Trying to construct mcl_meshhand:hand at "..minetest.pos_to_string(pos)) + minetest.remove_node(pos) + end, + on_place = function(itemstack, placer, pointed_thing) + local spos = "" + if pointed_thing.above then + spos = minetest.pos_to_string(pointed_thing.above ) + end + minetest.log("error", "[mcl_meshhand] Player tried to place mcl_meshhand:hand at "..spos) + itemstack:set_count(0) + return itemstack + end, + groups = { dig_immediate = 3, not_in_creative_inventory = 1 }, range = def.range, }) From 1aac4713a4b00d316f9eb12d6af0fbd2a7cb34e2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 19 Sep 2019 12:20:31 +0200 Subject: [PATCH 336/379] Simplify mcl_meshhand code --- mods/PLAYER/mcl_meshhand/init.lua | 70 ++++++++++++------------------- 1 file changed, 26 insertions(+), 44 deletions(-) diff --git a/mods/PLAYER/mcl_meshhand/init.lua b/mods/PLAYER/mcl_meshhand/init.lua index 2ccbc0b92..5dc72992b 100644 --- a/mods/PLAYER/mcl_meshhand/init.lua +++ b/mods/PLAYER/mcl_meshhand/init.lua @@ -2,50 +2,20 @@ local has_mcl_skins = minetest.get_modpath("mcl_skins") ~= nil local def = minetest.registered_items[""] +local list -- mcl_skins is enabled if has_mcl_skins == true then - --generate a node for every skin - for _,texture in pairs(mcl_skins.list) do - -- This is a fake node that should never be placed in the world - minetest.register_node("mcl_meshhand:"..texture, { - description = "", - tiles = {texture..".png"}, - inventory_image = "wieldhand.png", - visual_scale = 1, - wield_scale = {x=1,y=1,z=1}, - paramtype = "light", - drawtype = "mesh", - mesh = "mcl_meshhand.b3d", - -- Prevent placement - node_placement_prediction = "", - on_construct = function(pos) - minetest.log("error", "[mcl_meshhand] Trying to construct mcl_meshhand:"..texture.." at "..minetest.pos_to_string(pos)) - minetest.remove_node(pos) - end, - on_place = function(itemstack, placer, pointed_thing) - local spos = "" - if pointed_thing.above then - spos = minetest.pos_to_string(pointed_thing.above) - end - minetest.log("error", "[mcl_meshhand] Player tried to place mcl_meshhand:"..texture.." at "..spos) - itemstack:set_count(0) - return itemstack - end, - groups = { dig_immediate = 3, not_in_creative_inventory = 1 }, - range = def.range, - }) - end - --change the player's hand to their skin - mcl_skins.register_on_set_skin(function(player, skin) - local name = player:get_player_name() - player:get_inventory():set_stack("hand", 1, "mcl_meshhand:"..skin) - end) - ---do default skin if no skin mod installed + list = mcl_skins.list else - minetest.register_node("mcl_meshhand:hand", { + list = { "hand" } +end + +--generate a node for every skin +for _,texture in pairs(list) do + -- This is a fake node that should never be placed in the world + minetest.register_node("mcl_meshhand:"..texture, { description = "", - tiles = {"character.png"}, + tiles = {texture..".png"}, inventory_image = "wieldhand.png", visual_scale = 1, wield_scale = {x=1,y=1,z=1}, @@ -55,22 +25,34 @@ else -- Prevent placement node_placement_prediction = "", on_construct = function(pos) - minetest.log("error", "[mcl_meshhand] Trying to construct mcl_meshhand:hand at "..minetest.pos_to_string(pos)) + minetest.log("error", "[mcl_meshhand] Trying to construct mcl_meshhand:"..texture.." at "..minetest.pos_to_string(pos)) minetest.remove_node(pos) end, on_place = function(itemstack, placer, pointed_thing) local spos = "" if pointed_thing.above then - spos = minetest.pos_to_string(pointed_thing.above ) + spos = minetest.pos_to_string(pointed_thing.above) end - minetest.log("error", "[mcl_meshhand] Player tried to place mcl_meshhand:hand at "..spos) + minetest.log("error", "[mcl_meshhand] Player tried to place mcl_meshhand:"..texture.." at "..spos) itemstack:set_count(0) return itemstack end, + drop = "", + on_drop = function() + return "" + end, groups = { dig_immediate = 3, not_in_creative_inventory = 1 }, range = def.range, - }) + }) +end +if has_mcl_skins == true then + --change the player's hand to their skin + mcl_skins.register_on_set_skin(function(player, skin) + local name = player:get_player_name() + player:get_inventory():set_stack("hand", 1, "mcl_meshhand:"..skin) + end) +else minetest.register_on_joinplayer(function(player) player:get_inventory():set_stack("hand", 1, "mcl_meshhand:hand") end) From 67f33c925625215ad74755e9ba6b101afeb666d2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 19 Sep 2019 12:27:27 +0200 Subject: [PATCH 337/379] Prevent constructing arrow boxes --- mods/ENTITIES/mobs_mc/2_throwing.lua | 20 ++++++++++++++++---- mods/ITEMS/mcl_bows/arrow.lua | 6 ++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/2_throwing.lua b/mods/ENTITIES/mobs_mc/2_throwing.lua index 59b03741b..f3b40691e 100644 --- a/mods/ENTITIES/mobs_mc/2_throwing.lua +++ b/mods/ENTITIES/mobs_mc/2_throwing.lua @@ -15,15 +15,18 @@ local c = mobs_mc.is_item_variable_overridden minetest.register_node("mobs_mc:arrow_box", { drawtype = "nodebox", + is_ground_content = false, node_box = { type = "fixed", fixed = { -- Shaft - {-6.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, - --Spitze + {-6.5/17, -1.5/17, -1.5/17, -4.5/17, 1.5/17, 1.5/17}, + {-4.5/17, -0.5/17, -0.5/17, 5.5/17, 0.5/17, 0.5/17}, + {5.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, + -- Tip {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17}, {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17}, - --Federn + -- Fletching {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17}, {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17}, {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17}, @@ -36,7 +39,16 @@ minetest.register_node("mobs_mc:arrow_box", { } }, tiles = {"mcl_bows_arrow.png^[transformFX", "mcl_bows_arrow.png^[transformFX", "mcl_bows_arrow_back.png", "mcl_bows_arrow_front.png", "mcl_bows_arrow.png", "mcl_bows_arrow.png^[transformFX"}, - groups = {not_in_creative_inventory=1}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + groups = {not_in_creative_inventory=1, dig_immediate=3}, + node_placement_prediction = "", + on_construct = function(pos) + minetest.log("error", "[mobs_mc] Trying to construct mobs_mc:arrow_box at "..minetest.pos_to_string(pos)) + minetest.remove_node(pos) + end, + drop = "", }) local THROWING_ARROW_ENTITY={ diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index a4ecb7e0d..944748691 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -67,6 +67,12 @@ minetest.register_node("mcl_bows:arrow_box", { paramtype2 = "facedir", sunlight_propagates = true, groups = {not_in_creative_inventory=1, dig_immediate=3}, + drop = "", + node_placement_prediction = "", + on_construct = function(pos) + minetest.log("error", "[mcl_bows] Trying to construct mcl_bows:arrow_box at "..minetest.pos_to_string(pos)) + minetest.remove_node(pos) + end, }) local ARROW_ENTITY={ From dfe68e6820d3f7554edcafcab8314ab7add7a23a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 19 Sep 2019 12:31:50 +0200 Subject: [PATCH 338/379] Simplify meshhand error handling --- mods/PLAYER/mcl_meshhand/init.lua | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/mods/PLAYER/mcl_meshhand/init.lua b/mods/PLAYER/mcl_meshhand/init.lua index 5dc72992b..14bf10090 100644 --- a/mods/PLAYER/mcl_meshhand/init.lua +++ b/mods/PLAYER/mcl_meshhand/init.lua @@ -16,27 +16,17 @@ for _,texture in pairs(list) do minetest.register_node("mcl_meshhand:"..texture, { description = "", tiles = {texture..".png"}, - inventory_image = "wieldhand.png", visual_scale = 1, wield_scale = {x=1,y=1,z=1}, paramtype = "light", drawtype = "mesh", mesh = "mcl_meshhand.b3d", - -- Prevent placement + -- Prevent construction node_placement_prediction = "", on_construct = function(pos) minetest.log("error", "[mcl_meshhand] Trying to construct mcl_meshhand:"..texture.." at "..minetest.pos_to_string(pos)) minetest.remove_node(pos) end, - on_place = function(itemstack, placer, pointed_thing) - local spos = "" - if pointed_thing.above then - spos = minetest.pos_to_string(pointed_thing.above) - end - minetest.log("error", "[mcl_meshhand] Player tried to place mcl_meshhand:"..texture.." at "..spos) - itemstack:set_count(0) - return itemstack - end, drop = "", on_drop = function() return "" From 21317aa7c7d39ba5e84eb175d34ceee54c315a82 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 24 Sep 2019 18:17:27 +0200 Subject: [PATCH 339/379] Fix eating/drinking sounds to user --- mods/PLAYER/mcl_hunger/hunger.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index 7d7306bd0..eacec1bc5 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -145,10 +145,10 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso if foodtype == 3 then -- Item is a drink, only play drinking sound (no particle) minetest.sound_play("survival_thirst_drink", { - pos = pos, max_hear_distance = 12, gain = 1.0, pitch = 1 + math.random(-10, 10)*0.005, + object = user, }) else -- Assume the item is a food @@ -184,10 +184,10 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso }) end minetest.sound_play("mcl_hunger_bite", { - pos = pos, max_hear_distance = 12, gain = 1.0, pitch = 1 + math.random(-10, 10)*0.005, + object = user, }) end From 5ba4f1b8992a170d5c6da5a5e96d263ba44c97a7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 24 Sep 2019 18:41:33 +0200 Subject: [PATCH 340/379] Disable valleys heat/humidity changes by default --- minetest.conf | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/minetest.conf b/minetest.conf index f7042f5a3..6b6a4d678 100644 --- a/minetest.conf +++ b/minetest.conf @@ -1,7 +1,9 @@ -# This is a game specify minetest.conf file, do not edit +# This is a game specific minetest.conf file, do not edit +# Basic game rules time_speed = 72 +# Player physics movement_acceleration_default = 2.4 movement_acceleration_air = 1.2 #movement_acceleration_fast = 10 @@ -20,4 +22,12 @@ movement_liquid_sink = 23 movement_gravity = 10.4 +# Mapgen stuff + +# altitude_chill and altitude_dry doesn't go well together with MCL2 biomes +# which already include "snowed" variants as you go higher. +# humid_rivers would cause the MushroomIsland biome to appear frequently around rivers. +mgvalleys_spflags = noaltitude_chill,noaltitude_dry,nohumid_rivers,vary_river_depth + +# MCL2-specific stuff keepInventory = false From d9d1e5c08cc29ab21a73a4c540ffc79b8d1fa3f5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 27 Sep 2019 12:09:03 +0200 Subject: [PATCH 341/379] Fix crash in mcl_fishing --- mods/ITEMS/mcl_fishing/init.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index be7bdbda1..ebef9ca92 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -41,6 +41,7 @@ local fish = function(itemstack, player) noent = false if ent._dive == true then local itemname + local items local itemcount = 1 local itemwear = 0 -- FIXME: Maybe use a better seeding @@ -103,7 +104,7 @@ local fish = function(itemstack, player) local idef = itemstack:get_definition() itemstack:add_wear(65535/65) -- 65 uses if itemstack:get_count() == 0 and idef.sound and idef.sound.breaks then - minetest.sound_play(idef.sound.breaks, {pos=player.get_pos(), gain=0.5}) + minetest.sound_play(idef.sound.breaks, {pos=player:get_pos(), gain=0.5}) end end end @@ -117,7 +118,7 @@ local fish = function(itemstack, player) local idef = itemstack:get_definition() itemstack:add_wear((65535/65)*2) -- if so and not creative then wear double like in MC. if itemstack:get_count() == 0 and idef.sound and idef.sound.breaks then - minetest.sound_play(idef.sound.breaks, {pos=player.get_pos(), gain=0.5}) + minetest.sound_play(idef.sound.breaks, {pos=player:get_pos(), gain=0.5}) end end end From 40b5c5c2a56b879a21211bb7f7fb8dd8c000ca7f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 27 Sep 2019 12:19:37 +0200 Subject: [PATCH 342/379] Version 0.54.1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aef3a4292..aaef3eba0 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.54.0 +Version: 0.54.1 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 14d4bec8a921a72b0982f820e048a5da31e1b842 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 2 Oct 2019 18:28:28 +0200 Subject: [PATCH 343/379] Implement proper drowning for mobs --- mods/ENTITIES/mcl_mobs/api.lua | 62 +++++++++++++++++++++++++++++----- mods/ENTITIES/mcl_mobs/api.txt | 15 ++++++-- 2 files changed, 66 insertions(+), 11 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 0f028e8da..4c34e3a54 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -720,22 +720,22 @@ local do_env_damage = function(self) self.health = self.health - self.water_damage + -- TODO: Damage particle effect(pos, 5, "bubble.png", nil, nil, 1, nil) if check_for_death(self, "water", {type = "environment", pos = pos, node = self.standing_in}) then return end end - -- lava or fire + -- lava elseif self.lava_damage - and (nodef.groups.lava - or self.standing_in == node_fire - or self.standing_in == node_permanent_flame) then + and (nodef.groups.lava) then if self.lava_damage ~= 0 then self.health = self.health - self.lava_damage + -- TODO: Damage particle effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) if check_for_death(self, "lava", {type = "environment", @@ -747,12 +747,44 @@ local do_env_damage = function(self) self.health = self.health - nodef.damage_per_second + -- TODO: Damage particle effect(pos, 5, "tnt_smoke.png") if check_for_death(self, "dps", {type = "environment", pos = pos, node = self.standing_in}) then return end end + -- Drowning damage + if self.breath_max ~= -1 then + local drowning = false + if self.breathes_in_water then + if minetest.get_item_group(self.standing_in, "water") == 0 then + drowning = true + end + elseif nodef.drowning > 0 then + drowning = true + end + if drowning then + + self.breath = math.max(0, self.breath - 1) + + effect(pos, 2, "bubble.png", nil, nil, 1, nil) + if self.breath <= 0 then + -- TODO: Damage particle + effect(pos, 5, "bubble.png", nil, nil, 1, nil) + if nodef.drowning > 0 then + self.health = self.health - nodef.drowning + else + self.health = self.health - 4 + end + end + if check_for_death(self, "drowning", {type = "environment", + pos = pos, node = self.standing_in}) then return end + else + self.breath = math.min(self.breath_max, self.breath + 1) + end + end + --- suffocation inside solid node -- FIXME: Redundant with mcl_playerplus if (self.suffocation == true) @@ -2776,6 +2808,9 @@ local mob_activate = function(self, staticdata, def, dtime) if self.health == 0 then self.health = random (self.hp_min, self.hp_max) end + if self.breath == nil then + self.breath = self.breath_max + end -- pathfinding init self.path = {} @@ -3052,6 +3087,15 @@ if def.can_despawn ~= nil then else can_despawn = true end + +local function scale_difficulty(value, default, min, special) + if (not value) or (value == default) or (value == special) then + return default + else + return max(min, value) * difficulty + end +end + minetest.register_entity(name, { stepheight = def.stepheight or 1.1, -- was 0.6 @@ -3069,8 +3113,10 @@ minetest.register_entity(name, { drawtype = def.drawtype, -- DEPRECATED, use rotate instead rotate = math.rad(def.rotate or 0), -- 0=front, 90=side, 180=back, 270=side2 lifetimer = def.lifetimer or 57.73, - hp_min = max(1, (def.hp_min or 5) * difficulty), - hp_max = max(1, (def.hp_max or 10) * difficulty), + hp_min = scale_difficulty(def.hp_min, 5, 1), + hp_max = scale_difficulty(def.hp_max, 10, 1), + breath_max = scale_difficulty(def.breath_max, 15, 1, -1), + breathes_in_water = def.breathes_in_water or false, physical = true, collisionbox = def.collisionbox or {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, selectionbox = def.selectionbox or def.collisionbox, @@ -3081,11 +3127,11 @@ minetest.register_entity(name, { view_range = def.view_range or 16, walk_velocity = def.walk_velocity or 1, run_velocity = def.run_velocity or 2, - damage = max(0, (def.damage or 0) * difficulty), + damage = scale_difficulty(def.damage, 0, 0), light_damage = def.light_damage or 0, sunlight_damage = def.sunlight_damage or 0, water_damage = def.water_damage or 0, - lava_damage = def.lava_damage or 0, + lava_damage = def.lava_damage or 8, suffocation = def.suffocation or true, fall_damage = def.fall_damage or 1, fall_speed = def.fall_speed or -10, -- must be lower than -2 (default: -10) diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 7c2f658e2..283bc6a23 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -28,8 +28,13 @@ functions needed for the mob to work properly which contains the following: "monster" attacks player or npc on sight. "npc" walk around and will defend themselves if hit first, they kill monsters. - 'hp_min' has the minimum health value the mob can spawn with. - 'hp_max' has the maximum health value the mob can spawn with. + 'hp_min' the minimum health value the mob can spawn with. + 'hp_max' the maximum health value the mob can spawn with. + 'breath_max' The maximum breath value the mob can spawn with and can have. + If -1 (default), mob does not take drowning damage. + 'breathes_in_water' If true, mob loses breath when not in water. Otherwise, + mob loses breath when inside a node with `drowning` attribute + set (default: false). 'armor' holds strength of mob, 100 is normal, lower is more powerful and needs more hits and better weapons to kill. 'passive' when true allows animals to defend themselves when hit, @@ -58,7 +63,7 @@ functions needed for the mob to work properly which contains the following: 'water_damage' holds the damage per second infliced to mobs when standing in water. 'lava_damage' holds the damage per second inflicted to mobs when standing - in lava or fire. + in lava (default: 8). 'light_damage' holds the damage per second inflicted to mobs when it's too bright (above 13 light). 'suffocation' when true causes mobs to suffocate inside solid blocks (2 damage per second). @@ -299,6 +304,10 @@ for each mob. 'self.health' contains current health of mob (cannot exceed self.hp_max) + 'self.breath' contains current breath of mob, if mob takes drowning + damage at all (cannot exceed self.breath_max). Breath + decreases by 1 each second while in a node with drowning + damage and increases by 1 each second otherwise. 'self.texture_list' contains list of all mob textures 'self.child_texture' contains mob child texture when growing up 'self.base_texture' contains current skin texture which was randomly From b71c9204eca2c114674ab826746cb63e2164eb9c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 2 Oct 2019 18:31:16 +0200 Subject: [PATCH 344/379] Update drowning settings in mobs_mc --- mods/ENTITIES/mobs_mc/bat.lua | 3 --- mods/ENTITIES/mobs_mc/chicken.lua | 3 --- mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 3 --- mods/ENTITIES/mobs_mc/ender_dragon.lua | 2 -- mods/ENTITIES/mobs_mc/enderman.lua | 2 -- mods/ENTITIES/mobs_mc/endermite.lua | 3 --- mods/ENTITIES/mobs_mc/ghast.lua | 2 -- mods/ENTITIES/mobs_mc/guardian.lua | 4 +--- mods/ENTITIES/mobs_mc/guardian_elder.lua | 4 +--- mods/ENTITIES/mobs_mc/horse.lua | 4 ++-- mods/ENTITIES/mobs_mc/iron_golem.lua | 4 +--- mods/ENTITIES/mobs_mc/llama.lua | 3 --- mods/ENTITIES/mobs_mc/ocelot.lua | 3 --- mods/ENTITIES/mobs_mc/parrot.lua | 3 --- mods/ENTITIES/mobs_mc/pig.lua | 3 --- mods/ENTITIES/mobs_mc/polar_bear.lua | 4 +--- mods/ENTITIES/mobs_mc/rabbit.lua | 3 --- mods/ENTITIES/mobs_mc/sheep.lua | 3 --- mods/ENTITIES/mobs_mc/shulker.lua | 3 --- mods/ENTITIES/mobs_mc/silverfish.lua | 3 --- mods/ENTITIES/mobs_mc/skeleton+stray.lua | 3 +-- mods/ENTITIES/mobs_mc/skeleton_wither.lua | 1 + mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 3 --- mods/ENTITIES/mobs_mc/spider.lua | 3 --- mods/ENTITIES/mobs_mc/squid.lua | 4 +--- mods/ENTITIES/mobs_mc/vex.lua | 3 --- mods/ENTITIES/mobs_mc/villager.lua | 3 --- mods/ENTITIES/mobs_mc/villager_evoker.lua | 3 --- mods/ENTITIES/mobs_mc/villager_illusioner.lua | 1 - mods/ENTITIES/mobs_mc/villager_vindicator.lua | 3 --- mods/ENTITIES/mobs_mc/villager_zombie.lua | 3 +-- mods/ENTITIES/mobs_mc/witch.lua | 3 --- mods/ENTITIES/mobs_mc/wither.lua | 2 -- mods/ENTITIES/mobs_mc/wolf.lua | 3 --- mods/ENTITIES/mobs_mc/zombie.lua | 2 +- mods/ENTITIES/mobs_mc/zombiepig.lua | 3 +-- 36 files changed, 12 insertions(+), 93 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/bat.lua b/mods/ENTITIES/mobs_mc/bat.lua index 10e7a3adb..36415470a 100644 --- a/mods/ENTITIES/mobs_mc/bat.lua +++ b/mods/ENTITIES/mobs_mc/bat.lua @@ -40,9 +40,6 @@ mobs:register_mob("mobs_mc:bat", { ]] }, - water_damage = 1, - lava_damage = 4, - light_damage = 0, fall_damage = 0, view_range = 16, diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua index fec0bb53e..c6ce85507 100644 --- a/mods/ENTITIES/mobs_mc/chicken.lua +++ b/mods/ENTITIES/mobs_mc/chicken.lua @@ -35,9 +35,6 @@ mobs:register_mob("mobs_mc:chicken", { min = 0, max = 2,}, }, - water_damage = 1, - lava_damage = 4, - light_damage = 0, fall_damage = 0, fall_speed = -2.25, sounds = { diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index 83d89ff15..cfc4991f5 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -26,9 +26,6 @@ local cow_def = { min = 0, max = 2,}, }, - water_damage = 1, - lava_damage = 5, - light_damage = 0, runaway = true, sounds = { random = "mobs_mc_cow", diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index a06f1c460..fd5543aea 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -47,9 +47,7 @@ mobs:register_mob("mobs_mc:enderdragon", { min = 1, max = 1}, }, - water_damage = 0, lava_damage = 0, - light_damage = 0, on_rightclick = nil, attack_type = "dogshoot", arrow = "mobs_mc:fireball2", diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index 6af9ebe4a..ad74768be 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -320,8 +320,6 @@ mobs:register_mob("mobs_mc:enderman", { end end, water_damage = 8, - lava_damage = 4, - light_damage = 0, -- TODO: Increase view range when it detects being seen -- Low view range to emulate that behaviour somehow view_range = 4, diff --git a/mods/ENTITIES/mobs_mc/endermite.lua b/mods/ENTITIES/mobs_mc/endermite.lua index 0776ca47b..ebec262da 100644 --- a/mods/ENTITIES/mobs_mc/endermite.lua +++ b/mods/ENTITIES/mobs_mc/endermite.lua @@ -27,9 +27,6 @@ mobs:register_mob("mobs_mc:endermite", { walk_velocity = 1, run_velocity = 2, jump = true, - water_damage = 0, - lava_damage = 4, - light_damage = 0, fear_height = 4, view_range = 16, damage = 2, diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index 029d517a7..f840653c8 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -53,8 +53,6 @@ mobs:register_mob("mobs_mc:ghast", { walk_start = 0, walk_end = 40, run_start = 0, run_end = 40, }, - lava_damage = 4, - light_damage = 0, fall_damage = 0, view_range = 100, --attack_type = "dogshoot", diff --git a/mods/ENTITIES/mobs_mc/guardian.lua b/mods/ENTITIES/mobs_mc/guardian.lua index 89ad0964a..24d0ebd08 100644 --- a/mods/ENTITIES/mobs_mc/guardian.lua +++ b/mods/ENTITIES/mobs_mc/guardian.lua @@ -10,6 +10,7 @@ mobs:register_mob("mobs_mc:guardian", { type = "monster", hp_min = 30, hp_max = 30, + breath_max = -1, passive = false, attack_type = "dogfight", pathfinding = 1, @@ -76,9 +77,6 @@ mobs:register_mob("mobs_mc:guardian", { stepheight = 0.1, jump = false, view_range = 16, - water_damage = 0, - lava_damage = 4, - light_damage = 0, blood_amount = 0, }) diff --git a/mods/ENTITIES/mobs_mc/guardian_elder.lua b/mods/ENTITIES/mobs_mc/guardian_elder.lua index 85ad5053f..f3799baff 100644 --- a/mods/ENTITIES/mobs_mc/guardian_elder.lua +++ b/mods/ENTITIES/mobs_mc/guardian_elder.lua @@ -10,6 +10,7 @@ mobs:register_mob("mobs_mc:guardian_elder", { type = "monster", hp_min = 80, hp_max = 80, + breath_max = -1, passive = false, attack_type = "dogfight", pathfinding = 1, @@ -80,9 +81,6 @@ mobs:register_mob("mobs_mc:guardian_elder", { fly_in = { mobs_mc.items.water_source, mobs_mc.items.river_water_source }, stepheight = 0.1, jump = false, - water_damage = 0, - lava_damage = 4, - light_damage = 0, view_range = 16, blood_amount = 0, }) diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index c20543003..d51a1c660 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -116,8 +116,6 @@ local horse = { hp_min = 15, hp_max = 30, floats = 1, - lava_damage = 4, - water_damage = 1, makes_footstep_sound = true, jump = true, jump_height = 5.75, -- can clear 2.5 blocks @@ -324,6 +322,7 @@ mobs:register_mob("mobs_mc:horse", horse) -- Skeleton horse local skeleton_horse = table.copy(horse) +skeleton_horse.breath_max = -1 skeleton_horse.textures = {{"blank.png", "mobs_mc_horse_skeleton.png", "blank.png"}} skeleton_horse.drops = { {name = mobs_mc.items.bone, @@ -342,6 +341,7 @@ mobs:register_mob("mobs_mc:skeleton_horse", skeleton_horse) -- Zombie horse local zombie_horse = table.copy(horse) +zombie_horse.breath_max = -1 zombie_horse.textures = {{"blank.png", "mobs_mc_horse_zombie.png", "blank.png"}} zombie_horse.drops = { {name = mobs_mc.items.rotten_flesh, diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mobs_mc/iron_golem.lua index 9ca88ba5d..95a088dec 100644 --- a/mods/ENTITIES/mobs_mc/iron_golem.lua +++ b/mods/ENTITIES/mobs_mc/iron_golem.lua @@ -16,6 +16,7 @@ mobs:register_mob("mobs_mc:iron_golem", { passive = true, hp_min = 100, hp_max = 100, + breath_max = -1, collisionbox = {-0.7, -0.01, -0.7, 0.7, 2.69, 0.7}, visual = "mesh", mesh = "mobs_mc_iron_golem.b3d", @@ -48,9 +49,6 @@ mobs:register_mob("mobs_mc:iron_golem", { min = 0, max = 2,}, }, - water_damage = 0, - lava_damage = 4, - light_damage = 0, fall_damage = 0, animation = { stand_speed = 15, walk_speed = 15, run_speed = 25, punch_speed = 15, diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mobs_mc/llama.lua index a69db0bac..92da233a5 100644 --- a/mods/ENTITIES/mobs_mc/llama.lua +++ b/mods/ENTITIES/mobs_mc/llama.lua @@ -32,9 +32,6 @@ mobs:register_mob("mobs_mc:llama", { min = 0, max = 2,}, }, - water_damage = 0, - lava_damage = 4, - light_damage = 0, fear_height = 4, sounds = { random = "mobs_mc_llama", diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua index 634d77a3f..e2b37220f 100644 --- a/mods/ENTITIES/mobs_mc/ocelot.lua +++ b/mods/ENTITIES/mobs_mc/ocelot.lua @@ -42,9 +42,6 @@ local ocelot = { run_velocity = 3, floats = 1, runaway = true, - water_damage = 0, - lava_damage = 4, - light_damage = 0, fall_damage = 0, fear_height = 4, sounds = { diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua index 7e465e8f5..9474c2b77 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mobs_mc/parrot.lua @@ -44,9 +44,6 @@ mobs:register_mob("mobs_mc:parrot", { --fly_end = 45, }, walk_chance = 100, - water_damage = 0, - lava_damage = 4, - light_damage = 0, fall_damage = 0, fall_speed = -2.25, attack_type = "dogfight", diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index 2b10c99be..472d8f771 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -25,9 +25,6 @@ mobs:register_mob("mobs_mc:pig", { min = 1, max = 3,}, }, - water_damage = 1, - lava_damage = 4, - light_damage = 0, fear_height = 4, sounds = { random = "mobs_pig", diff --git a/mods/ENTITIES/mobs_mc/polar_bear.lua b/mods/ENTITIES/mobs_mc/polar_bear.lua index 1db07e0f2..438ea3207 100644 --- a/mods/ENTITIES/mobs_mc/polar_bear.lua +++ b/mods/ENTITIES/mobs_mc/polar_bear.lua @@ -14,6 +14,7 @@ mobs:register_mob("mobs_mc:polar_bear", { stepheight = 1.2, hp_min = 30, hp_max = 30, + breath_max = -1, collisionbox = {-0.7, -0.01, -0.7, 0.7, 1.39, 0.7}, visual = "mesh", mesh = "mobs_mc_polarbear.b3d", @@ -41,10 +42,7 @@ mobs:register_mob("mobs_mc:polar_bear", { max = 2,}, }, - water_damage = 0, floats = 1, - lava_damage = 5, - light_damage = 0, fear_height = 4, -- TODO: sounds animation = { diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua index ea71d788e..8803b7546 100644 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ b/mods/ENTITIES/mobs_mc/rabbit.lua @@ -35,9 +35,6 @@ local rabbit = { -- TODO: Drop rabbit's foot when it's useful --{name = mobs_mc.items.rabbit_foot, chance = 10, min = 1, max = 1}, }, - water_damage = 1, - lava_damage = 4, - light_damage = 0, fear_height = 4, animation = { speed_normal = 25, speed_run = 50, diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index 2f069f85b..3d643ec89 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -67,9 +67,6 @@ mobs:register_mob("mobs_mc:sheep", { min = 1, max = 1,}, }, - water_damage = 1, - lava_damage = 4, - light_damage = 0, fear_height = 4, sounds = { random = "mobs_sheep", diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index b3cd3c6e4..28d60dd18 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -47,9 +47,6 @@ mobs:register_mob("mobs_mc:shulker", { blood_amount = 0, view_range = 16, fear_height = 4, - water_damage = 1, - lava_damage = 4, - light_damage = 0, }) -- bullet arrow (weapon) diff --git a/mods/ENTITIES/mobs_mc/silverfish.lua b/mods/ENTITIES/mobs_mc/silverfish.lua index 7f19d9a2c..5bd077a7c 100644 --- a/mods/ENTITIES/mobs_mc/silverfish.lua +++ b/mods/ENTITIES/mobs_mc/silverfish.lua @@ -29,9 +29,6 @@ mobs:register_mob("mobs_mc:silverfish", { walk_velocity = 0.6, run_velocity = 2, jump = true, - water_damage = 1, - lava_damage = 4, - light_damage = 0, fear_height = 4, replace_what = mobs_mc.replace.silverfish, replace_rate = 2, diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index 35cc9ed8c..128f60c82 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -15,6 +15,7 @@ local skeleton = { type = "monster", hp_min = 20, hp_max = 20, + breath_max = -1, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.98, 0.3}, pathfinding = 1, group_attack = true, @@ -73,8 +74,6 @@ local skeleton = { die_speed = 15, die_loop = false, }, - water_damage = 1, - lava_damage = 4, sunlight_damage = 1, view_range = 16, fear_height = 4, diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua index 16f353cee..8d8ebb3ba 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua @@ -13,6 +13,7 @@ mobs:register_mob("mobs_mc:witherskeleton", { type = "monster", hp_min = 20, hp_max = 20, + breath_max = -1, pathfinding = 1, group_attack = true, collisionbox = {-0.35, -0.01, -0.35, 0.35, 2.39, 0.35}, diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 4fbeea765..8cb9dc8cc 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -94,9 +94,6 @@ local slime_big = { death_start = 88, death_end = 118, }, - water_damage = 0, - lava_damage = 4, - light_damage = 0, fall_damage = 0, view_range = 16, attack_type = "dogfight", diff --git a/mods/ENTITIES/mobs_mc/spider.lua b/mods/ENTITIES/mobs_mc/spider.lua index 9ec7f44b9..f6ba05e42 100644 --- a/mods/ENTITIES/mobs_mc/spider.lua +++ b/mods/ENTITIES/mobs_mc/spider.lua @@ -46,9 +46,6 @@ local spider = { {name = mobs_mc.items.spider_eye, chance = 3, min = 1, max = 1,}, }, specific_attack = { "player", "mobs_mc:iron_golem" }, - water_damage = 0, - lava_damage = 4, - light_damage = 0, fear_height = 4, animation = { stand_speed = 10, diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua index b22ca08f4..28d2fe738 100644 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ b/mods/ENTITIES/mobs_mc/squid.lua @@ -45,12 +45,10 @@ mobs:register_mob("mobs_mc:squid", { stepheight = 0.1, fly = true, fly_in = { mobs_mc.items.water_source, mobs_mc.items.river_water_source }, + breathes_in_water = true, jump = false, fall_speed = 0.5, view_range = 16, - water_damage = 0, - lava_damage = 4, - light_damage = 0, runaway = true, fear_height = 4, blood_texture = "mobs_mc_squid_blood.png", diff --git a/mods/ENTITIES/mobs_mc/vex.lua b/mods/ENTITIES/mobs_mc/vex.lua index 692783e08..938e21987 100644 --- a/mods/ENTITIES/mobs_mc/vex.lua +++ b/mods/ENTITIES/mobs_mc/vex.lua @@ -84,9 +84,6 @@ mobs:register_mob("mobs_mc:vex", { end end end, - water_damage = 0, - lava_damage = 4, - light_damage = 0, fly = true, fly_in = {"air"}, }) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index e42cb690e..fe1ff5267 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -945,9 +945,6 @@ mobs:register_mob("mobs_mc:villager", { die_end = 220, die_loop = false, }, - water_damage = 0, - lava_damage = 4, - light_damage = 0, view_range = 16, fear_height = 4, jump = true, diff --git a/mods/ENTITIES/mobs_mc/villager_evoker.lua b/mods/ENTITIES/mobs_mc/villager_evoker.lua index 22af9d4b5..7bb48e729 100644 --- a/mods/ENTITIES/mobs_mc/villager_evoker.lua +++ b/mods/ENTITIES/mobs_mc/villager_evoker.lua @@ -74,9 +74,6 @@ mobs:register_mob("mobs_mc:evoker", { die_end = 200, die_loop = false, }, - water_damage = 0, - lava_damage = 4, - light_damage = 0, view_range = 16, fear_height = 4, }) diff --git a/mods/ENTITIES/mobs_mc/villager_illusioner.lua b/mods/ENTITIES/mobs_mc/villager_illusioner.lua index de4ee89d1..fe3efa8a8 100644 --- a/mods/ENTITIES/mobs_mc/villager_illusioner.lua +++ b/mods/ENTITIES/mobs_mc/villager_illusioner.lua @@ -48,7 +48,6 @@ mobs:register_mob("mobs_mc:illusioner", { }, view_range = 16, fear_height = 4, - lava_damage = 4, }) mobs:register_egg("mobs_mc:illusioner", S("Illusioner"), "mobs_mc_spawn_icon_illusioner.png", 0) diff --git a/mods/ENTITIES/mobs_mc/villager_vindicator.lua b/mods/ENTITIES/mobs_mc/villager_vindicator.lua index 9558074a7..a228aa560 100644 --- a/mods/ENTITIES/mobs_mc/villager_vindicator.lua +++ b/mods/ENTITIES/mobs_mc/villager_vindicator.lua @@ -61,9 +61,6 @@ mobs:register_mob("mobs_mc:vindicator", { die_end = 180, die_loop = false, }, - water_damage = 1, - lava_damage = 4, - light_damage = 0, view_range = 16, fear_height = 4, diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua index e23f86bb4..bc974277c 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua @@ -16,6 +16,7 @@ mobs:register_mob("mobs_mc:villager_zombie", { type = "monster", hp_min = 20, hp_max = 20, + breath_max = -1, armor = 90, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, visual = "mesh", @@ -71,8 +72,6 @@ mobs:register_mob("mobs_mc:villager_zombie", { run_start = 0, run_end = 20, }, - water_damage = 1, - lava_damage = 5, sunlight_damage = 1, view_range = 16, fear_height = 4, diff --git a/mods/ENTITIES/mobs_mc/witch.lua b/mods/ENTITIES/mobs_mc/witch.lua index 8e8d80252..db183e671 100644 --- a/mods/ENTITIES/mobs_mc/witch.lua +++ b/mods/ENTITIES/mobs_mc/witch.lua @@ -63,9 +63,6 @@ mobs:register_mob("mobs_mc:witch", { shoot_start = 50, shoot_end = 82, }, - water_damage = 1, - lava_damage = 5, - light_damage = 0, view_range = 16, fear_height = 4, diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 05431ce98..a6e6c70a5 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -48,9 +48,7 @@ mobs:register_mob("mobs_mc:wither", { min = 1, max = 1}, }, - water_damage = 0, lava_damage = 0, - light_damage = 0, attack_type = "dogshoot", explosion_radius = 3, explosion_fire = false, diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index b7e69864a..e8e5de1f7 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -45,9 +45,6 @@ local wolf = { reach = 2, attack_type = "dogfight", fear_height = 4, - water_damage = 0, - lava_damage = 4, - light_damage = 0, follow = mobs_mc.follow.wolf, on_rightclick = function(self, clicker) -- Try to tame wolf (intentionally does NOT use mobs:feed_tame) diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index f08d364d8..48e7fedf2 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -42,6 +42,7 @@ local zombie = { type = "monster", hp_min = 20, hp_max = 20, + breath_max = -1, armor = 90, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, visual = "mesh", @@ -99,7 +100,6 @@ mobs:register_mob("mobs_mc:baby_zombie", baby_zombie) local husk = table.copy(zombie) husk.textures = {{"mobs_mc_husk.png"}} husk.sunlight_damage = 0 -husk.water_damage = 3 husk.drops = drops_common -- TODO: Husks avoid water diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua index f21ea4faf..660346015 100644 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ b/mods/ENTITIES/mobs_mc/zombiepig.lua @@ -16,6 +16,7 @@ local pigman = { passive = false, hp_min = 20, hp_max = 20, + breath_max = -1, armor = 90, attack_type = "dogfight", group_attack = { "mobs_mc:pigman", "mobs_mc:baby_pigman" }, @@ -73,9 +74,7 @@ local pigman = { punch_start = 90, punch_end = 130, }, - water_damage = 1, lava_damage = 0, - light_damage = 0, fear_height = 4, view_range = 16, } From f9e46b914dd530df021661b6985a8340b0fddf2a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 2 Oct 2019 18:43:48 +0200 Subject: [PATCH 345/379] Mobs: Separate fire damage from lava damage --- mods/ENTITIES/mcl_mobs/api.lua | 24 ++++++++++++++++------ mods/ENTITIES/mcl_mobs/api.txt | 4 +++- mods/ENTITIES/mobs_mc/blaze.lua | 1 + mods/ENTITIES/mobs_mc/creeper.lua | 2 -- mods/ENTITIES/mobs_mc/ender_dragon.lua | 1 + mods/ENTITIES/mobs_mc/skeleton_wither.lua | 1 + mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 1 + mods/ENTITIES/mobs_mc/snowman.lua | 4 +--- mods/ENTITIES/mobs_mc/wither.lua | 1 + mods/ENTITIES/mobs_mc/zombie.lua | 1 - mods/ENTITIES/mobs_mc/zombiepig.lua | 1 + 11 files changed, 28 insertions(+), 13 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 4c34e3a54..9dd6cb6e5 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -712,7 +712,7 @@ local do_env_damage = function(self) pos.y = pos.y + 1 -- for particle effect position - -- water + -- water damage if self.water_damage and nodef.groups.water then @@ -720,14 +720,13 @@ local do_env_damage = function(self) self.health = self.health - self.water_damage - -- TODO: Damage particle - effect(pos, 5, "bubble.png", nil, nil, 1, nil) + effect(pos, 5, "tnt_smoke.png", nil, nil, 1, nil) if check_for_death(self, "water", {type = "environment", pos = pos, node = self.standing_in}) then return end end - -- lava + -- lava damage elseif self.lava_damage and (nodef.groups.lava) then @@ -735,19 +734,31 @@ local do_env_damage = function(self) self.health = self.health - self.lava_damage - -- TODO: Damage particle effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) if check_for_death(self, "lava", {type = "environment", pos = pos, node = self.standing_in}) then return end end + -- fire damage + elseif self.fire_damage + and (nodef.groups.fire) then + + if self.fire_damage ~= 0 then + + self.health = self.health - self.fire_damage + + effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) + + if check_for_death(self, "fire", {type = "environment", + pos = pos, node = self.standing_in}) then return end + end + -- damage_per_second node check elseif nodef.damage_per_second ~= 0 then self.health = self.health - nodef.damage_per_second - -- TODO: Damage particle effect(pos, 5, "tnt_smoke.png") if check_for_death(self, "dps", {type = "environment", @@ -3132,6 +3143,7 @@ minetest.register_entity(name, { sunlight_damage = def.sunlight_damage or 0, water_damage = def.water_damage or 0, lava_damage = def.lava_damage or 8, + fire_damage = def.fire_damage or 1, suffocation = def.suffocation or true, fall_damage = def.fall_damage or 1, fall_speed = def.fall_speed or -10, -- must be lower than -2 (default: -10) diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 283bc6a23..70ce89ffc 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -61,9 +61,11 @@ functions needed for the mob to work properly which contains the following: 'fall_speed' has the maximum speed the mob can fall at, default is -10. 'fall_damage' when true causes falling to inflict damage. 'water_damage' holds the damage per second infliced to mobs when standing in - water. + water (default: 0). 'lava_damage' holds the damage per second inflicted to mobs when standing in lava (default: 8). + 'fire_damage' holds the damage per second inflicted to mobs when standing + in fire (default: 1). 'light_damage' holds the damage per second inflicted to mobs when it's too bright (above 13 light). 'suffocation' when true causes mobs to suffocate inside solid blocks (2 damage per second). diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 421a90d4b..0af669139 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -53,6 +53,7 @@ mobs:register_mob("mobs_mc:blaze", { -- MC Wiki: takes 1 damage every half second while in water water_damage = 2, lava_damage = 0, + fire_damage = 0, fall_damage = 0, fall_speed = -2.25, light_damage = 0, diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 77737997c..184d9cbe1 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -114,8 +114,6 @@ mobs:register_mob("mobs_mc:creeper", { }, floats = 1, fear_height = 4, - lava_damage = 4, - light_damage = 0, view_range = 16, blood_amount = 0, }) diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index fd5543aea..0653c6d0a 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -48,6 +48,7 @@ mobs:register_mob("mobs_mc:enderdragon", { max = 1}, }, lava_damage = 0, + fire_damage = 0, on_rightclick = nil, attack_type = "dogshoot", arrow = "mobs_mc:fireball2", diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua index 8d8ebb3ba..1816b177c 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua @@ -75,6 +75,7 @@ mobs:register_mob("mobs_mc:witherskeleton", { }, water_damage = 0, lava_damage = 0, + fire_damage = 0, light_damage = 0, view_range = 16, attack_type = "dogfight", diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 8cb9dc8cc..f3f6ba4a8 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -201,6 +201,7 @@ local magma_cube_big = { }, water_damage = 0, lava_damage = 0, + fire_damage = 0, light_damage = 0, fall_damage = 0, view_range = 16, diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua index f0f8fc4fb..c238925e3 100644 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ b/mods/ENTITIES/mobs_mc/snowman.lua @@ -28,7 +28,7 @@ mobs:register_mob("mobs_mc:snowman", { view_range = 10, fall_damage = 0, water_damage = 4, - lava_damage = 20, + rain_damage = 4, attacks_monsters = true, collisionbox = {-0.35, -0.01, -0.35, 0.35, 1.89, 0.35}, visual = "mesh", @@ -119,8 +119,6 @@ mobs:register_mob("mobs_mc:snowman", { end end end, - - rain_damage = 4, }) -- This is to be called when a pumpkin or jack'o lantern has been placed. Recommended: In the on_construct function diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index a6e6c70a5..547abd75c 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -49,6 +49,7 @@ mobs:register_mob("mobs_mc:wither", { max = 1}, }, lava_damage = 0, + fire_damage = 0, attack_type = "dogshoot", explosion_radius = 3, explosion_fire = false, diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index 48e7fedf2..d75489888 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -75,7 +75,6 @@ local zombie = { walk_start = 0, walk_end = 40, run_start = 0, run_end = 40, }, - lava_damage = 4, sunlight_damage = 2, view_range = 16, attack_type = "dogfight", diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua index 660346015..77bd0e196 100644 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ b/mods/ENTITIES/mobs_mc/zombiepig.lua @@ -75,6 +75,7 @@ local pigman = { punch_end = 130, }, lava_damage = 0, + fire_damage = 0, fear_height = 4, view_range = 16, } From aae360db4c3be2c9f91b6295739d35a26dae394a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 2 Oct 2019 18:57:06 +0200 Subject: [PATCH 346/379] Remove spawn icon for unused agent mob --- .../mobs_mc/textures/mobs_mc_spawn_icon_agent.png | Bin 417 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_agent.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_agent.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_agent.png deleted file mode 100644 index 08e0688915ca513a0bcacecb9c8f58f37bd34acd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 417 zcmV;S0bc%zP)1923`2e3aT2ta^R1i}DYF*=vRRx>Ce1em}gnA-v> zlC9zXfJ0Xo!vRP83(f@$`t+V#GGccZ8~5>b-roCq-@E&r6@;9eNzCVOG7DhWt6$;|C9tw3qYr`-YVZe#z4mdy9ylUAJ1rnCeD*u6Xibw5hD8n7FRkerQ16z@&65T?uGN|iu649msW8HT6D9eBdlqJIQ)_)V z48AaTfMr=P!t8Botq+I65>f?l9Sb_r+Vi|r0ppmz1Ac7(Mo!Kb9DKko!6)8u00000 LNkvXXu0mjf$>O$L From 200cbf033a11fabe025817caaa7b5b2ee6da8eb3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 2 Oct 2019 18:58:29 +0200 Subject: [PATCH 347/379] Set walk chance of agent mob to 0 --- mods/ENTITIES/mobs_mc/agent.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ENTITIES/mobs_mc/agent.lua b/mods/ENTITIES/mobs_mc/agent.lua index cc4bc0dad..0a5f0354f 100644 --- a/mods/ENTITIES/mobs_mc/agent.lua +++ b/mods/ENTITIES/mobs_mc/agent.lua @@ -19,6 +19,7 @@ mobs:register_mob("mobs_mc:agent", { }, -- TODO: sounds visual_size = {x=3, y=3}, + walk_chance = 0, walk_velocity = 0.6, run_velocity = 2, jump = true, From 041839fd1a51088d96b21b8996c825bd51c05ebd Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 2 Oct 2019 19:06:55 +0200 Subject: [PATCH 348/379] Update falling node when anvil got destroyed --- mods/ITEMS/mcl_anvils/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index 45e271828..b2608cd88 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -228,6 +228,7 @@ local function damage_anvil(pos) drop_anvil_items(pos, meta) minetest.sound_play(mcl_sounds.node_sound_metal_defaults().dug, {pos=pos, max_hear_distance=16}) minetest.remove_node(pos) + minetest.check_single_for_falling({x=pos.x, y=pos.y+1, z=pos.z}) return true end end From a9ed14c4af5733a036c21954bee6522450eb9aed Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 2 Oct 2019 20:51:02 +0200 Subject: [PATCH 349/379] Fix boats moving too fast backwards --- mods/ENTITIES/mcl_boats/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index f5c149408..4b3cf82f3 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -213,9 +213,9 @@ function boat.on_step(self, dtime) end local s = get_sign(self._v) if not on_water and not in_water and math.abs(self._v) > 0.25 then - v_slowdown = math.min(self._v - 0.25, v_slowdown * 5) + v_slowdown = math.min(math.abs(self._v) - 0.25, v_slowdown * 5) elseif in_water and math.abs(self._v) > 0.5 then - v_slowdown = math.min(self._v - 0.5, v_slowdown * 5) + v_slowdown = math.min(math.abs(self._v) - 0.5, v_slowdown * 5) end self._v = self._v - v_slowdown * s if s ~= get_sign(self._v) then From 4a7aaa902456b20df2e59754a8034e98234256da Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 2 Oct 2019 20:53:47 +0200 Subject: [PATCH 350/379] Increase boat speed on land --- mods/ENTITIES/mcl_boats/init.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index 4b3cf82f3..9999b2b75 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -212,10 +212,10 @@ function boat.on_step(self, dtime) end end local s = get_sign(self._v) - if not on_water and not in_water and math.abs(self._v) > 0.25 then - v_slowdown = math.min(math.abs(self._v) - 0.25, v_slowdown * 5) - elseif in_water and math.abs(self._v) > 0.5 then - v_slowdown = math.min(math.abs(self._v) - 0.5, v_slowdown * 5) + if not on_water and not in_water and math.abs(self._v) > 1.0 then + v_slowdown = math.min(math.abs(self._v) - 1.0, v_slowdown * 5) + elseif in_water and math.abs(self._v) > 1.5 then + v_slowdown = math.min(math.abs(self._v) - 1.5, v_slowdown * 5) end self._v = self._v - v_slowdown * s if s ~= get_sign(self._v) then From b3e1df7e9b374bde37492a72c23ee9b4efe5a8c3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 2 Oct 2019 21:18:29 +0200 Subject: [PATCH 351/379] Round pos in spawnstruct chatcommand --- mods/MAPGEN/mcl_structures/init.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index 26fd7b2cc..132c70896 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -463,10 +463,11 @@ minetest.register_chatcommand("spawnstruct", { description = S("Generate a pre-defined structure near your position."), privs = {debug = true}, func = function(name, param) - local pos= minetest.get_player_by_name(name):get_pos() + local pos = minetest.get_player_by_name(name):get_pos() if not pos then return end + pos = vector.round(pos) local errord = false local message = S("Structure placed.") if param == "village" then From da149d5a587eca29d78190ce34e661ab5d87be0d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 2 Oct 2019 22:06:26 +0200 Subject: [PATCH 352/379] Apply more checks in igloo basement generation --- mods/MAPGEN/mcl_structures/init.lua | 33 ++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index 132c70896..0c01a7881 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -78,16 +78,23 @@ end mcl_structures.generate_igloo = function(pos) -- TODO: Check if we're allowed to destroy nodes - -- FIXME: Some nodes (water, ice) don't get overwritten by ladder - -- FIXME: Nodes at Y=0 don't get overwritten by ladder - -- FIXME: Apply basement height limit in other dimensions -- TODO: Check if basement generation would not be too obvious -- TODO: Generate basement with 50% chance only local success, rotation = mcl_structures.generate_igloo_top(pos) if success then - local buffer = pos.y - (mcl_vars.mg_lava_overworld_max + 10) + local dim = mcl_worlds.pos_to_dimension(pos) + buffer = pos.y - (mcl_vars.mg_lava_overworld_max + 10) + if dim == "nether" then + buffer = pos.y - (mcl_vars.mg_lava_nether_max + 10) + elseif dim == "end" then + buffer = pos.y - (mcl_vars.mg_end_min + 1) + elseif dim == "overworld" then + buffer = pos.y - (mcl_vars.mg_lava_overworld_max + 10) + else + return success + end if buffer <= 19 then - return + return success end local depth = math.random(19, buffer) local bpos = {x=pos.x, y=pos.y-depth, z=pos.z} @@ -113,8 +120,6 @@ mcl_structures.generate_igloo = function(pos) else return success end - -- TODO: more reliable param2 - minetest.set_node(tpos, {name="mcl_doors:trapdoor", param2=20+minetest.dir_to_facedir(dir)}) local set_brick = function(pos) local c = math.random(1, 3) -- cracked chance local m = math.random(1, 10) -- chance for monster egg @@ -135,14 +140,26 @@ mcl_structures.generate_igloo = function(pos) minetest.set_node(pos, {name=brick}) end local ladder_param2 = minetest.dir_to_wallmounted(tdir) + local real_depth = 0 for y=1, depth-5 do + real_depth = real_depth + 1 + local node = minetest.get_node({x=tpos.x,y=tpos.y-y,z=tpos.z}) + local def = minetest.registered_nodes[node.name] + if (not def) or (not def.walkable) or (def.liquidtype ~= "none") then + bpos.y = tpos.y-y-4 + break + end set_brick({x=tpos.x-1,y=tpos.y-y,z=tpos.z }) set_brick({x=tpos.x+1,y=tpos.y-y,z=tpos.z }) set_brick({x=tpos.x ,y=tpos.y-y,z=tpos.z-1}) set_brick({x=tpos.x ,y=tpos.y-y,z=tpos.z+1}) minetest.set_node({x=tpos.x,y=tpos.y-y,z=tpos.z}, {name="mcl_core:ladder", param2=ladder_param2}) end - mcl_structures.generate_igloo_basement(bpos, rotation) + if real_depth > 1 then + -- TODO: more reliable param2 + minetest.set_node(tpos, {name="mcl_doors:trapdoor", param2=20+minetest.dir_to_facedir(dir)}) + mcl_structures.generate_igloo_basement(bpos, rotation) + end end return success end From 5198f5cdecdde1f69ece8e6a31878a58fa1c69b5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 2 Oct 2019 22:29:25 +0200 Subject: [PATCH 353/379] More igloo basement placement tweaks --- mods/MAPGEN/mcl_structures/init.lua | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index 0c01a7881..786f156fe 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -80,8 +80,11 @@ mcl_structures.generate_igloo = function(pos) -- TODO: Check if we're allowed to destroy nodes -- TODO: Check if basement generation would not be too obvious -- TODO: Generate basement with 50% chance only + -- Place igloo local success, rotation = mcl_structures.generate_igloo_top(pos) + -- Generate optional basement if success then + -- Select basement depth local dim = mcl_worlds.pos_to_dimension(pos) buffer = pos.y - (mcl_vars.mg_lava_overworld_max + 10) if dim == "nether" then @@ -141,25 +144,31 @@ mcl_structures.generate_igloo = function(pos) end local ladder_param2 = minetest.dir_to_wallmounted(tdir) local real_depth = 0 + -- Check how deep we can actuall dig for y=1, depth-5 do real_depth = real_depth + 1 local node = minetest.get_node({x=tpos.x,y=tpos.y-y,z=tpos.z}) local def = minetest.registered_nodes[node.name] if (not def) or (not def.walkable) or (def.liquidtype ~= "none") then - bpos.y = tpos.y-y-4 + bpos.y = tpos.y-y+1 break end + end + if real_depth <= 6 then + return success + end + -- Place hidden trapdoor + minetest.set_node(tpos, {name="mcl_doors:trapdoor", param2=20+minetest.dir_to_facedir(dir)}) -- TODO: more reliable param2 + -- Generate ladder to basement + for y=1, real_depth-5 do set_brick({x=tpos.x-1,y=tpos.y-y,z=tpos.z }) set_brick({x=tpos.x+1,y=tpos.y-y,z=tpos.z }) set_brick({x=tpos.x ,y=tpos.y-y,z=tpos.z-1}) set_brick({x=tpos.x ,y=tpos.y-y,z=tpos.z+1}) minetest.set_node({x=tpos.x,y=tpos.y-y,z=tpos.z}, {name="mcl_core:ladder", param2=ladder_param2}) end - if real_depth > 1 then - -- TODO: more reliable param2 - minetest.set_node(tpos, {name="mcl_doors:trapdoor", param2=20+minetest.dir_to_facedir(dir)}) - mcl_structures.generate_igloo_basement(bpos, rotation) - end + -- Place basement + mcl_structures.generate_igloo_basement(bpos, rotation) end return success end From 332236645726d86dad6193390c27d4900ec5cb5d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 2 Oct 2019 22:31:19 +0200 Subject: [PATCH 354/379] Enable igloo basements with 50% chance --- mods/MAPGEN/mcl_structures/init.lua | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index 786f156fe..bb51004ae 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -44,7 +44,7 @@ mcl_structures.call_struct = function(pos, struct_style, rotation) elseif struct_style == "desert_well" then return mcl_structures.generate_desert_well(pos, rotation) elseif struct_style == "igloo" then - return mcl_structures.generate_igloo_top(pos, rotation) + return mcl_structures.generate_igloo(pos, rotation) elseif struct_style == "witch_hut" then return mcl_structures.generate_witch_hut(pos, rotation) elseif struct_style == "ice_spike_small" then @@ -77,13 +77,11 @@ mcl_structures.generate_desert_well = function(pos) end mcl_structures.generate_igloo = function(pos) - -- TODO: Check if we're allowed to destroy nodes - -- TODO: Check if basement generation would not be too obvious - -- TODO: Generate basement with 50% chance only -- Place igloo local success, rotation = mcl_structures.generate_igloo_top(pos) - -- Generate optional basement - if success then + -- Place igloo basement with 50% chance + local r = math.random(1,2) + if success and r == 1 then -- Select basement depth local dim = mcl_worlds.pos_to_dimension(pos) buffer = pos.y - (mcl_vars.mg_lava_overworld_max + 10) @@ -149,7 +147,7 @@ mcl_structures.generate_igloo = function(pos) real_depth = real_depth + 1 local node = minetest.get_node({x=tpos.x,y=tpos.y-y,z=tpos.z}) local def = minetest.registered_nodes[node.name] - if (not def) or (not def.walkable) or (def.liquidtype ~= "none") then + if (not def) or (not def.walkable) or (def.liquidtype ~= "none") or (not def.is_ground_content) then bpos.y = tpos.y-y+1 break end @@ -160,7 +158,7 @@ mcl_structures.generate_igloo = function(pos) -- Place hidden trapdoor minetest.set_node(tpos, {name="mcl_doors:trapdoor", param2=20+minetest.dir_to_facedir(dir)}) -- TODO: more reliable param2 -- Generate ladder to basement - for y=1, real_depth-5 do + for y=1, real_depth-1 do set_brick({x=tpos.x-1,y=tpos.y-y,z=tpos.z }) set_brick({x=tpos.x+1,y=tpos.y-y,z=tpos.z }) set_brick({x=tpos.x ,y=tpos.y-y,z=tpos.z-1}) @@ -504,7 +502,7 @@ minetest.register_chatcommand("spawnstruct", { elseif param == "desert_well" then mcl_structures.generate_desert_well(pos) elseif param == "igloo" then - mcl_structures.generate_igloo_top(pos) + mcl_structures.generate_igloo(pos) elseif param == "witch_hut" then mcl_structures.generate_witch_hut(pos) elseif param == "boulder" then From 5bd19c03f6e9e7521f48b41114b421da9f14407b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 3 Oct 2019 00:00:25 +0200 Subject: [PATCH 355/379] Wither no longer floats in water --- mods/ENTITIES/mobs_mc/wither.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 547abd75c..db936853e 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -41,7 +41,6 @@ mobs:register_mob("mobs_mc:wither", { dogshoot_switch = 1, dogshoot_count_max =1, attack_animals = true, - floats=1, drops = { {name = mobs_mc.items.nether_star, chance = 1, From d9424ad82e6fc6ddcd9601dab230fe421f535633 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 3 Oct 2019 11:53:26 +0200 Subject: [PATCH 356/379] Make dmg particles proportional to dmg --- mods/ENTITIES/mcl_mobs/api.lua | 70 +++++++++++++++-------- mods/ENTITIES/mcl_mobs/api.txt | 2 - mods/ENTITIES/mobs_mc/blaze.lua | 1 - mods/ENTITIES/mobs_mc/creeper.lua | 1 - mods/ENTITIES/mobs_mc/ender_dragon.lua | 1 - mods/ENTITIES/mobs_mc/enderman.lua | 1 - mods/ENTITIES/mobs_mc/endermite.lua | 1 - mods/ENTITIES/mobs_mc/ghast.lua | 1 - mods/ENTITIES/mobs_mc/guardian.lua | 1 - mods/ENTITIES/mobs_mc/guardian_elder.lua | 1 - mods/ENTITIES/mobs_mc/horse.lua | 1 - mods/ENTITIES/mobs_mc/iron_golem.lua | 1 - mods/ENTITIES/mobs_mc/shulker.lua | 1 - mods/ENTITIES/mobs_mc/silverfish.lua | 1 - mods/ENTITIES/mobs_mc/skeleton+stray.lua | 1 - mods/ENTITIES/mobs_mc/skeleton_wither.lua | 1 - mods/ENTITIES/mobs_mc/snowman.lua | 1 - mods/ENTITIES/mobs_mc/spider.lua | 1 - mods/ENTITIES/mobs_mc/wither.lua | 1 - 19 files changed, 45 insertions(+), 44 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 9dd6cb6e5..2b6109128 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -375,20 +375,28 @@ end -- custom particle effects -local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow) +local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow, go_down) radius = radius or 2 min_size = min_size or 0.5 max_size = max_size or 1 gravity = gravity or -10 glow = glow or 0 + go_down = go_down or false + + local ym + if go_down then + ym = 0 + else + ym = -radius + end minetest.add_particlespawner({ amount = amount, time = 0.25, minpos = pos, maxpos = pos, - minvel = {x = -radius, y = -radius, z = -radius}, + minvel = {x = -radius, y = ym, z = -radius}, maxvel = {x = radius, y = radius, z = radius}, minacc = {x = 0, y = gravity, z = 0}, maxacc = {x = 0, y = gravity, z = 0}, @@ -401,6 +409,35 @@ local effect = function(pos, amount, texture, min_size, max_size, radius, gravit }) end +local damage_effect = function(self, damage) + -- damage particles + if (not disable_blood) and damage > 0 then + + local amount_large = math.floor(damage / 2) + local amount_small = damage % 2 + + local pos = self.object:get_pos() + + pos.y = pos.y + (self.collisionbox[5] - self.collisionbox[2]) * .5 + + local texture + -- do we have a single blood texture or multiple? + if type(self.blood_texture) == "table" then + texture = self.blood_texture[random(1, #self.blood_texture)] + else + texture = self.blood_texture + end + -- full heart damage (one particle for each 2 HP damage) + if amount_large > 0 then + effect(pos, amount_large, texture, 2, 2, 1.75, 0, nil, true) + end + -- half heart damage (one additional particle if damage is an odd number) + if amount_small > 0 then + -- TODO: Use "half heart" + effect(pos, amount_small, texture, 1, 1, 1.75, 0, nil, true) + end + end +end local update_tag = function(self) self.object:set_properties({ @@ -781,13 +818,14 @@ local do_env_damage = function(self) effect(pos, 2, "bubble.png", nil, nil, 1, nil) if self.breath <= 0 then - -- TODO: Damage particle - effect(pos, 5, "bubble.png", nil, nil, 1, nil) + local dmg if nodef.drowning > 0 then - self.health = self.health - nodef.drowning + dmg = nodef.drowning else - self.health = self.health - 4 + dmg = 4 end + damage_effect(self, dmg) + self.health = self.health - dmg end if check_for_death(self, "drowning", {type = "environment", pos = pos, node = self.standing_in}) then return end @@ -2540,24 +2578,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) }) end - -- blood_particles - if self.blood_amount > 0 - and not disable_blood then - - local pos = self.object:get_pos() - - pos.y = pos.y + (-self.collisionbox[2] + self.collisionbox[5]) * .5 - - -- do we have a single blood texture or multiple? - if type(self.blood_texture) == "table" then - - local blood = self.blood_texture[random(1, #self.blood_texture)] - - effect(pos, self.blood_amount, blood, nil, nil, 1, nil) - else - effect(pos, self.blood_amount, self.blood_texture, nil, nil, 1, nil) - end - end + damage_effect(self, damage) -- do damage self.health = self.health - floor(damage) @@ -3161,7 +3182,6 @@ minetest.register_entity(name, { group_attack = def.group_attack or false, passive = def.passive or false, knock_back = def.knock_back ~= false, - blood_amount = def.blood_amount or 5, blood_texture = def.blood_texture or "mobs_blood.png", shoot_offset = def.shoot_offset or 0, floats = def.floats or 1, -- floats in water by default diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 70ce89ffc..3ae95dc5d 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -123,8 +123,6 @@ functions needed for the mob to work properly which contains the following: e.g. {"player", "mobs_animal:chicken"}. 'runaway_from' contains a table with mob names to run away from, add "player" to list to runaway from player also. - 'blood_amount' contains the number of blood droplets to appear when - mob is hit. 'blood_texture' has the texture name to use for droplets e.g. "mobs_blood.png", or table {"blood1.png", "blood2.png"} 'pathfinding' set to 1 for mobs to use pathfinder feature to locate diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 0af669139..400a5339f 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -67,7 +67,6 @@ mobs:register_mob("mobs_mc:blaze", { fly = true, jump_chance = 98, fear_height = 0, - blood_amount = 0, glow = 14, }) diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 184d9cbe1..07750ff28 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -115,7 +115,6 @@ mobs:register_mob("mobs_mc:creeper", { floats = 1, fear_height = 4, view_range = 16, - blood_amount = 0, }) diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index 0653c6d0a..ccd2fe30d 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -60,7 +60,6 @@ mobs:register_mob("mobs_mc:enderdragon", { walk_start = 0, walk_end = 20, run_start = 0, run_end = 20, }, - blood_amount = 0, ignores_nametag = true, }) diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index ad74768be..124a2c9df 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -325,7 +325,6 @@ mobs:register_mob("mobs_mc:enderman", { view_range = 4, fear_height = 4, attack_type = "dogfight", - blood_amount = 0, }) diff --git a/mods/ENTITIES/mobs_mc/endermite.lua b/mods/ENTITIES/mobs_mc/endermite.lua index ebec262da..5a9793cd4 100644 --- a/mods/ENTITIES/mobs_mc/endermite.lua +++ b/mods/ENTITIES/mobs_mc/endermite.lua @@ -31,7 +31,6 @@ mobs:register_mob("mobs_mc:endermite", { view_range = 16, damage = 2, reach = 1, - blood_amount = 0, }) mobs:register_egg("mobs_mc:endermite", S("Endermite"), "mobs_mc_spawn_icon_endermite.png", 0) diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index f840653c8..fe14e0e6e 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -71,7 +71,6 @@ mobs:register_mob("mobs_mc:ghast", { fly = true, fly_in = {"air"}, jump_chance = 98, - blood_amount = 0, }) diff --git a/mods/ENTITIES/mobs_mc/guardian.lua b/mods/ENTITIES/mobs_mc/guardian.lua index 24d0ebd08..503417d21 100644 --- a/mods/ENTITIES/mobs_mc/guardian.lua +++ b/mods/ENTITIES/mobs_mc/guardian.lua @@ -77,7 +77,6 @@ mobs:register_mob("mobs_mc:guardian", { stepheight = 0.1, jump = false, view_range = 16, - blood_amount = 0, }) mobs:spawn_specific("mobs_mc:guardian", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 25000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water - 10) diff --git a/mods/ENTITIES/mobs_mc/guardian_elder.lua b/mods/ENTITIES/mobs_mc/guardian_elder.lua index f3799baff..61f5097d4 100644 --- a/mods/ENTITIES/mobs_mc/guardian_elder.lua +++ b/mods/ENTITIES/mobs_mc/guardian_elder.lua @@ -82,7 +82,6 @@ mobs:register_mob("mobs_mc:guardian_elder", { stepheight = 0.1, jump = false, view_range = 16, - blood_amount = 0, }) mobs:spawn_specific("mobs_mc:guardian_elder", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 40000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water-18) diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index d51a1c660..7eea999ad 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -336,7 +336,6 @@ skeleton_horse.sounds = { damage = "mobs_mc_skeleton_hurt", distance = 16, } -skeleton_horse.blood_amount = 0 mobs:register_mob("mobs_mc:skeleton_horse", skeleton_horse) -- Zombie horse diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mobs_mc/iron_golem.lua index 95a088dec..046c655ac 100644 --- a/mods/ENTITIES/mobs_mc/iron_golem.lua +++ b/mods/ENTITIES/mobs_mc/iron_golem.lua @@ -58,7 +58,6 @@ mobs:register_mob("mobs_mc:iron_golem", { punch_start = 40, punch_end = 50, }, jump = true, - blood_amount = 0, }) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 28d60dd18..0a06fe89c 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -44,7 +44,6 @@ mobs:register_mob("mobs_mc:shulker", { run_start = 0, run_end = 45, punch_start = 80, punch_end = 100, }, - blood_amount = 0, view_range = 16, fear_height = 4, }) diff --git a/mods/ENTITIES/mobs_mc/silverfish.lua b/mods/ENTITIES/mobs_mc/silverfish.lua index 5bd077a7c..f2c111987 100644 --- a/mods/ENTITIES/mobs_mc/silverfish.lua +++ b/mods/ENTITIES/mobs_mc/silverfish.lua @@ -42,7 +42,6 @@ mobs:register_mob("mobs_mc:silverfish", { attack_type = "dogfight", damage = 1, reach = 1, - blood_amount = 0, }) mobs:register_egg("mobs_mc:silverfish", S("Silverfish"), "mobs_mc_spawn_icon_silverfish.png", 0) diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index 128f60c82..04d402d8d 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -83,7 +83,6 @@ local skeleton = { shoot_offset = 1, dogshoot_switch = 1, dogshoot_count_max =1.8, - blood_amount = 0, } mobs:register_mob("mobs_mc:skeleton", skeleton) diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua index 1816b177c..896df69a8 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua @@ -81,7 +81,6 @@ mobs:register_mob("mobs_mc:witherskeleton", { attack_type = "dogfight", dogshoot_switch = 1, dogshoot_count_max =0.5, - blood_amount = 0, fear_height = 4, }) diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua index c238925e3..48143b449 100644 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ b/mods/ENTITIES/mobs_mc/snowman.lua @@ -69,7 +69,6 @@ mobs:register_mob("mobs_mc:snowman", { die_speed = 25, die_loop = false, }, - blood_amount = 0, do_custom = function(self, dtime) if not mobs_griefing then return diff --git a/mods/ENTITIES/mobs_mc/spider.lua b/mods/ENTITIES/mobs_mc/spider.lua index f6ba05e42..5a353c886 100644 --- a/mods/ENTITIES/mobs_mc/spider.lua +++ b/mods/ENTITIES/mobs_mc/spider.lua @@ -58,7 +58,6 @@ local spider = { run_start = 0, run_end = 20, }, - blood_amount = 0, } mobs:register_mob("mobs_mc:spider", spider) diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index db936853e..871496d00 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -63,7 +63,6 @@ mobs:register_mob("mobs_mc:wither", { walk_start = 0, walk_end = 20, run_start = 0, run_end = 20, }, - blood_amount = 0, }) local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false From 8b9ac5c6a6944da58448bc830b70412fd9d345f2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 3 Oct 2019 12:03:36 +0200 Subject: [PATCH 357/379] Remove custom damage particles --- mods/ENTITIES/mcl_mobs/api.lua | 9 +-------- mods/ENTITIES/mcl_mobs/api.txt | 2 -- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 2 -- mods/ENTITIES/mobs_mc/squid.lua | 1 - .../mobs_mc/textures/mobs_mc_magmacube_blood.png | Bin 86 -> 0 bytes .../mobs_mc/textures/mobs_mc_slime_blood.png | Bin 86 -> 0 bytes .../mobs_mc/textures/mobs_mc_squid_blood.png | Bin 82 -> 0 bytes 7 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_magmacube_blood.png delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_slime_blood.png delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_squid_blood.png diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 2b6109128..21a6b39d8 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -420,13 +420,7 @@ local damage_effect = function(self, damage) pos.y = pos.y + (self.collisionbox[5] - self.collisionbox[2]) * .5 - local texture - -- do we have a single blood texture or multiple? - if type(self.blood_texture) == "table" then - texture = self.blood_texture[random(1, #self.blood_texture)] - else - texture = self.blood_texture - end + local texture = "mobs_blood.png" -- full heart damage (one particle for each 2 HP damage) if amount_large > 0 then effect(pos, amount_large, texture, 2, 2, 1.75, 0, nil, true) @@ -3182,7 +3176,6 @@ minetest.register_entity(name, { group_attack = def.group_attack or false, passive = def.passive or false, knock_back = def.knock_back ~= false, - blood_texture = def.blood_texture or "mobs_blood.png", shoot_offset = def.shoot_offset or 0, floats = def.floats or 1, -- floats in water by default replace_rate = def.replace_rate, diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 3ae95dc5d..0373b369d 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -123,8 +123,6 @@ functions needed for the mob to work properly which contains the following: e.g. {"player", "mobs_animal:chicken"}. 'runaway_from' contains a table with mob names to run away from, add "player" to list to runaway from player also. - 'blood_texture' has the texture name to use for droplets e.g. - "mobs_blood.png", or table {"blood1.png", "blood2.png"} 'pathfinding' set to 1 for mobs to use pathfinder feature to locate player, set to 2 so they can build/break also (only works with dogfight attack and when 'mobs_griefing' diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index f3f6ba4a8..004864991 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -66,7 +66,6 @@ local slime_big = { textures = {{"mobs_mc_slime.png"}}, visual = "mesh", mesh = "mobs_mc_slime.b3d", - blood_texture ="mobs_mc_slime_blood.png", makes_footstep_sound = true, sounds = { jump = "green_slime_jump", @@ -165,7 +164,6 @@ local magma_cube_big = { textures = {{ "mobs_mc_magmacube.png" }}, visual = "mesh", mesh = "mobs_mc_magmacube.b3d", - blood_texture = "mobs_mc_magmacube_blood.png", makes_footstep_sound = true, sounds = { jump = "mobs_mc_magma_cube_big", diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua index 28d2fe738..d2a45f444 100644 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ b/mods/ENTITIES/mobs_mc/squid.lua @@ -51,7 +51,6 @@ mobs:register_mob("mobs_mc:squid", { view_range = 16, runaway = true, fear_height = 4, - blood_texture = "mobs_mc_squid_blood.png", }) -- TODO: Behaviour: squirt diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_magmacube_blood.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_magmacube_blood.png deleted file mode 100644 index 46b699beeb1bf12a959127b8010342b1c98d2a7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|vYsxEAr*|t71I@*gqSiTl+XIA iNM-OYmU1(l(89nP_W9r!bE8_ILIzJ)KbLh*2~7aY6cj%I diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_slime_blood.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_slime_blood.png deleted file mode 100644 index 29e94a0e55d2cf72b5f5fbb5a9c8a47e0473ed1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|vYsxEAr*|t0iU)gayFVA(eG0b i;@#2~$h%m|!---2X9F1xf&B?Ug$$mqelF{r5}E+(YZQ$D diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_squid_blood.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_squid_blood.png deleted file mode 100644 index a991d65d54ee0c903497b78d82b7677ca4ef3e77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|lAbP(Ar*|t0qTMcCNqS1*}@L5 eXba?3VPYsnTQ5re0zpUXO@geCxQ Date: Thu, 3 Oct 2019 12:04:30 +0200 Subject: [PATCH 358/379] Rename dmg particle setting --- mods/ENTITIES/mcl_mobs/api.txt | 2 +- settingtypes.txt | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 0373b369d..ba4e92d21 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -592,7 +592,7 @@ External Settings for "minetest.conf" 'enable_damage' if true monsters will attack players (default is true) 'only_peaceful_mobs' if true only animals will spawn in game (default is false) - 'mobs_disable_blood' if false blood effects appear when mob is hit (default + 'mobs_disable_blood' if false, damage effects appear when mob is hit (default is false) 'mobs_spawn_protected' if set to false then mobs will not spawn in protected areas (default is true) diff --git a/settingtypes.txt b/settingtypes.txt index f30ae36ec..2c3eae7a5 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -70,9 +70,8 @@ mobs_drop_items (Mobs drop items) bool true # If enabled, mobs can take, place, change and destroy blocks around them. mobs_griefing (Mobs change blocks) bool true -# If enable, mobs won't bleed or emit other damage particles when -# they got hurt. -mobs_disable_blood (Disable mob blood) bool false +# If enable, mobs won't damage particles when they got hurt. +mobs_disable_blood (Disable mob damage particles) bool false [Audio] # Enable flame sound. From 0e733f1677a63008d3f2a086e2db8b4243a68062 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 3 Oct 2019 12:12:50 +0200 Subject: [PATCH 359/379] Fix outdated mob settings help --- mods/ENTITIES/mcl_mobs/api.lua | 2 +- mods/ENTITIES/mcl_mobs/api.txt | 10 ++-------- settingtypes.txt | 2 +- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 21a6b39d8..5533ac085 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -3141,7 +3141,7 @@ minetest.register_entity(name, { lifetimer = def.lifetimer or 57.73, hp_min = scale_difficulty(def.hp_min, 5, 1), hp_max = scale_difficulty(def.hp_max, 10, 1), - breath_max = scale_difficulty(def.breath_max, 15, 1, -1), + breath_max = def.breath_max or 15, breathes_in_water = def.breathes_in_water or false, physical = true, collisionbox = def.collisionbox or {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index ba4e92d21..f9759e8be 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -596,15 +596,9 @@ External Settings for "minetest.conf" is false) 'mobs_spawn_protected' if set to false then mobs will not spawn in protected areas (default is true) - 'remove_far_mobs' if true then untamed mobs that are outside players - visual range will be removed (default is true) - 'mobname' can change specific mob chance rate (0 to disable) and - spawn number e.g. mobs_animal:cow = 1000,5 - 'mob_difficulty' sets difficulty level (health and hit damage + 'mob_difficulty' [EXPERIMENTAL] sets difficulty level (health and hit damage multiplied by this number), defaults to 1.0. - 'mob_show_health' if false then punching mob will not show health status - (true by default) - 'mob_chance_multiplier' multiplies chance of all mobs spawning and can be set + 'mob_spawn_chance' multiplies chance of all mobs spawning and can be set to 0.5 to have mobs spawn more or 2.0 to spawn less. e.g. 1 in 7000 * 0.5 = 1 in 3500 so better odds of spawning. diff --git a/settingtypes.txt b/settingtypes.txt index 2c3eae7a5..76ff1e036 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -70,7 +70,7 @@ mobs_drop_items (Mobs drop items) bool true # If enabled, mobs can take, place, change and destroy blocks around them. mobs_griefing (Mobs change blocks) bool true -# If enable, mobs won't damage particles when they got hurt. +# If enabled, mobs won't damage particles when they got hurt. mobs_disable_blood (Disable mob damage particles) bool false [Audio] From c6903b48f133be7fcfef9254d84b01e8c70260f2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 3 Oct 2019 12:19:54 +0200 Subject: [PATCH 360/379] Fix mobs spawn with 0 health if mob_difficulty=0 --- mods/ENTITIES/mcl_mobs/api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 5533ac085..7c574af15 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -3118,7 +3118,7 @@ local function scale_difficulty(value, default, min, special) if (not value) or (value == default) or (value == special) then return default else - return max(min, value) * difficulty + return max(min, value * difficulty) end end From 6d5bfacb8c3be476bf05997a855c59b2451930ad Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 3 Oct 2019 12:24:37 +0200 Subject: [PATCH 361/379] Make mob_difficulty no longer experimental --- mods/ENTITIES/mcl_mobs/api.txt | 2 +- settingtypes.txt | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index f9759e8be..3321b3e74 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -596,7 +596,7 @@ External Settings for "minetest.conf" is false) 'mobs_spawn_protected' if set to false then mobs will not spawn in protected areas (default is true) - 'mob_difficulty' [EXPERIMENTAL] sets difficulty level (health and hit damage + 'mob_difficulty' sets difficulty level (health and hit damage multiplied by this number), defaults to 1.0. 'mob_spawn_chance' multiplies chance of all mobs spawning and can be set to 0.5 to have mobs spawn more or 2.0 to spawn less. diff --git a/settingtypes.txt b/settingtypes.txt index 76ff1e036..ac9ba89b8 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -64,6 +64,11 @@ only_peaceful_mobs (Spawn only peaceful mobs) bool false # mob spawners. mobs_spawn_protected (Mobs spawn in protected areas) bool false +# Mobs difficulty. This is a number that will affect the initial and maximum +# health and the amount of damage that mobs deal. Health and damage will +# be multiplied with this number. +mob_difficulty (Mob difficulty factor) float 1.0 0.0 + # If enabled, mobs might drop items when they die. mobs_drop_items (Mobs drop items) bool true @@ -78,12 +83,6 @@ mobs_disable_blood (Disable mob damage particles) bool false flame_sound (Flame sound) bool true [Experimental] -# Mobs difficulty. This is a number that will affect the initial and maximum -# health and the amount of damage that mobs deal. Health and damage will -# be multiplied with this number. -# This feature is not finished yet! -mob_difficulty (Mob difficulty factor) float 1.0 0.0 - # Whether to generate fallen logs in some biomes. # They might not always look pretty and have strange overhangs. mcl_generate_fallen_logs (Generate fallen logs) bool false From 7b24ede5826ba0158934e6cbee7e20d6f0cde455 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 Oct 2019 08:33:22 +0200 Subject: [PATCH 362/379] Remove a couple of FIXMEs and legacy --- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 3 --- mods/ITEMS/mcl_farming/melon.lua | 2 +- mods/ITEMS/mcl_farming/pumpkin.lua | 2 +- mods/ITEMS/mcl_portals/portal_end.lua | 11 ----------- 4 files changed, 2 insertions(+), 16 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 2e5e3c6a1..30d704065 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -166,9 +166,6 @@ local dispenserdef = { local dropinv = dropmeta:get_inventory() if dropinv:room_for_item(armor_type, dropitem) then dropinv:add_item(armor_type, dropitem) - --[[ FIXME: For some reason, this function is not called after calling add_item, - so we call it manually to update the armor stand entity. - This may need investigation and the following line may be a small hack. ]] minetest.registered_nodes["3d_armor_stand:armor_stand"].on_metadata_inventory_put(standpos) stack:take_item() inv:set_stack("main", stack_id, stack) diff --git a/mods/ITEMS/mcl_farming/melon.lua b/mods/ITEMS/mcl_farming/melon.lua index 809cc01c1..18eb7faab 100644 --- a/mods/ITEMS/mcl_farming/melon.lua +++ b/mods/ITEMS/mcl_farming/melon.lua @@ -39,7 +39,7 @@ local melon_base_def = { -- Drop proabilities for melon stem local stem_drop = { max_items = 1, - -- FIXME: The probabilities are slightly off from the original. + -- The probabilities are slightly off from the original. -- Update this drop list when the Minetest drop probability system -- is more powerful. items = { diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua index 9050bdab7..d10437479 100644 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ b/mods/ITEMS/mcl_farming/pumpkin.lua @@ -15,7 +15,7 @@ minetest.register_craftitem("mcl_farming:pumpkin_seeds", { local stem_drop = { max_items = 1, - -- FIXME: The probabilities are slightly off from the original. + -- The probabilities are slightly off from the original. -- Update this drop list when the Minetest drop probability system -- is more powerful. items = { diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index 84e98fee9..4b9a0bbb3 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -209,17 +209,6 @@ minetest.register_abm({ interval = 1, chance = 1, action = function(pos, node) - -- Destroy legacy end portals created with quartz block frame - -- by turning them into cobwebs. - -- We can tell if a end portal is legacy if it has portal_target as metadata. - -- FIXME: Remove this after some time. - local meta = minetest.get_meta(pos) - local legacy_portal_target = meta:get_string("portal_frame1") - if legacy_portal_target and legacy_portal_target ~= "" then - minetest.set_node(pos, {name="mcl_core:cobweb"}) - return - end - for _,obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel if obj:is_player() or lua_entity then From c9b642a7066c57510f8184a37acfabd155bea00f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 Oct 2019 08:35:15 +0200 Subject: [PATCH 363/379] Remove unused file in mcl_dispensers --- .../REDSTONE/mcl_dispensers/init_new.lua | 372 ------------------ 1 file changed, 372 deletions(-) delete mode 100644 mods/ITEMS/REDSTONE/mcl_dispensers/init_new.lua diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init_new.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init_new.lua deleted file mode 100644 index dbe802c2c..000000000 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init_new.lua +++ /dev/null @@ -1,372 +0,0 @@ ---[[ This mod registers 3 nodes: -- One node for the horizontal-facing dispensers (mcl_dispensers:dispenser) -- One node for the upwards-facing dispensers (mcl_dispenser:dispenser_up) -- One node for the downwards-facing dispensers (mcl_dispenser:dispenser_down) - -3 node definitions are needed because of the way the textures are defined. -All node definitions share a lot of code, so this is the reason why there -are so many weird tables below. -]] -local S = minetest.get_translator("mcl_dispensers") - --- For after_place_node -local setup_dispenser = function(pos) - -- Set formspec and inventory - local form = "size[9,8.75]".. - "background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]".. - mcl_vars.inventory_header.. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - "list[current_player;main;0,7.74;9,1;]".. - "label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dispenser"))).."]".. - "list[current_name;main;3,0.5;3,3;]".. - "listring[current_name;main]".. - "listring[current_player;main]" - local meta = minetest.get_meta(pos) - meta:set_string("formspec", form) - local inv = meta:get_inventory() - inv:set_size("main", 9) -end - -local orientate_dispenser = function(pos, placer) - -- Not placed by player - if not placer then return end - - -- Pitch in degrees - local pitch = placer:get_look_vertical() * (180 / math.pi) - - local node = minetest.get_node(pos) - if pitch > 55 then - minetest.swap_node(pos, {name="mcl_dispensers:dispenser_up", param2 = node.param2}) - elseif pitch < -55 then - minetest.swap_node(pos, {name="mcl_dispensers:dispenser_down", param2 = node.param2}) - end -end - -local on_rotate -if minetest.get_modpath("screwdriver") then - on_rotate = screwdriver.rotate_simple -end - --- Shared core definition table -local dispenserdef = { - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - else - return count - end - end, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - else - return stack:get_count() - end - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - else - return stack:get_count() - end - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - local meta2 = meta - meta:from_table(oldmetadata) - local inv = meta:get_inventory() - for i=1, inv:get_size("main") do - local stack = inv:get_stack("main", i) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end - meta:from_table(meta2:to_table()) - end, - _mcl_blast_resistance = 17.5, - _mcl_hardness = 3.5, - mesecons = {effector = { - -- Dispense random item when triggered - action_on = function (pos, node) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local droppos, dropdir - if node.name == "mcl_dispensers:dispenser" then - dropdir = vector.multiply(minetest.facedir_to_dir(node.param2), -1) - droppos = vector.add(pos, dropdir) - elseif node.name == "mcl_dispensers:dispenser_up" then - dropdir = {x=0, y=1, z=0} - droppos = {x=pos.x, y=pos.y+1, z=pos.z} - elseif node.name == "mcl_dispensers:dispenser_down" then - dropdir = {x=0, y=-1, z=0} - droppos = {x=pos.x, y=pos.y-1, z=pos.z} - end - local dropnode = minetest.get_node(droppos) - local dropnodedef = minetest.registered_nodes[dropnode.name] - local stacks = {} - for i=1,inv:get_size("main") do - local stack = inv:get_stack("main", i) - if not stack:is_empty() then - table.insert(stacks, {stack = stack, stackpos = i}) - end - end - if #stacks >= 1 then - local r = math.random(1, #stacks) - local stack = stacks[r].stack - local dropitem = ItemStack(stack) - dropitem:set_count(1) - local stack_id = stacks[r].stackpos - local stackdef = stack:get_definition() - local iname = stack:get_name() - local igroups = minetest.registered_items[iname].groups - - --[===[ Dispense item ]===] - - -- Hardcoded dispensions -- - - -- Armor, mob heads and pumpkins - if igroups.armor_head or igroups.armor_torso or igroups.armor_legs or igroups.armor_feet then - local armor_type, armor_slot - local armor_dispensed = false - if igroups.armor_head then - armor_type = "armor_head" - armor_slot = 2 - elseif igroups.armor_torso then - armor_type = "armor_torso" - armor_slot = 3 - elseif igroups.armor_legs then - armor_type = "armor_legs" - armor_slot = 4 - elseif igroups.armor_feet then - armor_type = "armor_feet" - armor_slot = 5 - end - - local droppos_below = {x=droppos.x, y=droppos.y-1, z=droppos.z} - local dropnode_below = minetest.get_node(droppos_below) - -- Put armor on player or armor stand - local standpos - if dropnode.name == "3d_armor_stand:armor_stand" then - standpos = droppos - elseif dropnode_below.name == "3d_armor_stand:armor_stand" then - standpos = droppos_below - end - if standpos then - local dropmeta = minetest.get_meta(standpos) - local dropinv = dropmeta:get_inventory() - if dropinv:room_for_item(armor_type, dropitem) then - dropinv:add_item(armor_type, dropitem) - --[[ FIXME: For some reason, this function is not called after calling add_item, - so we call it manually to update the armor stand entity. - This may need investigation and the following line may be a small hack. ]] - minetest.registered_nodes["3d_armor_stand:armor_stand"].on_metadata_inventory_put(standpos) - stack:take_item() - inv:set_stack("main", stack_id, stack) - armor_dispensed = true - end - else - -- Put armor on nearby player - -- First search for player in front of dispenser (check 2 nodes) - local objs1 = minetest.get_objects_inside_radius(droppos, 1) - local objs2 = minetest.get_objects_inside_radius(droppos_below, 1) - local objs_table = {objs1, objs2} - local player - for oi=1, #objs_table do - local objs_inner = objs_table[oi] - for o=1, #objs_inner do - --[[ First player in list is the lucky one. The other player get nothing :-( - If multiple players are close to the dispenser, it can be a bit - -- unpredictable on who gets the armor. ]] - if objs_inner[o]:is_player() then - player = objs_inner[o] - break - end - end - if player then - break - end - end - -- If player found, add armor - if player then - local ainv = minetest.get_inventory({type="detached", name=player:get_player_name().."_armor"}) - local pinv = player:get_inventory() - if ainv:get_stack("armor", armor_slot):is_empty() and pinv:get_stack("armor", armor_slot):is_empty() then - ainv:set_stack("armor", armor_slot, dropitem) - pinv:set_stack("armor", armor_slot, dropitem) - armor:set_player_armor(player) - armor:update_inventory(player) - - stack:take_item() - inv:set_stack("main", stack_id, stack) - armor_dispensed = true - end - end - - -- Place head or pumpkin as node, if equipping it as armor has failed - if not armor_dispensed then - if igroups.head or iname == "mcl_farming:pumpkin_face" then - if dropnodedef.buildable_to then - minetest.set_node(droppos, {name = iname, param2 = node.param2}) - stack:take_item() - inv:set_stack("main", stack_id, stack) - end - end - end - end - - -- Spawn Egg - elseif igroups.spawn_egg then - -- Spawn mob - if not dropnodedef.walkable then - pointed_thing = { above = droppos, under = { x=droppos.x, y=droppos.y-1, z=droppos.z } } - minetest.add_entity(droppos, stack:get_name()) - - stack:take_item() - inv:set_stack("main", stack_id, stack) - end - - -- Generalized dispension - elseif (not dropnodedef.walkable or stackdef._dispense_into_walkable) then - --[[ _on_dispense(stack, pos, droppos, dropnode, dropdir) - * stack: Itemstack which is dispense - * pos: Position of dispenser - * droppos: Position to which to dispense item - * dropnode: Node of droppos - * dropdir: Drop direction - - _dispense_into_walkable: If true, can dispense into walkable nodes - ]] - if stackdef._on_dispense then - -- Item-specific dispension (if defined) - local od_ret = stackdef._on_dispense(dropitem, pos, droppos, dropnode, dropdir) - if od_ret then - local newcount = stack:get_count() - 1 - stack:set_count(newcount) - inv:set_stack("main", stack_id, stack) - if newcount == 0 then - inv:set_stack("main", stack_id, od_ret) - elseif inv:room_for_item("main", od_ret) then - inv:add_item("main", od_ret) - else - minetest.add_item(droppos, dropitem) - end - else - stack:take_item() - inv:set_stack("main", stack_id, stack) - end - else - -- Drop item otherwise - minetest.add_item(droppos, dropitem) - stack:take_item() - inv:set_stack("main", stack_id, stack) - end - end - - - end - end, - rules = mesecon.rules.alldirs, - }}, - on_rotate = on_rotate, -} - --- Horizontal dispenser - -local horizontal_def = table.copy(dispenserdef) -horizontal_def.description = S("Dispenser") -horizontal_def._doc_items_longdesc = S("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.") -horizontal_def._doc_items_usagehelp = S("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.").."\n\n".. - -S("The dispenser will do different things, depending on the dispensed item:").."\n\n".. - -S("• Arrows: Are launched").."\n".. -S("• Eggs and snowballs: Are thrown").."\n".. -S("• Fire charges: Are fired in a straight line").."\n".. -S("• Armor: Will be equipped to players and armor stands").."\n".. -S("• Boats: Are placed on water or are dropped").."\n".. -S("• Minecart: Are placed on rails or are dropped").."\n".. -S("• Bone meal: Is applied on the block it is facing").."\n".. -S("• Empty buckets: Are used to collect a liquid source").."\n".. -S("• Filled buckets: Are used to place a liquid source").."\n".. -S("• Heads, pumpkins: Equipped to players and armor stands, or placed as a block").."\n".. -S("• Shulker boxes: Are placed as a block").."\n".. -S("• TNT: Is placed and ignited").."\n".. -S("• Flint and steel: Is used to ignite a fire in air and to ignite TNT").."\n".. -S("• Spawn eggs: Will summon the mob they contain").."\n".. -S("• Other items: Are simply dropped") - -horizontal_def.after_place_node = function(pos, placer, itemstack, pointed_thing) - setup_dispenser(pos) - orientate_dispenser(pos, placer) -end -horizontal_def.tiles = { - "default_furnace_top.png", "default_furnace_bottom.png", - "default_furnace_side.png", "default_furnace_side.png", - "default_furnace_side.png", "mcl_dispensers_dispenser_front_horizontal.png" -} -horizontal_def.paramtype2 = "facedir" -horizontal_def.groups = {pickaxey=1, container=2, material_stone=1} - -minetest.register_node("mcl_dispensers:dispenser", horizontal_def) - --- Down dispenser -local down_def = table.copy(dispenserdef) -down_def.description = S("Downwards-Facing Dispenser") -down_def.after_place_node = setup_dispenser -down_def.tiles = { - "default_furnace_top.png", "mcl_dispensers_dispenser_front_vertical.png", - "default_furnace_side.png", "default_furnace_side.png", - "default_furnace_side.png", "default_furnace_side.png" -} -down_def.groups = {pickaxey=1, container=2,not_in_creative_inventory=1, material_stone=1} -down_def._doc_items_create_entry = false -down_def.drop = "mcl_dispensers:dispenser" -minetest.register_node("mcl_dispensers:dispenser_down", down_def) - --- Up dispenser --- The up dispenser is almost identical to the down dispenser , it only differs in textures -local up_def = table.copy(down_def) -up_def.description = S("Upwards-Facing Dispenser") -up_def.tiles = { - "mcl_dispensers_dispenser_front_vertical.png", "default_furnace_bottom.png", - "default_furnace_side.png", "default_furnace_side.png", - "default_furnace_side.png", "default_furnace_side.png" -} -minetest.register_node("mcl_dispensers:dispenser_up", up_def) - - -minetest.register_craft({ - output = 'mcl_dispensers:dispenser', - recipe = { - {"mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble",}, - {"mcl_core:cobble", "mcl_bows:bow", "mcl_core:cobble",}, - {"mcl_core:cobble", "mesecons:redstone", "mcl_core:cobble",}, - } -}) - --- Add entry aliases for the Help -if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_dispensers:dispenser", "nodes", "mcl_dispensers:dispenser_down") - doc.add_entry_alias("nodes", "mcl_dispensers:dispenser", "nodes", "mcl_dispensers:dispenser_up") -end - -minetest.register_lbm({ - label = "Update dispenser formspecs (0.51.0)", - name = "mcl_dispensers:update_formspecs_0_51_0", - nodenames = { "mcl_dispensers:dispenser", "mcl_dispensers:dispenser_down", "mcl_dispensers:dispenser_up" }, - action = function(pos, node) - minetest.registered_nodes[node.name].on_construct(pos) - minetest.log("action", "[mcl_dispenser] Node formspec updated at "..minetest.pos_to_string(pos)) - end, -}) - From 219b2464a1e82ad30608d4003f843f3424252f7a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 25 Oct 2019 00:42:30 +0200 Subject: [PATCH 364/379] Give llamas an appetite for hay bales --- mods/ENTITIES/mobs_mc/0_gameconfig.lua | 1 + mods/ENTITIES/mobs_mc/llama.lua | 2 +- mods/ENTITIES/mobs_mc_gameconfig/init.lua | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/0_gameconfig.lua b/mods/ENTITIES/mobs_mc/0_gameconfig.lua index 6b1180b73..81229aa27 100644 --- a/mods/ENTITIES/mobs_mc/0_gameconfig.lua +++ b/mods/ENTITIES/mobs_mc/0_gameconfig.lua @@ -157,6 +157,7 @@ mobs_mc.follow = { chicken = { "farming:seed_wheat", "farming:seed_cotton" }, -- seeds in general parrot = { "farming:seed_wheat", "farming:seed_cotton" }, -- seeds in general horse = { mobs_mc.items.apple, mobs_mc.items.sugar, mobs_mc.items.wheat, mobs_mc.items.hay_bale, mobs_mc.items.golden_apple, mobs_mc.items.golden_carrot }, + llama = { mobs_mc.items.wheat, mobs_mc.items.hay_bale, }, pig = { mobs_mc.items.potato, mobs_mc.items.carrot, mobs_mc.items.carrot_on_a_stick, mobs_mc.items.apple, -- Minetest Game extra }, diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mobs_mc/llama.lua index 92da233a5..079567613 100644 --- a/mods/ENTITIES/mobs_mc/llama.lua +++ b/mods/ENTITIES/mobs_mc/llama.lua @@ -53,7 +53,7 @@ mobs:register_mob("mobs_mc:llama", { look_start = 78, look_end = 108, }, - follow = mobs_mc.items.horse, + follow = mobs_mc.follow.llama, view_range = 16, do_custom = function(self, dtime) diff --git a/mods/ENTITIES/mobs_mc_gameconfig/init.lua b/mods/ENTITIES/mobs_mc_gameconfig/init.lua index 4fe025bb0..ab86cd2a2 100644 --- a/mods/ENTITIES/mobs_mc_gameconfig/init.lua +++ b/mods/ENTITIES/mobs_mc_gameconfig/init.lua @@ -73,7 +73,7 @@ mobs_mc.override.items = { wheat = "mcl_farming:wheat_item", cookie = "mcl_farming:cookie", potato = "mcl_farming:potato_item", - hay_bale = "mcl_farming:hay_bale", + hay_bale = "mcl_farming:hay_block", prismarine_shard = "mcl_ocean:prismarine_shard", prismarine_crystals = "mcl_ocean:prismarine_crystals", apple = "mcl_core:apple", @@ -136,6 +136,7 @@ mobs_mc.override.follow = { sheep = { mobs_mc.override.items.wheat }, cow = { mobs_mc.override.items.wheat }, horse = { mobs_mc.override.items.apple, mobs_mc.override.items.sugar, mobs_mc.override.items.wheat, mobs_mc.override.items.hay_bale, mobs_mc.override.items.golden_apple, mobs_mc.override.items.golden_carrot }, + llama = { mobs_mc.override.items.wheat, mobs_mc.override.items.hay_bale }, rabbit = { mobs_mc.override.items.dandelion, mobs_mc.override.items.carrot, mobs_mc.override.items.golden_carrot }, } From 55171a12c6a61793453990f46b6253bca1f80ea4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 25 Oct 2019 00:56:31 +0200 Subject: [PATCH 365/379] Make dogs accept food Thanks, emanresu! --- mods/ENTITIES/mobs_mc_gameconfig/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ENTITIES/mobs_mc_gameconfig/init.lua b/mods/ENTITIES/mobs_mc_gameconfig/init.lua index ab86cd2a2..f1f185b7d 100644 --- a/mods/ENTITIES/mobs_mc_gameconfig/init.lua +++ b/mods/ENTITIES/mobs_mc_gameconfig/init.lua @@ -138,6 +138,8 @@ mobs_mc.override.follow = { horse = { mobs_mc.override.items.apple, mobs_mc.override.items.sugar, mobs_mc.override.items.wheat, mobs_mc.override.items.hay_bale, mobs_mc.override.items.golden_apple, mobs_mc.override.items.golden_carrot }, llama = { mobs_mc.override.items.wheat, mobs_mc.override.items.hay_bale }, rabbit = { mobs_mc.override.items.dandelion, mobs_mc.override.items.carrot, mobs_mc.override.items.golden_carrot }, + wolf = { mobs_mc.override.items.bone }, + dog = { mobs_mc.override.items.rabbit_raw, mobs_mc.override.items.rabbit_cooked, mobs_mc.override.items.mutton_raw, mobs_mc.override.items.mutton_cooked, mobs_mc.override.items.beef_raw, mobs_mc.override.items.beef_cooked, mobs_mc.override.items.chicken_raw, mobs_mc.override.items.chicken_cooked, mobs_mc.override.items.rotten_flesh, mobs_mc.override.items.porkchop_raw, mobs_mc.override.items.porkchop_cooked }, } mobs_mc.override.replace = { From fd089b2470546255675c471aad8179f9425a40c4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 25 Oct 2019 01:03:54 +0200 Subject: [PATCH 366/379] Version 0.55.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aaef3eba0..e7120ee15 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.54.1 +Version: 0.55.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From f6f259dce0760ba0836488cacdc01fd1a98d36cd Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 19 Nov 2019 01:19:47 +0100 Subject: [PATCH 367/379] Add some sanity checks to fishing bobber --- mods/ITEMS/mcl_fishing/init.lua | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index ebef9ca92..02fa27fd9 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -14,6 +14,7 @@ local bobber_ENTITY={ visual_size = {x=0.5, y=0.5}, collisionbox = {0.45,0.45,0.45,0.45,0.45,0.45}, pointable = false, + static_save = false, _lastpos={}, _dive = false, @@ -158,33 +159,47 @@ local bobber_on_step = function(self, dtime) local node = minetest.get_node(epos) local def = minetest.registered_nodes[node.name] - --If we have no player remove self. - if self.player == nil then + --If we have no player, remove self. + if self.player == nil or self.player == "" then self.object:remove() + return + end + local player = minetest.get_player_by_name(self.player) + if not player then + self.object:remove() + return end --Check if player is nearby - if self._tick % 5 == 0 and self.player ~= nil then + if self._tick % 5 == 0 and self.player ~= nil and player ~= nil then --Destroy bobber if item not wielded. - if (minetest.get_player_by_name(self.player):get_wielded_item():get_name() ~= "mcl_fishing:fishing_rod") then + local wield = player:get_wielded_item() + if ((not wield) or (wield:get_name() ~= "mcl_fishing:fishing_rod")) then self.object:remove() + return end --Destroy bobber if player is too far away. local objpos = self.object:get_pos() - local playerpos = minetest.get_player_by_name(self.player):get_pos() + local playerpos = player:get_pos() if (((playerpos.y - objpos.y) >= 33) or ((playerpos.y - objpos.y) <= -33)) then self.object:remove() + return elseif (((playerpos.x - objpos.x) >= 33) or ((playerpos.x - objpos.x) <= -33)) then self.object:remove() + return elseif (((playerpos.z - objpos.z) >= 33) or ((playerpos.z - objpos.z) <= -33)) then self.object:remove() + return elseif ((((playerpos.z + playerpos.x) - (objpos.z + objpos.x)) >= 33) or ((playerpos.z + playerpos.x) - (objpos.z + objpos.x)) <= -33) then self.object:remove() + return elseif ((((playerpos.y + playerpos.x) - (objpos.y + objpos.x)) >= 33) or ((playerpos.y + playerpos.x) - (objpos.y + objpos.x)) <= -33) then self.object:remove() + return elseif ((((playerpos.z + playerpos.y) - (objpos.z + objpos.y)) >= 33) or ((playerpos.z + playerpos.y) - (objpos.z + objpos.y)) <= -33) then self.object:remove() + return end end From 05e6362303ffb0d1a0e73a7bd4d65fab2216d0b4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 19 Nov 2019 01:20:13 +0100 Subject: [PATCH 368/379] Version 0.55.1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e7120ee15..76718595b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.55.0 +Version: 0.55.1 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 5f1973aecdad52a59873d0bfcccd105dcac2a9b6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 8 Dec 2019 18:48:49 +0100 Subject: [PATCH 369/379] Mobs: Refactor distance calculation --- mods/ENTITIES/mcl_mobs/api.lua | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 7c574af15..a7ee8b279 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -31,7 +31,6 @@ end -- localize math functions local pi = math.pi -local square = math.sqrt local sin = math.sin local cos = math.cos local abs = math.abs @@ -260,15 +259,6 @@ function mobs:set_animation(self, anim) end --- calculate distance -local get_distance = function(a, b) - - local x, y, z = a.x - b.x, a.y - b.y, a.z - b.z - - return square(x * x + y * y + z * z) -end - - -- check line of sight (BrunoMine) local line_of_sight = function(self, pos1, pos2, stepsize) @@ -293,7 +283,7 @@ local line_of_sight = function(self, pos1, pos2, stepsize) local nn = minetest.get_node(pos).name -- Target Distance (td) to travel - local td = get_distance(pos1, pos2) + local td = vector.distance(pos1, pos2) -- Actual Distance (ad) traveled local ad = 0 @@ -309,7 +299,7 @@ local line_of_sight = function(self, pos1, pos2, stepsize) end -- Moves the analyzed pos - local d = get_distance(pos1, pos2) + local d = vector.distance(pos1, pos2) npos1.x = ((pos2.x - pos1.x) / d * stepsize) + pos1.x npos1.y = ((pos2.y - pos1.y) / d * stepsize) + pos1.y @@ -980,7 +970,7 @@ local entity_physics = function(pos, radius) obj_pos = objs[n]:get_pos() - dist = get_distance(pos, obj_pos) + dist = vector.distance(pos, obj_pos) if dist < 1 then dist = 1 end local damage = floor((4 / dist) * radius) @@ -1531,7 +1521,7 @@ local monster_attack = function(self) p = player:get_pos() sp = s - dist = get_distance(p, s) + dist = vector.distance(p, s) -- aim higher to make looking up hills more realistic p.y = p.y + 1 @@ -1577,7 +1567,7 @@ local npc_attack = function(self) p = obj.object:get_pos() sp = s - local dist = get_distance(p, s) + local dist = vector.distance(p, s) -- aim higher to make looking up hills more realistic p.y = p.y + 1 @@ -1665,7 +1655,7 @@ local runaway_from = function(self) p.y = p.y + 1 sp.y = sp.y + 1 - dist = get_distance(p, s) + dist = vector.distance(p, s) -- choose closest player/mpb to runaway from @@ -1715,7 +1705,7 @@ local follow_flop = function(self) for n = 1, #players do - if get_distance(players[n]:get_pos(), s) < self.view_range + if vector.distance(players[n]:get_pos(), s) < self.view_range and not mobs.invis[ players[n]:get_player_name() ] then self.following = players[n] @@ -1763,7 +1753,7 @@ local follow_flop = function(self) if p then - local dist = get_distance(p, s) + local dist = vector.distance(p, s) -- dont follow if out of range if dist > self.view_range then @@ -2022,7 +2012,7 @@ local do_states = function(self, dtime) -- calculate distance from mob and enemy local s = self.object:get_pos() local p = self.attack:get_pos() or s - local dist = get_distance(p, s) + local dist = vector.distance(p, s) -- stop attacking if player invisible or out of range if dist > self.view_range @@ -2331,7 +2321,7 @@ local do_states = function(self, dtime) p.y = p.y - .5 s.y = s.y + .5 - local dist = get_distance(p, s) + local dist = vector.distance(p, s) local vec = { x = p.x - s.x, y = p.y - s.y, From 89ba84a45647c380c914d02e862336906039d13e Mon Sep 17 00:00:00 2001 From: Jared Moody Date: Mon, 9 Dec 2019 08:24:38 +0100 Subject: [PATCH 370/379] Fixes #583 - Eating chorus plant restores 4 HP --- mods/ITEMS/mcl_end/chorus_plant.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index 02ab50d47..4e1575c80 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -501,7 +501,7 @@ local eat_chorus_fruit = function(itemstack, player, pointed_thing) end end local count = itemstack:get_count() - local new_itemstack = minetest.do_item_eat(0, nil, itemstack, player, pointed_thing) + local new_itemstack = minetest.do_item_eat(4, nil, itemstack, player, pointed_thing) local new_count = new_itemstack:get_count() if count ~= new_count or new_itemstack:get_name() ~= "mcl_end:chorus_fruit" or (minetest.settings:get_bool("creative_mode") == true) then random_teleport(player) From 7175ffb975c77dbef3f3444368d18dfbbe192243 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 9 Dec 2019 08:36:34 +0100 Subject: [PATCH 371/379] Add workaround for broken eat sound --- mods/PLAYER/mcl_hunger/hunger.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index eacec1bc5..53799a051 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -148,7 +148,9 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso max_hear_distance = 12, gain = 1.0, pitch = 1 + math.random(-10, 10)*0.005, - object = user, + -- FIXME: Should be linked to object, but it's broken in Minetest 5.1.0 + -- See https://github.com/minetest/minetest/issues/9183 + pos = pos, }) else -- Assume the item is a food @@ -187,7 +189,9 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso max_hear_distance = 12, gain = 1.0, pitch = 1 + math.random(-10, 10)*0.005, - object = user, + -- FIXME: Should be linked to object, but it's broken in Minetest 5.1.0 + -- See https://github.com/minetest/minetest/issues/9183 + pos = pos, }) end From 7471836c2d3139fe7f5000de4b6b3ae658f332f3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 9 Dec 2019 08:51:25 +0100 Subject: [PATCH 372/379] Fix side hopper not collecting non-fuel items --- mods/ITEMS/mcl_hoppers/init.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index f798977b7..39f5f3e57 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -445,6 +445,14 @@ minetest.register_abm({ local g = minetest.registered_nodes[abovenode.name].groups.container 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 + end + -- Move an item from the hopper into the container to which the hopper points to local g = minetest.registered_nodes[frontnode.name].groups.container if g == 2 or g == 3 or g == 5 or g == 6 then From 8a2e6d434d9246d8fa1b938421a7f96053bc7f8b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 9 Dec 2019 09:29:19 +0100 Subject: [PATCH 373/379] Mobs now shoot mcl_bows:arrow_entity --- mods/ENTITIES/mcl_mobs/api.lua | 31 +++++++++++++------ mods/ENTITIES/mcl_mobs/api.txt | 3 ++ mods/ENTITIES/mobs_mc/skeleton+stray.lua | 5 ++- mods/ENTITIES/mobs_mc/villager_illusioner.lua | 5 ++- mods/ITEMS/mcl_bows/bow.lua | 2 +- 5 files changed, 33 insertions(+), 13 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index a7ee8b279..b9b67078d 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -2350,23 +2350,33 @@ local do_states = function(self, dtime) p.y = p.y + (self.collisionbox[2] + self.collisionbox[5]) / 2 + -- Shoot arrow if minetest.registered_entities[self.arrow] then - local obj = minetest.add_entity(p, self.arrow) - local ent = obj:get_luaentity() + local arrow, ent + local v = 1 + if not self.shoot_arrow then + arrow = minetest.add_entity(p, self.arrow) + ent = arrow:get_luaentity() + if ent.velocity then + v = ent.velocity + end + ent.switch = 1 + ent.owner_id = tostring(self.object) -- add unique owner id to arrow + end + local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5 - local v = ent.velocity or 1 -- or set to default - - ent.switch = 1 - ent.owner_id = tostring(self.object) -- add unique owner id to arrow - - -- offset makes shoot aim accurate + -- offset makes shoot aim accurate vec.y = vec.y + self.shoot_offset vec.x = vec.x * (v / amount) vec.y = vec.y * (v / amount) vec.z = vec.z * (v / amount) - - obj:set_velocity(vec) + if self.shoot_arrow then + vec = vector.normalize(vec) + self:shoot_arrow(p, vec) + else + arrow:set_velocity(vec) + end end end end @@ -3217,6 +3227,7 @@ minetest.register_entity(name, { can_despawn = can_despawn, child = def.child or false, texture_mods = {}, + shoot_arrow = def.shoot_arrow, -- End of MCL2 extensions on_spawn = def.on_spawn, diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 3321b3e74..0430bbc00 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -226,6 +226,9 @@ functions needed for the mob to work properly which contains the following: spawning fails due to space requirements 'glow' same as in entity definition 'child' if true, spawn mob as child + 'shoot_arrow(self, pos, dir)' function that is called when mob wants to shoot an arrow. + You can spawn your own arrow here. pos is mob position, + dir is mob's aiming direction Node Replacement diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index 04d402d8d..bb0b8d2e0 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -78,7 +78,10 @@ local skeleton = { view_range = 16, fear_height = 4, attack_type = "dogshoot", - arrow = "mobs_mc:arrow_entity", + arrow = "mcl_bows:arrow_entity", + shoot_arrow = function(self, pos, dir) + mcl_bows.shoot_arrow("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object) + end, shoot_interval = 2.5, shoot_offset = 1, dogshoot_switch = 1, diff --git a/mods/ENTITIES/mobs_mc/villager_illusioner.lua b/mods/ENTITIES/mobs_mc/villager_illusioner.lua index fe3efa8a8..82ce54a14 100644 --- a/mods/ENTITIES/mobs_mc/villager_illusioner.lua +++ b/mods/ENTITIES/mobs_mc/villager_illusioner.lua @@ -9,8 +9,11 @@ mobs:register_mob("mobs_mc:illusioner", { type = "monster", attack_type = "shoot", shoot_interval = 0.5, - arrow = "mobs_mc:arrow_entity", shoot_offset = 1.5, + arrow = "mcl_bows:arrow_entity", + shoot_arrow = function(self, pos, dir) + mcl_bows.shoot_arrow("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object) + end, hp_min = 32, hp_max = 32, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 543c573d5..4f39331d2 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -49,7 +49,7 @@ mcl_bows.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damag le._damage = damage le._startpos = pos minetest.sound_play("mcl_bows_bow_shoot", {pos=pos}) - if shooter ~= nil then + if shooter ~= nil and shooter:is_player() then if obj:get_luaentity().player == "" then obj:get_luaentity().player = shooter end From 84ff24f8ed83f44ea32f37d917151c107ea41e2b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 9 Dec 2019 09:56:38 +0100 Subject: [PATCH 374/379] Tweak mob shooting behaviour --- mods/ENTITIES/mobs_mc/skeleton+stray.lua | 12 ++++++++---- mods/ENTITIES/mobs_mc/snowman.lua | 8 +++++++- mods/ENTITIES/mobs_mc/villager_illusioner.lua | 10 +++++++--- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index bb0b8d2e0..4157f750c 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -4,6 +4,7 @@ --License for code WTFPL and otherwise stated in readmes local S = minetest.get_translator("mobs_mc") +local mod_bows = minetest.get_modpath("mcl_bows") ~= nil --################### --################### SKELETON @@ -31,7 +32,6 @@ local skeleton = { random = "mobs_mc_skeleton_random", death = "mobs_mc_skeleton_death", damage = "mobs_mc_skeleton_hurt", - shoot_attack = "mcl_bows_bow_shoot", distance = 16, }, walk_velocity = 1.2, @@ -80,10 +80,14 @@ local skeleton = { attack_type = "dogshoot", arrow = "mcl_bows:arrow_entity", shoot_arrow = function(self, pos, dir) - mcl_bows.shoot_arrow("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object) + if mod_bows then + -- 2-4 damage per arrow + local dmg = math.max(4, math.random(2, 8)) + mcl_bows.shoot_arrow("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object, nil, dmg) + end end, - shoot_interval = 2.5, - shoot_offset = 1, + shoot_interval = 2, + shoot_offset = 1.5, dogshoot_switch = 1, dogshoot_count_max =1.8, } diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua index 48143b449..401950a34 100644 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ b/mods/ENTITIES/mobs_mc/snowman.lua @@ -8,6 +8,7 @@ local S = minetest.get_translator("mobs_mc") local snow_trail_frequency = 0.5 -- Time in seconds for checking to add a new snow trail local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false +local mod_throwing = minetest.get_modpath("mcl_throwing") ~= nil local gotten_texture = { "mobs_mc_snowman.png", @@ -51,7 +52,12 @@ mobs:register_mob("mobs_mc:snowman", { jump = true, makes_footstep_sound = true, attack_type = "shoot", - arrow = "mobs_mc:snowball_entity", + arrow = "mcl_throwing:snowball_entity", + shoot_arrow = function(self, pos, dir) + if mod_throwing then + mcl_throwing.throw("mcl_throwing:snowball", pos, dir) + end + end, shoot_interval = 1, shoot_offset = 1, animation = { diff --git a/mods/ENTITIES/mobs_mc/villager_illusioner.lua b/mods/ENTITIES/mobs_mc/villager_illusioner.lua index 82ce54a14..9c0429ec0 100644 --- a/mods/ENTITIES/mobs_mc/villager_illusioner.lua +++ b/mods/ENTITIES/mobs_mc/villager_illusioner.lua @@ -4,15 +4,20 @@ --License for code WTFPL and otherwise stated in readmes local S = minetest.get_translator("mobs_mc") +local mod_bows = minetest.get_modpath("mcl_bows") ~= nil mobs:register_mob("mobs_mc:illusioner", { type = "monster", attack_type = "shoot", - shoot_interval = 0.5, + shoot_interval = 2.5, shoot_offset = 1.5, arrow = "mcl_bows:arrow_entity", shoot_arrow = function(self, pos, dir) - mcl_bows.shoot_arrow("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object) + if mod_bows then + -- 1-4 damage per arrow + local dmg = math.random(1, 4) + mcl_bows.shoot_arrow("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object, nil, dmg) + end end, hp_min = 32, hp_max = 32, @@ -26,7 +31,6 @@ mobs:register_mob("mobs_mc:illusioner", { }, }, sounds = { -- TODO: more sounds - shoot_attack = "mcl_bows_bow_shoot", distance = 16, }, visual_size = {x=3, y=3}, From e2fb3a562d63d07bb4030b46af030e75b680ba6c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 9 Dec 2019 10:11:15 +0100 Subject: [PATCH 375/379] Add some arrow-related death messages --- mods/HUD/mcl_death_messages/init.lua | 27 ++++++++++++++++--- .../locale/mcl_death_messages.de.tr | 6 ++++- .../mcl_death_messages/locale/template.txt | 4 +++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index 7a55f499e..b212e36db 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -7,11 +7,23 @@ mcl_death_messages = {} local msgs = { ["arrow"] = { N("@1 was fatally hit by an arrow."), - N("@1 has been killed with an arrow."), + N("@1 has been killed by an arrow."), }, ["arrow_name"] = { N("@1 was shot by an arrow from @2."), }, + ["arrow_skeleton"] = { + N("@1 was shot by an arrow from a skeleton."), + }, + ["arrow_stray"] = { + N("@1 was shot by an arrow from a stray."), + }, + ["arrow_illusioner"] = { + N("@1 was shot by an arrow from an illusioner."), + }, + ["arrow_mob"] = { + N("@1 was shot by an arrow."), + }, ["drown"] = { N("@1 forgot to breathe."), N("@1 drowned."), @@ -186,15 +198,22 @@ minetest.register_on_dieplayer(function(player, reason) if hitter:get_luaentity()._shooter then shooter = hitter:get_luaentity()._shooter end + local s_ent = shooter:get_luaentity() if shooter == nil then msg = dmsg("arrow", name) elseif shooter:is_player() then msg = dmsg("arrow_name", name, shooter:get_player_name()) - elseif shooter:get_luaentity()._cmi_is_mob then - if shooter:get_luaentity().nametag ~= "" then + elseif s_ent._cmi_is_mob then + if s_ent.nametag ~= "" then msg = dmsg("arrow_name", name, shooter:get_player_name()) + elseif s_ent.name == "mobs_mc:skeleton" then + msg = dmsg("arrow_skeleton", name) + elseif s_ent.name == "mobs_mc:stray" then + msg = dmsg("arrow_stray", name) + elseif s_ent.name == "mobs_mc:illusioner" then + msg = dmsg("arrow_illusioner", name) else - msg = dmsg("arrow", name) + msg = dmsg("arrow_mob", name) end else msg = dmsg("arrow", name) diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr index cc1438056..a37f556d5 100644 --- a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr @@ -1,7 +1,11 @@ # textdomain: mcl_death_messages @1 was fatally hit by an arrow.=@1 wurde tödlich von einem Pfeil getroffen. -@1 has been killed with an arrow.=@1 wurde mit einem Pfeil getötet. +@1 has been killed by an arrow.=@1 wurde von einem Pfeil getötet. @1 was shot by an arrow from @2.=@1 wurde mit einem Pfeil von @2 abgeschossen. +@1 was shot by an arrow from a skeleton.=@1 wurde von einem Skelett mit Pfeil und Bogen abgeschossen. +@1 was shot by an arrow from a stray.=@1 wurde von einem Eiswanderer mit Pfeil und Bogen abgeschossen. +@1 was shot by an arrow from an illusioner.=@1 wurde von einem Illusionisten mit Pfeil und Bogen abgeschossen. +@1 was shot by an arrow.=@1 wurde mit einem Pfeil abgeschossen. @1 forgot to breathe.=@1 vergaß, zu atmen. @1 drowned.=@1 ertrank. @1 ran out of oxygen.=@1 ging die Luft aus. diff --git a/mods/HUD/mcl_death_messages/locale/template.txt b/mods/HUD/mcl_death_messages/locale/template.txt index 95b2375b1..fc83e2963 100644 --- a/mods/HUD/mcl_death_messages/locale/template.txt +++ b/mods/HUD/mcl_death_messages/locale/template.txt @@ -2,6 +2,10 @@ @1 was fatally hit by an arrow.= @1 has been killed with an arrow.= @1 was shot by an arrow from @2.= +@1 was shot by an arrow from a skeleton.= +@1 was shot by an arrow from a stray.= +@1 was shot by an arrow from an illusioner.= +@1 was shot by an arrow.= @1 forgot to breathe.= @1 drowned.= @1 ran out of oxygen.= From 9e31c2b62bd4db01131830915801b08dfc80bbb0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 9 Dec 2019 11:03:48 +0100 Subject: [PATCH 376/379] Snow golems use mcl_throwing snowball --- mods/ENTITIES/mobs_mc/snowman.lua | 2 +- mods/ITEMS/mcl_fishing/init.lua | 3 +- mods/ITEMS/mcl_throwing/init.lua | 78 +++++++++++++++++++++++++++---- 3 files changed, 71 insertions(+), 12 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua index 401950a34..7e74d8d62 100644 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ b/mods/ENTITIES/mobs_mc/snowman.lua @@ -55,7 +55,7 @@ mobs:register_mob("mobs_mc:snowman", { arrow = "mcl_throwing:snowball_entity", shoot_arrow = function(self, pos, dir) if mod_throwing then - mcl_throwing.throw("mcl_throwing:snowball", pos, dir) + mcl_throwing.throw("mcl_throwing:snowball", pos, dir, nil, self.object) end end, shoot_interval = 1, diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index 02fa27fd9..fd4697813 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -146,8 +146,7 @@ local fish = function(itemstack, player) if noent == true then local playerpos = player:get_pos() local dir = player:get_look_dir() - local obj = mcl_throwing.throw("mcl_throwing:flying_bobber", {x=playerpos.x, y=playerpos.y+1.5, z=playerpos.z}, dir, 15) - obj:get_luaentity()._thrower = player:get_player_name() + local obj = mcl_throwing.throw("mcl_throwing:flying_bobber", {x=playerpos.x, y=playerpos.y+1.5, z=playerpos.z}, dir, 15, player:get_player_name()) end end diff --git a/mods/ITEMS/mcl_throwing/init.lua b/mods/ITEMS/mcl_throwing/init.lua index 1c579bd8d..e3dbd5ca6 100644 --- a/mods/ITEMS/mcl_throwing/init.lua +++ b/mods/ITEMS/mcl_throwing/init.lua @@ -24,7 +24,7 @@ local velocities = { ["mcl_throwing:ender_pearl_entity"] = 22, } -mcl_throwing.throw = function(throw_item, pos, dir, velocity) +mcl_throwing.throw = function(throw_item, pos, dir, velocity, thrower) if velocity == nil then velocity = velocities[throw_item] end @@ -36,16 +36,18 @@ mcl_throwing.throw = function(throw_item, pos, dir, velocity) local obj = minetest.add_entity(pos, entity_mapping[itemstring]) obj:set_velocity({x=dir.x*velocity, y=dir.y*velocity, z=dir.z*velocity}) obj:set_acceleration({x=dir.x*-3, y=-GRAVITY, z=dir.z*-3}) + if thrower then + obj:get_luaentity()._thrower = thrower + end return obj end -- Throw item -local throw_function = function(entity_name, velocity) +local player_throw_function = function(entity_name, velocity) local func = function(item, player, pointed_thing) local playerpos = player:get_pos() local dir = player:get_look_dir() - local obj = mcl_throwing.throw(item, {x=playerpos.x, y=playerpos.y+1.5, z=playerpos.z}, dir, velocity) - obj:get_luaentity()._thrower = player:get_player_name() + local obj = mcl_throwing.throw(item, {x=playerpos.x, y=playerpos.y+1.5, z=playerpos.z}, dir, velocity, player:get_player_name()) if not minetest.settings:get_bool("creative_mode") then item:take_item() end @@ -62,9 +64,14 @@ end -- Staticdata handling because objects may want to be reloaded local get_staticdata = function(self) + local thrower + -- Only save thrower if it's a player name + if type(self._thrower) == "string" then + thrower = self._thrower + end local data = { _lastpos = self._lastpos, - _thrower = self._thrower, + _thrower = thrower, } return minetest.serialize(data) end @@ -88,6 +95,7 @@ local snowball_ENTITY={ get_staticdata = get_staticdata, on_activate = on_activate, + _thrower = nil, _lastpos={}, } @@ -101,6 +109,7 @@ local egg_ENTITY={ get_staticdata = get_staticdata, on_activate = on_activate, + _thrower = nil, _lastpos={}, } @@ -136,6 +145,38 @@ local flying_bobber_ENTITY={ objtype="fishing", } +local check_object_hit = function(self, pos, mob_damage) + for _,object in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do + + local entity = object:get_luaentity() + + if entity + and entity.name ~= self.object:get_luaentity().name then + + if object:is_player() and self._thrower ~= object:get_player_name() then + -- TODO: Deal knockback + self.object:remove() + return true + elseif entity._cmi_is_mob == true and (self._thrower ~= object) then + local dmg = {} + if mob_damage then + dmg = mob_damage(entity.name) + end + + -- FIXME: Knockback is broken + object:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = dmg, + }, nil) + + self.object:remove() + return true + end + end + end + return false +end + -- Snowball on_step()--> called when snowball is moving. local snowball_on_step = function(self, dtime) self.timer=self.timer+dtime @@ -150,6 +191,19 @@ local snowball_on_step = function(self, dtime) return end end + + local mob_damage = function(mobname) + if mobname == "mobs_mc:blaze" then + return {fleshy = 3} + else + return {} + end + end + + if check_object_hit(self, pos, mob_damage) then + return + end + self._lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set _lastpos-->Node will be added at last pos outside the node end @@ -160,7 +214,7 @@ local egg_on_step = function(self, dtime) local node = minetest.get_node(pos) local def = minetest.registered_nodes[node.name] - -- Destroy when hitting a solid node + -- Destroy when hitting a solid node with chance to spawn chicks if self._lastpos.x~=nil then if (def and def.walkable) or not def then -- 1/8 chance to spawn a chick @@ -204,6 +258,12 @@ local egg_on_step = function(self, dtime) return end end + + -- Destroy when hitting a mob or player (no chick spawning) + if check_object_hit(self, pos) then + return + end + self._lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set lastpos-->Node will be added at last pos outside the node end @@ -347,7 +407,7 @@ minetest.register_craftitem("mcl_throwing:snowball", { inventory_image = "mcl_throwing_snowball.png", stack_max = 16, groups = { weapon_ranged = 1 }, - on_use = throw_function("mcl_throwing:snowball_entity"), + on_use = player_throw_function("mcl_throwing:snowball_entity"), _on_dispense = dispense_function, }) @@ -358,7 +418,7 @@ minetest.register_craftitem("mcl_throwing:egg", { _doc_items_usagehelp = how_to_throw, inventory_image = "mcl_throwing_egg.png", stack_max = 16, - on_use = throw_function("mcl_throwing:egg_entity"), + on_use = player_throw_function("mcl_throwing:egg_entity"), _on_dispense = dispense_function, groups = { craftitem = 1 }, }) @@ -371,7 +431,7 @@ minetest.register_craftitem("mcl_throwing:ender_pearl", { wield_image = "mcl_throwing_ender_pearl.png", inventory_image = "mcl_throwing_ender_pearl.png", stack_max = 16, - on_use = throw_function("mcl_throwing:ender_pearl_entity"), + on_use = player_throw_function("mcl_throwing:ender_pearl_entity"), groups = { transport = 1 }, }) From 1c7e3500953e9e8c4743500574b4b4751d41f313 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 9 Dec 2019 11:52:19 +0100 Subject: [PATCH 377/379] Add snowball and egg impact sounds --- mods/ITEMS/mcl_throwing/README.md | 26 ++++++++++++++++++ mods/ITEMS/mcl_throwing/init.lua | 4 +++ .../sounds/mcl_throwing_egg_impact.ogg | Bin 0 -> 29927 bytes .../mcl_throwing_snowball_impact_hard.ogg | Bin 0 -> 22044 bytes .../mcl_throwing_snowball_impact_soft.ogg | Bin 0 -> 36884 bytes 5 files changed, 30 insertions(+) create mode 100644 mods/ITEMS/mcl_throwing/README.md create mode 100644 mods/ITEMS/mcl_throwing/sounds/mcl_throwing_egg_impact.ogg create mode 100644 mods/ITEMS/mcl_throwing/sounds/mcl_throwing_snowball_impact_hard.ogg create mode 100644 mods/ITEMS/mcl_throwing/sounds/mcl_throwing_snowball_impact_soft.ogg diff --git a/mods/ITEMS/mcl_throwing/README.md b/mods/ITEMS/mcl_throwing/README.md new file mode 100644 index 000000000..c91a537e8 --- /dev/null +++ b/mods/ITEMS/mcl_throwing/README.md @@ -0,0 +1,26 @@ +# `mcl_throwing` + +It's a MineClone 2 mod containing throwable items like snowballs. + +## License of code + +- MIT License + +## License of media + +- `mcl_throwing_snowball_impact_soft.ogg`: + - License: CC BY 3.0 + - Author: YleArkisto (freesound.org) + - Source: + - Original title: `sfx_snowball_hit-03.wav` (file was edited) +- `mcl_throwing_snowball_impact_hard.ogg`: + - License: CC0 + - Author: Julien Matthey (freesound.org) + - Source: + - Original title: `JM_IMPACT_01c - Snow on cement.wav` (file was edited) +- `mcl_throwing_egg_impact.ogg`: + - License: CC0 + - Author: dav0r (freesound.org) + - Source: + - Original title: `d0_step_on_egg_04` (file was edited) +- Everything else: See MineClone 2 license infos diff --git a/mods/ITEMS/mcl_throwing/init.lua b/mods/ITEMS/mcl_throwing/init.lua index e3dbd5ca6..5897a6922 100644 --- a/mods/ITEMS/mcl_throwing/init.lua +++ b/mods/ITEMS/mcl_throwing/init.lua @@ -187,6 +187,7 @@ local snowball_on_step = function(self, dtime) -- Destroy when hitting a solid node if self._lastpos.x~=nil then if (def and def.walkable) or not def then + minetest.sound_play("mcl_throwing_snowball_impact_hard", { pos = self.object:get_pos(), max_hear_distance=16, gain=0.7 }) self.object:remove() return end @@ -201,6 +202,7 @@ local snowball_on_step = function(self, dtime) end if check_object_hit(self, pos, mob_damage) then + minetest.sound_play("mcl_throwing_snowball_impact_soft", { pos = self.object:get_pos(), max_hear_distance=16, gain=0.7 }) return end @@ -254,6 +256,7 @@ local egg_on_step = function(self, dtime) end end end + minetest.sound_play("mcl_throwing_egg_impact", { pos = self.object:get_pos(), max_hear_distance=10, gain=0.5 }) self.object:remove() return end @@ -261,6 +264,7 @@ local egg_on_step = function(self, dtime) -- Destroy when hitting a mob or player (no chick spawning) if check_object_hit(self, pos) then + minetest.sound_play("mcl_throwing_egg_impact", { pos = self.object:get_pos(), max_hear_distance=10, gain=0.5 }) return end diff --git a/mods/ITEMS/mcl_throwing/sounds/mcl_throwing_egg_impact.ogg b/mods/ITEMS/mcl_throwing/sounds/mcl_throwing_egg_impact.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c4adf57a49286bcba83dbdef63747943f7f945a2 GIT binary patch literal 29927 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