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_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/HUD/mcl_achievements/locale/mcl_achievements.es.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr index 2044e8261..c398bb14c 100644 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr @@ -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/ITEMS/REDSTONE/mesecons_solarpanel/init.lua b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua index 7780cbfee..f4e63b78a 100644 --- a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua @@ -1,55 +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 = mcl_util.get_natural_light (position) - if light_level >= 12 then - --minetest.log("Light is greater than 12") - return true - else - 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_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_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/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 56e4a232b..59eea5f33 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -438,12 +438,14 @@ local playermessagecounter = {} 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) @@ -472,16 +474,22 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return end + local custom_sleep_message if fields.chatsubmit and fields.chatmessage ~= "" then - if (not exceeded_rate_limit(player:get_player_name())) and shout_priv_check(player) then - minetest.chat_send_all(minetest.format_chat_message(player:get_player_name(), fields.chatmessage)) - end - return + custom_sleep_message = fields.chatmessage end - if fields.defaultmessage then + 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 - minetest.chat_send_all(minetest.format_chat_message(player:get_player_name(), S("Hey! Would you guys mind sleeping?"))) + 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 diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr index ae035f3bb..97867b44b 100644 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr @@ -45,4 +45,5 @@ 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? \ No newline at end of file +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 dd58d74e8..42e59509e 100644 --- a/mods/ITEMS/mcl_beds/locale/template.txt +++ b/mods/ITEMS/mcl_beds/locale/template.txt @@ -45,4 +45,5 @@ 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?= \ No newline at end of file +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_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/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 9e401a4ff..e6420f91d 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,biomemap,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 @@ -346,23 +403,47 @@ local function world_structure(vm, data, data2, emin, emax, area, minp, maxp, bl end local function block_fixes_grass(vm, data, data2, emin, emax, area, minp, maxp, blockseed) - if maxp.y < mcl_vars.mg_overworld_min then - --minetest.log("Exit grass fix") - return - else - --minetest.log("Grass fixes") - end - - local biomemap = minetest.get_mapgen_object("biomemap") - local lvm_used = false - - 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 grass colour palette. - lvm_used = set_grass_palette(minp,maxp,data2,area,biomemap,{"group:grass_palette"}) - end - return lvm_used + 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 grass colour palette. + lvm_used = set_grass_palette(minp,maxp,data2,area,biomemap,{"group:grass_palette"}) + end + 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,biomemap,{"group:seagrass"}) + end + return lvm_used +end -- End block fixes: local function end_basic(vm, data, data2, emin, emax, area, minp, maxp, blockseed) @@ -391,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 @@ -467,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) @@ -487,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/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_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 8ace0a9a9..1de839456 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -239,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") 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