diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 88370f62e..f26ccafe7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ Wow, thank you! :-) But first, some things to note: MineClone 2's development target is to make a free software clone of Minecraft, -***version 1.11***, ***PC edition***. +***version 1.12***, ***PC edition***, *** + Optifine features supported by the Minetest Engine ***. MineClone 2 is maintained by two persons. Namely, kay27 and EliasFleckenstein. You can find us in the Minetest forums (forums.minetest.net), in IRC in the #minetest diff --git a/README.md b/README.md index 12f5658e2..c94081bf0 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,8 @@ 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. -* **Target of development: Minecraft, PC Edition, version 1.11** (later known as “Java Edition”) +* **Target of development: Minecraft, PC Edition, version 1.12** (later known as “Java Edition”) +* MineClone2 also includes Optifine features supported by the Minetest * Features of later Minecraft versions might sneak in, but they have a low priority * In general, Minecraft is aimed to be cloned as good as Minetest currently permits (no hacks) * Cloning the gameplay has highest priority diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 6c63c21ab..aedff5ef8 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -405,3 +405,53 @@ function mcl_util.get_object_center(obj) pos.y = pos.y + (ymax - ymin) / 2.0 return pos end + +local get_node_emerge_queue = {} +local function ecb_get_far_node(blockpos, action, calls_remaining, param) + if calls_remaining <= 0 and param then + minetest.log("verbose","[mcl_util] ecb done for param = "..param.." node.name="..minetest.get_node(minetest.string_to_pos(param)).name) + get_node_emerge_queue[param] = nil + end +end + +function mcl_util.get_far_node(pos, force) + local node = minetest.get_node(pos) + if node.name ~= "ignore" then + return node + end + + minetest.get_voxel_manip():read_from_map(pos, pos) + node = minetest.get_node(pos) + if node.name ~= "ignore" or not force then + return node + end + + local blockpos = vector.multiply(vector.floor(vector.divide(pos, mcl_vars.MAP_BLOCKSIZE)), mcl_vars.MAP_BLOCKSIZE) + local key = minetest.pos_to_string(blockpos) + + for i=1,2 do -- give engine 2 chances to emerge the data + if not get_node_emerge_queue[key] then + get_node_emerge_queue[key] = 1 + minetest.log("verbose","[mcl_util] emerge during get_far_node("..minetest.pos_to_string(pos).."), key="..key..", blockpos="..minetest.pos_to_string(blockpos)) + minetest.emerge_area(blockpos, vector.add(blockpos, mcl_vars.MAP_BLOCKSIZE-1), ecb_get_far_node, key) + end + + while not get_node_emerge_queue[key] do end + minetest.log("verbose","[mcl_util] emerge finished for node "..minetest.pos_to_string(pos)..", key="..key..", blockpos="..minetest.pos_to_string(blockpos)..", node.name="..mcl_util.get_far_node(pos).name) + + node = minetest.get_node(pos) + if node.name ~= "ignore" then + return node + end + + minetest.get_voxel_manip():read_from_map(pos, pos) + node = minetest.get_node(pos) + if node.name ~= "ignore" or not force then + return node + end + end + + node.name = "air" -- engine continuously returns "ignore" - probably it is a bug + minetest.swap_node(pos, node) -- engine continuously returns "ignore" - probably it is a bug + return node -- engine continuously returns "ignore" - probably it is a bug +end diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 00635861f..07e2704f3 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -2501,7 +2501,7 @@ local do_states = function(self, dtime) -- stop timer if out of reach or direct line of sight elseif self.allow_fuse_reset and self.v_start - and (dist > self.reach + and (dist >= self.explosiontimer_reset_radius or not line_of_sight(self, s, p, 2)) then self.v_start = false self.timer = 0 @@ -2511,7 +2511,7 @@ local do_states = function(self, dtime) end -- walk right up to player unless the timer is active - if self.v_start and (self.stop_to_explode or dist < 1.5) then + if self.v_start and (self.stop_to_explode or dist < self.reach) then set_velocity(self, 0) else set_velocity(self, self.run_velocity) @@ -3068,7 +3068,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) local up = 2 -- if already in air then dont go up anymore when hit - if v.y > 0 + if v.y ~= 0 or self.fly then up = 0 end @@ -3789,6 +3789,7 @@ minetest.register_entity(name, { immune_to = def.immune_to or {}, explosion_radius = def.explosion_radius, -- LEGACY explosion_damage_radius = def.explosion_damage_radius, -- LEGACY + explosiontimer_reset_radius = def.explosiontimer_reset_radius, explosion_timer = def.explosion_timer or 3, allow_fuse_reset = def.allow_fuse_reset ~= false, stop_to_explode = def.stop_to_explode ~= false, diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index ee97489b5..eda74aeb4 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -108,6 +108,7 @@ functions needed for the mob to work properly which contains the following: 'explosion_timer' number of seconds before mob explodes while its target is still inside reach or explosion_damage_radius, defaults to 3. + 'explosiontimer_reset_radius' The distance you must travel before the timer will be reset. 'allow_fuse_reset' Allow 'explode' attack_type to reset fuse and resume chasing if target leaves the blast radius or line of sight. Defaults to true. diff --git a/mods/ENTITIES/mcl_paintings/init.lua b/mods/ENTITIES/mcl_paintings/init.lua index 25811d87d..6a3ccab4d 100644 --- a/mods/ENTITIES/mcl_paintings/init.lua +++ b/mods/ENTITIES/mcl_paintings/init.lua @@ -143,6 +143,7 @@ minetest.register_entity("mcl_paintings:painting", { _xsize = 1, _ysize = 1, on_activate = function(self, staticdata) + self.object:set_armor_groups({immortal = 1}) if staticdata and staticdata ~= "" then local data = minetest.deserialize(staticdata) if data then @@ -165,18 +166,20 @@ minetest.register_entity("mcl_paintings:painting", { } return minetest.serialize(data) end, - on_death = function(self, killer) - -- Drop as item on death - local kname = "" - if killer and killer:is_player() then - kname = killer:get_player_name() - end - if not minetest.is_creative_enabled(kname) then + on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage) + -- Drop as item on punch + if puncher and puncher:is_player() then + kname = puncher:get_player_name() local pos = self._pos if not pos then pos = self.object:get_pos() end - minetest.add_item(pos, "mcl_paintings:painting") + if not minetest.is_protected(pos, kname) then + self.object:remove() + if not minetest.is_creative_enabled(kname) then + minetest.add_item(pos, "mcl_paintings:painting") + end + end end end, }) diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon.png index 1a6773b24..251778ce4 100644 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon.png and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon.png differ diff --git a/mods/HUD/mcl_experience/init.lua b/mods/HUD/mcl_experience/init.lua index ff5647616..32c2d9424 100644 --- a/mods/HUD/mcl_experience/init.lua +++ b/mods/HUD/mcl_experience/init.lua @@ -238,6 +238,73 @@ function mcl_experience.add_experience(player, experience) local name = player:get_player_name() local temp_pool = pool[name] + local inv = player:get_inventory() + local candidates = { + {list = "main", index = player:get_wield_index()}, + {list = "armor", index = 2}, + {list = "armor", index = 3}, + {list = "armor", index = 4}, + {list = "armor", index = 5}, + } + local final_candidates = {} + for _, can in ipairs(candidates) do + local stack = inv:get_stack(can.list, can.index) + local wear = stack:get_wear() + if mcl_enchanting.has_enchantment(stack, "mending") and wear > 0 then + can.stack = stack + can.wear = wear + table.insert(final_candidates, can) + end + end + if #final_candidates > 0 then + local can = final_candidates[math.random(#final_candidates)] + local stack, list, index, wear = can.stack, can.list, can.index, can.wear + local unbreaking_level = mcl_enchanting.get_enchantment(stack, "unbreaking") + local uses + local armor_uses = minetest.get_item_group(stack:get_name(), "mcl_armor_uses") + if armor_uses > 0 then + uses = armor_uses + if unbreaking_level > 0 then + uses = uses / (0.6 + 0.4 / (unbreaking_level + 1)) + end + else + local def = stack:get_definition() + if def then + local fixed_uses = def._mcl_uses + if fixed_uses then + uses = fixed_uses + if unbreaking_level > 0 then + uses = uses * (unbreaking_level + 1) + end + end + end + if not uses then + local toolcaps = stack:get_tool_capabilities() + local groupcaps = toolcaps.groupcaps + for _, v in pairs(groupcaps) do + uses = v.uses + break + end + end + end + uses = uses or 0 + local multiplier = 2 * 65535 / uses + local repair = experience * multiplier + local new_wear = wear - repair + if new_wear < 0 then + experience = math.floor(-new_wear / multiplier + 0.5) + new_wear = 0 + else + experience = 0 + end + stack:set_wear(math.floor(new_wear)) + inv:set_stack(list, index, stack) + if can.list == "armor" then + local armor_inv = minetest.get_inventory({type = "detached", name = player:get_player_name() .. "_armor"}) + armor_inv:set_stack(list, index, stack) + end + end + local old_bar, old_xp, old_level = temp_pool.bar, temp_pool.xp, temp_pool.level temp_pool.xp = math.min(math.max(temp_pool.xp + experience, 0), max_xp) @@ -333,78 +400,7 @@ local function xp_step(self, dtime) acceleration = vector.new(goal.x-currentvel.x,goal.y-currentvel.y,goal.z-currentvel.z) self.object:add_velocity(vector.add(acceleration,player_velocity)) elseif distance < 0.8 then - local xp = self._xp - local inv = collector:get_inventory() - local candidates = { - {list = "main", index = collector:get_wield_index()}, - {list = "armor", index = 2}, - {list = "armor", index = 3}, - {list = "armor", index = 4}, - {list = "armor", index = 5}, - } - local final_candidates = {} - for _, can in ipairs(candidates) do - local stack = inv:get_stack(can.list, can.index) - local wear = stack:get_wear() - if mcl_enchanting.has_enchantment(stack, "mending") and wear > 0 then - can.stack = stack - can.wear = wear - table.insert(final_candidates, can) - end - end - if #final_candidates > 0 then - local can = final_candidates[math.random(#final_candidates)] - local stack, list, index, wear = can.stack, can.list, can.index, can.wear - local unbreaking_level = mcl_enchanting.get_enchantment(stack, "unbreaking") - local uses - local armor_uses = minetest.get_item_group(stack:get_name(), "mcl_armor_uses") - if armor_uses > 0 then - uses = armor_uses - if unbreaking_level > 0 then - uses = uses / (0.6 + 0.4 / (unbreaking_level + 1)) - end - else - local def = stack:get_definition() - if def then - local fixed_uses = def._mcl_uses - if fixed_uses then - uses = fixed_uses - if unbreaking_level > 0 then - uses = uses * (unbreaking_level + 1) - end - end - end - if not uses then - local toolcaps = stack:get_tool_capabilities() - local groupcaps = toolcaps.groupcaps - for _, v in pairs(groupcaps) do - uses = v.uses - break - end - end - end - uses = uses or 0 - local multiplier = 2 * 65535 / uses - local repair = xp * multiplier - local new_wear = wear - repair - if new_wear < 0 then - xp = math.floor(-new_wear / multiplier + 0.5) - new_wear = 0 - else - xp = 0 - end - stack:set_wear(math.floor(new_wear)) - inv:set_stack(list, index, stack) - if can.list == "armor" then - local armor_inv = minetest.get_inventory({type = "detached", name = collector:get_player_name() .. "_armor"}) - armor_inv:set_stack(list, index, stack) - end - end - if xp > 0 then - mcl_experience.add_experience(collector, xp) - else - minetest.sound_play("experience",{gain=0.1,to_player = name,pitch=math.random(75,99)/100}) - end + mcl_experience.add_experience(collector, self._xp) self.object:remove() end return diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 1cebed0cd..1ab6eda08 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -331,7 +331,7 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz -- Show armor and player image local player_preview - if minetest.settings:get_bool("3d_player_preview", true) then + if minetest.settings:get_bool("3d_player_preview") then player_preview = mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "") else local img, img_player diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 054424051..60ed8ba50 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -65,7 +65,7 @@ local function set_inventory(player, armor_change_only) -- Show armor and player image local player_preview - if minetest.settings:get_bool("3d_player_preview", true) then + if minetest.settings:get_bool("3d_player_preview") then player_preview = mcl_player.get_player_formspec_model(player, 1.0, 0.0, 2.25, 4.5, "") else local img, img_player diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.fr.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.fr.tr index edb15a77b..208eb01dc 100644 --- a/mods/HUD/mcl_inventory/locale/mcl_inventory.fr.tr +++ b/mods/HUD/mcl_inventory/locale/mcl_inventory.fr.tr @@ -7,7 +7,7 @@ Building Blocks=Blocs de Construction Decoration Blocks=Blocs de Décoration Redstone=Redstone Transportation=Transport -Brewing= +Brewing=Potion Miscellaneous=Divers Search Items=Rechercher des objets Foodstuffs=Denrées alimentaires diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.fr.tr b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.fr.tr index 6d608f589..061ac08a0 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.fr.tr +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.fr.tr @@ -13,8 +13,7 @@ Command Block=Bloc de Commande 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.=Les blocs de commande sont des composants redstone puissants qui sont capables de modifier la réalité elle-même. En d'autres termes, ils obligent le serveur à exécuter des commandes serveur lorsqu'ils sont alimentés en redstone. Everyone can activate a command block and look at its commands, but not everyone can edit and place them.=Tout le monde peut activer un bloc de commandes et consulter ses commandes, mais tout le monde ne peut pas les modifier et les placer. 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.=Pour afficher les commandes dans un bloc de commandes, utilisez-le. Pour activer le bloc de commande, il suffit de l'alimenter en redstone. Cela exécutera les commandes une fois. Pour exécuter à nouveau les commandes, éteignez puis rallumez le Redstone. -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 usage > 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.= -# ^ OLD TRANSLATION: Pour pouvoir placer un bloc de commande et modifier les commandes, vous devez être en mode créatif et avoir le privilège "maphack". Un nouveau bloc de commandes n'a aucune commande et ne fait rien. Utilisez le bloc de commande (en mode créatif!) Pour modifier ses commandes. Lisez l'entrée d'aide "Rubriques avancées> Commandes du serveur" pour comprendre le fonctionnement des commandes. Chaque ligne contient une seule commande. Vous les entrez comme vous le feriez dans la console, mais sans la barre oblique principale. Les commandes seront exécutées de haut en bas. +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 usage > 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.=Pour pouvoir placer un bloc de commande et modifier les commandes, vous devez être en mode créatif et avoir le privilège "maphack". Un nouveau bloc de commande n'a aucune commande et ne fait rien. Utilisez le bloc de commande (en mode créatif!) Pour modifier ses commandes. Lisez l'entrée d'aide "Utilisation avancée> Commandes du serveur" pour comprendre le fonctionnement des commandes. Chaque ligne contient une seule commande. Vous les entrez comme vous le feriez dans la console, mais sans la barre oblique principale. Les commandes seront exécutées de haut en bas. 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.=Toutes les commandes seront exécutées au nom du joueur qui a placé le bloc de commande, comme si le joueur avait tapé les commandes. Ce joueur est appelé le "commandant" du bloc. Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:=Les blocs de commande prennent en charge les espaces réservés, insérez l'un de ces espaces réservés et ils seront remplacés par un autre texte: • “@@c”: commander of this command block=• “@@c”: commandant de ce bloc que commande diff --git a/mods/ITEMS/mcl_armor/models/mcl_armor_character.blend1 b/mods/ITEMS/mcl_armor/models/mcl_armor_character.blend1 deleted file mode 100644 index 67468fd63..000000000 Binary files a/mods/ITEMS/mcl_armor/models/mcl_armor_character.blend1 and /dev/null differ diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 0f1e44c10..91164c7b3 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1348,7 +1348,7 @@ local function select_and_spawn_entity(pos, node) local node_name = node.name local node_def = minetest.registered_nodes[node_name] local double_chest = minetest.get_item_group(node_name, "double_chest") > 0 - create_entity(pos, node_name, node_def._chest_entity_textures, node.param2, double_chest, node_def._chest_entity_sound, node_def._chest_entity_mesh, node_def._chest_entity_animation_type) + find_or_create_entity(pos, node_name, node_def._chest_entity_textures, node.param2, double_chest, node_def._chest_entity_sound, node_def._chest_entity_mesh, node_def._chest_entity_animation_type) end minetest.register_lbm({ diff --git a/mods/ITEMS/mcl_chests/models/mcl_chests_shulker.b3d b/mods/ITEMS/mcl_chests/models/mcl_chests_shulker.b3d index 86dde145b..2592f86a0 100644 Binary files a/mods/ITEMS/mcl_chests/models/mcl_chests_shulker.b3d and b/mods/ITEMS/mcl_chests/models/mcl_chests_shulker.b3d differ diff --git a/mods/ITEMS/mcl_core/textures/default_diamond.png b/mods/ITEMS/mcl_core/textures/default_diamond.png index 69db99dd1..9016a8194 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_diamond.png and b/mods/ITEMS/mcl_core/textures/default_diamond.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_emerald.png b/mods/ITEMS/mcl_core/textures/mcl_core_emerald.png index 9b3fd263b..7c196ad0e 100644 Binary files a/mods/ITEMS/mcl_core/textures/mcl_core_emerald.png and b/mods/ITEMS/mcl_core/textures/mcl_core_emerald.png differ diff --git a/mods/ITEMS/mcl_enchanting/init.lua b/mods/ITEMS/mcl_enchanting/init.lua index ab3dddbd3..be1b18723 100644 --- a/mods/ITEMS/mcl_enchanting/init.lua +++ b/mods/ITEMS/mcl_enchanting/init.lua @@ -349,7 +349,7 @@ minetest.register_lbm({ nodenames = {"mcl_enchanting:table"}, run_at_every_load = true, action = function(pos) - spawn_book_entity(pos) + spawn_book_entity(pos, true) end, }) diff --git a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr new file mode 100644 index 000000000..582f0e59b --- /dev/null +++ b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr @@ -0,0 +1,100 @@ +# textdomain: mcl_enchanting +Aqua Affinity=Affinité aquatique +Increases underwater mining speed.=Augmente la vitesse de minage sous-marine. +Bane of Arthropods=Fléau des arthropodes +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Augmente les dégâts et applique la lenteur IV aux mobs arthropodes (araignées, araignées des cavernes, lépismes argentés et endermites). +Blast Protection=Protection contre les explosions +Reduces explosion damage and knockback.=Réduit les dégâts d'explosion et de recul. +Channeling=Canalisation +Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Canalise un éclair vers une cible. Fonctionne uniquement pendant les orages et si la cible n'est pas obstruée par des blocs opaques. +Curse of Binding=Malédiction du lien éterne +Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.=L'objet ne peut pas être retiré des emplacements d'armure sauf en cas de mort, de rupture ou en mode créatif. +Curse of Vanishing=Malédiction de disparition +Item destroyed on death.=Objet détruit à la mort. +Depth Strider=Agilité aquatique +Increases underwater movement speed.=Augmente la vitesse de déplacement sous l'eau. +Efficiency=Efficacité +Increases mining speed.=Augmente la vitesse de minage. +Feather Falling=Chute amortie +Reduces fall damage.=Reduit les dégats de chute. +Fire Aspect=Aura de feu +Sets target on fire.=Définit la cible en feu. +Fire Protection=Protection contre le feu +Reduces fire damage.=Reduit les dégats de feu. +Flame=Flamme +Arrows set target on fire.=Les flèches mettent le feu à la cible. +Fortune=Fortune +Increases certain block drops.=Multiplie les items droppés +Frost Walker=Semelles givrantes +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=Transforme l'eau sous le joueur en glace givrée et empêche les dommages causés par les blocs de magma. +Impaling=Empalement +Trident deals additional damage to ocean mobs.=Trident inflige des dégâts supplémentaires aux mobs océaniques. +Infinity=Infinité +Shooting consumes no regular arrows.=Le tir ne consomme pas de flèches standard. +Knockback=Recul +Increases knockback.=Augmente le recul. +Looting=Butin +Increases mob loot.=Augmente le butin des mobs. +Loyalty=Loyauté +Trident returns after being thrown. Higher levels reduce return time.=Trident revient après avoir été jeté. Des niveaux plus élevés réduisent le temps de retour. +Luck of the Sea=Chance de la mer +Increases rate of good loot (enchanting books, etc.)=Augmente le taux de bon butin (livres enchanteurs, etc.) +Lure=Appât +Decreases time until rod catches something.=Diminue le temps jusqu'à ce qu'un poisson ne morde à l'hameçon. +Mending=Raccommodage +Repair the item while gaining XP orbs.=Réparez l'objet tout en gagnant des points d'XP. +Multishot=Tir multiple +Shoot 3 arrows at the cost of one.=Tirez sur 3 flèches au prix d'une. +Piercing=Perforation +Arrows passes through multiple objects.=Les flèches traversent plusieurs objets. +Power=Puissance +Increases arrow damage.=Augmente les dégâts des flèches. +Projectile Protection=Protection contre les projectiles +Reduces projectile damage.=Réduit les dommages causés par les projectiles. +Protection=Protection +Reduces most types of damage by 4% for each level.=éduit la plupart des types de dégâts de 4% pour chaque niveau. +Punch=Frappe +Increases arrow knockback.=Augmente le recul de la flèche. +Quick Charge=Charge rapide +Decreases crossbow charging time.=Diminue le temps de chargement de l'arbalète. +Respiration=Apnée +Extends underwater breathing time.=Prolonge le temps de respiration sous l'eau. +Riptide=Impulsion +Trident launches player with itself when thrown. Works only in water or rain.=Trident lance le joueur avec lui-même lorsqu'il est lancé. Fonctionne uniquement sous l'eau ou sous la pluie. +Sharpness=Tranchant +Increases damage.=Augmente les dégâts. +Silk Touch=Toucher de soie +Mined blocks drop themselves.=Les blocs minés tombent d'eux-mêmes. +Smite=Châtiment +Increases damage to undead mobs.=Augmente les dégâts infligés aux monstres morts-vivants. +Soul Speed=Agilité des âmes +Increases walking speed on soul sand.=Augmente la vitesse de marche sur le sable de l'âme. +Sweeping Edge=Affilage +Increases sweeping attack damage.=Augmente les dégâts de l'épée +Thorns=Épines +Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.=Reflète une partie des dégâts subis lors de la frappe, au prix d'une réduction de la durabilité à chaque déclenchement. +Unbreaking=Solidité +Increases item durability.=Augmente la durabilité des objets. +Inventory=Inventaire +@1 × Lapis Lazuli=@1 × Lapis Lazuli +Enchantment levels: @1=Niveaux d'enchantement: @1 +Level requirement: @1=Niveau requis: @1 +Enchant an item=Enchanter un objet + []= [] +Usage: /enchant []=Usage: /enchant [] +Player '@1' cannot be found.=Le joueur '@1' est introuvable. +There is no such enchantment '@1'.=Il n'y a pas un tel enchantement '@1'. +The target doesn't hold an item.=La cible ne contient aucun élément. +The selected enchantment can't be added to the target item.=L'enchantement sélectionné ne peut pas être ajouté à la cible. +'@1' is not a valid number='@1' n'est pas un nombre valide +The number you have entered (@1) is too big, it must be at most @2.=Le nombre que vous avez entré (@1) est trop grand, il doit être au plus de @2. +The number you have entered (@1) is too small, it must be at least @2.=Le nombre que vous avez entré (@1) est trop petit, il doit être au moins de @2. +@1 can't be combined with @2.=@1 ne peut pas être combiné avec @2. +Enchanting succeded.=L'enchantement a réussi. +Forcefully enchant an item=Enchantement forcé d'un objet +Usage: /forceenchant []=Usage: /forceenchant [] +The target item is not enchantable.=L'objet cible n'est pas enchantable. +'@1' is not a valid number.='@1' n'est pas un nombre valide. +Enchanted Book=Livre enchanté +Enchanting Table=Table d'enchantement +Enchant=Enchantement diff --git a/mods/ITEMS/mcl_farming/hoes.lua b/mods/ITEMS/mcl_farming/hoes.lua index 0a483f304..3f4f9080d 100644 --- a/mods/ITEMS/mcl_farming/hoes.lua +++ b/mods/ITEMS/mcl_farming/hoes.lua @@ -115,7 +115,7 @@ minetest.register_tool("mcl_farming:hoe_stone", { damage_groups = { fleshy = 1, }, punch_attack_uses = uses.stone, }, - _repair_material = "mcl_core:cobblestone", + _repair_material = "mcl_core:cobble", }) minetest.register_craft({ diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr index 1a336e2c4..945a799e2 100644 --- a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr +++ b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr @@ -17,11 +17,9 @@ Fern=Fougère 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.=Les fougères sont de petites plantes qui se produisent naturellement dans les jungles et les taigas. Ils peuvent être récoltés pour les graines de blé. En utilisant de la farine d'os, une fougère peut être transformée en une grande fougère haute de deux blocs. (Top Part)=(Partie supérieure) Peony=Pivoine -A peony is a large plant which occupies two blocks. It is mainly used in dye production.= -# ^^^ OLD TRANSLATION FOR ABOVE: Une pivoine est une grande plante qui occupe deux blocs. Il est principalement utilisé dans la protection des colorants. +A peony is a large plant which occupies two blocks. It is mainly used in dye production.=Une pivoine est une grande plante qui occupe deux blocs. Principalement utilisé dans la production de colorants. Rose Bush=Rosier -A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production.= -# ^^^ OLD TRANSLATION FOR ABOVE: Un rosier est une grande plante qui occupe deux blocs. Il n'y a pas de danger à le toucher. Les rosiers sont principalement utilisés dans la protection des colorants. +A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production.=Un rosier est une grande plante qui occupe deux blocs. Il n'y a rien a craindre à le toucher. Les rosiers sont principalement utilisés dans la production de teinture. Lilac=Lilas A lilac is a large plant which occupies two blocks. It is mainly used in dye production.=Un lilas est une grande plante qui occupe deux blocs. Il est principalement utilisé dans la production de colorants. Sunflower=Tournesol diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr index 1bc756260..98f8cb2c5 100644 --- a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr @@ -40,7 +40,7 @@ Removes all status effects=Supprime tous les effets de statut! Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will remove all status effects, but restores no hunger points.=Le lait est très rafraîchissant et peut être obtenu en utilisant un seau sur une vache. Le boire supprimera tous les effets de statut, mais ne restaure aucun point de faim. -Use the placement key to drink the milk.= +Use the placement key to drink the milk.=Utilisez la clé de placement pour boire le lait. Spider Eye=Oeil d'Araignée Poisonous=Toxique @@ -78,7 +78,7 @@ Saddle=Selle Can be placed on animals to ride them=Peut être placé sur les animaux pour les monter Saddles can be put on some animals in order to mount them.=Des selles peuvent être posées sur certains animaux afin de les monter. -Use the placement key with the saddle in your hand to try to 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 using the placement key on them again.= +Use the placement key with the saddle in your hand to try to 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 using the placement key on them again.=Utilisez la clé de placement avec la selle à la main pour essayer de mettre la selle. Les selles conviennent aux chevaux, mulets, ânes et cochons. Les chevaux, les mulets et les ânes doivent d'abord être apprivoisés, sinon ils rejetteront la selle. Les animaux sellés peuvent être montés en utilisant à nouveau la clé de placement. Rabbit Stew=Ragout de Lapin Rabbit stew is a very nutricious food item.=Le ragoût de lapin est un aliment très nutritif. diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr index b01b55353..4b2598b13 100644 --- a/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr @@ -8,11 +8,8 @@ NOTE: The End dimension is currently incomplete and might change in future versi End Portal Frame with Eye of Ender=Cadre de portail de l'End avec Oeil d'Ender Nether Portal=Portail du Nether A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=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.=Tenez-vous un instant dans le portail pour activer la téléportation. Entrer pour la première fois sur un portail Nether créera également un nouveau portail dans l'autre dimension. Si un portail du Nether a été construit dans le Nether, il mènera à l'Overworld. Un portail du Nether est détruit si l'une des obsidiennes qui l'entourent est détruit, ou s'il a été pris dans une explosion. +Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Tenez-vous un instant dans le portail pour activer la téléportation. Entrer pour la première fois sur un portail Nether créera également un nouveau portail dans l'Overworld. Si un portail du Nether a été construit dans le Nether, il mènera à l'Overworld. Un portail du Nether est détruit si l'une des obsidiennes qui l'entourent est détruit, ou s'il a été pris dans une explosion. Obsidian is also used as the frame of Nether portals.=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 at least 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.= +To open a Nether portal, place an upright frame of obsidian with a width of at least 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.=Pour ouvrir un portail du Nether, placez un cadre vertical d'obsidienne d'une largeur d'au moins 4 blocs et d'une hauteur de 5 blocs, ne laissant que de l'air au centre. Après avoir placé ce cadre, allumez un feu dans le cadre d'obsidienne. Les portails du Nether ne fonctionnent que dans l'Overworld et le Nether. Once placed, an eye of ender can not be taken back.=Une fois placé, un œil d'ender ne peut pas être repris. -Used to construct end portals=Utilisé pour construire des portails d'End - -# OUTDATED: -#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.=Pour ouvrir un portail du Nether, placez un cadre vertical d'obsidienne d'une largeur de 4 blocs et d'une hauteur de 5 blocs, ne laissant que de l'air au centre. Après avoir placé ce cadre, allumez un feu dans le cadre en obsidienne. Les portails du Nether ne fonctionnent que dans l'Overworld et le Nether. +Used to construct end portals=Utilisé pour construire des portails d'End \ No newline at end of file diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr index 7cfe1f188..5aeeccf27 100644 --- a/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr +++ b/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr @@ -1,12 +1,12 @@ # textdomain: mcl_potions - []= + []= [] -Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 @= 100%)= +Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 @= 100%)=Ajoutez-vous un effet de statut. Arguments: : nom de l'effet de statut, par ex. poison. : durée en secondes. : multiplicateur de force d'effet (1 @ = 100%) -Missing effect parameter!= -Missing or invalid duration parameter!= -Invalid factor parameter!= -@1 is not an available status effect.= +Missing effect parameter!=Paramètre d'effet manquant! +Missing or invalid duration parameter!=Paramètre durée manquant ou invalide! +Invalid factor parameter!=Paramètre facteur invalide! +@1 is not an available status effect.=@1 n'est pas un effet disponible. Fermented Spider Eye=Oeil d'araignée fermenté Glass Bottle=Bouteille en verre Liquid container=Récipient de liquide @@ -25,91 +25,91 @@ River water bottles can be used to fill cauldrons. Drinking it has no effect.=Le Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.=Utilisez la touche "Utiliser" pour boire. Placez cet objet sur un chaudron pour verser l'eau de la rivière dans le chaudron. -Splash Water Bottle= -Extinguishes fire and hurts some mobs= +Splash Water Bottle=Bouteille d'eau jetable +Extinguishes fire and hurts some mobs=Éteint le feu et blesse certains mobs -A throwable water bottle that will shatter on impact, where it extinguishes nearby fire and hurts mobs that are vulnerable to water.= +A throwable water bottle that will shatter on impact, where it extinguishes nearby fire and hurts mobs that are vulnerable to water.=Une bouteille d'eau jetable qui se brisera à l'impact, où elle éteint le feu à proximité et blesse les mobs vulnérables à l'eau. -Lingering Water Bottle= +Lingering Water Bottle=Bouteille d'eau persistante -A throwable water bottle that will shatter on impact, where it creates a cloud of water vapor that lingers on the ground for a while. This cloud extinguishes fire and hurts mobs that are vulnerable to water.= +A throwable water bottle that will shatter on impact, where it creates a cloud of water vapor that lingers on the ground for a while. This cloud extinguishes fire and hurts mobs that are vulnerable to water.=Une bouteille d'eau jetable qui se brisera à l'impact, où elle crée un nuage de vapeur d'eau qui s'attarde au sol pendant un moment. Ce nuage éteint le feu et blesse les mobs vulnérables à l'eau. Glistering Melon=Melon étincelant 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.=Ce melon brillant est plein de minuscules pépites d'or et serait bien dans un cadre d'objet. Il n'est pas comestible et n'est utile à rien d'autre. -A throwable potion that will shatter on impact, where it creates a magic cloud that lingers around for a while. Any player or mob inside the cloud will receive the potion's effect, possibly repeatedly.= +A throwable potion that will shatter on impact, where it creates a magic cloud that lingers around for a while. Any player or mob inside the cloud will receive the potion's effect, possibly repeatedly.=Une potion jetable qui se brisera à l'impact, où elle crée un nuage magique qui persiste pendant un moment. Tout joueur ou mob à l'intérieur du nuage recevra l'effet de la potion, peut-être à plusieurs reprises. -Use the “Punch” key to throw it.= +Use the “Punch” key to throw it.=Utilisez la touche "Frapper" pour le lancer. Use the “Place” key to drink it.=Utilisez la touche "Utiliser" pour le boire. -Drinking a potion gives you a particular effect.= -1 HP/@1s | @2= -@1 HP= -@1 Potion= -Splash @1 Potion= -Lingering @1 Potion= -Arrow of @1= - II= - IV= -@1 Potion@2= -Splash @1@2 Potion= -Lingering @1@2 Potion= -Arrow of @1@2= -@1 + Potion= -Splash @1 + Potion= -Lingering @1 + Potion= -Arrow of @1 += -Awkward Potion=Potion maladroite -Awkward Splash Potion= -Awkward Lingering Potion= -Has an awkward taste and is used for brewing potions.= -Mundane Potion=Potion mondaine -Mundane Splash Potion= -Mundane Lingering Potion= -Has a terrible taste and is not useful for brewing potions.= +Drinking a potion gives you a particular effect.=Boire une potion vous donne un effet particulier. +1 HP/@1s | @2=1 HP/@1s | @2 +@1 HP=@1 HP +@1 Potion=Potion @1 +Splash @1 Potion=Potion @1 jettable +Lingering @1 Potion=Potion @1 persistante +Arrow of @1=Flêche de @1 + II= II + IV= IV +@1 Potion@2=@1 Potion@2 +Splash @1@2 Potion=Potion @1@2 jettable +Lingering @1@2 Potion=Potion @1@2 persistante +Arrow of @1@2=Flêche de @1@2 +@1 + Potion=@1 + Potion +Splash @1 + Potion=Potion @1 + jettable +Lingering @1 + Potion=Potion @1 + persistante +Arrow of @1 +=Flêche de @1 + +Awkward Potion=Potion étrange +Awkward Splash Potion=Potion étrange jetable +Awkward Lingering Potion=Potion étrange persistante +Has an awkward taste and is used for brewing potions.=A un goût étrange et est utilisé pour préparer des potions. +Mundane Potion=Potion banale +Mundane Splash Potion=Potion banale jetable +Mundane Lingering Potion=Potion banale persistante +Has a terrible taste and is not useful for brewing potions.=A un goût terrible et n'est pas utile pour préparer des potions. Thick Potion=Potion épaisse -Thick Splash Potion= -Thick Lingering Potion= -Has a bitter taste and is not useful for brewing potions.= -Dragon's Breath=Le souffle du dragon +Thick Splash Potion=Potion épaisse jetable +Thick Lingering Potion=Potion épaisse persistante +Has a bitter taste and is not useful for brewing potions.=A un goût amer et n'est pas utile pour préparer des potions. +Dragon's Breath=Souffle du dragon -This item is used in brewing and can be combined with splash potions to create lingering potions.= +This item is used in brewing and can be combined with splash potions to create lingering potions.=Cet objet est utilisé dans le brassage et peut être combiné avec des potions d'éclaboussures pour créer des potions persistantes. -Healing= -+4 HP= -+8 HP= -Instantly heals.= -Harming= --6 HP= --12 HP= -Instantly deals damage.= -Night Vision= -Increases the perceived brightness of light under a dark sky.= -Swiftness= -Increases walking speed.= -Slowness= -Decreases walking speed.= -Leaping= -Increases jump strength.= -Poison= -Applies the poison effect which deals damage at a regular interval.= -Regeneration= -Regenerates health over time.= -Invisibility= -Grants invisibility.= -Water Breathing= -Grants limitless breath underwater.= -Fire Resistance= -Grants immunity to damage from heat sources like fire.= -Weakness= -Weakness += -Strength= -Strength II= -Strength += -Try different combinations to create potions.= +Healing=Guérison ++4 HP=+4 HP ++8 HP=+8 HP +Instantly heals.=Guérit instantanément. +Harming=Dégâts +-6 HP=-6 HP +-12 HP=-12 HP +Instantly deals damage.=Instantly deals damage. +Night Vision=Vision Nocturne +Increases the perceived brightness of light under a dark sky.=Augmente la luminosité perçue de la lumière sous un ciel sombre. +Swiftness=Rapidité +Increases walking speed.=Augmente la vitesse de marche. +Slowness=Lenteur +Decreases walking speed.=Diminue la vitesse de marche. +Leaping=Saut +Increases jump strength.=Augmente la force de saut. +Poison=Poison +Applies the poison effect which deals damage at a regular interval.=Applique l'effet de poison qui inflige des dégâts à intervalle régulier. +Regeneration=Régénération +Regenerates health over time.=Régénère la santé au fil du temps. +Invisibility=Invisibilité +Grants invisibility.=Accorde l'invisibilité. +Water Breathing=Respiration Aquatique +Grants limitless breath underwater.=Donne une respiration illimitée sous l'eau. +Fire Resistance=Résistance au Feu +Grants immunity to damage from heat sources like fire.=Confère une immunité aux dommages causés par des sources de chaleur comme le feu. +Weakness=Faiblesse +Weakness +=Faiblesse + +Strength=Force +Strength II=Force II +Strength +=Force + +Try different combinations to create potions.=Essayez différentes combinaisons pour créer des potions. No effect=Aucun effet -A throwable potion that will shatter on impact, where it gives all nearby players and mobs a status effect.= +A throwable potion that will shatter on impact, where it gives all nearby players and mobs a status effect.=Une potion jetable qui se brisera à l'impact, où elle donne à tous les joueurs et créatures proches un effet de statut. -This particular arrow is tipped and will give an effect when it hits a player or mob.= +This particular arrow is tipped and will give an effect when it hits a player or mob.=Cette flèche particulière est enchantée et donnera un effet lorsqu'elle touche un joueur ou un mob. diff --git a/mods/MAPGEN/mcl_villages/buildings.lua b/mods/MAPGEN/mcl_villages/buildings.lua index 6dfa807bf..0d58739ed 100644 --- a/mods/MAPGEN/mcl_villages/buildings.lua +++ b/mods/MAPGEN/mcl_villages/buildings.lua @@ -4,7 +4,7 @@ ------------------------------------------------------------------------------- function settlements.build_schematic(vm, data, va, pos, building, replace_wall, name) -- get building node material for better integration to surrounding - local platform_material = minetest.get_node_or_nil(pos) + local platform_material = mcl_util.get_far_node(pos, true) if not platform_material then return end diff --git a/mods/MAPGEN/mcl_villages/depends.txt b/mods/MAPGEN/mcl_villages/depends.txt index 9ba29f3ee..e9d14ad9b 100644 --- a/mods/MAPGEN/mcl_villages/depends.txt +++ b/mods/MAPGEN/mcl_villages/depends.txt @@ -1,3 +1,4 @@ +mcl_util mcl_core mcl_loot mcl_farming? diff --git a/mods/MAPGEN/mcl_villages/foundation.lua b/mods/MAPGEN/mcl_villages/foundation.lua index 15936ef4c..98726966c 100644 --- a/mods/MAPGEN/mcl_villages/foundation.lua +++ b/mods/MAPGEN/mcl_villages/foundation.lua @@ -52,8 +52,7 @@ function settlements.terraform(settlement_info, pr) else -- write ground local p = {x=pos.x+xi, y=pos.y+yi, z=pos.z+zi} - minetest.forceload_block(p) - local node = minetest.get_node_or_nil(p) + local node = mcl_util.get_far_node(p, true) if node and node.name ~= "air" then minetest.swap_node(p,{name="air"}) end diff --git a/mods/MAPGEN/mcl_villages/init.lua b/mods/MAPGEN/mcl_villages/init.lua index 6413174db..287b4c9be 100644 --- a/mods/MAPGEN/mcl_villages/init.lua +++ b/mods/MAPGEN/mcl_villages/init.lua @@ -94,11 +94,8 @@ if mg_name ~= "singlenode" then -- don't build settlements on (too) uneven terrain local height_difference = settlements.evaluate_heightmap(minp, maxp) if height_difference > max_height_difference then return end - - -- new way - slow :((((( - minetest.emerge_area(vector.subtract(minp,24), vector.add(maxp,24), ecb_build_a_settlement, {minp = vector.new(minp), maxp=vector.new(maxp), blockseed=blockseed}) - -- old way - wait 3 seconds: - -- minetest.after(3, ecb_build_a_settlement, nil, 1, 0, {minp = vector.new(minp), maxp=vector.new(maxp), blockseed=blockseed}) + -- we need 'minetest.after' here to exit from emerging thread we probably currently in: + minetest.after(0.1, build_a_settlement_no_delay, vector.new(minp), vector.new(maxp), blockseed) end) end -- manually place villages diff --git a/mods/MAPGEN/mcl_villages/utils.lua b/mods/MAPGEN/mcl_villages/utils.lua index 96d540b57..c539e7dc1 100644 --- a/mods/MAPGEN/mcl_villages/utils.lua +++ b/mods/MAPGEN/mcl_villages/utils.lua @@ -51,7 +51,7 @@ function settlements.find_surface(pos) local itter -- count up or down local cnt_max = 200 -- check, in which direction to look for surface - local surface_node = minetest.get_node_or_nil(p6) + local surface_node = mcl_util.get_far_node(p6, true) if surface_node and string.find(surface_node.name,"air") then itter = -1 else @@ -60,32 +60,16 @@ function settlements.find_surface(pos) -- go through nodes an find surface while cnt < cnt_max do cnt = cnt+1 - minetest.forceload_block(p6) - surface_node = minetest.get_node_or_nil(p6) - - if not surface_node then - -- Load the map at pos and try again - minetest.get_voxel_manip():read_from_map(p6, p6) - surface_node = minetest.get_node(p6) - if surface_node.name == "ignore" then - settlements.debug("find_surface1: nil or ignore") - return nil - end + surface_node = mcl_util.get_far_node(p6, true) + if surface_node.name == "ignore" then + settlements.debug("find_surface1: nil or ignore") + return nil end - -- if surface_node == nil or surface_node.name == "ignore" then - -- --return nil - -- local fl = minetest.forceload_block(p6) - -- if not fl then - -- - -- return nil - -- end - -- end - -- -- Check Surface_node and Node above -- if settlements.surface_mat[surface_node.name] then - local surface_node_plus_1 = minetest.get_node_or_nil({ x=p6.x, y=p6.y+1, z=p6.z}) + local surface_node_plus_1 = mcl_util.get_far_node({ x=p6.x, y=p6.y+1, z=p6.z}, true) if surface_node_plus_1 and surface_node and (string.find(surface_node_plus_1.name,"air") or string.find(surface_node_plus_1.name,"snow") or @@ -257,7 +241,7 @@ function settlements.initialize_nodes(settlement_info, pr) for xi = 0,width do for zi = 0,depth do local ptemp = {x=p.x+xi, y=p.y+yi, z=p.z+zi} - local node = minetest.get_node(ptemp) + local node = mcl_util.get_far_node(ptemp, true) if node.name == "mcl_furnaces:furnace" or node.name == "mcl_chests:chest" or node.name == "mcl_anvils:anvil" then diff --git a/mods/PLAYER/mcl_meshhand/init.lua b/mods/PLAYER/mcl_meshhand/init.lua index 8d878a16f..14bf10090 100644 --- a/mods/PLAYER/mcl_meshhand/init.lua +++ b/mods/PLAYER/mcl_meshhand/init.lua @@ -13,14 +13,14 @@ 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.."shield", { + minetest.register_node("mcl_meshhand:"..texture, { description = "", tiles = {texture..".png"}, visual_scale = 1, wield_scale = {x=1,y=1,z=1}, paramtype = "light", drawtype = "mesh", - mesh = "mcl_meshhand_shield.b3d", + mesh = "mcl_meshhand.b3d", -- Prevent construction node_placement_prediction = "", on_construct = function(pos) @@ -34,29 +34,6 @@ for _,texture in pairs(list) do groups = { dig_immediate = 3, not_in_creative_inventory = 1 }, range = def.range, }) - - minetest.register_node("mcl_meshhand:"..texture, { - description = "", - tiles = {texture..".png"}, - visual_scale = 1, - wield_scale = {x=1,y=1,z=1}, - paramtype = "light", - drawtype = "mesh", - mesh = "mcl_meshhand.b3d", - -- 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, - 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 diff --git a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand_shield.b3d b/mods/PLAYER/mcl_meshhand/models/mcl_meshhand_shield.b3d deleted file mode 100644 index 43eb2824e..000000000 Binary files a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand_shield.b3d and /dev/null differ diff --git a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand_shield.blend b/mods/PLAYER/mcl_meshhand/models/mcl_meshhand_shield.blend deleted file mode 100644 index d469e2174..000000000 Binary files a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand_shield.blend and /dev/null differ diff --git a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand_shield.blend1 b/mods/PLAYER/mcl_meshhand/models/mcl_meshhand_shield.blend1 deleted file mode 100644 index 50b6ad72c..000000000 Binary files a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand_shield.blend1 and /dev/null differ diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index e6610caa0..262182e4a 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -155,7 +155,9 @@ minetest.register_globalstep(function(dtime) end -- ask if player is swiming - local standing_on_water = minetest.get_item_group(mcl_playerinfo[name].node_stand, "water") ~= 0 + standing_on_water = minetest.get_item_group(mcl_playerinfo[name].node_stand, "water") ~= 0 + + -- Apply animations based on what the player is doing if player:get_hp() == 0 then diff --git a/settingtypes.txt b/settingtypes.txt index 7acccf91c..264757db8 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -95,7 +95,7 @@ fire_animation_frames (Fire Animation Frames) int 8 animated_chests (Animated chests) bool true # Whether to preview the player in inventory in 3D (requires Minetest 5.4) -3d_player_preview (3D Player preview) bool true +3d_player_preview (3D Player preview) bool false [Experimental] # Whether ice is translucent. If disabled, ice is fully opaque. diff --git a/tools/check_translate_files.py b/tools/check_translate_files.py index 445dc9151..ec3c3944a 100644 --- a/tools/check_translate_files.py +++ b/tools/check_translate_files.py @@ -1,8 +1,9 @@ # Output indicator # !< Indicates a text line without '=' in template.txt -# << Indicates an untranslated line in template.txt +# << Indicates an untranslated line in template.txt or an extra line in translate file (.tr) # !> Indicates a text line without '=' in translate file (.tr) # >> Indicates an unknown translated line in translate file (.tr) +# >= Indicate an untrannslated entry in translate file (.tr) # >> Missing file: Indicates a missing translate file (.tr) import os @@ -15,7 +16,7 @@ args = parser.parse_args() path = "../mods/" code_lang = args.language -def LoadTranslateFile(filename, direction): +def LoadTranslateFile(filename, direction, ref=None): result = set() file = open(filename, 'r', encoding="utf-8") for line in file: @@ -23,15 +24,18 @@ def LoadTranslateFile(filename, direction): if line.startswith('#') or line == '': continue if '=' in line: - result.add(line.split('=')[0]) + parts = line.split('=') + result.add(parts[0]) + if ref is not None and parts[1] == '' and parts[1] not in ref : + print ('>= ' + parts[0]) else: print (direction + line) return result def CompareFiles(f1, f2): - r1 = LoadTranslateFile(f1, "!> ") - r2 = LoadTranslateFile(f2, "!< ") + r1 = LoadTranslateFile(f1, "!< ") + r2 = LoadTranslateFile(f2, "!> ", r1) for key in r1.difference(r2): print (">> " + key ) @@ -57,5 +61,5 @@ for root, directories, files in os.walk(path): print("Compare files %s with %s" % (template, language)) CompareFiles(template, language) else: - LoadTranslateFile(filename, "!> ") + LoadTranslateFile(template, "!< ") print(">> Missing file = " + language)