diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dc8c4a5ee..b5a11ee1e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -76,7 +76,7 @@ in singleplayer, post a screenshot of the message that Minetest showed when the crash happened (or copy the message into your issue). If you are a server admin, you can find error messages in the log file of the server. -* Tell us which MineClone2 and Minetest versions you are using. +* Tell us which MineClone2 and Minetest versions you are using (from Minetest 5.7 type /ver, for previous versions, check the game.conf or README.md file). * Tell us how to reproduce the problem: What you were doing to trigger the bug, e.g. before the crash happened or what causes the faulty behavior. diff --git a/CREDITS.md b/CREDITS.md index c1307a3bc..3584cae1e 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -36,7 +36,8 @@ * MrRar * talamh * Faerraven / Michieal -* FossFanatic +* FossFanatic +* SmokeyDope ## Contributors * Laurent Rocher @@ -81,15 +82,12 @@ * aldum * Dieter44 * Pepebotella -* MrRar * Lazerbeak12345 * mrminer * Thunder1035 * opfromthestart * snowyu * FaceDeer -* Faerraven / Michieal -* FossFanatic * Herbert West * GuyLiner * 3raven @@ -101,8 +99,8 @@ * b3nderman * CyberMango * gldrk -* SmokeyDope * atomdmac +* emptyshore ## MineClone5 * kay27 @@ -176,6 +174,7 @@ * cora * Faerraven / Michieal * Nicu +* Exhale ## Translations * Wuzzy diff --git a/RELEASE.md b/RELEASE.md index 144e1729a..4d82ab9e3 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -13,15 +13,15 @@ git add game.conf #git add RELEASE.md -git commit -m "Pre-release update credits and set version 0.82.0" +git commit -m "Pre-release update credits and set version 0.83.0" -git tag 0.82.0 +git tag 0.83.0 -git push origin 0.82.0 +git push origin 0.83.0 -#Update version in game.conf to -SNAPSHOT +#Update version in game.conf to the next version with -SNAPSHOT suffix -git commit -m "Post-release set version 0.82.0-SNAPSHOT" +git commit -m "Post-release set version 0.84.0-SNAPSHOT" ### Hotfix Release diff --git a/TEXTURES.md b/TEXTURES.md new file mode 100644 index 000000000..1cf10641f --- /dev/null +++ b/TEXTURES.md @@ -0,0 +1,57 @@ +# Making Textures In Mineclone2 + +Textures are a crucial asset for all items, nodes, and models in mineclone2. This document is for artist who would like to make and modify textures for mineclone2. While no means comprehensive, this document contains the basic important information for beginners to get started with texture curation and optimization. + +## Minetest Wiki +For more detailed information on creating and modifing texture packs for Minetest/Mineclone2, please visit the Minetest wiki's page on creating a texture pack. Click [here](https://wiki.minetest.net/Creating_texture_packs) to view the wiki page on creating texture packs. + +## GIMP Tutorials Pixel Art Guide +GIMP Tutorials has an excellent guide to making pixel art in GIMP. If you would like further clarification as well as screenshots for what we are about to cover, it is an excellent resource to turn to. Click [here](https://thegimptutorials.com/how-to-make-pixel-art/) to view the guide + +## Recommended Software + +### GIMP + +GIMP (Gnu Image Manipulation Program) is a very popular and free image editing software supported on Windows, MacOS, and most Linux distributions. It is recommended to use GIMP to create and modify textures within the minetest engine. + +Download GIMP [here](http://gimp.org/) + +# Getting Started +## Creating a new file +the first thing to do is open GIMP and create a new file to work in by opening the File menu and choosing New. + +Choose width of 16 and height of 16 for the image size. While higher resolution textures are possible, The default size is 16x16. It is recommended you use this size as well, as it is universally supported on all systems. + +## Zoom In +Next, you'll want to zoom in as the canvas is very small at the default zoom level. To do this either use CTRL + mousewheel, +/-, or navigate to the View menu > zoom > zoom in + +## Configure Grid +Now, we'll want to turn on the grid. Open the edit menu and enable the 'show grid' option. + +The default grid size is 10 pixels, we want to change it to a 1 pixel grid. Go to the Image menu and choose 'configure grid. + +In the Spacing section, change both the Horizontal and Vertical pixel settings to 1.00 then click ok and the grid will update. + +## Pencil Tool & Color Picking +The most useful brush type for pixel art is the Pencil tool. Its nested under the paintbrush tool in the toolbox, or you can use the keyboard shortcut 'N'. + +Once the pencil tool is selected, navigate to the sliders on the left side of the canvas and change brush size to 1 pixel. + +Now choose a color! You can do this by clicking on the two colored squares under the toolbox. The Color Picker tool is also a good option if you already have a reference image for color palette. + +## How to export optimally + +Once you have finished up a texture and are ready to export it, navigate to the file menu > export as... and make sure the file name extention is .png + +After clicking 'Export', a menu will appear with a bunch of options checked. Make sure to uncheck all of these options!!! This will drastically reduce the file size from multiple kilobytes to a couple of hundred bytes. Finally click 'Export' one more time. + +### Further optimization with OptiPNG +For those running a GNU/linux distribution, you most likely have the 'optipng' command available to you. If it does not come with your system by default, the software homepage can be found [here](https://optipng.sourceforge.net/) where you can download and install from source. + +First, Open up the terminal in the directory where your exported texture is located (or navigate to the directory with the 'cd your/directory/path/to/textures'), then run this command +``` +optipng -o7 -zm1-9 -nc -clobber *.png +``` +This will further optimize all the textures in the directory. + +NOTE: If you would like to further edit a texture that has been optipng'd in GIMP, you must manually set the color palette back to RBG after opening. Navigate to Image menu > Mode > select RGB diff --git a/game.conf b/game.conf index b364f026f..a7716f284 100644 --- a/game.conf +++ b/game.conf @@ -1,4 +1,4 @@ title = MineClone 2 description = A survival sandbox game. Survive, gather, hunt, build, explore, and do much more. disallowed_mapgens = v6 -version=0.82.0-SNAPSHOT \ No newline at end of file +version=0.84.0-SNAPSHOT \ No newline at end of file diff --git a/mods/CORE/mcl_explosions/init.lua b/mods/CORE/mcl_explosions/init.lua index 2b8b25b1e..c6a6d192f 100644 --- a/mods/CORE/mcl_explosions/init.lua +++ b/mods/CORE/mcl_explosions/init.lua @@ -352,6 +352,23 @@ local function trace_explode(pos, strength, raydirs, radius, info, direct, sourc end end end + + -- Punch End Crystals to make them explode + if ent and ent.name == "mcl_end:crystal" then + if direct then + local puncher = direct:get_luaentity() + if puncher and puncher.name == "mcl_end:crystal" then + ent.object:punch(direct, 1.0, { -- End Crystal nearby, trigger it. + full_punch_interval = 1.0, + damage_groups = {fleshy = 1}, + }, nil, nil) + else + ent.object:remove() -- Direct Exists, but it is not an end crystal, remove crystal. + end + else + ent.object:remove() -- Node exploded the end crystal, remove it. + end + end end local airs, fires = {}, {} diff --git a/mods/CORE/mcl_explosions/locale/mcl_explosions.fr.tr b/mods/CORE/mcl_explosions/locale/mcl_explosions.fr.tr new file mode 100644 index 000000000..7804d608c --- /dev/null +++ b/mods/CORE/mcl_explosions/locale/mcl_explosions.fr.tr @@ -0,0 +1,2 @@ +# textdomain:mcl_explosions +@1 was caught in an explosion.=@1 est mort dans une explosion \ No newline at end of file diff --git a/mods/CORE/mcl_explosions/locale/template.txt b/mods/CORE/mcl_explosions/locale/template.txt new file mode 100644 index 000000000..656b444f9 --- /dev/null +++ b/mods/CORE/mcl_explosions/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain:mcl_explosions +@1 was caught in an explosion.= \ No newline at end of file diff --git a/mods/CORE/mcl_oxidation/README.md b/mods/CORE/mcl_oxidation/README.md new file mode 100644 index 000000000..3f3291b19 --- /dev/null +++ b/mods/CORE/mcl_oxidation/README.md @@ -0,0 +1,14 @@ +# Oxidization API for MineClone 2 +This mods adds the oxidization api, so that modders can easily use the same features that copper uses. + +## API +To take advantage of the actual oxidization, put `oxidizable = 1` into the list of groups for the oxidizable node. +You would also need to put `_mcl_oxidized_variant = itemstring of node this node will oxidize into` into the node definition. +For example, a copper block oxidizes into exposed copper, so the defintion would be `_mcl_oxidized_variant = "mcl_copper:block_exposed"`. + +To utilize the ability to wax the block for protection from oxidization, put `mcl_waxed_variant = item string of waxed variant of node` into the node definition table. +For example, Copper Blocks have the definition arguement of `_mcl_waxed_variant = "mcl_copper:waxed_block"`. + +For waxed nodes, scraping is easy. Start by putting `waxed = 1` into the list of groups of the waxed node. +Next put `_mcl_stripped_variant = item string of the unwaxed variant of the node` into the defintion table. +Wxaed Copper Blocks can be scrapped into normal Copper Blocks because of the definition `_mcl_stripped_variant = "mcl_copper:block"`. diff --git a/mods/CORE/mcl_oxidation/init.lua b/mods/CORE/mcl_oxidation/init.lua new file mode 100644 index 000000000..201d0260a --- /dev/null +++ b/mods/CORE/mcl_oxidation/init.lua @@ -0,0 +1,12 @@ +minetest.register_abm({ + label = "Oxidatize Nodes", + nodenames = { "group:oxidizable" }, + interval = 500, + chance = 3, + action = function(pos, node) + local def = minetest.registered_nodes[node.name] + if def and def._mcl_oxidized_variant then + minetest.set_node(pos, { name = def._mcl_oxidized_variant, param2 = node.param2 }) + end + end, +}) diff --git a/mods/CORE/mcl_oxidation/mod.conf b/mods/CORE/mcl_oxidation/mod.conf new file mode 100644 index 000000000..7ab7eeffe --- /dev/null +++ b/mods/CORE/mcl_oxidation/mod.conf @@ -0,0 +1,4 @@ +name = mcl_oxidation +title = Oxidation API for MineClone 2 +author = PrairieWind, N011, Michael +description = API to allow oxidizing different nodes. diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index b6c0956cd..5872ce742 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -34,6 +34,64 @@ function mcl_util.mcl_log(message, module, bypass_default_logger) end end +local player_timers = {} + +-- This is a dtime timer than can be used in on_step functions so it works every x seconds +-- self - Object you want to store timer data on. E.g. mob or a minecart, or player_name +-- dtime - The time since last run of on_step, should be passed in to function +-- timer_name - This is the name of the timer and also the key to store the data. No spaces + lowercase. +-- threshold - The time before it returns successful. 0.2 if you want to run it 5 times a second. +function mcl_util.check_dtime_timer(self, dtime, timer_name, threshold) + if not self or not threshold or not dtime then return end + if not timer_name or timer_name == "" then return end + + if type(self) == "string" then + local player_name = self + if not player_timers[player_name] then + player_timers[player_name] = {} + end + self = player_timers[player_name] + end + + if not self._timers then + self._timers = {} + end + + if not self._timers[timer_name] then + self._timers[timer_name] = 0 + else + self._timers[timer_name] = self._timers[timer_name] + dtime + --minetest.log("dtime: " .. tostring(self._timers[timer_name])) + end + + if self._timers[timer_name] > threshold then + --minetest.log("Over threshold") + self._timers[timer_name] = 0 + return true + --else + --minetest.log("Not over threshold") + end + return false +end + +-- Minetest 5.3.0 or less can only measure the light level. This came in at 5.4 +-- This function has been known to fail in multiple places so the error handling is added increase safety and improve +-- debugging. See: +-- https://git.minetest.land/MineClone2/MineClone2/issues/1392 +function mcl_util.get_natural_light (pos, time) + local status, retVal = pcall(minetest.get_natural_light, pos, time) + if status then + return retVal + else + minetest.log("warning", "Failed to get natural light at pos: " .. dump(pos) .. ", time: " .. dump(time)) + if (pos) then + local node = minetest.get_node(pos) + minetest.log("warning", "Node at pos: " .. dump(node.name)) + end + end + return 0 +end + function mcl_util.file_exists(name) if type(name) ~= "string" then return end local f = io.open(name) diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.es.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.es.tr index 644efdb6b..d3596e056 100644 --- a/mods/ENTITIES/mcl_boats/locale/mcl_boats.es.tr +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.es.tr @@ -8,3 +8,6 @@ Jungle Boat=Barca de la selva Oak Boat=Barca de roble 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.=Haga clic derecho en una fuente de agua para colocar el barco. Haga clic derecho en el barco para entrar. Utilice [Izquierda] y [Derecha] para dirigir, [Adelante] para acelerar y [Atrás] para reducir la velocidad o retroceder. Haga clic derecho en el barco nuevamente para dejarlo, golpee el barco para que se caiga como un artículo. Spruce Boat=Barca de abeto +Water vehicle=Vehículo acuático +Sneak to dismount=Agáchate para bajar +Obsidian Boat=Barca de obsidiana diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr index 76905c1f3..e1ecd9b01 100644 --- a/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr @@ -11,3 +11,11 @@ Spruce Boat=Bateau en sapin Water vehicle=Véhicule aquatique Sneak to dismount=Se baisser pour descendre Obsidian Boat=Bateau en obsidienne +Mangrove Boat=Bateau en palétuvier +Oak Chest Boat=Bateau en chêne avec coffre +Spruce Chest Boat=Bateau en sapin avec coffre +Birch Chest Boat=Bateau en bouleau avec coffre +Jungle Chest Boat=Bateau en acajou avec coffre +Acacia Chest Boat=Bateau en acacia avec coffre +Dark Oak Chest Boat=Bateau en chêne noir avec coffre +Mangrove Chest Boat=Bateau en palétuvier avec coffre diff --git a/mods/ENTITIES/mcl_boats/locale/template.txt b/mods/ENTITIES/mcl_boats/locale/template.txt index c071f3ed4..16c8b681e 100644 --- a/mods/ENTITIES/mcl_boats/locale/template.txt +++ b/mods/ENTITIES/mcl_boats/locale/template.txt @@ -10,4 +10,12 @@ Rightclick on a water source to place the boat. Rightclick the boat to enter it. Spruce Boat= Water vehicle= Sneak to dismount= -Obsidian Boat= \ No newline at end of file +Obsidian Boat= +Mangrove Boat= +Oak Chest Boat= +Spruce Chest Boat= +Birch Chest Boat= +Jungle Chest Boat= +Acacia Chest Boat= +Dark Oak Chest Boat= +Mangrove Chest Boat= diff --git a/mods/ENTITIES/mcl_burning/api.lua b/mods/ENTITIES/mcl_burning/api.lua index cba73b846..74c66d5f1 100644 --- a/mods/ENTITIES/mcl_burning/api.lua +++ b/mods/ENTITIES/mcl_burning/api.lua @@ -5,7 +5,12 @@ function mcl_burning.get_storage(obj) end function mcl_burning.is_burning(obj) - return mcl_burning.get_storage(obj).burn_time + local storage = mcl_burning.get_storage(obj) + if storage then + return mcl_burning.get_storage(obj).burn_time + else + return false + end end function mcl_burning.is_affected_by_rain(obj) diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.es.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.es.tr new file mode 100644 index 000000000..9bf17e1bb --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.es.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +@1 was smashed by a falling anvil.=@1 fue aplastado por un yunque. +@1 was smashed by a falling block.=@1 fue aplastado por un bloque. diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr new file mode 100644 index 000000000..5d311d3e2 --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +@1 was smashed by a falling anvil.=@1 a été écrasé par une enclume +@1 was smashed by a falling block.=@1 a été écrasé par un bloc 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..4adabaf01 --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +@1 was smashed by a falling anvil.= +@1 was smashed by a falling block.= diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 48a2f34cb..149b5ed93 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -7,12 +7,7 @@ local pool = {} local tick = false -local LOGGING_ON = minetest.settings:get_bool("mcl_logging_item_entities", false) -local function mcl_log(message) - if LOGGING_ON then - mcl_util.mcl_log(message, "[Item Entities]", true) - end -end + minetest.register_on_joinplayer(function(player) pool[player:get_player_name()] = 0 @@ -408,114 +403,176 @@ local function cxcz(o, cw, one, zero) return o end -local function hopper_take_item(self, pos) - --mcl_log("self.itemstring: ".. self.itemstring) - --mcl_log("self.itemstring: ".. minetest.pos_to_string(pos)) +local function nodes_destroy_items (self, moveresult, def, nn) + local lg = minetest.get_item_group(nn, "lava") + local fg = minetest.get_item_group(nn, "fire") + local dg = minetest.get_item_group(nn, "destroys_items") - local objs = minetest.get_objects_inside_radius(pos, 2) + if (def and (lg ~= 0 or fg ~= 0 or dg == 1)) then + local item_string = self.itemstring + local item_name = ItemStack(item_string):get_name() - if objs and self.itemstring then - --mcl_log("there is an itemstring. Number of objs: ".. #objs) - - for k, v in pairs(objs) do - local ent = v:get_luaentity() - - -- Don't forget actual hoppers - if ent and ent.name == "mcl_minecarts:hopper_minecart" then - local taken_items = false - - mcl_log("ent.name: " .. tostring(ent.name)) - mcl_log("ent pos: " .. tostring(ent.object:get_pos())) - - local inv = mcl_entity_invs.load_inv(ent, 5) - - if not inv then - mcl_log("No inv") - return false - end - - local current_itemstack = ItemStack(self.itemstring) - - mcl_log("inv. size: " .. ent._inv_size) - if inv:room_for_item("main", current_itemstack) then - mcl_log("Room") - inv:add_item("main", current_itemstack) - self.object:get_luaentity().itemstring = "" - self.object:remove() - taken_items = true - else - mcl_log("no Room") - end - - if not taken_items then - local items_remaining = current_itemstack:get_count() - - -- This will take part of a floating item stack if no slot can hold the full amount - for i = 1, ent._inv_size, 1 do - local stack = inv:get_stack("main", i) - - mcl_log("i: " .. tostring(i)) - mcl_log("Items remaining: " .. items_remaining) - mcl_log("Name: " .. tostring(stack:get_name())) - - if current_itemstack:get_name() == stack:get_name() then - mcl_log("We have a match. Name: " .. tostring(stack:get_name())) - - local room_for = stack:get_stack_max() - stack:get_count() - mcl_log("Room for: " .. tostring(room_for)) - - if room_for == 0 then - -- Do nothing - mcl_log("No room") - elseif room_for < items_remaining then - mcl_log("We have more items remaining than space") - - items_remaining = items_remaining - room_for - stack:set_count(stack:get_stack_max()) - inv:set_stack("main", i, stack) - taken_items = true - else - local new_stack_size = stack:get_count() + items_remaining - stack:set_count(new_stack_size) - mcl_log("We have more than enough space. Now holds: " .. new_stack_size) - - inv:set_stack("main", i, stack) - items_remaining = 0 - - self.object:get_luaentity().itemstring = "" - self.object:remove() - - taken_items = true - break - end - - mcl_log("Count: " .. tostring(stack:get_count())) - mcl_log("stack max: " .. tostring(stack:get_stack_max())) - --mcl_log("Is it empty: " .. stack:to_string()) - end - - if i == ent._inv_size and taken_items then - mcl_log("We are on last item and still have items left. Set final stack size: " .. items_remaining) - current_itemstack:set_count(items_remaining) - --mcl_log("Itemstack2: " .. current_itemstack:to_string()) - self.itemstring = current_itemstack:to_string() - end - end - end - - --Add in, and delete - if taken_items then - mcl_log("Saving") - mcl_entity_invs.save_inv(ent) - return taken_items - else - mcl_log("No need to save") - end + --Wait 2 seconds to allow mob drops to be cooked, & picked up instead of instantly destroyed. + if self.age > 2 and minetest.get_item_group(item_name, "fire_immune") == 0 then + if dg ~= 2 then + minetest.sound_play("builtin_item_lava", { pos = self.object:get_pos(), gain = 0.5 }) end + self._removed = true + self.object:remove() + return true end end - return false + -- Destroy item when it collides with a cactus + if moveresult and moveresult.collides then + for _, collision in pairs(moveresult.collisions) do + local pos = collision.node_pos + if collision.type == "node" and minetest.get_node(pos).name == "mcl_core:cactus" then + -- TODO We need to play a sound when it gets destroyed + self._removed = true + self.object:remove() + return true + end + end + end +end + +local function push_out_item_stuck_in_solid(self, dtime, p, def, is_in_water) + if not is_in_water and def and def.walkable and def.groups and def.groups.opaque == 1 then + local shootdir + 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. + -- 1st: closest + -- 2nd: other direction + -- 3rd and 4th: other axis + if math.abs(cx) < math.abs(cz) then + order = cxcz(order, cx, "x", "z") + order = cxcz(order, cz, "z", "x") + else + order = cxcz(order, cz, "z", "x") + order = cxcz(order, cx, "x", "z") + end + + -- Check which one of the 4 sides is free + for o = 1, #order do + local nn = minetest.get_node(vector.add(p, order[o])).name + local def = minetest.registered_nodes[nn] + if def and def.walkable == false and nn ~= "ignore" then + shootdir = order[o] + break + end + end + -- If none of the 4 sides is free, shoot upwards + if shootdir == nil then + shootdir = vector.new(0, 1, 0) + local nn = minetest.get_node(vector.add(p, shootdir)).name + if nn == "ignore" then + -- Do not push into ignore + return true + end + end + + -- Set new item moving speed accordingly + local newv = vector.multiply(shootdir, 3) + self.object:set_acceleration(vector.zero()) + self.object:set_velocity(newv) + disable_physics(self.object, self, false, false) + + + if shootdir.y == 0 then + self._force = newv + p.x = math.floor(p.x) + p.y = math.floor(p.y) + p.z = math.floor(p.z) + self._forcestart = p + self._forcetimer = 1 + end + return true + end + + -- This code is run after the entity got a push from above “push away” code. + -- It is responsible for making sure the entity is entirely outside the solid node + -- (with its full collision box), not just its center. + if self._forcetimer > 0 then + local cbox = self.object:get_properties().collisionbox + local ok = false + if self._force.x > 0 and (p.x > (self._forcestart.x + 0.5 + (cbox[4] - cbox[1]) / 2)) then ok = true + elseif self._force.x < 0 and (p.x < (self._forcestart.x + 0.5 - (cbox[4] - cbox[1]) / 2)) then ok = true + elseif self._force.z > 0 and (p.z > (self._forcestart.z + 0.5 + (cbox[6] - cbox[3]) / 2)) then ok = true + elseif self._force.z < 0 and (p.z < (self._forcestart.z + 0.5 - (cbox[6] - cbox[3]) / 2)) then ok = true end + -- Item was successfully forced out. No more pushing + if ok then + self._forcetimer = -1 + self._force = nil + enable_physics(self.object, self) + else + self._forcetimer = self._forcetimer - dtime + end + return true + elseif self._force then + self._force = nil + enable_physics(self.object, self) + return true + end +end + +local function move_items_in_water (self, p, def, node, is_floating, is_in_water) + -- Move item around on flowing liquids; add 'source' check to allow items to continue flowing a bit in the source block of flowing water. + if def and not is_floating and (def.liquidtype == "flowing" or def.liquidtype == "source") then + self._flowing = true + + --[[ Get flowing direction (function call from flowlib), if there's a liquid. + NOTE: According to Qwertymine, flowlib.quickflow is only reliable for liquids with a flowing distance of 7. + Luckily, this is exactly what we need if we only care about water, which has this flowing distance. ]] + local vec = flowlib.quick_flow(p, node) + -- Just to make sure we don't manipulate the speed for no reason + if vec.x ~= 0 or vec.y ~= 0 or vec.z ~= 0 then + -- Minecraft Wiki: Flowing speed is "about 1.39 meters per second" + local f = 1.2 + -- Set new item moving speed into the direciton of the liquid + local newv = vector.multiply(vec, f) + -- Swap to acceleration instead of a static speed to better mimic MC mechanics. + self.object:set_acceleration(vector.new(newv.x, -0.22, newv.z)) + + self.physical_state = true + self._flowing = true + self.object:set_properties({ + physical = true + }) + return true + end + if is_in_water and def.liquidtype == "source" then + local cur_vec = self.object:get_velocity() + -- apply some acceleration in the opposite direction so it doesn't slide forever + local vec = { + x = 0 - cur_vec.x * 0.9, + y = 3 - cur_vec.y * 0.9, + z = 0 - cur_vec.z * 0.9 + } + self.object:set_acceleration(vec) + -- slow down the item in water + local vel = self.object:get_velocity() + if vel.y < 0 then + vel.y = vel.y * 0.9 + end + self.object:set_velocity(vel) + if self.physical_state ~= false or self._flowing ~= true then + self.physical_state = true + self._flowing = true + self.object:set_properties({ + physical = true + }) + end + end + elseif self._flowing == true and not is_in_water and not is_floating then + -- Disable flowing physics if not on/in flowing liquid + self._flowing = false + enable_physics(self.object, self, true) + return true + end end minetest.register_entity(":__builtin:item", { @@ -564,13 +621,17 @@ minetest.register_entity(":__builtin:item", { if speed ~= nil then self.random_velocity = speed end local vel = self.object:get_velocity() + + -- There is perhaps a cleverer way of making this physical so it bounces off the wall like swords. + local max_vel = 6.5 -- Faster than this and it throws it into the wall / floor and turns black because of clipping. + if vel and vel.x == 0 and vel.z == 0 and self.random_velocity > 0 then local v = self.random_velocity - local x = math.random(5, 10) / 10 * v + local x = math.random(5, max_vel) / 10 * v if math.random(0, 10) < 5 then x = -x end - local z = math.random(5, 10) / 10 * v + local z = math.random(5, max_vel) / 10 * v if math.random(0, 10) < 5 then z = -z end - local y = math.random(2, 4) + local y = math.random(1, 2) self.object:set_velocity(vector.new(x, y, z)) end self.random_velocity = 0 @@ -747,11 +808,19 @@ minetest.register_entity(":__builtin:item", { if total_count > max_count then return false end - -- Merge the remote stack into this one - -- local pos = object:get_pos() - -- pos.y = pos.y + ((total_count - count) / max_count) * 0.15 - -- self.object:move_to(pos) + -- Merge the remote stack into this one + local self_pos = self.object:get_pos() + local pos = object:get_pos() + + --local y = pos.y + ((total_count - count) / max_count) * 0.15 + local x_diff = (self_pos.x - pos.x) / 2 + local z_diff = (self_pos.z - pos.z) / 2 + + local new_pos = vector.offset(pos, x_diff, 0, z_diff) + new_pos.y = math.max(self_pos.y, pos.y) + 0.1 + + self.object:move_to(new_pos) self.age = 0 -- Handle as new entity own_stack:set_count(total_count) @@ -772,6 +841,7 @@ minetest.register_entity(":__builtin:item", { self.object:set_acceleration(vector.zero()) return end + self.age = self.age + dtime if self._collector_timer then self._collector_timer = self._collector_timer + dtime @@ -785,19 +855,13 @@ minetest.register_entity(":__builtin:item", { -- otherwise there might have some data corruption. if self.itemstring == "" then minetest.log("warning", - "Item entity with empty itemstring found at " .. minetest.pos_to_string(self.object:get_pos()) .. - "! Deleting it now.") + "Item entity with empty itemstring found and being deleted at: " .. minetest.pos_to_string(self.object:get_pos())) self._removed = true self.object:remove() return end local p = self.object:get_pos() - -- If hopper has taken item, it has gone, and no operations should be conducted on this item - if hopper_take_item(self, p) then - return - end - local node = minetest.get_node(p) local in_unloaded = node.name == "ignore" @@ -807,6 +871,9 @@ minetest.register_entity(":__builtin:item", { return end + + + if self.is_clock then self.object:set_properties({ textures = { "mcl_clock:clock_" .. (mcl_worlds.clock_works(p) and mcl_clock.old_time or mcl_clock.random_frame) } @@ -842,167 +909,12 @@ minetest.register_entity(":__builtin:item", { -- Destroy item in lava, fire or special nodes local def = minetest.registered_nodes[nn] - local lg = minetest.get_item_group(nn, "lava") - local fg = minetest.get_item_group(nn, "fire") - local dg = minetest.get_item_group(nn, "destroys_items") - if (def and (lg ~= 0 or fg ~= 0 or dg == 1)) then - --Wait 2 seconds to allow mob drops to be cooked, & picked up instead of instantly destroyed. - if self.age > 2 and minetest.get_item_group(self.itemstring, "fire_immune") == 0 then - if dg ~= 2 then - minetest.sound_play("builtin_item_lava", { pos = self.object:get_pos(), gain = 0.5 }) - end - self._removed = true - self.object:remove() - return - end - end - -- Destroy item when it collides with a cactus - if moveresult and moveresult.collides then - for _, collision in pairs(moveresult.collisions) do - local pos = collision.node_pos - if collision.type == "node" and minetest.get_node(pos).name == "mcl_core:cactus" then - self._removed = true - self.object:remove() - return - end - end - end + if nodes_destroy_items(self, moveresult, def, nn) then return end - -- Push item out when stuck inside solid opaque node - if not is_in_water and def and def.walkable and def.groups and def.groups.opaque == 1 then - local shootdir - local cx = (p.x % 1) - 0.5 - local cz = (p.z % 1) - 0.5 - local order = {} + if push_out_item_stuck_in_solid(self, dtime, p, def, is_in_water) then return end - -- First prepare the order in which the 4 sides are to be checked. - -- 1st: closest - -- 2nd: other direction - -- 3rd and 4th: other axis - if math.abs(cx) < math.abs(cz) then - order = cxcz(order, cx, "x", "z") - order = cxcz(order, cz, "z", "x") - else - order = cxcz(order, cz, "z", "x") - order = cxcz(order, cx, "x", "z") - end - - -- Check which one of the 4 sides is free - for o = 1, #order do - local nn = minetest.get_node(vector.add(p, order[o])).name - local def = minetest.registered_nodes[nn] - if def and def.walkable == false and nn ~= "ignore" then - shootdir = order[o] - break - end - end - -- If none of the 4 sides is free, shoot upwards - if shootdir == nil then - shootdir = vector.new(0, 1, 0) - local nn = minetest.get_node(vector.add(p, shootdir)).name - if nn == "ignore" then - -- Do not push into ignore - return - end - end - - -- Set new item moving speed accordingly - local newv = vector.multiply(shootdir, 3) - self.object:set_acceleration(vector.zero()) - self.object:set_velocity(newv) - disable_physics(self.object, self, false, false) - - - if shootdir.y == 0 then - self._force = newv - p.x = math.floor(p.x) - p.y = math.floor(p.y) - p.z = math.floor(p.z) - self._forcestart = p - self._forcetimer = 1 - end - return - end - - -- This code is run after the entity got a push from above “push away” code. - -- It is responsible for making sure the entity is entirely outside the solid node - -- (with its full collision box), not just its center. - if self._forcetimer > 0 then - local cbox = self.object:get_properties().collisionbox - local ok = false - if self._force.x > 0 and (p.x > (self._forcestart.x + 0.5 + (cbox[4] - cbox[1]) / 2)) then ok = true - elseif self._force.x < 0 and (p.x < (self._forcestart.x + 0.5 - (cbox[4] - cbox[1]) / 2)) then ok = true - elseif self._force.z > 0 and (p.z > (self._forcestart.z + 0.5 + (cbox[6] - cbox[3]) / 2)) then ok = true - elseif self._force.z < 0 and (p.z < (self._forcestart.z + 0.5 - (cbox[6] - cbox[3]) / 2)) then ok = true end - -- Item was successfully forced out. No more pushing - if ok then - self._forcetimer = -1 - self._force = nil - enable_physics(self.object, self) - else - self._forcetimer = self._forcetimer - dtime - end - return - elseif self._force then - self._force = nil - enable_physics(self.object, self) - return - end - - -- Move item around on flowing liquids; add 'source' check to allow items to continue flowing a bit in the source block of flowing water. - if def and not is_floating and (def.liquidtype == "flowing" or def.liquidtype == "source") then - self._flowing = true - - --[[ Get flowing direction (function call from flowlib), if there's a liquid. - NOTE: According to Qwertymine, flowlib.quickflow is only reliable for liquids with a flowing distance of 7. - Luckily, this is exactly what we need if we only care about water, which has this flowing distance. ]] - local vec = flowlib.quick_flow(p, node) - -- Just to make sure we don't manipulate the speed for no reason - if vec.x ~= 0 or vec.y ~= 0 or vec.z ~= 0 then - -- Minecraft Wiki: Flowing speed is "about 1.39 meters per second" - local f = 1.2 - -- Set new item moving speed into the direciton of the liquid - local newv = vector.multiply(vec, f) - -- Swap to acceleration instead of a static speed to better mimic MC mechanics. - self.object:set_acceleration(vector.new(newv.x, -0.22, newv.z)) - - self.physical_state = true - self._flowing = true - self.object:set_properties({ - physical = true - }) - return - end - if is_in_water and def.liquidtype == "source" then - local cur_vec = self.object:get_velocity() - -- apply some acceleration in the opposite direction so it doesn't slide forever - local vec = { - x = 0 - cur_vec.x * 0.9, - y = 3 - cur_vec.y * 0.9, - z = 0 - cur_vec.z * 0.9 - } - self.object:set_acceleration(vec) - -- slow down the item in water - local vel = self.object:get_velocity() - if vel.y < 0 then - vel.y = vel.y * 0.9 - end - self.object:set_velocity(vel) - if self.physical_state ~= false or self._flowing ~= true then - self.physical_state = true - self._flowing = true - self.object:set_properties({ - physical = true - }) - end - end - elseif self._flowing == true and not is_in_water and not is_floating then - -- Disable flowing physics if not on/in flowing liquid - self._flowing = false - enable_physics(self.object, self, true) - return - end + if move_items_in_water (self, p, def, node, is_floating, is_in_water) then return end -- If node is not registered or node is walkably solid and resting on nodebox local nn = minetest.get_node(vector.offset(p, 0, -0.5, 0)).name @@ -1011,14 +923,13 @@ minetest.register_entity(":__builtin:item", { local is_on_floor = def and (def.walkable and not def.groups.slippery and v.y == 0) - if not minetest.registered_nodes[nn] - or is_floating or is_on_floor then + if not minetest.registered_nodes[nn] or is_floating or is_on_floor then + local own_stack = ItemStack(self.object:get_luaentity().itemstring) -- Merge with close entities of the same item for _, object in pairs(minetest.get_objects_inside_radius(p, 0.8)) do local obj = object:get_luaentity() - if obj and obj.name == "__builtin:item" - and obj.physical_state == false then + if obj and obj.name == "__builtin:item" and obj.physical_state == false then if self:try_merge_with(own_stack, object, obj) then return end diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index aa9ef7edc..2d0cd78e9 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -11,6 +11,14 @@ mcl_minecarts.check_float_time = 15 dofile(mcl_minecarts.modpath.."/functions.lua") dofile(mcl_minecarts.modpath.."/rails.lua") +local LOGGING_ON = minetest.settings:get_bool("mcl_logging_minecarts", false) +local function mcl_log(message) + if LOGGING_ON then + mcl_util.mcl_log(message, "[Minecarts]", true) + end +end + + local function detach_driver(self) if not self._driver then return @@ -51,6 +59,134 @@ end local activate_normal_minecart = detach_driver +local function hopper_take_item(self, dtime) + local pos = self.object:get_pos() + if not pos then return end + + if not self or self.name ~= "mcl_minecarts:hopper_minecart" then return end + + if mcl_util.check_dtime_timer(self, dtime, "hoppermc_take", 0.15) then + --minetest.log("The check timer was triggered: " .. dump(pos) .. ", name:" .. self.name) + else + --minetest.log("The check timer was not triggered") + return + end + + --mcl_log("self.itemstring: ".. self.itemstring) + + local above_pos = vector.offset(pos, 0, 0.9, 0) + --mcl_log("self.itemstring: ".. minetest.pos_to_string(above_pos)) + local objs = minetest.get_objects_inside_radius(above_pos, 1.25) + + if objs then + + mcl_log("there is an itemstring. Number of objs: ".. #objs) + + for k, v in pairs(objs) do + local ent = v:get_luaentity() + + if ent._removed or not ent.itemstring or ent.itemstring == "" then + --minetest.log("Ignore this item") + break + end + + -- Don't forget actual hoppers + + local taken_items = false + + mcl_log("ent.name: " .. tostring(ent.name)) + mcl_log("ent pos: " .. tostring(ent.object:get_pos())) + + local inv = mcl_entity_invs.load_inv(self, 5) + + if not inv then + mcl_log("No inv") + return false + end + + local current_itemstack = ItemStack(ent.itemstring) + + mcl_log("inv. size: " .. self._inv_size) + if inv:room_for_item("main", current_itemstack) then + mcl_log("Room") + inv:add_item("main", current_itemstack) + ent.object:get_luaentity().itemstring = "" + ent.object:remove() + taken_items = true + else + mcl_log("no Room") + end + + if not taken_items then + local items_remaining = current_itemstack:get_count() + + -- This will take part of a floating item stack if no slot can hold the full amount + for i = 1, self._inv_size, 1 do + local stack = inv:get_stack("main", i) + + mcl_log("i: " .. tostring(i)) + mcl_log("Items remaining: " .. items_remaining) + mcl_log("Name: " .. tostring(stack:get_name())) + + if current_itemstack:get_name() == stack:get_name() then + mcl_log("We have a match. Name: " .. tostring(stack:get_name())) + + local room_for = stack:get_stack_max() - stack:get_count() + mcl_log("Room for: " .. tostring(room_for)) + + if room_for == 0 then + -- Do nothing + mcl_log("No room") + elseif room_for < items_remaining then + mcl_log("We have more items remaining than space") + + items_remaining = items_remaining - room_for + stack:set_count(stack:get_stack_max()) + inv:set_stack("main", i, stack) + taken_items = true + else + local new_stack_size = stack:get_count() + items_remaining + stack:set_count(new_stack_size) + mcl_log("We have more than enough space. Now holds: " .. new_stack_size) + + inv:set_stack("main", i, stack) + items_remaining = 0 + + ent.object:get_luaentity().itemstring = "" + ent.object:remove() + + taken_items = true + break + end + + mcl_log("Count: " .. tostring(stack:get_count())) + mcl_log("stack max: " .. tostring(stack:get_stack_max())) + --mcl_log("Is it empty: " .. stack:to_string()) + end + + if i == self._inv_size and taken_items then + mcl_log("We are on last item and still have items left. Set final stack size: " .. items_remaining) + current_itemstack:set_count(items_remaining) + --mcl_log("Itemstack2: " .. current_itemstack:to_string()) + ent.itemstring = current_itemstack:to_string() + end + end + end + + --Add in, and delete + if taken_items then + mcl_log("Saving") + mcl_entity_invs.save_inv(ent) + return taken_items + else + mcl_log("No need to save") + end + end + end + + return false +end + -- Table for item-to-entity mapping. Keys: itemstring, Values: Corresponding entity ID local entity_mapping = {} @@ -182,6 +318,8 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o local passenger_attach_position = vector.new(0, -1.75, 0) function cart:on_step(dtime) + hopper_take_item(self, dtime) + local ctrl, player = nil, nil if self._driver then player = minetest.get_player_by_name(self._driver) @@ -232,13 +370,10 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o end end end - -- Make room in the minecart after the mob dies elseif self._passenger then - if math.random(1,20) == 1 then - local dead = self._passenger:check_for_death() - if dead == true then - self._passenger = nil - end + local passenger_pos = self._passenger.object:get_pos() + if not passenger_pos then + self._passenger = nil end end @@ -266,19 +401,8 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o return end - -- Drop items and remove cart entity - local pname = "" - if player then - pname = player:get_player_name() - end - if not minetest.is_creative_enabled(pname) then - for d=1, #drop do - minetest.add_item(self.object:get_pos(), drop[d]) - end - end - - self.object:remove() - return + -- Do not drop minecart. It goes off the rails too frequently, and anyone using them for farms won't + -- notice and lose their iron and not bother. Not cool until fixed. end self._last_float_check = 0 end diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 39d2f45a9..a9a1a0dad 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -78,11 +78,10 @@ function mob_class:get_staticdata() for _,p in pairs(minetest.get_connected_players()) do self:remove_particlespawners(p:get_player_name()) end + -- remove mob when out of range unless tamed if remove_far - and self.can_despawn - and self.remove_ok - and ((not self.nametag) or (self.nametag == "")) + and self:despawn_allowed() and self.lifetimer <= 20 then if spawn_logging then minetest.log("action", "[mcl_mobs] Mob "..tostring(self.name).." despawns at "..minetest.pos_to_string(vector.round(self.object:get_pos())) .. " - out of range") @@ -91,7 +90,6 @@ function mob_class:get_staticdata() return "remove"-- nil end - self.remove_ok = true self.attack = nil self.following = nil self.state = "stand" @@ -113,6 +111,21 @@ function mob_class:get_staticdata() return minetest.serialize(tmp) end +local function valid_texture(self, def_textures) + if not self.base_texture then + return false + end + + if self.texture_selected then + if #def_textures < self.texture_selected then + self.texture_selected = nil + else + return true + end + end + return false +end + function mob_class:mob_activate(staticdata, def, dtime) if not self.object:get_pos() or staticdata == "remove" then mcl_burning.extinguish(self.object) @@ -135,16 +148,20 @@ function mob_class:mob_activate(staticdata, def, dtime) end --If textures in definition change, reload textures - if not self.base_texture or (def.textures and table.indexof(def.textures, self.base_texture) == -1) then + if not valid_texture(self, def.textures) then + -- compatiblity with old simple mobs textures if type(def.textures[1]) == "string" then def.textures = {def.textures} end - local c = 1 - if #def.textures > c then c = #def.textures end + if not self.texture_selected then + local c = 1 + if #def.textures > c then c = #def.textures end + self.texture_selected = math.random(c) + end - self.base_texture = def.textures[math.random(c)] + self.base_texture = def.textures[self.texture_selected] self.base_mesh = def.mesh self.base_size = self.visual_size self.base_colbox = self.collisionbox @@ -299,46 +316,33 @@ end -- execute current state (stand, walk, run, attacks) -- returns true if mob has died -function mob_class:do_states(dtime) +function mob_class:do_states(dtime, player_in_active_range) --if self.can_open_doors then check_doors(self) end - if self.state == "stand" then - self:do_states_stand() - elseif self.state == PATHFINDING then - self:check_gowp(dtime) - elseif self.state == "walk" then - self:do_states_walk() - elseif self.state == "runaway" then - -- runaway when punched - self:do_states_runaway() - elseif self.state == "attack" then - -- attack routines (explode, dogfight, shoot, dogshoot) - if self:do_states_attack(dtime) then - return true - end - end -end - -local function update_timers (self, dtime) -- knockback timer. set in on_punch if self.pause_timer > 0 then self.pause_timer = self.pause_timer - dtime - return true + return end - -- attack timer. Not anymore, it seems. Used for also occassionally processing mob step too! - self.timer = self.timer + dtime + self:env_danger_movement_checks(player_in_active_range) - if self.state ~= "attack" and self.state ~= PATHFINDING then - if self.timer < 1 then + if self.state == PATHFINDING then + self:check_gowp(dtime) + elseif self.state == "attack" then + if self:do_states_attack(dtime) then return true end - self.timer = 0 - end - - -- never go over 100 - if self.timer > 100 then - self.timer = 1 + else + if mcl_util.check_dtime_timer(self, dtime, "onstep_dostates", 1) then + if self.state == "stand" then + self:do_states_stand(player_in_active_range) + elseif self.state == "walk" then + self:do_states_walk() + elseif self.state == "runaway" then + self:do_states_runaway() + end + end end end @@ -366,6 +370,8 @@ function mob_class:outside_limits() end end + + local function on_step_work (self, dtime) local pos = self.object:get_pos() if not pos then return end @@ -381,30 +387,22 @@ local function on_step_work (self, dtime) end if self:falling(pos) then return end - - local player_in_active_range = self:player_in_active_range() - - self:check_suspend(player_in_active_range) - - if not self.fire_resistant then - mcl_burning.tick(self.object, dtime, self) - if not self.object:get_pos() then return end -- mcl_burning.tick may remove object immediately - - if self:check_for_death("fire", {type = "fire"}) then - return true - end - end - - if self:env_damage (dtime, pos) then return end + if self:step_damage (dtime, pos) then return end if self.state == "die" then return end -- End: Death/damage processing - self:check_water_flow() - self:env_danger_movement_checks (dtime) + local player_in_active_range = self:player_in_active_range() + self:check_suspend(player_in_active_range) + + self:check_water_flow() + + if not self._jumping_cliff then + self._can_jump_cliff = self:can_jump_cliff() + else + self._can_jump_cliff = false + end - -- Follow code is heavy and probably shouldn't run when not in range, but we need to extract the cancel follow stuff - self:check_follow() self:flop() self:check_smooth_rotation(dtime) @@ -414,47 +412,38 @@ local function on_step_work (self, dtime) self:check_head_swivel(dtime) - if self.jump_sound_cooloff > 0 then self.jump_sound_cooloff = self.jump_sound_cooloff - dtime end - self:do_jump() - - self:check_runaway_from() - self:monster_attack() - self:npc_attack() + if mcl_util.check_dtime_timer(self, dtime, "onstep_engage", 0.2) then + self:check_follow() + self:check_runaway_from() + self:monster_attack() + self:npc_attack() + end self:check_herd(dtime) + + if self.jump_sound_cooloff > 0 then self.jump_sound_cooloff = self.jump_sound_cooloff - dtime end + self:do_jump() end - self:check_aggro(dtime) - - if self.do_custom and self.do_custom(self, dtime) == false then return end - - -- In certain circumstances, we abandon processing of certain functionality - local skip_processing = false - if update_timers(self, dtime) then - skip_processing = true - end - - if not skip_processing then - self:check_breeding() + if mcl_util.check_dtime_timer(self, dtime, "onstep_occassional", 1) then if player_in_active_range then self:check_item_pickup() self:set_armor_texture() - - if self.opinion_sound_cooloff > 0 then - self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime - end - -- mob plays random sound at times. Should be 120. Zombie and mob farms are ridiculous - if math.random(1, 70) == 1 then - self:mob_sound("random", true) - end + self:step_opinion_sound(dtime) end - self:check_particlespawners(dtime) - - if self:do_states(dtime) then return end + self:check_breeding() end + self:check_aggro(dtime) + + self:check_particlespawners(dtime) + + if self.do_custom and self.do_custom(self, dtime) == false then return end + + if self:do_states(dtime, player_in_active_range) then return end + if mobs_debug then self:update_tag() end if not self.object:get_luaentity() then diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 5b5809bca..fe0da4be2 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -262,6 +262,7 @@ functions needed for the mob to work properly which contains the following: 'custom_visual_size' will not reset visual_size from the base class on reload 'noyaw' If true this mob will not automatically change yaw 'particlespawners' Table of particlespawners attached to the mob. This is implemented in a coord safe manner i.e. spawners are only sent to players within the player_transfer_distance (and automatically removed). This enables infinitely lived particlespawners. + 'attack_frequency' Attack frequency in seconds. If unset, this defaults to 1. Implemented for melee only atm. mobs:gopath(self,target,callback_arrived) pathfind a way to target and run callback on arrival diff --git a/mods/ENTITIES/mcl_mobs/breeding.lua b/mods/ENTITIES/mcl_mobs/breeding.lua index a70d9cbea..c6d8f92cd 100644 --- a/mods/ENTITIES/mcl_mobs/breeding.lua +++ b/mods/ENTITIES/mcl_mobs/breeding.lua @@ -74,6 +74,7 @@ function mob_class:feed_tame(clicker, feed_count, breed, tame, notake) if self.food >= feed_count then self.food = 0 self.horny = true + self.persistent = true end end diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index 5fa95db1b..3b53e0d1a 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -10,6 +10,8 @@ local stuck_path_timeout = 10 -- how long will mob follow path before giving up local enable_pathfinding = true +local TIME_TO_FORGET_TARGET = 15 + local atann = math.atan local function atan(x) if not x or x ~= x then @@ -398,7 +400,8 @@ function mob_class:monster_attack() end -- choose closest player to attack - if dist < min_dist and not attacked_p and self:line_of_sight( sp, p, 2) == true then + local line_of_sight = self:line_of_sight( sp, p, 2) == true + if dist < min_dist and not attacked_p and line_of_sight then min_dist = dist min_player = player end @@ -810,12 +813,35 @@ function mob_class:check_aggro(dtime) self._check_aggro_timer = self._check_aggro_timer + dtime end + + +local function clear_aggro(self) + self.state = "stand" + self:set_velocity( 0) + self:set_animation( "stand") + + self.attack = nil + self._aggro = nil + + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.path.way = nil +end + function mob_class:do_states_attack (dtime) - local yaw = self.object:get_yaw() or 0 + self.timer = self.timer + dtime + if self.timer > 100 then + self.timer = 1 + end local s = self.object:get_pos() + if not s then return end + local p = self.attack:get_pos() or s + local yaw = self.object:get_yaw() or 0 + -- stop attacking if player invisible or out of range if not self.attack or not self.attack:get_pos() @@ -823,35 +849,33 @@ function mob_class:do_states_attack (dtime) or self.attack:get_hp() <= 0 or (self.attack:is_player() and mcl_mobs.invis[ self.attack:get_player_name() ]) then - self.state = "stand" - self:set_velocity( 0) - self:set_animation( "stand") - - self.attack = nil - self._aggro = nil - - self.v_start = false - self.timer = 0 - self.blinktimer = 0 - self.path.way = nil - + clear_aggro(self) return end + local target_line_of_sight = self:line_of_sight(s, p, 2) + if not target_line_of_sight then + if self.target_time_lost then + local time_since_seen = os.time() - self.target_time_lost + if time_since_seen > TIME_TO_FORGET_TARGET then + self.target_time_lost = nil + clear_aggro(self) + return + end + else + self.target_time_lost = os.time() + end + else + self.target_time_lost = nil + end + -- calculate distance from mob and enemy local dist = vector.distance(p, s) if self.attack_type == "explode" then - - local vec = { - x = p.x - s.x, - z = p.z - s.z - } - + local vec = { x = p.x - s.x, z = p.z - s.z } yaw = (atan(vec.z / vec.x) +math.pi/ 2) - self.rotate - if p.x > s.x then yaw = yaw +math.pi end - yaw = self:set_yaw( yaw, 0, dtime) local node_break_radius = self.explosion_radius or 1 @@ -859,20 +883,15 @@ function mob_class:do_states_attack (dtime) or (node_break_radius * 2) -- start timer when in reach and line of sight - if not self.v_start - and dist <= self.reach - and self:line_of_sight( s, p, 2) then - + if not self.v_start and dist <= self.reach and target_line_of_sight then self.v_start = true self.timer = 0 self.blinktimer = 0 self:mob_sound("fuse", nil, false) -- stop timer if out of reach or direct line of sight - elseif self.allow_fuse_reset - and self.v_start - and (dist >= self.explosiontimer_reset_radius - or not self:line_of_sight( s, p, 2)) then + elseif self.allow_fuse_reset and self.v_start + and (dist >= self.explosiontimer_reset_radius or not target_line_of_sight) then self.v_start = false self.timer = 0 self.blinktimer = 0 @@ -894,25 +913,20 @@ function mob_class:do_states_attack (dtime) end if self.v_start then - self.timer = self.timer + dtime self.blinktimer = (self.blinktimer or 0) + dtime if self.blinktimer > 0.2 then - self.blinktimer = 0 - if self.blinkstatus then self:remove_texture_mod("^[brighten") else self:add_texture_mod("^[brighten") end - self.blinkstatus = not self.blinkstatus end if self.timer > self.explosion_timer then - local pos = self.object:get_pos() if mobs_griefing and not minetest.is_protected(pos, "") then @@ -1026,54 +1040,45 @@ function mob_class:do_states_attack (dtime) -- move towards enemy if beyond mob reach if dist > self.reach then - -- path finding by rnd - if self.pathfinding -- only if mob has pathfinding enabled - and enable_pathfinding then - + if enable_pathfinding and self.pathfinding then self:smart_mobs(s, p, dist, dtime) end if self:is_at_cliff_or_danger() then - self:set_velocity( 0) self:set_animation( "stand") local yaw = self.object:get_yaw() or 0 yaw = self:set_yaw( yaw + 0.78, 8) else - if self.path.stuck then - self:set_velocity( self.walk_velocity) + self:set_velocity(self.walk_velocity) else - self:set_velocity( self.run_velocity) + self:set_velocity(self.run_velocity) end - if self.animation and self.animation.run_start then - self:set_animation( "run") + self:set_animation("run") else - self:set_animation( "walk") + self:set_animation("walk") end end - else -- rnd: if inside reach range - self.path.stuck = false self.path.stuck_timer = 0 self.path.following = false -- not stuck anymore self:set_velocity( 0) - if not self.custom_attack then + local attack_frequency = self.attack_frequency or 1 - if self.timer > 1 then + if self.timer > attack_frequency then + self.timer = 0 - self.timer = 0 - - if self.double_melee_attack - and math.random(1, 2) == 1 then - self:set_animation( "punch2") + if not self.custom_attack then + if self.double_melee_attack and math.random(1, 2) == 1 then + self:set_animation("punch2") else - self:set_animation( "punch") + self:set_animation("punch") end local p2 = p @@ -1083,8 +1088,6 @@ function mob_class:do_states_attack (dtime) s2.y = s2.y + .5 if self:line_of_sight( p2, s2) == true then - - -- play attack sound self:mob_sound("attack") -- punch player (or what player is attached to) @@ -1097,13 +1100,7 @@ function mob_class:do_states_attack (dtime) damage_groups = {fleshy = self.damage} }, nil) end - end - else -- call custom attack every second - if self.custom_attack - and self.timer > 1 then - - self.timer = 0 - + else self.custom_attack(self, p) end end @@ -1129,7 +1126,7 @@ function mob_class:do_states_attack (dtime) yaw = self:set_yaw( yaw, 0, dtime) - local stay_away_from_player = vector.new(0,0,0) + local stay_away_from_player = vector.zero() --strafe back and fourth @@ -1146,7 +1143,13 @@ function mob_class:do_states_attack (dtime) if math.random(40) == 1 then self.strafe_direction = self.strafe_direction*-1 end - self.acc = vector.add(vector.multiply(vector.rotate_around_axis(vector.direction(s, p), vector.new(0,1,0), self.strafe_direction), 0.3*self.walk_velocity), stay_away_from_player) + + local dir = vector.rotate_around_axis(vector.direction(s, p), vector.new(0,1,0), self.strafe_direction) + local dir2 = vector.multiply(dir, 0.3 * self.walk_velocity) + + if dir2 and stay_away_from_player then + self.acc = vector.add(dir2, stay_away_from_player) + end else self:set_velocity( 0) end diff --git a/mods/ENTITIES/mcl_mobs/effects.lua b/mods/ENTITIES/mcl_mobs/effects.lua index 699993979..7953e6a47 100644 --- a/mods/ENTITIES/mcl_mobs/effects.lua +++ b/mods/ENTITIES/mcl_mobs/effects.lua @@ -4,6 +4,8 @@ local active_particlespawners = {} local disable_blood = minetest.settings:get_bool("mobs_disable_blood") local DEFAULT_FALL_SPEED = -9.81*1.5 +local PATHFINDING = "gowp" + local player_transfer_distance = tonumber(minetest.settings:get("player_transfer_distance")) or 128 if player_transfer_distance == 0 then player_transfer_distance = math.huge end @@ -136,6 +138,19 @@ function mob_class:mob_sound(soundname, is_opinion, fixed_pitch) end end +function mob_class:step_opinion_sound(dtime) + if self.state ~= "attack" and self.state ~= PATHFINDING then + + if self.opinion_sound_cooloff > 0 then + self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime + end + -- mob plays random sound at times. Should be 120. Zombie and mob farms are ridiculous + if math.random(1, 70) == 1 then + self:mob_sound("random", true) + end + end +end + function mob_class:add_texture_mod(mod) local full_mod = "" local already_added = false @@ -254,7 +269,7 @@ function mob_class:set_animation(anim, fixed_frame) - if self:flight_check() and self.fly and anim == "walk" then anim = "fly" end + if self.fly and self:flight_check() and anim == "walk" then anim = "fly" end self._current_animation = self._current_animation or "" @@ -293,7 +308,7 @@ local function dir_to_pitch(dir) return -math.atan2(-dir.y, xz) end -local function who_are_you_looking_at (self) +local function who_are_you_looking_at (self, dtime) local pos = self.object:get_pos() local stop_look_at_player_chance = math.random(833/self.curiosity) @@ -309,12 +324,12 @@ local function who_are_you_looking_at (self) self._locked_object = nil end elseif not self._locked_object then - if math.random(1, 30) then + if mcl_util.check_dtime_timer(self, dtime, "step_look_for_someone", 0.2) then --minetest.log("Change look check: ".. self.name) -- For the wither this was 20/60=0.33, so probably need to rebalance and divide rates. -- but frequency of check isn't good as it is costly. Making others too infrequent requires testing - local chance = 20/self.curiosity + local chance = 150/self.curiosity if chance < 1 then chance = 1 end local look_at_player_chance = math.random(chance) @@ -346,9 +361,9 @@ function mob_class:check_head_swivel(dtime) if not self.head_swivel or type(self.head_swivel) ~= "string" then return end - who_are_you_looking_at (self) + who_are_you_looking_at (self, dtime) - local final_rotation = vector.new(0,0,0) + local final_rotation = vector.zero() local oldp,oldr = self.object:get_bone_position(self.head_swivel) if self._locked_object and (self._locked_object:is_player() or self._locked_object:get_luaentity()) and self._locked_object:get_hp() > 0 then @@ -360,8 +375,11 @@ function mob_class:check_head_swivel(dtime) _locked_object_eye_height = self._locked_object:get_properties().eye_height end if _locked_object_eye_height then + local self_rot = self.object:get_rotation() - if self.object:get_attach() then + -- If a mob is attached, should we really be messing with what they are looking at? + -- Should this be excluded? + if self.object:get_attach() and self.object:get_attach():get_rotation() then self_rot = self.object:get_attach():get_rotation() end diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index c32fca820..6bd39b2cf 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -154,6 +154,7 @@ function mcl_mobs.register_mob(name, def) description = def.description, type = def.type, attack_type = def.attack_type, + attack_frequency = def.attack_frequency, fly = def.fly or false, fly_in = def.fly_in or {"air", "__airlike"}, owner = def.owner or "", @@ -556,7 +557,7 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg nametag = string.sub(nametag, 1, MAX_MOB_NAME_LENGTH) end ent.nametag = nametag - update_tag(ent) + ent:update_tag() end -- if not in creative then take item diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr index 96ac6a817..58fcaa51d 100644 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr @@ -9,3 +9,5 @@ Before you use the name tag, you need to set a name at an anvil. Then you can us Only peaceful mobs allowed!=Seuls les mobs pacifiques sont autorisées! Give names to mobs=Donne des noms aux mobs Set name at anvil=Définir le nom sur l'enclume +Removes specified mobs except nametagged and tamed ones. For the second parameter, use nametagged/tamed to select only nametagged/tamed mobs, or a range to specify a maximum distance from the player.=Enlève les mobs spécifiés sauf ceux qui sont nommés et apprivoisés. Pour le deuxième paramètre, utiliser nametagged/tamed pour ne sélectionner que les mobs nommés/apprivoisés, ou une distance pour spécifier la distance maximale par rapport au joueur. +Default usage. Clearing hostile mobs. For more options please type: /help clearmobs=Usage par défaut. Enlève les mobs hostiles. Pour plus d'options saisir : /help clearmobs diff --git a/mods/ENTITIES/mcl_mobs/movement.lua b/mods/ENTITIES/mcl_mobs/movement.lua index 9dedd7e2c..377e25f6e 100644 --- a/mods/ENTITIES/mcl_mobs/movement.lua +++ b/mods/ENTITIES/mcl_mobs/movement.lua @@ -4,8 +4,11 @@ local DEFAULT_FALL_SPEED = -9.81*1.5 local FLOP_HEIGHT = 6 local FLOP_HOR_SPEED = 1.5 -local node_snow = "mcl_core:snow" +local CHECK_HERD_FREQUENCY = 4 +local PATHFINDING = "gowp" + +local node_snow = "mcl_core:snow" local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false @@ -202,12 +205,8 @@ function mob_class:can_jump_cliff() end -- is mob facing a cliff or danger -function mob_class:is_at_cliff_or_danger(can_jump_cliff) - if can_jump_cliff == nil then - can_jump_cliff = self:can_jump_cliff() - end - - if self.fear_height == 0 or can_jump_cliff or self._jumping_cliff or not self.object:get_luaentity() then -- 0 for no falling protection! +function mob_class:is_at_cliff_or_danger() + if self.fear_height == 0 or self._jumping_cliff or self._can_jump_cliff or not self.object:get_luaentity() then -- 0 for no falling protection! return false end @@ -219,8 +218,9 @@ function mob_class:is_at_cliff_or_danger(can_jump_cliff) local ypos = pos.y + self.collisionbox[2] -- just above floor local free_fall, blocker = minetest.line_of_sight( - {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, - {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z}) + vector.new(pos.x + dir_x, ypos, pos.z + dir_z), + vector.new(pos.x + dir_x, ypos - self.fear_height, pos.z + dir_z)) + if free_fall then return true else @@ -241,12 +241,16 @@ end -- copy the 'mob facing cliff_or_danger check' from above, and rework to avoid water -function mob_class:is_at_water_danger(can_jump_cliff) - if can_jump_cliff == nil then - can_jump_cliff = self:can_jump_cliff() +function mob_class:is_at_water_danger() + if self.water_damage == 0 and self.breath_max == -1 then + --minetest.log("Do not need a water check for: " .. self.name) + return end - if not self.object:get_luaentity() or can_jump_cliff or self._jumping_cliff then + local in_water_danger = self:is_node_waterhazard(self.standing_in) or self:is_node_waterhazard(self.standing_on) + if in_water_danger then return false end -- If you're in trouble, do not stop + + if not self.object:get_luaentity() or self._jumping_cliff or self._can_jump_cliff then return false end local yaw = self.object:get_yaw() @@ -261,51 +265,57 @@ function mob_class:is_at_water_danger(can_jump_cliff) local ypos = pos.y + self.collisionbox[2] -- just above floor - local free_fall, blocker = minetest.line_of_sight( - {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, - {x = pos.x + dir_x, y = ypos - 3, z = pos.z + dir_z}) - if free_fall then - return true - else + local los, blocker = minetest.line_of_sight( + vector.new(pos.x + dir_x, ypos, pos.z + dir_z), + vector.new(pos.x + dir_x, ypos - 3, pos.z + dir_z)) + + if not los then local bnode = minetest.get_node(blocker) local waterdanger = self:is_node_waterhazard(bnode.name) - if - waterdanger and (self:is_node_waterhazard(self.standing_in) or self:is_node_waterhazard( self.standing_on)) then - return false - elseif waterdanger and (self:is_node_waterhazard(self.standing_in) or self:is_node_waterhazard(self.standing_on)) == false then + + if waterdanger and not in_water_danger then return true - else - local def = minetest.registered_nodes[bnode.name] - if def and def.walkable then - return false - end end end return false end -function mob_class:env_danger_movement_checks(dtime) +function mob_class:env_danger_movement_checks(player_in_active_range) local yaw = 0 - local can_jump_cliff = self:can_jump_cliff() - if self.state ~= "attack" and self:is_at_water_danger(can_jump_cliff) then - if math.random(1, 10) <= 6 then - self:set_velocity(0) - self.state = "stand" - self:set_animation( "stand") + if not player_in_active_range then return end + + if self.state == PATHFINDING + or self.state == "attack" + or self.state == "stand" + or self.state == "runaway" then + return + end + + if self:is_at_water_danger() then + --minetest.log("At water danger for mob, stop?: " .. self.name) + if math.random(1, 10) <= 7 then + if self.state ~= "stand" then + self:set_velocity(0) + self.state = "stand" + self:set_animation( "stand") + end yaw = yaw + math.random(-0.5, 0.5) yaw = self:set_yaw( yaw, 8) + return end end - if self:is_at_cliff_or_danger(can_jump_cliff) then - self:set_velocity(0) - self.state = "stand" - self:set_animation( "stand") + --[[if self:is_at_cliff_or_danger(can_jump_cliff) then + if self.state ~= "stand" then + self:set_velocity(0) + self.state = "stand" + self:set_animation( "stand") + end local yaw = self.object:get_yaw() or 0 yaw = self:set_yaw( yaw + 0.78, 8) - end + end--]] end -- jump if facing a solid node (not fences or gates) @@ -376,7 +386,7 @@ function mob_class:do_jump() end local ndef = minetest.registered_nodes[nod.name] - if self.walk_chance == 0 or ndef and ndef.walkable or self:can_jump_cliff() then + if self.walk_chance == 0 or ndef and ndef.walkable or self._can_jump_cliff then if minetest.get_item_group(nod.name, "fence") == 0 and minetest.get_item_group(nod.name, "fence_gate") == 0 @@ -386,7 +396,7 @@ function mob_class:do_jump() v.y = self.jump_height + 0.1 * 3 - if self:can_jump_cliff() then + if self._can_jump_cliff then v=vector.multiply(v, vector.new(2.8,1,2.8)) end @@ -621,7 +631,7 @@ function mob_class:check_runaway_from() end --- follow player if owner or holding item, if fish outta water then flop +-- follow player if owner or holding item function mob_class:check_follow() -- find player to follow if (self.follow ~= "" or self.order == "follow") and not self.following @@ -722,7 +732,7 @@ function mob_class:flop() return elseif self.state == "flop" then self.state = "stand" - self.object:set_acceleration({x = 0, y = 0, z = 0}) + self.object:set_acceleration(vector.zero()) self:set_velocity(0) end end @@ -754,7 +764,7 @@ function mob_class:check_herd(dtime) if self.move_in_group == false then return end check_herd_timer = check_herd_timer + dtime - if check_herd_timer < 4 then return end + if check_herd_timer < CHECK_HERD_FREQUENCY then return end check_herd_timer = 0 for _,o in pairs(minetest.get_objects_inside_radius(pos,self.view_range)) do local l = o:get_luaentity() @@ -885,7 +895,7 @@ function mob_class:do_states_walk() end end -function mob_class:do_states_stand() +function mob_class:do_states_stand(player_in_active_range) local yaw = self.object:get_yaw() or 0 if math.random(1, 4) == 1 then @@ -929,14 +939,16 @@ function mob_class:do_states_stand() if self.order == "stand" or self.order == "sleep" or self.order == "work" then else - if self.walk_chance ~= 0 - and self.facing_fence ~= true - and math.random(1, 100) <= self.walk_chance - and self:is_at_cliff_or_danger() == false then + if player_in_active_range then + if self.walk_chance ~= 0 + and self.facing_fence ~= true + and math.random(1, 100) <= self.walk_chance + and self:is_at_cliff_or_danger() == false then - self:set_velocity(self.walk_velocity) - self.state = "walk" - self:set_animation( "walk") + self:set_velocity(self.walk_velocity) + self.state = "walk" + self:set_animation( "walk") + end end end end diff --git a/mods/ENTITIES/mcl_mobs/physics.lua b/mods/ENTITIES/mcl_mobs/physics.lua index 956eb992c..1fbe1e24d 100644 --- a/mods/ENTITIES/mcl_mobs/physics.lua +++ b/mods/ENTITIES/mcl_mobs/physics.lua @@ -198,6 +198,8 @@ end -- move mob in facing direction function mob_class:set_velocity(v) + if not v then return end + local c_x, c_y = 0, 0 -- can mob be pushed, if so calculate direction @@ -207,18 +209,15 @@ function mob_class:set_velocity(v) -- halt mob if it has been ordered to stay if self.order == "stand" or self.order == "sit" then - self.acc=vector.new(0,0,0) - return + self.acc = vector.zero() + return end local yaw = (self.object:get_yaw() or 0) + self.rotate local vv = self.object:get_velocity() - if vv then - self.acc={ - x = ((math.sin(yaw) * -v) + c_x)*.27, - y = 0, - z = ((math.cos(yaw) * v) + c_y)*.27, - } + + if vv and yaw then + self.acc = vector.new(((math.sin(yaw) * -v) + c_x) * .27, 0, ((math.cos(yaw) * v) + c_y) * .27) end end @@ -643,7 +642,7 @@ function mob_class:do_env_damage() --minetest.log("warning", "Pos is ignored: " .. dump(pos)) end - local sunlight = minetest.get_natural_light(pos, self.time_of_day) + local sunlight = mcl_util.get_natural_light(pos, self.time_of_day) if self.light_damage ~= 0 and (sunlight or 0) > 12 then if self:deal_light_damage(pos, self.light_damage) then @@ -821,11 +820,19 @@ function mob_class:do_env_damage() return self:check_for_death("unknown", {type = "unknown"}) end -function mob_class:env_damage (dtime, pos) +function mob_class:step_damage (dtime, pos) + if not self.fire_resistant then + mcl_burning.tick(self.object, dtime, self) + if not self.object:get_pos() then return true end -- mcl_burning.tick may remove object immediately + + if self:check_for_death("fire", {type = "fire"}) then + return true + end + end + -- environmental damage timer (every 1 second) self.env_damage_timer = self.env_damage_timer + dtime - if self.env_damage_timer > 1 then self.env_damage_timer = 0 @@ -904,47 +911,36 @@ function mob_class:falling(pos) -- floating in water (or falling) local v = self.object:get_velocity() if v then + local new_acceleration + if v.y > 0 then -- apply gravity when moving up - self.object:set_acceleration({ - x = 0, - y = DEFAULT_FALL_SPEED, - z = 0 - }) - + new_acceleration = vector.new(0, DEFAULT_FALL_SPEED, 0) elseif v.y <= 0 and v.y > self.fall_speed then -- fall downwards at set speed - self.object:set_acceleration({ - x = 0, - y = self.fall_speed, - z = 0 - }) + new_acceleration = vector.new(0, self.fall_speed, 0) else -- stop accelerating once max fall speed hit - self.object:set_acceleration({x = 0, y = 0, z = 0}) + new_acceleration =vector.zero() end + + self.object:set_acceleration(new_acceleration) end local acc = self.object:get_acceleration() - if minetest.registered_nodes[node_ok(pos).name].groups.lava then + local registered_node = minetest.registered_nodes[node_ok(pos).name] + + if registered_node.groups.lava then if acc and self.floats_on_lava == 1 then - self.object:set_acceleration({ - x = 0, - y = -self.fall_speed / (math.max(1, v.y) ^ 2), - z = 0 - }) + self.object:set_acceleration(vector.new(0, -self.fall_speed / (math.max(1, v.y) ^ 2), 0)) end end -- in water then float up - if minetest.registered_nodes[node_ok(pos).name].groups.water then + if registered_node.groups.water then if acc and self.floats == 1 then - self.object:set_acceleration({ - x = 0, - y = -self.fall_speed / (math.max(1, v.y) ^ 2), - z = 0 - }) + self.object:set_acceleration(vector.new(0, -self.fall_speed / (math.max(1, v.y) ^ 2), 0)) end else -- fall damage onto solid ground @@ -1031,9 +1027,6 @@ function mob_class:check_suspend(player_in_active_range) self.object:set_acceleration(vector.zero()) self.object:set_velocity(vector.zero()) end - if acc.y == 0 and node_under == "air" then - self:falling(pos) - end end return true end diff --git a/mods/ENTITIES/mcl_mobs/spawning.lua b/mods/ENTITIES/mcl_mobs/spawning.lua index be8e1028e..c677aeacf 100644 --- a/mods/ENTITIES/mcl_mobs/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/spawning.lua @@ -27,8 +27,11 @@ local table_remove = table.remove local pairs = pairs local LOGGING_ON = minetest.settings:get_bool("mcl_logging_mobs_spawning", false) -local function mcl_log (message) +local function mcl_log (message, property) if LOGGING_ON then + if property then + message = message .. ": " .. dump(property) + end mcl_util.mcl_log (message, "[Mobs spawn]", true) end end @@ -52,21 +55,25 @@ local MOB_CAP_INNER_RADIUS = 32 local aoc_range = 136 local MISSING_CAP_DEFAULT = 15 -local MOBS_CAP_CLOSE = 5 +local MOBS_CAP_CLOSE = 10 local SPAWN_MAPGEN_LIMIT = mcl_vars.mapgen_limit - 150 local mob_cap = { hostile = tonumber(minetest.settings:get("mcl_mob_cap_monster")) or 70, - passive = tonumber(minetest.settings:get("mcl_mob_cap_animal")) or 13, + passive = tonumber(minetest.settings:get("mcl_mob_cap_animal")) or 10, ambient = tonumber(minetest.settings:get("mcl_mob_cap_ambient")) or 15, water = tonumber(minetest.settings:get("mcl_mob_cap_water")) or 8, - water_ambient = tonumber(minetest.settings:get("mcl_mob_cap_water_ambient")) or 20, --currently unused + water_ambient = tonumber(minetest.settings:get("mcl_mob_cap_water_ambient")) or 20, + water_underground = tonumber(minetest.settings:get("mcl_mob_cap_water_underground")) or 5, + axolotl = tonumber(minetest.settings:get("mcl_mob_cap_axolotl")) or 2, -- TODO should be 5 when lush caves added player = tonumber(minetest.settings:get("mcl_mob_cap_player")) or 75, + global_hostile = tonumber(minetest.settings:get("mcl_mob_cap_hostile")) or 300, + global_non_hostile = tonumber(minetest.settings:get("mcl_mob_cap_non_hostile")) or 300, total = tonumber(minetest.settings:get("mcl_mob_cap_total")) or 500, } -local peaceful_percentage_spawned = tonumber(minetest.settings:get("mcl_mob_peaceful_percentage_spawned")) or 35 +local peaceful_percentage_spawned = tonumber(minetest.settings:get("mcl_mob_peaceful_percentage_spawned")) or 30 local peaceful_group_percentage_spawned = tonumber(minetest.settings:get("mcl_mob_peaceful_group_percentage_spawned")) or 15 local hostile_group_percentage_spawned = tonumber(minetest.settings:get("mcl_mob_hostile_group_percentage_spawned")) or 20 @@ -340,15 +347,32 @@ local function count_mobs_all(categorise_by, pos) end local function count_mobs_total_cap(mob_type) + local total = 0 local num = 0 + local hostile = 0 + local non_hostile = 0 for _,l in pairs(minetest.luaentities) do if l.is_mob then - if ( mob_type == nil or l.type == mob_type ) and l.can_despawn and not l.nametag then + total = total + 1 + local nametagged = l.nametag and l.nametag ~= "" + if ( mob_type == nil or l.type == mob_type ) and not nametagged then + if l.spawn_class == "hostile" then + hostile = hostile + 1 + else + non_hostile = non_hostile + 1 + end num = num + 1 + else + mcl_log("l.name", l.name) + mcl_log("l.nametag", l.nametag) + end end end - return num + mcl_log("Total mobs", total) + mcl_log("hostile", hostile) + mcl_log("non_hostile", non_hostile) + return num, non_hostile, hostile end local function output_mob_stats(mob_counts, total_mobs, chat_display) @@ -704,13 +728,13 @@ local function spawn_check(pos, spawn_def) --mcl_log("Level 3 spawn check passed") return true else - mcl_log("Spawn check level 3 failed") + --mcl_log("Spawn check level 3 failed") end else - mcl_log("Spawn check level 2 failed") + --mcl_log("Spawn check level 2 failed") end else - mcl_log("Spawn check level 1 failed") + --mcl_log("Spawn check level 1 failed") end return false end @@ -831,7 +855,7 @@ if mobs_spawn then -- Get pos to spawn, x and z are randomised, y is range - local function mob_cap_space (pos, mob_type, mob_counts_close, mob_counts_wide) + local function mob_cap_space (pos, mob_type, mob_counts_close, mob_counts_wide, cap_space_hostile, cap_space_non_hostile) -- Some mob examples --type = "monster", spawn_class = "hostile", @@ -847,9 +871,18 @@ if mobs_spawn then mob_total_wide = 0 end - local cap_space_wide = type_cap - mob_total_wide - if cap_space_wide < 1 then - cap_space_wide = 0 + local cap_space_wide = math.max(type_cap - mob_total_wide, 0) + + mcl_log("mob_type", mob_type) + mcl_log("cap_space_wide", cap_space_wide) + + local cap_space_available = 0 + if mob_type == "hostile" then + mcl_log("cap_space_global", cap_space_hostile) + cap_space_available = math.min(cap_space_hostile, cap_space_wide) + else + mcl_log("cap_space_global", cap_space_non_hostile) + cap_space_available = math.min(cap_space_non_hostile, cap_space_wide) end local mob_total_close = mob_counts_close[mob_type] @@ -858,12 +891,11 @@ if mobs_spawn then mob_total_close = 0 end - local cap_space_close = close_zone_cap - mob_total_close - if cap_space_close < 1 then - cap_space_close = 0 - end + local cap_space_close = math.max(close_zone_cap - mob_total_close, 0) + cap_space_available = math.min(cap_space_available, cap_space_close) - --mcl_log("spawn_class: " .. spawn_class) + mcl_log("cap_space_close", cap_space_close) + mcl_log("cap_space_available", cap_space_available) if false and mob_type == "water" then mcl_log("mob_type: " .. mob_type .. " and pos: " .. minetest.pos_to_string(pos)) @@ -873,7 +905,7 @@ if mobs_spawn then mcl_log("cap_space_close: " .. cap_space_close) end - return cap_space_wide, cap_space_close + return cap_space_available end local function find_spawning_position(pos, max_times) @@ -884,7 +916,7 @@ if mobs_spawn then local y_min, y_max = decypher_limits(pos.y) - mcl_log("mapgen_limit: " .. SPAWN_MAPGEN_LIMIT) + --mcl_log("mapgen_limit: " .. SPAWN_MAPGEN_LIMIT) local i = 0 repeat local goal_pos = get_next_mob_spawn_pos(pos) @@ -916,7 +948,7 @@ if mobs_spawn then return spawning_position end - local function spawn_a_mob(pos) + local function spawn_a_mob(pos, cap_space_hostile, cap_space_non_hostile) --create a disconnected clone of the spawn dictionary, prevents memory leak local mob_library_worker_table = table_copy(spawn_dictionary) @@ -954,22 +986,18 @@ if mobs_spawn then if mob_def and mob_def.name and minetest.registered_entities[mob_def.name] then local mob_def_ent = minetest.registered_entities[mob_def.name] - --local mob_type = mob_def_ent.type local mob_spawn_class = mob_def_ent.spawn_class - --mcl_log("mob_spawn_class: " .. mob_spawn_class) + local cap_space_available = mob_cap_space (spawning_position, mob_spawn_class, mob_counts_close, mob_counts_wide, cap_space_hostile, cap_space_non_hostile) - local cap_space_wide, cap_space_close = mob_cap_space (spawning_position, mob_spawn_class, mob_counts_close, mob_counts_wide) - - - if cap_space_close > 0 and cap_space_wide > 0 then + if cap_space_available > 0 then --mcl_log("Cap space available") -- Spawn caps for animals and water creatures fill up rapidly. Need to throttle this somewhat -- for performance and for early game challenge. We don't want to reduce hostiles though. local spawn_hostile = (mob_spawn_class == "hostile") local spawn_passive = (mob_spawn_class ~= "hostile") and math.random(100) < peaceful_percentage_spawned - -- or not hostile + --mcl_log("Spawn_passive: " .. tostring(spawn_passive)) --mcl_log("Spawn_hostile: " .. tostring(spawn_hostile)) @@ -1000,13 +1028,10 @@ if mobs_spawn then local group_min = mob_def_ent.spawn_in_group_min or 1 if not group_min then group_min = 1 end - local amount_to_spawn = math.random(group_min,spawn_in_group) - - if amount_to_spawn > cap_space_wide then - mcl_log("Spawning quantity: " .. amount_to_spawn) - mcl_log("Throttle amount to cap space: " .. cap_space_wide) - amount_to_spawn = cap_space_wide - end + local amount_to_spawn = math.random(group_min, spawn_in_group) + mcl_log("Spawning quantity: " .. amount_to_spawn) + amount_to_spawn = math.min(amount_to_spawn, cap_space_available) + mcl_log("throttled spawning quantity: " .. amount_to_spawn) if logging then minetest.log("action", "[mcl_mobs] A group of " ..amount_to_spawn .. " " .. mob_def.name .. " mob spawns on " ..minetest.get_node(vector.offset(spawning_position,0,-1,0)).name .." at " .. minetest.pos_to_string(spawning_position, 1)) @@ -1021,7 +1046,7 @@ if mobs_spawn then if spawned then --mcl_log("We have spawned") - mob_counts_close, mob_counts_wide, total_mobs = count_mobs_all("type", pos) + mob_counts_close, mob_counts_wide, total_mobs = count_mobs_all("spawn_class", pos) local new_spawning_position = find_spawning_position(pos, FIND_SPAWN_POS_RETRIES_SUCCESS_RESPIN) if new_spawning_position then mcl_log("Setting new spawning position") @@ -1034,7 +1059,7 @@ if mobs_spawn then --mcl_log("Spawn check failed") end else - mcl_log("Cap space full") + --mcl_log("Cap space full") end end @@ -1054,7 +1079,13 @@ if mobs_spawn then timer = 0 local players = get_connected_players() - local total_mobs = count_mobs_total_cap() + local total_mobs, total_non_hostile, total_hostile = count_mobs_total_cap() + + local cap_space_hostile = math.max(mob_cap.global_hostile - total_hostile, 0) + local cap_space_non_hostile = math.max(mob_cap.global_non_hostile - total_non_hostile, 0) + mcl_log("global cap_space_hostile", cap_space_hostile) + mcl_log("global cap_space_non_hostile", cap_space_non_hostile) + if total_mobs > mob_cap.total or total_mobs > #players * mob_cap.player then minetest.log("action","[mcl_mobs] global mob cap reached. no cycle spawning.") return @@ -1065,21 +1096,49 @@ if mobs_spawn then local dimension = mcl_worlds.pos_to_dimension(pos) -- ignore void and unloaded area if dimension ~= "void" and dimension ~= "default" then - spawn_a_mob(pos) + spawn_a_mob(pos, cap_space_hostile, cap_space_non_hostile) end end end) end +local function despawn_allowed(self) + local nametag = self.nametag and self.nametag ~= "" + local not_busy = self.state ~= "attack" and self.following == nil + if self.can_despawn == true then + if not nametag and not_busy and not self.tamed == true and not self.persistent == true then + return true + end + end + return false +end + +function mob_class:despawn_allowed() + despawn_allowed(self) +end + + +assert(despawn_allowed({can_despawn=false}) == false, "despawn_allowed - can_despawn false failed") +assert(despawn_allowed({can_despawn=true}) == true, "despawn_allowed - can_despawn true failed") + +assert(despawn_allowed({can_despawn=true, nametag=""}) == true, "despawn_allowed - blank nametag failed") +assert(despawn_allowed({can_despawn=true, nametag=nil}) == true, "despawn_allowed - nil nametag failed") +assert(despawn_allowed({can_despawn=true, nametag="bob"}) == false, "despawn_allowed - nametag failed") + +assert(despawn_allowed({can_despawn=true, state="attack"}) == false, "despawn_allowed - attack state failed") +assert(despawn_allowed({can_despawn=true, following="blah"}) == false, "despawn_allowed - following state failed") + +assert(despawn_allowed({can_despawn=true, tamed=false}) == true, "despawn_allowed - not tamed") +assert(despawn_allowed({can_despawn=true, tamed=true}) == false, "despawn_allowed - tamed") + +assert(despawn_allowed({can_despawn=true, persistent=true}) == false, "despawn_allowed - persistent") +assert(despawn_allowed({can_despawn=true, persistent=false}) == true, "despawn_allowed - not persistent") + function mob_class:check_despawn(pos, dtime) self.lifetimer = self.lifetimer - dtime -- Despawning: when lifetimer expires, remove mob - if remove_far - and self.can_despawn == true - and ((not self.nametag) or (self.nametag == "")) - and self.state ~= "attack" - and self.following == nil then + if remove_far and despawn_allowed(self) then if self.despawn_immediately or self.lifetimer <= 0 then if logging then minetest.log("action", "[mcl_mobs] Mob "..self.name.." despawns at "..minetest.pos_to_string(pos, 1) .. " lifetimer ran out") diff --git a/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.es.tr b/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.es.tr new file mode 100644 index 000000000..d1e4d3f24 --- /dev/null +++ b/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.es.tr @@ -0,0 +1,2 @@ +# textdomain:mcl_paintings +Painting=Cuadro diff --git a/mods/ENTITIES/mobs_mc/README.md b/mods/ENTITIES/mobs_mc/README.md index 881f56619..bdc561295 100644 --- a/mods/ENTITIES/mobs_mc/README.md +++ b/mods/ENTITIES/mobs_mc/README.md @@ -39,7 +39,7 @@ This mod adds mobs which closely resemble the mobs from the game Minecraft, vers * Cave Spider * Enderman * Zombie Villager -* Zombie Pigman +* Zombie Piglin * Wither Skeleton * Magma Cube * Blaze diff --git a/mods/ENTITIES/mobs_mc/axolotl.lua b/mods/ENTITIES/mobs_mc/axolotl.lua index 124f6bd3a..087f201c7 100644 --- a/mods/ENTITIES/mobs_mc/axolotl.lua +++ b/mods/ENTITIES/mobs_mc/axolotl.lua @@ -2,7 +2,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) local axolotl = { type = "animal", - spawn_class = "water", + spawn_class = "axolotl", can_despawn = true, passive = false, hp_min = 14, diff --git a/mods/ENTITIES/mobs_mc/cod.lua b/mods/ENTITIES/mobs_mc/cod.lua index 9e8b62269..656b2c14c 100644 --- a/mods/ENTITIES/mobs_mc/cod.lua +++ b/mods/ENTITIES/mobs_mc/cod.lua @@ -31,7 +31,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) local cod = { type = "animal", - spawn_class = "water", + spawn_class = "water_ambient", can_despawn = true, passive = true, hp_min = 3, diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index fa0717e47..f751b1240 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -10,6 +10,7 @@ local S = minetest.get_translator("mobs_mc") mcl_mobs.register_mob("mobs_mc:creeper", { + description = S("Creeper"), type = "monster", spawn_class = "hostile", spawn_in_group = 1, diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index 8415084e1..a57160e4d 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -24,6 +24,12 @@ -- added rain damage. -- fixed the grass_with_dirt issue. +-- How freqeuntly to take and place blocks, in seconds +local take_frequency_min = 235 +local take_frequency_max = 245 +local place_frequency_min = 235 +local place_frequency_max = 245 + minetest.register_entity("mobs_mc:ender_eyes", { visual = "mesh", mesh = "mobs_mc_spider.b3d", @@ -60,13 +66,6 @@ end local pr = PseudoRandom(os.time()*(-334)) --- How freqeuntly to take and place blocks, in seconds -local take_frequency_min = 235 -local take_frequency_max = 245 -local place_frequency_min = 235 -local place_frequency_max = 245 - - -- Texuture overrides for enderman block. Required for cactus because it's original is a nodebox -- and the textures have tranparent pixels. local block_texture_overrides @@ -491,7 +490,7 @@ mcl_mobs.register_mob("mobs_mc:enderman", { local dug = minetest.get_node_or_nil(take_pos) if dug and dug.name == "air" then self._taken_node = node.name - self.can_despawn = false + self.persistent = true local def = minetest.registered_nodes[self._taken_node] -- Update animation and texture accordingly (adds visibly carried block) local block_type @@ -542,7 +541,7 @@ mcl_mobs.register_mob("mobs_mc:enderman", { if success then local def = minetest.registered_nodes[self._taken_node] -- Update animation accordingly (removes visible block) - self.can_despawn = true + self.persistent = false self.animation = select_enderman_animation("normal") self:set_animation(self.animation.current) if def.sounds and def.sounds.place then diff --git a/mods/ENTITIES/mobs_mc/glow_squid.lua b/mods/ENTITIES/mobs_mc/glow_squid.lua index 5975671b1..2d3f19270 100644 --- a/mods/ENTITIES/mobs_mc/glow_squid.lua +++ b/mods/ENTITIES/mobs_mc/glow_squid.lua @@ -31,7 +31,7 @@ end mcl_mobs.register_mob("mobs_mc:glow_squid", { type = "animal", - spawn_class = "water", + spawn_class = "water_underground", can_despawn = true, passive = true, hp_min = 10, diff --git a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua index 8bad858a8..8f8590933 100644 --- a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua +++ b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua @@ -10,6 +10,7 @@ local S = minetest.get_translator("mobs_mc") --################### local hoglin = { + description = S("Hoglin"), type = "monster", passive = false, spawn_class = "hostile", @@ -19,8 +20,9 @@ local hoglin = { xp_max = 9, armor = {fleshy = 90}, attack_type = "dogfight", + attack_frequency = 3; damage = 4, - reach = 3, + reach = 1.9, collisionbox = {-.6, -0.01, -.6, .6, 1.4, .6}, visual = "mesh", mesh = "extra_mobs_hoglin.b3d", @@ -63,7 +65,7 @@ local hoglin = { punch_end = 32, }, fear_height = 4, - view_range = 32, + view_range = 16, floats = 0, custom_attack = function(self) if self.state == "attack" and self.reach > vector.distance(self.object:get_pos(), self.attack:get_pos()) then @@ -87,6 +89,7 @@ local hoglin = { mcl_mobs.register_mob("mobs_mc:hoglin", hoglin) local zoglin = table.copy(hoglin) +zoglin.description = S("Zoglin") zoglin.fire_resistant = 1 zoglin.textures = {"extra_mobs_zoglin.png"} zoglin.do_custom = function() @@ -100,6 +103,7 @@ mcl_mobs.register_mob("mobs_mc:zoglin", zoglin) -- Baby hoglin. local baby_hoglin = table.copy(hoglin) +baby_hoglin.description = S("Baby hoglin") baby_hoglin.collisionbox = {-.3, -0.01, -.3, .3, 0.94, .3} baby_hoglin.xp_min = 20 baby_hoglin.xp_max = 20 diff --git a/mods/ENTITIES/mobs_mc/init.lua b/mods/ENTITIES/mobs_mc/init.lua index c2b3d8ed0..483efdcb4 100644 --- a/mods/ENTITIES/mobs_mc/init.lua +++ b/mods/ENTITIES/mobs_mc/init.lua @@ -139,7 +139,6 @@ dofile(path .. "/silverfish.lua") -- maikerumine Mesh and animation by toby109tt dofile(path .. "/skeleton+stray.lua") -- Mesh by Morn76 Animation by Pavel_S dofile(path .. "/skeleton_wither.lua") -- Mesh by Morn76 Animation by Pavel_S dofile(path .. "/zombie.lua") -- Mesh by Morn76 Animation by Pavel_S -dofile(path .. "/zombiepig.lua") -- Mesh by Morn76 Animation by Pavel_S dofile(path .. "/slime+magma_cube.lua") -- Wuzzy dofile(path .. "/spider.lua") -- Spider by AspireMint (fishyWET (CC-BY-SA 3.0 license for texture) dofile(path .. "/vex.lua") -- KrupnoPavel @@ -153,7 +152,7 @@ dofile(path .. "/dolphin.lua") dofile(path .. "/glow_squid.lua") -dofile(path .. "/piglin.lua") +dofile(path .. "/piglin.lua") -- "mobs_mc_zombie_pigman.b3d" Mesh by Morn76 Animation by Pavel_S dofile(path .. "/hoglin+zoglin.lua") dofile(path .. "/strider.lua") diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr index 676415d69..84aade90e 100644 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr @@ -48,7 +48,7 @@ Wither=Wither Wolf=Wolf Husk=Wüstenzombie Zombie=Zombie -Zombie Pigman=Schweinezombie +Zombie Piglin=Schweinezombie Farmer=Bauer Fisherman=Fischer Fletcher=Pfeilmacher diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr index 09e0335b8..7f81f0280 100644 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr @@ -54,5 +54,18 @@ Baby Husk=Bebé Zombi Momificado Baby Zombie=Bebé Zombi Husk=Zombi Momificado Zombie=Zombi -Baby Zombie Pigman=Bebé Hombrecerdo Zombi -Zombie Pigman=Hombrecerdo Zombi +Baby Zombie Piglin=Bebé Hombrecerdo Zombi +Zombie Piglin=Hombrecerdo Zombi +Cartographer=Cartógrafo +Armorer=Escudero +Leatherworker=Peletero +Butcher=Carnicero +Weapon Smith=Armero +Tool Smith=Herrero +Cleric=Clérigo +Nitwit=Holgazán +Cod=Bacalao +Salmon=Salmón +Dolphin=Delfín +Pillager=Saqueador +Tropical fish=Pez tropical diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr index 06c97945e..81c93a33b 100644 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr @@ -1,5 +1,6 @@ # textdomain: mobs_mc Agent=Agent +Axolotl=Axolotl Bat=Chauve-souris Blaze=Blaze Chicken=Poulet @@ -48,7 +49,7 @@ Wither=Wither Wolf=Loup Husk=Zombie Momifié Zombie=Zombie -Zombie Pigman=Zombie Cochon +Zombie Piglin=Zombie Cochon Farmer=Fermier Fisherman=Pêcheur Fletcher=Archer @@ -66,4 +67,7 @@ Cod=Morue Salmon=Saumon Dolphin=Dauphin Pillager=Pilleur -Tropical fish=Poisson tropical \ No newline at end of file +Tropical fish=Poisson tropical +Hoglin=Hoglin +Strider=Arpenteur +Glow Squid=Poulpe Brillant \ No newline at end of file diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.ja.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.ja.tr index ff6966131..63d73e222 100644 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.ja.tr +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.ja.tr @@ -49,7 +49,7 @@ Wither=ウィザー Wolf=オオカミ Husk=ハスク Zombie=ゾンビ -Zombie Pigman=ゾンビピッグマン +Zombie Piglin=ゾンビピッグマン Farmer=農民 Fisherman=漁師 Fletcher=矢師 diff --git a/mods/ENTITIES/mobs_mc/locale/template.txt b/mods/ENTITIES/mobs_mc/locale/template.txt index 38c6111b5..589a1a3c4 100644 --- a/mods/ENTITIES/mobs_mc/locale/template.txt +++ b/mods/ENTITIES/mobs_mc/locale/template.txt @@ -49,7 +49,12 @@ Wither= Wolf= Husk= Zombie= -Zombie Pigman= +Piglin= +Baby Piglin= +Zombie Piglin= +Baby Zombie Piglin= +Sword Piglin= +Piglin Brute= Farmer= Fisherman= Fletcher= @@ -67,4 +72,7 @@ Cod= Salmon= Dolphin= Pillager= -Tropical fish= \ No newline at end of file +Tropical fish= +Hoglin= +Strider= +Glow Squid= \ No newline at end of file diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index 7f2ebc88d..9084c5d4d 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -82,7 +82,7 @@ mcl_mobs.register_mob("mobs_mc:pig", { end -- if driver present allow control of horse - if self.driver then + if self.driver and self.driver:get_wielded_item():get_name() == "mcl_mobitems:carrot_on_a_stick" then mcl_mobs.drive(self, "walk", "stand", false, dtime) @@ -149,18 +149,14 @@ mcl_mobs.register_mob("mobs_mc:pig", { return end - -- Mount or detach player - local name = clicker:get_player_name() - if self.driver and clicker == self.driver then - -- Detach if already attached - mcl_mobs.detach(clicker, {x=1, y=0, z=0}) - return - - elseif not self.driver and self.saddle == "yes" and wielditem:get_name() == "mcl_mobitems:carrot_on_a_stick" then - -- Ride pig if it has a saddle and player uses a carrot on a stick - - mcl_mobs.attach(self, clicker) - + -- Should make pig go faster when right clicked with carrot on a stick. + -- FIXME: needs work on the going faster part. + --[[if self.driver and clicker == self.driver and self.driver:get_wielded_item():get_name() == "mcl_mobitems:carrot_on_a_stick" then + if not self.v3 then + self.v3 = 0 + self.max_speed_forward = 100 + self.accel = 10 + end if not minetest.is_creative_enabled(clicker:get_player_name()) then local inv = self.driver:get_inventory() @@ -177,6 +173,19 @@ mcl_mobs.register_mob("mobs_mc:pig", { end inv:set_stack("main",self.driver:get_wield_index(), wielditem) end + end]] + + -- Mount or detach player + local name = clicker:get_player_name() + if self.driver and clicker == self.driver then -- and self.driver:get_wielded_item():get_name() ~= "mcl_mobitems:carrot_on_a_stick" then -- Note: This is for when the ability to make the pig go faster is implemented + -- Detach if already attached + mcl_mobs.detach(clicker, {x=1, y=0, z=0}) + return + + elseif not self.driver and self.saddle == "yes" then + -- Ride pig if it has a saddle + + mcl_mobs.attach(self, clicker) return -- Capture pig @@ -195,6 +204,18 @@ mcl_mobs.register_mob("mobs_mc:pig", { return false end end, + + after_activate = function(self, staticdata, def, dtime) + if self.saddle == "yes" then -- Make saddle load upon rejoin + self.base_texture = { + "mobs_mc_pig.png", -- base + "mobs_mc_pig_saddle.png", -- saddle + } + self.object:set_properties({ + textures = self.base_texture + }) + end + end, }) mcl_mobs:spawn_specific( diff --git a/mods/ENTITIES/mobs_mc/piglin.lua b/mods/ENTITIES/mobs_mc/piglin.lua index b8c8faf21..4f701b3e9 100644 --- a/mods/ENTITIES/mobs_mc/piglin.lua +++ b/mods/ENTITIES/mobs_mc/piglin.lua @@ -25,7 +25,10 @@ function mobs_mc.player_wears_gold(player) for i=1, 6 do local stack = player:get_inventory():get_stack("armor", i) local item = stack:get_name() - if item == "mcl_armor:chestplate_gold" or item == "mcl_armor:leggings_gold" or item == "mcl_armor:helmet_gold" or item == "mcl_armor:boots_gold" then + if string.find(item, "mcl_armor:chestplate_gold") + or string.find(item, "mcl_armor:leggings_gold") + or string.find(item, "mcl_armor:helmet_gold") + or string.find(item, "mcl_armor:boots_gold") then return true end end @@ -35,9 +38,11 @@ end --################### piglin --################### local piglin = { + description = S("Piglin"), type = "monster", passive = false, spawn_class = "hostile", + group_attack = {"mobs_mc:piglin", "mobs_mc:sword_piglin", "mobs_mc:piglin_brute"}, hp_min = 16, hp_max = 16, xp_min = 9, @@ -178,6 +183,7 @@ mcl_mobs.register_mob("mobs_mc:piglin", piglin) local sword_piglin = table.copy(piglin) +sword_piglin.description = S("Sword Piglin") sword_piglin.mesh = "extra_mobs_sword_piglin.b3d" sword_piglin.textures = {"extra_mobs_piglin.png", "default_tool_goldsword.png"} sword_piglin.on_spawn = function(self) @@ -206,43 +212,127 @@ sword_piglin.animation = { punch_start = 189, punch_end = 198, } + mcl_mobs.register_mob("mobs_mc:sword_piglin", sword_piglin) -local zombified_piglin = table.copy(piglin) -zombified_piglin.fire_resistant = 1 -zombified_piglin.do_custom = function() - return -end -zombified_piglin.on_spawn = function() - return -end -zombified_piglin.on_rightclick = function() - return -end -zombified_piglin.lava_damage = 0 -zombified_piglin.fire_damage = 0 -zombified_piglin.attack_animals = true -zombified_piglin.mesh = "extra_mobs_sword_piglin.b3d" -zombified_piglin.textures = {"extra_mobs_zombified_piglin.png", "default_tool_goldsword.png", "extra_mobs_trans.png"} -zombified_piglin.attack_type = "dogfight" -zombified_piglin.animation = { - stand_speed = 30, - walk_speed = 30, - punch_speed = 45, - run_speed = 30, - stand_start = 0, - stand_end = 79, - walk_start = 168, - walk_end = 187, - run_start = 440, - run_end = 459, - punch_start = 189, - punch_end = 198, + +-- Zombified Piglin -- + + +local zombified_piglin = { + description = S("Zombie Piglin"), + -- type="animal", passive=false: This combination is needed for a neutral mob which becomes hostile, if attacked + type = "animal", + passive = false, + spawn_class = "passive", + hp_min = 20, + hp_max = 20, + xp_min = 6, + xp_max = 6, + armor = {undead = 90, fleshy = 90}, + attack_type = "dogfight", + group_attack = {"mobs_mc:zombified_piglin", "mobs_mc:baby_zombified_piglin"}, + damage = 9, + reach = 2, + head_swivel = "head.control", + bone_eye_height = 2.4, + head_eye_height = 1.4, + curiosity = 15, + collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, -- same + visual = "mesh", + mesh = "mobs_mc_zombie_pigman.b3d", + textures = { { + "blank.png", --baby + "default_tool_goldsword.png", --sword + "mobs_mc_zombie_pigman.png", --pigman + } }, + visual_size = {x=3, y=3}, + sounds = { + random = "mobs_mc_zombiepig_random", + war_cry = "mobs_mc_zombiepig_war_cry", + death = "mobs_mc_zombiepig_death", + damage = "mobs_mc_zombiepig_hurt", + distance = 16, + }, + jump = true, + makes_footstep_sound = true, + walk_velocity = .8, + run_velocity = 2.6, + pathfinding = 1, + drops = { + {name = "mcl_mobitems:rotten_flesh", + chance = 1, + min = 1, + max = 1, + looting = "common"}, + {name = "mcl_core:gold_nugget", + chance = 1, + min = 0, + max = 1, + looting = "common"}, + {name = "mcl_core:gold_ingot", + chance = 40, -- 2.5% + min = 1, + max = 1, + looting = "rare"}, + {name = "mcl_tools:sword_gold", + chance = 100 / 8.5, + min = 1, + max = 1, + looting = "rare"}, + }, + animation = { + stand_speed = 25, + walk_speed = 25, + run_speed = 50, + stand_start = 40, + stand_end = 80, + walk_start = 0, + walk_end = 40, + run_start = 0, + run_end = 40, + punch_start = 90, + punch_end = 130, + }, + lava_damage = 0, + fire_damage = 0, + fear_height = 4, + view_range = 16, + harmed_by_heal = true, + fire_damage_resistant = true, } + mcl_mobs.register_mob("mobs_mc:zombified_piglin", zombified_piglin) +local baby_zombified_piglin = table.copy(zombified_piglin) +baby_zombified_piglin.description = S("Baby Zombie Piglin") +baby_zombified_piglin.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25} +baby_zombified_piglin.xp_min = 13 +baby_zombified_piglin.xp_max = 13 +baby_zombified_piglin.textures = { + { + "mobs_mc_zombie_pigman.png", --baby + "default_tool_goldsword.png", --sword + "mobs_mc_zombie_pigman.png", --pigman + } +} +baby_zombified_piglin.walk_velocity = 1.2 +baby_zombified_piglin.run_velocity = 2.4 +baby_zombified_piglin.light_damage = 0 +baby_zombified_piglin.child = 1 + +mcl_mobs.register_mob("mobs_mc:baby_zombified_piglin", baby_zombified_piglin) + +-- Compatibility code. These were removed, and now are called zombie piglins. They don't spawn. +-- This is only to catch old cases. Maybe could be an alias? +mcl_mobs.register_mob("mobs_mc:pigman", zombified_piglin) +mcl_mobs.register_mob("mobs_mc:baby_pigman", baby_zombified_piglin) + + +-- Piglin Brute -- local piglin_brute = table.copy(piglin) +piglin_brute.description = S("Piglin Brute") piglin_brute.xp_min = 20 piglin_brute.xp_max = 20 piglin_brute.hp_min = 50 @@ -279,11 +369,17 @@ piglin_brute.animation = { punch_end = 198, } piglin_brute.can_despawn = false -piglin_brute.group_attack = { "mobs_mc:piglin", "mobs_mc:piglin_brute" } + +piglin_brute.drops = { + {name = "mcl_tools:axe_gold", + chance = 8.5, + min = 1, + max = 1,}, +} mcl_mobs.register_mob("mobs_mc:piglin_brute", piglin_brute) -mcl_mobs:non_spawn_specific("mobs_mc:piglin","overworld",0,7) + -- Regular spawning in the Nether mcl_mobs:spawn_specific( "mobs_mc:piglin", @@ -300,15 +396,15 @@ minetest.LIGHT_MAX+1, 3, mcl_vars.mg_lava_nether_max, mcl_vars.mg_nether_max) -mcl_mobs:non_spawn_specific("mobs_mc:sword_piglin","overworld",0,7) + mcl_mobs:spawn_specific( "mobs_mc:sword_piglin", "nether", "ground", { -"Nether", -"CrimsonForest" -}, + "Nether", + "CrimsonForest" + }, 0, minetest.LIGHT_MAX+1, 30, @@ -316,7 +412,45 @@ minetest.LIGHT_MAX+1, 3, mcl_vars.mg_lava_nether_max, mcl_vars.mg_nether_max) --- spawn eggs + +mcl_mobs:spawn_specific( + "mobs_mc:zombified_piglin", + "nether", + "ground", + { + "Nether", + "CrimsonForest", + }, + 0, + minetest.LIGHT_MAX+1, + 30, + 6000, + 3, + mcl_vars.mg_nether_min, + mcl_vars.mg_nether_max) + +-- Baby zombie is 20 times less likely than regular zombies +mcl_mobs:spawn_specific( + "mobs_mc:baby_zombified_piglin", + "nether", + "ground", + { + "Nether", + "CrimsonForest", + }, + 0, + minetest.LIGHT_MAX+1, + 30, + 100000, + 4, + mcl_vars.mg_nether_min, + mcl_vars.mg_nether_max) + +mcl_mobs:non_spawn_specific("mobs_mc:piglin","overworld",0,7) +mcl_mobs:non_spawn_specific("mobs_mc:sword_piglin","overworld",0,7) +mcl_mobs:non_spawn_specific("mobs_mc:piglin_brute","overworld",0,7) +mcl_mobs:non_spawn_specific("mobs_mc:zombified_piglin","overworld",0,minetest.LIGHT_MAX+1) + mcl_mobs.register_egg("mobs_mc:piglin", S("Piglin"), "#7b4a17","#d5c381", 0) mcl_mobs.register_egg("mobs_mc:piglin_brute", S("Piglin Brute"), "#562b0c","#ddc89d", 0) -mcl_mobs:non_spawn_specific("mobs_mc:piglin_brute","overworld",0,7) +mcl_mobs.register_egg("mobs_mc:zombified_piglin", S("Zombie Piglin"), "#ea9393", "#4c7129", 0) diff --git a/mods/ENTITIES/mobs_mc/salmon.lua b/mods/ENTITIES/mobs_mc/salmon.lua index 19c935389..f8e0c4e02 100644 --- a/mods/ENTITIES/mobs_mc/salmon.lua +++ b/mods/ENTITIES/mobs_mc/salmon.lua @@ -11,7 +11,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) local salmon = { type = "animal", - spawn_class = "water", + spawn_class = "water_ambient", can_despawn = true, passive = true, hp_min = 3, diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 71a45b5ab..c07afb6b1 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -269,7 +269,6 @@ local cave_biomes = { "RoofedForest_underground", "Jungle_underground", "Swampland_underground", - "MushroomIsland_underground", "BirchForest_underground", "Plains_underground", "MesaPlateauF_underground", diff --git a/mods/ENTITIES/mobs_mc/tropical_fish.lua b/mods/ENTITIES/mobs_mc/tropical_fish.lua index 702c692b8..79b32bb8b 100644 --- a/mods/ENTITIES/mobs_mc/tropical_fish.lua +++ b/mods/ENTITIES/mobs_mc/tropical_fish.lua @@ -59,7 +59,7 @@ end local tropical_fish = { type = "animal", - spawn_class = "water", + spawn_class = "water_ambient", can_despawn = true, passive = true, hp_min = 3, diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index db44843f2..8fc18ccab 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -137,7 +137,7 @@ 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", 15, 10 }, E1 }, + { { "mcl_core:coal_lump", 10, 15 }, E1 }, -- FIXME missing: bucket of cod + fish should be cod. }, { diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua index 37dce5623..5af1fc879 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua @@ -109,7 +109,7 @@ mcl_mobs.register_mob("mobs_mc:villager_zombie", { clicker:set_wielded_item(wielditem) self._curing = math.random(3 * 60, 5 * 60) self.shaking = true - self.can_despawn = false + self.persistent = true end end end, diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index 922069508..7b142086d 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -216,7 +216,6 @@ mcl_mobs:spawn_specific( "MegaTaiga", "Forest", "ColdTaiga", - "FlowerForest_beach", "Forest_beach", "ColdTaiga_beach_water", "Taiga_beach", diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua deleted file mode 100644 index f753b5f85..000000000 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ /dev/null @@ -1,156 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### ZOMBIE PIGMAN ---################### - - -local pigman = { - description = S("Zombie Pigman"), - -- type="animal", passive=false: This combination is needed for a neutral mob which becomes hostile, if attacked - type = "animal", - passive = false, - spawn_class = "passive", - hp_min = 20, - hp_max = 20, - xp_min = 6, - xp_max = 6, - armor = {undead = 90, fleshy = 90}, - attack_type = "dogfight", - group_attack = { "mobs_mc:pigman", "mobs_mc:baby_pigman" }, - damage = 9, - reach = 2, - head_swivel = "head.control", - bone_eye_height = 2.4, - head_eye_height = 1.4, - curiosity = 15, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, - visual = "mesh", - mesh = "mobs_mc_zombie_pigman.b3d", - textures = { { - "blank.png", --baby - "default_tool_goldsword.png", --sword - "mobs_mc_zombie_pigman.png", --pigman - } }, - visual_size = {x=3, y=3}, - sounds = { - random = "mobs_mc_zombiepig_random", - war_cry = "mobs_mc_zombiepig_war_cry", - death = "mobs_mc_zombiepig_death", - damage = "mobs_mc_zombiepig_hurt", - distance = 16, - }, - jump = true, - makes_footstep_sound = true, - walk_velocity = .8, - run_velocity = 2.6, - pathfinding = 1, - drops = { - {name = "mcl_mobitems:rotten_flesh", - chance = 1, - min = 1, - max = 1, - looting = "common"}, - {name = "mcl_core:gold_nugget", - chance = 1, - min = 0, - max = 1, - looting = "common"}, - {name = "mcl_core:gold_ingot", - chance = 40, -- 2.5% - min = 1, - max = 1, - looting = "rare"}, - {name = "mcl_tools:sword_gold", - chance = 100 / 8.5, - min = 1, - max = 1, - looting = "rare"}, - }, - animation = { - stand_speed = 25, - walk_speed = 25, - run_speed = 50, - stand_start = 40, - stand_end = 80, - walk_start = 0, - walk_end = 40, - run_start = 0, - run_end = 40, - punch_start = 90, - punch_end = 130, - }, - lava_damage = 0, - fire_damage = 0, - fear_height = 4, - view_range = 16, - harmed_by_heal = true, - fire_damage_resistant = true, -} - -mcl_mobs.register_mob("mobs_mc:pigman", pigman) - --- Baby pigman. --- A smaller and more dangerous variant of the pigman - -local baby_pigman = table.copy(pigman) -baby_pigman.description = S("Baby Zombie Pigman") -baby_pigman.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25} -baby_pigman.xp_min = 13 -baby_pigman.xp_max = 13 -baby_pigman.textures = { { - "mobs_mc_zombie_pigman.png", --baby - "default_tool_goldsword.png", --sword - "mobs_mc_zombie_pigman.png", --pigman -} } -baby_pigman.walk_velocity = 1.2 -baby_pigman.run_velocity = 2.4 -baby_pigman.light_damage = 0 -baby_pigman.child = 1 - -mcl_mobs.register_mob("mobs_mc:baby_pigman", baby_pigman) - --- Regular spawning in the Nether -mcl_mobs:spawn_specific( -"mobs_mc:pigman", -"nether", -"ground", -{ -"Nether", -"CrimsonForest", -}, -0, -minetest.LIGHT_MAX+1, -30, -6000, -3, -mcl_vars.mg_nether_min, -mcl_vars.mg_nether_max) --- Baby zombie is 20 times less likely than regular zombies -mcl_mobs:spawn_specific( -"mobs_mc:baby_pigman", -"nether", -"ground", -{ -"Nether", -"CrimsonForest", -}, -0, -minetest.LIGHT_MAX+1, -30, -100000, -4, -mcl_vars.mg_nether_min, -mcl_vars.mg_nether_max) - --- Spawning in Nether portals in the Overworld ---mobs:spawn_specific("mobs_mc:pigman", {"mcl_portals:portal"}, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 500, 4, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) - --- spawn eggs -mcl_mobs.register_egg("mobs_mc:pigman", S("Zombie Pigman"), "#ea9393", "#4c7129", 0) -mcl_mobs:non_spawn_specific("mobs_mc:pigman","overworld",0,minetest.LIGHT_MAX+1) diff --git a/mods/ENVIRONMENT/mcl_raids/init.lua b/mods/ENVIRONMENT/mcl_raids/init.lua index 8c996f0ce..8e7c644ae 100644 --- a/mods/ENVIRONMENT/mcl_raids/init.lua +++ b/mods/ENVIRONMENT/mcl_raids/init.lua @@ -240,7 +240,7 @@ end local function start_firework_rocket(pos) local p = get_point_on_circle(pos,math.random(32,64),32) local n = minetest.get_node(p) - local l = minetest.get_natural_light(pos,0.5) + local l = mcl_util.get_natural_light(pos,0.5) if n.name ~= "air" or l <= minetest.LIGHT_MAX then return end local o = minetest.add_entity(p,"mcl_bows:rocket_entity") o:get_luaentity()._harmless = true diff --git a/mods/ENVIRONMENT/mcl_weather/skycolor.lua b/mods/ENVIRONMENT/mcl_weather/skycolor.lua index 711f46caa..aea469760 100644 --- a/mods/ENVIRONMENT/mcl_weather/skycolor.lua +++ b/mods/ENVIRONMENT/mcl_weather/skycolor.lua @@ -1,6 +1,8 @@ local mods_loaded = false local NIGHT_VISION_RATIO = 0.45 +local MINIMUM_LIGHT_LEVEL = 0.2 + local water_color = "#3F76E4" local mg_name = minetest.get_mapgen_setting("mg_name") @@ -45,6 +47,24 @@ function mcl_weather.set_sky_color(player, def) }) end +-- Function to work out light modifier at different times +-- Noon is brightest, midnight is darkest, 0600 and 18000 is in the middle of this +local function get_light_modifier(time) + -- 0.1 = 0.2 + -- 0.4 = 0.8 + -- 0.5 = 1 + -- 0.6 = 0.8 + -- 0.9 = 0.2 + + local light_multiplier = time * 2 + if time > 0.5 then + light_multiplier = 2 * (1 - time) + else + light_multiplier = time / 0.5 + end + return light_multiplier +end + mcl_weather.skycolor = { -- Should be activated before do any effect. active = true, @@ -211,17 +231,14 @@ mcl_weather.skycolor = { player:set_moon({visible = false}) player:set_stars({visible = false}) - local lf = mcl_weather.get_current_light_factor() + local light_factor = mcl_weather.get_current_light_factor() if mcl_weather.skycolor.current_layer_name() == "lightning" then mcl_weather.skycolor.override_day_night_ratio(player, 1) - elseif lf then - local w = minetest.get_timeofday() - local light = (w * (lf*2)) - if light > 1 then - light = 1 - (light - 1) - end - light = (light * lf) + 0.15 - mcl_weather.skycolor.override_day_night_ratio(player, light) + elseif light_factor then + local time = minetest.get_timeofday() + local light_multiplier = get_light_modifier(time) + local new_light = math.max(light_factor * light_multiplier, MINIMUM_LIGHT_LEVEL) + mcl_weather.skycolor.override_day_night_ratio(player, new_light) else mcl_weather.skycolor.override_day_night_ratio(player, nil) end diff --git a/mods/ENVIRONMENT/mcl_zombie_sieges/init.lua b/mods/ENVIRONMENT/mcl_zombie_sieges/init.lua index c2a53d79a..fefb17fa5 100644 --- a/mods/ENVIRONMENT/mcl_zombie_sieges/init.lua +++ b/mods/ENVIRONMENT/mcl_zombie_sieges/init.lua @@ -1,7 +1,7 @@ local zombie_siege_enabled = minetest.settings:get_bool("mcl_raids_zombie_siege", false) local function check_spawn_pos(pos) - return minetest.get_natural_light(pos) < 7 + return mcl_util.get_natural_light(pos) < 7 end local function spawn_zombies(self) diff --git a/mods/HELP/mcl_doc/locale/mcl_doc.fr.tr b/mods/HELP/mcl_doc/locale/mcl_doc.fr.tr index a3fd6c983..529615821 100644 --- a/mods/HELP/mcl_doc/locale/mcl_doc.fr.tr +++ b/mods/HELP/mcl_doc/locale/mcl_doc.fr.tr @@ -2,6 +2,7 @@ Water can flow into this block and cause it to drop as an item.=L'eau peut s'écouler dans ce bloc et provoquer sa chute en tant qu'élément. This block can be turned into dirt with a hoe.=Ce bloc peut être transformé en terre avec une houe. This block can be turned into farmland with a hoe.=Ce bloc peut être transformé en terres agricoles avec une houe. +This block can be turned into grass path with a shovel.=Ce bloc peut être transformé en chemin d'herbe avec une pelle. This block acts as a soil for all saplings.=Ce bloc agit comme un sol pour tous les pousses arbres. This block acts as a soil for some saplings.=Ce bloc agit comme un sol pour certains pousses arbres. Sugar canes will grow on this block.=Les cannes à sucre pousseront sur ce bloc. diff --git a/mods/HELP/mcl_doc/locale/template.txt b/mods/HELP/mcl_doc/locale/template.txt index de652f05e..ec825644c 100644 --- a/mods/HELP/mcl_doc/locale/template.txt +++ b/mods/HELP/mcl_doc/locale/template.txt @@ -2,6 +2,7 @@ Water can flow into this block and cause it to drop as an item.= This block can be turned into dirt with a hoe.= This block can be turned into farmland with a hoe.= +This block can be turned into grass path with a shovel.= This block acts as a soil for all saplings.= This block acts as a soil for some saplings.= Sugar canes will grow on this block.= diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.fr.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.fr.tr index 28f2593fa..6825e4191 100644 --- a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.fr.tr +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.fr.tr @@ -435,7 +435,7 @@ Note that “transparency” here only means that the block is able to carry bri Coordinates=Coordonnées 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.=Le monde est un grand cube. Et pour cette raison, une position dans le monde peut être facilement exprimée avec des coordonnées cartésiennes. Autrement dit, pour chaque position dans le monde, il existe 3 valeurs X, Y et Z. Like this: (5, 45, -12)=Comme ceci : (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.=Cela fait référence à la position où X@=5, Y@=45 et Z@=-12. Les 3 lettres sont appelées "axes" : Y est pour la hauteur. X et Z sont pour la position horizontale. +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.=Cela fait référence à la position où X@=5, Y@=45 et Z@=-12. Les 3 lettres sont appelées “axes” : Y est pour la hauteur. X et Z sont pour la position horizontale. The values for X, Y and Z work like this:=Les valeurs pour X, Y et Z fonctionnent comme ceci: • If you go up, Y increases=• Si vous montez, Y augmente • If you go down, Y decreases=• Si vous descendez, Y diminue diff --git a/mods/HUD/awards/locale/awards.fr.tr b/mods/HUD/awards/locale/awards.fr.tr index 38959ccef..767848a69 100644 --- a/mods/HUD/awards/locale/awards.fr.tr +++ b/mods/HUD/awards/locale/awards.fr.tr @@ -61,4 +61,4 @@ Advancement “@1” does not exist.=Le progrès «@1» n'existe pas. @1 has made the advancement @2=@1 a obtenu le progrès @2 Mine a block: @1=Miner un bloc : @1 Mine blocks: @1×@2=Miner des blocs : @1×@2 -Awards are disabled, enable them first by using /awards enable!=Les récompenses sont désactivés, activez les d'abord en utilisant /awards enable ! +Awards are disabled, enable them first by using /awards enable!=Les récompenses sont désactivées, activez les d'abord en utilisant /awards enable ! diff --git a/mods/HUD/hudbars/locale/hudbars.fr.tr b/mods/HUD/hudbars/locale/hudbars.fr.tr index b31b7b0c1..586caa718 100644 --- a/mods/HUD/hudbars/locale/hudbars.fr.tr +++ b/mods/HUD/hudbars/locale/hudbars.fr.tr @@ -1,6 +1,6 @@ # textdomain: hudbars Health=Santé -Breath=Breath +Breath=Respiration # Default format string for progress bar-style HUD bars, e.g. “Health 5/20” -@1: @2/@3=@1: @2/@3 +@1: @2/@3=@1 : @2/@3 diff --git a/mods/HUD/mcl_achievements/init.lua b/mods/HUD/mcl_achievements/init.lua index 518a2cfbd..016536303 100644 --- a/mods/HUD/mcl_achievements/init.lua +++ b/mods/HUD/mcl_achievements/init.lua @@ -198,7 +198,7 @@ awards.register_achievement("mcl:skysTheLimit", { -- Smelting achivements: These are awarded when picking up an item from a furnace -- output. They are given in mcl_furnaces. awards.register_achievement("mcl:acquireIron", { - title = S("Aquire Hardware"), + title = S("Acquire Hardware"), 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", type = "Advancement", diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr index 885bf1d7e..1c6f668e5 100644 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr @@ -1,5 +1,5 @@ # textdomain:mcl_achievements -Aquire Hardware=Schmied +Acquire Hardware=Schmied Bake Bread=Brot backen Benchmarking=Tischler Cow Tipper=Kuhschubser diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr index 2044e8261..6f00d76b7 100644 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr @@ -1,5 +1,5 @@ # textdomain:mcl_achievements -Aquire Hardware=Obteniendo un lingote +Acquire Hardware=Obteniendo un lingote Bake Bread=Horneando pan Benchmarking=Crea tu mesa de trabajo Cow Tipper=Consiguiendo cuero @@ -47,3 +47,68 @@ Use a crafting table to craft a wooden hoe from wooden planks and sticks.=Usa un Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.=Usa una mesa de trabajo para hacer un pico de madera con tablas de madera procesada y palos de madera. Use obsidian and a fire starter to construct a Nether portal.=Usa obsidiana y un iniciador de fuego para construir un portal abisal. Use wheat to craft a bread.=Usa trigo para elaborar pan. +Who is Cutting Onions?=¿Quién esta cortando cebollas? +Pick up a crying obsidian from the floor.=Recoge una obsidiana llorosa del suelo +Hidden in the Depths=Oculto en las profundidades +Pick up an Ancient Debris from the floor.=Recoge un Escombro Ancestral del suelo +The Nether=El Nether +Bring summer clothes.@nHint: Enter the Nether.=Tráete ropa de verano.@nSugerencia: Entra al Nether +Isn't It Iron Pick=¿No es hierrónico? +Craft a iron pickaxe using sticks and iron.=Crea un pico de hierro usando palos y hierro. +Postmortal=Post mortem +Use a Totem of Undying to cheat death.=Usa un tótem de inmortalidad para engañar a la muerte +Sweet Dreams=Dulces sueños +Sleep in a bed to change your respawn point.=Duerme en una cama para cambiar tu punto de reaparición. +Not Quite "Nine" Lives=No "siete" vidas exactamente +Charge a Respawn Anchor to the maximum.=Carga un nexo de reaparición al máximo. +What A Deal!=¡Qué buen trato! +Successfully trade with a Villager.=Comercia con un aldeano. +Withering Heights=Dr. Witherstein +Summon the wither from the dead.=Invoca al wither desde los muertos. +The Cutest Predator=El depredador más lindo +Catch an Axolotl with a bucket!=Atrapa a un ajolote en un cubo +Fishy Business=Un asuno escamoso +Catch a fish.@nHint: Catch a fish, salmon, clownfish, or pufferfish.=Atrapa un pez.@nSugerencia: Atrapa un pez, salmón, pez payaso, o pez globo. +Country Lode, Take Me Home=Magnetita llévame a casita +Use a compass on a Lodestone.=Usa una brújula sobre una magnetita +Serious Dedication=Dedicación seria +Use a Netherite Ingot to upgrade a hoe, and then completely reevaluate your life choices.=Usa un lingote de netherita para mejorar una azada, y luego revalúa lo que estás haciendo con tu vida. +Local Brewery=Destilería local +Brew a Potion.@nHint: Take a potion or glass bottle out of the brewing stand.=Prepara una poción.@nSugerencia: Saca una poción o botella de vidrio de la destiladora +Enchanter=Aprendiz de mago +Enchant an item using an Enchantment Table.=Encanta un objeto usando la mesa de encantamientos +Bring Home the Beacon=Hágase la luz +Use a beacon.=Usa un faro. +Beaconator=Faroneitor +Use a fully powered beacon.=Utiliza un faro a máxima potencia. +The Next Generation=La nueva generación +Hold the Dragon Egg.@nHint: Pick up the egg from the ground and have it in your inventory.=Consigue el huevo de dragón.@nSugerencia: Recoge el huevo del suelo, y colócalo en tu inventario. +The End... Again...=El fin... de nuevo... +Respawn the Ender Dragon.=Vuelve a invocar al Enderdragón. +Sky's the Limit=El cielo es el límite +Find the elytra and prepare to fly above and beyond!=¿Encuentra los élitros y prepárate para volar al infinito y más allá! +Free the End=Libera el End +Kill the ender dragon. Good Luck!=Mata al Enderdragón. Buena suerte! +Bee Our Guest=Abelante, esta es tu casa +Use a campfire to collect a bottle of honey from a beehive without aggrivating the bees inside.=Usa una fogata y una botella para obtener miel de una colmena sin enojar a las abejas. +Total Beelocation=Abejémonos de aquí +Move a bee nest, with 3 bees inside, using a silk touch enchanted tool.=Mueve una colmena que tenga 3 abejas usando una herramienta con toque de seda. +Wax On=Encerando ando +Apply honeycomb to a copper block to protect it from the elements.=Encera un bloque de cobre con un panal de abejas para protegerlo de los elementos. +Wax Off=Pulir cera +Scrape wax off of a copper block.=Quita la cera de un bloque de cobre +The End?=¿El End? +Or the beginning?@nHint: Enter an end portal.=¿O el principio?@nSugerencia: Entra al portal del End +Stone Age=La edad de piedra +Mine a stone with new pickaxe.=Mina piedra con tu nuevo pico. +Ice Bucket Challenge=Mente fría +Obtain an obsidian block.=Consigue un bloque de obsidiana. +Hot Stuff=¡La cosa está que arde! +Put lava in a bucket.=Pon lava en un cubo. +Hero of the Village=Héroe de la aldea +Successfully defend a village from a raid=Defiende una aldea de una invasión +Voluntary Exile=Exilio voluntario +Kill a raid captain. Maybe consider staying away from the local villages for the time being...=Mata al capitán de una invasión. +Sería mejor alejarte de las aldeas por un tiempo... +Tactical Fishing=Pesca táctica +Catch a fish... without a fishing rod!=Atrapa a un pez... ¡sin una caña de pescar! diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr index d9ad699d4..95800d5e9 100644 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr @@ -1,5 +1,5 @@ # textdomain:mcl_achievements -Aquire Hardware=Acquérir du matériel +Acquire Hardware=Acquérir du matériel Bake Bread=Faire du pain Benchmarking=Fabriquer Cow Tipper=Chevaucher une vache @@ -54,9 +54,9 @@ Pick up an Ancient Debris from the floor.=Ramassez un Ancien Débris par terre. The Nether=Le Nether Bring summer clothes.@nHint: Enter the Nether.=Apportez des vêtements d'été.@nAstuce : Entrez dans le Nether Isn't It Iron Pick=Bonne Pioche ! -Craft a iron pickaxe using sticks and iron.=Fabriquez une pioche de fer avec des batons et du fer. +Craft a iron pickaxe using sticks and iron.=Fabriquez une pioche de fer avec des bâtons et du fer. Postmortal=Aux frontières de la mort -Use a Totem of Undying to cheat death.=Utilisez un Totem d'imortalité pour tromper la mort. +Use a Totem of Undying to cheat death.=Utilisez un Totem d’immortalité pour tromper la mort. Sweet Dreams=Bonne nuit les petits Sleep in a bed to change your respawn point.=Dormez dans un lit pour changer votre point de réapparition. Not Quite "Nine" Lives=Presque "neuf" vies @@ -65,6 +65,8 @@ What A Deal!=Adjugé, Vendu ! Successfully trade with a Villager.=Commercez avec succès avec un villageois. Withering Heights=Les Witherables Summon the wither from the dead.=Invoquez le Wither d'entre les morts. +The Cutest Predator=Le plus mignon des prédateurs +Catch an Axolotl with a bucket!=Attrapez un Axolotl avec un seau ! Fishy Business=Merci pour le poisson Catch a fish.@nHint: Catch a fish, salmon, clownfish, or pufferfish.=Attrapez un poisson.@nAstuce : attrapez un poisson, saumon, poisson-clown, ou poisson-globe. Country Lode, Take Me Home=Petit Poucet @@ -79,3 +81,33 @@ Bring Home the Beacon=Fais ta balise Use a beacon.=Utilisez une balise. Beaconator=Phare allumé Use a fully powered beacon.=Utilisez une balise à pleine puissance. +The Next Generation=La nouvelle génération +Hold the Dragon Egg.@nHint: Pick up the egg from the ground and have it in your inventory.=Tenez l'oeuf de dragon.@nAstuce: Ramassez l’œuf sur le sol pour l'avoir dans votre inventaire. +The End... Again...=Un air de déjà vu... +Respawn the Ender Dragon.=Faites réapparaître l'Ender Dragon. +Sky's the Limit=Vers l'infini et au-delà +Find the elytra and prepare to fly above and beyond!=Trouvez des élytres et préparez vous à vous envoler ! +Free the End=Libérez l'End +Kill the ender dragon. Good Luck!=Tuez l'Ender Dragon. Bonne chance ! +Bee Our Guest=J'irai butinez chez vous +Use a campfire to collect a bottle of honey from a beehive without aggrivating the bees inside.=Utilisez un feu de camp pour remplir une bouteille de miel sans provoquez les abeilles. +Total Beelocation=Dé-miel-nagement +Move a bee nest, with 3 bees inside, using a silk touch enchanted tool.=Déplacez une ruche, avec 3 abeilles à l'intérieur en utilisant un outil enchanté avec toucher de soie. +Wax On=Lustrer +Apply honeycomb to a copper block to protect it from the elements.=Étalez de la cire sur un bloc de cuivre pour le protéger des éléments. +Wax Off=Frotter +Scrape wax off of a copper block.=Retirer la cire d'un bloc de cuivre. +The End?=Fin ? +Or the beginning?@nHint: Enter an end portal.=Ou le commencement ?@nAstuce : Entrer dans un portail de l'End. +Stone Age=L'âge de pierre +Mine a stone with new pickaxe.=Minez de la roche avec votre pioche. +Ice Bucket Challenge=Ice Bucket Challenge +Obtain an obsidian block.=Obtenez un bloc d'obsidienne. +Hot Stuff=Chaud devant ! +Put lava in a bucket.=Remplir un seau de lave. +Hero of the Village=Héros du village +Successfully defend a village from a raid=Protégez le village d'un raid +Voluntary Exile=Exil volontaire +Kill a raid captain. Maybe consider staying away from the local villages for the time being...=Tuez un capitaine de pillards. Mieux vaut rester loin des villages pour l'instant... +Tactical Fishing=Pêche tactique +Catch a fish... without a fishing rod!=Attrapez un poisson... sans canne à pêche ! diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.ja.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.ja.tr index 2e67d019e..bd86186e7 100644 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.ja.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.ja.tr @@ -1,5 +1,5 @@ # textdomain:mcl_achievements -Aquire Hardware=金属を入手 +Acquire Hardware=金属を入手 Bake Bread=パンを焼く Benchmarking=土台作り Cow Tipper=牛転がし diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.pl.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.pl.tr index 78ab53f82..ccb21a06f 100644 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.pl.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.pl.tr @@ -1,5 +1,5 @@ # textdomain:mcl_achievements -Aquire Hardware=Zdobądź narzędzie +Acquire Hardware=Zdobądź narzędzie Bake Bread=Upiecz chleb Benchmarking=Rzemieślnictwo Cow Tipper=Raz krowie śmierć diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.ru.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.ru.tr index 0db2ae99d..9bc23f6be 100644 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.ru.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.ru.tr @@ -1,5 +1,5 @@ # textdomain:mcl_achievements -Aquire Hardware=Куй Железо +Acquire Hardware=Куй Железо Bake Bread=Хлеб всему голова Benchmarking=Верстак Cow Tipper=Кожа да кости diff --git a/mods/HUD/mcl_achievements/locale/template.txt b/mods/HUD/mcl_achievements/locale/template.txt index 218288ed5..d865b1668 100644 --- a/mods/HUD/mcl_achievements/locale/template.txt +++ b/mods/HUD/mcl_achievements/locale/template.txt @@ -1,5 +1,5 @@ # textdomain:mcl_achievements -Aquire Hardware= +Acquire Hardware= Bake Bread= Benchmarking= Cow Tipper= @@ -66,7 +66,7 @@ Successfully trade with a Villager.= Withering Heights= Summon the wither from the dead.= The Cutest Predator= -Catch an Axolotl with a bucket! +Catch an Axolotl with a bucket!= Fishy Business= Catch a fish.@nHint: Catch a fish, salmon, clownfish, or pufferfish.= Country Lode, Take Me Home= @@ -85,7 +85,7 @@ The Next Generation= Hold the Dragon Egg.@nHint: Pick up the egg from the ground and have it in your inventory.= The End... Again...= Respawn the Ender Dragon.= -Sky's The Limit= +Sky's the Limit= Find the elytra and prepare to fly above and beyond!= Free the End= Kill the ender dragon. Good Luck!= @@ -97,3 +97,17 @@ Wax On= Apply honeycomb to a copper block to protect it from the elements.= Wax Off= Scrape wax off of a copper block.= +The End?= +Or the beginning?@nHint: Enter an end portal.= +Stone Age= +Mine a stone with new pickaxe.= +Ice Bucket Challenge= +Obtain an obsidian block.= +Hot Stuff= +Put lava in a bucket.= +Hero of the Village= +Successfully defend a village from a raid= +Voluntary Exile= +Kill a raid captain. Maybe consider staying away from the local villages for the time being...= +Tactical Fishing= +Catch a fish... without a fishing rod!= diff --git a/mods/HUD/mcl_credits/people.lua b/mods/HUD/mcl_credits/people.lua index d9ee02742..660cde11e 100644 --- a/mods/HUD/mcl_credits/people.lua +++ b/mods/HUD/mcl_credits/people.lua @@ -37,7 +37,8 @@ return { "MrRar", "talamh", "Faerraven / Michieal", - "FossFanatic", + "FossFanatic ", + "SmokeyDope", }}, {S("Contributors"), 0x52FF00, { "Laurent Rocher", @@ -82,15 +83,12 @@ return { "aldum", "Dieter44", "Pepebotella", - "MrRar", "Lazerbeak12345", "mrminer", "Thunder1035", "opfromthestart", "snowyu", "FaceDeer", - "Faerraven / Michieal", - "FossFanatic", "Herbert West", "GuyLiner", "3raven", @@ -100,6 +98,10 @@ return { "Gregor Parzefall", "Wbjitscool", "b3nderman", + "CyberMango", + "gldrk", + "atomdmac", + "emptyshore", }}, {S("MineClone5"), 0xA60014, { "kay27", @@ -173,6 +175,7 @@ return { "cora", "Faerraven / Michieal", "Nicu", + "Exhale", }}, {S("Translations"), 0x00FF60, { "Wuzzy", @@ -187,6 +190,8 @@ return { "snowyu", "3raven", "SakuraRiu", + "anarquimico", + "syl", }}, {S("Funders"), 0xF7FF00, { "40W", @@ -199,6 +204,9 @@ return { "wsor for working tirelessly in the shadows for the good of all of us, particularly helping with solving contentDB and copyright issues.", "The workaholics who spent way too much time writing for the Minecraft Wiki. It's an invaluable resource for creating this game", "Notch and Jeb for being the major forces behind Minecraft", - "Dark Reaven Music (https://soundcloud.com/dark-reaven-music) for the main menu theme (Calmed Cube), which is licensed under https://creativecommons.org/licenses/by-sa/3.0/", + "Dark Reaven Music (https://soundcloud.com/dark-reaven-music) for the main menu theme (Calmed Cube) and Traitor (horizonchris96), which is licensed under https://creativecommons.org/licenses/by-sa/3.0/", + "Jester for helping to finely tune MineClone2 (https://www.youtube.com/@Jester-8-bit). Songs: Hailing Forest, Gift, 0dd BL0ck, Flock of One (License CC BY-SA 4.0)", + "Exhale & Tim Unwin for some wonderful MineClone2 tracks (https://www.youtube.com/channel/UClFo_JDWoG4NGrPQY0JPD_g). Songs: Valley of Ghosts, Lonely Blossom, Farmer (License CC BY-SA 4.0)", + "Diminixed for 3 fantastic tracks and remastering and leveling volumes. Songs: Afternoon Lullaby (pianowtune02), Spooled (ambientwip02), Never Grow Up (License CC BY-SA 4.0)", }}, } diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.es.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.es.tr index bbdbb5a9e..8c56ebe9e 100644 --- a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.es.tr +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.es.tr @@ -56,5 +56,5 @@ A ghast scared @1 to death.=Se ha asustado @1 hasta morir. @1 was killed by a zombie villager.=@1 fue asesinado por un aldeano zombie. @1 was killed by a husk.=@1 fue asesinado por un husk. @1 was killed by a baby husk.=@1 fue asesinado por un bebé husk. -@1 was killed by a zombie pigman.=@1 fue asesinado por un cerdo zombie. -@1 was killed by a baby zombie pigman.=@1 fue asesinado por un bebé cerdo zombie. \ No newline at end of file +@1 was killed by a zombie piglin.=@1 fue asesinado por un cerdo zombie. +@1 was killed by a baby zombie piglin.=@1 fue asesinado por un bebé cerdo zombie. \ No newline at end of file diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.ru.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.ru.tr index 295f19986..816546e5e 100644 --- a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.ru.tr +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.ru.tr @@ -57,5 +57,5 @@ A ghast scared @1 to death.=Гаст напугал @1 до смерти. @1 was killed by a zombie villager.=@1 был(а) убит(а) зомби-жителем. @1 was killed by a husk.=@1 был(а) убит(а) кадавром. @1 was killed by a baby husk.=@1 был(а) убит(а) машылом-кадавром. -@1 was killed by a zombie pigman.=@1 был(а) убит(а) зомби-свиночеловеком. -@1 was killed by a baby zombie pigman.=@1 был(а) убит(а) малышом-зомби-свиночеловеком. +@1 was killed by a zombie piglin.=@1 был(а) убит(а) зомби-свиночеловеком. +@1 was killed by a baby zombie piglin.=@1 был(а) убит(а) малышом-зомби-свиночеловеком. diff --git a/mods/HUD/mcl_experience/bottle.lua b/mods/HUD/mcl_experience/bottle.lua index 17a70054d..62a3fb9ca 100644 --- a/mods/HUD/mcl_experience/bottle.lua +++ b/mods/HUD/mcl_experience/bottle.lua @@ -50,7 +50,7 @@ local function throw_xp_bottle(pos, dir, velocity) end minetest.register_craftitem("mcl_experience:bottle", { - description = "Bottle o' Enchanting", + description = S("Bottle o' Enchanting"), inventory_image = "mcl_experience_bottle.png", wield_image = "mcl_experience_bottle.png", stack_max = 64, diff --git a/mods/HUD/mcl_experience/locale/mlc_experience.fr.tr b/mods/HUD/mcl_experience/locale/mlc_experience.fr.tr index 0644e2596..faadca410 100644 --- a/mods/HUD/mcl_experience/locale/mlc_experience.fr.tr +++ b/mods/HUD/mcl_experience/locale/mlc_experience.fr.tr @@ -5,3 +5,4 @@ Error: Too many parameters!=Erreur: Trop de paramètres! Error: Incorrect value of XP=Erreur: Valeur incorrecte de XP Error: Player not found=Erreur: Joueur introuvable Added @1 XP to @2, total: @3, experience level: @4=Ajout de @1 XP à @2, total: @3, niveau d'expérience: @4 +Bottle o' Enchanting=Fiole d'expérience diff --git a/mods/HUD/mcl_experience/locale/template.txt b/mods/HUD/mcl_experience/locale/template.txt index a355cbbac..b2a4c04d2 100644 --- a/mods/HUD/mcl_experience/locale/template.txt +++ b/mods/HUD/mcl_experience/locale/template.txt @@ -5,3 +5,4 @@ Error: Too many parameters!= Error: Incorrect value of XP= Error: Player not found= Added @1 XP to @2, total: @3, experience level: @4= +Bottle o' Enchanting= diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.fr.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.fr.tr index afb7dc268..986636f03 100644 --- a/mods/HUD/mcl_inventory/locale/mcl_inventory.fr.tr +++ b/mods/HUD/mcl_inventory/locale/mcl_inventory.fr.tr @@ -19,3 +19,4 @@ Survival Inventory=Inventaire de survie Crafting=Artisanat Inventory=Inventaire @1/@2=@1/@2 +Switch stack size=Changer la quantité maximale par pile diff --git a/mods/HUD/mcl_inventory/locale/template.txt b/mods/HUD/mcl_inventory/locale/template.txt index fcbe68580..9cc687e3f 100644 --- a/mods/HUD/mcl_inventory/locale/template.txt +++ b/mods/HUD/mcl_inventory/locale/template.txt @@ -19,3 +19,4 @@ Survival Inventory= Crafting= Inventory= @1/@2= +Switch stack size= diff --git a/mods/HUD/mcl_ver_info/locale/mcl_ver_info.fr.tr b/mods/HUD/mcl_ver_info/locale/mcl_ver_info.fr.tr new file mode 100644 index 000000000..3e6c9af6d --- /dev/null +++ b/mods/HUD/mcl_ver_info/locale/mcl_ver_info.fr.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_ver_info +Sorry, but your version of Minetest doesn't support the latest API. Please upgrade your minetest.=Désolé, mais votre version de Minetest ne supporte la dernière API. Veuillez mettre à jour minetest. diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.fr.tr b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.fr.tr index 622d0a70e..04ce1ca63 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.fr.tr +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.fr.tr @@ -1,5 +1,5 @@ # textdomain: mcl_dispensers -Dispenser=Dispenser +Dispenser=Distributeur A dispenser is a block which acts as a redstone component which, when powered with redstone power, dispenses an item. It has a container with 9 inventory slots.=Un distributeur est un bloc qui agit comme un composant redstone qui, lorsqu'il est alimenté avec une puissance redstone, distribue un article. Il a un conteneur avec 9 emplacements d'inventaire. 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.=Placez le distributeur dans l'une des 6 directions possibles. Le "trou" est l'endroit où les articles sortiront du distributeur. Utilisez le distributeur pour accéder à son inventaire. Insérez les articles que vous souhaitez distribuer. Fournissez au distributeur de l'énergie de redstone une fois pour distribuer un objet aléatoire. The dispenser will do different things, depending on the dispensed item:=Le distributeur fera différentes choses, selon l'article distribué: diff --git a/mods/ITEMS/REDSTONE/mesecons/actionqueue.lua b/mods/ITEMS/REDSTONE/mesecons/actionqueue.lua index 489a81b4a..34202aecd 100644 --- a/mods/ITEMS/REDSTONE/mesecons/actionqueue.lua +++ b/mods/ITEMS/REDSTONE/mesecons/actionqueue.lua @@ -89,6 +89,8 @@ minetest.register_globalstep(function (dtime) end) function mesecon.queue:execute(action) + if not action.pos then return end + -- ignore if action queue function name doesn't exist, -- (e.g. in case the action queue savegame was written by an old mesecons version) if mesecon.queue.funcs[action.func] then diff --git a/mods/ITEMS/REDSTONE/mesecons/internal.lua b/mods/ITEMS/REDSTONE/mesecons/internal.lua index dbe3ebe12..06a5d08b9 100644 --- a/mods/ITEMS/REDSTONE/mesecons/internal.lua +++ b/mods/ITEMS/REDSTONE/mesecons/internal.lua @@ -521,6 +521,7 @@ end -- outputnode (receptor or conductor) at position `output` and has an output in direction `rule` function mesecon.rules_link_rule_all(output, rule) local input = vector.add(output, rule) + if not input then return {} end local inputnode = get_node_force(input) local inputrules = mesecon.get_any_inputrules(inputnode) if not inputrules then diff --git a/mods/ITEMS/REDSTONE/mesecons_button/init.lua b/mods/ITEMS/REDSTONE/mesecons_button/init.lua index 449e70135..f7d6c7105 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_button/init.lua @@ -216,6 +216,18 @@ mesecon.register_button( 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."), "mesecons_button_push") +mesecon.register_button( + "polished_blackstone", + S("Polished Blackstone Button"), + "mcl_blackstone_polished.png", + "mcl_blackstone:blackstone_polished", + mcl_sounds.node_sound_stone_defaults(), + {material_stone=1,handy=1,pickaxey=1}, + 1, + false, + S("A polished blackstone button is a redstone component made out of polished blackstone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second."), + "mesecons_button_push") + local woods = { { "wood", "mcl_core:wood", "default_wood.png", S("Oak Button") }, { "acaciawood", "mcl_core:acaciawood", "default_acacia_wood.png", S("Acacia Button") }, diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.fr.tr b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.fr.tr index 5223b97ef..1d844bd36 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.fr.tr +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.fr.tr @@ -2,12 +2,17 @@ Use the button to push it.=Utilisez le bouton pour le pousser. Stone Button=Bouton de pierre 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.=Un bouton en pierre est un composant Redstone en pierre qui peut être poussé pour fournir de la puissance Redstone. Lorsqu'il est poussé, il alimente les composants Redstone adjacents pendant 1 seconde. +Polished Blackstone Button=Bouton de pierre noire +A polished blackstone button is a redstone component made out of polished blackstone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Un bouton en pierre noire est un composant Redstone en pierre noire qui peut être poussé pour fournir de la puissance Redstone. Lorsqu'il est poussé, il alimente les composants Redstone adjacents pendant 1 seconde. Oak Button=Bouton en chêne Acacia Button=Bouton en acacia Birch Button=Bouton en bouleau Dark Oak Button=Bouton en chêne noir Spruce Button=Bouton en sapin Jungle Button=Bouton en acajou +Mangrove Button=Bouton en palétuvier +Crimson Button=Bouton écarlate +Warped Button=Bouton tordu 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.=Un bouton en bois est un composant de redstone en bois qui peut être poussé pour fournir une puissance de redstone. Lorsqu'il est poussé, il alimente les composants Redstone adjacents pendant 1,5 seconde. Les boutons en bois peuvent également être poussés par des flèches. Provides redstone power when pushed=Fournit une puissance de redstone lorsqu'il est poussé Push duration: @1s=Durée de poussée : @1s diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt index 4c352b878..4fb2bc19d 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt @@ -2,12 +2,17 @@ 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.= +Polished Blackstone Button= +A polished blackstone button is a redstone component made out of polished blackstone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.= Oak Button= Acacia Button= Birch Button= Dark Oak Button= Spruce Button= Jungle Button= +Mangrove Button= +Crimson Button= +Warped 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.= Provides redstone power when pushed= Push duration: @1s= diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.fr.tr b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.fr.tr index f8d8e3d75..a3ddcb242 100644 --- a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.fr.tr +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.fr.tr @@ -2,21 +2,21 @@ Note Block=Bloc de notes 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.=Un bloc de notes est un bloc musical qui joue l'une des nombreuses notes de musique et différents instruments lorsqu'il est frappé ou alimenté en redstone. 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:=Utilisez le bloc de notes pour choisir la prochaine note de musique (il y a 25 demi-tons ou 2 octaves). L'instrument joué dépend du matériau du bloc situé sous le bloc de notes: -• Glass: Sticks=• Glass: Sticks -• Wood: Bass guitar=• Bois: Guitare Basse -• Stone: Bass drum=• Pierre: Grosse caisse -• Sand or gravel: Snare drum=• Sable ou gravier: Caisse claire -• Block of Gold: Bell=• Bloc d'OR: Cloche -• Clay: Flute=• Argile: Flûte -• Packed Ice: Chime=• Glace tassée: Carillon -• Wool: Guitar=• Laine: Guitare -• Bone Block: Xylophne=• Bloc osseux: Xylophne -• Block of Iron: Iron xylophne=• Bloc de fer: Xylophone en fer -• Soul Sand: Cow bell=• Soul Sand: Cloche de vache -• Pumpkin: Didgeridoo=• Citrouille: Didgeridoo -• Block of Emerald: Square wave=• Bloc d'émeraude: Onde carrée -• Hay Bale: Banjo=• Hay Bale: Banjo -• Glowstone: Electric piano=• Glowstone: Piano Electrique -• Anything else: Piano=• Autres: Piano +• Glass: Sticks=• Verre : Baguettes +• Wood: Bass guitar=• Bois : Guitare Basse +• Stone: Bass drum=• Pierre : Grosse caisse +• Sand or gravel: Snare drum=• Sable ou gravier : Caisse claire +• Block of Gold: Bell=• Bloc d'OR : Cloche +• Clay: Flute=• Argile : Flûte +• Packed Ice: Chime=• Glace tassée : Carillon +• Wool: Guitar=• Laine : Guitare +• Bone Block: Xylophne=• Bloc osseux : Xylophne +• Block of Iron: Iron xylophne=• Bloc de fer : Xylophone en fer +• Soul Sand: Cow bell=• Soul Sand : Cloche de vache +• Pumpkin: Didgeridoo=• Citrouille : Didgeridoo +• Block of Emerald: Square wave=• Bloc d'émeraude : Onde carrée +• Hay Bale: Banjo=• Hay Bale : Banjo +• Glowstone: Electric piano=• Glowstone : Piano Electrique +• Anything else: Piano=• Autres : Piano The note block will only play a note when it is below air, otherwise, it stays silent.=Le bloc de notes ne jouera une note que lorsqu'il est sous l'air, sinon il reste silencieux. Plays a musical note when powered by redstone power=Joue une note de musique lorsqu'il est alimenté par une puissance redstone diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua b/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua index 97a9a223b..41cc8211a 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua @@ -1,6 +1,6 @@ local S = minetest.get_translator(minetest.get_current_modname()) -local PRESSURE_PLATE_INTERVAL = 0.04 +local PRESSURE_PLATE_INTERVAL = 0.25 local pp_box_off = { type = "fixed", @@ -262,4 +262,17 @@ mesecon.register_pressure_plate( { player = true, mob = true }, 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.")) +mesecon.register_pressure_plate( + "mesecons_pressureplates:pressure_plate_polished_blackstone", + S("Polished Blackstone Pressure Plate"), + {"mcl_blackstone_polished.png"}, + {"mcl_blackstone_polished.png"}, + "mcl_blackstone_polished.png", + nil, + {{"mcl_blackstone:blackstone_polished", "mcl_blackstone:blackstone_polished"}}, + mcl_sounds.node_sound_stone_defaults(), + {pickaxey=1, material_stone=1}, + { player = true, mob = true }, + S("A polished blackstone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.")) + diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.fr.tr b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.fr.tr index 2007ec785..630ebdd48 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.fr.tr +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.fr.tr @@ -6,7 +6,12 @@ Birch Pressure Plate=Plaque de pression en bouleau Dark Oak Pressure Plate=Plaque de pression en chêne noir Spruce Pressure Plate=Plaque de pression en sapin Jungle Pressure Plate=Plaque de pression en acajou +Mangrove Pressure Plate=Plaque de pression en palétuvier +Crimson Pressure Plate=Plaque de pression écarlate +Warped Pressure Plate=Plaque de pression tordue 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.=Une plaque de pression en bois est un composant de redstone qui alimente ses blocs environnants en puissance de redstone tandis que tout objet mobile (y compris les objets lâchés, les joueurs et les mobs) repose dessus. +Polished Blackstone Pressure Plate=Plaque de pression en pierre noire +A polished blackstone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.=Une plaque de pression en pierre noire est un composant de redstone qui alimente ses blocs environnants en puissance de redstone pendant qu'un joueur ou un mob se tient au-dessus. Il n'est déclenché par rien d'autre. Stone Pressure Plate=Plaque de pression en pierre 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.=Une plaque de pression en pierre est un composant de redstone qui alimente ses blocs environnants en puissance de redstone pendant qu'un joueur ou un mob se tient au-dessus. Il n'est déclenché par rien d'autre. Provides redstone power when pushed=Fournit une puissance de redstone lorsqu'il est poussé diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/template.txt index 96eb3f922..061d82410 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/template.txt @@ -6,7 +6,12 @@ Birch Pressure Plate= Dark Oak Pressure Plate= Spruce Pressure Plate= Jungle Pressure Plate= +Mangrove Pressure Plate= +Crimson Pressure Plate= +Warped 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.= +Polished Blackstone Pressure Plate= +A polished blackstone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.= 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.= Provides redstone power when pushed= diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua index 129c28eea..f4e63b78a 100644 --- a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua @@ -1,67 +1,8 @@ local S = minetest.get_translator(minetest.get_current_modname()) -local function path_to_sunlight_exists(position, light_level) - local neighbours = { - { x = 0, y = 0, z =-1 }, - { x = 0, y = 0, z = 1 }, - { x = 0, y =-1, z = 0 }, - { x = 0, y = 1, z = 0 }, - { x =-1, y = 0, z = 0 }, - { x = 1, y = 0, z = 0 }, - } - for i=1, #neighbours do - local offset = neighbours[i] - local position_new = vector.add( - position, - offset - ) - local light_level_new = minetest.get_node_light( - position_new, - nil - ) - if 15 == light_level_new then - -- found the sunlight - return true - elseif light_level_new > light_level then - -- search where light is brighter - if path_to_sunlight_exists( - position_new, - light_level_new - ) then - return true - end - end - end -end - local function sunlight_visible(position) - local light_level - -- Minetest 5.4.0+ can measure the daylight level at a position - if nil ~= minetest.get_natural_light then - light_level = minetest.get_natural_light( - position, - nil - ) - if light_level >= 12 then - return true - end - else -- Minetest 5.3.0 or less can only measure the light level - local time = minetest.get_timeofday() * 24000 - -- only check light level during day - if time > 6000 and time < 18000 then - light_level = minetest.get_node_light( - position, - nil - ) - if light_level >= 12 then - return path_to_sunlight_exists( - position, - 12 - ) - end - end - end - return false + local light_level = mcl_util.get_natural_light(position) + return light_level ~= nil and light_level >= 12 end local boxes = { -8/16, -8/16, -8/16, 8/16, -2/16, 8/16 } diff --git a/mods/ITEMS/mcl_anvils/locale/mcl_anvils.es.tr b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.es.tr index 7212b92ba..218ff89cf 100644 --- a/mods/ITEMS/mcl_anvils/locale/mcl_anvils.es.tr +++ b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.es.tr @@ -13,3 +13,4 @@ Armor counts as a tool. It is possible to repair and rename a tool in a single 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.=El yunque tiene una durabilidad limitada y 3 niveles de daño: sin daños, ligeramente dañado y muy dañado. Cada vez que reparas o cambias el nombre de algo, hay un 12% de posibilidades de que el yunque se dañe. Los yunques también tienen la posibilidad de dañarse cuando caen en más de 1 bloque. Si un yunque muy dañado se daña nuevamente, se destruye. Slightly Damaged Anvil=Yunque dañado Very Damaged Anvil=Yunque muy dañado +Repair and rename items=Reparar y renombrar objetos diff --git a/mods/ITEMS/mcl_armor/locale/mcl_armor.es.tr b/mods/ITEMS/mcl_armor/locale/mcl_armor.es.tr index e770dff0c..572139c72 100644 --- a/mods/ITEMS/mcl_armor/locale/mcl_armor.es.tr +++ b/mods/ITEMS/mcl_armor/locale/mcl_armor.es.tr @@ -1,23 +1,48 @@ # textdomain: mcl_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ü. +This is a piece of equippable armor which reduces the amount of damage you receive.=Esta es una pieza de armadura que se puede equipar, la cual reduce la cantidad de daño que recives. +To equip it, put it on the corresponding armor slot in your inventory menu.=Para equiparla, colocala en la ranura de armadura en el menú de tu inventario. Leather Cap=Sombrero de cuero Iron Helmet=Casco de hierro Golden Helmet=Casco de oro Diamond Helmet=Casco de diamante Chain Helmet=Casco de cota de mallas +Netherite Helmet=Casco de netherita Leather Tunic=Túnica de cuero Iron Chestplate=Peto de hierro Golden Chestplate=Peto de oro Diamond Chestplate=Peto de diamante Chain Chestplate=Peto de cota de mallas +Netherite Chestplate=Peto de netherita Leather Pants=Pantalones de cuero Iron Leggings=Grebas de hierro Golden Leggings=Grebas de oro Diamond Leggings=Grebas de diamante Chain Leggings=Grebas de cota de mallas +Netherite Leggings=Grebas de netherita Leather Boots=Botas de cuero Iron Boots=Botas de hierro Golden Boots=Botas de oro Diamond Boots=Botas de diamante Chain Boots=Botas de cota de mallas +Netherite Boots=Botas de netherita +Elytra=Élitros + +#Translations of enchantements +Increases underwater mining speed.=Aumenta la velocidad de minado bajo el agua. +Blast Protection=Protección contra explosiones +Reduces explosion damage and knockback.=Reduce el daño de explosiones y su empuje. +Curse of Binding=Maldicón de ligamiento +Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.=El objeto no puede ser removido de las ranuras de inventario excepto al morir, al romperse, o en Modo Creativo. +Feather Falling=Caída de plumas +Reduces fall damage.=Reduce el daño por caída. +Fire Protection=Protección contra el fuego +Reduces fire damage.=Reduce el daño causado por fuego. +Shooting consumes no regular arrows.=Disparar no consume flechas normales. +Shoot 3 arrows at the cost of one.=Dispara 3 flechas por el costo de una. +Projectile Protection=Protección contra proyectiles +Reduces projectile damage.=Reduce el daño de proyectiles. +Protection=Protección +Reduces most types of damage by 4% for each level.=Reduce la mayoría de tipos de daño por 4% por cada nivel. +Thorns=Espinas +Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.=Refleja una parte del daño infligido, a costa de reducir la durabilidad con cada activación. +Aqua Affinity=Afinidad acuática diff --git a/mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr b/mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr index 7663e2b40..b3a2c6dbc 100644 --- a/mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr +++ b/mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr @@ -6,25 +6,25 @@ Iron Helmet=Casque de fer Golden Helmet=Casque d'or Diamond Helmet=Casque de diamant Chain Helmet=Casque de mailles -Netherite Helmet=Casque de Netherite +Netherite Helmet=Casque de netherite Leather Tunic=Tunique en cuir Iron Chestplate=Plastron de fer Golden Chestplate=Plastron d'or Diamond Chestplate=Plastron de diamant Chain Chestplate=Cotte de mailles -Netherite Chestplate=Plastron de Netherite +Netherite Chestplate=Plastron de netherite Leather Pants=Pantalon de cuir Iron Leggings=Jambières de fer Golden Leggings=Jambières d'or Diamond Leggings=Jambières de diamant Chain Leggings=Jambières de mailles -Netherite Leggings=Jambières de Netherite +Netherite Leggings=Jambières de netherite Leather Boots=Bottes de cuir Iron Boots=Bottes de fer Golden Boots=Bottes d'or Diamond Boots=Bottes de diamant Chain Boots=Bottes de mailles -Netherite Boots=Bottes de Netherite +Netherite Boots=Bottes de netherite Elytra=Élytres #Translations of enchantements diff --git a/mods/ITEMS/mcl_armor/player.lua b/mods/ITEMS/mcl_armor/player.lua index 99e23efdd..281839379 100644 --- a/mods/ITEMS/mcl_armor/player.lua +++ b/mods/ITEMS/mcl_armor/player.lua @@ -158,8 +158,10 @@ minetest.register_on_player_inventory_action(function(player, action, inventory, end) minetest.register_on_joinplayer(function(player) - mcl_player.player_set_model(player, "mcl_armor_character.b3d") player:get_inventory():set_size("armor", 5) + if not minetest.global_exists("mcl_skins") then + mcl_player.player_set_model(player, "mcl_armor_character.b3d") + end minetest.after(1, function() if player:is_player() then diff --git a/mods/ITEMS/mcl_armor/register.lua b/mods/ITEMS/mcl_armor/register.lua index 89ff5ca9f..c7fa91475 100644 --- a/mods/ITEMS/mcl_armor/register.lua +++ b/mods/ITEMS/mcl_armor/register.lua @@ -219,7 +219,7 @@ minetest.register_tool("mcl_armor:elytra", { _doc_items_longdesc = mcl_armor.longdesc, _doc_items_usagehelp = mcl_armor.usage, inventory_image = "mcl_armor_inv_elytra.png", - groups = {armor = 1, non_combat_armor = 1, armor_torso = 1, non_combat_torso = 1, mcl_armor_uses = 10}, + groups = {armor = 1, non_combat_armor = 1, armor_torso = 1, non_combat_torso = 1, mcl_armor_uses = 10, enchantability = 1, elytra = 1}, sounds = { _mcl_armor_equip = "mcl_armor_equip_leather", _mcl_armor_unequip = "mcl_armor_unequip_leather", diff --git a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.fr.tr b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.fr.tr index 867b3f043..b52038fe7 100644 --- a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.fr.tr +++ b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.fr.tr @@ -2,4 +2,4 @@ Armor Stand=Support d'armure 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.=Un support d'armure est un objet décoratif qui peut afficher différentes pièces d'armure. Tout ce que les joueurs peuvent porter comme armure peut également être placé sur un support d'armure. 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.=Placez simplement un objet d'armure sur le support d'armure. Pour prendre la pièce d'armure du support d'armure, sélectionnez votre main et utilisez la touche "Placer" sur le support d'armure. -Displays pieces of armor=Displays pieces of armor +Displays pieces of armor=Expose des pièces d'armure diff --git a/mods/ITEMS/mcl_bamboo/bamboo_base.lua b/mods/ITEMS/mcl_bamboo/bamboo_base.lua index 66ed9a5ca..b9f67fc64 100644 --- a/mods/ITEMS/mcl_bamboo/bamboo_base.lua +++ b/mods/ITEMS/mcl_bamboo/bamboo_base.lua @@ -25,7 +25,7 @@ end -- basic bamboo nodes. local bamboo_def = { - description = "Bamboo", + description = S("Bamboo"), tiles = {"mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo.png"}, drawtype = "nodebox", paramtype = "light", @@ -266,7 +266,7 @@ end minetest.register_node(BAMBOO_ENDCAP_NAME, bamboo_top) local bamboo_block_def = { - description = "Bamboo Block", + description = S("Bamboo Block"), tiles = {"mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo_block.png"}, groups = {handy = 1, building_block = 1, axey = 1, flammable = 2, material_wood = 1, bamboo_block = 1, fire_encouragement = 5, fire_flammability = 5}, sounds = node_sound, diff --git a/mods/ITEMS/mcl_bamboo/bamboo_items.lua b/mods/ITEMS/mcl_bamboo/bamboo_items.lua index 70a7bf35b..63f07f896 100644 --- a/mods/ITEMS/mcl_bamboo/bamboo_items.lua +++ b/mods/ITEMS/mcl_bamboo/bamboo_items.lua @@ -62,9 +62,11 @@ if minetest.get_modpath("mcl_doors") then local name = "mcl_bamboo:bamboo_door" local def = { - description = S("Bamboo Door."), + description = S("Bamboo Door"), inventory_image = "mcl_bamboo_door_wield.png", wield_image = "mcl_bamboo_door_wield.png", + _doc_items_longdesc = S("Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal."), + _doc_items_usagehelp = S("To open or close a wooden door, rightclick it or supply its lower half with a redstone signal."), groups = { handy = 1, axey = 1, material_wood = 1, flammable = -1 }, _mcl_hardness = 3, _mcl_blast_resistance = 3, @@ -77,15 +79,13 @@ if minetest.get_modpath("mcl_doors") then name = "mcl_bamboo:bamboo_trapdoor" local trap_def = { - description = S("Bamboo Trapdoor."), - inventory_image = "mcl_bamboo_door_complete.png", + description = S("Bamboo Trapdoor"), groups = {}, tile_front = "mcl_bamboo_trapdoor_side.png", tile_side = "mcl_bamboo_trapdoor_side.png", _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."), wield_image = "mcl_bamboo_trapdoor_side.png", - inventory_image = "mcl_bamboo_trapdoor_side.png", groups = { handy = 1, axey = 1, mesecon_effector_on = 1, material_wood = 1, flammable = -1 }, _mcl_hardness = 3, _mcl_blast_resistance = 3, diff --git a/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.es.tr b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.es.tr new file mode 100644 index 000000000..e21beb760 --- /dev/null +++ b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.es.tr @@ -0,0 +1,40 @@ +# textdomain: mcl_bamboo + +### bamboo_base.lua ### + +Bamboo Mosaic Plank=Madera de bambú de mosaico +Bamboo Plank=Madera de bambú +Stripped Bamboo Block=Bloque de bambú sin corteza + +### bamboo_items.lua ### + +A bamboo 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.=Un botón de bambú es un componente de redstone hecho de piedra que se puede presionar para proporcionar energía de redstone. Cuando se empuja, alimenta los componentes adyacentes de redstone durante 1 segundo. + +A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=Una placa de presión de madera es un componente de redstone que proporciona energía de redstone a sus bloques adyacentes mientras cualquier objeto movible (incluyendo objetos en el suelo, jugadores y mobs) descanse encima suya. + +Bamboo=Bambú +Bamboo Button=Botón de bambú +Bamboo Door.=Puerta de bambú +Bamboo Fence=Valla de bambú +Bamboo Fence Gate=Puerta de valla de bambú +Bamboo Mosaic Slab=Losa de mosaico de bambú +Bamboo Mosaic Stair=Escaleras de mosaico de bambú +Bamboo Plank Slab=Losa de madera de bambú +Bamboo Plank Stair=Escalera de madera de bambú +Bamboo Pressure Plate=Placa de presión de bambú +Bamboo Slab=Losa de bambú +Bamboo Stair=Escalera de bambú +Bamboo Trapdoor.=Trampilla de bambú +Double Bamboo Mosaic Slab=Losa doble de mosaico de bambú +Double Bamboo Plank Slab=Losa doble de madera de bambú +Double Bamboo Slab=Losa doble de bambú +Double Stripped Bamboo Slab=Losa doble de bambú sin corteza +Scaffolding=Andamio +Scaffolding (horizontal)=Andamio (horizontal) +Scaffolding block used to climb up or out across areas.=El bloque de andamio sirve para subir o bajar entre zonas. +Stripped Bamboo Slab=Losa de bambú sin corteza +Stripped Bamboo Stair=Escalera de bambú sin corteza + +To open or close the trapdoor, rightclick it or send a redstone signal to it.=Para abir o cerar una trampilla, haz click derecho o manda una señal de redstone hacia ella. + +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.=Las trampillas de madera son barreras horizontales que pueden ser abiertas y cerradas con la mano o por una señal de redstone. diff --git a/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr new file mode 100644 index 000000000..953d08811 --- /dev/null +++ b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr @@ -0,0 +1,45 @@ +# textdomain: mcl_bamboo + +### bamboo_base.lua ### + +Bamboo=Bambou +Bamboo Mosaic Plank=Planche mosaïque de bambou +Bamboo Plank=Planche de bambou +Stripped Bamboo Block=Bloc de bambou écorcé +Bamboo Block=Bloc de bambou + +### bamboo_items.lua ### + +A bamboo 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.=Un bouton en bambou est un composant redstone fait de bamboo qui peut être poussé pour fournir un signal redstone. Lorsque poussé, il alimente les composants redstone adjacents pendant 1 seconde. + +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.=Une plaque de pression en bois est un composant redstone qui envoie un signal aux blocs alentours lorsque n'importe quel objet mobile (objet jeté, joueurs et mobs) sont dessus. + +Bamboo=Bambou +Bamboo Button=Bouton en bambou +Bamboo Door=Porte de bambou +Bamboo Fence=Barrière de bambou +Bamboo Fence Gate=Portillon de bambou +Bamboo Mosaic Slab=Dalle mosaïque de bambou +Bamboo Mosaic Stair=Escalier mosaïque de bambou +Bamboo Plank Slab=Dalle de planches de bambou +Bamboo Plank Stair=Escalier de planches de bambou +Bamboo Pressure Plate=Plaque de pression de bambou +Bamboo Slab=Dalle de bambou +Bamboo Stair=Escalier de bambou +Bamboo Trapdoor=Trappe de bambou +Double Bamboo Mosaic Slab=Double dalle mosaïque de bambou +Double Bamboo Plank Slab=Double dalle de planches de bambou +Double Bamboo Slab=Double dalle de bambou +Double Stripped Bamboo Slab=Double dalle de bambou écorcée +Scaffolding=Échafaudage +Scaffolding (horizontal)=Échafaudage (horizontal) +Scaffolding block used to climb up or out across areas.=Les blocs d'échafaudage servent à escalader ou à sortir d'une zone. +Stripped Bamboo Slab=Dalle de bambou écorcée +Stripped Bamboo Stair=Escalier de bambou écorcée + +To open or close the trapdoor, rightclick it or send a redstone signal to it.=Pour ouvrir ou fermer la trappe, cliquer droit ou lui envoyer un signal redstone. + +Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Les trappes de bois sont des barrières horizontales qui peuvent être ouvertes et fermées à la main ou par un signal redstone. Lorsqu'elles sont ouvertes, elles peuvent êtres escaladées comme une échelle. + +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Les portes en bois sont des barrières hautes à 2 blocs qui peuvent être ouvertes ou fermées à la main et par un signal redstone. +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Pour ouvrir ou fermer une porte en bois, faites un clic droit dessus ou fournissez à sa moitié inférieure un signal redstone. diff --git a/mods/ITEMS/mcl_bamboo/locale/template.txt b/mods/ITEMS/mcl_bamboo/locale/template.txt index e099419d7..2d5c69383 100644 --- a/mods/ITEMS/mcl_bamboo/locale/template.txt +++ b/mods/ITEMS/mcl_bamboo/locale/template.txt @@ -2,9 +2,11 @@ ### bamboo_base.lua ### +Bamboo= Bamboo Mosaic Plank= Bamboo Plank= Stripped Bamboo Block= +Bamboo Block= ### bamboo_items.lua ### @@ -14,7 +16,7 @@ A wooden pressure plate is a redstone component which supplies its surrounding b Bamboo= Bamboo Button= -Bamboo Door.= +Bamboo Door= Bamboo Fence= Bamboo Fence Gate= Bamboo Mosaic Slab= @@ -24,7 +26,7 @@ Bamboo Plank Stair= Bamboo Pressure Plate= Bamboo Slab= Bamboo Stair= -Bamboo Trapdoor.= +Bamboo Trapdoor= Double Bamboo Mosaic Slab= Double Bamboo Plank Slab= Double Bamboo Slab= @@ -38,3 +40,6 @@ Stripped Bamboo Stair= To open or close the trapdoor, rightclick it or send a redstone signal to it.= 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.= + +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.= diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index cc0e02e66..18b50928a 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -113,14 +113,17 @@ local function on_dig_banner(pos, node, digger) minetest.record_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_banners:banner_item_white"}, digger) - end + + local inv = minetest.get_meta(pos):get_inventory() + local item = inv:get_stack("banner", 1) + local item_str = item:is_empty() and "mcl_banners:banner_item_white" + or item:to_string() + + minetest.handle_node_drops(pos, { item_str }, digger) + + item:set_count(0) + inv:set_stack("banner", 1, item) + -- Remove node minetest.remove_node(pos) end @@ -143,6 +146,13 @@ local function on_destruct_banner(pos, hanging) v:remove() end end + + -- Drop item only if it was not handled in on_dig_banner + local inv = minetest.get_meta(pos):get_inventory() + local item = inv:get_stack("banner", 1) + if not item:is_empty() then + minetest.handle_node_drops(pos, {item:to_string()}) + end end local function on_destruct_standing_banner(pos) diff --git a/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr b/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr index 48b25f708..78095a4a7 100644 --- a/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr +++ b/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr @@ -31,6 +31,7 @@ Lime Banner=Bannière vert Clair Lime=Vert clair Light Blue Banner=Bannière bleue clair Light Blue=Bleu clair +Banner=Bannière 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.=Les bannières sont de grands blocs décoratifs colorés. Ils peuvent être placés au sol et aux murs. Les bannières peuvent arborées une variété de motifs en utilisant beaucoup de colorant dans l'artisanat. 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.=Utilisez l'artisanat pour dessiner un motif sur le dessus de la bannière. Les bannières blasonnées peuvent être à nouveau blasonnées pour combiner différents motifs. Vous pouvez dessiner jusqu'à 12 couches sur une bannière de cette façon. Si la bannière comprend un dégradé, seulement 3 couches sont possibles. 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.=Vous pouvez copier le motif d'une bannière en plaçant deux bannières de la même couleur dans la grille de fabrication: l'une doit être décorée, l'autre doit être propre. Enfin, vous pouvez utiliser une bannière sur un chaudron avec de l'eau pour laver sa couche la plus haute. diff --git a/mods/ITEMS/mcl_banners/locale/template.txt b/mods/ITEMS/mcl_banners/locale/template.txt index cb8ec0b0c..357ff6b08 100644 --- a/mods/ITEMS/mcl_banners/locale/template.txt +++ b/mods/ITEMS/mcl_banners/locale/template.txt @@ -31,6 +31,7 @@ Lime Banner= Lime= Light Blue 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.= diff --git a/mods/ITEMS/mcl_barrels/init.lua b/mods/ITEMS/mcl_barrels/init.lua index 09b16eee3..714a80f09 100644 --- a/mods/ITEMS/mcl_barrels/init.lua +++ b/mods/ITEMS/mcl_barrels/init.lua @@ -63,6 +63,7 @@ local function barrel_open(pos, node, clicker) minetest.swap_node(pos, { name = "mcl_barrels:barrel_open", param2 = node.param2 }) open_barrels[playername] = pos + minetest.sound_play({name="mcl_barrels_default_barrel_open", pos=pos, gain=0.5, max_hear_distance=16}, true) end local function close_forms(pos) @@ -80,6 +81,7 @@ local function update_after_close(pos) if not node then return end if node.name == "mcl_barrels:barrel_open" then minetest.swap_node(pos, {name = "mcl_barrels:barrel_closed", param2 = node.param2}) + minetest.sound_play({name="mcl_barrels_default_barrel_close", pos=pos, gain=0.5, max_hear_distance=16}, true) end end diff --git a/mods/ITEMS/mcl_barrels/locale/mcl_barrels.es.tr b/mods/ITEMS/mcl_barrels/locale/mcl_barrels.es.tr index e1fa1b603..33f10f77a 100644 --- a/mods/ITEMS/mcl_barrels/locale/mcl_barrels.es.tr +++ b/mods/ITEMS/mcl_barrels/locale/mcl_barrels.es.tr @@ -1,5 +1,5 @@ # textdomain: mcl_barrels -Barrel= -Barrels are containers which provide 27 inventory slots.= -To access its inventory, rightclick it. When broken, the items will drop out.= -27 inventory slots= \ No newline at end of file +Barrel=Barril +Barrels are containers which provide 27 inventory slots.=Los barriles son contenedores que proveen 27 ranuras de inventario. +To access its inventory, rightclick it. When broken, the items will drop out.=Para acceder a su inventario, haz click derecho sobre el. Al romperse, los objetos caerán al suelo. +27 inventory slots=27 ranuras de inventario diff --git a/mods/ITEMS/mcl_barrels/sounds/attribution.txt b/mods/ITEMS/mcl_barrels/sounds/attribution.txt new file mode 100644 index 000000000..38743d3ef --- /dev/null +++ b/mods/ITEMS/mcl_barrels/sounds/attribution.txt @@ -0,0 +1,2 @@ +barrel-open.ogg and barrel-close.ogg taken from https://freesound.org/people/quantumriver/sounds/552153/ +Licence: Creative Commons 0 (CC0) diff --git a/mods/ITEMS/mcl_barrels/sounds/mcl_barrels_default_barrel_close.ogg b/mods/ITEMS/mcl_barrels/sounds/mcl_barrels_default_barrel_close.ogg new file mode 100644 index 000000000..ccbb18c0f Binary files /dev/null and b/mods/ITEMS/mcl_barrels/sounds/mcl_barrels_default_barrel_close.ogg differ diff --git a/mods/ITEMS/mcl_barrels/sounds/mcl_barrels_default_barrel_open.ogg b/mods/ITEMS/mcl_barrels/sounds/mcl_barrels_default_barrel_open.ogg new file mode 100644 index 000000000..c2c9f1d35 Binary files /dev/null and b/mods/ITEMS/mcl_barrels/sounds/mcl_barrels_default_barrel_open.ogg differ diff --git a/mods/ITEMS/mcl_beacons/init.lua b/mods/ITEMS/mcl_beacons/init.lua index 4614d5ce1..30a80bc32 100644 --- a/mods/ITEMS/mcl_beacons/init.lua +++ b/mods/ITEMS/mcl_beacons/init.lua @@ -178,6 +178,22 @@ local function beacon_blockcheck(pos) end end +local function clear_obstructed_beam(pos) + for y=pos.y+1, pos.y+100 do + local nodename = minetest.get_node({x=pos.x,y=y, z = pos.z}).name + if nodename ~= "mcl_core:bedrock" and nodename ~= "air" and nodename ~= "mcl_core:void" and nodename ~= "ignore" then --ignore means not loaded, let's just assume that's air + if nodename ~="mcl_beacons:beacon_beam" then + if minetest.get_item_group(nodename,"glass") == 0 and minetest.get_item_group(nodename,"material_glass") == 0 then + remove_beacon_beam(pos) + return true + end + end + end + end + + return false +end + local function effect_player(effect,pos,power_level, effect_level,player) local distance = vector.distance(player:get_pos(), pos) if distance > (power_level+1)*10 then return end @@ -192,31 +208,25 @@ local function effect_player(effect,pos,power_level, effect_level,player) end end -local function globalstep_function(pos,player) - local meta = minetest.get_meta(pos) - local power_level = beacon_blockcheck(pos) - local effect_string = meta:get_string("effect") - if meta:get_int("effect_level") == 2 and power_level < 4 then - return - else - local obstructed = false - for y=pos.y+1, pos.y+100 do +local function apply_effects_to_all_players(pos) + local meta = minetest.get_meta(pos) + local effect_string = meta:get_string("effect") + local effect_level = meta:get_int("effect_level") - local nodename = minetest.get_node({x=pos.x,y=y, z = pos.z}).name - if nodename ~= "mcl_core:bedrock" and nodename ~= "air" and nodename ~= "mcl_core:void" and nodename ~= "ignore" then --ignore means not loaded, let's just assume that's air - if nodename ~="mcl_beacons:beacon_beam" then - if minetest.get_item_group(nodename,"glass") == 0 and minetest.get_item_group(nodename,"material_glass") == 0 then - obstructed = true - remove_beacon_beam(pos) - return - end - end - end - end - if obstructed then - return - end - effect_player(effect_string,pos,power_level,meta:get_int("effect_level"),player) + local power_level = beacon_blockcheck(pos) + + if effect_level == 2 and power_level < 4 then --no need to run loops when beacon is in an invalid setup :P + return + end + + local beacon_distance = (power_level + 1) * 10 + + for _, player in pairs(minetest.get_connected_players()) do + if vector.distance(pos, player:get_pos()) <= beacon_distance then + if not clear_obstructed_beam(pos) then + effect_player(effect_string, pos, power_level, effect_level, player) + end + end end end @@ -330,7 +340,7 @@ minetest.register_node("mcl_beacons:beacon", { minetest.set_node({x=pos.x,y=y,z=pos.z},{name="mcl_beacons:beacon_beam",param2=beam_palette_index}) end end - globalstep_function(pos,sender)--call it once outside the globalstep so the player gets the effect right after selecting it + apply_effects_to_all_players(pos) --call it once outside the globalstep so the player gets the effect right after selecting it end end end, @@ -352,23 +362,6 @@ function register_beaconfuel(itemstring) table.insert(beacon_fuellist, itemstring) end -local timer = 0 - -minetest.register_globalstep(function(dtime) - timer = timer + dtime - if timer >= 3 then - for _, player in ipairs(minetest.get_connected_players()) do - local player_pos = player:get_pos() - local pos_list = minetest.find_nodes_in_area({x=player_pos.x-50, y=player_pos.y-50, z=player_pos.z-50}, {x=player_pos.x+50, y=player_pos.y+50, z=player_pos.z+50},"mcl_beacons:beacon") - for _, pos in ipairs(pos_list) do - globalstep_function(pos,player) - end - end - timer = 0 - end -end) - - minetest.register_abm{ label="update beacon beam", nodenames = {"mcl_beacons:beacon_beam"}, @@ -392,6 +385,16 @@ minetest.register_abm{ end, } +minetest.register_abm{ + label="apply beacon effects to players", + nodenames = {"mcl_beacons:beacon"}, + interval = 3, + chance = 1, + action = function(pos) + apply_effects_to_all_players(pos) + end, +} + minetest.register_craft({ output = "mcl_beacons:beacon", recipe = { diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index 05a95f79d..9d46eca39 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -4,7 +4,6 @@ local minetest_get_node = minetest.get_node local minetest_get_node_or_nil = minetest.get_node_or_nil local minetest_remove_node = minetest.remove_node local minetest_facedir_to_dir = minetest.facedir_to_dir -local minetest_add_item = minetest.add_item local vector_add = vector.add local vector_subtract = vector.subtract @@ -85,7 +84,6 @@ local function destruct_bed(pos, oldnode) local pos2, node2, bottom = get_bed_next_node(pos, oldnode) if bottom then - minetest_add_item(pos, node.name) if node2 and string.sub(node2.name, -4) == "_top" then minetest_remove_node(pos2) end @@ -158,7 +156,7 @@ function mcl_beds.register_bed(name, def) sounds = def.sounds or default_sounds, selection_box = common_box, collision_box = common_box, - drop = "", + drop = def.recipe and name or "", node_placement_prediction = "", on_place = function(itemstack, placer, pointed_thing) @@ -241,7 +239,7 @@ function mcl_beds.register_bed(name, def) _mcl_hardness = 0.2, _mcl_blast_resistance = 1, sounds = def.sounds or default_sounds, - drop = "", + drop = def.recipe and name or "", selection_box = common_box, collision_box = common_box, diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 294dfc483..fdb4f8f41 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -117,19 +117,23 @@ local function lay_down(player, pos, bed_pos, state, skip) end -- No sleeping if monsters nearby. - -- The exceptions above apply. - -- Zombie pigmen only prevent sleep while they are hostle. for _, obj in pairs(minetest.get_objects_inside_radius(bed_pos, 8)) do if obj and not obj:is_player() then local ent = obj:get_luaentity() local mobname = ent.name local def = minetest.registered_entities[mobname] -- Approximation of monster detection range - if def.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 - return false, S("You can't sleep now, monsters are nearby!") + if def.is_mob and (def.type == "monster" or mobname == "mobs_mc:zombified_piglin") then + if monster_exceptions[mobname] or + (mobname == "mobs_mc:zombified_piglin" and ent.state ~= "attack") then + -- Some exceptions do not prevent sleep. Zombie piglin only prevent sleep while they are hostile. + else + if math.abs(bed_pos.y - obj:get_pos().y) <= 5 then + return false, S("You can't sleep now, monsters are nearby!") + end end end + end end end @@ -211,6 +215,11 @@ local function update_formspecs(finished, ges) local button_abort = "button_exit[4,3;4,0.75;leave;"..F(S("Abort sleep")).."]" local bg_presleep = "bgcolor[#00000080;true]" local bg_sleep = "bgcolor[#000000FF;true]" + local chatbox = "field[0.2,4.5;9,1;chatmessage;"..F(S("Chat:"))..";]" + local chatsubmit = "button[9.2,3.75;1,2;chatsubmit;"..F(S("send!")).."]" + local defaultmessagebutton = "button[10.2,3.75;1,2;defaultmessage;zzZzzZ]" + + form_n = form_n .. chatbox .. chatsubmit --because these should be in the formspec in ANY case, they might as well be added here already if finished then for name,_ in pairs(mcl_beds.player) do @@ -237,6 +246,7 @@ local function update_formspecs(finished, ges) text = text .. "\n" .. comment form_n = form_n .. bg_presleep form_n = form_n .. button_leave + form_n = form_n .. defaultmessagebutton --Players should only be able to see that button when: -Skipping the night is possible -There aren't enoght players sleeping yet end form_n = form_n .. "label[0.5,1;"..F(text).."]" else @@ -425,10 +435,69 @@ minetest.register_on_leaveplayer(function(player) update_formspecs(false, #players) end) +local message_rate_limit = tonumber(minetest.settings:get("chat_message_limit_per_10sec")) or 8 --NEVER change this! if this was java, i would've declared it as final +local playermessagecounter = {} +--[[ + This table stores how many messages a player XY has sent (only while being in a bed) within 10 secs + It gets reset after 10 secs using a globalstep +--]] + +local chatbuttonused = false +local globalstep_timer = 0 +minetest.register_globalstep(function(dtime) + globalstep_timer = globalstep_timer + dtime + if globalstep_timer >= 10 then + globalstep_timer = 0 + playermessagecounter = {} + chatbuttonused = false + end +end) + +local function exceeded_rate_limit(playername) --Note: will also take care of increasing value and sending feedback message if needed + if playermessagecounter[playername] == nil then + playermessagecounter[playername] = 0 + end + if playermessagecounter[playername] >= message_rate_limit then -- == should do as well + minetest.chat_send_player(playername,S("You exceeded the maximum number of messages per 10 seconds!") .. " (" .. tostring(message_rate_limit) .. ")") + return true + end + playermessagecounter[playername] = playermessagecounter[playername] + 1 + return false +end + +local function shout_priv_check(player) + if not minetest.check_player_privs(player,"shout") then + minetest.chat_send_player(player:get_player_name(),S("You are missing the 'shout' privilege! It's required in order to talk in chat...")) + return false + end + return true +end + minetest.register_on_player_receive_fields(function(player, formname, fields) if formname ~= "mcl_beds_form" then return end + + local custom_sleep_message + if fields.chatsubmit and fields.chatmessage ~= "" then + custom_sleep_message = fields.chatmessage + end + + if custom_sleep_message or fields.defaultmessage then + if chatbuttonused then + local time_to_wait = math.ceil(10-globalstep_timer) + minetest.chat_send_player(player:get_player_name(),S("Sorry, but you have to wait @1 seconds until you may use this button again!", tostring(time_to_wait))) + return + end + + if (not exceeded_rate_limit(player:get_player_name())) and shout_priv_check(player) then + chatbuttonused = true + local message = custom_sleep_message or S("Hey! Would you guys mind sleeping?") + minetest.chat_send_all(minetest.format_chat_message(player:get_player_name(), message)) + end + return + end + if fields.quit or fields.leave then lay_down(player, nil, nil, false) update_formspecs(false) diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr index 7fe400b7f..97867b44b 100644 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr @@ -40,4 +40,10 @@ You will fall asleep when all players are in bed.=Sie werden einschlafen, wenn a You will fall asleep when @1% of all players are in bed.=Sie werden einschlafen, wenn @1% der Spieler im Bett sind. You're in bed.=Sie sind im Bett. Allows you to sleep=Zum Einschafen -Respawn Anchor=Seelenanker \ No newline at end of file +Respawn Anchor=Seelenanker +Chat:=Chat: +send!=senden! +You are missing the 'shout' privilege! It's required in order to talk in chat...=Ihnen fehlt das 'shout' Privileg! Es wird benötigt, um im Chat reden zu können... +You exceeded the maximum number of messages per 10 seconds!=Sie haben die maximale Anzahl an Chatnachrichten pro 10 Sekunden überschritten! +Hey! Would you guys mind sleeping?=Hey, würdet Ihr bitte zu Bett gehen? +Sorry, but you have to wait @1 seconds until you may use this button again!=Sie müssen leider noch @1 Sekunden warten, bevor sie diesen Knopf erneut benutzen können! \ No newline at end of file diff --git a/mods/ITEMS/mcl_beds/locale/template.txt b/mods/ITEMS/mcl_beds/locale/template.txt index 69c493880..42e59509e 100644 --- a/mods/ITEMS/mcl_beds/locale/template.txt +++ b/mods/ITEMS/mcl_beds/locale/template.txt @@ -41,3 +41,9 @@ You will fall asleep when @1% of all players are in bed.= You're in bed.= Allows you to sleep= Respawn Anchor= +Chat:= +send!= +You are missing the 'shout' privilege! It's required in order to talk in chat...= +You exceeded the maximum number of messages per 10 seconds!= +Hey! Would you guys mind sleeping?= +Sorry, but you have to wait @1 seconds until you may use this button again!= \ No newline at end of file diff --git a/mods/ITEMS/mcl_beds/mod.conf b/mods/ITEMS/mcl_beds/mod.conf index bb1ea175e..fc6d54f1f 100644 --- a/mods/ITEMS/mcl_beds/mod.conf +++ b/mods/ITEMS/mcl_beds/mod.conf @@ -2,4 +2,4 @@ name = mcl_beds author = BlockMen description = depends = playerphysics -optional_depends = mcl_sounds, mcl_worlds, mcl_wool, mcl_dye, mcl_explosions, mcl_weather, mcl_spawn, doc, mesecon \ No newline at end of file +optional_depends = mcl_sounds, mcl_worlds, mcl_wool, mcl_dye, mcl_explosions, mcl_weather, mcl_spawn, doc, mesecons \ No newline at end of file diff --git a/mods/ITEMS/mcl_beds/respawn_anchor.lua b/mods/ITEMS/mcl_beds/respawn_anchor.lua index f167599c7..781a82953 100644 --- a/mods/ITEMS/mcl_beds/respawn_anchor.lua +++ b/mods/ITEMS/mcl_beds/respawn_anchor.lua @@ -45,7 +45,7 @@ for i=0,4 do description=S("Respawn Anchor"), tiles = { { - image="respawn_anchor_top_on.png^[noalpha", + name = "respawn_anchor_top_on.png^[noalpha", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0} }, "respawn_anchor_bottom.png", diff --git a/mods/ITEMS/mcl_beehives/locale/mcl_beehives.fr.tr b/mods/ITEMS/mcl_beehives/locale/mcl_beehives.fr.tr new file mode 100644 index 000000000..45e66fa12 --- /dev/null +++ b/mods/ITEMS/mcl_beehives/locale/mcl_beehives.fr.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_beehives +Beehive=Ruche +Artificial bee nest.=Ruche artificielle. +Bee Nest=Nid d'abeilles +A naturally generating block that houses bees and a tasty treat...if you can get it.=Un bloc généré naturellement qui héberge les abeilles et une délicieuse friandise... Si vous pouvez la récupérer. diff --git a/mods/ITEMS/mcl_beehives/locale/mcl_beehives.ja.tr b/mods/ITEMS/mcl_beehives/locale/mcl_beehives.ja.tr index a07e44376..273cefae8 100644 --- a/mods/ITEMS/mcl_beehives/locale/mcl_beehives.ja.tr +++ b/mods/ITEMS/mcl_beehives/locale/mcl_beehives.ja.tr @@ -1,4 +1,5 @@ +# textdomain: mcl_beehives Beehive=養蜂箱 Artificial bee nest.=人工的なハチの巣です。 Bee Nest=ハチの巣 -A naturally generating block that houses bees and a tasty treat...if you can get it.=ミツバチの住処となっている自然生成ブロックで、美味しいおやつが収まっています…手に入れられれば。 \ No newline at end of file +A naturally generating block that houses bees and a tasty treat...if you can get it.=ミツバチの住処となっている自然生成ブロックで、美味しいおやつが収まっています…手に入れられれば。 diff --git a/mods/ITEMS/mcl_beehives/locale/template.txt b/mods/ITEMS/mcl_beehives/locale/template.txt index 135786c7c..ff4be403c 100644 --- a/mods/ITEMS/mcl_beehives/locale/template.txt +++ b/mods/ITEMS/mcl_beehives/locale/template.txt @@ -1,4 +1,5 @@ +# textdomain: mcl_beehives Beehive= Artificial bee nest.= Bee Nest= -A naturally generating block that houses bees and a tasty treat...if you can get it.= \ No newline at end of file +A naturally generating block that houses bees and a tasty treat...if you can get it.= diff --git a/mods/ITEMS/mcl_bells/locale/mcl_bells.es.tr b/mods/ITEMS/mcl_bells/locale/mcl_bells.es.tr new file mode 100644 index 000000000..b11750b3e --- /dev/null +++ b/mods/ITEMS/mcl_bells/locale/mcl_bells.es.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_bells +Bell=Campana diff --git a/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.fr.tr b/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.fr.tr index a13d5c34a..65d52d8a9 100644 --- a/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.fr.tr +++ b/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.fr.tr @@ -15,6 +15,7 @@ Chiseled Polished Blackstone Stair=Escalier de pierre noire sculptée Polished Blackstone Brick Stair=Escalier de briques de pierre noire Quartz Bricks=Briques de quartz Soul Torch=Torche des âmes +Torches are light sources which can be placed at the side or on the top of most blocks.=Les torches sont des sources lumineuses qui peuvent être placées sur le côté ou sur le dessus de la plupart des blocs. Soul Lantern=Lanterne des âmes Soul Soil=Terre des âmes Eternal Soul Fire=Feu éternel des âmes diff --git a/mods/ITEMS/mcl_blackstone/locale/template.txt b/mods/ITEMS/mcl_blackstone/locale/template.txt index ff54c9fb5..54b1be346 100644 --- a/mods/ITEMS/mcl_blackstone/locale/template.txt +++ b/mods/ITEMS/mcl_blackstone/locale/template.txt @@ -15,6 +15,7 @@ Chiseled Polished Blackstone Stair= Polished Blackstone Brick Stair= Quartz Bricks= Soul Torch= +Torches are light sources which can be placed at the side or on the top of most blocks.= Soul Lantern= Soul Soil= Eternal Soul Fire= @@ -25,4 +26,4 @@ Blackstone Wall= Double Blackstone Slab= Polished Double Blackstone Slab= Double Chiseled Polished Blackstone Slab= -Double Polished Blackstone Brick Slab= \ No newline at end of file +Double Polished Blackstone Brick Slab= diff --git a/mods/ITEMS/mcl_blast_furnace/init.lua b/mods/ITEMS/mcl_blast_furnace/init.lua index b8bbe001f..e8e6e81c8 100644 --- a/mods/ITEMS/mcl_blast_furnace/init.lua +++ b/mods/ITEMS/mcl_blast_furnace/init.lua @@ -415,14 +415,12 @@ end minetest.register_node("mcl_blast_furnace:blast_furnace", { description = S("Blast Furnace"), _tt_help = S("Smelts ores faster than furnace"), - _doc_items_longdesc = S("Blast Furnaces smelt several items, mainly ores and armor, using a furnace fuel, into something else."), + _doc_items_longdesc = S("Blast Furnaces smelt several items, mainly ores and armor, using a furnace fuel, but twice as fast as a normal furnace."), _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 blast furnace to open the furnace menu.").."\n".. + S("Place a furnace fuel in the lower slot and the source material in the upper slot.").."\n".. + S("The blast furnace will slowly use its fuel to smelt the item.").."\n".. + S("The result will be placed into the output slot at the right side.").."\n".. S("Use the recipe book to see what ores you can smelt, what you can use as fuel and how long it will burn."), _doc_items_hidden = false, tiles = { diff --git a/mods/ITEMS/mcl_blast_furnace/locale/mcl_blast_furnace.fr.tr b/mods/ITEMS/mcl_blast_furnace/locale/mcl_blast_furnace.fr.tr index 2b716d27a..a6c6a8de3 100644 --- a/mods/ITEMS/mcl_blast_furnace/locale/mcl_blast_furnace.fr.tr +++ b/mods/ITEMS/mcl_blast_furnace/locale/mcl_blast_furnace.fr.tr @@ -2,7 +2,10 @@ Inventory=Inventaire Blast Furnace=Haut fourneau Smelts ores faster than furnace=Fond le minerai plus vite que le four -Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Utiliser le livre de recettes pour voir ce que vous pouvez fondre, ce que vous pouvez utiliser comme combustible et combien de temps ça va brûler. -Use the furnace to open the furnace menu.\nPlace a furnace fuel in the lower slot and the source material in the upper slot.\nThe furnace will slowly use its fuel to smelt the item.\nThe result will be placed into the output slot at the right side.=Utiliser le fourneau pour ouvrir le menu.\nPlacer le combustible dans la case en bas et le matériau source dans la case du haut.\nLe fourneau utilisera son combustible pour fondre lentement l'objet.\nLe résultat sera placé dans la case de sortie à droite. -Blast Furnaces smelt several items, mainly ores and armor, using a furnace fuel, into something else.=Les hauts fourneaux fondent plusieurs objets, principalement du minerai et des pièces d'armure, en quelque chose d'autre. +Use the recipe book to see what ores you can smelt, what you can use as fuel and how long it will burn.=Utiliser le livre de recettes pour voir quels minerais vous pouvez fondre, ce que vous pouvez utiliser comme combustible et combien de temps ça va brûler. +Use the blast furnace to open the furnace menu.=Utiliser le haut fourneau pour ouvrir le menu. +Place a furnace fuel in the lower slot and the source material in the upper slot.=Placer le combustible dans la case en bas et le matériau source dans la case du haut. +The blast furnace will slowly use its fuel to smelt the item.=Le haut fourneau utilisera son combustible pour fondre lentement l'objet. +The result will be placed into the output slot at the right side.=Le résultat sera placé dans la case de sortie à droite. +Blast Furnaces smelt several items, mainly ores and armor, using a furnace fuel, but twice as fast as a normal furnace.=Les hauts fourneaux fondent plusieurs objets, principalement du minerai et des pièces d'armure, mais deux fois plus vite qu'un fourneau normal. Active Blast Furnace=Haut fourneau actif diff --git a/mods/ITEMS/mcl_blast_furnace/locale/template.txt b/mods/ITEMS/mcl_blast_furnace/locale/template.txt index 1c30844d8..46841046d 100644 --- a/mods/ITEMS/mcl_blast_furnace/locale/template.txt +++ b/mods/ITEMS/mcl_blast_furnace/locale/template.txt @@ -2,7 +2,10 @@ Inventory= Blast Furnace= Smelts ores faster than furnace= -Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.= -Use the furnace to open the furnace menu.\nPlace a furnace fuel in the lower slot and the source material in the upper slot.\nThe furnace will slowly use its fuel to smelt the item.\nThe result will be placed into the output slot at the right side.= -Blast Furnaces smelt several items, mainly ores and armor, using a furnace fuel, into something else.= -Active Blast Furnace= \ No newline at end of file +Use the recipe book to see what ores you can smelt, what you can use as fuel and how long it will burn.= +Use the blast furnace to open the furnace menu.= +Place a furnace fuel in the lower slot and the source material in the upper slot.= +The blast furnace will slowly use its fuel to smelt the item.= +The result will be placed into the output slot at the right side.= +Blast Furnaces smelt several items, mainly ores and armor, using a furnace fuel, but twice as fast as a normal furnace.= +Active Blast Furnace= diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.es.tr b/mods/ITEMS/mcl_books/locale/mcl_books.es.tr index d1e0d947a..880ecc16a 100644 --- a/mods/ITEMS/mcl_books/locale/mcl_books.es.tr +++ b/mods/ITEMS/mcl_books/locale/mcl_books.es.tr @@ -3,15 +3,17 @@ Book=Libro Books are used to make bookshelves and book and quills.=Los libros se usan para hacer estanterías, libros y plumas. “@1”="@1“ Copy of “@1”=Copia de "@1“ -Copy of Copy of “@1”=Kopie von Kopie von „@1“ +Copy of Copy of “@1”=Copia de la copia de "@1" Tatter ed Book=Libro andrajoso by @1=por @1 +# as in “to sign a book” Sign=Firmar Done=Hecho This item can be used to write down some notes.=Este elemento se puede usar para escribir algunas notas. 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.=Sosténgalo en la mano, luego haga clic derecho para leer las notas actuales y luego edite. Puede editar el texto con la frecuencia que desee. También puede firmar el libro que lo convierte en un libro escrito que puede apilar, pero ya no se puede editar. A book can hold up to 4500 characters. The title length is limited to 64 characters.=Un libro puede contener hasta 4500 caracteres. La longitud del título está limitada a 64 caracteres. Enter book title:=Inserta el título del libro: +by @1=por @1 Note: The book will no longer be editable after signing=Nota: El libro ya no será editable después de firmarlo Sign and Close=Firmar y cerrar libro Cancel=Cancelar @@ -23,3 +25,4 @@ To copy the text of the written book, place it into the crafting grid together w Bookshelf=Librería Bookshelves are used for decoration.=Las librerías se utilizan para la decoración. Book and Quill=Libro y pluma +Write down some notes=Escribe algunas notas diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr index 539afdcf0..4ed4d8640 100644 --- a/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr +++ b/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr @@ -8,4 +8,11 @@ Bow=Arco Bows are ranged weapons to shoot arrows at your foes.=Los arcos son armas a distancia para disparar flechas a tus enemigos. 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.=La velocidad y el daño de la flecha aumentan cuanto más tiempo tenses. El daño regular de la flecha está entre 1 y 9. A plena carga, también hay un 20% de un golpe crítico, que en vez de eso causa 10 de daño. To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Para usar el arco, primero debes de tener al menos una flecha en cualquier parte de su inventario (a menos que esté en modo creativo). Mantenga presionado el botón derecho del mouse para tensar, suelte para disparar. -Bow=Arco \ No newline at end of file +Bow=Arco +Ammunition=Munición +Damage from bow: 1-10=Daño con arco: 1-10 +Damage from dispenser: 3=Daño por dispendsador: 3 +Launches arrows=Lanza flechas +Crossbow=Ballesta +Crossbows are ranged weapons to shoot arrows at your foes.=Las ballestas son armas a distancia para disparar flechas a tus enemigos. +To use the crossbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Para usar la ballesta, primero debes tener por lo menos una flecha en cualquier raunura de tu inventario (excepto en modo creativo).Mantén presionado el botón derecho del ratón para cargar, suelta para disparar. diff --git a/mods/ITEMS/mcl_buckets/init.lua b/mods/ITEMS/mcl_buckets/init.lua index ecc867482..6aebbc759 100644 --- a/mods/ITEMS/mcl_buckets/init.lua +++ b/mods/ITEMS/mcl_buckets/init.lua @@ -325,7 +325,7 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { _doc_items_longdesc = S("A bucket can be used to collect and release liquids."), _doc_items_usagehelp = S("Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else."), _tt_help = S("Collects liquids"), - inventory_image = "bucket.png", + inventory_image = "mcl_buckets_bucket.png", stack_max = 16, liquids_pointable = use_select_box, on_place = on_place_bucket_empty, diff --git a/mods/ITEMS/mcl_buckets/locale/mcl_buckets.fr.tr b/mods/ITEMS/mcl_buckets/locale/mcl_buckets.fr.tr index 79a9d9d6d..62fdba15a 100644 --- a/mods/ITEMS/mcl_buckets/locale/mcl_buckets.fr.tr +++ b/mods/ITEMS/mcl_buckets/locale/mcl_buckets.fr.tr @@ -15,10 +15,11 @@ Collects liquids=Collecte des liquides Places a lava source=Place une source de lave Places a water source=Place une source d'eau Places a river water source=Place une source d'eau de rivière +Axolotl=Axolotl Cod=Morue Salmon=Saumon Tropical Fish=Poisson tropical Bucket of @1=Seau de @1 This bucket is filled with water and @1.=Ce seau est rempli d'eau et de @1. -Place it to empty the bucket and place a @1. Obtain by right clicking on a @2 fish with a bucket of water.=Le placer pour vider le seau et placer un @1. S'obtient en faisant un clic droit sur un poisson @2 avec un seau d'eau. -Places a water source and a @1 fish.=Placer une source d'eau et un poisson @1. +Place it to empty the bucket and place a @1. Obtain by right clicking on a @2 with a bucket of water.=Le placer pour vider le seau et placer un @1. S'obtient en faisant un clic droit sur un @2 avec un seau d'eau. +Places a water source and a @1.=Placer une source d'eau et un @1. diff --git a/mods/ITEMS/mcl_buckets/register.lua b/mods/ITEMS/mcl_buckets/register.lua index d9054d498..1d247e827 100644 --- a/mods/ITEMS/mcl_buckets/register.lua +++ b/mods/ITEMS/mcl_buckets/register.lua @@ -38,7 +38,7 @@ if mod_mcl_core then end end, bucketname = "mcl_buckets:bucket_lava", - inventory_image = "bucket_lava.png", + inventory_image = "mcl_buckets_lava_bucket.png", name = S("Lava Bucket"), longdesc = S("A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution."), usagehelp = 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!"), @@ -50,13 +50,14 @@ if mod_mcl_core then source_place = "mcl_core:water_source", source_take = {"mcl_core:water_source"}, bucketname = "mcl_buckets:bucket_water", - inventory_image = "bucket_water.png", + inventory_image = "mcl_buckets_water_bucket.png", name = S("Water Bucket"), longdesc = S("A bucket can be used to collect and release liquids. This one is filled with water."), usagehelp = S("Place it to empty the bucket and create a water source."), tt_help = S("Places a water source"), extra_check = function(pos, placer) local nn = minetest.get_node(pos).name + local dim = mcl_worlds.pos_to_dimension(pos) -- Pour water into cauldron if minetest.get_item_group(nn, "cauldron") ~= 0 then -- Put water into cauldron @@ -66,17 +67,14 @@ if mod_mcl_core then sound_place("mcl_core:water_source", pos) return false, true -- Put water into mangrove roots - elseif minetest.get_node(pos).name == "mcl_mangrove:mangrove_roots" then + elseif minetest.get_node(pos).name == "mcl_mangrove:mangrove_roots" and dim ~= "nether" then minetest.set_node(pos, {name="mcl_mangrove:water_logged_roots"}) sound_place("mcl_core:water_source", pos) return false, true -- Evaporate water if used in Nether (except on cauldron) - else - local dim = mcl_worlds.pos_to_dimension(pos) - if dim == "nether" then - minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) - return false, true - end + elseif dim == "nether" then + minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) + return false, true end end, groups = { water_bucket = 1 }, @@ -89,13 +87,14 @@ if mod_mclx_core then source_place = "mclx_core:river_water_source", source_take = {"mclx_core:river_water_source"}, bucketname = "mcl_buckets:bucket_river_water", - inventory_image = "bucket_river_water.png", + inventory_image = "mcl_buckets_river_water_bucket.png", name = S("River Water Bucket"), longdesc = S("A bucket can be used to collect and release liquids. This one is filled with river water."), usagehelp = S("Place it to empty the bucket and create a river water source."), tt_help = S("Places a river water source"), extra_check = function(pos, placer) local nn = minetest.get_node(pos).name + local dim = mcl_worlds.pos_to_dimension(pos) -- Pour into cauldron if minetest.get_item_group(nn, "cauldron") ~= 0 then -- Put water into cauldron @@ -105,17 +104,14 @@ if mod_mclx_core then sound_place("mcl_core:water_source", pos) return false, true -- Put river water into mangrove roots - elseif minetest.get_node(pos).name == "mcl_mangrove:mangrove_roots" then + elseif minetest.get_node(pos).name == "mcl_mangrove:mangrove_roots" and dim ~= "nether" then minetest.set_node(pos, {name="mcl_mangrove:river_water_logged_roots"}) sound_place("mcl_core:water_source", pos) return false, true - else - -- Evaporate water if used in Nether (except on cauldron) - local dim = mcl_worlds.pos_to_dimension(pos) - if dim == "nether" then - minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) - return false, true - end + -- Evaporate water if used in Nether (except on cauldron) + elseif dim == "nether" then + minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) + return false, true end end, groups = { water_bucket = 1 }, diff --git a/mods/ITEMS/mcl_cake/locale/mcl_cake.es.tr b/mods/ITEMS/mcl_cake/locale/mcl_cake.es.tr index 261d581e1..3cec57b8b 100644 --- a/mods/ITEMS/mcl_cake/locale/mcl_cake.es.tr +++ b/mods/ITEMS/mcl_cake/locale/mcl_cake.es.tr @@ -8,3 +8,5 @@ Cake (4 Slices Left)=Tarta (Quedan 4 trozos) Cake (3 Slices Left)=Tarta (Quedan 3 trozos) Cake (2 Slices Left)=Tarta (Quedan 2 trozos) Cake (1 Slice Left)=Tarta (Queda 1 trozo) +With 7 tasty slices!=¡Con 7 deliciosas rebanadas! +Hunger points: +@1 per slice=Puntos de hambre: +@1 por rebanada diff --git a/mods/ITEMS/mcl_cauldrons/init.lua b/mods/ITEMS/mcl_cauldrons/init.lua index 44bbebc22..c84e3bb88 100644 --- a/mods/ITEMS/mcl_cauldrons/init.lua +++ b/mods/ITEMS/mcl_cauldrons/init.lua @@ -40,8 +40,8 @@ end minetest.register_node("mcl_cauldrons:cauldron", { description = S("Cauldron"), _tt_help = S("Stores water"), - _doc_items_longdesc = S("Cauldrons are used to store water and slowly fill up under rain."), - _doc_items_usagehelp = S("Place a water bucket 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."), + _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 bucket 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", use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.es.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.es.tr index 16af1a5c9..8222a93a6 100644 --- a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.es.tr +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.es.tr @@ -8,3 +8,4 @@ Cauldron (3/3 Water)=Caldera (3/3 de agua) Cauldron (1/3 River Water)=Caldera (1/3 de agua de río) Cauldron (2/3 River Water)=Caldera (2/3 de agua de río) Cauldron (3/3 River Water)=Caldera (3/3 de agua de río) +Stores water=Almacena agua diff --git a/mods/ITEMS/mcl_chests/locale/mcl_chests.es.tr b/mods/ITEMS/mcl_chests/locale/mcl_chests.es.tr index 9d44bacca..ef3e0d9e3 100644 --- a/mods/ITEMS/mcl_chests/locale/mcl_chests.es.tr +++ b/mods/ITEMS/mcl_chests/locale/mcl_chests.es.tr @@ -28,3 +28,9 @@ To access the inventory of a shulker box, place and right-click it. To take a sh Shulker Box=Caja de shulker Large Chest=Arcón Inventory=Inventario +27 inventory slots=27 ranuras de inventario +Can be carried around with its contents=Puede llevarse con sus contenidos +Can be combined to a large chest=Se puede combinar para convertirse en un cofre grande +27 interdimensional inventory slots=27 ranuras de inventario interdimensionales +Put items inside, retrieve them from any ender chest=Pon objetos dentro, recupéralos desde cualquier cofre de ender +Emits a redstone signal when opened=Emite una señal de redstone al abrirse diff --git a/mods/ITEMS/mcl_compass/locale/mcl_compass.fr.tr b/mods/ITEMS/mcl_compass/locale/mcl_compass.fr.tr index 77d249087..87dc31650 100644 --- a/mods/ITEMS/mcl_compass/locale/mcl_compass.fr.tr +++ b/mods/ITEMS/mcl_compass/locale/mcl_compass.fr.tr @@ -7,4 +7,8 @@ Lodestone Compass=Boussole magnétisée Points to a lodestone=Pointe vers une magnétite Lodestone compasses resemble regular compasses, but they point to a specific lodestone.=Les boussoles magnétisées ressemblent à des boussoles normales, mais pointent vers une magnétite spécifique. A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone.=Une boussole magnétisée peut être crée à partir d'une boussole normale en l'utilisant sur une magnétite. Après être devenue une boussole magnétisée, elle pointera toujours vers sa magnétite liée, pourvu qu'elle soit dans la même dimension. Si ce n'est pas le cas, la boussole magnétisée tourne au hasard, comme une boussole normale hors de l'overworld. Une boussole magnétisée peut être liée à une autre magnétite. -Lodestone=Magnétite \ No newline at end of file +Lodestone=Magnétite +Recovery Compass=Boussole de récupération +Points to your last death location=Pointe vers le lieu de votre dernière mort +Recovery Compasses are compasses that point to your last death location=Les boussoles de récupération sont des boussoles qui pointent vers le lieu de votre dernière mort +Recovery Compasses always point to the location of your last death, in case you haven't died yet, it will just randomly spin around=Les boussoles de récupération pointent toujours vers le lieu de votre dernière mort, si vous n'êtes jamais mort, elle va juste tourner aléatoirement diff --git a/mods/ITEMS/mcl_compass/locale/template.txt b/mods/ITEMS/mcl_compass/locale/template.txt index f41485dea..e1b7ae7f9 100644 --- a/mods/ITEMS/mcl_compass/locale/template.txt +++ b/mods/ITEMS/mcl_compass/locale/template.txt @@ -8,3 +8,7 @@ Points to a lodestone= Lodestone compasses resemble regular compasses, but they point to a specific lodestone.= A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone.= Lodestone= +Recovery Compass= +Points to your last death location= +Recovery Compasses are compasses that point to your last death location= +Recovery Compasses always point to the location of your last death, in case you haven't died yet, it will just randomly spin around= diff --git a/mods/ITEMS/mcl_composters/init.lua b/mods/ITEMS/mcl_composters/init.lua index 51c887531..d60422afd 100644 --- a/mods/ITEMS/mcl_composters/init.lua +++ b/mods/ITEMS/mcl_composters/init.lua @@ -76,7 +76,10 @@ local function composter_add_item(pos, node, player, itemstack, pointed_thing) if chance > 0 then if not is_creative_enabled(player:get_player_name()) then itemstack:take_item() - minetest.sound_play({name="default_gravel_dug", pos=pos, gain=1}, true) + minetest.sound_play({name="default_gravel_dug", gain=1}, { + pos = pos, + max_hear_distance = 16, + }, true) end -- calculate leveling up chance local rand = math.random(0,100) @@ -92,7 +95,11 @@ local function composter_add_item(pos, node, player, itemstack, pointed_thing) level = "ready" end swap_node(pos, {name = "mcl_composters:composter_" .. level}) - minetest.sound_play({name="default_grass_footstep", pos=pos, gain=0.4}, true) + minetest.sound_play({name="default_grass_footstep", gain=0.4}, { + pos = pos, + gain= 0.4, + max_hear_distance = 16, + }, true) -- a full composter becomes ready for harvest after one second -- the block will get updated by the node timer callback set in node reg def if level == 7 then @@ -115,7 +122,10 @@ end local function composter_ready(pos) swap_node(pos, {name = "mcl_composters:composter_ready"}) -- maybe spawn particles again? - minetest.sound_play({name="default_dig_snappy", pos=above, gain=1}, true) + minetest.sound_play({name="default_dig_snappy", gain=1}, { + pos = pos, + max_hear_distance = 16, + }, true) return false end diff --git a/mods/ITEMS/mcl_composters/locale/mcl_composters.fr.tr b/mods/ITEMS/mcl_composters/locale/mcl_composters.fr.tr index 66a72bf38..0f4e665e6 100644 --- a/mods/ITEMS/mcl_composters/locale/mcl_composters.fr.tr +++ b/mods/ITEMS/mcl_composters/locale/mcl_composters.fr.tr @@ -1,7 +1,7 @@ # textdomain: mcl_composters Composter=Composteur Composters can convert various organic items into bonemeal.=Les composteurs peuvent convertir divers objets organiques en farine d'os. -Use organic items on the composter to fill it with layers of compost. Every time an item is put in the composter, there is a chance that the composter adds another layer of compost. Some items have a bigger chance of adding an extra layer than other items. After filling up with 7 layers of compost, the composter is full. After a delay of approximately one second the composter becomes ready and bone meal can be retrieved from it. Right-clicking the composter takes out the bone meal empties the composter."=Utiliser des objets organiques sur le composteur pour le remplir de couches de compost. Chaque fois qu'un objet est mis dans le composteur, il y a une chance d'ajouter une nouvelle couche de compost au composteur. Certains objets ont une plus grande chance que d'autres d'ajouter une couche supplémentaire. Après l'avoir rempli de 7 couches de compost, le composteur est plein. Après un délai d'approximativement une seconde, le composteur est prêt et on peut récupérer la farine d'os. Cliquer droit le composteur permet de récupérer la farine d'os et de vider le composteur. +Use organic items on the composter to fill it with layers of compost. Every time an item is put in the composter, there is a chance that the composter adds another layer of compost. Some items have a bigger chance of adding an extra layer than other items. After filling up with 7 layers of compost, the composter is full. After a delay of approximately one second the composter becomes ready and bone meal can be retrieved from it. Right-clicking the composter takes out the bone meal empties the composter.=Utiliser des objets organiques sur le composteur pour le remplir de couches de compost. Chaque fois qu'un objet est mis dans le composteur, il y a une chance d'ajouter une nouvelle couche de compost au composteur. Certains objets ont une plus grande chance que d'autres d'ajouter une couche supplémentaire. Après l'avoir rempli de 7 couches de compost, le composteur est plein. Après un délai d'approximativement une seconde, le composteur est prêt et on peut récupérer la farine d'os. Cliquer droit le composteur permet de récupérer la farine d'os et de vider le composteur. filled=rempli ready for harvest=prêt pour la récolte Converts organic items into bonemeal=Convertit les objets organiques en farine d'os. diff --git a/mods/ITEMS/mcl_composters/locale/template.txt b/mods/ITEMS/mcl_composters/locale/template.txt index c5f9bb858..f3329719a 100644 --- a/mods/ITEMS/mcl_composters/locale/template.txt +++ b/mods/ITEMS/mcl_composters/locale/template.txt @@ -1,7 +1,7 @@ # textdomain: mcl_composters Composter= Composters can convert various organic items into bonemeal.= -Use organic items on the composter to fill it with layers of compost. Every time an item is put in the composter, there is a chance that the composter adds another layer of compost. Some items have a bigger chance of adding an extra layer than other items. After filling up with 7 layers of compost, the composter is full. After a delay of approximately one second the composter becomes ready and bone meal can be retrieved from it. Right-clicking the composter takes out the bone meal empties the composter."= +Use organic items on the composter to fill it with layers of compost. Every time an item is put in the composter, there is a chance that the composter adds another layer of compost. Some items have a bigger chance of adding an extra layer than other items. After filling up with 7 layers of compost, the composter is full. After a delay of approximately one second the composter becomes ready and bone meal can be retrieved from it. Right-clicking the composter takes out the bone meal empties the composter.= filled= ready for harvest= Converts organic items into bonemeal= diff --git a/mods/ITEMS/mcl_copper/functions.lua b/mods/ITEMS/mcl_copper/functions.lua index db756e425..bd289f60f 100644 --- a/mods/ITEMS/mcl_copper/functions.lua +++ b/mods/ITEMS/mcl_copper/functions.lua @@ -1,75 +1,132 @@ ---local deepslate_mod = minetest.get_modpath("mcl_deepslate") - -local function register_oxidation_abm(abm_name, node_name, oxidized_variant) - minetest.register_abm({ - label = abm_name, - nodenames = { node_name }, - interval = 500, - chance = 3, - action = function(pos, node) - minetest.swap_node(pos, { name = oxidized_variant, param2 = node.param2 }) - end, - }) -end - ---[[ -local stairs = { - {"stair", "exposed", "_inner", "cut_inner"}, - {"stair", "weathered", "_inner", "exposed_cut_inner"}, - {"stair", "exposed", "_outer", "cut_outer"}, - {"stair", "weathered", "_outer", "exposed_cut_outer"}, - {"stair", "oxidized", "_outer", "weathered_cut_outer"}, - {"stair", "oxidized", "_inner", "weathered_cut_inner"}, - {"slab", "exposed", "","cut"}, - {"slab", "oxidized", "","weathered_cut"}, - {"slab", "weathered", "","exposed_cut"}, - {"slab", "exposed", "_top","cut_top"}, - {"slab", "oxidized", "_top", "weathered_cut_top"}, - {"slab", "weathered", "_top","exposed_cut_top"}, - {"slab", "exposed", "_double","cut_double"}, - {"slab", "oxidized", "_double","weathered_cut_double"}, - {"slab", "weathered", "_double","exposed_cut_double"}, - {"stair", "exposed", "","cut"}, - {"stair", "oxidized", "", "weathered_cut"}, - {"stair", "weathered", "", "exposed_cut"}, -}]] - -local block_oxidation = { - { "", "_exposed" }, - { "_cut", "_exposed_cut" }, - { "_exposed", "_weathered" }, - { "_exposed_cut", "_weathered_cut" }, - { "_weathered", "_oxidized" }, - { "_weathered_cut", "_oxidized_cut" } +local stair_oxidization = { + { "cut", "exposed_cut" }, + { "cut_inner", "exposed_cut_inner" }, + { "cut_outer", "exposed_cut_outer" }, + { "exposed_cut", "weathered_cut" }, + { "exposed_cut_inner", "weathered_cut_inner" }, + { "exposed_cut_outer", "weathered_cut_outer" }, + { "weathered_cut", "oxidized_cut" }, + { "weathered_cut_inner", "oxidized_cut_inner" }, + { "weathered_cut_outer", "oxidized_cut_outer" } } -local stair_oxidation = { - { "slab", "cut", "exposed_cut" }, - { "slab", "exposed_cut", "weathered_cut" }, - { "slab", "weathered_cut", "oxidized_cut" }, - { "slab", "cut_top", "exposed_cut_top" }, - { "slab", "exposed_cut_top", "weathered_cut_top" }, - { "slab", "weathered_cut_top", "oxidized_cut_double" }, - { "slab", "cut_double", "exposed_cut_double" }, - { "slab", "exposed_cut_double", "weathered_cut_double" }, - { "slab", "weathered_cut_double", "oxidized_cut_double" }, - { "stair", "cut", "exposed_cut" }, - { "stair", "exposed_cut", "weathered_cut" }, - { "stair", "weathered_cut", "oxidized_cut" }, - { "stair", "cut_inner", "exposed_cut_inner" }, - { "stair", "exposed_cut_inner", "weathered_cut_inner" }, - { "stair", "weathered_cut_inner", "oxidized_cut_inner" }, - { "stair", "cut_outer", "exposed_cut_outer" }, - { "stair", "exposed_cut_outer", "weathered_cut_outer" }, - { "stair", "weathered_cut_outer", "oxidized_cut_outer" } +local slab_oxidization = { + { "cut", "exposed_cut" }, + { "cut_top", "exposed_cut_top" }, + { "cut_double", "exposed_cut_double" }, + { "exposed_cut", "weathered_cut" }, + { "exposed_cut_top", "weathered_cut_top" }, + { "exposed_cut_double", "weathered_cut_double" }, + { "weathered_cut", "oxidized_cut" }, + { "weathered_cut_top", "oxidized_cut_top" }, + { "weathered_cut_double", "oxidized_cut_double" }, } -for _, b in pairs(block_oxidation) do - register_oxidation_abm("Copper oxidation", "mcl_copper:block" .. b[1], "mcl_copper:block" .. b[2]) +local def +local def_variant_oxidized +local def_variant_waxed +local def_variant_scraped + +-- set up oxidized and waxed variants. +for i = 1, #stair_oxidization do + -- stairs + def = "mcl_stairs:stair_copper_" .. stair_oxidization[i][1] + def_variant_oxidized = "mcl_stairs:stair_copper_" .. stair_oxidization[i][2] + minetest.override_item(def, { _mcl_oxidized_variant = def_variant_oxidized }) + + def_variant_waxed = "mcl_stairs:stair_waxed_copper_" .. stair_oxidization[i][1] + minetest.override_item(def, { _mcl_waxed_variant = def_variant_waxed }) + + -- slabs + def = "mcl_stairs:slab_copper_" .. slab_oxidization[i][1] + def_variant_oxidized = "mcl_stairs:slab_copper_" .. slab_oxidization[i][2] + minetest.override_item(def, { _mcl_oxidized_variant = def_variant_oxidized }) + + def_variant_waxed = "mcl_stairs:slab_waxed_copper_" .. slab_oxidization[i][1] + minetest.override_item(def, { _mcl_waxed_variant = def_variant_waxed }) end -for _, s in pairs(stair_oxidation) do - register_oxidation_abm("Copper oxidation", "mcl_stairs:" .. s[1] .. "_copper_" .. s[2], "mcl_stairs:" .. s[1] .. "_copper_" .. s[3]) - -- TODO: Make stairs and slabs be waxable / scrapable. Place the Node overrides here, just like they are on the copper nodes, and it will work properly. May need to update mcl_honey to call the waxing function for stairs and slabs. +-- Set up scraped variants. +for i = 1, #stair_oxidization do + -- does both stairs and slabs. + if i > 3 then + def = "mcl_stairs:stair_copper_" .. stair_oxidization[i][1] + def_variant_scraped = "mcl_stairs:stair_copper_" .. stair_oxidization[i - 3][1] + minetest.override_item(def, { _mcl_stripped_variant = def_variant_scraped }) + + def = "mcl_stairs:slab_copper_" .. slab_oxidization[i][1] + def_variant_scraped = "mcl_stairs:slab_copper_" .. slab_oxidization[i - 3][1] + minetest.override_item(def, { _mcl_stripped_variant = def_variant_scraped }) + end + if i > 6 then + def = "mcl_stairs:stair_copper_" .. stair_oxidization[i][2] + def_variant_scraped = "mcl_stairs:stair_copper_" .. stair_oxidization[i][1] + minetest.override_item(def, { _mcl_stripped_variant = def_variant_scraped }) + + def = "mcl_stairs:slab_copper_" .. slab_oxidization[i][2] + def_variant_scraped = "mcl_stairs:slab_copper_" .. slab_oxidization[i][1] + minetest.override_item(def, { _mcl_stripped_variant = def_variant_scraped }) + end end +-- Set up scraped variants for waxed stairs. +local waxed_variants = { + { "waxed_copper_cut", "copper_cut" }, + { "waxed_copper_exposed_cut", "copper_exposed_cut" }, + { "waxed_copper_weathered_cut", "copper_weathered_cut" }, + { "waxed_copper_oxidized_cut", "copper_oxidized_cut" }, +} + +for i = 1, #waxed_variants do + -- stairs + def = "mcl_stairs:stair_" .. waxed_variants[i][1] + def_variant_scraped = "mcl_stairs:stair_" .. waxed_variants[i][2] + minetest.override_item(def, { _mcl_stripped_variant = def_variant_scraped }) + + def = "mcl_stairs:stair_" .. waxed_variants[i][1] .. "_inner" + def_variant_scraped = "mcl_stairs:stair_" .. waxed_variants[i][2] .. "_inner" + minetest.override_item(def, { _mcl_stripped_variant = def_variant_scraped }) + + def = "mcl_stairs:stair_" .. waxed_variants[i][1] .. "_outer" + def_variant_scraped = "mcl_stairs:stair_" .. waxed_variants[i][2] .. "_outer" + minetest.override_item(def, { _mcl_stripped_variant = def_variant_scraped }) + + -- slab + def = "mcl_stairs:slab_" .. waxed_variants[i][1] + def_variant_scraped = "mcl_stairs:slab_" .. waxed_variants[i][2] + minetest.override_item(def, { _mcl_stripped_variant = def_variant_scraped }) + + def = "mcl_stairs:slab_" .. waxed_variants[i][1] .. "_top" + def_variant_scraped = "mcl_stairs:slab_" .. waxed_variants[i][2] .. "_top" + minetest.override_item(def, { _mcl_stripped_variant = def_variant_scraped }) + + def = "mcl_stairs:slab_" .. waxed_variants[i][1] .. "_double" + def_variant_scraped = "mcl_stairs:slab_" .. waxed_variants[i][2] .. "_double" + minetest.override_item(def, { _mcl_stripped_variant = def_variant_scraped }) + +end + +-- Waxed Oxidized Slabs and Stairs +local oxidized_slabs = { + "oxidized_cut", + "oxidized_cut_double", + "oxidized_cut_top" +} + +for i = 1, #oxidized_slabs do + def = "mcl_stairs:slab_copper_" .. oxidized_slabs[i] + def_variant_waxed = "mcl_stairs:slab_waxed_copper_" .. oxidized_slabs[i] + minetest.override_item(def, { _mcl_waxed_variant = def_variant_waxed }) +end + +local oxidized_stairs = { + "oxidized_cut", + "oxidized_cut_inner", + "oxidized_cut_outer" +} + +for i = 1, #oxidized_stairs do + def = "mcl_stairs:stair_copper_" .. oxidized_stairs[i] + def_variant_waxed = "mcl_stairs:stair_waxed_copper_" .. oxidized_stairs[i] + minetest.override_item(def, { _mcl_waxed_variant = def_variant_waxed }) +end diff --git a/mods/ITEMS/mcl_copper/init.lua b/mods/ITEMS/mcl_copper/init.lua index 937d262e2..01ece6d54 100644 --- a/mods/ITEMS/mcl_copper/init.lua +++ b/mods/ITEMS/mcl_copper/init.lua @@ -2,7 +2,7 @@ local path = minetest.get_modpath("mcl_copper") mcl_copper = {} -- initialize global variable. -dofile(path .. "/functions.lua") dofile(path .. "/nodes.lua") dofile(path .. "/items.lua") dofile(path .. "/crafting.lua") +dofile(path .. "/functions.lua") diff --git a/mods/ITEMS/mcl_copper/locale/mcl_copper.fr.tr b/mods/ITEMS/mcl_copper/locale/mcl_copper.fr.tr index 1efae66ee..a2fb94c36 100644 --- a/mods/ITEMS/mcl_copper/locale/mcl_copper.fr.tr +++ b/mods/ITEMS/mcl_copper/locale/mcl_copper.fr.tr @@ -2,36 +2,56 @@ A block of copper is mostly a decorative block.=Le bloc de cuivre est surtout un bloc décoratif. A block used for compact raw copper storage.=Un bloc utilisé pour le stockage compact de cuivre brut. Block of Copper=Bloc de cuivre +Waxed Block of Copper=Bloc de cuivre ciré Block of Raw Copper=Bloc de cuivre brut Copper Ingot=Lingot de cuivre Copper Ore=Minerai de cuivre Cut copper is a decorative block.=Le cuivre taillé est un bloc décoratif. Cut Copper=Cuivre taillé +Waxed Cut Copper=Cuivre taillé ciré Double Slab of Cut Copper=Double dalle de cuivre taillé Double Slab of Exposed Cut Copper=Double dalle de cuivre taillé exposé Double Slab of Oxidized Cut Copper=Double dalle de cuivre taillé oxydé Double Slab of Weathered Cut Copper=Double dalle de cuivre taillé érodé +Waxed Double Slab of Cut Copper=Double dalle de cuivre taillé ciré +Waxed Double Slab of Exposed Cut Copper=Double dalle de cuivre taillé exposé ciré +Waxed Double Slab of Oxidized Cut Copper=Double dalle de cuivre taillé oxydé ciré +Waxed Double Slab of Weathered Cut Copper=Double dalle de cuivre taillé érodé ciré Exposed copper is a decorative block.=Le cuivre exposé est un bloc décoratif. Exposed Copper=Cuivre exposé +Waxed Exposed Copper=Cuivre exposé ciré Exposed cut copper is a decorative block.=Le cuivre taillé exposé est un bloc décoratif. Exposed Cut Copper=Cuivre taillé exposé +Waxed Exposed Cut Copper=Cuivre taillé exposé ciré Molten Raw Copper. It is used to craft blocks.=Cuivre brut fondu. Utilisé pour fabriquer des blocs. Oxidized copper is a decorative block.=Le cuivre oxydé est un bloc décoratif. Oxidized Copper=Cuivre oxydé +Waxed Oxidized Copper=Cuivre oxydé ciré Oxidized cut copper is a decorative block.=Le cuivre taillé oxydé est un bloc décoratif. Oxidized Cut Copper=Cuivre taillé oxydé +Waxed Oxidized Cut Copper=Cuivre taillé oxydé ciré Raw Copper. Mine a Copper Ore to get it.=Cuivre brut. Creuser dans du minerai de cuivre pour l'obtenir. Raw Copper=Cuivre brut Slab of Cut Copper=Dalle de cuivre taillé Slab of Exposed Cut Copper=Dalle de cuivre taillé exposé Slab of Oxidized Cut Copper=Dalle de cuivre taillé oxydé Slab of Weathered Cut Copper=Dalle de cuivre taillé érodé +Waxed Slab of Cut Copper=Dalle de cuivre taillé ciré +Waxed Slab of Exposed Cut Copper=Dalle de cuivre taillé exposé ciré +Waxed Slab of Oxidized Cut Copper=Dalle de cuivre taillé oxydé ciré +Waxed Slab of Weathered Cut Copper=Dalle de cuivre taillé érodé ciré Some copper contained in stone, it is pretty common and can be found below sea level.=Un peu de cuivre se trouve dans la pierre, il est plutôt répandu et peut être trouvé sous le niveau de la mer. Stairs of Cut Copper=Escalier de cuivre taillé Stairs of Exposed Cut Copper=Escalier de cuivre taillé exposé Stairs of Oxidized Cut Copper=Escalier de cuivre taillé oxydé Stairs of Weathered Cut Copper=Escalier de cuivre taillé érodé +Waxed Stairs of Cut Copper=Escalier de cuivre taillé ciré +Waxed Stairs of Exposed Cut Copper=Escalier de cuivre taillé exposé ciré +Waxed Stairs of Oxidized Cut Copper=Escalier de cuivre taillé oxydé ciré +Waxed Stairs of Weathered Cut Copper=Escalier de cuivre taillé érodé ciré Weathered copper is a decorative block.=Le cuivre érodé est un bloc décoratif. Weathered Copper=Cuivre érodé +Waxed Weathered Copper=Cuivre érodé ciré Weathered cut copper is a decorative block.=Le cuivre taillé érodé est un bloc décoratif. Weathered Cut Copper=Cuivre taillé érodé +Waxed Weathered Cut Copper=Cuivre taillé érodé ciré diff --git a/mods/ITEMS/mcl_copper/mod.conf b/mods/ITEMS/mcl_copper/mod.conf index 8cf5fd579..a48ee56f7 100644 --- a/mods/ITEMS/mcl_copper/mod.conf +++ b/mods/ITEMS/mcl_copper/mod.conf @@ -1,4 +1,4 @@ name = mcl_copper author = NO11 -depends = mcl_core, mcl_sounds, mcl_stairs, mcl_util +depends = mcl_core, mcl_sounds, mcl_stairs, mcl_util, mcl_oxidation description = Adds Copper Ore, blocks and items. diff --git a/mods/ITEMS/mcl_copper/nodes.lua b/mods/ITEMS/mcl_copper/nodes.lua index c8bb139cf..af5a49a1c 100644 --- a/mods/ITEMS/mcl_copper/nodes.lua +++ b/mods/ITEMS/mcl_copper/nodes.lua @@ -30,11 +30,12 @@ minetest.register_node("mcl_copper:block", { _doc_items_longdesc = S("A block of copper is mostly a decorative block."), tiles = {"mcl_copper_block.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 3, - _mcl_copper_waxed_variant = "mcl_copper:waxed_block", + _mcl_oxidized_variant = "mcl_copper:block_exposed", + _mcl_waxed_variant = "mcl_copper:waxed_block", }) minetest.register_node("mcl_copper:waxed_block", { @@ -42,7 +43,7 @@ minetest.register_node("mcl_copper:waxed_block", { _doc_items_longdesc = S("A block of copper is mostly a decorative block."), tiles = {"mcl_copper_block.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 3, @@ -54,11 +55,12 @@ minetest.register_node("mcl_copper:block_exposed", { _doc_items_longdesc = S("Exposed copper is a decorative block."), tiles = {"mcl_copper_exposed.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, - _mcl_copper_waxed_variant = "mcl_copper:waxed_block_exposed", + _mcl_oxidized_variant = "mcl_copper:block_weathered", + _mcl_waxed_variant = "mcl_copper:waxed_block_exposed", _mcl_stripped_variant = "mcl_copper:block", }) @@ -67,11 +69,11 @@ minetest.register_node("mcl_copper:waxed_block_exposed", { _doc_items_longdesc = S("Exposed copper is a decorative block."), tiles = {"mcl_copper_exposed.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, - _mcl_stripped_variant = "mcl_copper:block", + _mcl_stripped_variant = "mcl_copper:block_exposed", }) minetest.register_node("mcl_copper:block_weathered", { @@ -79,11 +81,12 @@ minetest.register_node("mcl_copper:block_weathered", { _doc_items_longdesc = S("Weathered copper is a decorative block."), tiles = {"mcl_copper_weathered.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, - _mcl_copper_waxed_variant = "mcl_copper:waxed_block_weathered", + _mcl_oxidized_variant = "mcl_copper:block_oxidized", + _mcl_waxed_variant = "mcl_copper:waxed_block_weathered", _mcl_stripped_variant = "mcl_copper:block_exposed", }) @@ -92,11 +95,11 @@ minetest.register_node("mcl_copper:waxed_block_weathered", { _doc_items_longdesc = S("Weathered copper is a decorative block."), tiles = {"mcl_copper_weathered.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, - _mcl_stripped_variant = "mcl_copper:block_exposed", + _mcl_stripped_variant = "mcl_copper:block_weathered", }) minetest.register_node("mcl_copper:block_oxidized", { @@ -108,7 +111,7 @@ minetest.register_node("mcl_copper:block_oxidized", { sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, - _mcl_copper_waxed_variant = "mcl_copper:waxed_block_oxidized", + _mcl_waxed_variant = "mcl_copper:waxed_block_oxidized", _mcl_stripped_variant = "mcl_copper:block_weathered", }) @@ -117,11 +120,11 @@ minetest.register_node("mcl_copper:waxed_block_oxidized", { _doc_items_longdesc = S("Oxidized copper is a decorative block."), tiles = {"mcl_copper_oxidized.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, - _mcl_stripped_variant = "mcl_copper:block_weathered", + _mcl_stripped_variant = "mcl_copper:block_oxidized", }) minetest.register_node("mcl_copper:block_cut", { @@ -129,11 +132,12 @@ minetest.register_node("mcl_copper:block_cut", { _doc_items_longdesc = S("Cut copper is a decorative block."), tiles = {"mcl_copper_block_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, - _mcl_copper_waxed_variant = "mcl_copper:waxed_block_cut", + _mcl_oxidized_variant = "mcl_copper:block_exposed_cut", + _mcl_waxed_variant = "mcl_copper:waxed_block_cut", }) minetest.register_node("mcl_copper:waxed_block_cut", { @@ -141,7 +145,7 @@ minetest.register_node("mcl_copper:waxed_block_cut", { _doc_items_longdesc = S("Cut copper is a decorative block."), tiles = {"mcl_copper_block_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -153,11 +157,12 @@ minetest.register_node("mcl_copper:block_exposed_cut", { _doc_items_longdesc = S("Exposed cut copper is a decorative block."), tiles = {"mcl_copper_exposed_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, - _mcl_copper_waxed_variant = "mcl_copper:waxed_block_exposed_cut", + _mcl_waxed_variant = "mcl_copper:waxed_block_exposed_cut", + _mcl_oxidized_variant = "mcl_copper:block_weathered_cut", _mcl_stripped_variant = "mcl_copper:block_cut", }) @@ -166,11 +171,11 @@ minetest.register_node("mcl_copper:waxed_block_exposed_cut", { _doc_items_longdesc = S("Exposed cut copper is a decorative block."), tiles = {"mcl_copper_exposed_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, - _mcl_stripped_variant = "mcl_copper:block_cut", + _mcl_stripped_variant = "mcl_copper:block_exposed_cut", }) minetest.register_node("mcl_copper:block_weathered_cut", { @@ -178,12 +183,13 @@ minetest.register_node("mcl_copper:block_weathered_cut", { _doc_items_longdesc = S("Weathered cut copper is a decorative block."), tiles = {"mcl_copper_weathered_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, _mcl_stripped_variant = "mcl_copper:block_exposed_cut", - _mcl_copper_waxed_variant = "mcl_copper:waxed_block_weathered_cut", + _mcl_oxidized_variant = "mcl_copper:block_oxidized_cut", + _mcl_waxed_variant = "mcl_copper:waxed_block_weathered_cut", }) minetest.register_node("mcl_copper:waxed_block_weathered_cut", { @@ -191,11 +197,11 @@ minetest.register_node("mcl_copper:waxed_block_weathered_cut", { _doc_items_longdesc = S("Weathered cut copper is a decorative block."), tiles = {"mcl_copper_weathered_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, - _mcl_stripped_variant = "mcl_copper:block_exposed_cut", + _mcl_stripped_variant = "mcl_copper:block_weathered_cut", }) minetest.register_node("mcl_copper:block_oxidized_cut", { @@ -208,7 +214,7 @@ minetest.register_node("mcl_copper:block_oxidized_cut", { _mcl_blast_resistance = 6, _mcl_hardness = 5, _mcl_stripped_variant = "mcl_copper:block_weathered_cut", - _mcl_copper_waxed_variant = "mcl_copper:waxed_block_oxidized_cut", + _mcl_waxed_variant = "mcl_copper:waxed_block_oxidized_cut", }) minetest.register_node("mcl_copper:waxed_block_oxidized_cut", { @@ -216,50 +222,50 @@ minetest.register_node("mcl_copper:waxed_block_oxidized_cut", { _doc_items_longdesc = S("Oxidized cut copper is a decorative block."), tiles = {"mcl_copper_oxidized_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, - _mcl_stripped_variant = "mcl_copper:block_weathered_cut", + _mcl_stripped_variant = "mcl_copper:block_oxidized_cut", }) mcl_stairs.register_slab("copper_cut", "mcl_copper:block_cut", - {pickaxey = 2}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Slab of Cut Copper"), nil, nil, nil, S("Double Slab of Cut Copper")) mcl_stairs.register_slab("waxed_copper_cut", "mcl_copper:waxed_block_cut", - {pickaxey = 2}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Waxed Slab of Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Cut Copper")) mcl_stairs.register_slab("copper_exposed_cut", "mcl_copper:block_exposed_cut", - {pickaxey = 2}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Slab of Exposed Cut Copper"), nil, nil, nil, S("Double Slab of Exposed Cut Copper")) mcl_stairs.register_slab("waxed_copper_exposed_cut", "mcl_copper:waxed_block_exposed_cut", - {pickaxey = 2}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Waxed Slab of Exposed Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Exposed Cut Copper")) mcl_stairs.register_slab("copper_weathered_cut", "mcl_copper:block_weathered_cut", - {pickaxey = 2}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Slab of Weathered Cut Copper"), nil, nil, nil, S("Double Slab of Weathered Cut Copper")) mcl_stairs.register_slab("waxed_copper_weathered_cut", "mcl_copper:waxed_block_weathered_cut", - {pickaxey = 2}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Waxed Slab of Weathered Cut Copper"), nil, nil, nil, @@ -273,49 +279,49 @@ mcl_stairs.register_slab("copper_oxidized_cut", "mcl_copper:block_oxidized_cut", S("Double Slab of Oxidized Cut Copper")) mcl_stairs.register_slab("waxed_copper_oxidized_cut", "mcl_copper:waxed_block_oxidized_cut", - {pickaxey = 2}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Waxed Slab of Oxidized Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Oxidized Cut Copper")) mcl_stairs.register_stair("copper_cut", "mcl_copper:block_cut", - {pickaxey = 2}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Stairs of Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_cut", "mcl_copper:waxed_block_cut", - {pickaxey = 2}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Waxed Stairs of Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_exposed_cut", "mcl_copper:block_exposed_cut", - {pickaxey = 2}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Stairs of Exposed Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_exposed_cut", "mcl_copper:waxed_block_exposed_cut", - {pickaxey = 2}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Waxed Stairs of Exposed Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_weathered_cut", "mcl_copper:block_weathered_cut", - {pickaxey = 2}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Stairs of Weathered Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_weathered_cut", "mcl_copper:waxed_block_weathered_cut", - {pickaxey = 2}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Waxed Stairs of Weathered Cut Copper"), nil, 6, nil, @@ -329,7 +335,7 @@ mcl_stairs.register_stair("copper_oxidized_cut", "mcl_copper:block_oxidized_cut" "woodlike") mcl_stairs.register_stair("waxed_copper_oxidized_cut", "mcl_copper:waxed_block_oxidized_cut", - {pickaxey = 2}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Waxed Stairs of Oxidized Cut Copper"), nil, 6, nil, diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr b/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr index 9a53caa51..e66d8b115 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr @@ -10,7 +10,7 @@ A block of iron is mostly a decorative block but also useful as a compact storag A cactus can only be placed on top of another cactus or any sand.=Un cactus ne peut être placé que sur un autre cactus ou du sable. A decorative and mostly transparent block.=Un bloc décoratif et surtout transparent. 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.=Un bloc d'herbe est de la terre avec une couverture d'herbe. Les blocs d'herbe sont des blocs ingénieux qui permettent la croissance de toutes sortes de plantes. Ils peuvent être transformés en terres agricoles avec une houe et transformés en chemins d'herbe avec une pelle. À la lumière, l'herbe se propage lentement sur la terre à proximité. Sous un bloc opaque ou un liquide, un bloc d'herbe peut redevenir terre. -A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli.=Un bloc de lapis-lazuli est principalement un bloc décoratif mais également utile comme stockage compact de lapis-lazuli. +A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli.=Un bloc de lapis-lazuli est principalement un bloc décoratif mais également utile pour stocker du lapis-lazuli. A lava source sets fire to a couple of air blocks above when they're next to a flammable block.=Une source de lave met le feu à quelques blocs d'air au-dessus lorsqu'ils sont à côté d'un bloc inflammable. 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.=Un morceau d'échelle qui vous permet de grimper verticalement. Les échelles ne peuvent être placées que sur le côté de blocs solides et non sur du verre, des feuilles, de la glace, des dalles, des pierres incandescentes ou des lanternes marines. Acacia Bark=Bois d'acacia @@ -18,36 +18,36 @@ Acacia Leaves=Feuilles d'acacia Acacia Sapling=Pousse d'acacia Acacia Wood=Bûche d'acacia Acacia Wood Planks=Planches d'acacia -Acacia leaves are grown from acacia trees.=Les feuilles d'acacia sont cultivées à partir d'acacias. +Acacia leaves are grown from acacia trees.=Les feuilles d'acacia poussent sur des acacias. Andesite=Andésite Andesite is an igneous rock.=L'andésite est une roche ignée. Apple=Pomme Apples are food items which can be eaten.=Les pommes sont des aliments qui peuvent être consommés. Barrier=Barrière invisible -Barriers are invisible 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.=Les barrières sont des blocs accessibles à pied. Ils sont utilisés pour créer des limites de cartes d'aventure et similaires. Les monstres et les animaux n'apparaissent pas sur les barrières, et les clôtures ne se connectent pas aux barrières. D'autres blocs peuvent être construits sur des barrières comme sur n'importe quel autre bloc. +Barriers are invisible 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.=Les barrières sont des blocs accessibles à pied. Elles sont utilisées pour créer des limites de cartes d'aventure et autre. Les monstres et les animaux n'apparaissent pas sur les barrières, et les clôtures ne se connectent pas aux barrières. D'autres blocs peuvent être construits sur des barrières comme sur n'importe quel autre bloc. Bedrock=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.=Le bedrock est un type de roche très dur. Il ne peut pas être brisé, détruit, collecté ou déplacé par des moyens normaux, sauf en mode créatif. +Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.=La bedrock est un type de roche très dure. Elle ne peut pas être brisée, détruite, collectée ou déplacée par des moyens normaux, sauf en mode créatif. Birch Bark=Bois de bouleau Birch Leaves=Feuilles de bouleau Birch Sapling=Pousse de bouleau Birch Wood=Bûche de bouleau Birch Wood Planks=Planches de bouleau -Birch leaves are grown from birch trees.=Les feuilles de bouleau sont cultivées à partir de bouleaux. +Birch leaves are grown from birch trees.=Les feuilles de bouleau poussent sur les bouleaux. Black Stained Glass=Verre noir Block of Coal=Bloc de charbon Block of Diamond=Bloc de diamant Block of Emerald=Bloc d'émeraude Block of Gold=Bloc d'or Block of Iron=Bloc de fer -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.=Les blocs de charbon sont utiles comme stockage compact de charbon et très utiles comme combustible de four. Un bloc de charbon est aussi efficace que 10 charbon. +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.=Les blocs de charbon sont utiles pour stocker du charbon et très utiles comme combustible de four. Un bloc de charbon est aussi efficace que 10 charbon. Blue Stained Glass=Verre bleu Bone Block=Bloc d'os -Bone blocks are decorative blocks and a compact storage of bone meal.=Les blocs d'os sont des blocs décoratifs et un stockage compact de poudre d'os. +Bone blocks are decorative blocks and a compact storage of bone meal.=Les blocs d'os sont des blocs décoratifs et servent à stocker la poudre d'os. Bowl=Bol Bowls are mainly used to hold tasty soups.=Les bols sont principalement utilisés pour contenir de délicieuses soupes. Brick=Brique Brick Block=Bloc de brique -Brick blocks are a good building material for building solid houses and can take quite a punch.=Les blocs de briques sont un bon matériau de construction pour la construction de maisons solides et peuvent resite au coup. +Brick blocks are a good building material for building solid houses and can take quite a punch.=Les blocs de briques sont un bon matériau de construction pour la construction de maisons solides et peuvent résister aux coups. Bricks are used to craft brick blocks.=Les briques sont utilisées pour fabriquer des blocs de briques. Brown Stained Glass=Verre marron Cactus=Cactus @@ -80,14 +80,14 @@ Dark Oak Leaves=Feuilles de chêne noir Dark Oak Sapling=Pousse de chêne noir Dark Oak Wood=Bûche de chêne noir Dark Oak Wood Planks=Planche de chêne noir -Dark oak leaves are grown from dark oak trees.=Les feuilles de chêne noir sont issues de chênes noirs. -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.=Les pousses de chêne noir peuvent devenir des chênes noirs, mais seulement en groupes. Une pousse de chêne noir solitaire ne poussera pas. Un groupe de quatre pousses de chêne noir se transforme en chêne noir après un certain temps lorsqu'ils sont placés sur le sol (comme la terre) dans un carré 2×2 et exposés à la lumière. +Dark oak leaves are grown from dark oak trees.=Les feuilles de chêne noir poussent sur les chênes noirs. +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.=Les pousses de chêne noir peuvent devenir des chênes noirs, mais seulement en groupes. Une pousse de chêne noir solitaire ne poussera pas. Un groupe de quatre pousses de chêne noir se transforme en chêne noir après un certain temps lorsqu'elles sont placées sur le sol (comme la terre) dans un carré 2×2 et exposés à la lumière. Dead Bush=Arbuste mort Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks.=Les buissons morts sont des plantes inhabituelles que l'on trouve souvent dans les zones sèches. Ils peuvent être récoltés avec des bâtons. Diamond=Diamant Diamond Ore=Minerai de diamant Diamond ore is rare and can be found in clusters near the bottom of the world.=Le minerai de diamant est rare et peut être trouvé en filons près du fond du monde. -Diamonds are precious minerals and useful to create the highest tier of armor and tools.=Les diamants sont des minéraux précieux et utiles pour créer le plus haut niveau d'armure et d'outils. +Diamonds are precious minerals and useful to create the highest tier of armor and tools.=Les diamants sont des minéraux précieux et utiles pour créer des armures et outils du plus haut niveau . Diorite=Diorite Diorite is an igneous rock.=La diorite est une roche ignée. Dirt=Terre @@ -101,12 +101,12 @@ Flint is a raw material.=Le silex est une matière première. Flowing Lava=Lave qui coule Flowing Water=Eau qui coule Frosted Ice=Glace givrée -Frosted ice is a short-lived solid block. It melts into a water source within a few seconds.=La glace givrée est un bloc solide de courte durée. Il fond dans une source d'eau en quelques secondes. +Frosted ice is a short-lived solid block. It melts into a water source within a few seconds.=La glace givrée est un bloc solide de courte durée. Elle fond dans une source d'eau en quelques secondes. Glass=Verre Gold Ingot=Lingot d'or Gold Nugget=Pépite d'or Gold Ore=Minerai d'or -Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.=Les pépites d'or sont de très petites pièces d'or en fusion; le but principal est de créer des lingots d'or. +Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.=Les pépites d'or sont de très petites pièces d'or en fusion ; le but principal est de créer des lingots d'or. Golden Apple=Pomme dorée Golden apples are precious food items which can be eaten.=Les pommes dorées sont des aliments précieux qui peuvent être consommés. Granite=Granite @@ -117,18 +117,18 @@ Gravel=Gravier Green Stained Glass=Verre vert Grey Stained Glass=Verre gris Ice=Glace -Ice is a 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.=La glace est un bloc solide que l'on trouve généralement dans les régions froides. Il fond près des sources de lumière de bloc à un niveau de lumière de 12 ou plus. Lorsqu'il fond ou se casse en se reposant sur un autre bloc, il se transforme en source d'eau. +Ice is a 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.=La glace est un bloc solide que l'on trouve généralement dans les régions froides. Elle fond près des blocs sources de lumière à un niveau de lumière de 12 ou plus. Lorsqu'elle fond ou se casse au sommet d'un autre bloc, elle se transforme en source d'eau. In the End dimension, starting a fire on this block will create an eternal fire.=Dans la dimension End, démarrer un feu sur ce bloc créera un feu éternel. Iron Ingot=Lingot de fer Iron Nugget=Pépite de fer Iron Ore=Minerai de fer -Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots.=Les pépites de fer sont de très petits morceaux de fer fondu; le but principal est de créer des lingots de fer. +Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots.=Les pépites de fer sont de très petits morceaux de fer fondu ; leur principal intérêt est de fabriquer des lingots de fer. Jungle Bark=Bois d'acajou Jungle Leaves=Feuilles d'acajou Jungle Sapling=Pousse d'acajou Jungle Wood=Bûche d'acajou Jungle Wood Planks=Planches d'acajou -Jungle leaves are grown from jungle trees.=Les feuilles d'acajou sont cultivées à partir d'arbres d'acajou. +Jungle leaves are grown from jungle trees.=Les feuilles d'acajou poussent sur les acajous. Ladder=Échelle Lapis Lazuli=Lapis-lazuli Lapis Lazuli are required for enchanting items on an enchanting table.=Les lapis-lazuli sont nécessaires pour enchanter des objets sur une table d'enchantement. @@ -153,10 +153,10 @@ Oak Leaves=Feuilles de chêne Oak Sapling=Pousse de chêne Oak Wood=Bûche de chêne Oak Wood Planks=Planches de chêne -Oak leaves are grown from oak trees.=Les feuilles de chêne sont cultivées à partir de chênes. +Oak leaves are grown from oak trees.=Les feuilles de chêne poussent sur des chênes. Obsidian=Obsidienne Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava.=L'obsidienne est un minéral extrêmement dur avec une énorme résistance à l'explosion. L'obsidienne se forme lorsque l'eau rencontre la lave. -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.=L'un des blocs les plus courants au monde, presque tout le sous-sol est en pierre. Il contient parfois des minerais. La pierre peut être créée lorsque l'eau rencontre la lave. +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.=L'un des blocs les plus courants au monde, presque tout le sous-sol est en pierre. Elle contient parfois des minerais. La pierre peut être créée lorsque l'eau rencontre la lave. Orange Stained Glass=Verre orange Packed Ice=Glace compactée Packed ice is a compressed form of ice. It is opaque and solid.=La glace compactée est une forme de glace comprimée. Elle est opaque et solide. @@ -186,23 +186,23 @@ Sand is found in large quantities at beaches and deserts.=Le sable se trouve en Sandstone=Grès Sandstone is compressed sand and is a rather soft kind of stone.=Le grès est du sable comprimé et est un type de pierre plutôt tendre. Slime Block=Bloc de Slime -Slime blocks are very bouncy and prevent fall damage.=Les blocs de slime sont gonflables et empêchent les dégats de chute. +Slime blocks are very bouncy and prevent fall damage.=Les blocs de slime sont gonflables et empêchent les dégâts de chute. Smooth Red Sandstone=Grès rouge lisse Smooth Sandstone=Grès lisse Smooth red sandstone is a decorative building block.=Le grès rouge lisse est un bloc de construction décoratif. Smooth sandstone is compressed sand and is a rather soft kind of stone.=Le grès lisse est du sable comprimé et est un type de pierre plutôt tendre. Snow=Neige -Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=Du charbon contenu dans la pierre, il est très commun et peut être trouvé à l'intérieur de la pierre en grappes moyennes à grandes à presque toutes les hauteurs. +Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=Du charbon contenu dans la pierre, il est très commun et peut être trouvé à l'intérieur de la pierre en veines moyennes à grandes à presque toutes les hauteurs. Some iron contained in stone, it is prety common and can be found below sea level.=Du fer contenu dans la pierre, il est assez courant et se trouve sous le niveau de la mer. Spruce Bark=Bois de sapin Spruce Leaves=Feuilles de sapin Spruce Sapling=Pousse de sapin Spruce Wood=Bûche de sapin Spruce Wood Planks=Planches de sapin -Spruce leaves are grown from spruce trees.=Les feuilles de sapin sont cultivées à partir de sapin. +Spruce leaves are grown from spruce trees.=Les feuilles de sapin poussent sur les sapins. Stained glass is a decorative and mostly transparent block which comes in various different colors.=Le verre est un bloc décoratif et principalement transparent qui se décline en différentes couleurs. Stick=Bâton -Sticks are a very versatile crafting material; used in countless crafting recipes.=Les bâtons sont un matériau d'artisanat très polyvalent; utilisé dans d'innombrables recettes d'artisanat. +Sticks are a very versatile crafting material; used in countless crafting recipes.=Les bâtons sont un matériau d'artisanat très polyvalent ; utilisé dans d'innombrables recettes d'artisanat. Stone=Roche Stripped Acacia Log=Bûche d'acacia écorcée Stripped Acacia Wood=Bois d'acacia écorcé @@ -240,25 +240,25 @@ The stripped wood of a dark oak tree.=Le bois écorcé d'un chêne noir. The stripped wood of a jungle tree.=Le bois écorcé d'un acajou. The stripped wood of an oak tree.=Le bois écorcé d'un chêne. The stripped wood of a spruce tree.=Le bois écorcé d'un sapin. -This block consists of a couple of loose stones and can't support itself.=Ce bloc se compose de quelques pierres lâches et ne peut pas se soutenir. +This block consists of a couple of loose stones and can't support itself.=Ce bloc se compose de quelques pierres instables et ne peut pas se soutenir. This is a decorative block surrounded by the bark of a tree trunk.=Il s'agit d'un bloc décoratif entouré par l'écorce d'un tronc d'arbre. This is a decorative block.=Il s'agit d'un bloc décoratif. This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.=Ceci est un bloc de neige complet. La neige de cette épaisseur se trouve généralement dans les zones de froid extrême. 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.=Il s'agit d'un morceau de cactus que l'on trouve couramment dans les zones sèches, en particulier dans les déserts. Au fil du temps, les cactus pousseront jusqu'à 3 blocs de haut sur le sable ou le sable rouge. Un cactus blesse les êtres vivants qui le touchent avec des dégâts de 1 HP toutes les demi-secondes. Lorsqu'un bloc de cactus est brisé, tous les blocs de cactus connectés au-dessus se brisent également. This stone contains pure gold, a rare metal.=Cette pierre contient de l'or pur, un métal rare. Top Snow=neige -Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.=La neige est une couche de neige. Il fond près de sources lumineuses autres que le soleil avec un niveau de lumière de 12 ou plus. +Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.=La neige est une couche de neige. Elle fond près de sources lumineuses autres que le soleil avec un niveau de lumière de 12 ou plus. Vines=Lianes -Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread.=Les lianes sont des blocs grimpants qui peuvent être placés sur les côtés de blocs pleins. Les lianes poussent et s'étendent lentement. +Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread.=Les lianes sont des blocs grimpables qui peuvent être placés sur les côtés de blocs pleins. Les lianes poussent et s'étendent lentement. Void=Néant Water=Eau Water Source=Source d'eau 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.=L'eau est abondante dans les océans et apparaît également dans quelques sources dans le sol. Vous pouvez nager facilement dans l'eau, mais vous devez de temps en temps reprendre votre souffle. -When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.=Lorsqu'il est placé sur le sol (comme la terre) et exposé à la lumière, un jeune arbre de bouleau se transforme en bouleau après un certain temps. -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.=Lorsqu'il est placé sur le sol (comme la terre) et exposé à la lumière, une pousse d'Acajou se transforme en arbre d'Acajou après un certain temps. Quand il y a 4 pousses d'Acajou dans un carré 2×2, ils deviendront un énorme arbre d'Acajou. -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.=Lorsqu'il est placé sur le sol (comme la terre) et exposé à la lumière, un pousse de sapin se transforme en sapin après un certain temps. Lorsqu'il y a 4 pousses de sapin dans un carré 2×2, elles deviendront un énorme sapin. -When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.=Lorsqu'il est placé sur le sol (comme la terre) et exposé à la lumière, un pousse d'acacia se développera en un acacia après un certain temps. -When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time.=Lorsqu'il est placé sur le sol (comme la terre) et exposé à la lumière, une pousse de chêne se transforme en chêne après un certain temps. +When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.=Lorsqu'elle est placée sur le sol (par exemple de la terre) et exposée à la lumière, une jeune pousse de bouleau se transforme en bouleau après un certain temps. +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.=Lorsqu'elle est placée sur le sol (par exemple de la terre) et exposée à la lumière, une pousse d'Acajou se transforme en arbre d'Acajou après un certain temps. Quand il y a 4 pousses d'Acajou dans un carré 2×2, elles deviendront un énorme arbre d'Acajou. +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.=Lorsqu'elle est placée sur le sol (par exemple de la terre) et exposée à la lumière, une pousse de sapin se transforme en sapin après un certain temps. Lorsqu'il y a 4 pousses de sapin dans un carré 2×2, elles deviendront un énorme sapin. +When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.=Lorsqu'elle est placée sur le sol (par exemple de la terre) et exposée à la lumière, une pousse d'acacia se transforme en acacia après un certain temps. +When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time.=Lorsqu'elle est placée sur le sol (par exemple de la terre) et exposée à la lumière, une pousse de chêne se transforme en chêne après un certain temps. When you hold a barrier in hand, you reveal all placed barriers in a short distance around you.=Lorsque vous tenez une barrière en main, vous révélez toutes les barrières placées à une courte distance autour de vous. White Stained Glass=Verre blanc Yellow Stained Glass=Verre jaune @@ -277,15 +277,15 @@ This block can only be placed on full solid blocks and on another top snow (whic Needs soil and water to grow=A besoin de terre et d'eau pour se développer Needs soil and light to grow=A besoin de terre et de lumière pour se développer Grows on sand=Pousse sur le sable -Contact damage: @1 per half second=Dégats de contact : @1 par demi-seconde +Contact damage: @1 per half second=Dégâts de contact : @1 par demi-seconde Slows down movement=Ralentit le mouvement -2×2 saplings required=2×2 pousses requis +2×2 saplings required=2×2 pousses requises 2×2 saplings @= large tree=2×2 pousses @= grand arbre Grows on sand or dirt next to water=Pousse sur le sable ou la terre près de l'eau Stackable=Empilable Crying Obsidian=Obsidienne pleureuse -Crying obsidian is a luminous obsidian that can generate as part of ruined portals.=L'obsidienne pleureuse est une obsidienne luminause qui peut être générée dans les portails en ruine. +Crying obsidian is a luminous obsidian that can generate as part of ruined portals.=L'obsidienne pleureuse est une obsidienne lumineuse qui peut être générée dans les portails en ruine. Enchanted Golden Apple=Pomme dorée enchantée Light=Lumière -Lights are invisible blocks. They are used to light up adventure maps and the like.=Les lumières sont des blocs invisibles. Ils sont utilisés pour éclairer les cartes d'aventure. +Lights are invisible blocks. They are used to light up adventure maps and the like.=Les lumières sont des blocs invisibles. Elles sont utilisées pour éclairer les cartes d'aventure. When you hold a light in hand, you reveal all placed lights in a short distance around you.=Lorsque vous tenez une lumière en main, vous révélez toutes les lumières placées à une courte distance autour de vous. diff --git a/mods/ITEMS/mcl_crimson/README.md b/mods/ITEMS/mcl_crimson/README.md new file mode 100644 index 000000000..45c475c11 --- /dev/null +++ b/mods/ITEMS/mcl_crimson/README.md @@ -0,0 +1,10 @@ +# Mineclone Crimson originally by debiankaios. Modified by MCL2 dev team + +Textures are from PixelPerfection other than: + +Exhale (License - CC-BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/): + +mcl_crimson_warped_hyphae_wood.png +mcl_crimson_warped_hyphae_wood_2nd.png +mcl_crimson_crimson_hyphae_wood.png +mcl_crimson_crimson_fungus.png \ No newline at end of file diff --git a/mods/ITEMS/mcl_crimson/init.lua b/mods/ITEMS/mcl_crimson/init.lua index 1c30c0fd5..03d0a7caa 100644 --- a/mods/ITEMS/mcl_crimson/init.lua +++ b/mods/ITEMS/mcl_crimson/init.lua @@ -5,6 +5,9 @@ local modpath = minetest.get_modpath(modname) -- by debiankaios -- adapted for mcl2 by cora +local wood_slab_groups = {handy = 1, axey = 1, flammable = 3, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, wood_slab = 1} +local wood_stair_groups = {handy = 1, axey = 1, flammable = 3, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, wood_stairs = 1} + local function generate_warped_tree(pos) minetest.place_schematic(pos,modpath.."/schematics/warped_fungus_1.mts","random",nil,false,"place_center_x,place_center_z") end @@ -331,7 +334,7 @@ minetest.register_node("mcl_crimson:warped_hyphae", { "mcl_crimson_warped_hyphae.png", "mcl_crimson_warped_hyphae.png", { - image="mcl_crimson_warped_hyphae_side.png", + name = "mcl_crimson_warped_hyphae_side.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0} }, }, @@ -370,7 +373,7 @@ minetest.register_node("mcl_crimson:warped_hyphae_bark", { _doc_items_longdesc = S("This is a decorative block surrounded by the bark of an hyphae."), tiles = { { - image="mcl_crimson_warped_hyphae_side.png", + name = "mcl_crimson_warped_hyphae_side.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0} }, }, @@ -434,7 +437,8 @@ minetest.register_node("mcl_crimson:warped_hyphae_wood", { _mcl_hardness = 2, }) -mcl_stairs.register_stair_and_slab_simple("warped_hyphae_wood", "mcl_crimson:warped_hyphae_wood", S("Warped Stair"), S("Warped Slab"), S("Double Warped Slab")) +mcl_stairs.register_stair("warped_hyphae_wood", "mcl_crimson:warped_hyphae_wood", wood_stair_groups, false, S("Warped Stair")) +mcl_stairs.register_slab("warped_hyphae_wood", "mcl_crimson:warped_hyphae_wood", wood_slab_groups, false, S("Warped Slab")) minetest.register_craft({ output = "mcl_crimson:warped_hyphae_wood 4", @@ -525,7 +529,7 @@ minetest.register_node("mcl_crimson:crimson_hyphae", { "mcl_crimson_crimson_hyphae.png", "mcl_crimson_crimson_hyphae.png", { - image="mcl_crimson_crimson_hyphae_side.png", + name = "mcl_crimson_crimson_hyphae_side.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0} }, }, @@ -545,7 +549,7 @@ minetest.register_node("mcl_crimson:crimson_hyphae_bark", { _doc_items_longdesc = S("This is a decorative block surrounded by the bark of an hyphae."), tiles = { { - image="mcl_crimson_crimson_hyphae_side.png", + name = "mcl_crimson_crimson_hyphae_side.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0} }, }, @@ -643,7 +647,8 @@ minetest.register_craft({ }, }) -mcl_stairs.register_stair_and_slab_simple("crimson_hyphae_wood", "mcl_crimson:crimson_hyphae_wood", S("Crimson Stair"), S("Crimson Slab"), S("Double Crimson Slab")) +mcl_stairs.register_stair("crimson_hyphae_wood", "mcl_crimson:crimson_hyphae_wood", wood_stair_groups, false, S("Crimson Stair")) +mcl_stairs.register_slab("crimson_hyphae_wood", "mcl_crimson:crimson_hyphae_wood", wood_slab_groups, false, S("Crimson Slab")) mcl_dye.register_on_bone_meal_apply(function(pt,user) if not pt.type == "node" then return end diff --git a/mods/ITEMS/mcl_crimson/locale/mcl_crimson.fr.tr b/mods/ITEMS/mcl_crimson/locale/mcl_crimson.fr.tr index 4a84dd5a6..16521d6a3 100644 --- a/mods/ITEMS/mcl_crimson/locale/mcl_crimson.fr.tr +++ b/mods/ITEMS/mcl_crimson/locale/mcl_crimson.fr.tr @@ -1,29 +1,51 @@ # textdomain: mcl_crimson -Warped Fungus Mushroom=Champignon tordu +Warped Fungus=Champignon tordu +Warped fungus is a mushroom found in the nether's warped forest.=Les champignons tordus se trouvent dans la forêt tordue du nether. Twisting Vines=Liane tordue +Weeping Vines=Liane pleureuse Nether Sprouts=Racines du Nether Warped Roots=Racines tordues Warped Wart Block=Bloc de verrues tordu Shroomlight=Champilampe Warped Hyphae=Tige tordue +The stem of a warped hyphae=La tige d'un champignon géant tordu Warped Hyphae Bark=Hyphe tordue -Stripped warped hyphae=Tige tordue dénudée -Stripped warped hyphae bark=Hyphe tordue dénudée +This is a decorative block surrounded by the bark of an hyphae.=Ceci est un bloc décoratif entouré de l'écorce d'une tige +Stripped Warped Hyphae=Tige tordue dénudée +The stripped hyphae of a warped fungus=La tige dénudée d'un champignon géant tordu +Stripped Warped Hyphae Bark=Hyphe tordue dénudée +The stripped hyphae bark of a warped fungus=La tige dénudée d'un champignon géant tordu Warped Nylium=Nylium tordu Warped Checknode - only to check!=Bloc de vérification tordu - seulement pour vérifier ! Warped Hyphae Wood=Planches tordues Warped Stair=Escalier tordu Warped Slab=Dalle tordue -Crimson Fungus Mushroom=Champignon écarlate +Crimson Fungus=Champignon écarlate +Crimson fungus is a mushroom found in the nether's crimson forest.=Les champignons écarlates se trouvent dans la forêt écarlate du nether. Crimson Roots=Racines écarlates Crimson Hyphae=Tige écarlate +The stem of a crimson hyphae=La tige d'un champignon géant écarlate Crimson Hyphae Bark=Hyphe écarlate Stripped Crimson Hyphae=Tige écarlate dénudée +The stripped stem of a crimson hyphae=La tige dénudée d'un champignon géant écarlate Stripped Crimson Hyphae Bark=Hyphe écarlate dénudée +The stripped wood of a crimson hyphae=La tige dénudée d'un champignon géant écarlate Crimson Hyphae Wood=Planches écarlates Crimson Stair=Escalier écarlate Crimson Slab=Dalle écarlate Double Crimson Slab=Dalle double écarlate Crimson Nylium=Nylium écarlate +Crimson Door=Porte écarlate +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Les portes en bois sont des barrières hautes à 2 blocs qui peuvent être ouvertes ou fermées à la main et par un signal redstone. +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Pour ouvrir ou fermer une porte en bois, faites un clic droit dessus ou fournissez à sa moitié inférieure un signal redstone. +Crimson Trapdoor=Trappe écarlate +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.=es trappes en bois sont des barrières horizontales qui peuvent être ouvertes et fermées à la main ou par un signal redstone. Ils occupent la partie supérieure ou inférieure d'un bloc, selon la façon dont ils ont été placés. Lorsqu'elles sont ouvertes, elles peuvent être montées comme une échelle. +To open or close the trapdoor, rightclick it or send a redstone signal to it.=Pour ouvrir ou fermer la trappe, faites un clic droit dessus ou envoyez-lui un signal redstone. +Crimson Fence=Barrière écarlate +Crimson Fence Gate=Portillon écarlate Crimson Checknode - only to check!=Bloc de vérification écarlate - seulement pour vérifier ! +Warped Door=Porte tordue +Warped Trapdoor=Trappe tordue +Warped Fence=Barrière tordue +Warped Fence Gate=Portillon tordu diff --git a/mods/ITEMS/mcl_crimson/locale/template.txt b/mods/ITEMS/mcl_crimson/locale/template.txt index 022a9a6dc..f93b85577 100644 --- a/mods/ITEMS/mcl_crimson/locale/template.txt +++ b/mods/ITEMS/mcl_crimson/locale/template.txt @@ -1,29 +1,51 @@ # textdomain: mcl_crimson -Warped Fungus Mushroom= +Warped Fungus= +Warped fungus is a mushroom found in the nether's warped forest.= Twisting Vines= +Weeping Vines= Nether Sprouts= Warped Roots= Warped Wart Block= Shroomlight= Warped Hyphae= +The stem of a warped hyphae= Warped Hyphae Bark= -Stripped warped hyphae= -Stripped warped hyphae bark= +This is a decorative block surrounded by the bark of an hyphae.= +Stripped Warped Hyphae= +The stripped hyphae of a warped fungus= +Stripped Warped Hyphae Bark= +The stripped hyphae bark of a warped fungus= Warped Nylium= Warped Checknode - only to check!= Warped Hyphae Wood= Warped Stair= Warped Slab= -Crimson Fungus Mushroom= +Crimson Fungus= +Crimson fungus is a mushroom found in the nether's crimson forest.= Crimson Roots= Crimson Hyphae= +The stem of a crimson hyphae= Crimson Hyphae Bark= Stripped Crimson Hyphae= +The stripped stem of a crimson hyphae= Stripped Crimson Hyphae Bark= +The stripped wood of a crimson hyphae= Crimson Hyphae Wood= Crimson Stair= Crimson Slab= Double Crimson Slab= Crimson Nylium= +Crimson Door= +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.= +Crimson 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.= +Crimson Fence= +Crimson Fence Gate= Crimson Checknode - only to check!= +Warped Door= +Warped Trapdoor= +Warped Fence= +Warped Fence Gate= diff --git a/mods/ITEMS/mcl_crimson/mod.conf b/mods/ITEMS/mcl_crimson/mod.conf index 89c60cd1e..b4303cd48 100644 --- a/mods/ITEMS/mcl_crimson/mod.conf +++ b/mods/ITEMS/mcl_crimson/mod.conf @@ -1,3 +1,3 @@ name = mcl_crimson -author = debiankaios +author = debiankaios, Exhale depends = mcl_core, mcl_stairs, mobs_mc, mcl_util, mcl_dye, mcl_flowerpots diff --git a/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.fr.tr b/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.fr.tr index d79146701..18fcc415b 100644 --- a/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.fr.tr +++ b/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.fr.tr @@ -28,7 +28,7 @@ Deepslate iron ore is a variant of iron ore that can generate in deepslate and t Deepslate Iron Ore=Minerai de fer de l'ardoise des abîmes Deepslate is a stone type found deep underground in the Overworld that functions similar to regular stone but is harder than the stone.=L'ardoise des abîmes est un type de roche présente dans les profondeurs de l'Overworld qui fonctionne de manière similaire à la roche classique mais en plus dur. Deepslate Lapis Lazuli Ore=Minerai de lapis-lazuli de l'ardoise des abîmes -Deepslate lapis ore is a variant of lapis ore that can generate in deepslate and tuff blobs.=Le minerai de lapis de l'ardoise des abîmes est une variante de minerai de lapis-lazuli qui apparaît dans l'ardoise des abîmes et les filons de tuf. +Deepslate lapis lazuli ore is a variant of lapis lazuli ore that can generate in deepslate and tuff blobs.=Le minerai de lapis-lazuli de l'ardoise des abîmes est une variante de minerai de lapis-lazuli qui apparaît dans l'ardoise des abîmes et les filons de tuf. Deepslate redstone ore is a variant of redstone ore that can generate in deepslate and tuff blobs.=Le minerai de redstone de l'ardoise des abîmes est une variante de minerai de redstone qui apparaît dans l'ardoise des abîmes et les filons de tuf. Deepslate Redstone Ore=Minerai de Redstone de l'ardoise des abîmes Deepslate tiles are a decorative variant of deepslate.=L'ardoise des abîmes carrelée est une variante décorative de l'ardoise des abîmes. @@ -50,4 +50,4 @@ Polished Deepslate Stairs=Escalier d'ardoise des abîmes Polished Deepslate Wall=Muret d'ardoise des abîmes Polished Deepslate=Ardoise des abîmes polie Tuff=Tuf -Tuff is an ornamental rock formed from volcanic ash, occurring in underground blobs below Y=16.=Le tuf est une roche ornementale formée de roche volcanique, apparraissant dans des blobs souterrains sous Y=16. +Tuff is an ornamental rock formed from volcanic ash, occurring in underground blobs below Y@=16.=Le tuf est une roche ornementale formée de roche volcanique, apparaissant dans des blobs souterrains sous Y@=16. diff --git a/mods/ITEMS/mcl_deepslate/locale/template.txt b/mods/ITEMS/mcl_deepslate/locale/template.txt index 44da92c66..781eae587 100644 --- a/mods/ITEMS/mcl_deepslate/locale/template.txt +++ b/mods/ITEMS/mcl_deepslate/locale/template.txt @@ -28,7 +28,7 @@ Deepslate iron ore is a variant of iron ore that can generate in deepslate and t Deepslate Iron Ore= Deepslate is a stone type found deep underground in the Overworld that functions similar to regular stone but is harder than the stone.= Deepslate Lapis Lazuli Ore= -Deepslate lapis ore is a variant of lapis ore that can generate in deepslate and tuff blobs.= +Deepslate lapis lazuli ore is a variant of lapis lazuli ore that can generate in deepslate and tuff blobs.= Deepslate redstone ore is a variant of redstone ore that can generate in deepslate and tuff blobs.= Deepslate Redstone Ore= Deepslate tiles are a decorative variant of deepslate.= @@ -50,4 +50,4 @@ Polished Deepslate Stairs= Polished Deepslate Wall= Polished Deepslate= Tuff= -Tuff is an ornamental rock formed from volcanic ash, occurring in underground blobs below Y=16.= +Tuff is an ornamental rock formed from volcanic ash, occurring in underground blobs below Y@=16.= diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.es.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.es.tr index 1a510815b..eca8efab4 100644 --- a/mods/ITEMS/mcl_doors/locale/mcl_doors.es.tr +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.es.tr @@ -20,3 +20,5 @@ Wooden trapdoors are horizontal barriers which can be opened and closed by hand To open or close the trapdoor, rightclick it or send a redstone signal to it.=Para abrir o cerrar la trampilla, haga clic derecho o envíele una señal de redstone. Iron Trapdoor=Trampilla de hierro 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.=Las trampillas de hierro son barreras horizontales que solo pueden abrirse y cerrarse mediante señales de redstone, no a mano. Ocupan la parte superior o inferior de un bloque, dependiendo de cómo se hayan colocado. Cuando están abiertos, se pueden subir como una escalera. +Openable by players and redstone power=Puede ser abierta por jugadores y energía de redstone +Openable by redstone power=Puede ser abierta por energía de redstone diff --git a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr index 58275f418..80912a711 100644 --- a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr +++ b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr @@ -23,9 +23,9 @@ Frost Walker=Semelles givrantes Impaling=Empalement Increases arrow damage.=Augmente les dégâts des flèches. Increases arrow knockback.=Augmente le recul de la flèche. -Increases certain block drops.=Multiplie les items droppés +Increases certain block drops.=Multiplie les objets droppés -Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Augmente les dégâts et applique la lenteur IV aux mobs arthropodes (araignées, araignées des cavernes, lépismes argentés et endermites). +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Augmente les dégâts et applique la lenteur IV aux mobs arthropodes (araignées, araignées des cavernes, poissons d'argent et endermites). Increases damage to undead mobs.=Augmente les dégâts infligés aux monstres morts-vivants. Increases damage.=Augmente les dégâts. @@ -95,7 +95,7 @@ Enchant an item=Enchanter un objet Enchanted Book=Livre enchanté Enchanting Table=Table d'enchantement -Enchanting Tables will let you enchant armors, tools, weapons, and books with various abilities. But, at the cost of some experience, and lapis lazuli.=La table d'enchantement vous permet d'enchanter des armueres, des outils, des armes et des livres avec diverses propriétés. Mais cela coûte de l'expérience et des lapis-lazuli. +Enchanting Tables will let you enchant armors, tools, weapons, and books with various abilities. But, at the cost of some experience, and lapis lazuli.=La table d'enchantement vous permet d'enchanter des armures, des outils, des armes et des livres avec diverses propriétés. Mais cela coûte de l'expérience et des lapis-lazuli. Enchanting succeded.=L'enchantement a réussi. Forcefully enchant an item=Enchantement forcé d'un objet @@ -113,14 +113,14 @@ The number you have entered (@1) is too small, it must be at least @2.=Le nombre The selected enchantment can't be added to the target item.=L'enchantement sélectionné ne peut pas être ajouté à la cible. The target doesn't hold an item.=La cible ne contient aucun élément. The target item is not enchantable.=L'objet cible n'est pas enchantable. -There is no such enchantment '@1'.=Il n'y a pas un tel enchantement '@1'. +There is no such enchantment '@1'.=L'enchantement '@1' n'existe pas. These options are randomized, and dependent on experience level; but the enchantment strength can be increased.=Ces options sont aléatoires et dépendent du niveau d'expérience ; mais la force d'enchantement peut être augmentée. To increase the enchantment strength, place bookshelves around the enchanting table. However, you will need to keep 1 air node between the table, & the bookshelves to empower the enchanting table.=Pour augmenter la force d'enchantement, placer des bibliothèques autour de la table d'enchantement. Cependant, vous devrez garder au moins un bloc d'air entre la table et les bibliothèques pour alimenter la table d'enchantement. Usage: /enchant []=Usage: /enchant [] -Usage: /forceenchant []=Usage: /forceenchant [] +Usage: /forceenchant []=Usage: /forceenchant [] ##### not used anymore ##### diff --git a/mods/ITEMS/mcl_end/end_crystal.lua b/mods/ITEMS/mcl_end/end_crystal.lua index b7882a155..78fe658b4 100644 --- a/mods/ITEMS/mcl_end/end_crystal.lua +++ b/mods/ITEMS/mcl_end/end_crystal.lua @@ -40,8 +40,8 @@ local function crystal_explode(self, puncher) mcl_damage.finish_reason(reason) source = reason.source end - mcl_explosions.explode(vector.add(self.object:get_pos(), {x = 0, y = 1.5, z = 0}), strength, {drop_chance = 1}, self.object, source) minetest.after(0, self.object.remove, self.object) + mcl_explosions.explode(vector.add(self.object:get_pos(), {x = 0, y = 1.5, z = 0}), strength, {drop_chance = 1}, self.object, source) end local function set_crystal_animation(self) diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr index 5174ce2ad..5b14b109b 100644 --- a/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr +++ b/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr @@ -31,6 +31,7 @@ Stone Hoe=Houe en pierre Iron Hoe=Houe en fer Golden Hoe=Houe en or Diamond Hoe=Houe en diamant +Netherite Hoe=Houe en netherite Melon Seeds=Graine de pastèque Grows into a melon stem which in turn grows melons. Chickens like melon seeds.=Se développe en une tige de pastèque qui à son tour forme des pastèques. Les poulets aiment les graines de pastèque. 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.=Placez les graines de pastèque sur les terres agricoles (qui peuvent être créées avec une houe) pour planter une tige de pastèque. Les tiges de pastèque poussent au soleil et se développent plus rapidement sur les terres agricoles hydratées. À maturité, la tige tentera de faire pousser une pastèque sur le côté. Faites un clic droit sur un animal pour le nourrir de graines de pastèque. @@ -77,12 +78,15 @@ Hydrated Farmland=Terres agricoles hydratées 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.=Les terres agricoles hydratées sont utilisées dans l'agriculture, c'est là que vous pouvez planter et faire pousser certaines plantes. Il est créé lorsque les terres agricoles sont sous la pluie ou près de l'eau. Sans eau, ce bloc finira par se dessécher. Ce bloc redeviendra de la terre lorsqu'un bloc solide apparaît au-dessus ou qu'un bras de piston s'étend au-dessus. Wheat Seeds=Graines de blé Grows into a wheat plant. Chickens like wheat seeds.=Se transforme en blé. Les poulets aiment les graines de blé. -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.=Placez les graines de blé sur les terres agricoles (qui peuvent être créées avec une houe) pour planter une plante de blé. Ils poussent au soleil et poussent plus vite sur les terres agricoles hydratées. Faites un clic droit sur un animal pour le nourrir de graines de blé. +Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant.=Placez les graines de blé sur les terres agricoles (qui peuvent être créées avec une houe) pour planter une plante de blé. +They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=Ils poussent au soleil et poussent plus vite sur les terres agricoles hydratées. Faites un clic droit sur un animal pour le nourrir de graines de blé. Premature Wheat Plant=Plant de blé Prématuré -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.=Les plants de blé prématurés poussent sur les terres agricoles sous la lumière du soleil en 8 étapes. Sur les terres agricoles hydratées, ils croissent plus rapidement. Ils peuvent être récoltés à tout moment mais ne rapporteront de bénéfices qu'à maturité. +Premature wheat plants grow on farmland under sunlight in 8 stages.=Les plants de blé prématurés poussent sur les terres agricoles sous la lumière du soleil en 8 étapes. +On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.=Sur les terres agricoles hydratées, ils croissent plus rapidement. Ils peuvent être récoltés à tout moment mais ne rapporteront de bénéfices qu'à maturité. Premature Wheat Plant (Stage @1)=Plant de blé prématuré (étape @1) Mature Wheat Plant=Plant de blé mature -Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.=Les plants de blé matures sont prêts à être récoltés pour le blé et les graines de blé. Ils ne grandiront plus. +Mature wheat plants are ready to be harvested for wheat and wheat seeds.=Les plants de blé matures sont prêts à être récoltés pour le blé et les graines de blé. +They won't grow any further.=Ils ne grandiront plus. Wheat=Blé Wheat is used in crafting. Some animals like wheat.=Le blé est utilisé dans l'artisanat. Certains animaux aiment le blé. Cookie=Cookie @@ -97,3 +101,5 @@ Turns block into farmland=Transforme un bloc en terres agricoles Surface for crops=Surface pour les cultures Can become wet=Peut devenir humide Uses: @1=Utilisations : @1 +Sweet Berry Bush (Stage @1)=Buisson de baies sucrées (étape 1) +Sweet Berry=Baie sucrée diff --git a/mods/ITEMS/mcl_farming/locale/template.txt b/mods/ITEMS/mcl_farming/locale/template.txt index 7359fefa6..bc81acce1 100644 --- a/mods/ITEMS/mcl_farming/locale/template.txt +++ b/mods/ITEMS/mcl_farming/locale/template.txt @@ -31,6 +31,7 @@ Stone Hoe= Iron Hoe= Golden Hoe= Diamond Hoe= +Netherite Hoe= 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.= @@ -77,12 +78,15 @@ Hydrated Farmland= 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.= +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 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.= +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= @@ -97,3 +101,5 @@ Turns block into farmland= Surface for crops= Can become wet= Uses: @1= +Sweet Berry Bush (Stage @1)= +Sweet Berry= diff --git a/mods/ITEMS/mcl_farming/wheat.lua b/mods/ITEMS/mcl_farming/wheat.lua index 44d82b566..15fd98e2a 100644 --- a/mods/ITEMS/mcl_farming/wheat.lua +++ b/mods/ITEMS/mcl_farming/wheat.lua @@ -5,10 +5,8 @@ minetest.register_craftitem("mcl_farming:wheat_seeds", { description = S("Wheat Seeds"), _tt_help = S("Grows on farmland"), _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. - ]]), + _doc_items_usagehelp = S("Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant.").."\n".. + S("They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds."), groups = {craftitem = 1, compostability = 30}, inventory_image = "mcl_farming_wheat_seeds.png", on_place = function(itemstack, placer, pointed_thing) @@ -31,10 +29,8 @@ for i=1,7 do if i == 1 then create = true 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. - ]]) + longdesc = S("Premature wheat plants grow on farmland under sunlight in 8 stages.").."\n".. + S("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 @@ -69,10 +65,8 @@ end minetest.register_node("mcl_farming:wheat", { 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. - ]]), + _doc_items_longdesc = S("Mature wheat plants are ready to be harvested for wheat and wheat seeds.").."\n".. + S("They won't grow any further."), sunlight_propagates = true, paramtype = "light", paramtype2 = "meshoptions", diff --git a/mods/ITEMS/mcl_fences/locale/mcl_fences.es.tr b/mods/ITEMS/mcl_fences/locale/mcl_fences.es.tr index 1e8c3798a..eff541f00 100644 --- a/mods/ITEMS/mcl_fences/locale/mcl_fences.es.tr +++ b/mods/ITEMS/mcl_fences/locale/mcl_fences.es.tr @@ -1,6 +1,6 @@ # 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.=Las cercas son estructuras que bloquean el camino. Las cercas se conectarán entre sí y con los bloques sólidos. No se pueden saltar con un simple salto. -Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.=Las puertas de valla se pueden abrir o cerrar y no se pueden saltar. Las cercas se conectarán muy bien a las puertas de la cerca. +Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.=Las puertas de cerca se pueden abrir o cerrar y no se pueden saltar. Las cercas se conectarán muy bien a las puertas de la cerca. Right-click the fence gate to open or close it.=Haga clic derecho en la puerta de la cerca para abrirla o cerrarla. Oak Fence=Valla de roble Oak Fence Gate=Puerta de roble @@ -9,9 +9,10 @@ Spruce Fence Gate=Puerta de abeto Birch Fence=Valla de abedul Birch Fence Gate=Puerta de abedul Jungle Fence=Valla de la selva -Jungle Fence Gate=Puerta de valla de la selva +Jungle Fence Gate=Puerta de cerca de la selva Dark Oak Fence=Valla de roble oscuro Dark Oak Fence Gate=Puerta de roble oscuro Acacia Fence=Valla de acacia Acacia Fence Gate=Puerta de acacia -Nether Brick Fence=Valla de ladrillo abisal \ No newline at end of file +Nether Brick Fence=Valla de ladrillo abisal +Openable by players and redstone power=Puede ser abierta por jugadores y por señales de redstone diff --git a/mods/ITEMS/mcl_fences/locale/mcl_fences.fr.tr b/mods/ITEMS/mcl_fences/locale/mcl_fences.fr.tr index ccfb86d95..1044cf148 100644 --- a/mods/ITEMS/mcl_fences/locale/mcl_fences.fr.tr +++ b/mods/ITEMS/mcl_fences/locale/mcl_fences.fr.tr @@ -1,18 +1,18 @@ # textdomain: mcl_fences Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump.=Les barrières sont des structures qui bloquent le chemin. Les barrières se connecteront les unes aux autres et aux blocs solides. Ils ne peuvent pas être sautés par un simple saut. -Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.=Les portillions peuvent être ouvertes ou fermées et ne peuvent pas être sautées. Les barrières se connecteront bien aux portillions. -Right-click the fence gate to open or close it.=Cliquez avec le bouton droit sur le portillion pour l'ouvrir ou la fermer. +Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.=Les portillons peuvent être ouvertes ou fermées et ne peuvent pas être sautées. Les barrières se connecteront bien aux portillions. +Right-click the fence gate to open or close it.=Cliquez avec le bouton droit sur le portillon pour l'ouvrir ou la fermer. Oak Fence=Barrière en bois de Chêne -Oak Fence Gate=Portillion en bois de Chêne +Oak Fence Gate=Portillon en bois de Chêne Spruce Fence=Barrière en bois de Sapin -Spruce Fence Gate=Portillion en bois de Sapin +Spruce Fence Gate=Portillon en bois de Sapin Birch Fence=Barrière en bois de Bouleau -Birch Fence Gate=Portillion en bois de Bouleau +Birch Fence Gate=Portillon en bois de Bouleau Jungle Fence=Barrière en bois d'Acajou -Jungle Fence Gate=Portillion en bois d'Acajou +Jungle Fence Gate=Portillon en bois d'Acajou Dark Oak Fence=Barrière en bois de Chêne Noir -Dark Oak Fence Gate=Portillion en bois de Chêne Noir +Dark Oak Fence Gate=Portillon en bois de Chêne Noir Acacia Fence=Barrière en bois d'Acacia -Acacia Fence Gate=Portillion en bois d'Acacia +Acacia Fence Gate=Portillon en bois d'Acacia Nether Brick Fence=Barrière en Brique du Nether Openable by players and redstone power=Ouvrable par les joueurs et la puissance redstone diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.fr.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.fr.tr index 6ab6d906a..f585f9e02 100644 --- a/mods/ITEMS/mcl_fire/locale/mcl_fire.fr.tr +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.fr.tr @@ -1,7 +1,7 @@ # textdomain: mcl_fire Fire Charge=Boule de feu -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.=Les boules de feu sont principalement des projectiles qui peuvent être lancés à partir de distributeurs, ils voleront en ligne droite et éclateront en feu à l'impact. Alternativement, ils peuvent être utilisés pour allumer des incendies directement. -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.=Mettez la boule de feu dans un distributeur et alimentez-la en redstone pour la lancer. Pour allumer un feu directement, placez simplement la charge de feu sur le sol, et utiliser le. +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.=Les boules de feu sont principalement des projectiles qui peuvent être lancées à partir de distributeurs, elles voleront en ligne droite et éclateront en feu à l'impact. Alternativement, elles peuvent être utilisées pour allumer des incendies directement. +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.=Mettez la boule de feu dans un distributeur et alimentez-la en redstone pour la lancer. Pour allumer un feu directement, placez simplement la charge de feu sur le sol, et utiliser la. Flint and Steel=Briquet Flint and steel is a tool to start fires and ignite blocks.=Le briquet est un outil pour allumer un feu ou allumer des blocs. 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.=Cliquez avec le bouton droit sur la surface d'un bloc pour tenter d'allumer un feu devant lui ou d'allumer le bloc. Quelques blocs ont une réaction unique lorsqu'ils sont enflammés. @@ -9,8 +9,8 @@ Fire is a damaging and destructive but short-lived kind of block. It will destro 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.=Le feu est un type de bloc éphémère mais non destructif de courte durée. Il disparaîtra en l'absence de bloc inflammable. Le feu ne détruit pas les blocs, du moins pas dans ce monde. Il sera éteint par l'eau et la pluie à proximité. Le feu peut être détruit en toute sécurité en le frappant, mais il est blessant si vous vous tenez directement dedans. Si un feu est déclenché au-dessus d'un netherrack ou d'un bloc de magma, il se transformera immédiatement en un feu éternel. 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.=Le feu éternel est un bloc endommageant qui pourrait créer plus de feu. Il créera du feu autour de lui lorsque des blocs inflammables sont à proximité. Le feu éternel peut être éteint par des coups de poing et des blocs d'eau à proximité. À part le feu (normal), le feu éternel ne s'éteint pas tout seul et continue de brûler sous la pluie. Frapper le feu éternel est sûr, mais ça fait mal si vous vous tenez à l'intérieur. 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.=Le feu éternel est un bloc dommageable. Le feu éternel peut être éteint par des coups de poing et des blocs d'eau à proximité. À part le feu (normal), le feu éternel ne s'éteint pas tout seul et continue de brûler sous la pluie. Frapper le feu éternel est sûr, mais ça fait mal si vous vous tenez à l'intérieur. -@1 has been cooked crisp.=@1 a été cuit croustillant. -@1 felt the burn.=@1 sent le brûler. +@1 has been cooked crisp.=@1 a été grillé comme une saucisse. +@1 felt the burn.=@1 sent le brûlé. @1 died in the flames.=@1 est mort dans les flammes. @1 died in a fire.=@1 est mort dans un incendie. Fire=Feu diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr index 945a799e2..c96a585f9 100644 --- a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr +++ b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr @@ -11,6 +11,9 @@ White Tulip=Tulipe Blanche Allium=Allium Azure Bluet=Houstonie Bleue Blue Orchid=Orchidée Bleue +Wither Rose=Rose de Wither +Lily of the Valley=Muguet +Cornflower=Bleuet Tall Grass=Hautes herbes 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.=L'herbe haute est une petite plante qui se rencontre souvent à la surface des prairies. Il peut être récolté pour les graines de blé. En utilisant de la farine d'os, les hautes herbes peuvent être transformées en herbes hautes doubles de deux blocs de hauteur. Fern=Fougère diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index 59cfe7858..8cb8ad5a0 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -440,12 +440,10 @@ minetest.register_node("mcl_furnaces:furnace", { _tt_help = S("Uses fuel to smelt or cook items"), _doc_items_longdesc = S("Furnaces cook or smelt several items, using a furnace fuel, into something else."), _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 furnace to open the furnace menu.").."\n".. + S("Place a furnace fuel in the lower slot and the source material in the upper slot.").."\n".. + S("The furnace will slowly use its fuel to smelt the item.").."\n".. + S("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 = { diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.fr.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.fr.tr index deec7981c..4db2fc103 100644 --- a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.fr.tr +++ b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.fr.tr @@ -1,7 +1,10 @@ # textdomain: mcl_furnaces Furnace=Four Furnaces cook or smelt several items, using a furnace fuel, into something else.=Les fours cuisent ou fondent plusieurs articles, en utilisant un combustible de four, dans quelque chose d'autre. -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.=Utilisez le four pour ouvrir le menu du four. Placez un combustible de four dans la fente inférieure et le matériau source dans la fente supérieure. Le four utilisera lentement son combustible pour fondre l'article. Le résultat sera placé dans la fente de sortie du côté droit. +Use the furnace to open the furnace menu.=Utilisez le four pour ouvrir le menu du four. +Place a furnace fuel in the lower slot and the source material in the upper slot.=Placez un combustible de four dans la fente inférieure et le matériau source dans la fente supérieure. +The furnace will slowly use its fuel to smelt the item.=Le four utilisera lentement son combustible pour fondre l'article. +The result will be placed into the output slot at the right side.=Le résultat sera placé dans la fente de sortie du côté droit. Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Utilisez le livre de recettes pour voir ce que vous pouvez cuire, ce que vous pouvez utiliser comme carburant et combien de temps il brûlera. Burning Furnace=Four Allumé Recipe book=Livre de Recette diff --git a/mods/ITEMS/mcl_furnaces/locale/template.txt b/mods/ITEMS/mcl_furnaces/locale/template.txt index 4f88824b0..e19259437 100644 --- a/mods/ITEMS/mcl_furnaces/locale/template.txt +++ b/mods/ITEMS/mcl_furnaces/locale/template.txt @@ -1,7 +1,10 @@ # textdomain: mcl_furnaces Furnace= 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 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= diff --git a/mods/ITEMS/mcl_honey/init.lua b/mods/ITEMS/mcl_honey/init.lua index e3b958a7d..ad507439e 100644 --- a/mods/ITEMS/mcl_honey/init.lua +++ b/mods/ITEMS/mcl_honey/init.lua @@ -16,11 +16,13 @@ function mcl_honey.wax_block(pos, node, player, itemstack) local def = minetest.registered_nodes[node.name] - if not def or not def._mcl_copper_waxed_variant then + if def and def._mcl_waxed_variant then + node.name = def._mcl_waxed_variant + else return end - node.name = def._mcl_copper_waxed_variant + node.name = def._mcl_waxed_variant minetest.set_node(pos, node) awards.unlock(player:get_player_name(), "mcl:wax_on") if not minetest.is_creative_enabled(player:get_player_name()) then diff --git a/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr b/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr new file mode 100644 index 000000000..90382020a --- /dev/null +++ b/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr @@ -0,0 +1,10 @@ +Honeycomb=Bloque de panal +Used to craft beehives and protect copper blocks from further oxidation.=Se utiliza para fabricar apiarios de avejas y para proteger bloques de cobre +Use on copper blocks to prevent further oxidation.=Usa sobre bloques de cobre para evitar mayor oxidación. +Honeycomb Block=Bloque de panal +Honeycomb Block. Used as a decoration.=Bloque de panal. Se utiliza como decoración como decoración +Honey Bottle=Botella de miel +Honey Bottle is used to craft honey blocks and to restore hunger points.=La botella de miel sirve para fabricar bloques de miel y para restaurar puntos de hambre. +Drinking will restore 6 hunger points. Can also be used to craft honey blocks.=Beberla restaurará 6 puntos de hambre. También puede ser usada para fabricar bloques de miel +Honey Block=Bloque de miel +Honey Block. Used as a decoration and in redstone. Is sticky on some sides.=Bloque de miel. Se utiliza como decoración y en redstone. Es pegajoso por algunos lados. diff --git a/mods/ITEMS/mcl_honey/locale/mcl_honey.fr.tr b/mods/ITEMS/mcl_honey/locale/mcl_honey.fr.tr new file mode 100644 index 000000000..67ef904c9 --- /dev/null +++ b/mods/ITEMS/mcl_honey/locale/mcl_honey.fr.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_honey +Honeycomb=Cire +Used to craft beehives and protect copper blocks from further oxidation.=Utilisé pour fabriquer les ruches et protéger des blocs de l'oxydation. +Use on copper blocks to prevent further oxidation.=À utiliser sur les blocs de cuivre pour les protéger de l'oxydation. +Honeycomb Block=Bloc de cire +Honeycomb Block. Used as a decoration.=Bloc de cire. Utilisé en cire. +Honey Bottle=Bouteille de miel +Honey Bottle is used to craft honey blocks and to restore hunger points.=Une bouteille sert à fabriquer des bloc de miel et à restaurer des points de faim. +Drinking will restore 6 hunger points. Can also be used to craft honey blocks.=Boire ceci restaure 6 points de faim. +Honey Block=Bloc de miel +Honey Block. Used as a decoration and in redstone. Is sticky on some sides.=Bloc de miel. Utilisé comme décoration et avec la redstone. Il est collant sur certains côtés. diff --git a/mods/ITEMS/mcl_honey/locale/mcl_honey.ja.tr b/mods/ITEMS/mcl_honey/locale/mcl_honey.ja.tr index 4cb018f84..c4ef54411 100644 --- a/mods/ITEMS/mcl_honey/locale/mcl_honey.ja.tr +++ b/mods/ITEMS/mcl_honey/locale/mcl_honey.ja.tr @@ -1,3 +1,4 @@ +# textdomain: mcl_honey Honeycomb=ハニカム Used to craft beehives and protect copper blocks from further oxidation.=ハチの巣を作ったり、銅ブロックがこれ以上酸化しないように保護するために使われます。 Use on copper blocks to prevent further oxidation.=銅ブロックに使用すると、これ以上の酸化を防げます。 diff --git a/mods/ITEMS/mcl_honey/locale/template.txt b/mods/ITEMS/mcl_honey/locale/template.txt index a9814d617..3cdeec570 100644 --- a/mods/ITEMS/mcl_honey/locale/template.txt +++ b/mods/ITEMS/mcl_honey/locale/template.txt @@ -1,3 +1,4 @@ +# textdomain: mcl_honey Honeycomb= Used to craft beehives and protect copper blocks from further oxidation.= Use on copper blocks to prevent further oxidation.= diff --git a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.fr.tr b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.fr.tr index 1e3d4806b..7458ebfc1 100644 --- a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.fr.tr +++ b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.fr.tr @@ -1,12 +1,12 @@ # textdomain: mcl_hoppers Hopper=Entonnoir 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.=Les entonnoirs sont des conteneurs avec 5 emplacements d'inventaire. Ils récupèrent les objets déposés par le haut, prennent les objets d'un conteneur au-dessus et tentent de les placer dans un conteneur adjacent. Les entonnoirs peuvent aller vers le bas ou sur le côté. Les entonnoirs interagissent avec les coffres, les compte-gouttes, les distributeurs, les boites de shulker, les fours et les entonnoirs. -Hoppers interact with containers the following way:=Les entonnoirs interagissent avec les conteneurs de la manière suivante: +Hoppers interact with containers the following way:=Les entonnoirs interagissent avec les conteneurs de la manière suivante : • 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=• Fours: les entonnoirs d'en haut placent les objets dans l'emplacement source. Les entonnoirs d'en bas prennent les éléments de la fente de sortie. Ils prennent également des objets de la fente de carburant lorsqu'ils ne peuvent pas être utilisés comme carburant. Des entonnoirs latérales qui pointent vers le four mettent des objets dans la fente de combustible -• Ender chests: No interaction.=• Coffres Ender: Aucune interaction. +• Ender chests: No interaction.=• Coffres Ender : Aucune interaction. • Other containers: Normal interaction.=• Autres conteneurs: interaction normale. -Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.=Les entonnoirs peuvent être désactivées lorsqu'elles sont alimentées en redstone. Les trémies désactivées ne déplacent pas les objets. -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.=Pour placer un entonnoir verticalement, placez-la au sol ou au plafond. Pour le placer sur le côté, placez-le sur le côté d'un bloc. Utilisez l'entonnoir pour accéder à son inventaire. +Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.=Les entonnoirs peuvent être désactivées lorsqu'ils sont alimentés en redstone. Les entonnoirs désactivés ne déplacent pas les objets. +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.=Pour placer un entonnoir verticalement, placez-le au sol ou au plafond. Pour le placer sur le côté, placez-le sur le côté d'un bloc. Utilisez l'entonnoir pour accéder à son inventaire. Disabled Hopper=Entonnoir désactivé Side Hopper=Entonnoir latéral Disabled Side Hopper=Entonnoir latéral désactivé diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index 553198c67..1f53f8250 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -14,11 +14,11 @@ mcl_itemframes.backwards_compatibility() -- Define the standard frames. mcl_itemframes.create_custom_frame("false", "item_frame", false, - "mcl_itemframes_item_frame.png", mcl_colors.WHITE, "Can hold an item.", - "Item Frame", "") + "mcl_itemframes_item_frame.png", mcl_colors.WHITE, S("Can hold an item."), + S("Item Frame"), "") mcl_itemframes.create_custom_frame("false", "glow_item_frame", true, - "mcl_itemframes_glow_item_frame.png", mcl_colors.WHITE, "Can hold an item and glows.", - "Glowing Item Frame", "") + "mcl_itemframes_glow_item_frame.png", mcl_colors.WHITE, S("Can hold an item and glows."), + S("Glowing Item Frame"), "") -- Register the base frame's recipes. -- was going to make it a specialized function, but minetest refuses to play nice. diff --git a/mods/ITEMS/mcl_itemframes/item_frames_API.lua b/mods/ITEMS/mcl_itemframes/item_frames_API.lua index 142de4824..999becf05 100644 --- a/mods/ITEMS/mcl_itemframes/item_frames_API.lua +++ b/mods/ITEMS/mcl_itemframes/item_frames_API.lua @@ -623,7 +623,7 @@ function mcl_itemframes.create_base_definitions() mcl_itemframes.item_frame_base = { description = S("Item Frame"), name = "mcl_itemframes:item_frame", - _tt_help = S("Can hold an item"), + _tt_help = S("Can hold an item."), _doc_items_longdesc = S("Item frames are decorative blocks in which items can be placed."), _doc_items_usagehelp = S("Just place any item on the item frame. Use the item frame again to retrieve the item."), drawtype = "mesh", diff --git a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.fr.tr b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.fr.tr index e847779f2..7ff510cb2 100644 --- a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.fr.tr +++ b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.fr.tr @@ -2,7 +2,9 @@ Item Frame=Cadre de l'article Item frames are decorative blocks in which items can be placed.=Les cadres d'objets sont des blocs décoratifs dans lesquels des objets peuvent être placés. Just place any item on the item frame. Use the item frame again to retrieve the item.=Placez simplement n'importe quel élément sur le cadre de l'élément. Utilisez à nouveau le cadre de l'objet pour récupérer l'objet. -Can hold an item.=Peut contenir un objet. +Can hold an item.=Peut contenir un objet Glowing Item Frame=Cadre d'objet lumineux -Glowing item frames are decorative blocks in which items can be placed and made to glow.=Les cadres d'objets lumineux sont des blocs décoratifs dans lesquels des objets peuvent être placés et rendus brillants. -Can hold an item and glows.=Peut contenir un objet et brille. +Glowing item frames are decorative blocks in which items can be placed.=Les cadres d'objets lumineux sont des blocs décoratifs dans lesquels des objets peuvent être placés. +Can hold an item and glows.=Peut contenir un objet et brille +Glow and Behold!=Une idée brillante ! +Craft a glow item frame.=Fabriquez un cadre brillant. diff --git a/mods/ITEMS/mcl_itemframes/locale/template.txt b/mods/ITEMS/mcl_itemframes/locale/template.txt index 87cd55c65..bd5ff6f29 100644 --- a/mods/ITEMS/mcl_itemframes/locale/template.txt +++ b/mods/ITEMS/mcl_itemframes/locale/template.txt @@ -2,7 +2,9 @@ Item Frame= Item frames are decorative blocks in which items can be placed.= Just place any item on the item frame. Use the item frame again to retrieve the item.= -Can hold an item= -Glow Item Frame= -Glow item frames are decorative blocks in which items can be placed.= -Can hold an item and glows= +Can hold an item.= +Glowing Item Frame= +Glowing item frames are decorative blocks in which items can be placed.= +Can hold an item and glows.= +Glow and Behold!= +Craft a glow item frame.= diff --git a/mods/ITEMS/mcl_lectern/init.lua b/mods/ITEMS/mcl_lectern/init.lua index e6b7e3db8..98366b7b8 100644 --- a/mods/ITEMS/mcl_lectern/init.lua +++ b/mods/ITEMS/mcl_lectern/init.lua @@ -130,9 +130,9 @@ end minetest.register_craft({ output = "mcl_lectern:lectern", recipe = { - {"group:slab", "group:slab", "group:slab"}, + {"group:wood_slab", "group:wood_slab", "group:wood_slab"}, {"", "mcl_books:bookshelf", ""}, - {"", "group:slab", ""}, + {"", "group:wood_slab", ""}, } }) diff --git a/mods/ITEMS/mcl_lectern/locale/mcl_lectern.fr.tr b/mods/ITEMS/mcl_lectern/locale/mcl_lectern.fr.tr new file mode 100644 index 000000000..c068052e1 --- /dev/null +++ b/mods/ITEMS/mcl_lectern/locale/mcl_lectern.fr.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_lectern +Lectern=Pupitre +Lecterns not only look good, but are job site blocks for Librarians.=Les pupitres ne sont pas seulement décoratifs, ils sont aussi le poste de travail des Bibliothécaires. +Place the Lectern on a solid node for best results. May attract villagers, so it's best to place outside of where you call 'home'.=Placer le Pupitre sur un bloc solide pour de meilleurs résultats. Il peut attirer les villageois, donc il vaut mieux le placer en dehors de chez vous. diff --git a/mods/ITEMS/mcl_lectern/locale/template.txt b/mods/ITEMS/mcl_lectern/locale/template.txt new file mode 100644 index 000000000..b3232a93b --- /dev/null +++ b/mods/ITEMS/mcl_lectern/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mcl_lectern +Lectern= +Lecterns not only look good, but are job site blocks for Librarians.= +Place the Lectern on a solid node for best results. May attract villagers, so it's best to place outside of where you call 'home'.= \ No newline at end of file diff --git a/mods/ITEMS/mcl_lightning_rods/init.lua b/mods/ITEMS/mcl_lightning_rods/init.lua index 82e04db0c..3cd2dc1dc 100644 --- a/mods/ITEMS/mcl_lightning_rods/init.lua +++ b/mods/ITEMS/mcl_lightning_rods/init.lua @@ -82,7 +82,7 @@ rod_def_a.on_timer = function(pos, elapsed) local node = minetest.get_node(pos) if node.name == "mcl_lightning_rods:rod_powered" then --has not been dug - minetest.set_node(pos, { name = "mcl_lightning_rods:rod" }) + minetest.set_node(pos, { name = "mcl_lightning_rods:rod", param2 = node.param2 }) mesecon.receptor_off(pos, mesecon.rules.alldirs) end @@ -99,7 +99,7 @@ lightning.register_on_strike(function(pos, pos2, objects) local node = minetest.get_node(lr) if node.name == "mcl_lightning_rods:rod" then - minetest.set_node(lr, { name = "mcl_lightning_rods:rod_powered" }) + minetest.set_node(lr, { name = "mcl_lightning_rods:rod_powered", param2 = node.param2 }) mesecon.receptor_on(lr, mesecon.rules.alldirs) minetest.get_node_timer(lr):start(0.4) end diff --git a/mods/ITEMS/mcl_mangrove/init.lua b/mods/ITEMS/mcl_mangrove/init.lua index 3e1cecba9..dd2b653c4 100644 --- a/mods/ITEMS/mcl_mangrove/init.lua +++ b/mods/ITEMS/mcl_mangrove/init.lua @@ -352,10 +352,20 @@ local wlroots = { handy = 1, hoey = 1, water=3, liquid=3, puts_out_fire=1, dig_by_piston = 1, deco_block = 1, not_in_creative_inventory=1 }, _mcl_blast_resistance = 100, _mcl_hardness = -1, -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode + on_construct = function(pos) + local dim = mcl_worlds.pos_to_dimension(pos) + if dim == "nether" then + minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) + minetest.set_node(pos, {name="mcl_mangrove:mangrove_roots"}) + end + end, after_dig_node = function(pos) local node = minetest.get_node(pos) - if minetest.get_item_group(node.name, "water") == 0 then + local dim = mcl_worlds.pos_to_dimension(pos) + if minetest.get_item_group(node.name, "water") == 0 and dim ~= "nether" then minetest.set_node(pos, {name="mcl_core:water_source"}) + else + minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) end end, } @@ -369,6 +379,15 @@ rwlroots.tiles = { "("..water_tex..")^mcl_mangrove_roots_side.png", "("..water_tex..")^mcl_mangrove_roots_side.png", } +rwlroots.after_dig_node = function(pos) + local node = minetest.get_node(pos) + local dim = mcl_worlds.pos_to_dimension(pos) + if minetest.get_item_group(node.name, "water") == 0 and dim ~= "nether" then + minetest.set_node(pos, {name="mclx_core:river_water_source"}) + else + minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) + end +end minetest.register_node("mcl_mangrove:water_logged_roots", wlroots) minetest.register_node("mcl_mangrove:river_water_logged_roots",rwlroots) diff --git a/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.fr.tr b/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.fr.tr index b47ed9136..f898a58a7 100644 --- a/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.fr.tr +++ b/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.fr.tr @@ -30,7 +30,7 @@ Mangrove Trapdoor=Trappe en palétuvier 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.=Les trappes de bois sont des barrières horizontales qui peuvent être ouvertes et fermées à la main ou avec un signal redstone. Elles occupent la partie haut ou bas d'un bloc, selon la manière dont elles ont été placées. To open or close the trapdoor, rightclick it or send a redstone signal to it.=Pour ouvrir et fermer la trappe, faire un clic droit ou lui envoyer un signal redstone. Mangrove Wood Fence=Barrière de palétuvier -Mangrove Wood Fence Gate=Portillion de palétuvier +Mangrove Wood Fence Gate=Portillon de palétuvier Mangrove Wood Stairs=Escalier en bois de palétuvier Mangrove Wood Slab=Dalle en bois de palétuvier Double Mangrove Wood Slab=Double Dalle en bois de palétuvier diff --git a/mods/ITEMS/mcl_mangrove/mod.conf b/mods/ITEMS/mcl_mangrove/mod.conf index fb71efbf8..cdc9a6a1c 100644 --- a/mods/ITEMS/mcl_mangrove/mod.conf +++ b/mods/ITEMS/mcl_mangrove/mod.conf @@ -1,3 +1,3 @@ name = mcl_mangrove author = thunder1035 -depends = mcl_core, mcl_doors, mcl_stairs, mcl_walls, mclx_fences, mcl_boats, mcl_flowerpots, mcl_mud, mcl_util +depends = mcl_core, mcl_doors, mcl_stairs, mcl_walls, mclx_fences, mcl_boats, mcl_flowerpots, mcl_mud, mcl_util, mcl_worlds diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index eeec953a2..2dcfc6372 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -339,7 +339,7 @@ minetest.register_tool("mcl_mobitems:warped_fungus_on_a_stick", { description = S("Warped fungus on a Stick"), _tt_help = S("Lets you ride a strider"), _doc_items_longdesc = S("A warped fungus on a stick can be used on saddled striders to ride them."), - _doc_items_usagehelp = S("Place it on a saddled strider to mount it. You can now ride the strider like a horse. Striders will also walk towards you when you just wield the carrot on a stick."), + _doc_items_usagehelp = S("Place it on a saddled strider to mount it. You can now ride the strider like a horse. Striders will also walk towards you when you just wield the fungus on a stick."), wield_image = "mcl_mobitems_warped_fungus_on_a_stick.png^[transformFY^[transformR90", inventory_image = "mcl_mobitems_warped_fungus_on_a_stick.png", groups = { transport = 1 }, diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr index 82d1f173b..9e94befa4 100644 --- a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr @@ -53,7 +53,7 @@ Bones can be used to tame wolves so they will protect you. They are also useful 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.=Maniez l'os près des loups pour les attirer. Utilisez la touche «Placer» sur le loup pour lui donner un os et l'apprivoiser. Vous pouvez ensuite donner des commandes au loup apprivoisé en utilisant la touche "Placer" sur celui-ci. Squid Ink Sac=Poche d'encre -This item is dropped by dead squids. Squid ink can be used to as an ingredient to craft book and quill or black dye.= +This item is dropped by dead squids. Squid ink can be used to as an ingredient to craft book and quill or black dye.=Cet objet est lâché par des poulpes morts. L'encre de poulpe peut être utilisée comme ingrédient pour fabriquer des livres et plume ou de l'encre noire. String=Ficelle Strings are used in crafting.=Les ficelles sont utilisées dans l'artisanat. @@ -96,16 +96,25 @@ A carrot on a stick can be used on saddled pigs to ride them.=Une carotte sur un 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.=Placez-le sur un cochon sellé pour le monter. Vous pouvez maintenant monter le cochon comme un cheval. Les porcs marcheront également vers vous lorsque vous brandirez la carotte sur un bâton. +Warped fungus on a Stick=Champignon tordu sur un bâton +Lets you ride a strider=Vous permet de monter un arpenteur +A warped fungus on a stick can be used on saddled striders to ride them.=Un champignon tordu sur un bâton peut être utilisé sur les arpenteurs sellés pour les monter. +Place it on a saddled strider to mount it. You can now ride the strider like a horse. Striders will also walk towards you when you just wield the fungus on a stick.=Placez-le sur un arpenteur sellé pour le monter. Vous pouvez maintenant monter l'arpenteur comme un cheval. Les arpenteurs marcheront également vers vous lorsque vous brandirez le champignon sur un bâton. + Nautilus Shell=Coquille de nautile Used to craft a conduit=Utilisé pour fabriquer un conduit. The Nautilus Shell is used to craft a conduit. They can be obtained by fishing or killing a drowned that is wielding a shell.=La Coquille de nautile est utilisée pour fabriquer un conduit. Elles peuvent être obtenues en pêchant ou en tuant un noyé qui tient une coquille. Heart of the Sea=Coeur de la Mer -The Heart of the Sea is used to craft a conduit. They can be obtained by finding them in a buried treasure chest.=Le Coeur de la Mer est utilisé pour fabriquer un conduit. Il peut être obtenu dans un coffre au trésor enterré. +The Heart of the Sea is used to craft a conduit. They can be obtained by finding them in a buried treasure chest.=Le Cœur de la Mer est utilisé pour fabriquer un conduit. Il peut être obtenu dans un coffre au trésor enterré. Iron Horse Armor=Armure de cheval en fer Iron horse armor can be worn by horses to increase their protection from harm a bit.=L'armure de cheval en fer peut être portée par les chevaux pour augmenter un peu leur protection contre les dégâts. Golden Horse Armor=Armure de cheval en or Golden horse armor can be worn by horses to increase their protection from harm.=Une armure de cheval en or peut être portée par les chevaux pour augmenter leur protection contre les dégâts. Diamond Horse Armor=Armure de cheval en diamant -Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Une armure de cheval en diament peut être portée par les chevaux pour augmenter fortement leur protection contre les dégâts. +Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Une armure de cheval en diamant peut être portée par les chevaux pour augmenter fortement leur protection contre les dégâts. Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Placez-la sur un cheval pour mettre l'armure de cheval. Les ânes et les mules ne peuvent pas porter d'armure de cheval. + +Glow Ink Sac=Poche d'encre brillante +Use it to craft the Glow Item Frame.=Utilisez la pour fabriquer un Cadre d'objet brillant. +Use the Glow Ink Sac and the normal Item Frame to craft the Glow Item Frame.=Utilisez la Poche d'encre brillante et le Cadre d'objet normal pour fabriquer le Cadre d'objet brillant. diff --git a/mods/ITEMS/mcl_mobitems/locale/template.txt b/mods/ITEMS/mcl_mobitems/locale/template.txt index f26ab52d7..dd97fa0dd 100644 --- a/mods/ITEMS/mcl_mobitems/locale/template.txt +++ b/mods/ITEMS/mcl_mobitems/locale/template.txt @@ -96,6 +96,11 @@ 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.= +Warped fungus on a Stick= +Lets you ride a strider= +A warped fungus on a stick can be used on saddled striders to ride them.= +Place it on a saddled strider to mount it. You can now ride the strider like a horse. Striders will also walk towards you when you just wield the fungus on a stick.= + Nautilus Shell= Used to craft a conduit= The Nautilus Shell is used to craft a conduit. They can be obtained by fishing or killing a drowned that is wielding a shell.= @@ -109,3 +114,7 @@ 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.= + +Glow Ink Sac= +Use it to craft the Glow Item Frame.= +Use the Glow Ink Sac and the normal Item Frame to craft the Glow Item Frame.= diff --git a/mods/ITEMS/mcl_monster_eggs/init.lua b/mods/ITEMS/mcl_monster_eggs/init.lua index 59ab72876..f58717d04 100644 --- a/mods/ITEMS/mcl_monster_eggs/init.lua +++ b/mods/ITEMS/mcl_monster_eggs/init.lua @@ -23,10 +23,7 @@ local function register_block(subname, description, tiles, is_ground_content) sounds = mcl_sounds.node_sound_stone_defaults(), after_dig_node = spawn_silverfish, _tt_help = S("Hides a silverfish"), - _doc_items_longdesc = S([[ - An infested block is a block from which a silverfish will pop out when it is broken. - It looks identical to its normal counterpart. - ]]), + _doc_items_longdesc = S("An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart."), _mcl_hardness = 0, _mcl_blast_resistance = 0.5, }) diff --git a/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr b/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr index 864715eb7..70d8ca8e0 100644 --- a/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr +++ b/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr @@ -38,8 +38,9 @@ Place this item on soul sand to plant it and watch it grow.=Placez cet article s Burns your feet=Vous brûle les pieds Grows on soul sand=Pousse sur le sable de l'âme Reduces walking speed=Réduit la vitesse de marche -Netherite Scrap=Fragments de Netherite -Netherite Ingot=Lingot de Netherite +Netherite Scrap=Fragments de netherite +Netherite Ingot=Lingot de netherite Ancient Debris=Débris antiques -Netherite Block=Bloc de Netherite -Netherite block is very hard and can be made of 9 netherite ingots.=Les blocs de netherite sont très durs et peuvent être fabriqués à partir de 9 lingots de netherite. \ No newline at end of file +Ancient debris can be found in the nether and is very very rare.=Les débris antiques se trouvent dans le Nether et sont extrêmement rares. +Netherite Block=Bloc de netherite +Netherite block is very hard and can be made of 9 netherite ingots.=Les blocs de netherite sont très durs et peuvent être fabriqués à partir de 9 lingots de netherite. diff --git a/mods/ITEMS/mcl_nether/locale/template.txt b/mods/ITEMS/mcl_nether/locale/template.txt index 283472f63..de0fabcfb 100644 --- a/mods/ITEMS/mcl_nether/locale/template.txt +++ b/mods/ITEMS/mcl_nether/locale/template.txt @@ -41,5 +41,6 @@ Reduces walking speed= Netherite Scrap= Netherite Ingot= Ancient Debris= +Ancient debris can be found in the nether and is very very rare.= Netherite Block= -Netherite block is very hard and can be made of 9 netherite ingots.= \ No newline at end of file +Netherite block is very hard and can be made of 9 netherite ingots.= diff --git a/mods/ITEMS/mcl_ocean/kelp.lua b/mods/ITEMS/mcl_ocean/kelp.lua index 8827546a3..1084dfa77 100644 --- a/mods/ITEMS/mcl_ocean/kelp.lua +++ b/mods/ITEMS/mcl_ocean/kelp.lua @@ -216,41 +216,34 @@ local function store_age (pos, age) end end -local function retrieve_age (pos, include_nil) +local function retrieve_age (pos) local meta = mt_get_meta(pos) - - if include_nil then - local age_set = meta:contains("mcl_ocean:kelp_age") - if not age_set then - return nil - end + local age_set = meta:contains("mcl_ocean:kelp_age") + if not age_set then + return nil end - return meta:get_int("mcl_ocean:kelp_age") + + local age = meta:get_int("mcl_ocean:kelp_age") + --minetest.log("age: " .. tostring(age)) + return age end -- Initialise a kelp's age. -function kelp.init_age(pos, age, from_lbm) +function kelp.init_age(pos) -- Watched params: pos -- Optional params: age, from_lbm - local new_age + local age = retrieve_age(pos) - local stored_age = retrieve_age(pos, from_lbm) - - if age then - --minetest.log("age: " .. tostring(age)) - store_age(pos, age) - new_age = age - elseif not stored_age then - new_age = kelp.roll_init_age() + if not age then + age = kelp.roll_init_age() --minetest.log("no kelp age set so init with: " .. tostring(new_age)) - store_age(pos, new_age) + store_age(pos, age) else - --minetest.log("stored_age: " .. tostring(stored_age)) - new_age = stored_age + --minetest.log("stored_age: " .. tostring(age)) end - return new_age + return age end -- Apply next kelp height. The surface is swapped. so on_construct is skipped. @@ -380,27 +373,24 @@ end local function grow_kelp (pos) local node = mt_get_node(pos) + local age = retrieve_age(pos) - if kelp.roll_growth() then - local age = retrieve_age(pos) + if not age then + --minetest.log("init a new age as not set: " .. mt_pos_to_string(pos)) + age = kelp.init_age(pos) + end - if not age then - --minetest.log("init a new age as not set: " .. mt_pos_to_string(pos)) - kelp.init_age(pos, nil) - end - - if kelp.is_age_growable(age) then - --minetest.log("age growable: ".. tostring(age) .. ", pos: ".. mt_pos_to_string(pos)) - kelp.next_grow(age+1, pos, node) - else - --minetest.log("age not: ".. tostring(age) .. ", pos: ".. mt_pos_to_string(pos)) - end + if kelp.is_age_growable(age) then + --minetest.log("age growable: ".. tostring(age) .. ", pos: ".. mt_pos_to_string(pos)) + kelp.next_grow(age+1, pos, node) + else + --minetest.log("age not: ".. tostring(age) .. ", pos: ".. mt_pos_to_string(pos)) end end function kelp.surface_on_construct(pos) --minetest.log("on construct kelp called") - kelp.init_age(pos, nil) + kelp.init_age(pos) end @@ -509,31 +499,15 @@ function kelp.kelp_on_place(itemstack, placer, pointed_thing) itemstack:take_item() end - -- Initialize age and timer when it's planted on a new surface. - local init_age = kelp.roll_init_age() - - if new_surface then - kelp.init_age(pos_under, init_age) - else - store_age(pos_under, init_age) - end + kelp.init_age(pos_under) return itemstack end function kelp.lbm_register(pos) - kelp.init_age(pos, nil, true) + kelp.init_age(pos) end -minetest.register_lbm({ - label = "Kelp initialise", - name = "mcl_ocean:kelp_init", - nodenames = { "group:kelp" }, - run_at_every_load = true, -- so old kelps are also initialised - action = kelp.lbm_register, -}) - - -------------------------------------------------------------------------------- -- Kelp registration API -------------------------------------------------------------------------------- @@ -725,6 +699,19 @@ minetest.register_craft({ burntime = 200, }) +-------------------------------------------------------------------------------- +-- Kelp ABM + LBM's +-------------------------------------------------------------------------------- + + +minetest.register_lbm({ + label = "Kelp initialise", + name = "mcl_ocean:kelp_init_83", + nodenames = { "group:kelp" }, + run_at_every_load = false, -- so old kelps are also initialised + action = kelp.lbm_register, +}) + minetest.register_abm({ label = "Kelp drops", nodenames = { "group:kelp" }, @@ -745,7 +732,7 @@ minetest.register_abm({ minetest.register_abm({ label = "Kelp growth", nodenames = { "group:kelp" }, - interval = 17, --17 + interval = 17, chance = 28, catch_up = false, action = grow_kelp, diff --git a/mods/ITEMS/mcl_ocean/seagrass.lua b/mods/ITEMS/mcl_ocean/seagrass.lua index 26640aa3a..328328993 100644 --- a/mods/ITEMS/mcl_ocean/seagrass.lua +++ b/mods/ITEMS/mcl_ocean/seagrass.lua @@ -149,28 +149,3 @@ end if mod_doc then doc.add_entry_alias("nodes", "mcl_ocean:seagrass_dirt", "craftitems", "mcl_ocean:seagrass") end - -minetest.register_lbm({ - label = "Fix incorrect seagrass", - name = "mcl_ocean:fix_incorrect_seagrass", - nodenames = {"group:seagrass"}, - run_at_every_load = false, - action = function(pos, node) - if node.param2 ~= 3 then - node.param2 = 3 - minetest.set_node(pos, node) - end - end -}) - -minetest.register_on_generated(function(minp, maxp, blockseed) - local seagrass = minetest.find_nodes_in_area(minp, maxp, {"group:seagrass"}) - for _, sgpos in pairs(seagrass) do - local sgnode = minetest.get_node(sgpos) - if sgnode.param2 ~= 3 then - sgnode.param2 = 3 - minetest.set_node(sgpos, sgnode) - end - end -end -) diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr index 680e737b2..714075502 100644 --- a/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr @@ -9,7 +9,7 @@ End Portal Frame with Eye of Ender=Cadre de portail de l'End avec œil 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!=Un portail du Nether téléporte des créatures et des objets dans la chaude et dangereuse dimension du Nether (et vice-versa !). Entrez à vos risques et périls ! Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Tenez-vous un instant dans le portail pour activer la téléportation. Entrer pour la première fois sur un portail Nether créera également un nouveau portail dans l'Overworld. Si un portail du Nether a été construit dans le Nether, il mènera à l'Overworld. Un portail du Nether est détruit si l'une des obsidiennes qui l'entourent est détruite, ou s'il a été pris dans une explosion. -Obsidian is also used as the frame of Nether portals.=Obsidian is also used as the frame of Nether portals. +Obsidian is also used as the frame of Nether portals.=L'obsidienne est aussi utilisée comme cadre des portails du 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 de l'End diff --git a/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.es.tr b/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.es.tr new file mode 100644 index 000000000..c286e90ec --- /dev/null +++ b/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.es.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_raw_ores +Raw Iron=Hierro en bruto +Raw Gold=Oro en bruto +Raw Iron. Mine an Iron ore to get it.=Hierro en bruto. Mina una mena de hierro para conseguirlo. +Raw Gold. Mine a Gold ore to get it.=Oro en bruto. Mina una mena de oro para conseguirlo. +Block of Raw Iron=Bloque de hierro en bruto +Block of Raw Gold=Bloque de oro en bruto +A block of raw Iron is mostly a decorative block but also useful as a compact storage of raw Iron.=Un bloque de hierro en bruto es sobre todo un bloque decorativo pero tambíen es útil como almacenamiento compacto de hierro en bruto. +A block of raw Gold is mostly a decorative block but also useful as a compact storage of raw Gold.=Un bloque de oro en bruto es sobre todo un bloque decorativo pero tambíen es útil como almacenamiento compacto de oro en bruto. diff --git a/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.fr.tr b/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.fr.tr index e77ef66c4..a82da25e9 100644 --- a/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.fr.tr +++ b/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.fr.tr @@ -1,9 +1,9 @@ # textdomain: mcl_raw_ores Raw Iron=Fer brut Raw Gold=Or brut -Raw Iron. Mine an Iron ore to get it.=Fer brut. Miner du minerai de fer pour en obtenir. -Raw Gold. Mine a Gold ore to get it.=Or brut. Miner du minerai d'or pour en obtenir. +Raw iron. Mine an iron ore to get it.=Fer brut. Miner du minerai de fer pour en obtenir. +Raw gold. Mine a gold ore to get it.=Or brut. Miner du minerai d'or pour en obtenir. Block of Raw Iron=Bloc de fer brut Block of Raw Gold=Bloc d'or brut -A block of raw Iron is mostly a decorative block but also useful as a compact storage of raw Iron.=Un bloc de fer brut est principalement un bloc décoratif mais aussi utile comme stockage compact de fer brut. -A block of raw Gold is mostly a decorative block but also useful as a compact storage of raw Gold.=Un bloc d'or brut est principalement un bloc décoratif mais aussi utile comme stockage compact d'or brut. +A block of raw iron is mostly a decorative block but also useful as a compact storage of raw iron.=Un bloc de fer brut est principalement un bloc décoratif mais aussi utile comme stockage compact de fer brut. +A block of raw gold is mostly a decorative block but also useful as a compact storage of raw gold.=Un bloc d'or brut est principalement un bloc décoratif mais aussi utile comme stockage compact d'or brut. diff --git a/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.ja.tr b/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.ja.tr index 9be029657..dc0b8955e 100644 --- a/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.ja.tr +++ b/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.ja.tr @@ -1,9 +1,9 @@ # textdomain: mcl_raw_ores Raw Iron=鉄の粗鉱 Raw Gold=金の粗鉱 -Raw Iron. Mine an Iron ore to get it.=未処理の鉄。鉄鉱石を採掘して入手します。 -Raw Gold. Mine a Gold ore to get it.=未処理の金。金鉱石を採掘して入手します。 +Raw iron. Mine an iron ore to get it.=未処理の鉄。鉄鉱石を採掘して入手します。 +Raw gold. Mine a gold ore to get it.=未処理の金。金鉱石を採掘して入手します。 Block of Raw Iron=鉄の粗鉱ブロック Block of Raw Gold=金の粗鉱ブロック -A block of raw Iron is mostly a decorative block but also useful as a compact storage of raw Iron.=鉄の粗鉱ブロックは、主に装飾用のブロックですが、鉄の粗鉱をコンパクトに収納するのにも便利です。 -A block of raw Gold is mostly a decorative block but also useful as a compact storage of raw Gold.=金の粗鉱ブロックは、主に装飾用のブロックですが、金の粗鉱をコンパクトに収納するのにも便利です。 \ No newline at end of file +A block of raw iron is mostly a decorative block but also useful as a compact storage of raw iron.=鉄の粗鉱ブロックは、主に装飾用のブロックですが、鉄の粗鉱をコンパクトに収納するのにも便利です。 +A block of raw gold is mostly a decorative block but also useful as a compact storage of raw gold.=金の粗鉱ブロックは、主に装飾用のブロックですが、金の粗鉱をコンパクトに収納するのにも便利です。 diff --git a/mods/ITEMS/mcl_raw_ores/locale/template.txt b/mods/ITEMS/mcl_raw_ores/locale/template.txt index c9913e5c9..a9927aafa 100644 --- a/mods/ITEMS/mcl_raw_ores/locale/template.txt +++ b/mods/ITEMS/mcl_raw_ores/locale/template.txt @@ -1,9 +1,9 @@ # textdomain: mcl_raw_ores Raw Iron= Raw Gold= -Raw Iron. Mine an Iron ore to get it.= -Raw Gold. Mine a Gold ore to get it.= +Raw iron. Mine an iron ore to get it.= +Raw gold. Mine a gold ore to get it.= Block of Raw Iron= Block of Raw Gold= -A block of raw Iron is mostly a decorative block but also useful as a compact storage of raw Iron.= -A block of raw Gold is mostly a decorative block but also useful as a compact storage of raw Gold.= \ No newline at end of file +A block of raw iron is mostly a decorative block but also useful as a compact storage of raw iron.= +A block of raw gold is mostly a decorative block but also useful as a compact storage of raw gold.= diff --git a/mods/ITEMS/mcl_sculk/locale/mcl_sculk.fr.tr b/mods/ITEMS/mcl_sculk/locale/mcl_sculk.fr.tr new file mode 100644 index 000000000..fd9a1b973 --- /dev/null +++ b/mods/ITEMS/mcl_sculk/locale/mcl_sculk.fr.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_sculk +Sculk=Sculk +Sculk Vein=Veine de sculk +Sculk vein.=Veine de sculk. +Sculk Catalyst=Catalyseur de sculk +Sculk Sensor=Capteur sculk +Sculk Shrieker=Hurleur sculk \ No newline at end of file diff --git a/mods/ITEMS/mcl_sculk/locale/template.txt b/mods/ITEMS/mcl_sculk/locale/template.txt new file mode 100644 index 000000000..8f2b3973d --- /dev/null +++ b/mods/ITEMS/mcl_sculk/locale/template.txt @@ -0,0 +1,7 @@ +# textdomain: mcl_sculk +Sculk= +Sculk Vein= +Sculk vein.= +Sculk Catalyst= +Sculk Sensor= +Sculk Shrieker= \ No newline at end of file diff --git a/mods/ITEMS/mcl_shields/init.lua b/mods/ITEMS/mcl_shields/init.lua index 3ad2ada51..fa7714366 100644 --- a/mods/ITEMS/mcl_shields/init.lua +++ b/mods/ITEMS/mcl_shields/init.lua @@ -164,7 +164,7 @@ mcl_damage.register_modifier(function(obj, damage, reason) mcl_inventory.update_inventory_formspec(obj) end end - minetest.sound_play({name = "mcl_block"}) + minetest.sound_play({name = "mcl_block"}, {pos = obj:get_pos(), max_hear_distance = 16}) return 0 end) diff --git a/mods/ITEMS/mcl_shields/locale/mcl_shields.es.tr b/mods/ITEMS/mcl_shields/locale/mcl_shields.es.tr new file mode 100644 index 000000000..be941b20a --- /dev/null +++ b/mods/ITEMS/mcl_shields/locale/mcl_shields.es.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_shields +Shield=Escudo +A shield is a tool used for protecting the player against attacks.=Un escudo es una herramienta usada para proteger al jugador de ataques. +White Shield=Escudo blanco +Grey Shield=Escudo gris +Light Grey Shield=Escudo gris claro +Black Shield=Escudo negro +Red Shield=Escudo rojo +Yellow Shield=Escudo amarillo +Green Shield=Escudo verde +Cyan Shield=Escudo cian +Blue Shield=Escudo azul +Magenta Shield=Escudo magenta +Orange Shield=Escudo naranja +Purple Shield=Escudo purpura +Brown Shield=Escudo marrón +Pink Shield=Escudo rosa +Lime Shield=Escudo lima +Light Blue Shield=Escudo azul claro diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index 6a5f01c5f..117f5665c 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -93,41 +93,41 @@ mcl_signs.build_signs_info() -- ---------------------------- -- -- Standard (original) Sign -mcl_signs.register_sign("mcl_core", "#ffffff", "", "Sign") +mcl_signs.register_sign("mcl_core", "#ffffff", "", S("Sign")) mcl_signs.register_sign_craft("mcl_core", "mcl_core:wood", "") -- birchwood Sign "#d5cb8d" / "#ffdba7" mcl_signs.register_sign_custom("mcl_core", "_birchwood", "mcl_signs_sign_greyscale.png","#ffdba7", "mcl_signs_default_sign_greyscale.png", - "mcl_signs_default_sign_greyscale.png", "Birch Sign" + "mcl_signs_default_sign_greyscale.png", S("Birch Sign") ) mcl_signs.register_sign_craft("mcl_core", "mcl_core:birchwood", "_birchwood") -- sprucewood Sign mcl_signs.register_sign_custom("mcl_core", "_sprucewood", "mcl_signs_sign_dark.png","#ffffff", "mcl_signs_default_sign_dark.png", - "mcl_signs_default_sign_dark.png", "Spruce Sign" + "mcl_signs_default_sign_dark.png", S("Spruce Sign") ) mcl_signs.register_sign_craft("mcl_core", "mcl_core:sprucewood", "_sprucewood") -- darkwood Sign "#291f1a" / "#856443" mcl_signs.register_sign_custom("mcl_core", "_darkwood", "mcl_signs_sign_greyscale.png","#856443", "mcl_signs_default_sign_greyscale.png", - "mcl_signs_default_sign_greyscale.png", "Dark Oak Sign" + "mcl_signs_default_sign_greyscale.png", S("Dark Oak Sign") ) mcl_signs.register_sign_craft("mcl_core", "mcl_core:darkwood", "_darkwood") -- junglewood Sign -mcl_signs.register_sign("mcl_core", "#866249", "_junglewood", "Jungle Sign") +mcl_signs.register_sign("mcl_core", "#866249", "_junglewood", S("Jungle Sign")) mcl_signs.register_sign_craft("mcl_core", "mcl_core:junglewood", "_junglewood") -- acaciawood Sign "b8693d" -mcl_signs.register_sign("mcl_core", "#ea7479", "_acaciawood", "Acacia Sign") +mcl_signs.register_sign("mcl_core", "#ea7479", "_acaciawood", S("Acacia Sign")) mcl_signs.register_sign_craft("mcl_core", "mcl_core:acaciawood", "_acaciawood") if minetest.get_modpath("mcl_mangrove") then -- mangrove_wood Sign "#c7545c" - mcl_signs.register_sign("mcl_mangrove", "#b8693d", "_mangrove_wood", "Mangrove Sign") + mcl_signs.register_sign("mcl_mangrove", "#b8693d", "_mangrove_wood", S("Mangrove Sign")) mcl_signs.register_sign_craft("mcl_mangrove", "mcl_mangrove:mangrove_wood", "_mangrove_wood") end @@ -137,13 +137,13 @@ if minetest.get_modpath("mcl_crimson") then -- warped_hyphae_wood Sign mcl_signs.register_sign_custom("mcl_crimson","_warped_hyphae_wood", "mcl_signs_sign_greyscale.png", "#9f7dcf", "mcl_signs_default_sign_greyscale.png", "mcl_signs_default_sign_greyscale.png", - "Warped Hyphae Sign") + S("Warped Hyphae Sign")) mcl_signs.register_sign_craft("mcl_crimson", "mcl_crimson:warped_hyphae_wood", "_warped_hyphae_wood") -- crimson_hyphae_wood Sign mcl_signs.register_sign_custom("mcl_crimson", "_crimson_hyphae_wood","mcl_signs_sign_greyscale.png", "#c35f51","mcl_signs_default_sign_greyscale.png", "mcl_signs_default_sign_greyscale.png", - "Crimson Hyphae Sign") + S("Crimson Hyphae Sign")) mcl_signs.register_sign_craft("mcl_crimson", "mcl_crimson:crimson_hyphae_wood", "_crimson_hyphae_wood") end diff --git a/mods/ITEMS/mcl_signs/locale/mcl_signs.fr.tr b/mods/ITEMS/mcl_signs/locale/mcl_signs.fr.tr index bf2733a92..8792f4d2e 100644 --- a/mods/ITEMS/mcl_signs/locale/mcl_signs.fr.tr +++ b/mods/ITEMS/mcl_signs/locale/mcl_signs.fr.tr @@ -9,10 +9,11 @@ Done=Terminé Can be written=Peut être écrit Oak Sign=Panneau de chêne Birch Sign=Panneau de bouleau -Spruce Sign=Panneau d'épinette -Dark Oak Sign=Panneau de chêne foncé -Jungle Sign=Panneau de la jungle +Spruce Sign=Panneau de sapin +Dark Oak Sign=Panneau de chêne noir +Jungle Sign=Panneau d'acajou Acacia Sign=Panneau d'acacia -Mangrove Sign=Panneau de la mangrove -Warped Hyphae Sign=Panneau d'hyphe déformé -Crimson Hyphae Sign=Panneau d'hyphe cramoisi +Mangrove Sign=Panneau de palétuvier +Warped Hyphae Sign=Panneau d'hyphe tordu +Crimson Hyphae Sign=Panneau d'hyphe écarlate +Bamboo Sign=Panneau de bambou diff --git a/mods/ITEMS/mcl_signs/locale/template.txt b/mods/ITEMS/mcl_signs/locale/template.txt index 137cc44cd..e1002e126 100644 --- a/mods/ITEMS/mcl_signs/locale/template.txt +++ b/mods/ITEMS/mcl_signs/locale/template.txt @@ -14,3 +14,6 @@ Dark Oak Sign= Jungle Sign= Acacia Sign= Mangrove Sign= +Warped Hyphae Sign= +Crimson Hyphae Sign= +Bamboo Sign= diff --git a/mods/ITEMS/mcl_signs/mod.conf b/mods/ITEMS/mcl_signs/mod.conf index ada0ae58a..e2fe9d40a 100644 --- a/mods/ITEMS/mcl_signs/mod.conf +++ b/mods/ITEMS/mcl_signs/mod.conf @@ -1,4 +1,4 @@ name = mcl_signs description = New and Improved signs - can be colored and made to glow. -depends = mcl_core, mcl_sounds, mcl_dye, mcl_colors +depends = mcl_core, mcl_sounds, mcl_dye, mcl_colors, mcl_util optional_depends = doc diff --git a/mods/ITEMS/mcl_signs/signs_api.lua b/mods/ITEMS/mcl_signs/signs_api.lua index 6d902c5dd..7ada6a646 100644 --- a/mods/ITEMS/mcl_signs/signs_api.lua +++ b/mods/ITEMS/mcl_signs/signs_api.lua @@ -307,7 +307,9 @@ mcl_signs.wall_standard = { local item = clicker:get_wielded_item() local iname = item:get_name() - if node then + local protected = mcl_util.check_position_protection(pos, clicker) + + if node and not protected then if DEBUG then minetest.log("verbose", "[mcl_signs] Wall_Sign Right Click event on valid node.") end @@ -414,7 +416,9 @@ mcl_signs.standing_standard = { local item = clicker:get_wielded_item() local iname = item:get_name() - if node then + local protected = mcl_util.check_position_protection(pos, clicker) + + if node and not protected then -- handle glow from glow_ink_sac *first* if DEBUG then minetest.log("verbose", "[mcl_signs] Standing_Sign Right Click event on valid node.") @@ -550,7 +554,7 @@ function mcl_signs.register_sign (modname, color, _name, ttsign) end new_sign = table.copy(mcl_signs.wall_standard) - new_sign.description = S(ttsign) + new_sign.description = ttsign new_sign.wield_image = "(mcl_signs_default_sign.png^[multiply:" .. color .. ")" new_sign.tiles = { "(mcl_signs_sign.png^[multiply:" .. color .. ")" } @@ -797,10 +801,18 @@ function mcl_signs.register_sign_custom (modname, _name, tiles, color, inventory new_sign = table.copy(mcl_signs.wall_standard) - new_sign.wield_image = "(" .. wield_image .. "^[multiply:" .. color .. ")" - new_sign.tiles = { "(" .. tiles .. "^[multiply:" .. color .. ")" } - new_sign.inventory_image = "(" .. inventory_image .. "^[multiply:" .. color .. ")" - new_sign.description = S(ttsign) + if not color or color == nil then + new_sign.wield_image = wield_image + new_sign.tiles = { tiles } + new_sign.inventory_image = inventory_image + else + new_sign.wield_image = "(" .. wield_image .. "^[multiply:" .. color .. ")" + new_sign.tiles = { "(" .. tiles .. "^[multiply:" .. color .. ")" } + new_sign.inventory_image = "(" .. inventory_image .. "^[multiply:" .. color .. ")" + end + + new_sign.description = ttsign + -- currently have to do this, because of how the base node placement works. new_sign.on_place = function(itemstack, placer, pointed_thing) local above = pointed_thing.above @@ -905,9 +917,15 @@ function mcl_signs.register_sign_custom (modname, _name, tiles, color, inventory local new_sign_standing = {} new_sign_standing = table.copy(mcl_signs.standing_standard) new_sign_standing.drop = "mcl_signs:wall_sign" .. _name - new_sign_standing.wield_image = "(" .. wield_image .. "^[multiply:" .. color .. ")" - new_sign_standing.tiles = { "(" .. tiles .. "^[multiply:" .. color .. ")" } - new_sign_standing.inventory_image = "(" .. inventory_image .. "^[multiply:" .. color .. ")" + if not color or color == nil then + new_sign_standing.wield_image = wield_image + new_sign_standing.tiles = { tiles } + new_sign_standing.inventory_image = inventory_image + else + new_sign_standing.wield_image = "(" .. wield_image .. "^[multiply:" .. color .. ")" + new_sign_standing.tiles = { "(" .. tiles .. "^[multiply:" .. color .. ")" } + new_sign_standing.inventory_image = "(" .. inventory_image .. "^[multiply:" .. color .. ")" + end new_sign_standing.on_rotate = function(pos, node, user, mode) if mode == screwdriver.ROTATE_FACE then node.name = "mcl_signs:standing_sign22_5" .. _name @@ -1013,7 +1031,7 @@ function mcl_signs.reregister_sign (modname, color, _name, ttsign) end new_sign = table.copy(mcl_signs.wall_standard) - new_sign.description = S(ttsign) + new_sign.description = ttsign new_sign.wield_image = "(mcl_signs_default_sign.png^[multiply:" .. color .. ")" new_sign.tiles = { "(mcl_signs_sign.png^[multiply:" .. color .. ")" } @@ -1253,10 +1271,16 @@ function mcl_signs.reregister_sign_custom (modname, _name, tiles, color, invento new_sign = table.copy(mcl_signs.wall_standard) - new_sign.wield_image = "(" .. wield_image .. "^[multiply:" .. color .. ")" - new_sign.tiles = { "(" .. tiles .. "^[multiply:" .. color .. ")" } - new_sign.inventory_image = "(" .. inventory_image .. "^[multiply:" .. color .. ")" - new_sign.description = S(ttsign) + if not color or color == nil then + new_sign.wield_image = wield_image + new_sign.tiles = { tiles } + new_sign.inventory_image = inventory_image + else + new_sign.wield_image = "(" .. wield_image .. "^[multiply:" .. color .. ")" + new_sign.tiles = { "(" .. tiles .. "^[multiply:" .. color .. ")" } + new_sign.inventory_image = "(" .. inventory_image .. "^[multiply:" .. color .. ")" + end + new_sign.description = ttsign -- currently have to do this, because of how the base node placement works. new_sign.on_place = function(itemstack, placer, pointed_thing) local above = pointed_thing.above @@ -1360,10 +1384,15 @@ function mcl_signs.reregister_sign_custom (modname, _name, tiles, color, invento -- standing sign base. local new_sign_standing = {} new_sign_standing = table.copy(mcl_signs.standing_standard) - new_sign_standing.drop = "mcl_signs:wall_sign" .. _name - new_sign_standing.wield_image = "(" .. wield_image .. "^[multiply:" .. color .. ")" - new_sign_standing.tiles = { "(" .. tiles .. "^[multiply:" .. color .. ")" } - new_sign_standing.inventory_image = "(" .. inventory_image .. "^[multiply:" .. color .. ")" + if not color or color == nil then + new_sign_standing.wield_image = wield_image + new_sign_standing.tiles = { tiles } + new_sign_standing.inventory_image = inventory_image + else + new_sign_standing.wield_image = "(" .. wield_image .. "^[multiply:" .. color .. ")" + new_sign_standing.tiles = { "(" .. tiles .. "^[multiply:" .. color .. ")" } + new_sign_standing.inventory_image = "(" .. inventory_image .. "^[multiply:" .. color .. ")" + end new_sign_standing.on_rotate = function(pos, node, user, mode) if mode == screwdriver.ROTATE_FACE then node.name = "mcl_signs:standing_sign22_5" .. _name diff --git a/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.fr.tr b/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.fr.tr index 4fcdc22a3..b3f9349a7 100644 --- a/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.fr.tr +++ b/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.fr.tr @@ -1,2 +1,4 @@ # textdomain: mcl_smithing_table +Inventory=Inventaire +Upgrade Gear=Améliorer l'équipement Smithing table=Table de forgeron diff --git a/mods/ITEMS/mcl_smithing_table/locale/template.txt b/mods/ITEMS/mcl_smithing_table/locale/template.txt index 48b407d97..6133a22db 100644 --- a/mods/ITEMS/mcl_smithing_table/locale/template.txt +++ b/mods/ITEMS/mcl_smithing_table/locale/template.txt @@ -1,2 +1,4 @@ # textdomain: mcl_smithing_table +Inventory= +Upgrade Gear= Smithing table= diff --git a/mods/ITEMS/mcl_smoker/init.lua b/mods/ITEMS/mcl_smoker/init.lua index 81f3c366f..4a4cfca15 100644 --- a/mods/ITEMS/mcl_smoker/init.lua +++ b/mods/ITEMS/mcl_smoker/init.lua @@ -415,14 +415,12 @@ end minetest.register_node("mcl_smoker:smoker", { description = S("Smoker"), _tt_help = S("Cooks food faster than furnace"), - _doc_items_longdesc = S("Smokers cook several items, using a furnace fuel, into something else, but twice as fast as a normal furnace"), + _doc_items_longdesc = S("Smokers cook several items, mainly raw foods, into cooked foods, but twice as fast as a normal furnace."), _doc_items_usagehelp = - S([[ - Use the smoker to open the furnace menu. - Place a furnace fuel in the lower slot and the source material in the upper slot. - The smoker 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 smoker to open the furnace menu.").."\n".. + S("Place a furnace fuel in the lower slot and the source material in the upper slot.").."\n".. + S("The smoker will slowly use its fuel to smelt the item.").."\n".. + S("The result will be placed into the output slot at the right side.").."\n".. S("Use the recipe book to see what foods you can smelt, what you can use as fuel and how long it will burn."), _doc_items_hidden = false, tiles = { diff --git a/mods/ITEMS/mcl_smoker/locale/mcl_smoker.fr.tr b/mods/ITEMS/mcl_smoker/locale/mcl_smoker.fr.tr index 55f6a2ba8..cfbbff113 100644 --- a/mods/ITEMS/mcl_smoker/locale/mcl_smoker.fr.tr +++ b/mods/ITEMS/mcl_smoker/locale/mcl_smoker.fr.tr @@ -2,7 +2,10 @@ Inventory=Inventaire Smoker=Fumoir Cooks food faster than furnace=Cuit la nourriture plus vite qu'un fourneau -Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Utiliser le livre de recettes pour voir ce que vous pouvez fondre, ce que vous pouvez utiliser comme combustible et combien de temps ça va brûler. -Use the furnace to open the furnace menu.\nPlace a furnace fuel in the lower slot and the source material in the upper slot.\nThe furnace will slowly use its fuel to smelt the item.\nThe result will be placed into the output slot at the right side.=Utiliser le fourneau pour ouvrir le menu.\nPlacer le combustible dans la case en bas et le matériau source dans la case du haut.\nLe fourneau utilisera son combustible pour fondre lentement l'objet.\nLe résultat sera placé dans la case de sortie à droite. -Smokers cook several items, mainly raw foods, into cooked foods, but twice as fast as a normal furnace.=Les fumoirs cuisent plusieurs objets, surtout de la nourriture crue, en de la nourriture cuite. -Burning Smoker=Fumoir actif \ No newline at end of file +Use the smoker to open the furnace menu.=Utiliser le fumoir pour ouvrir le menu. +Place a furnace fuel in the lower slot and the source material in the upper slot.=Placer le combustible dans la case en bas et le matériau source dans la case du haut. +The smoker will slowly use its fuel to smelt the item.=Le fumoir utilisera son combustible pour fondre lentement l'objet. +The result will be placed into the output slot at the right side.=Le résultat sera placé dans la case de sortie à droite. +Use the recipe book to see what foods you can smelt, what you can use as fuel and how long it will burn.=Utiliser le livre de recettes pour voir quels aliments vous pouvez cuire, ce que vous pouvez utiliser comme combustible et combien de temps ça va brûler. +Smokers cook several items, mainly raw foods, into cooked foods, but twice as fast as a normal furnace.=Les fumoirs cuisent plusieurs objets, surtout de la nourriture crue, en de la nourriture cuite, mais deux fois plus vite qu'un fourneau normal. +Burning Smoker=Fumoir actif diff --git a/mods/ITEMS/mcl_smoker/locale/template.txt b/mods/ITEMS/mcl_smoker/locale/template.txt index dcf0be9b3..b8e27608a 100644 --- a/mods/ITEMS/mcl_smoker/locale/template.txt +++ b/mods/ITEMS/mcl_smoker/locale/template.txt @@ -2,7 +2,10 @@ Inventory= Smoker= Cooks food faster than furnace= -Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.= -Use the furnace to open the furnace menu.\nPlace a furnace fuel in the lower slot and the source material in the upper slot.\nThe furnace will slowly use its fuel to smelt the item.\nThe result will be placed into the output slot at the right side.= +Use the smoker to open the furnace menu.= +Place a furnace fuel in the lower slot and the source material in the upper slot.= +The smoker 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 foods you can smelt, what you can use as fuel and how long it will burn.= Smokers cook several items, mainly raw foods, into cooked foods, but twice as fast as a normal furnace.= Burning Smoker= diff --git a/mods/ITEMS/mcl_sponges/locale/mcl_sponges.es.tr b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.es.tr index 4ee44838a..2c775bec0 100644 --- a/mods/ITEMS/mcl_sponges/locale/mcl_sponges.es.tr +++ b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.es.tr @@ -6,3 +6,5 @@ A waterlogged sponge can be dried in the furnace to turn it into (dry) sponge. W Riverwaterlogged Sponge=Esponja mojada con agua de rio This is a sponge soaking wet with river water. It can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of the furnace, the river water will pour into the bucket.=Esta es una esponja mojada con agua de río. Se puede secar en el horno para convertirlo en una esponja (seca). Cuando hay un balde vacío en la ranura de combustible del horno, el agua del río se vierte en el balde. A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.=Una esponja se inunda de río (en lugar de inundarse) si absorbe más agua de río que el agua (normal). +Removes water on contact=Remueve agua al contacto +Can be dried in furnace=Puede secarse en un horno diff --git a/mods/ITEMS/mcl_stairs/api.lua b/mods/ITEMS/mcl_stairs/api.lua index 34afb018e..49daad9bf 100644 --- a/mods/ITEMS/mcl_stairs/api.lua +++ b/mods/ITEMS/mcl_stairs/api.lua @@ -71,8 +71,6 @@ end -- Node will be called mcl_stairs:stair_ function mcl_stairs.register_stair(subname, recipeitem, groups, images, description, sounds, blast_resistance, hardness, corner_stair_texture_override) - groups.stair = 1 - groups.building_block = 1 if recipeitem then if not images then @@ -92,6 +90,9 @@ function mcl_stairs.register_stair(subname, recipeitem, groups, images, descript end end + groups.stair = 1 + groups.building_block = 1 + 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 ceiling or at the upper half of the side of a block will be placed upside down."), diff --git a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.es.tr b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.es.tr index 81d30dcd7..a226b5bcb 100644 --- a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.es.tr +++ b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.es.tr @@ -3,3 +3,5 @@ TNT=Dinamita 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.=Un artefacto explosivo. Cuando explota, dañará a los seres vivos y destruirá los bloques a su alrededor. La dinamita tiene un radio de explosión de @1. Con una pequeña posibilidad, los bloques pueden caer como un elemento (como si se extrajera) en lugar de ser destruidos. La dinamita puede encenderse con herramientas, explosiones, fuego, lava y señales de redstone. 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.=Coloque el dinamita y enciéndalo con uno de los métodos anteriores. Aléjese rápidamente a una distancia segura. La dinamita comenzará a verse afectada por la gravedad y explotará en 4 segundos. +Ignited by tools, explosions, fire, lava, redstone power=Encendida por herramientas, explosiones, fuego, lava, y energía de redstone +Explosion radius: @1=Radio de exposión: @1 diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index de0ea6261..5f96fa3fa 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -387,6 +387,9 @@ local function make_stripped_trunk(itemstack, placer, pointed_thing) return itemstack else minetest.swap_node(pointed_thing.under, {name=noddef._mcl_stripped_variant, param2=node.param2}) + if minetest.get_item_group(node_name, "waxed") ~= 0 then + awards.unlock(placer:get_player_name(), "mcl:wax_off") + end if not minetest.is_creative_enabled(placer:get_player_name()) then -- Add wear (as if digging a axey node) local toolname = itemstack:get_name() diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.fr.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.fr.tr index f09ccfcc3..1d3c46648 100644 --- a/mods/ITEMS/mcl_tools/locale/mcl_tools.fr.tr +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.fr.tr @@ -14,23 +14,23 @@ Stone Pickaxe=Pioche en pierre Iron Pickaxe=Pioche en fer Golden Pickaxe=Pioche en or Diamond Pickaxe=Pioche en diamant -Netherite Pickaxe=Pioche en Netherite +Netherite Pickaxe=Pioche en netherite Wooden Shovel=Pelle en bois Stone Shovel=Pelle en pierre Iron Shovel=Pelle en fer Golden Shovel=Pelle en or Diamond Shovel=Pelle en diamant -Netherite Shovel=Pelle en Netherite +Netherite Shovel=Pelle en netherite Wooden Axe=Hache en bois Stone Axe=Hache en pierre Iron Axe=Hache en fer Golden Axe=Hache en or Diamond Axe=Hache en diamant -Netherite Axe=Hache en Netherite +Netherite Axe=Hache en netherite Wooden Sword=Épée en bois Stone Sword=Épée en pierre Iron Sword=Épée en fer Golden Sword=Épée en or Diamond Sword=Épée en diamant -Netherite Sword=Épée en Netherite +Netherite Sword=Épée en netherite Shears=Cisailles diff --git a/mods/ITEMS/mclx_fences/locale/mclx_fences.fr.tr b/mods/ITEMS/mclx_fences/locale/mclx_fences.fr.tr index 244b588c1..77d38d2c6 100644 --- a/mods/ITEMS/mclx_fences/locale/mclx_fences.fr.tr +++ b/mods/ITEMS/mclx_fences/locale/mclx_fences.fr.tr @@ -1,4 +1,4 @@ # textdomain: mclx_fences Red Nether Brick Fence=Barrière en Brique Rouge du Nether -Red Nether Brick Fence Gate=Porte de Barrière en Brique Rouge du Nether -Nether Brick Fence Gate=Porte de Barrière en Brique du Nether +Red Nether Brick Fence Gate=Portillon en Brique Rouge du Nether +Nether Brick Fence Gate=Portillon en Brique du Nether diff --git a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.fr.tr b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.fr.tr index 09461eefd..243fc1e91 100644 --- a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.fr.tr +++ b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.fr.tr @@ -1,20 +1,20 @@ # textdomain: mclx_stairs -Oak Bark Stairs=Escalier en écorse de chêne +Oak Bark Stairs=Escalier en écorce de chêne Oak Bark Slab=Plaque d'écorce de chêne Double Oak Bark Slab=Double dalle d'écorce de chêne Acacia Bark Stairs=Escalier en écorce d'acacia Acacia Bark Slab=Plaque d'écorce d'acacia Double Acacia Bark Slab=Double dalle d'écorce d'acacia -Spruce Bark Stairs=Escalier en écorse de sapin +Spruce Bark Stairs=Escalier en écorce de sapin Spruce Bark Slab=Plaque d'écorce de sapin Double Spruce Bark Slab=Double dalle d'écorce de sapin -Birch Bark Stairs=Escalier en écorse de bouleau +Birch Bark Stairs=Escalier en écorce de bouleau Birch Bark Slab=Plaque d'écorce de bouleau Double Birch Bark Slab=Double dalle d'écorce de bouleau -Jungle Bark Stairs=Escalier en écorse d'acajou +Jungle Bark Stairs=Escalier en écorce d'acajou Jungle Bark Slab=Plaque d'écorce d'acajou Double Jungle Bark Slab=Double dalle d'écorce d'acajou -Dark Oak Bark Stairs=Escalier en écorse de chêne noir +Dark Oak Bark Stairs=Escalier en écorce de chêne noir Dark Oak Bark Slab=Plaque d'écorce de chêne noir Double Dark Oak Bark Slab=Double dalle d'écorce de chêne noir Lapis Lazuli Slab=Dalle de lapis-lazuli diff --git a/mods/ITEMS/screwdriver/locale/screwdriver.fr.tr b/mods/ITEMS/screwdriver/locale/screwdriver.fr.tr index ae014ea09..cce37b34a 100644 --- a/mods/ITEMS/screwdriver/locale/screwdriver.fr.tr +++ b/mods/ITEMS/screwdriver/locale/screwdriver.fr.tr @@ -1,2 +1,2 @@ -#textdomain: screwdriver +# textdomain: screwdriver Screwdriver=Tournevis diff --git a/mods/ITEMS/screwdriver/locale/screwdriver.ja.tr b/mods/ITEMS/screwdriver/locale/screwdriver.ja.tr index dbb80fb61..0a80459f6 100644 --- a/mods/ITEMS/screwdriver/locale/screwdriver.ja.tr +++ b/mods/ITEMS/screwdriver/locale/screwdriver.ja.tr @@ -1,2 +1,2 @@ -#textdomain: screwdriver +# textdomain: screwdriver Screwdriver=ドライバー diff --git a/mods/ITEMS/screwdriver/locale/screwdriver.pl.tr b/mods/ITEMS/screwdriver/locale/screwdriver.pl.tr index b9adac135..d4c0436ab 100644 --- a/mods/ITEMS/screwdriver/locale/screwdriver.pl.tr +++ b/mods/ITEMS/screwdriver/locale/screwdriver.pl.tr @@ -1,2 +1,2 @@ -#textdomain: screwdriver +# textdomain: screwdriver Screwdriver=Śrubokręt diff --git a/mods/ITEMS/screwdriver/locale/screwdriver.ru.tr b/mods/ITEMS/screwdriver/locale/screwdriver.ru.tr index fb6321684..6d7605ae5 100644 --- a/mods/ITEMS/screwdriver/locale/screwdriver.ru.tr +++ b/mods/ITEMS/screwdriver/locale/screwdriver.ru.tr @@ -1,2 +1,2 @@ -#textdomain: screwdriver +# textdomain: screwdriver Screwdriver=Отвёртка diff --git a/mods/ITEMS/screwdriver/locale/screwdriver.zh_TW.tr b/mods/ITEMS/screwdriver/locale/screwdriver.zh_TW.tr index f29a4bf33..12eb2576c 100644 --- a/mods/ITEMS/screwdriver/locale/screwdriver.zh_TW.tr +++ b/mods/ITEMS/screwdriver/locale/screwdriver.zh_TW.tr @@ -1,2 +1,2 @@ -#textdomain: screwdriver +# textdomain: screwdriver Screwdriver=螺絲刀 diff --git a/mods/ITEMS/screwdriver/locale/template.txt b/mods/ITEMS/screwdriver/locale/template.txt index b3871a116..41309d57e 100644 --- a/mods/ITEMS/screwdriver/locale/template.txt +++ b/mods/ITEMS/screwdriver/locale/template.txt @@ -1,2 +1,2 @@ -#textdomain: screwdriver +# textdomain: screwdriver Screwdriver= diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 30e3fac2d..d42720d26 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -5391,11 +5391,11 @@ local function register_decorations() -- Dead bushes minetest.register_decoration({ deco_type = "simple", - place_on = {"group:sand", "mcl_core:podzol", "mcl_core:dirt", "mcl_core:dirt_with_grass", "mcl_core:coarse_dirt", "group:hardened_clay"}, + place_on = {"mcl_core:podzol", "mcl_core:dirt", "mcl_core:dirt_with_grass", "mcl_core:coarse_dirt", "group:hardened_clay"}, sidelen = 16, noise_params = { - offset = 0.0, - scale = 0.035, + offset = 0.01, + scale = 0.003, spread = {x = 100, y = 100, z = 100}, seed = 1972, octaves = 3, @@ -5403,7 +5403,43 @@ local function register_decorations() }, y_min = 4, y_max = mcl_vars.mg_overworld_max, - biomes = {"Desert", "Mesa", "Mesa_sandlevel", "MesaPlateauF", "MesaPlateauF_sandlevel", "MesaPlateauF_grasstop", "MesaBryce", "Taiga", "MegaTaiga"}, + biomes = {"MegaSpruceTaiga", "MegaTaiga"}, + decoration = "mcl_core:deadbush", + height = 1, + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:sand", "group:hardened_clay"}, + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.006, + 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 = {"Desert"}, + decoration = "mcl_core:deadbush", + height = 1, + }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:sand", "mcl_core:podzol", "mcl_core:dirt", "mcl_core:dirt_with_grass", "mcl_core:coarse_dirt", "group:hardened_clay"}, + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.06, + 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 = {"Mesa", "Mesa_sandlevel", "MesaPlateauF", "MesaPlateauF_sandlevel", "MesaPlateauF_grasstop", "MesaBryce"}, decoration = "mcl_core:deadbush", height = 1, }) @@ -5412,8 +5448,8 @@ local function register_decorations() place_on = {"group:sand", "mcl_core:dirt", "mcl_core:dirt_with_grass", "mcl_core:coarse_dirt"}, sidelen = 16, noise_params = { - offset = 0.1, - scale = 0.035, + offset = 0.01, + scale = 0.06, spread = {x = 100, y = 100, z = 100}, seed = 1972, octaves = 3, @@ -5430,8 +5466,8 @@ local function register_decorations() place_on = {"group:sand"}, sidelen = 16, noise_params = { - offset = 0.045, - scale = 0.055, + offset = 0.01, + scale = 0.06, spread = {x = 100, y = 100, z = 100}, seed = 1972, octaves = 3, @@ -5448,8 +5484,8 @@ local function register_decorations() place_on = {"group:hardened_clay"}, sidelen = 16, noise_params = { - offset = 0.010, - scale = 0.035, + offset = 0.01, + scale = 0.06, spread = {x = 100, y = 100, z = 100}, seed = 1972, octaves = 3, @@ -6066,50 +6102,82 @@ if mg_name ~= "singlenode" then for _, f in pairs(deco_ids_trees) do minetest.set_gen_notify({decoration = true}, {f}) end + + local function mangrove_roots_gen(gennotify, pr) + for _, f in pairs(deco_ids_trees) do + for _, pos in ipairs(gennotify["decoration#" .. f] or {}) do + local nn = minetest.find_nodes_in_area(vector.offset(pos, -8, -1, -8), vector.offset(pos, 8, 0, 8), {"mcl_mangrove:mangrove_roots"}) + for _, v in pairs(nn) do + local l = pr:next(2, 16) + local n = minetest.get_node(vector.offset(v, 0, -1, 0)).name + if minetest.get_item_group(n, "water") > 0 then + local wl = "mcl_mangrove:water_logged_roots" + if n:find("river") then + wl = "mcl_mangrove:river_water_logged_roots" + end + minetest.bulk_set_node(minetest.find_nodes_in_area(vector.offset(v, 0, 0, 0), vector.offset(v, 0, -l, 0), {"group:water"}), {name = wl}) + elseif n == "mcl_mud:mud" then + minetest.bulk_set_node(minetest.find_nodes_in_area(vector.offset(v, 0, 0, 0), vector.offset(v, 0, -l, 0), {"mcl_mud:mud"}), {name = "mcl_mangrove:mangrove_mud_roots"}) + elseif n == "air" then + minetest.bulk_set_node(minetest.find_nodes_in_area(vector.offset(v, 0, 0, 0), vector.offset(v, 0, -l, 0), {"air"}), {name = "mcl_mangrove:mangrove_roots"}) + end + end + end + end + end + + local function chorus_gen (gennotify, pr) + for _, pos in ipairs(gennotify["decoration#" .. deco_id_chorus_plant] or {}) do + local x, y, z = pos.x, pos.y, pos.z + if x < -10 or x > 10 or z < -10 or z > 10 then + local realpos = {x = x, y = y + 1, z = z} + local node = minetest.get_node(realpos) + if node and node.name == "mcl_end:chorus_flower" then + mcl_end.grow_chorus_plant(realpos, node, pr) + end + end + end + end + + local function crimson_warped_gen(gennotify) + for _, f in pairs(deco_ids_fungus) do + for _, pos in ipairs(gennotify["decoration#" .. f] or {}) do + minetest.fix_light(vector.offset(pos, -8, -8, -8), vector.offset(pos, 8, 8, 8)) + end + end + end + if deco_id_chorus_plant or deco_ids_fungus or deco_ids_trees then mcl_mapgen_core.register_generator("chorus_grow", nil, function(minp, maxp, blockseed) local gennotify = minetest.get_mapgen_object("gennotify") local pr = PseudoRandom(blockseed + 14) - for _, f in pairs(deco_ids_trees) do - for _, pos in ipairs(gennotify["decoration#" .. f] or {}) do - local nn = minetest.find_nodes_in_area(vector.offset(pos, -8, -1, -8), vector.offset(pos, 8, 0, 8), {"mcl_mangrove:mangrove_roots"}) - for _, v in pairs(nn) do - local l = pr:next(2, 16) - local n = minetest.get_node(vector.offset(v, 0, -1, 0)).name - if minetest.get_item_group(n, "water") > 0 then - local wl = "mcl_mangrove:water_logged_roots" - if n:find("river") then - wl = "mcl_mangrove:river_water_logged_roots" - end - minetest.bulk_set_node(minetest.find_nodes_in_area(vector.offset(v, 0, 0, 0), vector.offset(v, 0, -l, 0), {"group:water"}), {name = wl}) - elseif n == "mcl_mud:mud" then - minetest.bulk_set_node(minetest.find_nodes_in_area(vector.offset(v, 0, 0, 0), vector.offset(v, 0, -l, 0), {"mcl_mud:mud"}), {name = "mcl_mangrove:mangrove_mud_roots"}) - elseif n == "air" then - minetest.bulk_set_node(minetest.find_nodes_in_area(vector.offset(v, 0, 0, 0), vector.offset(v, 0, -l, 0), {"air"}), {name = "mcl_mangrove:mangrove_roots"}) - end - end + + if not (maxp.y < mcl_vars.mg_overworld_min or minp.y > mcl_vars.mg_overworld_max) then + local biomemap = minetest.get_mapgen_object("biomemap") + --minetest.log("mangrove stuff: " .. dump(biomemap)) + local swamp_biome_id = minetest.get_biome_id("MangroveSwamp") + local swamp_shore_id = minetest.get_biome_id("MangroveSwamp_shore") + local is_swamp = table.indexof(biomemap, swamp_biome_id) ~= -1 + local is_swamp_shore = table.indexof(biomemap, swamp_shore_id) ~= -1 + + if is_swamp or is_swamp_shore then + --minetest.log("Mangrove swamp biomes...") + --minetest.log("is_swamp: " .. dump(is_swamp)) + --minetest.log("is_swamp_shore: " .. dump(is_swamp_shore)) + mangrove_roots_gen(gennotify, pr) + else + --minetest.log("is not mangrove swamp biomes...") end end - if minp.y > -26900 then - return + + if not (maxp.y < mcl_vars.mg_end_min or minp.y > mcl_vars.mg_end_max) then + --minetest.log("chorus stuff") + chorus_gen(gennotify, pr) end - for _, pos in ipairs(gennotify["decoration#" .. deco_id_chorus_plant] or {}) do - local x, y, z = pos.x, pos.y, pos.z - if x < -10 or x > 10 or z < -10 or z > 10 then - local realpos = {x = x, y = y + 1, z = z} - local node = minetest.get_node(realpos) - if node and node.name == "mcl_end:chorus_flower" then - mcl_end.grow_chorus_plant(realpos, node, pr) - end - end - end - if minp.y > mcl_vars.mg_nether_max then - return - end - for _, f in pairs(deco_ids_fungus) do - for _, pos in ipairs(gennotify["decoration#" .. f] or {}) do - minetest.fix_light(vector.offset(pos, -8, -8, -8), vector.offset(pos, 8, 8, 8)) - end + + if not (maxp.y < mcl_vars.mg_nether_min or minp.y > mcl_vars.mg_nether_max) then + --minetest.log("nether stuff") + crimson_warped_gen(gennotify) end end) end diff --git a/mods/MAPGEN/mcl_mapgen_core/api.lua b/mods/MAPGEN/mcl_mapgen_core/api.lua index 630270444..978fb7cda 100644 --- a/mods/MAPGEN/mcl_mapgen_core/api.lua +++ b/mods/MAPGEN/mcl_mapgen_core/api.lua @@ -11,6 +11,43 @@ local function roundN(n, d) return math.floor(n * m + 0.5) / m end +local function run_generators (p1, p2, blockseed) + if nodes > 0 then + for _, rec in ipairs(registered_generators) do + if rec.nf then + rec.nf(p1, p2, blockseed) + end + end + end +end + +local function update_data (vm, data, data2) + -- Write stuff + vm:set_data(data) + if param2 > 0 then + vm:set_param2_data(data2) + end +end + +local function post_generator_processing(vm, minp, maxp, deco_used, deco_table, ore_used, ore_table) + if deco_table then + minetest.generate_decorations(vm,vector.new(minp.x,deco_table.min,minp.z),vector.new(maxp.x,deco_table.max,maxp.z)) + elseif deco_used then + minetest.generate_decorations(vm) + end + if ore_table then + minetest.generate_ores(vm,vector.new(minp.x,ore_table.min,minp.z),vector.new(maxp.x,ore_table.max,maxp.z)) + elseif ore_used then + minetest.generate_ores(vm) + end +end + +local function post_generator_processing_2(vm, p1, p2, shadow) + vm:calc_lighting(p1, p2, shadow) + vm:write_to_map() + vm:update_liquids() +end + minetest.register_on_generated(function(minp, maxp, blockseed) local t1 = os.clock() local p1, p2 = {x=minp.x, y=minp.y, z=minp.z}, {x=maxp.x, y=maxp.y, z=maxp.z} @@ -49,34 +86,13 @@ minetest.register_on_generated(function(minp, maxp, blockseed) end if lvm_used then - -- Write stuff - vm:set_data(data) - if param2 > 0 then - vm:set_param2_data(data2) - end - if deco_table then - minetest.generate_decorations(vm,vector.new(minp.x,deco_table.min,minp.z),vector.new(maxp.x,deco_table.max,maxp.z)) - elseif deco_used then - minetest.generate_decorations(vm) - end - if ore_table then - minetest.generate_ores(vm,vector.new(minp.x,ore_table.min,minp.z),vector.new(maxp.x,ore_table.max,maxp.z)) - elseif ore_used then - minetest.generate_ores(vm) - end - vm:calc_lighting(p1, p2, shadow) - vm:write_to_map() - vm:update_liquids() + update_data (vm, data, data2) + post_generator_processing(vm, minp, maxp, deco_used, deco_table, ore_used, ore_table) + post_generator_processing_2(vm, p1, p2, shadow) end end - if nodes > 0 then - for _, rec in ipairs(registered_generators) do - if rec.nf then - rec.nf(p1, p2, blockseed) - end - end - end + run_generators (p1, p2, blockseed) mcl_vars.add_chunk(minp) if logging then @@ -84,6 +100,8 @@ minetest.register_on_generated(function(minp, maxp, blockseed) end end) + + function minetest.register_on_generated(node_function) mcl_mapgen_core.register_generator("mod_"..minetest.get_current_modname().."_"..tostring(#registered_generators+1), nil, node_function) end diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index b9d0e5b48..c3eef6a26 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -290,6 +290,63 @@ local function set_grass_palette(minp,maxp,data2,area,biomemap,nodes) return lvm_used end +local function set_foliage_palette(minp,maxp,data2,area,biomemap,nodes) + -- Flat area at y=0 to read biome 3 times faster than 5.3.0.get_biome_data(pos).biome: 43us vs 125us per iteration: + if not biomemap then return end + local aream = VoxelArea:new({MinEdge={x=minp.x, y=0, z=minp.z}, MaxEdge={x=maxp.x, y=0, z=maxp.z}}) + local nodes = minetest.find_nodes_in_area(minp, maxp, nodes) + for n=1, #nodes do + local n = nodes[n] + local p_pos = area:index(n.x, n.y, n.z) + local b_pos = aream:index(n.x, 0, n.z) + local bn = minetest.get_biome_name(biomemap[b_pos]) + if bn then + local biome = minetest.registered_biomes[bn] + if biome and biome._mcl_biome_type and biome._mcl_foliage_palette_index and data2[p_pos] <= 1 then + data2[p_pos] = biome._mcl_foliage_palette_index + lvm_used = true + elseif biome and biome._mcl_biome_type and biome._mcl_foliage_palette_index and data2[p_pos] > 1 then + data2[p_pos] = (biome._mcl_foliage_palette_index * 8) + data2[p_pos] + lvm_used = true + end + end + end + return lvm_used +end + +local function set_water_palette(minp,maxp,data2,area,biomemap,nodes) + -- Flat area at y=0 to read biome 3 times faster than 5.3.0.get_biome_data(pos).biome: 43us vs 125us per iteration: + if not biomemap then return end + local aream = VoxelArea:new({MinEdge={x=minp.x, y=0, z=minp.z}, MaxEdge={x=maxp.x, y=0, z=maxp.z}}) + local nodes = minetest.find_nodes_in_area(minp, maxp, nodes) + for n=1, #nodes do + local n = nodes[n] + local p_pos = area:index(n.x, n.y, n.z) + local b_pos = aream:index(n.x, 0, n.z) + local bn = minetest.get_biome_name(biomemap[b_pos]) + if bn then + local biome = minetest.registered_biomes[bn] + if biome and biome._mcl_biome_type and biome._mcl_water_palette_index then + data2[p_pos] = biome._mcl_water_palette_index + lvm_used = true + end + end + end + return lvm_used +end + +local function set_seagrass_param2(minp,maxp,data2,area,nodes) + local aream = VoxelArea:new({MinEdge={x=minp.x, y=0, z=minp.z}, MaxEdge={x=maxp.x, y=0, z=maxp.z}}) + local nodes = minetest.find_nodes_in_area(minp, maxp, nodes) + for n=1, #nodes do + local n = nodes[n] + local p_pos = area:index(n.x, n.y, n.z) + data2[p_pos] = 3 + lvm_used = true + end + return lvm_used +end + -- Below the bedrock, generate air/void local function world_structure(vm, data, data2, emin, emax, area, minp, maxp, blockseed) local biomemap --ymin, ymax @@ -356,6 +413,37 @@ local function block_fixes_grass(vm, data, data2, emin, emax, area, minp, maxp, return lvm_used end +local function block_fixes_foliage(vm, data, data2, emin, emax, area, minp, maxp, blockseed) + local biomemap = minetest.get_mapgen_object("biomemap") + local lvm_used = false + local pr = PseudoRandom(blockseed) + if minp.y <= mcl_vars.mg_overworld_max and maxp.y >= mcl_vars.mg_overworld_min then + -- Set param2 (=color) of nodes which use the foliage colour palette. + lvm_used = set_foliage_palette(minp,maxp,data2,area,biomemap,{"group:foliage_palette", "group:foliage_palette_wallmounted"}) + end + return lvm_used +end + +local function block_fixes_water(vm, data, data2, emin, emax, area, minp, maxp, blockseed) + local biomemap = minetest.get_mapgen_object("biomemap") + local lvm_used = false + local pr = PseudoRandom(blockseed) + if minp.y <= mcl_vars.mg_overworld_max and maxp.y >= mcl_vars.mg_overworld_min then + -- Set param2 (=color) of nodes which use the water colour palette. + lvm_used = set_water_palette(minp,maxp,data2,area,biomemap,{"group:water_palette"}) + end + return lvm_used +end + +local function block_fixes_seagrass(vm, data, data2, emin, emax, area, minp, maxp, blockseed) + local lvm_used = false + local pr = PseudoRandom(blockseed) + if minp.y <= mcl_vars.mg_overworld_max and maxp.y >= mcl_vars.mg_overworld_min then + -- Set param2 of seagrass to 3. + lvm_used = set_seagrass_param2(minp, maxp, data2, area, {"group:seagrass"}) + end + return lvm_used +end -- End block fixes: local function end_basic(vm, data, data2, emin, emax, area, minp, maxp, blockseed) @@ -384,6 +472,9 @@ end, 9999, true) if mg_name ~= "v6" and mg_name ~= "singlenode" then mcl_mapgen_core.register_generator("block_fixes_grass", block_fixes_grass, nil, 9999, true) + mcl_mapgen_core.register_generator("block_fixes_foliage", block_fixes_foliage, nil, 9999, true) + mcl_mapgen_core.register_generator("block_fixes_water", block_fixes_water, nil, 9999, true) + mcl_mapgen_core.register_generator("block_fixes_seagrass", block_fixes_seagrass, nil, 9999, true) end if mg_name == "v6" then @@ -460,8 +551,38 @@ minetest.register_lbm({ end }) -minetest.register_on_generated(function(minp, maxp, blockseed) -- Set correct palette indexes of foliage in new mapblocks. - local pos1, pos2 = vector.offset(minp, -16, -16, -16), vector.offset(maxp, 16, 16, 16) +minetest.register_lbm({ + label = "Fix water palette indexes", -- Set correct palette indexes of water in old mapblocks. + name = "mcl_mapgen_core:fix_water_palette_indexes", + nodenames = {"group:water_palette"}, + run_at_every_load = false, + action = function(pos, node) + local water_palette_index = mcl_util.get_palette_indexes_from_pos(pos).water_palette_index + if node.param2 ~= water_palette_index then + node.param2 = water_palette_index + minetest.set_node(pos, node) + end + end +}) + +minetest.register_lbm({ + label = "Fix incorrect seagrass", -- Set correct param2 of seagrass in old mapblocks. + name = "mcl_mapgen_core:fix_incorrect_seagrass", + nodenames = {"group:seagrass"}, + run_at_every_load = false, + action = function(pos, node) + if node.param2 ~= 3 then + node.param2 = 3 + minetest.set_node(pos, node) + end + end +}) + +-- We go outside x and y for where trees are placed next to a biome that has already been generated. +-- We go above maxp.y because trees can often get placed close to the top of a generated area and folliage may not +-- be coloured correctly. +local function fix_folliage_missed (minp, maxp) + local pos1, pos2 = vector.offset(minp, -6, 0, -6), vector.offset(maxp, 6, 14, 6) local foliage = minetest.find_nodes_in_area(pos1, pos2, {"group:foliage_palette", "group:foliage_palette_wallmounted"}) for _, fpos in pairs(foliage) do local fnode = minetest.get_node(fpos) @@ -480,32 +601,10 @@ minetest.register_on_generated(function(minp, maxp, blockseed) -- Set correct pa end end end -) -minetest.register_lbm({ - label = "Fix water palette indexes", -- Set correct palette indexes of water in old mapblocks. - name = "mcl_mapgen_core:fix_water_palette_indexes", - nodenames = {"group:water_palette"}, - run_at_every_load = false, - action = function(pos, node) - local water_palette_index = mcl_util.get_palette_indexes_from_pos(pos).water_palette_index - if node.param2 ~= water_palette_index then - node.param2 = water_palette_index - minetest.set_node(pos, node) - end +minetest.register_on_generated(function(minp, maxp, blockseed) -- Set correct palette indexes of missed foliage. + if maxp.y < 0 then + return end -}) - -minetest.register_on_generated(function(minp, maxp, blockseed) -- Set correct palette indexes of water in new mapblocks. - local pos1, pos2 = vector.offset(minp, -16, -16, -16), vector.offset(maxp, 16, 16, 16) - local water = minetest.find_nodes_in_area(pos1, pos2, {"group:water_palette"}) - for _, wpos in pairs(water) do - local wnode = minetest.get_node(wpos) - local water_palette_index = mcl_util.get_palette_indexes_from_pos(wpos).water_palette_index - if wnode.param2 ~= water_palette_index then - wnode.param2 = water_palette_index - minetest.set_node(wpos, wnode) - end - end -end -) + fix_folliage_missed (minp, maxp) +end) diff --git a/mods/MAPGEN/mcl_structures/ruined_portal.lua b/mods/MAPGEN/mcl_structures/ruined_portal.lua index 00d2d682c..0f7df6686 100644 --- a/mods/MAPGEN/mcl_structures/ruined_portal.lua +++ b/mods/MAPGEN/mcl_structures/ruined_portal.lua @@ -49,8 +49,8 @@ local def = { end, loot = { ["mcl_chests:chest_small" ] ={{ - stacks_min = 2, - stacks_max = 6, + stacks_min = 4, + stacks_max = 8, items = { { itemstring = "mcl_core:iron_nugget", weight = 40, amount_min = 9, amount_max = 18 }, { itemstring = "mcl_core:flint", weight = 40, amount_min = 1, amount_max=4 }, @@ -60,19 +60,44 @@ local def = { { itemstring = "mcl_core:gold_nugget", weight = 15, amount_min = 4, amount_max = 24 }, { itemstring = "mcl_core:apple_gold", weight = 15, }, - { itemstring = "mcl_books:book", weight = 1, func = function(stack, pr) + { itemstring = "mcl_tools:axe_gold", weight = 15, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, + { itemstring = "mcl_farming:hoe_gold", weight = 15, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, + { itemstring = "mcl_tools:pick_gold", weight = 15, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, + { itemstring = "mcl_tools:shovel_gold", weight = 15, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, + { itemstring = "mcl_tools:sword_gold", weight = 15, func = function(stack, pr) mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) end }, - --{ itemstring = "mcl_bamboo:bamboo", weight = 15, amount_min = 1, amount_max=3 }, --FIXME BAMBOO - { itemstring = "mcl_core:diamond", weight = 3, amount_min = 1, amount_max = 3 }, - { itemstring = "mcl_mobitems:saddle", weight = 3, }, - { itemstring = "mcl_core:emerald", weight = 2, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_armor:helmet_gold", weight = 15, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, + { itemstring = "mcl_armor:chestplate_gold", weight = 15, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, + { itemstring = "mcl_armor:leggings_gold", weight = 15, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, + { itemstring = "mcl_armor:boots_gold", weight = 15, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, - { itemstring = "mcl_mobitems:iron_horse_armor", weight = 1, }, + { itemstring = "mcl_potions:speckled_melon", weight = 5, amount_min = 4, amount_max = 12 }, + { itemstring = "mcl_farming:carrot_item_gold", weight = 5, amount_min = 4, amount_max = 12 }, + + { itemstring = "mcl_core:gold_ingot", weight = 5, amount_min = 2, amount_max = 8 }, + { itemstring = "mcl_clock:clock", weight = 5, }, { itemstring = "mcl_mobitems:gold_horse_armor", weight = 1, }, - { itemstring = "mcl_mobitems:diamond_horse_armor", weight = 1, }, - { itemstring = "mcl_core:apple_gold", weight = 15, }, + { itemstring = "mcl_core:goldblock", weight = 1, amount_min = 1, amount_max = 2 }, + { itemstring = "mcl_bells:bell", weight = 1, }, + { itemstring = "mcl_core:apple_gold_enchanted", weight = 1, }, } }} } diff --git a/mods/PLAYER/mcl_hunger/locale/mcl_hunger.fr.tr b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.fr.tr index 811868b3a..04f809c58 100644 --- a/mods/PLAYER/mcl_hunger/locale/mcl_hunger.fr.tr +++ b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.fr.tr @@ -2,7 +2,7 @@ @1 succumbed to the poison.=@1 a succombé au poison. Food=Nourriture Saturation=Saturation -%s: %.1f/%d=%s: %.1f/%d +%s: %.1f/%d=%s : %.1f/%d Exhaust.=Échappement. -%s: %d/%d=%s: %d/%d +%s: %d/%d=%s : %d/%d @1 starved to death.=@1 est mort de faim. diff --git a/mods/PLAYER/mcl_meshhand/init.lua b/mods/PLAYER/mcl_meshhand/init.lua index 864a7c20b..a28efd502 100644 --- a/mods/PLAYER/mcl_meshhand/init.lua +++ b/mods/PLAYER/mcl_meshhand/init.lua @@ -91,6 +91,10 @@ else minetest.register_on_joinplayer(mcl_meshhand.update_player) end +minetest.register_on_joinplayer(function(player) + player:get_inventory():set_size("hand", 1) +end) + -- This is needed to deal damage when punching mobs -- with random items in hand in survival mode minetest.override_item("", { diff --git a/mods/PLAYER/mcl_meshhand/mod.conf b/mods/PLAYER/mcl_meshhand/mod.conf index a95edb858..687932514 100644 --- a/mods/PLAYER/mcl_meshhand/mod.conf +++ b/mods/PLAYER/mcl_meshhand/mod.conf @@ -2,4 +2,4 @@ name = mcl_meshhand author = jordan4ibanez description = Applies the player skin texture to the hand. depends = mcl_tools, mcl_player -optional_depends = mcl_skins +optional_depends = mcl_skins, mcl_custom_skins diff --git a/mods/PLAYER/mcl_music/init.lua b/mods/PLAYER/mcl_music/init.lua index 0d2f9c52e..7f8be5acf 100644 --- a/mods/PLAYER/mcl_music/init.lua +++ b/mods/PLAYER/mcl_music/init.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + local modname = minetest.get_current_modname() local modpath = minetest.get_modpath(modname) @@ -46,7 +48,7 @@ local function pick_track(dimension, underground) minetest.log("action", "[mcl_music] Playing track: " .. chosen_track .. ", for context: " .. track_key) return chosen_track else - --? + -- ? end return nil @@ -102,38 +104,40 @@ local function play() local day_count = minetest.get_day_count() for _, player in pairs(minetest.get_connected_players()) do - local player_name = player:get_player_name() - local hp = player:get_hp() - local pos = player:get_pos() - local dimension = mcl_worlds.pos_to_dimension(pos) + if not player:get_meta():get("mcl_music:disable") then + local player_name = player:get_player_name() + local hp = player:get_hp() + local pos = player:get_pos() + local dimension = mcl_worlds.pos_to_dimension(pos) - local listener = listeners[player_name] - local handle = listener and listener.handle + local listener = listeners[player_name] + local handle = listener and listener.handle - --local old_hp = listener and listener.hp - --local is_hp_changed = old_hp and (math.abs(old_hp - hp) > 0.00001) or false + --local old_hp = listener and listener.hp + --local is_hp_changed = old_hp and (math.abs(old_hp - hp) > 0.00001) or false - local old_dimension = listener and listener.dimension - local is_dimension_changed = old_dimension and (old_dimension ~= dimension) or false + local old_dimension = listener and listener.dimension + local is_dimension_changed = old_dimension and (old_dimension ~= dimension) or false - --minetest.log("handle: " .. dump (handle)) - if is_dimension_changed then - stop_music_for_listener_name(player_name) - if not listeners[player_name] then - listeners[player_name] = {} - end - listeners[player_name].hp = hp - listeners[player_name].dimension = dimension - elseif not handle and (not listener or (listener.day_count ~= day_count)) then - local underground = dimension == "overworld" and pos and pos.y < 0 - local track = pick_track(dimension, underground) - if track then - play_song(track, player_name, dimension, day_count) + -- minetest.log("handle: " .. dump (handle)) + if is_dimension_changed then + stop_music_for_listener_name(player_name) + if not listeners[player_name] then + listeners[player_name] = {} + end + listeners[player_name].hp = hp + listeners[player_name].dimension = dimension + elseif not handle and (not listener or (listener.day_count ~= day_count)) then + local underground = dimension == "overworld" and pos and pos.y < 0 + local track = pick_track(dimension, underground) + if track then + play_song(track, player_name, dimension, day_count) + else + --minetest.log("no track found. weird") + end else - --minetest.log("no track found. weird") + --minetest.log("else") end - else - --minetest.log("else") end end @@ -149,6 +153,10 @@ if music_enabled then stop_music_for_listener_name(player_name) end) + minetest.register_on_leaveplayer(function(player, timed_out) + listeners[player:get_player_name()] = nil + end) + minetest.register_on_respawnplayer(function(player) local player_name = player:get_player_name() stop_music_for_listener_name(player_name) @@ -156,3 +164,59 @@ if music_enabled then else minetest.log("action", "[mcl_music] In-game music is deactivated") end + +minetest.register_chatcommand("music", { + params = "[on|off|invert []]", + description = S("Turns music for yourself or another player on or off."), + func = function(sender_name, params) + local argtable = {} + for str in string.gmatch(params, "([^%s]+)") do + table.insert(argtable, str) + end + + local action = argtable[1] + local playername = argtable[2] + + local sender = minetest.get_player_by_name(sender_name) + local target_player = nil + + if not action or action == "" then action = "invert" end + + if not playername or playername == "" or sender_name == playername then + target_player = sender + playername =sender_name + elseif not minetest.check_player_privs(sender, "debug") then -- Self-use handled above + minetest.chat_send_player(sender_name, S("You need the debug privilege in order to turn ingame music on or off for somebody else!")) + return + else -- Admin + target_player = minetest.get_player_by_name(playername) + end + + if not target_player then + minetest.chat_send_player(sender_name, S("Couldn't find player @1!", playername)) + return + end + + local meta = target_player:get_meta() + local display_new_state = "unknown" -- Should never be displayed -> no translation + + if action == "invert" then + if not meta:get("mcl_music:disable") then + meta:set_int("mcl_music:disable", 1) + display_new_state = S("off") + else + meta:set_string("mcl_music:disable", "") -- This deletes the meta value! + display_new_state = S("on") + end + elseif action == "on" then + meta:set_string("mcl_music:disable", "") -- Delete + display_new_state = S("on") + else + meta:set_int("mcl_music:disable", 1) + display_new_state = S("off") + end + + stop_music_for_listener_name(playername) + minetest.chat_send_player(sender_name, S("Set music for @1 to: @2", playername, display_new_state)) + end, +}) \ No newline at end of file diff --git a/mods/PLAYER/mcl_music/locale/mcl_music.de.tr b/mods/PLAYER/mcl_music/locale/mcl_music.de.tr new file mode 100644 index 000000000..83621545f --- /dev/null +++ b/mods/PLAYER/mcl_music/locale/mcl_music.de.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_music +You need the debug privilege in order to turn ingame music on or off for somebody else!=Sie benötigen das „debug“ Privileg, um die Musik (im Spiel) für jemand anders ein oder aus zu schalten! +Couldn't find player @1!= Spieler @1 konnte nicht gefunden werden! +Set music for @1 to: @2=Musik für @1 auf @2 gesetzt +Turns music for yourself or another player on or off.=Schaltet die Musik für Sie selbst oder jemand anders ein oder aus. +on=an +off=aus \ No newline at end of file diff --git a/mods/PLAYER/mcl_music/locale/template.txt b/mods/PLAYER/mcl_music/locale/template.txt new file mode 100644 index 000000000..66d60e9f5 --- /dev/null +++ b/mods/PLAYER/mcl_music/locale/template.txt @@ -0,0 +1,7 @@ +# textdomain: mcl_music +You need the debug privilege in order to turn ingame music on or off for somebody else!= +Couldn't find player @1!= +Set music for @1 to: @2= +Turns music for yourself or another player on or off.= +on= +off= \ No newline at end of file diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 6c521be72..084fe48a1 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -28,28 +28,6 @@ function mcl_player.player_register_model(name, def) models[name] = def end --- Default player appearance -mcl_player.player_register_model("character.b3d", { - animation_speed = 30, - textures = {"character.png", }, - animations = { - -- Standard animations. - stand = {x= 0, y= 79}, - lay = {x=162, y=166}, - walk = {x=168, y=187}, - mine = {x=189, y=198}, - walk_mine = {x=200, y=219}, - sit = {x= 81, y=160}, - sneak_stand = {x=222, y=302}, - sneak_mine = {x=346, y=366}, - sneak_walk = {x=304, y=323}, - sneak_walk_mine = {x=325, y=344}, - run_walk = {x=440, y=460}, - run_walk_mine = {x=461, y=481}, - sit_mount = {x=484, y=484}, - }, -}) - -- Player stats and animations local player_model = {} local player_textures = {} @@ -112,6 +90,7 @@ function mcl_player.player_set_model(player, model_name) if player_model[name] == model_name then return end + player_model[name] = model_name player:set_properties({ mesh = model_name, visual = "mesh", @@ -119,14 +98,20 @@ function mcl_player.player_set_model(player, model_name) damage_texture_modifier = "^[colorize:red:130", }) update_player_textures(player) - mcl_player.player_set_animation(player, "stand") + + local new_anim = "stand" + local model_animations = models[model_name].animations + local old_anim = player_anim[name] + if model_animations and old_anim and model_animations[old_anim] then + new_anim = old_anim + end + mcl_player.player_set_animation(player, new_anim) else player:set_properties({ textures = { "player.png", "player_back.png", }, visual = "upright_sprite", }) end - player_model[name] = model_name end function mcl_player.player_set_visibility(player, visible) @@ -180,7 +165,6 @@ minetest.register_on_joinplayer(function(player) local name = player:get_player_name() mcl_player.player_attached[name] = false player_visible[name] = true - mcl_player.player_set_model(player, "character.b3d") player_textures[name] = {"character.png", "blank.png", "blank.png"} --player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) player:set_fov(86.1) -- see >>> diff --git a/mods/PLAYER/mcl_player/models/character.b3d b/mods/PLAYER/mcl_player/models/character.b3d deleted file mode 100644 index f5482f4c7..000000000 Binary files a/mods/PLAYER/mcl_player/models/character.b3d and /dev/null differ diff --git a/mods/PLAYER/mcl_player/models/character.blend b/mods/PLAYER/mcl_player/models/character.blend deleted file mode 100644 index f77f49f40..000000000 Binary files a/mods/PLAYER/mcl_player/models/character.blend and /dev/null differ diff --git a/mods/PLAYER/mcl_player_init/init.lua b/mods/PLAYER/mcl_player_init/init.lua deleted file mode 100644 index 52967a441..000000000 --- a/mods/PLAYER/mcl_player_init/init.lua +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index d7a86c438..000000000 --- a/mods/PLAYER/mcl_player_init/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = mcl_player_init -author = Wuzzy -description = Initialize player gameplay stuff that are neither model nor HUD-related diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 0e774ee2f..d4a21508e 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -22,6 +22,20 @@ local math = math -- Internal player state local mcl_playerplus_internal = {} +-- Could occassionally hit about 4.6 but servers and high power machines struggle to keep up with this. +-- Until mapgen can keep up, it's best to limit for server performance etc. +local elytra_vars = { + slowdown_mult = 0.0, -- amount of vel to take per sec + fall_speed = 0.2, -- amount of vel to fall down per sec + speedup_mult = 2, -- amount of speed to add based on look dir + max_speed = tonumber(minetest.settings:get("mcl_elytra_max_speed")) or 4.0, -- was 6 max amount to multiply against look direction when flying + pitch_penalty = 1.3, -- if pitching up, slow down at this rate as a multiplier + rocket_speed = tonumber(minetest.settings:get("mcl_elytra_rocket_speed")) or 3.5, --was 5.5 +} + +--minetest.log("action", "elytra_vars.max_speed: " .. dump(elytra_vars.max_speed)) +--minetest.log("action", "elytra_vars.rocket_speed: " .. dump(elytra_vars.rocket_speed)) + local time = 0 local look_pitch = 0 @@ -136,14 +150,7 @@ local function clamp(num, min, max) return math.min(max, math.max(num, min)) end -local elytra_vars = { - slowdown_mult = 0.0, -- amount of vel to take per sec - fall_speed = 0.2, -- amount of vel to fall down per sec - speedup_mult = 2, -- amount of speed to add based on look dir - max_speed = 6, -- max amount to multiply against look direction when flying - pitch_penalty = 1.3, -- if pitching up, slow down at this rate as a multiplier - rocket_speed = 5.5, -} + local player_props_elytra = { collisionbox = { -0.35, 0, -0.35, 0.35, 0.8, 0.35 }, @@ -232,7 +239,7 @@ minetest.register_globalstep(function(dtime) elytra.speed = 1 - (direction.y/2 + 0.5) end - elytra.active = player:get_inventory():get_stack("armor", 3):get_name() == "mcl_armor:elytra" + elytra.active = minetest.get_item_group(player:get_inventory():get_stack("armor", 3):get_name(), "elytra") ~= 0 and not parent and (elytra.active or (is_just_jumped and player_velocity.y < -0)) and ((not minetest.registered_nodes[fly_node].walkable) or fly_node == "ignore") @@ -265,17 +272,20 @@ minetest.register_globalstep(function(dtime) if vector.length(player_velocity) < 40 then -- player:add_velocity(vector.multiply(player:get_look_dir(), 4)) speed_mult = elytra_vars.rocket_speed - add_particle({ - pos = fly_pos, - velocity = {x = 0, y = 0, z = 0}, - acceleration = {x = 0, y = 0, z = 0}, - expirationtime = math.random(0.3, 0.5), - size = math.random(1, 2), - collisiondetection = false, - vertical = false, - texture = "mcl_particles_bonemeal.png^[colorize:#bc7a57:127", - glow = 5, - }) + + if mcl_util.check_dtime_timer(name, dtime, "ely_rocket_particle_spawn", 0.3) then + add_particle({ + pos = fly_pos, + velocity = vector.zero(), + acceleration = vector.zero(), + expirationtime = math.random(0.3, 0.5), + size = math.random(1, 2), + collisiondetection = false, + vertical = false, + texture = "mcl_particles_bonemeal.png^[colorize:#bc7a57:127", + glow = 5, + }) + end end end diff --git a/mods/PLAYER/mcl_skins/README.md b/mods/PLAYER/mcl_skins/README.md index d05bf9a2e..303dcf424 100644 --- a/mods/PLAYER/mcl_skins/README.md +++ b/mods/PLAYER/mcl_skins/README.md @@ -3,9 +3,11 @@ This mod allows advanced skin customization. Use the /skin command to open the skin configuration screen. +To include custom skins in MineClone2, please download [mcl_custom_skins](https://git.minetest.land/mineclone2/mcl_custom_skins) + ## License Code under MIT license -Author: TenPlus1, Zeg9, MrRar +Author: MrRar See image_credits.txt for image licensing. @@ -15,6 +17,7 @@ See image_credits.txt for image licensing. Register a skin item. `item` is a table with item properties listed below. ### Item properties + `type` Set the item type. Valid values are: "base", "footwear", "eye", "mouth", "bottom", "top", "hair", "headwear" @@ -28,16 +31,40 @@ Coloring only works for "base", "bottom, "top", and "hair". `preview_rotation` A table containing properties x and y. x and y represent the x and y rotation of the item preview. -`alex` -If set to true the item will be default for female character. +`template2` +If set to true the item will be default for female template. -`steve` -If set to true the item will be default for male character. +`template1` +If set to true the item will be default for male template. + +`rank` +This property is used to change the application order of the skin item when applied to a player. +The default ranks for each item type are: + +base: 10 + +footwear: 20 + +eye: 30 + +mouth: 40 + +bottom: 50 + +top: 60 + +hair: 70 + +headwear: 80 + +Lower ranks are applied to the player first and can thus be covered by higher rank items. ### `mcl_skins.show_formspec(player, active_tab, page_num)` Show the skin configuration screen. + `player` is a player ObjectRef. + `active_tab` is the tab that will be displayed. This parameter is optional. Can be one of: "arm", "base", "footwear", "eye", "mouth", "bottom", "top", "hair", "headwear" @@ -50,7 +77,9 @@ Returns an array of tables containing information about each skin. Each table contains the following properties: `id`: A string representing the node ID. A node can be registered using this node ID. + `texture`: A texture string that can be used in the node defintion. + `slim_arms`: A boolean value. If true, this texture is used with the "female" player mesh. Otherwise the regular mesh is to be used. ### `mcl_skins.get_node_id_by_player(player)` @@ -71,10 +100,19 @@ These colors are separate from `mcl_skins.color` because some mods register two ### `mcl_skins.color` A table of ColorSpec integers that the player can select to color colorable skin items. -### `mcl_skins.players` +### `mcl_skins.player_skins` A table mapped by player ObjectRef containing tables holding the player's selected skin items and colors. Only stores skin information for logged in users. -### mcl_skins.compile_skin(skin) +### `mcl_skins.compile_skin(skin)` `skin` is a table with skin item properties. Returns an image string. + +### `mcl_skins.register_simple_skin(skin)` +`skin` is a table with the following properties: + +`texture` +The texture of the skin. + +`slim_arms` +A boolean value. If set to true, the slim armed player mesh will be used with this skin. diff --git a/mods/PLAYER/mcl_skins/edit_skin.lua b/mods/PLAYER/mcl_skins/edit_skin.lua index f4f6fe90f..706c08461 100644 --- a/mods/PLAYER/mcl_skins/edit_skin.lua +++ b/mods/PLAYER/mcl_skins/edit_skin.lua @@ -1,10 +1,12 @@ local S = minetest.get_translator("mcl_skins") local color_to_string = minetest.colorspec_to_colorstring +local EDIT_SKIN_KEY = -1 -- The key used for edit skin in the mcl_skins.simple_skins table mcl_skins = { simple_skins = {}, + texture_to_simple_skin = {}, item_names = {"base", "footwear", "eye", "mouth", "bottom", "top", "hair", "headwear"}, - tab_names = {"template", "base", "headwear", "hair", "eye", "mouth", "top", "arm", "bottom", "footwear"}, + tab_names = {"skin", "template", "base", "headwear", "hair", "eye", "mouth", "top", "arm", "bottom", "footwear"}, tab_descriptions = { template = S("Templates"), arm = S("Arm size"), @@ -18,8 +20,8 @@ mcl_skins = { headwear = S("Headwears"), skin = S("Skins"), }, - steve = {}, -- Stores skin values for Steve skin - alex = {}, -- Stores skin values for Alex skin + template1 = {}, -- Stores edit skin values for template1 + template2 = {}, -- Stores edit skin values for template2 base = {}, -- List of base textures -- Base color is separate to keep the number of junk nodes registered in check @@ -50,63 +52,90 @@ mcl_skins = { headwear = {}, masks = {}, preview_rotations = {}, - players = {} + ranks = {}, + player_skins = {}, + player_formspecs = {}, } function mcl_skins.register_item(item) assert(mcl_skins[item.type], "Skin item type " .. item.type .. " does not exist.") local texture = item.texture or "blank.png" - if item.steve then - mcl_skins.steve[item.type] = texture + if item.template1 then + mcl_skins.template1[item.type] = texture end - if item.alex then - mcl_skins.alex[item.type] = texture + if item.template2 then + mcl_skins.template2[item.type] = texture end table.insert(mcl_skins[item.type], texture) mcl_skins.masks[texture] = item.mask - if item.preview_rotation then - mcl_skins.preview_rotations[texture] = item.preview_rotation + mcl_skins.preview_rotations[texture] = item.preview_rotation + mcl_skins.ranks[texture] = item.rank +end + +function mcl_skins.register_simple_skin(skin) + if skin.index then + mcl_skins.simple_skins[skin.index] = skin + else + table.insert(mcl_skins.simple_skins, skin) end + mcl_skins.texture_to_simple_skin[skin.texture] = skin end function mcl_skins.save(player) - local skin = mcl_skins.players[player] + local skin = mcl_skins.player_skins[player] if not skin then return end - + local meta = player:get_meta() meta:set_string("mcl_skins:skin", minetest.serialize(skin)) - - meta:set_string("mcl_skins:skin_id", tostring(skin.simple_skins_id or "")) + + -- Clear out the old way of storing the simple skin ID + meta:set_string("mcl_skins:skin_id", "") end minetest.register_chatcommand("skin", { description = S("Open skin configuration screen."), privs = {}, - func = function(name, param) mcl_skins.show_formspec(minetest.get_player_by_name(name)) end + func = function(name, param) + local player = minetest.get_player_by_name(name) + local formspec_data = mcl_skins.player_formspecs[player] + local active_tab = formspec_data.active_tab + local page_num = formspec_data.page_num + mcl_skins.show_formspec(player, active_tab, page_num) + end }) function mcl_skins.compile_skin(skin) + if not skin then return "blank.png" end + if skin.simple_skins_id then - return mcl_skins.simple_skins[skin.simple_skins_id].texture + return skin.simple_skins_id end - local output = "" - for i, item in pairs(mcl_skins.item_names) do + local ranks = {} + local layers = {} + for i, item in ipairs(mcl_skins.item_names) do local texture = skin[item] + local layer = "" + local rank = mcl_skins.ranks[texture] or i * 10 if texture and texture ~= "blank.png" then - if skin[item .. "_color"] and mcl_skins.masks[texture] then - if #output > 0 then output = output .. "^" end local color = color_to_string(skin[item .. "_color"]) - output = output .. - "(" .. mcl_skins.masks[texture] .. "^[colorize:" .. color .. ":alpha)" + layer = "(" .. mcl_skins.masks[texture] .. "^[colorize:" .. color .. ":alpha)" end - if #output > 0 then output = output .. "^" end - output = output .. texture + if #layer > 0 then layer = layer .. "^" end + layer = layer .. texture + layers[rank] = layer + table.insert(ranks, rank) end end + table.sort(ranks) + local output = "" + for i, rank in ipairs(ranks) do + if #output > 0 then output = output .. "^" end + output = output .. layers[rank] + end return output end @@ -115,13 +144,13 @@ function mcl_skins.update_player_skin(player) return end - local skin = mcl_skins.players[player] + local skin = mcl_skins.player_skins[player] mcl_player.player_set_skin(player, mcl_skins.compile_skin(skin)) local slim_arms if skin.simple_skins_id then - slim_arms = mcl_skins.simple_skins[skin.simple_skins_id].slim_arms + slim_arms = mcl_skins.texture_to_simple_skin[skin.simple_skins_id].slim_arms else slim_arms = skin.slim_arms end @@ -131,33 +160,35 @@ end -- Load player skin on join minetest.register_on_joinplayer(function(player) - local function table_get_random(t) - return t[math.random(#t)] - end local skin = player:get_meta():get_string("mcl_skins:skin") if skin then skin = minetest.deserialize(skin) end if skin then - -- If the player moves a slider and then quickly exits the game, form_send_job gets saved. - -- This should never have been put in with the skin data in the first place. - skin.form_send_job = nil + if not mcl_skins.texture_to_simple_skin[skin.simple_skins_id] then + skin.simple_skins_id = nil + end - mcl_skins.players[player] = skin + mcl_skins.player_skins[player] = skin else if math.random() > 0.5 then - skin = table.copy(mcl_skins.steve) + skin = table.copy(mcl_skins.template1) else - skin = table.copy(mcl_skins.alex) + skin = table.copy(mcl_skins.template2) end - mcl_skins.players[player] = skin + mcl_skins.player_skins[player] = skin end - - mcl_skins.players[player].simple_skins_id = nil + + mcl_skins.player_formspecs[player] = { + active_tab = "skin", + page_num = 1 + } + if #mcl_skins.simple_skins > 0 then local skin_id = tonumber(player:get_meta():get_string("mcl_skins:skin_id")) if skin_id and mcl_skins.simple_skins[skin_id] then - mcl_skins.players[player].simple_skins_id = skin_id + local texture = mcl_skins.simple_skins[skin_id].texture + mcl_skins.player_skins[player].simple_skins_id = texture end end mcl_skins.save(player) @@ -165,33 +196,30 @@ minetest.register_on_joinplayer(function(player) end) minetest.register_on_leaveplayer(function(player) - mcl_skins.players[player] = nil + mcl_skins.player_skins[player] = nil + mcl_skins.player_formspecs[player] = nil end) -function mcl_skins.show_formspec(player, active_tab, page_num) - local skin = mcl_skins.players[player] - local default = #mcl_skins.simple_skins > 0 and "skin" or "template" - active_tab = active_tab or default - page_num = page_num or 1 - - local page_count - if page_num < 1 then page_num = 1 end - if mcl_skins[active_tab] then - page_count = math.ceil(#mcl_skins[active_tab] / 16) - if page_num > page_count then - page_num = page_count - end - elseif active_tab == "skin" then - page_count = math.ceil((#mcl_skins.simple_skins + 2) / 8) - if page_num > page_count then - page_num = page_count - end - else - page_num = 1 - page_count = 1 +local function calculate_page_count(tab) + if tab == "skin" then + return math.ceil((#mcl_skins.simple_skins + 2) / 8) + elseif mcl_skins[tab] then + return math.ceil(#mcl_skins[tab] / 16) end + return 1 +end + +function mcl_skins.show_formspec(player, active_tab, page_num) + local formspec_data = mcl_skins.player_formspecs[player] + local skin = mcl_skins.player_skins[player] + formspec_data.active_tab = active_tab - local formspec = "formspec_version[3]size[13.2,11]" + local page_count = calculate_page_count(active_tab) + if page_num < 1 then page_num = 1 end + if page_num > page_count then page_num = page_count end + formspec_data.page_num = page_num + + local formspec = "formspec_version[3]size[14.2,11]" for i, tab in pairs(mcl_skins.tab_names) do if tab == active_tab then @@ -201,21 +229,23 @@ function mcl_skins.show_formspec(player, active_tab, page_num) local y = 0.3 + (i - 1) * 0.8 formspec = formspec .. - "button[0.3," .. y .. ";3,0.8;" .. tab .. ";" .. mcl_skins.tab_descriptions[tab] .. "]" + "style[" .. tab .. ";content_offset=16,0]" .. + "button[0.3," .. y .. ";4,0.8;" .. tab .. ";" .. mcl_skins.tab_descriptions[tab] .. "]" .. + "image[0.4," .. y + 0.1 .. ";0.6,0.6;mcl_skins_icons.png^[verticalframe:11:" .. i - 1 .. "]" if skin.simple_skins_id then break end end local slim_arms if skin.simple_skins_id then - slim_arms = mcl_skins.simple_skins[skin.simple_skins_id].slim_arms + slim_arms = mcl_skins.texture_to_simple_skin[skin.simple_skins_id].slim_arms else slim_arms = skin.slim_arms end local mesh = slim_arms and "mcl_armor_character_female.b3d" or "mcl_armor_character.b3d" formspec = formspec .. - "model[10,0.3;3,7;player_mesh;" .. mesh .. ";" .. + "model[11,0.3;3,7;player_mesh;" .. mesh .. ";" .. mcl_skins.compile_skin(skin) .. ",blank.png,blank.png;0,180;false;true;0,0]" @@ -224,23 +254,24 @@ function mcl_skins.show_formspec(player, active_tab, page_num) local page_end = math.min(page_start + 8 - 1, #mcl_skins.simple_skins) formspec = formspec .. "style_type[button;bgcolor=#00000000]" - + local skin = table.copy(skin) - local skin_id = skin.simple_skins_id or -1 + local simple_skins_id = skin.simple_skins_id skin.simple_skins_id = nil - - local skins = table.copy(mcl_skins.simple_skins) - skins[-1] = { + mcl_skins.simple_skins[EDIT_SKIN_KEY] = { slim_arms = skin.slim_arms, texture = mcl_skins.compile_skin(skin), } + simple_skins_id = simple_skins_id or + mcl_skins.simple_skins[EDIT_SKIN_KEY].texture for i = page_start, page_end do - local skin = skins[i] + local skin = mcl_skins.simple_skins[i] local j = i - page_start - 1 - local mesh = skin.slim_arms and "mcl_armor_character_female.b3d" or "mcl_armor_character.b3d" + local mesh = skin.slim_arms and "mcl_armor_character_female.b3d" or + "mcl_armor_character.b3d" - local x = 3.5 + (j + 1) % 4 * 1.6 + local x = 4.5 + (j + 1) % 4 * 1.6 local y = 0.3 + math.floor((j + 1) / 4) * 3.1 formspec = formspec .. @@ -248,7 +279,7 @@ function mcl_skins.show_formspec(player, active_tab, page_num) skin.texture .. ",blank.png,blank.png;0,180;false;true;0,0]" - if skin_id == i then + if simple_skins_id == skin.texture then formspec = formspec .. "style[" .. i .. ";bgcolor=;bgimg=mcl_skins_select_overlay.png;" .. @@ -258,22 +289,22 @@ function mcl_skins.show_formspec(player, active_tab, page_num) "button[" .. x .. "," .. y .. ";1.5,3;" .. i .. ";]" end - if page_start == -1 then - formspec = formspec .. "image[3.85,1;0.8,0.8;mcl_skins_button.png]" + if page_start == EDIT_SKIN_KEY then + formspec = formspec .. "image[4.85,1;0.8,0.8;mcl_skins_button.png]" end elseif active_tab == "template" then formspec = formspec .. - "model[4,2;2,3;player_mesh;mcl_armor_character.b3d;" .. - mcl_skins.compile_skin(mcl_skins.steve) .. + "model[5,2;2,3;player_mesh;mcl_armor_character.b3d;" .. + mcl_skins.compile_skin(mcl_skins.template1) .. ",blank.png,blank.png;0,180;false;true;0,0]" .. - "button[4,5.2;2,0.8;steve;" .. S("Select") .. "]" .. + "button[5,5.2;2,0.8;template1;" .. S("Select") .. "]" .. - "model[6.5,2;2,3;player_mesh;mcl_armor_character_female.b3d;" .. - mcl_skins.compile_skin(mcl_skins.alex) .. + "model[7.5,2;2,3;player_mesh;mcl_armor_character_female.b3d;" .. + mcl_skins.compile_skin(mcl_skins.template2) .. ",blank.png,blank.png;0,180;false;true;0,0]" .. - "button[6.5,5.2;2,0.8;alex;" .. S("Select") .. "]" + "button[7.5,5.2;2,0.8;template2;" .. S("Select") .. "]" elseif mcl_skins[active_tab] then formspec = formspec .. @@ -308,7 +339,7 @@ function mcl_skins.show_formspec(player, active_tab, page_num) end i = i - 1 - local x = 3.5 + i % 4 * 1.6 + local x = 4.5 + i % 4 * 1.6 local y = 0.3 + math.floor(i / 4) * 1.6 formspec = formspec .. "model[" .. x .. "," .. y .. @@ -325,11 +356,12 @@ function mcl_skins.show_formspec(player, active_tab, page_num) formspec = formspec .. "button[" .. x .. "," .. y .. ";1.5,1.5;" .. texture .. ";]" end elseif active_tab == "arm" then - local x = skin.slim_arms and 4.7 or 3.6 + local x = skin.slim_arms and 5.7 or 4.6 formspec = formspec .. - "image_button[3.6,0.3;1,1;mcl_skins_thick_arms.png;thick_arms;]" .. - "image_button[4.7,0.3;1,1;mcl_skins_slim_arms.png;slim_arms;]" .. - "style[arm;bgcolor=;bgimg=mcl_skins_select_overlay.png;bgimg_middle=14,14;bgimg_pressed=mcl_skins_select_overlay.png]" .. + "image_button[4.6,0.3;1,1;mcl_skins_thick_arms.png;thick_arms;]" .. + "image_button[5.7,0.3;1,1;mcl_skins_slim_arms.png;slim_arms;]" .. + "style[arm;bgcolor=;bgimg=mcl_skins_select_overlay.png;" .. + "bgimg_middle=14,14;bgimg_pressed=mcl_skins_select_overlay.png]" .. "button[" .. x .. ",0.3;1,1;arm;]" end @@ -343,7 +375,7 @@ function mcl_skins.show_formspec(player, active_tab, page_num) for i, colorspec in pairs(colors) do local color = color_to_string(colorspec) i = i - 1 - local x = 3.6 + i % 6 * 0.9 + local x = 4.6 + i % 6 * 0.9 local y = 8 + math.floor(i / 6) * 0.9 formspec = formspec .. "image_button[" .. x .. "," .. y .. @@ -353,7 +385,8 @@ function mcl_skins.show_formspec(player, active_tab, page_num) if selected_color == colorspec then formspec = formspec .. "style[" .. color .. - ";bgcolor=;bgimg=mcl_skins_select_overlay.png;bgimg_middle=14,14;bgimg_pressed=mcl_skins_select_overlay.png]" .. + ";bgcolor=;bgimg=mcl_skins_select_overlay.png;bgimg_middle=14,14;" .. + "bgimg_pressed=mcl_skins_select_overlay.png]" .. "button[" .. x .. "," .. y .. ";0.8,0.8;" .. color .. ";]" end @@ -365,7 +398,7 @@ function mcl_skins.show_formspec(player, active_tab, page_num) local green = math.floor(selected_color / 0x100) - 0xff0000 - red * 0x100 local blue = selected_color - 0xff000000 - red * 0x10000 - green * 0x100 formspec = formspec .. - "container[9.2,8]" .. + "container[10.2,8]" .. "scrollbaroptions[min=0;max=255;smallstep=20]" .. "box[0.4,0;2.49,0.38;red]" .. @@ -386,49 +419,42 @@ function mcl_skins.show_formspec(player, active_tab, page_num) "container_end[]" end end - + if page_num > 1 then formspec = formspec .. - "image_button[3.5,6.7;1,1;mcl_skins_arrow.png^[transformFX;previous_page;]" + "image_button[4.5,6.7;1,1;mcl_skins_arrow.png^[transformFX;previous_page;]" end if page_num < page_count then formspec = formspec .. - "image_button[8.8,6.7;1,1;mcl_skins_arrow.png;next_page;]" + "image_button[9.8,6.7;1,1;mcl_skins_arrow.png;next_page;]" end if page_count > 1 then formspec = formspec .. - "label[6.3,7.2;" .. page_num .. " / " .. page_count .. "]" + "label[7.3,7.2;" .. page_num .. " / " .. page_count .. "]" end local player_name = player:get_player_name() - minetest.show_formspec(player_name, "mcl_skins:" .. active_tab .. "_" .. page_num, formspec) + minetest.show_formspec(player_name, "mcl_skins:skins", formspec) end minetest.register_on_player_receive_fields(function(player, formname, fields) + local formspec_data = mcl_skins.player_formspecs[player] + local active_tab = formspec_data.active_tab + local page_num = formspec_data.page_num + if fields.__mcl_skins then - mcl_skins.show_formspec(player) + mcl_skins.show_formspec(player, active_tab, page_num) return false end + if formname ~= "mcl_skins:skins" then return false end - if not formname:find("^mcl_skins:") then return false end - local _, _, active_tab, page_num = formname:find("^mcl_skins:(%a+)_(%d+)") - - local active_tab_found = false - for _, tab in pairs(mcl_skins.tab_names) do - if tab == active_tab then active_tab_found = true end - end - active_tab = active_tab_found and active_tab or "template" - - if not page_num or not active_tab then return true end - page_num = math.floor(tonumber(page_num) or 1) - -- Cancel formspec resend after scrollbar move - if mcl_skins.players[player].form_send_job then - mcl_skins.players[player].form_send_job:cancel() - mcl_skins.players[player].form_send_job = nil + if formspec_data.form_send_job then + formspec_data.form_send_job:cancel() + formspec_data.form_send_job = nil end if fields.quit then @@ -436,13 +462,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return true end - if fields.alex then - mcl_skins.players[player] = table.copy(mcl_skins.alex) + if fields.template2 then + mcl_skins.player_skins[player] = table.copy(mcl_skins.template2) mcl_skins.update_player_skin(player) mcl_skins.show_formspec(player, active_tab, page_num) return true - elseif fields.steve then - mcl_skins.players[player] = table.copy(mcl_skins.steve) + elseif fields.template1 then + mcl_skins.player_skins[player] = table.copy(mcl_skins.template1) mcl_skins.update_player_skin(player) mcl_skins.show_formspec(player, active_tab, page_num) return true @@ -450,12 +476,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) for i, tab in pairs(mcl_skins.tab_names) do if fields[tab] then - mcl_skins.show_formspec(player, tab, page_num) + mcl_skins.show_formspec(player, tab, 1) return true end end - local skin = mcl_skins.players[player] + local skin = mcl_skins.player_skins[player] if not skin then return true end if fields.next_page then @@ -496,12 +522,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local color = 0xff000000 + red * 0x10000 + green * 0x100 + blue if color >= 0 and color <= 0xffffffff then -- We delay resedning the form because otherwise it will break dragging scrollbars - mcl_skins.players[player].form_send_job = minetest.after(0.2, function() + formspec_data.form_send_job = minetest.after(0.2, function() if player and player:is_player() then skin[active_tab .. "_color"] = color mcl_skins.update_player_skin(player) mcl_skins.show_formspec(player, active_tab, page_num) - mcl_skins.players[player].form_send_job = nil + formspec_data.form_send_job = nil end end) return true @@ -517,14 +543,14 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end if field and active_tab == "skin" then - local skin_id = tonumber(field) - skin_id = skin_id and math.floor(skin_id) or 0 + local index = tonumber(field) + index = index and math.floor(index) or 0 + mcl_skins.simple_skins[EDIT_SKIN_KEY].texture = nil if #mcl_skins.simple_skins > 0 and - skin_id >= -1 and skin_id <= #mcl_skins.simple_skins + index >= EDIT_SKIN_KEY and index <= #mcl_skins.simple_skins then - if skin_id == -1 then skin_id = nil end - skin.simple_skins_id = skin_id + skin.simple_skins_id = mcl_skins.simple_skins[index].texture mcl_skins.update_player_skin(player) mcl_skins.show_formspec(player, active_tab, page_num) end @@ -532,15 +558,14 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end -- See if field is a texture - if field and mcl_skins[active_tab] then - for i, texture in pairs(mcl_skins[active_tab]) do - if texture == field then - skin[active_tab] = texture - mcl_skins.update_player_skin(player) - mcl_skins.show_formspec(player, active_tab, page_num) - return true - end - end + if + field and mcl_skins[active_tab] and + table.indexof(mcl_skins[active_tab], field) ~= -1 + then + skin[active_tab] = field + mcl_skins.update_player_skin(player) + mcl_skins.show_formspec(player, active_tab, page_num) + return true end -- See if field is a color @@ -559,15 +584,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end) local function init() - local function file_exists(name) - local f = io.open(name) - if not f then - return false - end - f:close() - return true - end - local f = io.open(minetest.get_modpath("mcl_skins") .. "/list.json") assert(f, "Can't open the file list.json") local data = f:read("*all") @@ -579,17 +595,27 @@ local function init() for _, item in pairs(json) do mcl_skins.register_item(item) end - mcl_skins.steve.base_color = mcl_skins.base_color[2] - mcl_skins.steve.hair_color = 0xff5d473b - mcl_skins.steve.top_color = 0xff993535 - mcl_skins.steve.bottom_color = 0xff644939 - mcl_skins.steve.slim_arms = false + mcl_skins.template1.base_color = mcl_skins.base_color[2] + mcl_skins.template1.hair_color = 0xff5d473b + mcl_skins.template1.top_color = 0xff993535 + mcl_skins.template1.bottom_color = 0xff644939 + mcl_skins.template1.slim_arms = false - mcl_skins.alex.base_color = mcl_skins.base_color[1] - mcl_skins.alex.hair_color = 0xff715d57 - mcl_skins.alex.top_color = 0xff346840 - mcl_skins.alex.bottom_color = 0xff383532 - mcl_skins.alex.slim_arms = true + mcl_skins.template2.base_color = mcl_skins.base_color[1] + mcl_skins.template2.hair_color = 0xff715d57 + mcl_skins.template2.top_color = 0xff346840 + mcl_skins.template2.bottom_color = 0xff383532 + mcl_skins.template2.slim_arms = true + + mcl_skins.register_simple_skin({ + index = 0, + texture = "character.png" + }) + mcl_skins.register_simple_skin({ + index = 1, + texture = "mcl_skins_character_1.png", + slim_arms = true + }) end init() diff --git a/mods/PLAYER/mcl_skins/list.json b/mods/PLAYER/mcl_skins/list.json index 01bb622e5..dc7afbfe1 100644 --- a/mods/PLAYER/mcl_skins/list.json +++ b/mods/PLAYER/mcl_skins/list.json @@ -2,8 +2,9 @@ { "type": "footwear", "texture": "mcl_skins_footwear_1.png", - "steve": true, - "alex": true + "template1": true, + "template2": true, + "rank": 55 }, { "type": "footwear", @@ -19,12 +20,12 @@ { "type": "eye", "texture": "mcl_skins_eye_1.png", - "alex": true + "template2": true }, { "type": "eye", "texture": "mcl_skins_eye_2.png", - "steve": true + "template1": true }, { "type": "eye", @@ -49,7 +50,7 @@ { "type": "mouth", "texture": "mcl_skins_mouth_1.png", - "steve": true + "template1": true }, { "type": "mouth", @@ -77,19 +78,19 @@ }, { "type": "mouth", - "alex": true + "template1": true }, { "type": "hair", "texture": "mcl_skins_hair_1.png", "mask": "mcl_skins_hair_1_mask.png", - "alex": true + "template2": true }, { "type": "hair", "texture": "mcl_skins_hair_2.png", "mask": "mcl_skins_hair_2_mask.png", - "steve": true + "template1": true }, { "type": "hair", @@ -146,7 +147,7 @@ { "type": "headwear", "texture": "mcl_skins_headwear_2.png", - "alex": true + "template2": true }, { "type": "headwear", @@ -174,14 +175,14 @@ }, { "type": "headwear", - "steve": true + "template1": true }, { "type": "bottom", "texture": "mcl_skins_bottom_1.png", "mask": "mcl_skins_bottom_1_mask.png", - "steve": true, - "alex": true + "template1": true, + "template2": true }, { "type": "bottom", @@ -198,12 +199,18 @@ "texture": "mcl_skins_bottom_4.png", "mask": "mcl_skins_bottom_4_mask.png" }, + { + "type": "bottom", + "texture": "mcl_skins_bottom_5.png", + "mask": "mcl_skins_bottom_5_mask.png", + "rank": 65 + }, { "type": "top", "texture": "mcl_skins_top_1.png", "mask": "mcl_skins_top_1_mask.png", - "steve": true, - "alex": true + "template1": true, + "template2": true }, { "type": "top", @@ -254,7 +261,7 @@ "type": "base", "texture": "mcl_skins_base_1.png", "mask": "mcl_skins_base_1_mask.png", - "steve": true, - "alex": true + "template1": true, + "template2": true } ] diff --git a/mods/PLAYER/mcl_skins/locale/mcl_skins.es.tr b/mods/PLAYER/mcl_skins/locale/mcl_skins.es.tr new file mode 100644 index 000000000..840d1a520 --- /dev/null +++ b/mods/PLAYER/mcl_skins/locale/mcl_skins.es.tr @@ -0,0 +1,14 @@ +# textdomain: mcl_skins +Skins=Aspectos +Templates=Plantillas +Arm size=Tamaño de los brazos +Bases=Bases +Footwears=Calzado +Eyes=Ojos +Mouths=Bocas +Bottoms=Parte inferior +Tops=Parte superior +Hairs=Cabellos +Headwears=Accesorios para la cabeza +Open skin configuration screen.=Abrir pantalla de configuración de aspectos +Select=Seleccionar diff --git a/mods/PLAYER/mcl_skins/locale/mcl_skins.fr.tr b/mods/PLAYER/mcl_skins/locale/mcl_skins.fr.tr index db937b040..6eb0a17c2 100644 --- a/mods/PLAYER/mcl_skins/locale/mcl_skins.fr.tr +++ b/mods/PLAYER/mcl_skins/locale/mcl_skins.fr.tr @@ -1,13 +1,14 @@ # textdomain: mcl_skins +Skins=Costumes Templates=Modèles Arm size=Taille des bras -Bases=Teint +Bases=Teints Footwears=Chaussures Eyes=Yeux Mouths=Bouches Bottoms=Bas -Tops=Haut +Tops=Hauts Hairs=Cheveux -Headwears=Coiffe +Headwears=Coiffes Open skin configuration screen.=Ouvrir l'écran de configuration du costume. Select=Sélectionner \ No newline at end of file diff --git a/mods/PLAYER/mcl_skins/media_credits.txt b/mods/PLAYER/mcl_skins/media_credits.txt index cda321d60..de32368e9 100644 --- a/mods/PLAYER/mcl_skins/media_credits.txt +++ b/mods/PLAYER/mcl_skins/media_credits.txt @@ -21,6 +21,9 @@ mcl_skins_bottom_3.png mcl_skins_eye_7.png mcl_skins_mouth_7.png mcl_skins_hair_10.png +mcl_skins_hair_6.png +mcl_skins_eye_6.png +mcl_skins_bottom_5.png Original work by MrRar License: CC BY-SA 4.0 @@ -66,13 +69,6 @@ Author: hansuke123. Adapted for mcl_skins by MrRar. License: CC BY-SA 3.0 Source: http://minetest.fensta.bplaced.net/#!page:1,filtertype:Id,filter:291 -mcl_skins_hair_6.png -mcl_skins_eye_6.png -Name: Mumbo Jumbo -Author: ZestyZachary -License: CC 0 (1.0) -Source: http://minetest.fensta.bplaced.net/#!page:1,filtertype:Id,filter:2100 - mcl_skins_eye_4.png Name: lisa Author: hansuke123 diff --git a/mods/PLAYER/mcl_skins/mesh_hand.lua b/mods/PLAYER/mcl_skins/mesh_hand.lua index 28b2bab20..a1d6c0903 100644 --- a/mods/PLAYER/mcl_skins/mesh_hand.lua +++ b/mods/PLAYER/mcl_skins/mesh_hand.lua @@ -14,7 +14,9 @@ function mcl_skins.get_skin_list() for _, game_mode in pairs({"_crea", "_surv"}) do for _, base in pairs(mcl_skins.base) do for _, base_color in pairs(mcl_skins.base_color) do - local id = base:gsub(".png$", "") .. minetest.colorspec_to_colorstring(base_color):gsub("#", "") + local id = base:gsub(".png$", "") + .. minetest.colorspec_to_colorstring(base_color):gsub("#", "") + local female = { texture = make_texture(base, base_color), slim_arms = true, @@ -36,7 +38,8 @@ function mcl_skins.get_skin_list() table.insert(list, { texture = skin.texture, slim_arms = skin.slim_arms, - id = skin.texture:gsub(".png$", "") .. (skin.slim_arms and "_female" or "_male") .. game_mode, + id = skin.texture:gsub(".png$", "") + .. (skin.slim_arms and "_female" or "_male") .. game_mode, creative = game_mode == "_crea" }) end @@ -45,10 +48,10 @@ function mcl_skins.get_skin_list() end function mcl_skins.get_node_id_by_player(player) - local skin = mcl_skins.players[player] + local skin = mcl_skins.player_skins[player] local simple_skin = skin.simple_skins_id if simple_skin then - skin = mcl_skins.simple_skins[skin.simple_skins_id] + skin = mcl_skins.texture_to_simple_skin[skin.simple_skins_id] end local creative = minetest.is_creative_enabled(player:get_player_name()) local append = (skin.slim_arms and "_female" or "_male") .. (creative and "_crea" or "_surv") diff --git a/mods/PLAYER/mcl_skins/meta/mcl_skins_character.txt b/mods/PLAYER/mcl_skins/meta/mcl_skins_character.txt deleted file mode 100644 index c31bd7168..000000000 --- a/mods/PLAYER/mcl_skins/meta/mcl_skins_character.txt +++ /dev/null @@ -1,3 +0,0 @@ -name = "Steve", -author = "%TEXTURE_PACK_AUTHOR%", -gender = "male", diff --git a/mods/PLAYER/mcl_skins/meta/mcl_skins_character_1.txt b/mods/PLAYER/mcl_skins/meta/mcl_skins_character_1.txt deleted file mode 100644 index e6c90dc0f..000000000 --- a/mods/PLAYER/mcl_skins/meta/mcl_skins_character_1.txt +++ /dev/null @@ -1,3 +0,0 @@ -name = "Alex", -author = "%TEXTURE_PACK_AUTHOR%", -gender = "female", diff --git a/mods/PLAYER/mcl_skins/simple_skins.lua b/mods/PLAYER/mcl_skins/simple_skins.lua index 523832f30..3e08c0cb7 100644 --- a/mods/PLAYER/mcl_skins/simple_skins.lua +++ b/mods/PLAYER/mcl_skins/simple_skins.lua @@ -1,5 +1,5 @@ local function init_simple_skins() - local id, f, data, skin = 0 + local id, f, data, skin = 2 local mod_path = minetest.get_modpath("mcl_skins") while true do @@ -35,18 +35,13 @@ local function init_simple_skins() end -- add metadata to list - mcl_skins.simple_skins[id] = { + mcl_skins.register_simple_skin({ + index = id, texture = skin, slim_arms = data and data.gender == "female", - } + }) id = id + 1 end - - if #mcl_skins.simple_skins > 0 then - table.insert(mcl_skins.tab_names, 1, "skin") - else - mcl_skins.simple_skins = {} - end end init_simple_skins() diff --git a/mods/PLAYER/mcl_skins/textures/README.txt b/mods/PLAYER/mcl_skins/textures/README.txt new file mode 100644 index 000000000..8b50278d3 --- /dev/null +++ b/mods/PLAYER/mcl_skins/textures/README.txt @@ -0,0 +1,3 @@ +To add custom skins to the game, please use the mcl_custom_skins mod. +Download it from https://git.minetest.land/mineclone2/mcl_custom_skins +Support for adding custom skins to mcl_skins will be removed in a future MineClone2 release. diff --git a/mods/PLAYER/mcl_spawn/locale/mcl_spawn.fr.tr b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.fr.tr index a2e5fbd8e..a833f8ad0 100644 --- a/mods/PLAYER/mcl_spawn/locale/mcl_spawn.fr.tr +++ b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.fr.tr @@ -2,4 +2,4 @@ New respawn position set!=Nouvelle position de réapparition définie ! Respawn position cleared!=Position de réapparition supprimée ! Couldn't get level of your respawn anchor!=Impossible d'obtenir le niveau de votre ancre de réapparition ! -Your spawn bed was missing or blocked, and you had no charged respawn anchor!=Votre lit d'apparition était manquant ou bloqué, et vou n'avez pas d'ancre de réapparition chargée ! \ No newline at end of file +Your spawn bed was missing or blocked, and you had no charged respawn anchor!=Votre lit d'apparition était manquant ou bloqué, et vous n'avez pas d'ancre de réapparition chargée ! diff --git a/settingtypes.txt b/settingtypes.txt index 628641c54..c5d5d32c1 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -61,6 +61,12 @@ mcl_playersSleepingPercentage (Players Sleeping Percentage) int 100 # setting, so players always keep their inventory on death. mcl_keepInventory (Keep inventory on death) bool false +# Elytra maximum speed cap +mcl_elytra_max_speed (Elytra maximum speed cap) float 4.0 2.5 6.0 + +# Elytra rocket speed cap +mcl_elytra_rocket_speed (Elytra rocket speed cap) float 3.5 2.0 5.5 + # If enabled, chat messages are shown to everyone when a player dies. mcl_showDeathMessages (Show death messages) bool true @@ -115,8 +121,8 @@ mobs_griefing (Mobs change blocks) bool true # If enabled, mobs won't damage particles when they got hurt. mobs_disable_blood (Disable mob damage particles) bool false -#Percentage of peaceful spawn attempts that succeed (default:35) -mcl_mob_peaceful_percentage_spawned (Peaceful percentage success) int 35 0 100 +#Percentage of peaceful spawn attempts that succeed (default:30) +mcl_mob_peaceful_percentage_spawned (Peaceful percentage success) int 30 0 100 #Percentage of peaceful spawn attempts that are group spawns (default:15) mcl_mob_peaceful_group_percentage_spawned (Peaceful group percentage) int 15 0 100 @@ -124,21 +130,36 @@ mcl_mob_peaceful_group_percentage_spawned (Peaceful group percentage) int 15 0 1 #Percentage of hostile spawn attempts that are group spawns (default:20) mcl_mob_hostile_group_percentage_spawned (Hostile group percentage) int 20 0 100 -#Maximum amount mobs (default:500) +#Maximum amount of mobs (default:500) mcl_mob_cap_total (Global mob cap) int 500 0 2048 +#Maximum amount of hostile mobs (default:300) +mcl_mob_cap_hostile (Global hostile mob cap) int 300 0 2048 + +#Maximum amount of non-hostile mobs (default:300) +mcl_mob_cap_non_hostile (Global non-hostile mob cap) int 300 0 2048 + #Maximum amount of mobs per player (default:75) mcl_mob_cap_player (Mob cap per player) int 75 0 2048 #Maximum amount of monsters that will spawn near a player (default:70) mcl_mob_cap_monster (Mob cap monsters) int 70 0 2048 -#Maximum amount of animals that will spawn near a player (default:13) -mcl_mob_cap_animal (Mob cap animals) int 13 0 1024 +#Maximum amount of animals that will spawn near a player (default:10) +mcl_mob_cap_animal (Mob cap animals) int 10 0 1024 #Maximum amount of water mobs that will spawn near a player (default:8) mcl_mob_cap_water (Mob cap water) int 8 0 1024 +#Maximum amount of ambient water mobs that will spawn near a player (default:20) +mcl_mob_cap_water_ambient (Mob cap ambient water) int 20 0 1024 + +#Maximum amount of underground water mobs that will spawn near a player (default:5) +mcl_mob_cap_water_underground (Mob cap underground water) int 5 0 1024 + +#Maximum amount of axolotl mobs that will spawn near a player (default:5) +mcl_mob_cap_axolotl (Mob cap axolotl) int 5 0 1024 + #Maximum amount of ambient mobs that will spawn near a player (default:15) mcl_mob_cap_ambient (Mob cap ambient mobs) int 15 0 1024 diff --git a/textures/bucket.png b/textures/mcl_buckets_bucket.png similarity index 100% rename from textures/bucket.png rename to textures/mcl_buckets_bucket.png diff --git a/textures/bucket_lava.png b/textures/mcl_buckets_lava_bucket.png similarity index 100% rename from textures/bucket_lava.png rename to textures/mcl_buckets_lava_bucket.png diff --git a/textures/bucket_river_water.png b/textures/mcl_buckets_river_water_bucket.png similarity index 100% rename from textures/bucket_river_water.png rename to textures/mcl_buckets_river_water_bucket.png diff --git a/textures/bucket_water.png b/textures/mcl_buckets_water_bucket.png similarity index 100% rename from textures/bucket_water.png rename to textures/mcl_buckets_water_bucket.png diff --git a/textures/mcl_crimson_crimson_fungus.png b/textures/mcl_crimson_crimson_fungus.png index 7a547ca79..2c3d3b599 100644 Binary files a/textures/mcl_crimson_crimson_fungus.png and b/textures/mcl_crimson_crimson_fungus.png differ diff --git a/textures/mcl_crimson_crimson_hyphae_wood.png b/textures/mcl_crimson_crimson_hyphae_wood.png index 0f91c9681..0061537f0 100644 Binary files a/textures/mcl_crimson_crimson_hyphae_wood.png and b/textures/mcl_crimson_crimson_hyphae_wood.png differ diff --git a/textures/mcl_crimson_warped_hyphae_wood.png b/textures/mcl_crimson_warped_hyphae_wood.png index f25d2ad98..8f5953349 100644 Binary files a/textures/mcl_crimson_warped_hyphae_wood.png and b/textures/mcl_crimson_warped_hyphae_wood.png differ diff --git a/textures/mcl_crimson_warped_hyphae_wood_2nd.png b/textures/mcl_crimson_warped_hyphae_wood_2nd.png index 9adca3dd0..8f5953349 100644 Binary files a/textures/mcl_crimson_warped_hyphae_wood_2nd.png and b/textures/mcl_crimson_warped_hyphae_wood_2nd.png differ diff --git a/textures/mcl_farming_sweet_berry.png b/textures/mcl_farming_sweet_berry.png index bb6a3bdef..f6a4c1db6 100644 Binary files a/textures/mcl_farming_sweet_berry.png and b/textures/mcl_farming_sweet_berry.png differ diff --git a/textures/mcl_farming_sweet_berry_bush_0.png b/textures/mcl_farming_sweet_berry_bush_0.png index d8eb23d9d..2d9a7eed8 100644 Binary files a/textures/mcl_farming_sweet_berry_bush_0.png and b/textures/mcl_farming_sweet_berry_bush_0.png differ diff --git a/textures/mcl_farming_sweet_berry_bush_1.png b/textures/mcl_farming_sweet_berry_bush_1.png index 2ac3c205d..ecbd5f4cf 100644 Binary files a/textures/mcl_farming_sweet_berry_bush_1.png and b/textures/mcl_farming_sweet_berry_bush_1.png differ diff --git a/textures/mcl_farming_sweet_berry_bush_2.png b/textures/mcl_farming_sweet_berry_bush_2.png index 5e9a6dd14..e452fe42b 100644 Binary files a/textures/mcl_farming_sweet_berry_bush_2.png and b/textures/mcl_farming_sweet_berry_bush_2.png differ diff --git a/textures/mcl_farming_sweet_berry_bush_3.png b/textures/mcl_farming_sweet_berry_bush_3.png index a473882f4..0748e09c8 100644 Binary files a/textures/mcl_farming_sweet_berry_bush_3.png and b/textures/mcl_farming_sweet_berry_bush_3.png differ diff --git a/textures/mcl_skins_bottom_1.png b/textures/mcl_skins_bottom_1.png index 733cd8aa4..65ab46ca9 100644 Binary files a/textures/mcl_skins_bottom_1.png and b/textures/mcl_skins_bottom_1.png differ diff --git a/textures/mcl_skins_bottom_1_mask.png b/textures/mcl_skins_bottom_1_mask.png index 772966421..ec0f69d2d 100644 Binary files a/textures/mcl_skins_bottom_1_mask.png and b/textures/mcl_skins_bottom_1_mask.png differ diff --git a/textures/mcl_skins_bottom_4.png b/textures/mcl_skins_bottom_4.png index 304a2ccb5..2911d2527 100644 Binary files a/textures/mcl_skins_bottom_4.png and b/textures/mcl_skins_bottom_4.png differ diff --git a/textures/mcl_skins_bottom_4_mask.png b/textures/mcl_skins_bottom_4_mask.png index 7c1f752b8..ec0f69d2d 100644 Binary files a/textures/mcl_skins_bottom_4_mask.png and b/textures/mcl_skins_bottom_4_mask.png differ diff --git a/textures/mcl_skins_bottom_5.png b/textures/mcl_skins_bottom_5.png new file mode 100644 index 000000000..2645d9766 Binary files /dev/null and b/textures/mcl_skins_bottom_5.png differ diff --git a/textures/mcl_skins_bottom_5_mask.png b/textures/mcl_skins_bottom_5_mask.png new file mode 100644 index 000000000..1fdd26ee6 Binary files /dev/null and b/textures/mcl_skins_bottom_5_mask.png differ diff --git a/mods/PLAYER/mcl_skins/textures/mcl_skins_character_1.png b/textures/mcl_skins_character_1.png similarity index 100% rename from mods/PLAYER/mcl_skins/textures/mcl_skins_character_1.png rename to textures/mcl_skins_character_1.png diff --git a/textures/mcl_skins_eye_6.png b/textures/mcl_skins_eye_6.png index 988a40dd3..3b8f897cf 100644 Binary files a/textures/mcl_skins_eye_6.png and b/textures/mcl_skins_eye_6.png differ diff --git a/textures/mcl_skins_hair_6.png b/textures/mcl_skins_hair_6.png index acd5f3ff2..eea7a69a6 100644 Binary files a/textures/mcl_skins_hair_6.png and b/textures/mcl_skins_hair_6.png differ diff --git a/textures/mcl_skins_hair_6_mask.png b/textures/mcl_skins_hair_6_mask.png index 8db61d1ab..6c6c6b965 100644 Binary files a/textures/mcl_skins_hair_6_mask.png and b/textures/mcl_skins_hair_6_mask.png differ diff --git a/textures/mcl_skins_icons.png b/textures/mcl_skins_icons.png new file mode 100644 index 000000000..3f2241afe Binary files /dev/null and b/textures/mcl_skins_icons.png differ diff --git a/textures/mcl_skins_mouth_3.png b/textures/mcl_skins_mouth_3.png index d8ceb01e7..2249962b0 100644 Binary files a/textures/mcl_skins_mouth_3.png and b/textures/mcl_skins_mouth_3.png differ diff --git a/textures/mcl_skins_top_5.png b/textures/mcl_skins_top_5.png index 0c0ea6d19..716b0e305 100644 Binary files a/textures/mcl_skins_top_5.png and b/textures/mcl_skins_top_5.png differ diff --git a/textures/mcl_skins_top_5_mask.png b/textures/mcl_skins_top_5_mask.png index 94ec8dcde..f0f6397c7 100644 Binary files a/textures/mcl_skins_top_5_mask.png and b/textures/mcl_skins_top_5_mask.png differ