From 8f1f3760f03fd25ca9912020ae607d7849cc425b Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 30 Jul 2017 19:55:36 +0200 Subject: [PATCH 001/195] Carts: Check for last pathfinder predition too Minor fix to reduce cart jitter slightly --- mods/carts/functions.lua | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/mods/carts/functions.lua b/mods/carts/functions.lua index 96a12d2b..9b7e2c65 100644 --- a/mods/carts/functions.lua +++ b/mods/carts/functions.lua @@ -159,23 +159,29 @@ function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) end function carts:pathfinder(pos_, old_pos, old_dir, ctrl, pf_switch, railtype) + if vector.equals(old_pos, pos_) then + return true + end + local pos = vector.round(pos_) local pf_pos = vector.round(old_pos) local pf_dir = vector.new(old_dir) for i = 1, 3 do - if vector.equals(pf_pos, pos) then - -- Success! Cart moved on correctly - return true - end + pf_dir, pf_switch = carts:get_rail_direction( + pf_pos, pf_dir, ctrl, pf_switch, railtype) - pf_dir, pf_switch = carts:get_rail_direction(pf_pos, pf_dir, ctrl, pf_switch, railtype) if vector.equals(pf_dir, {x=0, y=0, z=0}) then -- No way forwards return false end pf_pos = vector.add(pf_pos, pf_dir) + + if vector.equals(pf_pos, pos) then + -- Success! Cart moved on correctly + return true + end end -- Cart not found return false From 7ffd176f48c4c74a9e5a14e700f720f279dcee9f Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 27 Jul 2017 01:16:17 +0100 Subject: [PATCH 002/195] Lava cooling: Increase interval to 2 An excessive load has been reported caused by the node searching, so even when no lava is present. --- mods/default/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 327e0c8b..bdc30158 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -136,7 +136,7 @@ if minetest.settings:get_bool("enable_lavacooling") ~= false then label = "Lava cooling", nodenames = {"default:lava_source", "default:lava_flowing"}, neighbors = {"group:cools_lava", "group:water"}, - interval = 1, + interval = 2, chance = 2, catch_up = false, action = function(...) From 5d19fd6923b46f812fa04f09644f725ea8823b81 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Wed, 26 Jul 2017 19:38:11 +0100 Subject: [PATCH 003/195] Separate player code into new mod --- game_api.txt | 106 +++++++++--------- mods/default/README.txt | 7 -- mods/default/depends.txt | 1 + mods/default/init.lua | 1 - mods/default/legacy.lua | 11 ++ mods/player_api/README.txt | 20 ++++ .../player.lua => player_api/api.lua} | 49 +++----- mods/player_api/init.lua | 26 +++++ .../models/character.b3d | Bin .../models/character.blend | Bin .../models/character.png | Bin .../sounds/player_damage.ogg | Bin .../textures/gui_hotbar.png | Bin .../textures/gui_hotbar_selected.png | Bin .../textures/player.png | Bin .../textures/player_back.png | Bin 16 files changed, 122 insertions(+), 99 deletions(-) create mode 100644 mods/default/depends.txt create mode 100644 mods/player_api/README.txt rename mods/{default/player.lua => player_api/api.lua} (70%) create mode 100644 mods/player_api/init.lua rename mods/{default => player_api}/models/character.b3d (100%) rename mods/{default => player_api}/models/character.blend (100%) rename mods/{default => player_api}/models/character.png (100%) rename mods/{default => player_api}/sounds/player_damage.ogg (100%) rename mods/{default => player_api}/textures/gui_hotbar.png (100%) rename mods/{default => player_api}/textures/gui_hotbar_selected.png (100%) rename mods/{default => player_api}/textures/player.png (100%) rename mods/{default => player_api}/textures/player_back.png (100%) diff --git a/game_api.txt b/game_api.txt index d5d09e92..4e200fbc 100644 --- a/game_api.txt +++ b/game_api.txt @@ -284,8 +284,58 @@ Give Initial Stuff API ^ Adds items to the list of items to be given +Players API +----------- + +The player API can register player models and update the player's appearence + +* `player_api.register_model(name, def)` + * Register a new model to be used by players + * name: model filename such as "character.x", "foo.b3d", etc. + * def: See [#Model definition] + * saved to player_api.registered_models + +* `player_api.registered_player_models[name]` + * Get a model's definition + * see [#Model definition] + +* `player_api.set_model(player, model_name)` + * Change a player's model + * `player`: PlayerRef + * `model_name`: model registered with player_api.register_model() + +* `player_api.set_animation(player, anim_name [, speed])` + * Applies an animation to a player + * anim_name: name of the animation. + * speed: frames per second. If nil, default from the model is used + +* `player_api.set_textures(player, textures)` + * Sets player textures + * `player`: PlayerRef + * `textures`: array of textures, If `textures` is nil, the default textures from the model def are used + +* `player_api.get_animation(player)` + * Returns a table containing fields `model`, `textures` and `animation`. + * Any of the fields of the returned table may be nil. + * player: PlayerRef + +### Model Definition + + { + animation_speed = 30, -- Default animation speed, in FPS. + textures = {"character.png", }, -- Default array of textures. + visual_size = {x = 1, y = 1}, -- Used to scale the model. + animations = { + -- = {x = , y = }, + foo = {x = 0, y = 19}, + bar = {x = 20, y = 39}, + -- ... + }, + } + + TNT API ----------- +------- `tnt.register_tnt(definition)` @@ -634,60 +684,6 @@ GUI and formspecs * Get the inactive furnace formspec using the defined GUI elements -Player API ----------- - -The player API can register player models and update the player's appearence - -`default.player_register_model(name, def)` - - * Register a new model to be used by players. - * name: model filename such as "character.x", "foo.b3d", etc. - * def: See [#Model definition] - -`default.registered_player_models[name]` - - * Get a model's definition - * see [#Model definition] - -`default.player_set_model(player, model_name)` - - * Change a player's model - * `player`: PlayerRef - * `model_name`: model registered with player_register_model() - -`default.player_set_animation(player, anim_name [, speed])` - - * Applies an animation to a player - * anim_name: name of the animation. - * speed: frames per second. If nil, default from the model is used - -`default.player_set_textures(player, textures)` - - * Sets player textures - * `player`: PlayerRef - * `textures`: array of textures, If `textures` is nil, the default textures from the model def are used - -default.player_get_animation(player) - - * Returns a table containing fields `model`, `textures` and `animation`. - * Any of the fields of the returned table may be nil. - * player: PlayerRef - -### Model Definition - - { - animation_speed = 30, -- Default animation speed, in FPS. - textures = {"character.png", }, -- Default array of textures. - visual_size = {x = 1, y = 1}, -- Used to scale the model. - animations = { - -- = {x = , y = }, - foo = {x = 0, y = 19}, - bar = {x = 20, y = 39}, - -- ... - }, - } - Leafdecay --------- diff --git a/mods/default/README.txt b/mods/default/README.txt index 8af65a9c..1a3446a6 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -54,12 +54,6 @@ Calinou (CC BY-SA 3.0): default_mineral_copper.png default_glass_detail.png -MirceaKitsune (CC BY-SA 3.0): - character.x - -Jordach (CC BY-SA 3.0): - character.png - PilzAdam (CC BY-SA 3.0): default_jungleleaves.png default_junglesapling.png @@ -297,4 +291,3 @@ Chests sounds added by sofar, derived of several files mixed together: - http://www.freesound.org/people/kingsamas/sounds/135576/ CC-BY-3.0 - http://www.freesound.org/people/bulbastre/sounds/126887/ CC-BY-3.0 - http://www.freesound.org/people/Yoyodaman234/sounds/183541/ CC0 - diff --git a/mods/default/depends.txt b/mods/default/depends.txt new file mode 100644 index 00000000..e1c38184 --- /dev/null +++ b/mods/default/depends.txt @@ -0,0 +1 @@ +player_api? diff --git a/mods/default/init.lua b/mods/default/init.lua index 7b5f62f3..2d5a9bd2 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -47,6 +47,5 @@ dofile(default_path.."/item_entity.lua") dofile(default_path.."/craftitems.lua") dofile(default_path.."/crafting.lua") dofile(default_path.."/mapgen.lua") -dofile(default_path.."/player.lua") dofile(default_path.."/aliases.lua") dofile(default_path.."/legacy.lua") diff --git a/mods/default/legacy.lua b/mods/default/legacy.lua index a8c8ad56..37f03212 100644 --- a/mods/default/legacy.lua +++ b/mods/default/legacy.lua @@ -23,3 +23,14 @@ LIGHT_MAX = default.LIGHT_MAX -- Formspecs default.gui_suvival_form = default.gui_survival_form + +-- Players +if minetest.get_modpath("player_api") then + default.registered_player_models = player_api.registered_models + default.player_register_model = player_api.register_model + default.player_attached = player_api.player_attached + default.player_get_animation = player_api.get_animation + default.player_set_model = player_api.set_model + default.player_set_textures = player_api.set_textures + default.player_set_animation = player_api.set_animation +end diff --git a/mods/player_api/README.txt b/mods/player_api/README.txt new file mode 100644 index 00000000..1f28ad9a --- /dev/null +++ b/mods/player_api/README.txt @@ -0,0 +1,20 @@ +Minetest Game mod: player_api +============================ +See license.txt for license information. + +Provides an API to allow multiple mods to set player models and textures. +Also sets the default model, texture, and player flags. + +Authors of source code +---------------------- +Originally by celeron55, Perttu Ahola (LGPL 2.1) +Various Minetest developers and contributors (LGPL 2.1) + +Authors of media (textures, models and sounds) +---------------------------------------------- + +MirceaKitsune (CC BY-SA 3.0): + character.x + +Jordach (CC BY-SA 3.0): + character.png diff --git a/mods/default/player.lua b/mods/player_api/api.lua similarity index 70% rename from mods/default/player.lua rename to mods/player_api/api.lua index 0a2078d6..9dd33eee 100644 --- a/mods/default/player.lua +++ b/mods/player_api/api.lua @@ -1,42 +1,29 @@ -- Minetest 0.4 mod: player -- See README.txt for licensing and other information. +player_api = {} + -- Player animation blending -- Note: This is currently broken due to a bug in Irrlicht, leave at 0 local animation_blend = 0 -default.registered_player_models = { } +player_api.registered_models = { } -- Local for speed. -local models = default.registered_player_models +local models = player_api.registered_models -function default.player_register_model(name, def) +function player_api.register_model(name, def) models[name] = def end --- Default player appearance -default.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, }, - }, -}) - -- Player stats and animations local player_model = {} local player_textures = {} local player_anim = {} local player_sneak = {} -default.player_attached = {} +player_api.player_attached = {} -function default.player_get_animation(player) +function player_api.get_animation(player) local name = player:get_player_name() return { model = player_model[name], @@ -46,7 +33,7 @@ function default.player_get_animation(player) end -- Called when a player's appearance needs to be updated -function default.player_set_model(player, model_name) +function player_api.set_model(player, model_name) local name = player:get_player_name() local model = models[model_name] if model then @@ -59,7 +46,7 @@ function default.player_set_model(player, model_name) visual = "mesh", visual_size = model.visual_size or {x=1, y=1}, }) - default.player_set_animation(player, "stand") + player_api.set_animation(player, "stand") else player:set_properties({ textures = { "player.png", "player_back.png", }, @@ -69,13 +56,13 @@ function default.player_set_model(player, model_name) player_model[name] = model_name end -function default.player_set_textures(player, textures) +function player_api.set_textures(player, textures) local name = player:get_player_name() player_textures[name] = textures player:set_properties({textures = textures,}) end -function default.player_set_animation(player, anim_name, speed) +function player_api.set_animation(player, anim_name, speed) local name = player:get_player_name() if player_anim[name] == anim_name then return @@ -89,16 +76,6 @@ function default.player_set_animation(player, anim_name, speed) player:set_animation(anim, speed or model.animation_speed, animation_blend) end --- Update appearance when the player joins -minetest.register_on_joinplayer(function(player) - default.player_attached[player:get_player_name()] = false - default.player_set_model(player, "character.b3d") - player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) - - player:hud_set_hotbar_image("gui_hotbar.png") - player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") -end) - minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() player_model[name] = nil @@ -107,8 +84,8 @@ minetest.register_on_leaveplayer(function(player) end) -- Localize for better performance. -local player_set_animation = default.player_set_animation -local player_attached = default.player_attached +local player_set_animation = player_api.set_animation +local player_attached = player_api.player_attached -- Check each player and apply animations minetest.register_globalstep(function(dtime) diff --git a/mods/player_api/init.lua b/mods/player_api/init.lua new file mode 100644 index 00000000..9484647c --- /dev/null +++ b/mods/player_api/init.lua @@ -0,0 +1,26 @@ +dofile(minetest.get_modpath("player_api") .. "/api.lua") + +-- Default player appearance +player_api.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, }, + }, +}) + +-- Update appearance when the player joins +minetest.register_on_joinplayer(function(player) + player_api.player_attached[player:get_player_name()] = false + player_api.set_model(player, "character.b3d") + player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) + + player:hud_set_hotbar_image("gui_hotbar.png") + player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") +end) diff --git a/mods/default/models/character.b3d b/mods/player_api/models/character.b3d similarity index 100% rename from mods/default/models/character.b3d rename to mods/player_api/models/character.b3d diff --git a/mods/default/models/character.blend b/mods/player_api/models/character.blend similarity index 100% rename from mods/default/models/character.blend rename to mods/player_api/models/character.blend diff --git a/mods/default/models/character.png b/mods/player_api/models/character.png similarity index 100% rename from mods/default/models/character.png rename to mods/player_api/models/character.png diff --git a/mods/default/sounds/player_damage.ogg b/mods/player_api/sounds/player_damage.ogg similarity index 100% rename from mods/default/sounds/player_damage.ogg rename to mods/player_api/sounds/player_damage.ogg diff --git a/mods/default/textures/gui_hotbar.png b/mods/player_api/textures/gui_hotbar.png similarity index 100% rename from mods/default/textures/gui_hotbar.png rename to mods/player_api/textures/gui_hotbar.png diff --git a/mods/default/textures/gui_hotbar_selected.png b/mods/player_api/textures/gui_hotbar_selected.png similarity index 100% rename from mods/default/textures/gui_hotbar_selected.png rename to mods/player_api/textures/gui_hotbar_selected.png diff --git a/mods/default/textures/player.png b/mods/player_api/textures/player.png similarity index 100% rename from mods/default/textures/player.png rename to mods/player_api/textures/player.png diff --git a/mods/default/textures/player_back.png b/mods/player_api/textures/player_back.png similarity index 100% rename from mods/default/textures/player_back.png rename to mods/player_api/textures/player_back.png From 271b2befaacc80f4bcc63e5cdfb31cb64ff2fec9 Mon Sep 17 00:00:00 2001 From: danielmeek32 Date: Sun, 30 Jul 2017 19:18:12 +0100 Subject: [PATCH 004/195] Player API: Apply model default textures when passing nil to 'set_textures' --- mods/player_api/api.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/player_api/api.lua b/mods/player_api/api.lua index 9dd33eee..21509210 100644 --- a/mods/player_api/api.lua +++ b/mods/player_api/api.lua @@ -58,8 +58,10 @@ end function player_api.set_textures(player, textures) local name = player:get_player_name() - player_textures[name] = textures - player:set_properties({textures = textures,}) + local model = models[player_model[name]] + local model_textures = model and model.textures or nil + player_textures[name] = textures or model_textures + player:set_properties({textures = textures or model_textures,}) end function player_api.set_animation(player, anim_name, speed) From b4abb0757250625e4231478ccde292307c27bc69 Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 1 Aug 2017 04:14:09 +0100 Subject: [PATCH 005/195] Player_api: Integrate settable player collisionbox --- game_api.txt | 1 + mods/player_api/api.lua | 2 ++ mods/player_api/init.lua | 1 + 3 files changed, 4 insertions(+) diff --git a/game_api.txt b/game_api.txt index 4e200fbc..7ea919e6 100644 --- a/game_api.txt +++ b/game_api.txt @@ -331,6 +331,7 @@ The player API can register player models and update the player's appearence bar = {x = 20, y = 39}, -- ... }, + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.77, 0.3}, -- In nodes from centre of feet } diff --git a/mods/player_api/api.lua b/mods/player_api/api.lua index 21509210..00fa2aef 100644 --- a/mods/player_api/api.lua +++ b/mods/player_api/api.lua @@ -45,12 +45,14 @@ function player_api.set_model(player, model_name) textures = player_textures[name] or model.textures, visual = "mesh", visual_size = model.visual_size or {x=1, y=1}, + collisionbox = model.collisionbox or {-0.3, 0.0, -0.3, 0.3, 1.77, 0.3}, }) player_api.set_animation(player, "stand") else player:set_properties({ textures = { "player.png", "player_back.png", }, visual = "upright_sprite", + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.75, 0.3}, }) end player_model[name] = model_name diff --git a/mods/player_api/init.lua b/mods/player_api/init.lua index 9484647c..61d43bd4 100644 --- a/mods/player_api/init.lua +++ b/mods/player_api/init.lua @@ -13,6 +13,7 @@ player_api.register_model("character.b3d", { walk_mine = { x=200, y=219, }, sit = { x= 81, y=160, }, }, + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.77, 0.3}, }) -- Update appearance when the player joins From 57577596d6aaa5d53babc39ca247ff1acd1f7bcb Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 1 Aug 2017 04:47:37 +0100 Subject: [PATCH 006/195] Floatland biomes: Simplify to grassland Make the placeholder biomes grassland to make the shape of the floatland terrain more visible. --- mods/default/mapgen.lua | 17 +++++++---------- mods/flowers/mapgen.lua | 5 ++--- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index a6a4532e..1fc2dc34 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1446,19 +1446,18 @@ end -- Biomes for floatlands -- Used when mgv7 'biomerepeat' flag is false --- TODO Temporary simple biomes to be developed later + +-- TODO Temporary simple biomes to be replaced by special floatland biomes later. function default.register_floatland_biomes(floatland_level, shadow_limit) - -- Coniferous forest - minetest.register_biome({ - name = "floatland_coniferous_forest", + name = "floatland_grassland", --node_dust = "", node_top = "default:dirt_with_grass", depth_top = 1, node_filler = "default:dirt", - depth_filler = 3, + depth_filler = 1, --node_stone = "", --node_water_top = "", --depth_water_top = , @@ -1472,10 +1471,8 @@ function default.register_floatland_biomes(floatland_level, shadow_limit) humidity_point = 50, }) - -- Coniferous forest ocean - minetest.register_biome({ - name = "floatland_coniferous_forest_ocean", + name = "floatland_grassland_ocean", --node_dust = "", node_top = "default:sand", depth_top = 1, @@ -1607,7 +1604,7 @@ local function register_grass_decoration(offset, scale, length) }, biomes = {"grassland", "grassland_dunes", "deciduous_forest", "coniferous_forest", "coniferous_forest_dunes", - "floatland_grassland", "floatland_coniferous_forest"}, + "floatland_grassland"}, y_min = 1, y_max = 31000, decoration = "default:grass_" .. length, @@ -1721,7 +1718,7 @@ function default.register_decorations() octaves = 3, persist = 0.66 }, - biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, + biomes = {"taiga", "coniferous_forest"}, y_min = 2, y_max = 31000, schematic = minetest.get_modpath("default") .. "/schematics/pine_tree.mts", diff --git a/mods/flowers/mapgen.lua b/mods/flowers/mapgen.lua index 92f9609b..6ea796cd 100644 --- a/mods/flowers/mapgen.lua +++ b/mods/flowers/mapgen.lua @@ -95,7 +95,7 @@ local function register_flower(seed, name) persist = 0.6 }, biomes = {"grassland", "deciduous_forest", "coniferous_forest", - "floatland_coniferous_forest"}, + "floatland_grassland"}, y_min = 1, y_max = 31000, decoration = "flowers:"..name, @@ -115,8 +115,7 @@ local function register_mushroom(name) octaves = 3, persist = 0.66 }, - biomes = {"deciduous_forest", "coniferous_forest", - "floatland_coniferous_forest"}, + biomes = {"deciduous_forest", "coniferous_forest"}, y_min = 1, y_max = 31000, decoration = "flowers:"..name, From 3294a2a51549a32b9703e3a4d2346b7fe1b2756c Mon Sep 17 00:00:00 2001 From: ForbiddenJ Date: Tue, 25 Jul 2017 13:52:39 -0500 Subject: [PATCH 007/195] Torches: Make liquids drop torches as items Liquids that are 'igniters', such as lava, will drop the torch without a flame-extinguish sound, as the torch item will burn up after a few seconds with a sound and smoke particles. All other liquids cause a flame-extinguish sound. --- mods/default/torch.lua | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/mods/default/torch.lua b/mods/default/torch.lua index 3c3ae965..016ae685 100644 --- a/mods/default/torch.lua +++ b/mods/default/torch.lua @@ -35,6 +35,21 @@ See LICENSE.txt and http://www.gnu.org/licenses/lgpl-2.1.txt --]] +local function on_flood(pos, oldnode, newnode) + minetest.add_item(pos, ItemStack("default:torch 1")) + -- Play flame-extinguish sound if liquid is not an 'igniter' + local nodedef = minetest.registered_items[newnode.name] + if not (nodedef and nodedef.groups and + nodedef.groups.igniter and nodedef.groups.igniter > 0) then + minetest.sound_play( + "default_cool_lava", + {pos = pos, max_hear_distance = 16, gain = 0.1} + ) + end + -- Remove the torch node + return false +end + minetest.register_node("default:torch", { description = "Torch", drawtype = "mesh", @@ -83,7 +98,9 @@ minetest.register_node("default:torch", { itemstack:set_name("default:torch") return itemstack - end + end, + floodable = true, + on_flood = on_flood, }) minetest.register_node("default:torch_wall", { @@ -105,6 +122,8 @@ minetest.register_node("default:torch_wall", { wall_side = {-1/2, -1/2, -1/8, -1/8, 1/8, 1/8}, }, sounds = default.node_sound_wood_defaults(), + floodable = true, + on_flood = on_flood, }) minetest.register_node("default:torch_ceiling", { @@ -126,6 +145,8 @@ minetest.register_node("default:torch_ceiling", { wall_top = {-1/8, -1/16, -5/16, 1/8, 1/2, 1/8}, }, sounds = default.node_sound_wood_defaults(), + floodable = true, + on_flood = on_flood, }) minetest.register_lbm({ From 77c94087211a9ca41dcfa5bc2d6732f1cdf33425 Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 7 Aug 2017 04:27:19 +0100 Subject: [PATCH 008/195] Player API: Integrate settable player step height Split some long lines. Some nearby code cleanup. --- game_api.txt | 6 ++++-- mods/player_api/api.lua | 6 ++++-- mods/player_api/init.lua | 22 ++++++++++++++-------- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/game_api.txt b/game_api.txt index 7ea919e6..7c3c04cd 100644 --- a/game_api.txt +++ b/game_api.txt @@ -312,7 +312,8 @@ The player API can register player models and update the player's appearence * `player_api.set_textures(player, textures)` * Sets player textures * `player`: PlayerRef - * `textures`: array of textures, If `textures` is nil, the default textures from the model def are used + * `textures`: array of textures, If `textures` is nil the default + textures from the model def are used * `player_api.get_animation(player)` * Returns a table containing fields `model`, `textures` and `animation`. @@ -331,7 +332,8 @@ The player API can register player models and update the player's appearence bar = {x = 20, y = 39}, -- ... }, - collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.77, 0.3}, -- In nodes from centre of feet + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.77, 0.3}, -- In nodes from feet position + stepheight = 0.6, -- In nodes } diff --git a/mods/player_api/api.lua b/mods/player_api/api.lua index 00fa2aef..c79aedc3 100644 --- a/mods/player_api/api.lua +++ b/mods/player_api/api.lua @@ -44,15 +44,17 @@ function player_api.set_model(player, model_name) mesh = model_name, textures = player_textures[name] or model.textures, visual = "mesh", - visual_size = model.visual_size or {x=1, y=1}, + visual_size = model.visual_size or {x = 1, y = 1}, collisionbox = model.collisionbox or {-0.3, 0.0, -0.3, 0.3, 1.77, 0.3}, + stepheight = model.stepheight or 0.6, }) player_api.set_animation(player, "stand") else player:set_properties({ - textures = { "player.png", "player_back.png", }, + textures = {"player.png", "player_back.png"}, visual = "upright_sprite", collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.75, 0.3}, + stepheight = 0.6, }) end player_model[name] = model_name diff --git a/mods/player_api/init.lua b/mods/player_api/init.lua index 61d43bd4..203f60e0 100644 --- a/mods/player_api/init.lua +++ b/mods/player_api/init.lua @@ -6,22 +6,28 @@ player_api.register_model("character.b3d", { 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, }, + 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}, }, collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.77, 0.3}, + stepheight = 0.6, }) -- Update appearance when the player joins minetest.register_on_joinplayer(function(player) player_api.player_attached[player:get_player_name()] = false player_api.set_model(player, "character.b3d") - player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) - + player:set_local_animation( + {x = 0, y = 79}, + {x = 168, y = 187}, + {x = 189, y = 198}, + {x = 200, y = 219}, + 30 + ) player:hud_set_hotbar_image("gui_hotbar.png") player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") end) From 67c01a44c2a32eb47709a1fdc8ac25eb36bb37eb Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Thu, 10 Aug 2017 09:52:53 +0200 Subject: [PATCH 009/195] Beds: Do not crash when placing in an unknown node --- mods/beds/api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/beds/api.lua b/mods/beds/api.lua index 97dde43d..3632dc0c 100644 --- a/mods/beds/api.lua +++ b/mods/beds/api.lua @@ -55,7 +55,7 @@ function beds.register_bed(name, def) end local pos - if minetest.registered_items[minetest.get_node(under).name].buildable_to then + if udef and udef.buildable_to then pos = under else pos = pointed_thing.above From d883012491d3e9ab8970ba56613af4a9036acf34 Mon Sep 17 00:00:00 2001 From: Jens Rottmann <30634967+JRottm@users.noreply.github.com> Date: Thu, 10 Aug 2017 19:01:37 +0200 Subject: [PATCH 010/195] Trivial: Make furnace info text look nicer Furnace inactive (Item: Not cookable; Fuel: Empty) --> becomes --> Furnace inactive (Item: Not cookable; Fuel: Empty) --- mods/default/furnace.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua index 1643d427..162ee4e9 100644 --- a/mods/default/furnace.lua +++ b/mods/default/furnace.lua @@ -208,11 +208,11 @@ local function furnace_node_timer(pos, elapsed) end local fuel_state = "Empty" - local active = "inactive " + local active = "inactive" local result = false if fuel_totaltime ~= 0 then - active = "active " + active = "active" local fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) fuel_state = fuel_percent .. "%" formspec = default.get_furnace_active_formspec(fuel_percent, item_percent) @@ -229,7 +229,7 @@ local function furnace_node_timer(pos, elapsed) minetest.get_node_timer(pos):stop() end - local infotext = "Furnace " .. active .. "(Item: " .. item_state .. + local infotext = "Furnace " .. active .. "\n(Item: " .. item_state .. "; Fuel: " .. fuel_state .. ")" -- From 8817d1c6963b06a1a269c0f8fad7dfe53732f15c Mon Sep 17 00:00:00 2001 From: TumeniNodes Date: Sun, 13 Aug 2017 07:45:39 -0400 Subject: [PATCH 011/195] default_desert_cobble.png with darker mortar (#1859) --- mods/default/README.txt | 4 ++-- mods/default/license.txt | 2 +- mods/default/textures/default_desert_cobble.png | Bin 280 -> 520 bytes 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index 1a3446a6..dd6c44fd 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -114,8 +114,8 @@ paramat (CC BY-SA 3.0): default_silver_sandstone_brick.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) default_silver_sandstone_block.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) -brunob.santos (CC BY-SA 4.0): - default_desert_cobble.png +TumeniNodes (CC BY-SA 4.0): + default_desert_cobble.png -- Derived from a texture by brunob.santos (CC BY-SA 4.0) BlockMen (CC BY-SA 3.0): default_aspen_leaves.png -- Derived from Sofar's texture diff --git a/mods/default/license.txt b/mods/default/license.txt index 72af7284..0bfba618 100644 --- a/mods/default/license.txt +++ b/mods/default/license.txt @@ -76,7 +76,7 @@ http://creativecommons.org/licenses/by-sa/3.0/ ----------------------- Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) -Copyright (C) 2014-2016 brunob.santos +Copyright (C) 2017 TumeniNodes You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/default/textures/default_desert_cobble.png b/mods/default/textures/default_desert_cobble.png index 184a9d8853734f5f58aae6c743d2eed05bb3f7b9..fa1af5d3c85107963f2ce32aa5b208aef5a0ebff 100644 GIT binary patch delta 506 zcmbQi)WI@AqMn19fq_9omp>RteGBjjaSbt64Fw_-AW{o6Q42R!ivS_@2s0qkj5Jq| zG}nl>(2B9ph_=*-v($>W(n_$>inrEEwAMQXkG|F}|%5gHza|R-l zd>4~K7n1^4!$McnVpr25H`8J_vl6#@vl4f+Qg^d55A$*l^9oOkN+9yGsPeL?^Rce; zwQlmaX$`b%1EL@xvTqNz?+CW<40h-VbLtIq>;oaEzHq00Ac}CF5aB#2!g*q(%cLmR z$x$v-K*)7UwChw5a+?<8Ha*6DMvVLPSoc|R9&S7@Gr&In2M?GZ+|}9oSs-Wk%%Nl6~Gr&$`m)85);caykTYoY7;kYKOq8SN>Y-gsuq>8TaB_wm=N-8YEI z+GG6e*u9_}BcYoyic<2+PUcrkm>5*f9q?kK#pi~z-7B6bJlLD*dPFhSFV+9e0y~dt z6=SWBh2MYkT%S}oYvZ9?jVB^{bkNNhM|TX|JhIV8Mvi{*btA!Dt1a&x~c0$s-7 N>FVdQ&WS0Z2>|lfWl8`5 From c5e97867f31f9ea0590a0a415da58af5c0c609e1 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Sun, 13 Aug 2017 12:46:30 +0100 Subject: [PATCH 012/195] TNT's tnt:boom cleanup (#1868) The tnt:boom node doesn't actually need the on_construct and on_timer functions to remove the node after 0.4 seconds as the tnt_explode function already does this beforehand. --- mods/tnt/init.lua | 6 ------ 1 file changed, 6 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 606ab6af..0326000b 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -405,12 +405,6 @@ minetest.register_node("tnt:boom", { walkable = false, drop = "", groups = {dig_immediate = 3}, - on_construct = function(pos) - minetest.get_node_timer(pos):start(0.4) - end, - on_timer = function(pos, elapsed) - minetest.remove_node(pos) - end, -- unaffected by explosions on_blast = function() end, }) From fe710c99a6139d188175b8c801e70e6acb79c2a0 Mon Sep 17 00:00:00 2001 From: Rui Date: Sun, 13 Aug 2017 20:47:01 +0900 Subject: [PATCH 013/195] Boats: Fix player position (#1871) --- mods/boats/depends.txt | 1 + mods/boats/init.lua | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/mods/boats/depends.txt b/mods/boats/depends.txt index 4ad96d51..8e482ce2 100644 --- a/mods/boats/depends.txt +++ b/mods/boats/depends.txt @@ -1 +1,2 @@ default +player_api diff --git a/mods/boats/init.lua b/mods/boats/init.lua index 4d8f4673..38025d16 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -56,8 +56,8 @@ function boat.on_rightclick(self, clicker) if self.driver and clicker == self.driver then self.driver = nil clicker:set_detach() - default.player_attached[name] = false - default.player_set_animation(clicker, "stand" , 30) + player_api.player_attached[name] = false + player_api.set_animation(clicker, "stand" , 30) local pos = clicker:getpos() pos = {x = pos.x, y = pos.y + 0.2, z = pos.z} minetest.after(0.1, function() @@ -74,10 +74,10 @@ function boat.on_rightclick(self, clicker) end self.driver = clicker clicker:set_attach(self.object, "", - {x = 0, y = 11, z = -3}, {x = 0, y = 0, z = 0}) - default.player_attached[name] = true + {x = 0.5, y = 1, z = -3}, {x = 0, y = 0, z = 0}) + player_api.player_attached[name] = true minetest.after(0.2, function() - default.player_set_animation(clicker, "sit" , 30) + player_api.set_animation(clicker, "sit" , 30) end) clicker:set_look_horizontal(self.object:getyaw()) end @@ -105,7 +105,7 @@ function boat.on_punch(self, puncher) if self.driver and puncher == self.driver then self.driver = nil puncher:set_detach() - default.player_attached[puncher:get_player_name()] = false + player_api.player_attached[puncher:get_player_name()] = false end if not self.driver then self.removed = true From b431ae1c77aa9686ec1b3e941cb2d0052aec572e Mon Sep 17 00:00:00 2001 From: Rui Date: Sun, 13 Aug 2017 20:47:13 +0900 Subject: [PATCH 014/195] Carts: Fix player position (#1872) --- mods/carts/depends.txt | 1 + mods/carts/functions.lua | 6 +++--- mods/carts/init.lua | 6 ------ 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/mods/carts/depends.txt b/mods/carts/depends.txt index 4ad96d51..8e482ce2 100644 --- a/mods/carts/depends.txt +++ b/mods/carts/depends.txt @@ -1 +1,2 @@ default +player_api diff --git a/mods/carts/functions.lua b/mods/carts/functions.lua index 9b7e2c65..8408cc1a 100644 --- a/mods/carts/functions.lua +++ b/mods/carts/functions.lua @@ -12,13 +12,13 @@ function carts:manage_attachment(player, obj) end local status = obj ~= nil local player_name = player:get_player_name() - if default.player_attached[player_name] == status then + if player_api.player_attached[player_name] == status then return end - default.player_attached[player_name] = status + player_api.player_attached[player_name] = status if status then - player:set_attach(obj, "", {x=0, y=6, z=0}, {x=0, y=0, z=0}) + player:set_attach(obj, "", {x=0, y=-4.5, z=0}, {x=0, y=0, z=0}) player:set_eye_offset({x=0, y=-4, z=0},{x=0, y=-4, z=0}) else player:set_detach() diff --git a/mods/carts/init.lua b/mods/carts/init.lua index 53b33cc2..b2ba5f37 100644 --- a/mods/carts/init.lua +++ b/mods/carts/init.lua @@ -11,10 +11,4 @@ carts.punch_speed_max = 5 dofile(carts.modpath.."/functions.lua") dofile(carts.modpath.."/rails.lua") - --- Support for non-default games -if not default.player_attached then - default.player_attached = {} -end - dofile(carts.modpath.."/cart_entity.lua") From 20687a6301e6f5859cab174ec0620758b65d7add Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sun, 13 Aug 2017 01:23:08 +0100 Subject: [PATCH 015/195] Make ice slippery --- mods/default/nodes.lua | 2 +- mods/stairs/init.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index f9e1c120..79c02ee3 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -560,7 +560,7 @@ minetest.register_node("default:ice", { tiles = {"default_ice.png"}, is_ground_content = false, paramtype = "light", - groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1}, + groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 3}, sounds = default.node_sound_glass_defaults(), }) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 6d1a6e0d..48254488 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -765,7 +765,7 @@ stairs.register_stair_and_slab( stairs.register_stair_and_slab( "ice", "default:ice", - {cracky = 3, puts_out_fire = 1, cools_lava = 1}, + {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 3}, {"default_ice.png"}, "Ice Stair", "Ice Slab", From bb084294cee94af63954dc765c6d16e7af90b010 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Sat, 8 Jul 2017 21:17:33 +0100 Subject: [PATCH 016/195] TNT: Allow a custom explosion sound to be used --- game_api.txt | 1 + mods/tnt/init.lua | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/game_api.txt b/game_api.txt index 7c3c04cd..a6f4da7c 100644 --- a/game_api.txt +++ b/game_api.txt @@ -348,6 +348,7 @@ TNT API * `description` A description for your TNT. * `radius` The radius within which the TNT can destroy nodes. The default is 3. * `damage_radius` The radius within which the TNT can damage players and mobs. By default it is twice the `radius`. + * `sound` The sound played when explosion occurs. By default it is `tnt_explode`. * `disable_drops` Disable drops. By default it is set to false. * `ignore_protection` Don't check `minetest.is_protected` before removing a node. * `ignore_on_blast` Don't call `on_blast` even if a node has one. diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 0326000b..18ca304e 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -384,7 +384,9 @@ end function tnt.boom(pos, def) local meta = minetest.get_meta(pos) local owner = meta:get_string("owner") - minetest.sound_play("tnt_explode", {pos = pos, gain = 1.5, max_hear_distance = 2*64}) + local sound = def.sound or "tnt_explode" + minetest.sound_play(sound, {pos = pos, gain = 1.5, + max_hear_distance = math.min(def.radius * 20, 128)}) minetest.set_node(pos, {name = "tnt:boom"}) local drops, radius = tnt_explode(pos, def.radius, def.ignore_protection, def.ignore_on_blast, owner) From f92878094660d8a25ea7f9d06a9b2a98ebdf0fad Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Sun, 13 Aug 2017 12:47:43 +0200 Subject: [PATCH 017/195] Register fence: Allow setting nodedefs to 'false' --- mods/default/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index bdc30158..87e7483b 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -297,7 +297,7 @@ function default.register_fence(name, def) groups = {}, } for k, v in pairs(default_fields) do - if not def[k] then + if def[k] == nil then def[k] = v end end From 08727bcd698d511c880bd1c2f7b454bfe0c2b20d Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 14 Aug 2017 16:19:53 +0100 Subject: [PATCH 018/195] Farming: Make cotton look like cotton, add crafted string item Remove string -> cotton alias. --- mods/farming/README.txt | 3 +++ mods/farming/init.lua | 32 ++++++++++++++++++++++- mods/farming/textures/farming_cotton.png | Bin 166 -> 316 bytes mods/farming/textures/farming_string.png | Bin 0 -> 166 bytes 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 mods/farming/textures/farming_string.png diff --git a/mods/farming/README.txt b/mods/farming/README.txt index 3ccd8c30..d46748d7 100644 --- a/mods/farming/README.txt +++ b/mods/farming/README.txt @@ -35,3 +35,6 @@ Created by Gambit (CC BY 3.0): farming_flour.png farming_cotton_seed.png farming_wheat_seed.png + +Created by Napiophelios (CC BY-SA 3.0): + farming_cotton.png diff --git a/mods/farming/init.lua b/mods/farming/init.lua index 667a6685..fff48fa5 100644 --- a/mods/farming/init.lua +++ b/mods/farming/init.lua @@ -1,13 +1,18 @@ -- Global farming namespace + farming = {} farming.path = minetest.get_modpath("farming") + -- Load files + dofile(farming.path .. "/api.lua") dofile(farming.path .. "/nodes.lua") dofile(farming.path .. "/hoes.lua") + -- WHEAT + farming.register_plant("farming:wheat", { description = "Wheat Seed", paramtype2 = "meshoptions", @@ -19,6 +24,7 @@ farming.register_plant("farming:wheat", { groups = {flammable = 4}, place_param2 = 3, }) + minetest.register_craftitem("farming:flour", { description = "Flour", inventory_image = "farming_flour.png", @@ -45,7 +51,9 @@ minetest.register_craft({ recipe = "farming:flour" }) + -- Cotton + farming.register_plant("farming:cotton", { description = "Cotton Seed", inventory_image = "farming_cotton_seed.png", @@ -56,7 +64,11 @@ farming.register_plant("farming:cotton", { groups = {flammable = 4}, }) -minetest.register_alias("farming:string", "farming:cotton") +minetest.register_craftitem("farming:string", { + description = "String", + inventory_image = "farming_string.png", + groups = {flammable = 2}, +}) minetest.register_craft({ output = "wool:white", @@ -66,7 +78,17 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "farming:string 2", + recipe = { + {"farming:cotton"}, + {"farming:cotton"}, + } +}) + + -- Straw + minetest.register_craft({ output = "farming:straw 3", recipe = { @@ -83,7 +105,9 @@ minetest.register_craft({ } }) + -- Fuels + minetest.register_craft({ type = "fuel", recipe = "farming:straw", @@ -102,6 +126,12 @@ minetest.register_craft({ burntime = 1, }) +minetest.register_craft({ + type = "fuel", + recipe = "farming:string", + burntime = 1, +}) + minetest.register_craft({ type = "fuel", recipe = "farming:hoe_wood", diff --git a/mods/farming/textures/farming_cotton.png b/mods/farming/textures/farming_cotton.png index e2bbfd7af486b64c658bcc7c6101b22ca95ab7e7..8aa50e4e38c75bce9f41cbee1ed6535adb7c7f9c 100644 GIT binary patch delta 300 zcmZ3+xQA(iWIZzj1A~Sxe=v}$3-AeX1=8t3ve^;Jxsl45aXJOD8W~B3SxJW3$;P?K z23cw5Ica9OX{LEVGTl5s-7G)DyfDZ1^&1d)`}Xa-ckkZ52ZIkF@cPrIj~_pN_yhu< zKY#x81q8kV!MAVUzkmPv^Jo3fU%!3>!5=XA`*+o}`G$v}klz+>jX%2nYTLpB_LCHif@qmYK$KgskD%6%UkXBkHe85=Ij(pH*q zEPLs#tw&tWOrCbnzN6FRS5fT$vL=W8uUAjqRXmYY-#P90WwT=$tg14XY;L}3WKDZo f75>OO@IgLvdpv4THu6{1-oD!M<@%x*6 delta 149 zcmdnPw2X0rWIY2ASj||l7f3Oc1o;IsFqBO`YXRiNd%8G=NJz3CT*%vCz`%0gc0H3= z0$0}(IjxBvLbC)`&9??=WmxfiH-p;^W`_%^416&UUo{BGzj08P<492YUYwu1&SAsB uDkis!0ec!E(s{TO4u~*3@n8pO`@nqP-XMGaG`@3>L0nH)KbLh*2~7ZC129Vf diff --git a/mods/farming/textures/farming_string.png b/mods/farming/textures/farming_string.png new file mode 100644 index 0000000000000000000000000000000000000000..e2bbfd7af486b64c658bcc7c6101b22ca95ab7e7 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAm`Z~Df*BafCZDwc^5Q*R977}| zSr0DcZ7^V9IdHq4Ni2b@Yl)oJL=T}^0;}d*gS0ZNc)pv#?FO^M1yu&Vn1`<#1mxd1 zsLOFAD19%^&t2!R;b0Y$+r@xA4H4-)+zAIn7@l~rgS35MzHe`kJ%8G{#~_}ktDnm{ Hr-UW|pV=_A literal 0 HcmV?d00001 From bcf98df5fac3eb59b02d9fdb066ab92c6228d787 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Sun, 30 Jul 2017 14:02:10 +0100 Subject: [PATCH 019/195] Mushroom spread: Optimise and make overridable Move mushroom spread ABM action into a global and overridable function. Optimise spread code. Reduce spread range to reduce spread through walls. --- mods/flowers/init.lua | 52 ++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index 826c52ad..227b6aee 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -204,38 +204,34 @@ minetest.register_node("flowers:mushroom_brown", { -- Mushroom spread and death +function flowers.mushroom_spread(pos, node) + if minetest.get_node_light(pos, nil) == 15 then + minetest.remove_node(pos) + return + end + local positions = minetest.find_nodes_in_area_under_air( + {x = pos.x - 1, y = pos.y - 2, z = pos.z - 1}, + {x = pos.x + 1, y = pos.y + 1, z = pos.z + 1}, + {"group:soil", "group:tree"}) + if #positions == 0 then + return + end + local pos2 = positions[math.random(#positions)] + pos2.y = pos2.y + 1 + if minetest.get_node_light(pos, 0.5) <= 3 and + minetest.get_node_light(pos2, 0.5) <= 3 then + minetest.set_node(pos2, {name = node.name}) + end +end + minetest.register_abm({ label = "Mushroom spread", nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"}, interval = 11, - chance = 50, - action = function(pos, node) - if minetest.get_node_light(pos, nil) == 15 then - minetest.remove_node(pos) - return - end - local random = { - x = pos.x + math.random(-2, 2), - y = pos.y + math.random(-1, 1), - z = pos.z + math.random(-2, 2) - } - local random_node = minetest.get_node_or_nil(random) - if not random_node or random_node.name ~= "air" then - return - end - local node_under = minetest.get_node_or_nil({x = random.x, - y = random.y - 1, z = random.z}) - if not node_under then - return - end - - if (minetest.get_item_group(node_under.name, "soil") ~= 0 or - minetest.get_item_group(node_under.name, "tree") ~= 0) and - minetest.get_node_light(pos, 0.5) <= 3 and - minetest.get_node_light(random, 0.5) <= 3 then - minetest.set_node(random, {name = node.name}) - end - end + chance = 150, + action = function(...) + flowers.mushroom_spread(...) + end, }) From fe67ffda7ca4326c85f114bd02797f25348931f9 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Sat, 26 Aug 2017 22:14:44 +0100 Subject: [PATCH 020/195] TNT: Add explode_center flag Add 'explode_centre' flag which when false explodes as normal and when true runs on_blast on centre node as well as dropping items. --- game_api.txt | 3 ++- mods/tnt/init.lua | 13 ++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/game_api.txt b/game_api.txt index a6f4da7c..c4dbd78e 100644 --- a/game_api.txt +++ b/game_api.txt @@ -363,7 +363,8 @@ TNT API ^ Create an explosion. * `position` The center of explosion. -* `definition` The TNT definion as passed to `tnt.register` +* `definition` The TNT definion as passed to `tnt.register` with the following addition: + * `explode_center` false by default which removes TNT node on blast, when true will explode center node. `tnt.burn(position, [nodename])` diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 18ca304e..f3e22fdb 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -208,6 +208,7 @@ local function add_effects(pos, radius, drops) collisiondetection = false, vertical = false, texture = "tnt_boom.png", + glow = 15, }) minetest.add_particlespawner({ amount = 64, @@ -272,7 +273,7 @@ function tnt.burn(pos, nodename) end end -local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owner) +local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owner, explode_center) pos = vector.round(pos) -- scan for adjacent TNT nodes first, and enlarge the explosion local vm1 = VoxelManip() @@ -286,6 +287,10 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owne local c_tnt_burning = minetest.get_content_id("tnt:tnt_burning") local c_tnt_boom = minetest.get_content_id("tnt:boom") local c_air = minetest.get_content_id("air") + -- make sure we still have explosion even when centre node isnt tnt related + if explode_center then + count = 1 + end for z = pos.z - 2, pos.z + 2 do for y = pos.y - 2, pos.y + 2 do @@ -384,12 +389,14 @@ end function tnt.boom(pos, def) local meta = minetest.get_meta(pos) local owner = meta:get_string("owner") + if not def.explode_center then + minetest.set_node(pos, {name = "tnt:boom"}) + end local sound = def.sound or "tnt_explode" minetest.sound_play(sound, {pos = pos, gain = 1.5, max_hear_distance = math.min(def.radius * 20, 128)}) - minetest.set_node(pos, {name = "tnt:boom"}) local drops, radius = tnt_explode(pos, def.radius, def.ignore_protection, - def.ignore_on_blast, owner) + def.ignore_on_blast, owner, def.explode_center) -- append entity drops local damage_radius = (radius / def.radius) * def.damage_radius entity_physics(pos, damage_radius, drops) From edba1dcb028f1bfd8831cd69ab77a6a730fdc90d Mon Sep 17 00:00:00 2001 From: sfan5 Date: Mon, 11 Sep 2017 21:13:55 +0200 Subject: [PATCH 021/195] Doors: Disable client dig prediction for protected doors --- mods/doors/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 0eed5b84..4ee2c5ab 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -410,6 +410,7 @@ function doors.register(name, def) return secret, "a locked door", owner end + def.node_dig_prediction = "" else def.on_blast = function(pos, intensity) minetest.remove_node(pos) From bf8404fcf7cfaa3e5e84f694505629ea88df6ce2 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Mon, 11 Sep 2017 22:52:19 +0200 Subject: [PATCH 022/195] Doors: Same prediction change for trapdoors Forgot this in the last commit, thanks @Fixer-007 --- mods/doors/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 4ee2c5ab..2fcc23de 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -608,6 +608,7 @@ function doors.register_trapdoor(name, def) return secret, "a locked trapdoor", owner end + def.node_dig_prediction = "" else def.on_blast = function(pos, intensity) minetest.remove_node(pos) From 4ccafd15187cf70d06d68ad3931912a3c3c4b4f5 Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 17 Sep 2017 06:03:42 +0100 Subject: [PATCH 023/195] Biome registration: Update due to revert of mgv7 'biomerepeat' option --- mods/default/mapgen.lua | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 1fc2dc34..ebb93d36 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1445,7 +1445,6 @@ end -- Biomes for floatlands --- Used when mgv7 'biomerepeat' flag is false -- TODO Temporary simple biomes to be replaced by special floatland biomes later. @@ -2018,10 +2017,9 @@ end -- Get setting or default local mgv7_spflags = minetest.get_mapgen_setting("mgv7_spflags") or - "mountains, ridges, nofloatlands, caverns, biomerepeat" + "mountains, ridges, nofloatlands, caverns" local captures_float = string.match(mgv7_spflags, "floatlands") local captures_nofloat = string.match(mgv7_spflags, "nofloatlands") -local captures_nobiorep = string.match(mgv7_spflags, "nobiomerepeat") -- Get setting or default -- Make global for mods to use to register floatland biomes @@ -2039,12 +2037,11 @@ local mg_name = minetest.get_mapgen_setting("mg_name") if mg_name == "v6" then default.register_mgv6_ores() default.register_mgv6_decorations() +-- Need to check for 'nofloatlands' because that contains +-- 'floatlands' which makes the second condition true. elseif mg_name == "v7" and captures_float == "floatlands" and - -- Need to check for 'nofloatlands' because that contains - -- 'floatlands' which makes the second condition true. - captures_nofloat ~= "nofloatlands" and - captures_nobiorep == "nobiomerepeat" then + captures_nofloat ~= "nofloatlands" then -- Mgv7 with floatlands and floatland biomes default.register_biomes(default.mgv7_shadow_limit - 1) default.register_floatland_biomes( From c5c9e423caf901d8a9a97ce959f4ee31cadbf7a0 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Wed, 20 Sep 2017 19:08:06 +0100 Subject: [PATCH 024/195] Chests: Fix open chest after player leave (#1884) This should fix the chest staying open when a player disconnects while inside. --- mods/default/nodes.lua | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 79c02ee3..45bc34ab 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1798,6 +1798,24 @@ end local open_chests = {} +local function chest_lid_close(pn) + local pos = open_chests[pn].pos + local sound = open_chests[pn].sound + local swap = open_chests[pn].swap + + open_chests[pn] = nil + for k, v in pairs(open_chests) do + if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then + return true + end + end + + local node = minetest.get_node(pos) + minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap, + param2 = node.param2 }) + minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10}) +end + minetest.register_on_player_receive_fields(function(player, formname, fields) if formname ~= "default:chest" then return @@ -1811,23 +1829,17 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return end - local pos = open_chests[pn].pos - local sound = open_chests[pn].sound - local swap = open_chests[pn].swap - local node = minetest.get_node(pos) - - open_chests[pn] = nil - for k, v in pairs(open_chests) do - if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then - return true - end - end - minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap, - param2 = node.param2 }) - minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10}) + chest_lid_close(pn) return true end) +minetest.register_on_leaveplayer(function(player) + local pn = player:get_player_name() + if open_chests[pn] then + chest_lid_close(pn) + end +end) + function default.register_chest(name, d) local def = table.copy(d) def.drawtype = "mesh" From f33cc02080fe6636d4d00b9c3cb045ad3a76df58 Mon Sep 17 00:00:00 2001 From: danielmeek32 Date: Wed, 20 Sep 2017 19:08:17 +0100 Subject: [PATCH 025/195] Chests: Fix locked chest protection against explosions (#1886) Fixes #1885 --- mods/default/nodes.lua | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 45bc34ab..bab1a27e 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1973,6 +1973,13 @@ function default.register_chest(name, d) open_chests[clicker:get_player_name()] = { pos = pos, sound = def.sound_close, swap = name } end + def.on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "main", drops) + drops[#drops+1] = "default:" .. name + minetest.remove_node(pos) + return drops + end end def.on_metadata_inventory_move = function(pos, from_list, from_index, @@ -1990,13 +1997,6 @@ function default.register_chest(name, d) " takes " .. stack:get_name() .. " from chest at " .. minetest.pos_to_string(pos)) end - def.on_blast = function(pos) - local drops = {} - default.get_inventory_drops(pos, "main", drops) - drops[#drops+1] = "default:chest" - minetest.remove_node(pos) - return drops - end local def_opened = table.copy(def) local def_closed = table.copy(def) @@ -2018,6 +2018,7 @@ function default.register_chest(name, d) def_opened.can_dig = function() return false end + def_opened.on_blast = function() end def_closed.mesh = nil def_closed.drawtype = nil From 74ed63f46ba8c86de1b30c53c2d9f8947a0cdd34 Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 2 Jul 2017 14:22:00 +0100 Subject: [PATCH 026/195] Ores (non-mgv6 mapgens): New distributions Make deeper, to compensate for ease of travel using 3D noise tunnels. Make depth more progressive with value: Ore, upper limit Coal 64 no change Iron 0 no change Tin -32 > -64 Copper -16 > -128 Gold -64 > -256 Diamond -128 > -512 Mese crystal -64 > -512 Mese block -1024 no change Make y of 1st density increase deeper but following a similar logic to before: Ore, upper limit Coal 0 no change Iron -64 no change Tin -128 no change Copper -64 > -256 Gold -256 > -1024 Diamond -256 > -1024 Mese crystal -256 > -1024 Mese block -2048 new Add second, denser layer of mese blocks with a decrease of separation and increase in density equal to mese ore layers. --- mods/default/mapgen.lua | 167 +++++++++++++++++++++------------------- 1 file changed, 89 insertions(+), 78 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index ebb93d36..4503d530 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -591,41 +591,6 @@ function default.register_ores() y_max = -64, }) - -- Copper - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_copper", - wherein = "default:stone", - clust_scarcity = 9 * 9 * 9, - clust_num_ores = 5, - clust_size = 3, - y_min = 1025, - y_max = 31000, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_copper", - wherein = "default:stone", - clust_scarcity = 12 * 12 * 12, - clust_num_ores = 4, - clust_size = 3, - y_min = -63, - y_max = -16, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_copper", - wherein = "default:stone", - clust_scarcity = 9 * 9 * 9, - clust_num_ores = 5, - clust_size = 3, - y_min = -31000, - y_max = -64, - }) - -- Tin minetest.register_ore({ @@ -647,7 +612,7 @@ function default.register_ores() clust_num_ores = 4, clust_size = 3, y_min = -127, - y_max = -32, + y_max = -64, }) minetest.register_ore({ @@ -661,6 +626,41 @@ function default.register_ores() y_max = -128, }) + -- Copper + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 5, + clust_size = 3, + y_min = 1025, + y_max = 31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 4, + clust_size = 3, + y_min = -255, + y_max = -128, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -256, + }) + -- Gold minetest.register_ore({ @@ -681,8 +681,8 @@ function default.register_ores() clust_scarcity = 15 * 15 * 15, clust_num_ores = 3, clust_size = 2, - y_min = -255, - y_max = -64, + y_min = -1023, + y_max = -256, }) minetest.register_ore({ @@ -693,42 +693,7 @@ function default.register_ores() clust_num_ores = 5, clust_size = 3, y_min = -31000, - y_max = -256, - }) - - -- Mese crystal - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_mese", - wherein = "default:stone", - clust_scarcity = 14 * 14 * 14, - clust_num_ores = 5, - clust_size = 3, - y_min = 1025, - y_max = 31000, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_mese", - wherein = "default:stone", - clust_scarcity = 18 * 18 * 18, - clust_num_ores = 3, - clust_size = 2, - y_min = -255, - y_max = -64, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_mese", - wherein = "default:stone", - clust_scarcity = 14 * 14 * 14, - clust_num_ores = 5, - clust_size = 3, - y_min = -31000, - y_max = -256, + y_max = -1024, }) -- Diamond @@ -751,8 +716,8 @@ function default.register_ores() clust_scarcity = 17 * 17 * 17, clust_num_ores = 4, clust_size = 3, - y_min = -255, - y_max = -128, + y_min = -1023, + y_max = -512, }) minetest.register_ore({ @@ -763,7 +728,42 @@ function default.register_ores() clust_num_ores = 4, clust_size = 3, y_min = -31000, - y_max = -256, + y_max = -1024, + }) + + -- Mese crystal + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_min = 1025, + y_max = 31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 18 * 18 * 18, + clust_num_ores = 3, + clust_size = 2, + y_min = -1023, + y_max = -512, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -1024, }) -- Mese block @@ -786,9 +786,20 @@ function default.register_ores() clust_scarcity = 36 * 36 * 36, clust_num_ores = 3, clust_size = 2, - y_min = -31000, + y_min = -2047, y_max = -1024, }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 28 * 28 * 28, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -2048, + }) end From db08c0d721e056862adf4af4ac19bd800c747f6a Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Wed, 7 Jun 2017 21:29:05 +0100 Subject: [PATCH 027/195] Sfinv: Rename navigation tabs to reduce chance of a conflict --- mods/sfinv/api.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/sfinv/api.lua b/mods/sfinv/api.lua index bd6de1ed..c9b9d4a7 100644 --- a/mods/sfinv/api.lua +++ b/mods/sfinv/api.lua @@ -29,7 +29,7 @@ end function sfinv.get_nav_fs(player, context, nav, current_idx) -- Only show tabs if there is more than one page if #nav > 1 then - return "tabheader[0,0;tabs;" .. table.concat(nav, ",") .. ";" .. current_idx .. ";true;false]" + return "tabheader[0,0;sfinv_nav_tabs;" .. table.concat(nav, ",") .. ";" .. current_idx .. ";true;false]" else return "" end @@ -151,8 +151,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end -- Was a tab selected? - if fields.tabs and context.nav then - local tid = tonumber(fields.tabs) + if fields.sfinv_nav_tabs and context.nav then + local tid = tonumber(fields.sfinv_nav_tabs) if tid and tid > 0 then local id = context.nav[tid] local page = sfinv.pages[id] From a4b94a334754e5e7a5343e5d3caafdd76b94daff Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Wed, 7 Jun 2017 21:33:42 +0100 Subject: [PATCH 028/195] Sfinv: Remove possibility of infinite loop when homepage doesn't exist --- mods/sfinv/api.lua | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/mods/sfinv/api.lua b/mods/sfinv/api.lua index c9b9d4a7..fdb652b8 100644 --- a/mods/sfinv/api.lua +++ b/mods/sfinv/api.lua @@ -29,7 +29,8 @@ end function sfinv.get_nav_fs(player, context, nav, current_idx) -- Only show tabs if there is more than one page if #nav > 1 then - return "tabheader[0,0;sfinv_nav_tabs;" .. table.concat(nav, ",") .. ";" .. current_idx .. ";true;false]" + return "tabheader[0,0;sfinv_nav_tabs;" .. table.concat(nav, ",") .. + ";" .. current_idx .. ";true;false]" else return "" end @@ -84,9 +85,20 @@ function sfinv.get_formspec(player, context) return page:get(player, context) else local old_page = context.page - context.page = sfinv.get_homepage_name(player) + local home_page = sfinv.get_homepage_name(player) + + if old_page == home_page then + minetest.log("error", "[sfinv] Couldn't find " .. dump(old_page) .. + ", which is also the old page") + + return "" + end + + context.page = home_page assert(sfinv.pages[context.page], "[sfinv] Invalid homepage") - minetest.log("warning", "[sfinv] Couldn't find " .. dump(old_page) .. " so using switching to homepage") + minetest.log("warning", "[sfinv] Couldn't find " .. dump(old_page) .. + " so switching to homepage") + return sfinv.get_formspec(player, context) end end From 2d8207a924905bbb764ca7b0e2fc5af1e1a7cf7a Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Thu, 21 Sep 2017 15:18:08 +0100 Subject: [PATCH 029/195] Flowers: Add waterlily right-click checks Check for on_rightclick functions of nodes when holding a waterlily. --- mods/flowers/init.lua | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index 227b6aee..d28764f9 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -276,12 +276,17 @@ minetest.register_node("flowers:waterlily", { on_place = function(itemstack, placer, pointed_thing) local pos = pointed_thing.above - local node = minetest.get_node(pointed_thing.under).name - local def = minetest.registered_nodes[node] + local node = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[node.name] local player_name = placer:get_player_name() + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, node, placer, itemstack, + pointed_thing) + end + if def and def.liquidtype == "source" and - minetest.get_item_group(node, "water") > 0 then + minetest.get_item_group(node.name, "water") > 0 then if not minetest.is_protected(pos, player_name) then minetest.set_node(pos, {name = "flowers:waterlily", param2 = math.random(0, 3)}) From 809e5933c4bf1dd8bd8e72604948a1ca6a9cd2a3 Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 28 Sep 2017 18:23:08 +0100 Subject: [PATCH 030/195] Beds: Strip colour bits from param2 in 'get look yaw' Based on code by github user 'hdak1945git'. Fixes a crash when 'colorfacedir' param2 is used for beds. --- mods/beds/functions.lua | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/mods/beds/functions.lua b/mods/beds/functions.lua index 78df9a18..099f41fe 100644 --- a/mods/beds/functions.lua +++ b/mods/beds/functions.lua @@ -9,15 +9,18 @@ end -- Helper functions local function get_look_yaw(pos) - local n = minetest.get_node(pos) - if n.param2 == 1 then - return pi / 2, n.param2 - elseif n.param2 == 3 then - return -pi / 2, n.param2 - elseif n.param2 == 0 then - return pi, n.param2 + local rotation = minetest.get_node(pos).param2 + if rotation > 3 then + rotation = rotation % 4 -- Mask colorfacedir values + end + if rotation == 1 then + return pi / 2, rotation + elseif rotation == 3 then + return -pi / 2, rotation + elseif rotation == 0 then + return pi, rotation else - return 0, n.param2 + return 0, rotation end end From 3611af1dda0897354cd1e36aea5e48721d4389aa Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Mon, 2 Oct 2017 11:01:01 +0200 Subject: [PATCH 031/195] Bones: Return bones when taking the last ItemStack --- mods/bones/init.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 9583bc29..8688fa1e 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -68,6 +68,12 @@ minetest.register_node("bones:bones", { on_metadata_inventory_take = function(pos, listname, index, stack, player) local meta = minetest.get_meta(pos) if meta:get_inventory():is_empty("main") then + local inv = player:get_inventory() + if inv:room_for_item("main", {name = "bones:bones"}) then + inv:add_item("main", {name = "bones:bones"}) + else + minetest.add_item(pos, "bones:bones") + end minetest.remove_node(pos) end end, From e40f25f1fbaa206fe229002d8608f729a1d0f268 Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 15 Aug 2017 20:59:27 +0100 Subject: [PATCH 032/195] Minimap: Add 'map' mod with mapping kit item to enable minimap In survival mode, use of the minimap requires the mapping kit item. Minimap radar mode is always disabled in survival mode. Minimap and minimap radar mode will be automatically enabled in creative mode and for any player with the 'creative' privilege. The 'map.update_hud_flags()' function is global so can be redefined by a mod for alternative behaviour. --- mods/map/README.txt | 44 ++++++++++++++ mods/map/depends.txt | 3 + mods/map/init.lua | 81 ++++++++++++++++++++++++++ mods/map/license.txt | 60 +++++++++++++++++++ mods/map/textures/map_mapping_kit.png | Bin 0 -> 763 bytes 5 files changed, 188 insertions(+) create mode 100644 mods/map/README.txt create mode 100644 mods/map/depends.txt create mode 100644 mods/map/init.lua create mode 100644 mods/map/license.txt create mode 100644 mods/map/textures/map_mapping_kit.png diff --git a/mods/map/README.txt b/mods/map/README.txt new file mode 100644 index 00000000..60422654 --- /dev/null +++ b/mods/map/README.txt @@ -0,0 +1,44 @@ +Minetest Game mod: map +====================== +See license.txt for license information. + +Authors of source code +---------------------- +paramat (MIT) + +Authors of media (textures) +--------------------------- +TumeniNodes (CC BY-SA 3.0): + map_mapping_kit.png (map) + +paramat (CC BY-SA 3.0): + map_mapping_kit.png (compass and pen) + +Crafting +-------- +map:mapping_kit + +default:glass G +default:paper P +default:stick S +default:steel_ingot I +default:wood W +dye:black D + +GPS +IPI +WPD + +Usage +----- +In survival mode, use of the minimap requires the mapping kit item in your +inventory. +Once crafted, to instantly enable, 'use' (left click) the item, otherwise the +minimap will be automatically enabled a few seconds later. +Minimap radar mode is always disabled in survival mode. + +Minimap and minimap radar mode will be automatically enabled in creative mode +and for any player with the 'creative' privilege. + +The 'map.update_hud_flags()' function is global so can be redefined by a mod for +alternative behaviour. diff --git a/mods/map/depends.txt b/mods/map/depends.txt new file mode 100644 index 00000000..4b15f6a3 --- /dev/null +++ b/mods/map/depends.txt @@ -0,0 +1,3 @@ +default +dye +creative? diff --git a/mods/map/init.lua b/mods/map/init.lua new file mode 100644 index 00000000..4dbc1bb6 --- /dev/null +++ b/mods/map/init.lua @@ -0,0 +1,81 @@ +-- Mod global namespace + +map = {} + + +-- Cache creative mode setting + +local creative_mode_cache = minetest.settings:get_bool("creative_mode") + + +-- Update HUD flags +-- Global to allow overriding + +function map.update_hud_flags(player) + local creative_enabled = + (creative and creative.is_enabled_for(player:get_player_name())) or + creative_mode_cache + + local minimap_enabled = creative_enabled or + player:get_inventory():contains_item("main", "map:mapping_kit") + local radar_enabled = creative_enabled + + player:hud_set_flags({ + minimap = minimap_enabled, + minimap_radar = radar_enabled + }) +end + + +-- Set HUD flags 'on joinplayer' + +minetest.register_on_joinplayer(function(player) + map.update_hud_flags(player) +end) + + +-- Cyclic update of HUD flags + +local function cyclic_update() + for _, player in ipairs(minetest.get_connected_players()) do + map.update_hud_flags(player) + end + minetest.after(7, cyclic_update) +end + +minetest.after(7, cyclic_update) + + +-- Mapping kit item + +minetest.register_craftitem("map:mapping_kit", { + description = "Mapping Kit", + inventory_image = "map_mapping_kit.png", + stack_max = 1, + groups = {flammable = 3}, + -- For instant update of HUD flags + on_use = function(itemstack, user, pointed_thing) + map.update_hud_flags(user) + end, +}) + + +-- Crafting + +minetest.register_craft({ + output = "map:mapping_kit", + recipe = { + {"default:glass", "default:paper", "default:stick"}, + {"default:steel_ingot", "default:paper", "default:steel_ingot"}, + {"default:wood", "default:paper", "dye:black"}, + } +}) + + +-- Fuel + +minetest.register_craft({ + type = "fuel", + recipe = "map:mapping_kit", + burntime = 5, +}) diff --git a/mods/map/license.txt b/mods/map/license.txt new file mode 100644 index 00000000..a89f59c4 --- /dev/null +++ b/mods/map/license.txt @@ -0,0 +1,60 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2017 paramat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2017 TumeniNodes +Copyright (C) 2017 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/map/textures/map_mapping_kit.png b/mods/map/textures/map_mapping_kit.png new file mode 100644 index 0000000000000000000000000000000000000000..015b878ad5e89994fb63b90c058a7d9e6d0ddb27 GIT binary patch literal 763 zcmVj3g=svTWG;tmJ)vkXqHZ~(ZaAlJHKlMmrEoo?aXzPV zKBaR(rF255bUvtbL8){o@UFQY{#E&&7f}2p=r&bZ_}o3)TV6IrftrueATOV)2w^at$on0fY+^d z*{yQet$5h3cG9nc(yxQju!GXDgVV5r+pu@jv4z~Rchs_m)U$-$vUb?EhTgV(+_r+* zw}#)ifZ(`+*}0D2xrX7ng5bM^;Jb?4yprO)gWBy1l%b4rTmg>x!?$Dg?(3|ejo$t|}@6w*t)z$ISp7GS5 z@YJI5)ui&*qw?3J^Vp{J*r)T^sPx&W-{0Tv?CAgh|CF1oxc~qF0d!JMQvg8b*k%9# z0OUzTK~xyiV_;x#E@gm%a!W9!6&jS7Q&v%!92BDI4HDqt=HwNXm6PJLAtr=KY7}%Iu8I|%X>*}ksBV8F-m>85;r?7J5ws&{6 zR^@tu1lSl^r^y%hPMpxwSnLN@p`;|wRnR+Wa&L2i4@dwA%-u5D`ujR+GCZIHPQm%L zO)U*2;f@SbJ0U9k6Vi*aqI_)_rh*+Nq^N6VVe4S1E+Gu&+oz?(#l}QOhs9?ag9QYY t#WYM^-0id_6+{fcUXg}*pHGc}0RU;tGDu-GPyYY_002ovPDHLkV1oS_i(CKz literal 0 HcmV?d00001 From b6626f76b5ae36f65933de635cd007d441770d7b Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 3 Oct 2017 02:31:10 +0100 Subject: [PATCH 033/195] Map mod: Remove confusing 'use', reduce update interval Clarify README.txt. --- mods/map/README.txt | 11 +++++------ mods/map/init.lua | 8 ++------ 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/mods/map/README.txt b/mods/map/README.txt index 60422654..c6f413ba 100644 --- a/mods/map/README.txt +++ b/mods/map/README.txt @@ -32,13 +32,12 @@ WPD Usage ----- In survival mode, use of the minimap requires the mapping kit item in your -inventory. -Once crafted, to instantly enable, 'use' (left click) the item, otherwise the -minimap will be automatically enabled a few seconds later. -Minimap radar mode is always disabled in survival mode. +inventory. It can take up to 3 seconds for adding to or removal from inventory +to have an effect. +Minimap radar mode is always disallowed in survival mode. -Minimap and minimap radar mode will be automatically enabled in creative mode -and for any player with the 'creative' privilege. +Minimap and minimap radar mode are automatically allowed in creative mode and +for any player with the 'creative' privilege. The 'map.update_hud_flags()' function is global so can be redefined by a mod for alternative behaviour. diff --git a/mods/map/init.lua b/mods/map/init.lua index 4dbc1bb6..412f76d9 100644 --- a/mods/map/init.lua +++ b/mods/map/init.lua @@ -40,10 +40,10 @@ local function cyclic_update() for _, player in ipairs(minetest.get_connected_players()) do map.update_hud_flags(player) end - minetest.after(7, cyclic_update) + minetest.after(3.1, cyclic_update) end -minetest.after(7, cyclic_update) +minetest.after(3.1, cyclic_update) -- Mapping kit item @@ -53,10 +53,6 @@ minetest.register_craftitem("map:mapping_kit", { inventory_image = "map_mapping_kit.png", stack_max = 1, groups = {flammable = 3}, - -- For instant update of HUD flags - on_use = function(itemstack, user, pointed_thing) - map.update_hud_flags(user) - end, }) From 12a971660d5bcbf632cc477c215a38df0d916b2f Mon Sep 17 00:00:00 2001 From: Lars Hofhansl Date: Fri, 29 Sep 2017 12:59:11 -0700 Subject: [PATCH 034/195] Creative: Do not give creative priv to admin --- mods/creative/init.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/creative/init.lua b/mods/creative/init.lua index 7b842eda..9295c8a6 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -2,7 +2,8 @@ creative = {} minetest.register_privilege("creative", { description = "Allow player to use creative inventory", - give_to_singleplayer = false + give_to_singleplayer = false, + give_to_admin = false }) local creative_mode_cache = minetest.settings:get_bool("creative_mode") From 3ff296961e903325084b9e9a07a6cf7ce44bf1e7 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Thu, 28 Sep 2017 15:18:52 +0100 Subject: [PATCH 035/195] TNT: Add tnt.boom defaults This adds def, def.radius and def.damage_radius defaults to the tnt.boom() function if they aren't specified on call. --- game_api.txt | 2 +- mods/tnt/init.lua | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/game_api.txt b/game_api.txt index c4dbd78e..1a0e252a 100644 --- a/game_api.txt +++ b/game_api.txt @@ -358,7 +358,7 @@ TNT API * `bottom` Bottom tile. By default the name of the tnt with a suffix of `_bottom.png`. * `burning` Top tile when lit. By default the name of the tnt with a suffix of `_top_burning_animated.png". -`tnt.boom(position, definition)` +`tnt.boom(position[, definition])` ^ Create an explosion. diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index f3e22fdb..133431c7 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -387,6 +387,9 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owne end function tnt.boom(pos, def) + def = def or {} + def.radius = def.radius or 1 + def.damage_radius = def.damage_radius or def.radius * 2 local meta = minetest.get_meta(pos) local owner = meta:get_string("owner") if not def.explode_center then From eb5a5b56e194bbaa432edea9697f1adb1d2398d9 Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 4 Oct 2017 23:46:32 +0100 Subject: [PATCH 036/195] Decorations: Add kelp to cool and temperate shallow ocean Original texture by tobyplowy, colourised by paramat. --- mods/default/README.txt | 3 ++ mods/default/license.txt | 1 + mods/default/mapgen.lua | 31 +++++++++++++++ mods/default/nodes.lua | 51 +++++++++++++++++++++++++ mods/default/textures/default_kelp.png | Bin 0 -> 312 bytes 5 files changed, 86 insertions(+) create mode 100644 mods/default/textures/default_kelp.png diff --git a/mods/default/README.txt b/mods/default/README.txt index dd6c44fd..0a9f8ff7 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -215,6 +215,9 @@ kilbith (CC BY-SA 3.0): default_tin_ingot.png default_tin_lump.png +tobyplowy (CC BY-SA 3.0): + default_kelp.png + Glass breaking sounds (CC BY 3.0): 1: http://www.freesound.org/people/cmusounddesign/sounds/71947/ 2: http://www.freesound.org/people/Tomlija/sounds/97669/ diff --git a/mods/default/license.txt b/mods/default/license.txt index 0bfba618..034151f2 100644 --- a/mods/default/license.txt +++ b/mods/default/license.txt @@ -44,6 +44,7 @@ Copyright (C) 2010-2016: GreenXenith kaeza kilbith + tobyplowy You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 4503d530..7cd60666 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -2019,6 +2019,37 @@ function default.register_decorations() flags = "place_center_x, place_center_z", rotation = "random", }) + + -- Kelp + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:sand"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.1, + spread = {x = 200, y = 200, z = 200}, + seed = 87112, + octaves = 3, + persist = 0.7 + }, + biomes = { + "taiga_ocean", + "snowy_grassland_ocean", + "grassland_ocean", + "coniferous_forest_ocean", + "deciduous_forest_ocean", + "sandstone_desert_ocean", + "cold_desert_ocean"}, + y_min = -10, + y_max = -5, + flags = "force_placement", + decoration = "default:sand_with_kelp", + param2 = 48, + param2_max = 96, + }) end diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index bab1a27e..e0e75cdf 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -149,6 +149,8 @@ default:acacia_bush_stem default:acacia_bush_leaves default:acacia_bush_sapling +default:sand_with_kelp + Corals ------ @@ -1449,6 +1451,55 @@ minetest.register_node("default:acacia_bush_sapling", { end, }) +minetest.register_node("default:sand_with_kelp", { + description = "Kelp On Sand", + drawtype = "plantlike_rooted", + tiles = {"default_sand.png"}, + special_tiles = {{name = "default_kelp.png", tileable_vertical = true}}, + inventory_image = "default_kelp.png", + paramtype2 = "leveled", + groups = {snappy = 3}, + node_placement_prediction = "", + + on_place = function(itemstack, placer, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == "node" and placer and + not placer:get_player_control().sneak then + local node_ptu = minetest.get_node(pointed_thing.under) + local def_ptu = minetest.registered_nodes[node_ptu.name] + if def_ptu and def_ptu.on_rightclick then + return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, + itemstack, pointed_thing) + end + end + + local pos = pointed_thing.above + local height = math.random(4, 6) + local pos_top = {x = pos.x, y = pos.y + height, z = pos.z} + local node_top = minetest.get_node(pos_top) + local def_top = minetest.registered_nodes[node_top.name] + local player_name = placer:get_player_name() + + if def_top and def_top.liquidtype == "source" and + minetest.get_item_group(node_top.name, "water") > 0 then + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pos_top, player_name) then + minetest.set_node(pos, {name = "default:sand_with_kelp", + param2 = height * 16}) + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end +}) + -- -- Corals diff --git a/mods/default/textures/default_kelp.png b/mods/default/textures/default_kelp.png new file mode 100644 index 0000000000000000000000000000000000000000..70b743d594f2674fb2eb67976a5589ce2aeffab2 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}LV!<*E09i0Rm{v#&dOBI$yO=I zS1l}5D=tziEm1EkRj(-5sI1VauF|Nf)@*FhZfewSZq{jS(dq5hpE$u_`ZS|iGmYoY zF(mm0~ zd2;0pE0*oq~5P5BsuZX(b{44$rjF6*2U FngC5QbLap7 literal 0 HcmV?d00001 From cc371ac726305cfca64fad257b2c5cd37afd80cb Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 30 Aug 2017 02:37:43 +0100 Subject: [PATCH 037/195] Add binoculars mod with binoculars item to allow zoom Uses the new player object property 'can zoom'. In survival mode, use of zoom requires the binoculars item in inventory. Zoom is automatically allowed in creative mode and for players with the 'creative' privilege. The binoculars.update_player_property() function is global so can be redefined by a mod for alternative behaviour. --- mods/binoculars/README.txt | 35 +++++++++ mods/binoculars/depends.txt | 2 + mods/binoculars/init.lua | 69 ++++++++++++++++++ mods/binoculars/license.txt | 59 +++++++++++++++ .../textures/binoculars_binoculars.png | Bin 0 -> 219 bytes 5 files changed, 165 insertions(+) create mode 100644 mods/binoculars/README.txt create mode 100644 mods/binoculars/depends.txt create mode 100644 mods/binoculars/init.lua create mode 100644 mods/binoculars/license.txt create mode 100644 mods/binoculars/textures/binoculars_binoculars.png diff --git a/mods/binoculars/README.txt b/mods/binoculars/README.txt new file mode 100644 index 00000000..3b90b4c4 --- /dev/null +++ b/mods/binoculars/README.txt @@ -0,0 +1,35 @@ +Minetest Game mod: binoculars +============================= +See license.txt for license information. + +Authors of source code +---------------------- +paramat (MIT) + +Authors of media (textures) +--------------------------- +paramat (CC BY-SA 3.0): + binoculars_binoculars.png + +Crafting +-------- +binoculars:binoculars + +default:obsidian_glass O +default:bronze_ingot B + +O_O +BBB +O_O + +Usage +----- +In survival mode, use of zoom requires the binoculars item in your inventory. +It can take up to 5 seconds for adding to or removal from inventory to have an +effect, however to instantly allow the use of zoom 'use' (leftclick) the item. + +Zoom is automatically allowed in creative mode and for any player with the +'creative' privilege. + +The 'binoculars.update_player_property()' function is global so can be +redefined by a mod for alternative behaviour. diff --git a/mods/binoculars/depends.txt b/mods/binoculars/depends.txt new file mode 100644 index 00000000..1f737c12 --- /dev/null +++ b/mods/binoculars/depends.txt @@ -0,0 +1,2 @@ +default +creative? diff --git a/mods/binoculars/init.lua b/mods/binoculars/init.lua new file mode 100644 index 00000000..050605c1 --- /dev/null +++ b/mods/binoculars/init.lua @@ -0,0 +1,69 @@ +-- Mod global namespace + +binoculars = {} + + +-- Cache creative mode setting + +local creative_mode_cache = minetest.settings:get_bool("creative_mode") + + +-- Update player property +-- Global to allow overriding + +function binoculars.update_player_property(player) + local creative_enabled = + (creative and creative.is_enabled_for(player:get_player_name())) or + creative_mode_cache + + if creative_enabled or + player:get_inventory():contains_item("main", "binoculars:binoculars") then + player:set_properties({can_zoom = true}) + else + player:set_properties({can_zoom = false}) + end +end + + +-- Set player property 'on joinplayer' + +minetest.register_on_joinplayer(function(player) + binoculars.update_player_property(player) +end) + + +-- Cyclic update of player property + +local function cyclic_update() + for _, player in ipairs(minetest.get_connected_players()) do + binoculars.update_player_property(player) + end + minetest.after(4.7, cyclic_update) +end + +minetest.after(4.7, cyclic_update) + + +-- Binoculars item + +minetest.register_craftitem("binoculars:binoculars", { + description = "Binoculars", + inventory_image = "binoculars_binoculars.png", + stack_max = 1, + + on_use = function(itemstack, user, pointed_thing) + binoculars.update_player_property(user) + end, +}) + + +-- Crafting + +minetest.register_craft({ + output = "binoculars:binoculars", + recipe = { + {"default:obsidian_glass", "", "default:obsidian_glass"}, + {"default:bronze_ingot", "default:bronze_ingot", "default:bronze_ingot"}, + {"default:obsidian_glass", "", "default:obsidian_glass"}, + } +}) diff --git a/mods/binoculars/license.txt b/mods/binoculars/license.txt new file mode 100644 index 00000000..f3aefda1 --- /dev/null +++ b/mods/binoculars/license.txt @@ -0,0 +1,59 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2017 paramat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2017 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/binoculars/textures/binoculars_binoculars.png b/mods/binoculars/textures/binoculars_binoculars.png new file mode 100644 index 0000000000000000000000000000000000000000..5803d48f3b7b3b0cb5864680aa56d0b9e2e7a1ef GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF4e$wZP0TD25D<`8Gt|-%bN8~W zu8HZY@$IYgo!ynUW@g3lEmMwdn|gU$$<-Yhzn|<9xR84YsFATG$S;_|;n|HeAScGt z#W95AdU8So^FD5YGZS(S Date: Wed, 13 Sep 2017 03:55:00 -0400 Subject: [PATCH 038/195] Chest sounds: Shorten open/close sounds --- mods/default/sounds/default_chest_close.ogg | Bin 10099 -> 10768 bytes mods/default/sounds/default_chest_open.ogg | Bin 10578 -> 11092 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/sounds/default_chest_close.ogg b/mods/default/sounds/default_chest_close.ogg index 53ff23d219cec9d3a10778cd797ff6cbde79bd13..068d9002fb0db2e50ac3155f53fb3d610386c179 100644 GIT binary patch literal 10768 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 literal 10099 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 oI%2I^rHkG7UHiYQ^0NTEfZvX%Q diff --git a/mods/default/sounds/default_chest_open.ogg b/mods/default/sounds/default_chest_open.ogg index c73c072c05d0b42e5e9ed50e3d7398dcc476fa16..40b0b93416cbf8a724a255ba202bcbf4ec74f429 100644 GIT binary patch literal 11092 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 F{{dc*pj7|> literal 10578 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 iVWA Date: Mon, 9 Oct 2017 17:07:32 +0200 Subject: [PATCH 039/195] Creative: Cache inventory items on load --- mods/creative/inventory.lua | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua index 00b2aa55..8b7f0c3a 100644 --- a/mods/creative/inventory.lua +++ b/mods/creative/inventory.lua @@ -1,4 +1,19 @@ local player_inventory = {} +local inventory_cache = {} + +local function init_creative_cache(items) + inventory_cache[items] = {} + local i_cache = inventory_cache[items] + + for name, def in pairs(items) do + if def.groups.not_in_creative_inventory ~= 1 and + def.description and def.description ~= "" then + i_cache[name] = def + end + end + table.sort(i_cache) + return i_cache +end function creative.init_creative_inventory(player) local player_name = player:get_player_name() @@ -45,11 +60,11 @@ function creative.update_creative_inventory(player_name, tab_content) creative.init_creative_inventory(minetest.get_player_by_name(player_name)) local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name}) - for name, def in pairs(tab_content) do - if not (def.groups.not_in_creative_inventory == 1) and - def.description and def.description ~= "" and - (def.name:find(inv.filter, 1, true) or - def.description:lower():find(inv.filter, 1, true)) then + local items = inventory_cache[tab_content] or init_creative_cache(tab_content) + + for name, def in pairs(items) do + if def.name:find(inv.filter, 1, true) or + def.description:lower():find(inv.filter, 1, true) then creative_list[#creative_list+1] = name end end @@ -161,10 +176,6 @@ function creative.register_tab(name, title, items) }) end -minetest.register_on_joinplayer(function(player) - creative.update_creative_inventory(player:get_player_name(), minetest.registered_items) -end) - creative.register_tab("all", "All", minetest.registered_items) creative.register_tab("nodes", "Nodes", minetest.registered_nodes) creative.register_tab("tools", "Tools", minetest.registered_tools) From 5870fd48f6a50c9bcc7c7f1c4297f69ec9d9039b Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 15 Oct 2017 11:49:48 +0200 Subject: [PATCH 040/195] Carts: Replace old, deprecated function names --- mods/carts/cart_entity.lua | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua index 8f733746..4384a039 100644 --- a/mods/carts/cart_entity.lua +++ b/mods/carts/cart_entity.lua @@ -57,8 +57,8 @@ function cart_entity:get_staticdata() end function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) - local pos = self.object:getpos() - local vel = self.object:getvelocity() + local pos = self.object:get_pos() + local vel = self.object:get_velocity() if not self.railtype or vector.equals(vel, {x=0, y=0, z=0}) then local node = minetest.get_node(pos).name self.railtype = minetest.get_item_group(node, "connect_to_raillike") @@ -81,7 +81,7 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, -- Detach driver and items if self.driver then if self.old_pos then - self.object:setpos(self.old_pos) + self.object:set_pos(self.old_pos) end local player = minetest.get_player_by_name(self.driver) carts:manage_attachment(player, nil) @@ -99,7 +99,7 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, local leftover = inv:add_item("main", "carts:cart") -- If no room in inventory add a replacement cart to the world if not leftover:is_empty() then - minetest.add_item(self.object:getpos(), leftover) + minetest.add_item(self.object:get_pos(), leftover) end end self.object:remove() @@ -152,7 +152,7 @@ local function rail_sound(self, dtime) self.sound_handle = nil minetest.after(0.2, minetest.sound_stop, handle) end - local vel = self.object:getvelocity() + local vel = self.object:get_velocity() local speed = vector.length(vel) if speed > 0 then self.sound_handle = minetest.sound_play( @@ -170,16 +170,16 @@ local function get_railparams(pos) end local function rail_on_step(self, dtime) - local vel = self.object:getvelocity() + local vel = self.object:get_velocity() if self.punched then vel = vector.add(vel, self.velocity) - self.object:setvelocity(vel) + self.object:set_velocity(vel) self.old_dir.y = 0 elseif vector.equals(vel, {x=0, y=0, z=0}) then return end - local pos = self.object:getpos() + local pos = self.object:get_pos() local update = {} -- stop cart if velocity vector flips @@ -187,8 +187,8 @@ local function rail_on_step(self, dtime) (self.old_vel.x * vel.x < 0 or self.old_vel.z * vel.z < 0) then self.old_vel = {x = 0, y = 0, z = 0} self.old_pos = pos - self.object:setvelocity(vector.new()) - self.object:setacceleration(vector.new()) + self.object:set_velocity(vector.new()) + self.object:set_acceleration(vector.new()) rail_on_step_event(get_railparams(pos).on_step, self, dtime) return end @@ -294,7 +294,7 @@ local function rail_on_step(self, dtime) end end - self.object:setacceleration(new_acc) + self.object:set_acceleration(new_acc) self.old_pos = vector.new(pos) if not vector.equals(dir, {x=0, y=0, z=0}) then self.old_dir = vector.new(dir) @@ -342,9 +342,9 @@ local function rail_on_step(self, dtime) end self.object:set_animation(anim, 1, 0) - self.object:setvelocity(vel) + self.object:set_velocity(vel) if update.pos then - self.object:setpos(pos) + self.object:set_pos(pos) end -- call event handler From 454e0da5313971d9eb8e94491ba148e0bb26db82 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 15 Oct 2017 12:05:31 +0200 Subject: [PATCH 041/195] Carts: Better wiggle prevention --- mods/carts/cart_entity.lua | 44 +++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua index 4384a039..88fd2be6 100644 --- a/mods/carts/cart_entity.lua +++ b/mods/carts/cart_entity.lua @@ -43,16 +43,12 @@ function cart_entity:on_activate(staticdata, dtime_s) if data.old_dir then self.old_dir = data.old_dir end - if data.old_vel then - self.old_vel = data.old_vel - end end function cart_entity:get_staticdata() return minetest.serialize({ railtype = self.railtype, - old_dir = self.old_dir, - old_vel = self.old_vel + old_dir = self.old_dir }) end @@ -180,21 +176,11 @@ local function rail_on_step(self, dtime) end local pos = self.object:get_pos() + local cart_dir = carts:velocity_to_dir(vel) + local same_dir = vector.equals(cart_dir, self.old_dir) local update = {} - -- stop cart if velocity vector flips - if self.old_vel and self.old_vel.y == 0 and - (self.old_vel.x * vel.x < 0 or self.old_vel.z * vel.z < 0) then - self.old_vel = {x = 0, y = 0, z = 0} - self.old_pos = pos - self.object:set_velocity(vector.new()) - self.object:set_acceleration(vector.new()) - rail_on_step_event(get_railparams(pos).on_step, self, dtime) - return - end - self.old_vel = vector.new(vel) - - if self.old_pos and not self.punched then + if self.old_pos and not self.punched and same_dir then local flo_pos = vector.round(pos) local flo_old = vector.round(self.old_pos) if vector.equals(flo_pos, flo_old) then @@ -213,7 +199,8 @@ local function rail_on_step(self, dtime) end end - if self.old_pos then + local stop_wiggle = false + if self.old_pos and same_dir then -- Detection for "skipping" nodes local found_path = carts:pathfinder( pos, self.old_pos, self.old_dir, ctrl, self.old_switch, self.railtype @@ -224,9 +211,11 @@ local function rail_on_step(self, dtime) pos = vector.new(self.old_pos) update.pos = true end + elseif self.old_pos and cart_dir.y ~= -1 and not self.punched then + -- Stop wiggle + stop_wiggle = true end - local cart_dir = carts:velocity_to_dir(vel) local railparams -- dir: New moving direction of the cart @@ -236,9 +225,16 @@ local function rail_on_step(self, dtime) ) local new_acc = {x=0, y=0, z=0} - if vector.equals(dir, {x=0, y=0, z=0}) then + if stop_wiggle or vector.equals(dir, {x=0, y=0, z=0}) then vel = {x = 0, y = 0, z = 0} - pos = vector.round(pos) + local pos_r = vector.round(pos) + if not carts:is_rail(pos_r, self.railtype) then + pos = self.old_pos + elseif not stop_wiggle then + pos = pos_r + else + pos.y = math.floor(pos.y + 0.5) + end update.pos = true update.vel = true else @@ -296,7 +292,7 @@ local function rail_on_step(self, dtime) self.object:set_acceleration(new_acc) self.old_pos = vector.new(pos) - if not vector.equals(dir, {x=0, y=0, z=0}) then + if not vector.equals(dir, {x=0, y=0, z=0}) and not stop_wiggle then self.old_dir = vector.new(dir) end self.old_switch = switch_keys @@ -332,7 +328,7 @@ local function rail_on_step(self, dtime) elseif self.old_dir.z < 0 then yaw = 1 end - self.object:setyaw(yaw * math.pi) + self.object:set_yaw(yaw * math.pi) local anim = {x=0, y=0} if dir.y == -1 then From 045abbd6d7bac8d4706731cb36c1c15dd98fdf13 Mon Sep 17 00:00:00 2001 From: Coder12a <32314020+Coder12a@users.noreply.github.com> Date: Sun, 15 Oct 2017 19:09:26 -0700 Subject: [PATCH 042/195] Books: Convert \r to \n Some files or editors may use \r instand of \n like notepad++. If you copy text written in notepad++ and pasted into the book. The book will only have one page. --- mods/default/craftitems.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index e4a93ae5..e1d224d1 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -112,6 +112,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end data.description = "\""..short_title.."\" by "..data.owner data.text = fields.text:sub(1, max_text_size) + data.text = data.text:gsub("\r\n", "\n"):gsub("\r", "\n") data.page = 1 data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp) From 3f14d1012dfc095b5019c805fd240ae5aaad4200 Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 21 Oct 2017 07:01:23 +0100 Subject: [PATCH 043/195] Footstep sounds: 5 new sounds Original recording by Ryding. http://freesound.org/people/Ryding/ Found by Anth0rx, edited by paramat. Add and use 'default.node_sound_snow_defaults()' function. --- mods/default/README.txt | 16 ++++---- mods/default/functions.lua | 30 ++++++++++---- mods/default/license.txt | 37 ++++++++++++++++++ mods/default/nodes.lua | 14 ++----- .../sounds/default_snow_footstep.1.ogg | Bin 5992 -> 7159 bytes .../sounds/default_snow_footstep.2.ogg | Bin 7364 -> 8726 bytes .../sounds/default_snow_footstep.3.ogg | Bin 8245 -> 8722 bytes .../sounds/default_snow_footstep.4.ogg | Bin 0 -> 6795 bytes .../sounds/default_snow_footstep.5.ogg | Bin 0 -> 8126 bytes mods/stairs/init.lua | 6 +-- 10 files changed, 73 insertions(+), 30 deletions(-) create mode 100644 mods/default/sounds/default_snow_footstep.4.ogg create mode 100644 mods/default/sounds/default_snow_footstep.5.ogg diff --git a/mods/default/README.txt b/mods/default/README.txt index 0a9f8ff7..977594f2 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -184,7 +184,7 @@ Gambit (CC BY-SA 3.0): asl97 (CC BY-SA 3.0): default_ice.png -KevDoy (CC BY-SA 3.0) +KevDoy (CC BY-SA 3.0): heart.png Pithydon (CC BY-SA 3.0) @@ -192,11 +192,11 @@ Pithydon (CC BY-SA 3.0) default_coral_orange.png default_coral_skeleton.png -Ferk (CC0 1.0) +Ferk (CC0 1.0): default_item_smoke.png default_item_smoke.ogg, based on sound by http://opengameart.org/users/bart -npx (CC BY-SA 3.0) +npx (CC BY-SA 3.0): default_rainforest_litter.png default_rainforest_litter_side.png @@ -249,8 +249,6 @@ Mito551 (sounds) (CC BY-SA 3.0): default_place_node.3.ogg default_place_node_hard.1.ogg default_place_node_hard.2.ogg - default_snow_footstep.1.ogg - default_snow_footstep.2.ogg default_hard_footstep.1.ogg default_hard_footstep.2.ogg default_hard_footstep.3.ogg @@ -275,14 +273,14 @@ Metal sounds: Tool breaking sounds added by sofar: CC-BY-3.0 default_tool_breaks.* - http://www.freesound.org/people/HerbertBoland/sounds/33206/ -AGFX (CC BY 3.0) +AGFX (CC BY 3.0): https://www.freesound.org/people/AGFX/packs/1253/ default_water_footstep.1.ogg default_water_footstep.2.ogg default_water_footstep.3.ogg (default_water_footstep.4.ogg is silent) -blukotek (CC0 1.0) +blukotek (CC0 1.0): https://www.freesound.org/people/blukotek/sounds/251660/ default_dig_snappy.ogg @@ -294,3 +292,7 @@ Chests sounds added by sofar, derived of several files mixed together: - http://www.freesound.org/people/kingsamas/sounds/135576/ CC-BY-3.0 - http://www.freesound.org/people/bulbastre/sounds/126887/ CC-BY-3.0 - http://www.freesound.org/people/Yoyodaman234/sounds/183541/ CC0 + +Ryding (CC0 1.0): +http://freesound.org/people/Ryding/sounds/94337/ + default_snow_footstep.*.ogg diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 87e7483b..4eb1a1c9 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -1,5 +1,3 @@ --- mods/default/functions.lua - -- -- Sounds -- @@ -117,6 +115,21 @@ function default.node_sound_water_defaults(table) return table end +function default.node_sound_snow_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_snow_footstep", gain = 0.2} + table.dig = table.dig or + {name = "default_snow_footstep", gain = 0.3} + table.dug = table.dug or + {name = "default_snow_footstep", gain = 0.3} + table.place = table.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(table) + return table +end + + -- -- Lavacooling -- @@ -145,8 +158,9 @@ if minetest.settings:get_bool("enable_lavacooling") ~= false then }) end + -- --- optimized helper to put all items in an inventory into a drops list +-- Optimized helper to put all items in an inventory into a drops list -- function default.get_inventory_drops(pos, inventory, drops) @@ -161,11 +175,12 @@ function default.get_inventory_drops(pos, inventory, drops) end end + -- -- Papyrus and cactus growing -- --- wrapping the functions in abm action is necessary to make overriding them possible +-- Wrapping the functions in ABM action is necessary to make overriding them possible function default.grow_cactus(pos, node) if node.param2 >= 4 then @@ -242,7 +257,7 @@ minetest.register_abm({ -- --- dig upwards +-- Dig upwards -- function default.dig_up(pos, node, digger) @@ -386,6 +401,7 @@ function default.register_leafdecay(def) end end + -- -- Convert dirt to something that fits the environment -- @@ -538,7 +554,7 @@ minetest.register_abm({ -- --- NOTICE: This method is not an official part of the API yet! +-- NOTICE: This method is not an official part of the API yet. -- This method may change in future. -- @@ -558,7 +574,7 @@ function default.can_interact_with_node(player, pos) return true end - -- is player wielding the right key? + -- Is player wielding the right key? local item = player:get_wielded_item() if item:get_name() == "default:key" then local key_meta = item:get_meta() diff --git a/mods/default/license.txt b/mods/default/license.txt index 034151f2..a6ec47a3 100644 --- a/mods/default/license.txt +++ b/mods/default/license.txt @@ -176,3 +176,40 @@ rights may limit how you use the material. For more details: http://creativecommons.org/licenses/by/3.0/ + +----------------------- + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +Iwan Gabovitch +Ottomaani138 +Ogrebane +blukotek +Sevin7 +Yoyodaman234 +Ryding + +No Copyright + +The person who associated a work with this deed has dedicated the work to the +public domain by waiving all of his or her rights to the work worldwide under +copyright law, including all related and neighboring rights, to the extent +allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial +purposes, all without asking permission. See Other Information below. + +Other Information: + +In no way are the patent or trademark rights of any person affected by CC0, nor +are the rights that other persons may have in the work or in how the work is +used, such as publicity or privacy rights. + +Unless expressly stated otherwise, the person who associated a work with this +deed makes no warranties about the work, and disclaims liability for all uses +of the work, to the fullest extent permitted by applicable law. + +When using or citing the work, you should not imply endorsement by the author +or the affirmer. + +For more details: +https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index e0e75cdf..00756210 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -445,7 +445,7 @@ minetest.register_node("default:dirt_with_snow", { groups = {crumbly = 3, spreading_dirt_type = 1, snowy = 1}, drop = 'default:dirt', sounds = default.node_sound_dirt_defaults({ - footstep = {name = "default_snow_footstep", gain = 0.15}, + footstep = {name = "default_snow_footstep", gain = 0.2}, }), }) @@ -525,11 +525,7 @@ minetest.register_node("default:snow", { }, }, groups = {crumbly = 3, falling_node = 1, puts_out_fire = 1, snowy = 1}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name = "default_snow_footstep", gain = 0.15}, - dug = {name = "default_snow_footstep", gain = 0.2}, - dig = {name = "default_snow_footstep", gain = 0.2} - }), + sounds = default.node_sound_snow_defaults(), on_construct = function(pos) pos.y = pos.y - 1 @@ -543,11 +539,7 @@ minetest.register_node("default:snowblock", { description = "Snow Block", tiles = {"default_snow.png"}, groups = {crumbly = 3, puts_out_fire = 1, cools_lava = 1, snowy = 1}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name = "default_snow_footstep", gain = 0.15}, - dug = {name = "default_snow_footstep", gain = 0.2}, - dig = {name = "default_snow_footstep", gain = 0.2} - }), + sounds = default.node_sound_snow_defaults(), on_construct = function(pos) pos.y = pos.y - 1 diff --git a/mods/default/sounds/default_snow_footstep.1.ogg b/mods/default/sounds/default_snow_footstep.1.ogg index 3260b915fce89559681c790485d1fa3338730ed9..97cc8252e99a8cf2a30a4e1602a04ab5b8d82d8c 100644 GIT binary patch literal 7159 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 F{SPl&Po@9> literal 5992 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 diff --git a/mods/default/sounds/default_snow_footstep.2.ogg b/mods/default/sounds/default_snow_footstep.2.ogg index 4aac1e7fa68cf981323e86e70b4e8aa8021d7d3d..97a6baa483caba104669dd4d6311cdb0fffa2ab5 100644 GIT binary patch delta 4931 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 diff --git a/mods/default/sounds/default_snow_footstep.3.ogg b/mods/default/sounds/default_snow_footstep.3.ogg index cf4235b7b5192ae1fb52fd44f3dece78d2541971..bde1f21d49a618a6da63bafa6f04b94902021edb 100644 GIT binary patch delta 4927 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 literal 0 HcmV?d00001 diff --git a/mods/default/sounds/default_snow_footstep.5.ogg b/mods/default/sounds/default_snow_footstep.5.ogg new file mode 100644 index 0000000000000000000000000000000000000000..220d60c9326c2a1025ddf0b0985bbded37cefd5f GIT binary patch literal 8126 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 Ef8TN@p8x;= literal 0 HcmV?d00001 diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 48254488..2fdd54b0 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -779,9 +779,5 @@ stairs.register_stair_and_slab( {"default_snow.png"}, "Snow Block Stair", "Snow Block Slab", - default.node_sound_dirt_defaults({ - footstep = {name = "default_snow_footstep", gain = 0.15}, - dug = {name = "default_snow_footstep", gain = 0.2}, - dig = {name = "default_snow_footstep", gain = 0.2} - }) + default.node_sound_snow_defaults() ) From 36df80fc45c4797a7b917c494f9dc9689d4e729e Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 24 Oct 2017 04:51:53 +0100 Subject: [PATCH 044/195] Binoculars / Map mods: Clarify key-activation of items in descriptions Map mod: Tune cyclic update interval. Re-add HUD flags update on item 'use'. --- mods/binoculars/init.lua | 2 +- mods/map/README.txt | 5 +++-- mods/map/init.lua | 10 +++++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/mods/binoculars/init.lua b/mods/binoculars/init.lua index 050605c1..cd07ef9b 100644 --- a/mods/binoculars/init.lua +++ b/mods/binoculars/init.lua @@ -47,7 +47,7 @@ minetest.after(4.7, cyclic_update) -- Binoculars item minetest.register_craftitem("binoculars:binoculars", { - description = "Binoculars", + description = "Binoculars\nUse with 'Zoom' key", inventory_image = "binoculars_binoculars.png", stack_max = 1, diff --git a/mods/map/README.txt b/mods/map/README.txt index c6f413ba..8f35f696 100644 --- a/mods/map/README.txt +++ b/mods/map/README.txt @@ -32,8 +32,9 @@ WPD Usage ----- In survival mode, use of the minimap requires the mapping kit item in your -inventory. It can take up to 3 seconds for adding to or removal from inventory -to have an effect. +inventory. It can take up to 5 seconds for adding to or removal from inventory +to have an effect, however to instantly allow the use of the minimap 'use' +(leftclick) the item. Minimap radar mode is always disallowed in survival mode. Minimap and minimap radar mode are automatically allowed in creative mode and diff --git a/mods/map/init.lua b/mods/map/init.lua index 412f76d9..03024fa0 100644 --- a/mods/map/init.lua +++ b/mods/map/init.lua @@ -40,19 +40,23 @@ local function cyclic_update() for _, player in ipairs(minetest.get_connected_players()) do map.update_hud_flags(player) end - minetest.after(3.1, cyclic_update) + minetest.after(5.3, cyclic_update) end -minetest.after(3.1, cyclic_update) +minetest.after(5.3, cyclic_update) -- Mapping kit item minetest.register_craftitem("map:mapping_kit", { - description = "Mapping Kit", + description = "Mapping Kit\nUse with 'Minimap' key", inventory_image = "map_mapping_kit.png", stack_max = 1, groups = {flammable = 3}, + + on_use = function(itemstack, user, pointed_thing) + map.update_hud_flags(user) + end, }) From 49cc4c7c633df91e7bfeda3f38cc0b64df1388d1 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Fri, 27 Oct 2017 13:34:41 +0200 Subject: [PATCH 045/195] Add loot to dungeons (#1921) --- .luacheckrc | 7 +- game_api.txt | 32 +++++++ mods/dungeon_loot/README.txt | 11 +++ mods/dungeon_loot/depends.txt | 1 + mods/dungeon_loot/init.lua | 8 ++ mods/dungeon_loot/license.txt | 24 +++++ mods/dungeon_loot/loot.lua | 62 +++++++++++++ mods/dungeon_loot/mapgen.lua | 168 ++++++++++++++++++++++++++++++++++ 8 files changed, 310 insertions(+), 3 deletions(-) create mode 100644 mods/dungeon_loot/README.txt create mode 100644 mods/dungeon_loot/depends.txt create mode 100644 mods/dungeon_loot/init.lua create mode 100644 mods/dungeon_loot/license.txt create mode 100644 mods/dungeon_loot/loot.lua create mode 100644 mods/dungeon_loot/mapgen.lua diff --git a/.luacheckrc b/.luacheckrc index 3c7ec693..c3df64be 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -7,11 +7,12 @@ read_globals = { "dump", "vector", "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", + "PseudoRandom", "PcgRandom", + "ItemStack", "Settings", "unpack", - -- Silence "accessing undefined field copy of global table". - table = { fields = { "copy" } } + -- Silence errors about custom table methods. + table = { fields = { "copy", "indexof" } } } -- Overwrites minetest.handle_node_drops diff --git a/game_api.txt b/game_api.txt index 1a0e252a..379e3f85 100644 --- a/game_api.txt +++ b/game_api.txt @@ -161,6 +161,38 @@ The doors mod allows modders to register custom doors and trapdoors. groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults(), -- optional +Dungeon Loot API +---------------- + +The mod that places chests with loot in dungeons provides an API to register additional loot. + +`dungeon_loot.register(def)` + + * Registers one or more loot items + * `def` Can be a single [#Loot definition] or a list of them + +`dungeon_loot.registered_loot` + + * Table of all registered loot, not to be modified manually + +### Loot definition + + name = "item:name", + chance = 0.5, + -- ^ chance value from 0.0 to 1.0 that the item will appear in the chest when chosen + -- due to an extra step in the selection process, 0.5 does not(!) mean that + -- on average every second chest will have this item + count = {1, 4}, + -- ^ table with minimum and maximum amounts of this item + -- optional, defaults to always single item + y = {-32768, -512}, + -- ^ table with minimum and maximum heights this item can be found at + -- optional, defaults to no height restrictions + types = {"desert"}, + -- ^ table with types of dungeons this item can be found in + -- supported types: "normal" (the cobble/mossycobble one), "sandstone", "desert" + -- optional, defaults to no type restrictions + Fence API --------- diff --git a/mods/dungeon_loot/README.txt b/mods/dungeon_loot/README.txt new file mode 100644 index 00000000..c500d255 --- /dev/null +++ b/mods/dungeon_loot/README.txt @@ -0,0 +1,11 @@ +Minetest Game mod: dungeon_loot +=============================== +Adds randomly generated chests with some "loot" to generated dungeons, +an API to register additional loot is provided. +Only works if dungeons are actually enabled in mapgen flags. + +License information can be found in license.txt + +Authors of source code +---------------------- +Originally by sfan5 (MIT) diff --git a/mods/dungeon_loot/depends.txt b/mods/dungeon_loot/depends.txt new file mode 100644 index 00000000..4ad96d51 --- /dev/null +++ b/mods/dungeon_loot/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/dungeon_loot/init.lua b/mods/dungeon_loot/init.lua new file mode 100644 index 00000000..9d8ac52f --- /dev/null +++ b/mods/dungeon_loot/init.lua @@ -0,0 +1,8 @@ +dungeon_loot = {} + +dungeon_loot.CHESTS_MIN = 0 -- not necessarily in a single dungeon +dungeon_loot.CHESTS_MAX = 2 +dungeon_loot.STACKS_PER_CHEST_MAX = 8 + +dofile(minetest.get_modpath("dungeon_loot") .. "/loot.lua") +dofile(minetest.get_modpath("dungeon_loot") .. "/mapgen.lua") diff --git a/mods/dungeon_loot/license.txt b/mods/dungeon_loot/license.txt new file mode 100644 index 00000000..0af30a0c --- /dev/null +++ b/mods/dungeon_loot/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2017 sfan5 + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/dungeon_loot/loot.lua b/mods/dungeon_loot/loot.lua new file mode 100644 index 00000000..3fe0bff6 --- /dev/null +++ b/mods/dungeon_loot/loot.lua @@ -0,0 +1,62 @@ +dungeon_loot.registered_loot = { + -- buckets + {name = "bucket:bucket_empty", chance = 0.55}, + -- water in deserts or above ground, lava otherwise + {name = "bucket:bucket_water", chance = 0.45, types = {"sandstone", "desert"}}, + {name = "bucket:bucket_water", chance = 0.45, y = {0, 32768}, types = {"normal"}}, + {name = "bucket:bucket_lava", chance = 0.45, y = {-32768, -1}, types = {"normal"}}, + + -- various items + {name = "default:stick", chance = 0.6, count = {3, 6}}, + {name = "default:flint", chance = 0.4, count = {1, 3}}, + {name = "vessels:glass_fragments", chance = 0.35, count = {1, 4}}, + {name = "carts:rail", chance = 0.35, count = {1, 6}}, + + -- farming / consumable + {name = "farming:string", chance = 0.5, count = {1, 8}}, + {name = "farming:wheat", chance = 0.5, count = {2, 5}}, + {name = "default:apple", chance = 0.4, count = {1, 4}}, + {name = "farming:seed_cotton", chance = 0.4, count = {1, 4}, types = {"normal"}}, + {name = "default:cactus", chance = 0.4, count = {1, 4}, types = {"sandstone", "desert"}}, + + -- minerals + {name = "default:coal_lump", chance = 0.9, count = {1, 12}}, + {name = "default:gold_ingot", chance = 0.5}, + {name = "default:steel_ingot", chance = 0.4, count = {1, 6}}, + {name = "default:mese_crystal", chance = 0.1, count = {2, 3}}, + + -- tools + {name = "default:sword_wood", chance = 0.6}, + {name = "default:pick_stone", chance = 0.3}, + {name = "default:axe_diamond", chance = 0.05}, + + -- natural materials + {name = "default:sand", chance = 0.8, count = {4, 32}, y = {-64, 32768}, types = {"normal"}}, + {name = "default:desert_sand", chance = 0.8, count = {4, 32}, y = {-64, 32768}, types = {"sandstone"}}, + {name = "default:desert_cobble", chance = 0.8, count = {4, 32}, types = {"desert"}}, + {name = "default:dirt", chance = 0.6, count = {2, 16}, y = {-64, 32768}}, + {name = "default:obsidian", chance = 0.25, count = {1, 3}, y = {-32768, -512}}, + {name = "default:mese", chance = 0.15, y = {-32768, -512}}, +} + +function dungeon_loot.register(t) + if t.name ~= nil then + t = {t} -- single entry + end + for _, loot in ipairs(t) do + table.insert(dungeon_loot.registered_loot, loot) + end +end + +function dungeon_loot._internal_get_loot(pos_y, dungeontype) + -- filter by y pos and type + local ret = {} + for _, l in ipairs(dungeon_loot.registered_loot) do + if l.y == nil or (pos_y >= l.y[1] and pos_y <= l.y[2]) then + if l.types == nil or table.indexof(l.types, dungeontype) ~= -1 then + table.insert(ret, l) + end + end + end + return ret +end diff --git a/mods/dungeon_loot/mapgen.lua b/mods/dungeon_loot/mapgen.lua new file mode 100644 index 00000000..9d42c530 --- /dev/null +++ b/mods/dungeon_loot/mapgen.lua @@ -0,0 +1,168 @@ +minetest.set_gen_notify({dungeon = true, temple = true}) + +local function noise3d_integer(noise, pos) + return math.abs(math.floor(noise:get3d(pos) * 0x7fffffff)) +end + +local function random_sample(rand, list, count) + local ret = {} + for n = 1, count do + local idx = rand:next(1, #list) + table.insert(ret, list[idx]) + table.remove(list, idx) + end + return ret +end + +local function find_walls(cpos) + local wall = minetest.registered_aliases["mapgen_cobble"] + local wall_alt = minetest.registered_aliases["mapgen_mossycobble"] + local wall_ss = minetest.registered_aliases["mapgen_sandstonebrick"] + local wall_ds = minetest.registered_aliases["mapgen_desert_stone"] + local is_wall = function(node) + return table.indexof({wall, wall_alt, wall_ss, wall_ds}, node.name) ~= -1 + end + + local dirs = {{x=1, z=0}, {x=-1, z=0}, {x=0, z=1}, {x=0, z=-1}} + local get_node = minetest.get_node + + local ret = {} + local mindist = {x=0, z=0} + local min = function(a, b) return a ~= 0 and math.min(a, b) or b end + local wallnode + for _, dir in ipairs(dirs) do + for i = 1, 9 do -- 9 = max room size / 2 + local pos = vector.add(cpos, {x=dir.x*i, y=0, z=dir.z*i}) + + -- continue in that direction until we find a wall-like node + local node = get_node(pos) + if is_wall(node) then + local front_below = vector.subtract(pos, {x=dir.x, y=1, z=dir.z}) + local above = vector.add(pos, {x=0, y=1, z=0}) + + -- check that it: + --- is at least 2 nodes high (not a staircase) + --- has a floor + if is_wall(get_node(front_below)) and is_wall(get_node(above)) then + table.insert(ret, {pos = pos, facing = {x=-dir.x, y=0, z=-dir.z}}) + if dir.z == 0 then + mindist.x = min(mindist.x, i-1) + else + mindist.z = min(mindist.z, i-1) + end + wallnode = node.name + end + -- abort even if it wasn't a wall cause something is in the way + break + end + end + end + + local mapping = { + [wall_ss] = "sandstone", + [wall_ds] = "desert" + } + return { + walls = ret, + size = {x=mindist.x*2, z=mindist.z*2}, + type = mapping[wallnode] or "normal" + } +end + +local function populate_chest(pos, rand, dungeontype) + --minetest.chat_send_all("chest placed at " .. minetest.pos_to_string(pos) .. " [" .. dungeontype .. "]") + --minetest.add_node(vector.add(pos, {x=0, y=1, z=0}), {name="default:torch", param2=1}) + + local item_list = dungeon_loot._internal_get_loot(pos.y, dungeontype) + -- take random (partial) sample of all possible items + assert(#item_list >= dungeon_loot.STACKS_PER_CHEST_MAX) + item_list = random_sample(rand, item_list, dungeon_loot.STACKS_PER_CHEST_MAX) + + -- apply chances / randomized amounts and collect resulting items + local items = {} + for _, loot in ipairs(item_list) do + if rand:next(0, 1000) / 1000 <= loot.chance then + local itemdef = minetest.registered_items[loot.name] + local amount = 1 + if loot.count ~= nil then + amount = rand:next(loot.count[1], loot.count[2]) + end + + if itemdef.tool_capabilities then + for n = 1, amount do + local wear = rand:next(0.20 * 65535, 0.75 * 65535) -- 20% to 75% wear + table.insert(items, ItemStack({name = loot.name, wear = wear})) + end + elseif itemdef.stack_max == 1 then + -- not stackable, add separately + for n = 1, amount do + table.insert(items, loot.name) + end + else + table.insert(items, ItemStack({name = loot.name, count = amount})) + end + end + end + + -- place items at random places in chest + local inv = minetest.get_meta(pos):get_inventory() + local listsz = inv:get_size("main") + assert(listsz >= #items) + for _, item in ipairs(items) do + local index = rand:next(1, listsz) + if inv:get_stack("main", index):is_empty() then + inv:set_stack("main", index, item) + else + inv:add_item("main", item) -- space occupied, just put it anywhere + end + end +end + + +minetest.register_on_generated(function(minp, maxp, blockseed) + local gennotify = minetest.get_mapgen_object("gennotify") + local poslist = gennotify["dungeon"] or {} + for _, entry in ipairs(gennotify["temple"] or {}) do + table.insert(poslist, entry) + end + if #poslist == 0 then return end + + local noise = minetest.get_perlin(10115, 4, 0.5, 1) + local rand = PcgRandom(noise3d_integer(noise, poslist[1])) + + local candidates = {} + -- process at most 16 rooms to keep runtime of this predictable + local num_process = math.min(#poslist, 16) + for i = 1, num_process do + local room = find_walls(poslist[i]) + -- skip small rooms and everything that doesn't at least have 3 walls + if math.min(room.size.x, room.size.z) >= 4 and #room.walls >= 3 then + table.insert(candidates, room) + end + end + + local num_chests = rand:next(dungeon_loot.CHESTS_MIN, dungeon_loot.CHESTS_MAX) + num_chests = math.min(#candidates, num_chests) + local rooms = random_sample(rand, candidates, num_chests) + + for _, room in ipairs(rooms) do + -- choose place somewhere in front of any of the walls + local wall = room.walls[rand:next(1, #room.walls)] + local v, vi -- vector / axis that runs alongside the wall + if wall.facing.x ~= 0 then + v, vi = {x=0, y=0, z=1}, "z" + else + v, vi = {x=1, y=0, z=0}, "x" + end + local chestpos = vector.add(wall.pos, wall.facing) + local off = rand:next(-room.size[vi]/2 + 1, room.size[vi]/2 - 1) + chestpos = vector.add(chestpos, vector.multiply(v, off)) + + if minetest.get_node(chestpos).name == "air" then + -- make it face inwards to the room + local facedir = minetest.dir_to_facedir(vector.multiply(wall.facing, -1)) + minetest.add_node(chestpos, {name = "default:chest", param2 = facedir}) + populate_chest(chestpos, PcgRandom(noise3d_integer(noise, chestpos)), room.type) + end + end +end) From 9596d00a18390ef4e5d6e332b8dce9b306dcf26b Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 27 Oct 2017 08:28:22 +0100 Subject: [PATCH 046/195] Player model: Remove vertical stretch of body and limbs, remove cape Previously, body and limbs were stretched vertically by 1.125, creating rectangular pixels on side faces. Head was unstretched. Remove stretch of body and limbs, leaving the head unchanged. No other change would excessively shorten the model, so also scale up the model slightly, by * 1.05, such that the reduction factor for height is equal to the increasing factor for width. This minimises the changes to height and width. Remove cape support. Update the collisionbox to match. Add missing license.txt. --- mods/player_api/README.txt | 10 ++--- mods/player_api/init.lua | 2 +- mods/player_api/license.txt | 51 +++++++++++++++++++++++++ mods/player_api/models/character.b3d | Bin 86830 -> 73433 bytes mods/player_api/models/character.blend | Bin 641956 -> 698016 bytes 5 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 mods/player_api/license.txt diff --git a/mods/player_api/README.txt b/mods/player_api/README.txt index 1f28ad9a..cf124686 100644 --- a/mods/player_api/README.txt +++ b/mods/player_api/README.txt @@ -1,5 +1,5 @@ Minetest Game mod: player_api -============================ +============================= See license.txt for license information. Provides an API to allow multiple mods to set player models and textures. @@ -10,11 +10,11 @@ Authors of source code Originally by celeron55, Perttu Ahola (LGPL 2.1) Various Minetest developers and contributors (LGPL 2.1) -Authors of media (textures, models and sounds) ----------------------------------------------- +Authors of media (textures and models) +-------------------------------------- -MirceaKitsune (CC BY-SA 3.0): - character.x +stujones11 (CC BY-SA 3.0): + character.* -- Derived from a model by MirceaKitsune (CC BY-SA 3.0) Jordach (CC BY-SA 3.0): character.png diff --git a/mods/player_api/init.lua b/mods/player_api/init.lua index 203f60e0..86ea340d 100644 --- a/mods/player_api/init.lua +++ b/mods/player_api/init.lua @@ -13,7 +13,7 @@ player_api.register_model("character.b3d", { walk_mine = {x = 200, y = 219}, sit = {x = 81, y = 160}, }, - collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.77, 0.3}, + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}, stepheight = 0.6, }) diff --git a/mods/player_api/license.txt b/mods/player_api/license.txt new file mode 100644 index 00000000..4bee6c52 --- /dev/null +++ b/mods/player_api/license.txt @@ -0,0 +1,51 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2017 celeron55, Perttu Ahola +Copyright (C) 2011-2017 Various Minetest developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +See the GNU Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2017 stujones11 +Copyright (C) 2012-2017 Jordach + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/player_api/models/character.b3d b/mods/player_api/models/character.b3d index fb693bc595084c289d5ecb9a2ea8e281142a3be2..b3b772a4108a04c96491d1e86599bd3e977abbdc 100644 GIT binary patch literal 73433 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 literal 86830 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%0A4llgT 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 KlTWOD#Qy=X8xz6+ diff --git a/mods/player_api/models/character.blend b/mods/player_api/models/character.blend index be40608628f870b8374d8739136d5cf68cf67c1b..652579c152ab3ce8c535ca3cfc507cf6537550ed 100644 GIT binary patch literal 698016 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 P9ww<$r*cI+z3}&c_MMAk literal 641956 zcmeEv31D4Cx&KLWx=`6fP$(_|B8w~q%Jx{Aq`9R9T3VX2T1nE}+cuKq<|Q|U`bP

LQ8 zOO^L$!HmWQ6Cu$(-07zT%I?!1L38Y53}PFIZ6LOR*al)7h;1OYf!GFO8;ETnwt?6N zVjGBUAhv z0GGrW<{!8?{O7=-8ET4`Ypyikj{cr{>YPi;@!JsuVXE+YH(Nf8X1mC{=9=r@f*&r` zLwPxdVY|Q~M2TkPiQjJfe|-HzuDrU(%e7~?-MaYt7reC1C=nm`|G+&0*lf?^e|-NB zT<_rgU^~D5P|x)JX2j$EAFu~t68C?Au&ulJ{$KD4Hlsv*-2dbLU(ist<$}2X7rc7X z_Zi0hKkokp4P{#{i2HxRtJjPY@p1o;`+q@0*_I39{$KFwN#AD}_y4&67c`V@xghTU z1+QK+O2o(gKkokp4P{#{i2HxRt0#S*Vch@Y{$J2gw&jAj{};S^%_tEc_y4&67c`V@ zxghTU1+Sj;eTH%WkNbZ?L)n%K;{IRo>NTT8eBA%z{$J2gw&sG78VZ`+wQ!H-l4r-2dbLU$!B=lZH7@h{vY@MvJL5-WQ_ZN z+2}WeQ+(Y27T%kKc{x3zPeHDY1p+HlsfA+id?I z4YM)2{-af~t(Nh6H(P#N)nn9l$Jc*Uc$!fvKJNb^_X$1zj|$>8S{V2Lkn0_sCv3;p zpJv-^`MCdw*u!>w{p0>0a=qjJ&tYNvaq;}G;I)kVf876@VIAV*`+tZ%#P|P#!d+zk(T*p~>&{x)0;wyQ6 zC|_M&eYoT7TrnPTx@`Kze%E=U-`Ulv>~lb@U2o?Fo#_iZCFx9An(jzVS=N^6?U~Zp zy0kmhwkXrq)4Fs@Pgh&2JvF7HtuvKL^<P(vY<4BA^jKDjGz}a&g=MSjfZF;Ex z4|*&Kw&v_PXSa3EY4Hb*AVCr7ENJWlJq8|XUupX)U7nrs?Dg4e@3~$?X6HP8{ZRJl z>#LDbslAjH3X^|dzG~o=<*OLF2pLcO^kUDWQ4aYS zesTi;B8~RpiaXTv4TNl8PPdP=A{W^{Ey{&9iT06~_4sY|X<06`#F4T|7bchGLd*Kd zOS#f!X+tw2-nBquZCeq!q$eNg=|oo|Q&I7$3D>yfn&=Gc(>L6Ex>nLB{%=!%;`L4D z8hgz6LyT&`!g8MUL+grfaa~MU1r$GheQ4_k!Dj4Ixf*Y|C+;Xn~W8mmj)%X1dr*CP_ zuePsF(k?Rh&;{SrgUb~<{cat~m?PynTLNNMHwi=)&ID&S+&0ET;!QyCCSerHkWlra z{DKPS8Z>L1Q>AfR;T)MyV5Qt6Ug>wIy)wdMJeU~vqv05(Dsu1jlg_p+j(D1c@0{0&9dBrP5p zeyIQ!_6*Em0sRdY#{vsrBND^0XzA)o;km!Fb+dp(<*zTgCTa1=u(tpfJ6NO!3+QjK zI1X3<8zBqovMkk|NnO;{($<*~l2OB`{Byf9ZRyUkZy{dWuEBkTW9L@_E#1*d8!Vu| z!Qx+l1+Wpapf28hqzQ0jdb>Ak6c7@Xe?ieTNsC8@A1h!N_LRq90sRdY#{&ysBNBaG zdRlwiyE0Ab(k@g~{;{x&Jqlo5m=PS z-&k68p{@Cc?juqt_YppKi!)e2e}lz|zyjC^jjxNEcVb0#X)4)P++YDAQTgYfzG$;f ztf9QA#*2jADMUdX8Z4l{!Qv!f0c?b{kS@jcm8kq477;tji*G0_z9~xS(4K}GETF%^ z0?#%suo1SPE*GZSmMqPbe;+B8|7@?mXqIuK?jvhNDIHF-(gq9YFIceH1vWx93Km6~ zMpXWYCgG{^4c$jx5T$hZE-OtexGutHdU?KgU)$7g)<*bz@0_<@SZeDpt(*KomFD;( z&-WWOL80e+DHl0941KE+F1_+Bys&$d^&c5F2Ex8Iya%*A#@Wslu>5L75-?kx} z#pGU;xcWYl<6{?oCV+Njo&Te_U0mlg8b^yIL5zTY)3H$NdZM7t3i z;u;)n%A@qwh*sr%uDUv>`39u_dJl(huC3B7*Eh7ARML?(B6)t6a$PKevLV>8zecpX z^9i>KUP$sot|i**iTS0J!;#a)KQ)3H;|~&&stz_ZE20fShS-o>pD)X|0kt|5(u7g7 zqVg}m(^L=M#deHZ%jks{V-Cmb+^*mZB{uyD`Wq~!16yDt48AT)x>B93ZKWEjm4Rgp+g%Qg9Y?ASTq0&%Qk#nmf@wz)MQgvH^-MuTdKI{u*m$V zHK0Pt$(?Yord#V$2g~uz>ysiy6QI*a*!CEIP46LJErrqw=4UNkthdycV9Tv8V~O*B;Id z7SP{daWb#~Ho`VSmtO!0GgvNq}oHK|$gsvSz ze}e_?&n~bLp}sDQ(3&OP>E6y{Q(H&Nk|H}wRQ~Cv*6LGOYjGpCv|fdG6~H2NT?G0I z7UXt;jY#u#fhDLreN(!-E!CN6DQZzKD!-XuRL?D;R%yKo2P`a@BX$v77xCWzVqPk9 zRF4*ORwZTY`#ahkm2bdDwm2|Ij3g*2Cws@E-oB2dxCt?SAGlQwU-aH(+rl=yFf=0X zit&AG9fw}IcRe=Sdn`}<`O#@p|NEgecieD>$8++9ZM9dPdh)dW4!P4SziGj_cYSN0 zRP9Gj8k#1&4EK2~y$S%v|(-Ud6(4Ap7-C=ZaDf*wqe?rS9jcXz|e!WPt6)ygEp9@ zgnd@E*P{*f$xUmgb!N`2t-kYQ)IWdqvhj=8{BZ5FC*AQu2lapCsC&D5@A>}EpR9lO zhH>}&{*4<4pFO5~`UhUwuXYA^?JM<{!#?NPgsoMvd9;;< z(~hk@?nlq9`QHbwUQ_kb3u}1&Mb=XmPb>_B5GWlaJ5K?!6CLo! zsYykR^Xoe?HQ>F_IqdMmkC6OQ!YqjGYnQwgd(qC=&_4iQbLNKrm$4@;bEjWt{=PJu zGrv~a2j@YQC;P*azkbBDoz&zubSM+LEaK!NjpK~>c2fx*%Y<%#bnv9QYW#Tbo+ETD z6S^GYSwlx^zh0IJ-4Nmfn$B@v^!6xR@gf4+N`ABz> zo)ilm%Y-h8IQbM^zC4x*T^8|#p&RtT7kMlbx&g$Kn(nIc`E)E3x*XzJO$S@gyB;hP zx*@~|G~Gqx`q)f!-B>1cE^LN;EI$W3?dha_EEBpK#L368h2pcbz_;(u{QECylT8p$9;?g$d^5YIZczq zHO}hmOdht8v@93eA;if`+FS@N%Z1jR4;+!E%%KokmJ4kS;^d{wFj|%iZ31!f)&P6I zfBEfYxzHv_2R{J0q^DkVq8rPFHj8)yp7kd}Xjv|_1BfT#y*7lgh0(HHXx&EOMS9SN;lOgCtwEf;3DD+3+Q4$5O(0I*ngX;e7uqE0;Ms;S zxhxmjEaC}GI~39emJ96w;z@YQ45MYa(B=@&k{0;7upxDY{cFr}p&dee06qb^VYDn4 zT6Y0tBF*~4Xjv|_HHdq%L0c2j29^tL0&((EZX$%1IXjrk0Q@qg@uooFv9Y#JYm9@ z$M5ZN`Fo;s=l-RiKKlmV#k@K4IhW%MpNUy6&%}9j&9^30O|mEYvHY}dN1=f2qf>jL z$;&;_5^|2I=9&JU=r50-?9dl>qVqWD9CV5^@-#6hc0^imBUXYNiHM^|Josmg)B7>M zrTe)`*JToYz~svsm!ErgN5@I)MH_kFbxELH$&kMaH%^5su$LU6I|&jWt?Gjpn(&Zz zqGoXU#U>E2Fr-stH`8`HxaT@_tbn@)6ZP6VD9OS z{CJ=>-O2rpK`EoBqw+VDQ)!?{&tPu>uX9Zx-%c7VpufT5G++yCgl_(f(-Sl16N+wp z>YFNlgM}6lnZK-BrS&TOH;sktmzPr8;0zYf-(WEtSXj2<>w*_usqT_rEkxy?T~@84 ztqRi`3(3W8%X9YK$zTEf4Hk2N1+Wo5UzcQCN2;@@)J@7!`4eT;Dy>)H7qMS}edK}s zY;PS+vJ4i`-(Yb%umCnfW0l+VvGVxqQR|`gC0FY=0I}mW z7RMvbbuV#ZA50r8pufRlF0cSLLhtLMUxF@b?=5A}h|1sC($UqPN>=N4qSH&OU1_ne z#)2tgAsB?d7l!@@i+R8T*eEIXb=4;jp|&7B5MmLn`B`@3c*58qdg{L z7tr5eaR#seHX_y61v_cD=c$+vNrV|;RQ`Eo)oL{W(Z6C(4aW;{f`vV=HdsJ^gT;Jc z0c?cN(j|?(i`ZS%n(8TG$cV~654Bd$E45Z>y$YWyfJN}Vus7F&{sxOiU;%7Iny*Vw z23=ROiw>jmHFoa#961^N6O=$TUM>o zdKK1aEIyN;jdx7GGkpa53l=POfsIi4SS)HO?rTKhRAE&9>1EZL--aD6yI_fo7r{N^ ze_$D&ksm^64KHNzobX9{TL}Gc=l#|WkSu;n~b+>h1MHbOPNzqBx8<^e=B`L3zYcjK@I~RXt7DM$8ySg3;x=Qp1 zcOo!btkMPlQYLYwtpwfXxq}?#rD<<>ft5D-7(!*O`LcG&Pi~bdF8Fx;Q?C)SpE84a zs}W}(PNJVC^_qTG_gPu@SqH)cs<20)YR`%#G$1(Xv)OT2M~8Q-{?eat3-?);i|ysn z^}VcZP5SKCu|~Kv^rg;0x5d{8fvMoewh%|JO?_ViZpW-w?OTC$QKb96;iYAbkbRQ- zWawl~Q2H#>cDbUGziKUgH!Ljh9R&8H;CzuiE9PL0@B}SSC?&LQWhZb19l3*fZ%3Ma zmWEB6d>9pkRT|Q~x1%XzD)Wh-JbQhq0!4RX!tcc?V_#%4pW`uo_J{Xf&+=w~!uUQY z)MGVDD=_bQqyIf#OvO1z<_bCU_wZtz8{vFIou7M3tzmmK_p3crUi^7Ko_*p`L+|eI z^U9tp(&rv*U&(Liq%M)~KHMzXCKHR<%(-=duvlmDE zLBF$?D{(agQu*pc92HkzKB@RPa0vZ)D?Y)BPqgAYSn)|#{9RUjM=QRQiSt>+(+hZV zE-rD-MMYoQwB+L+YsHz1>jhpHz1fdbFUhA~5~p4g*Lr!pS}!lI_449cFE6h3^5R-A zFRu0S;#x1nIUQtOye_I%iK}+1eAP}BSM5}B#i8P=ohq){sp6`gDz4h8;;Nl0uG*>M zs+}sX+Q~SYsWADKZ&&UwE!+F0pP$%h!vyIvs}2pFdPJ*`W`2w$9gukSI=j{#-~>2y+Qp93T1I zL97I~#16n1I4Uu_G&pr9=X{a7Gz?#&(mcCk1w8My2WxzS-vTpjmm_IAPT%TOzxU4i za>hgAAyrp8leIjXm~rAp&l?79CFm-gdC2w8`U;khRa$T(R)Sl066T7==5}pxoQLm` z`hLIIPusZ32X%#TlX8)x!ys;$!>n*Fa;|g=J$u-=h23m9R$(S(eM23nag36J8?h4H z*q@1`R|Ve>Ki6m3+kU`tftS7+1gmvB=He>T-J}BZ-LRykTo+5AaD%G;`{C8Fn43MT z5h6RxxoT`GWN+j~@4>&#JNGQCtDWz!C2gL=ryy?Lnk8hsiELgi_w0OG{&zXs_IJa) z&P9DU4E+rj=Kxz^BZ&D}Y}?-r6N{q08;1S{i*td6Wg9*g+xB4ijoLv7knn-yj13>EasfmBHL=BoZGKQXD>8Iy`YkF)VJ4V*IM5VBYq#M z;~aI@2i9`V9dIMRC4T=-`QHtnx>0>Me858ot-WK>kJsF>_W_=q-(6i>yK(n#t(p7& z-M#b`8~^9FX|tPZGs)Mz?}pFa`~A14Q+>6mi|=0N;JKXqPk{#wxSfsoA!I!c{^P*I z^mib4CS;{G|8U(W>n~i^Tt9r~!S&?7wBu82U;EpGYc?Emz*@9n?Jl3avi5;*-L~cv z2k*WXZCJbCk%!!#JRwuN*QZ`zgEp*L_J_9H|I+!z+7JHy$MtAK{i8Skc1_it!)V)c z$6&?!=(P)0t=Z?PudjLRfZ3@3qTBv<;tltFzxIpwtls;qdp_{;jf1be)j$2&4}W3$ zZ%{WBro4VQ{X|H&5}``2-=48E^_$it&leZEogqhssdH(}jldp%zd8Ng(Fc52Uc zzJ|r;O`LJtw4={ou;ygvr8U3lI%VzDH`f`wW}UIq36R?df7{_xzv|f@#}?bkdnY?j z#lzZ=PsK5d??bpoHrC$_bMSa4z8mJe1>ZY36DMAUnEl=G>kawZ+bR9sZ~$AIqL_H_ zyJ6zn3`VYFa$uu)7vJx4jdK9&m^J#_9Ms) zUzU!x5-B=|t!XMwdrec-Kh}Q*H)18YWp}~a9B@>1&4T@Ot@G<;dggkjdEfdaJl8Cr zgs1zd3d|Z4({{No)`5DzI0+L?^?s4RU+_!(yU)nUr&lS~#rrpHCFscQNedQ?aawRA zR)QPtGSBA5xXvizXlwL^a8qlV{+WJJ>Kct#a3fZN8|jIo<5a`W7Q?<)48qqjALkw* zy({vo>zU$vYq2MWpVBrU`AkcBdbdv>Pw(wPnb$Cr{B&(9;9nOzODbqFg&fO9!)=2({XIg7grTm$$VhuI9bLIJDe;*wp#dxfyZNeiRB*XL-l0Ng@Y9 z9Hma)uUH|=dG-YFWxQ|Y@ZFsEPR{x^mG;pKLcU|!amRBimsKjMGDpenfqNFbyBqe% z>@MS~-*o8{ESEl!c#lOlcz)nswRPOPsPh#{RbLszw)njZSP5>#mpG~h9gDHUxyNrD z?p=Mm<@|JhtkAvdqqx2!ow|2T#0aA9U6r_Z-RCT%Eiv}=@tjZ)mu1T)cM~j`?A7fr)UFs9}D{iz{`COIt+a# zIJII=hd$idI#chUQ*$&v6Nu%F_H+^CEOo$7*hfA24|N90{spTDLzt748mSFdmF$M@NH^`UqF_y?3T#S4#{3WM|3 zMcPot_~Cb-;FTvo-+avT!H~L8MH{BBNz7Y)`<(Y2CGCChGe1~OeU^UU#Hnb*)I;`s?U-wk9?pIU zGODNlef{s&?03RJKiGHwuRwnDfu~%4>JJXS^y5b!_56)k=X>fuu-13*p%2bn|M_3s zSogVK+&FmpT|b_B^^r3hmL0fau=l_fbzXDw{*;Et&40e>m`e5h;NelKKFMJU(B%*3u z&##YbY05tHX@e<_SzOcO{a|}p(<40Inx5mY>8bhCmS5A8vjBPi-)mmG@XU_ibiv=KWtq_B5YHMqB~|3H zOz4IXAJBCC^#`_D=vXFnF7P2AC4F*2J{`-1t_E@Pk?xT383slk%Y-h0IQdxq$qD&% zEEBpU;x(G?kn#ETvP|f*h$l21cArxXQ!mSeZUFJ5raNSOJ{`-1E{Awl(@m_(r(>DW z4Iw^Y=vb>?FUy3E`Q&4Gh&ChQ%y}B^?hS-&bPeJNJiE!7>!M_mmgPd5K%Bfu(8;wS zugGP&&?XVDfv3!&5VDcT>`m@KDY@-;2d7 zc$ONTJ0(r(2sv_FO4(xxx$MCY$U=b%%ZTkc&Hu@cSxJxHgI$iLiJKBkw739;Y z=XK_7PC`CksVUmq;b5XoMm;yq>l*-w80FAU*l&i=pIrDF_yOHd4#j;^?63#4yXpa1YxYAaFZglP-b@^%ble@r9n|utRHjg}k zyX2*|&IAW{ww?MkBV<2i2J?>k@r(WJ!|bmKc;468Z&BpPb?8O>B8*wCdq#!pJylru zws!2XfX{vq_qGoe?z1cx+smg5ob|Ys^w}opOPzyG`fQjj1ZktBWllh>1UJefj-Fh8 z%TxD>oYXNqd}G5~m#B0d8h3_n;2*0L#eAKXK3f|o7dbkl$<$2(um3I285J*7)xifS zb<(z#^Fwhf#5q!)+YFn!z~37?lA>@9aeEcTl<_7)s_C}m%ZhqdV^sdJI_r_wu%<8+ zUVrznfc^%HMZgx=2%CRq&bEElBe5vztVif?uxJGqmTmZ0Y};o&O5f%+mab^eC`})M z{sxOAumCnA?PA+L>ycO#b=D*FH&~>A1+W>3MR{j6`gT;3_V6g;P0Gp9mly_F6k7arMV|CV}U_reE z3%#uAscP&3`Wq~k0t;X>5{qs7tj91c^fEy{7SP{d(FQDlO$Zj-^jVK#SWFZp5gNOI z{sxPW0}EgyWR{JWb?RbN{;@jiQLwPb3!bkc&R_xk4HlTgy1+(gd|k>rt1&A7Se^Aq zEIuPj>5%74h%;C~f5C!fF0c_AUzctBtVgj6Pd}|(=vj|=M*e3#>yc{=d=SHbX8>`o zKjgSJ2%qJegI;gg0ne5P>l@GGq_5ZyZ|lhAuQz0Wg0pJi-F>j8zJKBM2A0cnb7EhM zZp2wNvl3nfMXnLiNHZoxG|U?sR^_XEbj zQMG*QI;)1b(GyqNO3+m}KSJ)7JFA9R32wO>tX~_O^UtPX8{g@(YHZxXY*M|0*m7sp z5G%or{h2tbYl*XI2HSJ~b>&$#cdTdnX86_cTywruU;CR7r<3(9rtNaC(Ep>>w~*HB zTlkz{wR2g;%}!T{Es>4m5`AHNBjc9)9)?&6ZfqZMWVp3C8Q%)wwqF(d>D%kvyR5yI zh|6BfkEMP`JIHgd%sQhkF9QkLyD0gx*YeqGrqrJKshieJyhVLKJ@w?{Yk%{`jnl4K z@cy-=U3=UScO7$ds`kiNp7*|=K5zeTuX*d)!8QNB!%^!T+$(+!{$s&22s+ZA4Ov6r zKMp)hPk`L7L6-1$rv6;_^=UsJoHM+#j{F}Pe?x6%V|MM!uOF}$ZCLyGz<<=9c>iU! zs|Vg+i#F6AaLJ8#-P>|P-Ng2xHIT8!-LUuCqi_Aj+9!`Vq8@Fi-)pb+)4uoG!_%BU z<$mlqgFiTY{ZH;*^xx}GYM=5&wD)&YAHQgid#)N+IepS+H>_KSy_Qe!|DNf&Zx64# zA@x}Ow?p)$Iah=nJ-7B_&nf!KaF|YSnsuD8{UcUr!nOX#__RLgtW1`zTc*RH!BGJYWN4Vrr&=GgFw1Mpt& zppo|$UQ_N_VY%FgvIkmpgA4QL)qVHor==kULU|7G=ETk9#XMWW(0TSD_?<)g!cKJl z69Ec1#ku9?*~Ch4Bfi8j(4=iBx#i~B#7b}@K+5L$4VnWRQDOfr&#ZrVerIA{|0C;u zb@BMb-mrD<)8u^cbNWTdWTfe2zR0v+E_*#*KiP3!Kl!CI?l@`E#`kz1fpD@vsKOMCmX?qeoXN5~z_dppwXrwh;q_T}eML5S%)!EdnMj&>B1Nn8t+ zjh2rK;I#Z-OW>Z^S3B{VP17^`UEUDnm7V74?$guB)Pn9*Do8PUIt(|PgE%)M!`o{P zVxi}loWS_Yad?1ZF}(0i(Dwm8zm6Zzoym&Je6O|%>xc9Qi7m!7P_PkvPPn z>zjx^K_~m4rU%lhw9sE^pEm{%)`J&gu!Nyw@IvIBD`d#nV56XJM|F0VleAL)H=N828?iUlv*fyKul1fa$;-Gc zgXOV{5r`3p5r`3p5r`3p5r`3p5r`3p5r`3p5r`3p5r`3p5r`4^=R|<(lJR=sKj*cN zwT=;p5r`3p5r`3p5r`3p5r`3p5r`3p5r`3p5r`3p5r`2e27%(&4};$gjocL}XNdFM z@Yhf|DY6>U8>>Cv9n*pGYlk>21$QMj2riJa+9loC{m?QG7E4pZplUQOCD5i8X$m za)x+?_ajs`C*`PLblLUut0!`QHqVQoyw`OdLx=~PD0D0nI`=&66*sgGdpl!=j%7ku zgSf~XcJt|2CUgnJ$;Y~fUDX1S$11w9P2wxQUL!|IW+$HyE;@%fS!9*Jz%DFfPcL zv=%+pbvHWf*^V>O}Sqd#p}fH5m_$Z zCfIb2v#tRG;pAJGvjb^WTIlaDbb&gfV-|P^>v7Jl4&{3>b2hL$$=QhS4(P+3==?3{ zOPzy`oZRzI6zGDIa`&IT%KhEOetJbw_-{?_;#Ha46QOj18?h4HD2X^KiRVDa&*nt> zWzFX_>~zTSUiw~SZqx<0XdU=%J)L}4CyY|AO3hz>7gBc_4qo%m8Qti7tMXoW*yo+= zujg4hRfgPg1UF`d$t1T;&$PwvEFf+lz5n`b?fuug9r(8D3$Gen5?z>ET!`Oo{0i>( zUquMaj#^(BH}7ms$aoVK@H)Aj$}Zh6^xeujqn;BQm4B?x8GRDE)KDSM9VQVI(uO=N zpufQ)4Qzpp5c%glZQJLJeh&%-&lznIB@r4dpufRlpI0$w4Z~vFK41* z3+QjK*cVs;8zJ-UV%t4ubl|PwVcJFToY7WM5~0BY`Wr0v0~WwW$b2lyJ0~lV?mvWh4c~o(_@1L^fy?17+3(C zkyw;>PN&gi}t7Sv0ySS(5+G+01?gT?;90@w(dugkW3&gi59SS%4GZ7iU_ z!Qud50c?cK!eW~}XY{ZCP-Ca)BzCb>GHfiMzro@_U;%7|%*Uc}arDGLjGyl4|8 zZ7iU_!Qvob0c?cK$70((XY@dg#dV^T4nJ~Uyr-?T(NK<4hWfRr41I)-(YbhumCnf zX6e$=($&QuGA_wQ<)2edrGXYsfL(C?A{WR%(@GmGpufRlDzE@HLT2gG*15R7H`Uo% zq(vwRQTb0Pr&4LW4zGPpVR060!*=$3!(ajZ4HicM3t%HWbEls=qhSFjTj(M^neLXh z&XR7bk@**WJk^@1#u9KDm1`yL(0zpW5!;<^B@7nO-(YbxumCnfMjDNTH&}F}dhEwL zAuAY0gaTqQS>ID_wi#B!U;+IN7RLY!U?XIrOJ};fqouv{Q9LUD>1Ea{?Ps`H zV-cKp;;=;H3>MJeU~w$405(D-y6BrnQ%_e*Ndrby{sro$Roz%(z0!V$r)w-EPwuHR zB?F$^jq{Moq{R|Tt3wu7n{8RWx zJA(!EH&`4GEP#zo!?Ck>S!r{uvEo1TtZGa#A^?Gg`~`Dx+C}i$>{MwaLW2eLH&~ni zEP#!W$#vCzq&3~1?k=TeQTcTrX(+W`X+Ogo3Se=XMP#sm{sxN^fd#M;GSS6;9BC@y z#u}A>ES^U?H5Q_ijGc2N1EIkJ`Wq}x0v5E5vp%(wq@qhlI@z|kEme|Dj0OLkGV5jC z;;L{Tc?pSMN`?*-R@z_z{S6k=fCI1*GQmRGMY1K+A|=IzQTb=4(jBQx_wwpQ$yJ*M z9FimIX`m%x^HCp*^7t2&Rcn5`4$xTm>re^{dmd`A zfc^%Hdf)(TvNr{>NT%8|Els6r9&50G{sxQbz=F0h z5X8cu(A1u8y`b3ps*go^{04>U*(KB}TC4CC%(d7@#0eHBN(MrM1@t#qGyn%+lf5N~ zMR%&bCDVpyXG_B7qdpep@y{=-*8FyTQe)xo!%=o&?^!ZfK!1Zp0$9*C{v(J*$&Vsl zgM2K?U9$%bMp}ki?a9=WpU-V z>l}?m&@SpMGJ^&5H(1OB4!|b6Du{*Y?@d@z=x!-;*zmC^kKc?J)iX+{)lw4CHE$}r zxXffLyQnv5YwU#n28&t1g0}JPAQpPRR#!`AX^}XvDj$pT_~)cKURTd6tyW7(MBl_Z zIQxkAP~jCRET&sz#x9`0!QvF)0Bo|~31VSComoOQ6ZNqukAEzl%?33VejnMzYc)25 z8)vY9{sxOvfd#M;BJr8n7@mfYgQsQmTiRh!qqLEK09KJ{yPxsG$Ll{Q#Fe}lzo zzyjC^nbE~txoGNW>1PU4KyZ<06zqfFK<(v|$mF9clei$!^h50Z+mo`~c1`FtK zu$T=jfQ^um#(pQzQsVPSRDNkkl(5h{fx|7K1`FtKu$TiZfQ^ueEJK%YQYkXg~GZ8<+N*gSozro^kU;%7|Omr!4rsS^$mCZi}bFI%}ydW0# zzCG%9q$r8dU;+IN7IT3Gun{uBVo|y?Rr(tNAB%GNr=#9zZv-6YT^ftvi{PoEq>Tmi zH(1OA7QjZx1dFb8PpYZCZBchicS+OmsQmL#Z}sfb>y`F1{9A$b&Z8_MV;9ihU~vYp z05(Dysi}}C;*a(^E(sn^lx*abD zn%XigJ@$teLRcV-%702HDurpB*4CNoz{61KJH{NRtAJe`W3|~}0sRdYjlcrf2$|?o z-VE9wFUsW~i#a%-%{X?7leOPtB?FYwJ%es4VUiJ*e=O$Ubp^0E zPL#BIGKDFsD_QTfe!XOZ=Vk=0?Y#l36Ifx?5Vw7~-U8!XNS7QjZxL>IIAAO%H+QTfgK zMUnM|k$nyG3u5t=K;gkw+F$|w4HoAB3t%H;qDwMW@~aU~L{xs9Vp8fW8ELu+Kc%r? z2KTzk*m;mWrd`^A8CBR?-{S6iifd#M;GFz9f?$olj)P+)1 zR2Y?iUKw=;8+Hr&2(kEVpx^^m+F$|w4Hh2*7QjZxY+bMeV{va!Nz)4_Du1GkI;HIr zp02U5--od5gF=ANU;+IN7Uu&CU?XIysizZ+JY=kUNm!&PqQa8s(|NB;+r1bYud5sJGM6{=Qa@pFo-2UGexf8og9Y?ASR{c3uo1F6UD!#IQc_$PmA|o! zI)g2{&%%ObGViRh2n`m{-(Zmf7QjZxY+ce_rSC?1#y3>|*h zN*gSozrkWLumCnfX6u4I;mLGqQ?0!5q8xtSM@p?z+AiUJ8VgB_UF zSO6O#v#}`W`7A2`SUj73uK*SYh>|uI(BELO6j%ToA(Lk-?|#b1=aP1=;e0N=E>3TVei@-n0G!S3LzA`_=uHf>;n25EZTqtun{uRrA@6zH(gNTdURC&u~-LxTtBCZ zPJ+dul7Y}*0sRdY9|sn|M#xBGKclv`bfmglq;&IPRQ}D^uz3oucRmd=`@TW0_gbt5 z3+QjKxByrH8zB>2+EXQNX4C?r^3N`_UTHtWeKi)JvNI8XpOrRPK!1ZpJFoyYLMFPD zY7b+@-%z3*O1*Zt8si1+!u}qW<$GF01`FtKu;>65z(&aOv1m%B?Sq(vXp}HAf2u39 zv^u@G`sB7$dvcVDMk#92SlD}8NxqlGW3Yh!28&K$0c?aUs7t9^03!33TA?)D3Ln7O zNxQh%%42l0l{Q#Fe}hFDSO6O#GrCyE95j{CVWRSn#r)z28Vk`$?jw6k210`c^fy>^ z0SjOwWY+iSrwAV8X7SP{d@vp!F*a(}YOUd8eQASk$ zNFUv4CEl;G5S_#>&X5d*1`FtKu;>OBz(&X{UD`UZg-`N}4Wsg(Qck6T#{C1&skDm; zdJRL0=Su{k!2YIC zG<+W6T24)Xa91mBuz>ysiwl7Tun{uRrK}q&ghb^Zi+k!`8jF7urF1A~o-=8%fc^%H zi+}~N5jN4KRC^dJ{@Eqkq10=Km*JjDyST*8M0__ZZLom;28-pu0@w(dVA0dt*>gb| zZz!VjH(s#3djIPBOh>w>YiX+3ldPomDm*~HA882OQ{Q8e87!c`!QvCZ0@w(d(WT6F z$Ef^cvEKQjUI!137xsH2g9Y?ASo}X=0c?U;*f)`;5;}}vQ7->j+(#ZS@J?V4Q4*oS z0{R;)E(R9BM##>dJAZbg zBvJX_&ilv&Q4*oS0{R;)J_Rg*jgT2#O0-s+O@w{CA0*vnr7SP{d zaS5;hHbP~vXz5tghEJ=S(yguSy*>CgP$)(Zqw?3QYOCj#R&8FRKB}?c*lCZKJ6Kc( z3+QjK=mQqOM#zjVsm^6>-RVw#YKCtomMqN__k0$We}-QzKAkAKT4}x)ey9KzlPoHO z1@t#qTna3JjgT2#+B%bM-8dSr6d)iZD*q|E+OmN_8}8Th3$AzCcJVGz5~0BY`Wq}R z0~WwW$c!#a@U?8J#LX8F5|w{udDTkuy>P0=A~^5d(V{X~K!1b9r-22q5i+AoM_XCn z(nRH-Q(m>wd@tNvW5ERNLY`B1@=Dbog9Y?ASY&|(un{t&3y#n)`4A-tiOSztUbWJE zFRTO>Khrrj7V1lGRba4y{sxQ7fd#M;VMZ5w;wXhhgi-m&V%}M0*#(;{cA>uHR!SHw zpufT5Gr$7ah??{2=Px*=VRqhuzt~EKkDc0!I)^wazqBJt_;oz9KLY_X0z$@FX@dpy zH(2}|umCnf=Kr3+;_g(cC$qf0wB_HZ{3n-HtF&H)+`Gp0PCC1f*qgWw7SP{d@mXL2 zY!s*CC|zdPpF3kdpGr#pF{`Njvs;#@x^Y7-Yv9&OdyQaY@((gq9YZ?O0r zumCnf7N$#62^+Vf@_SfFW6BJ>FxMg$;{xj!RhB%11@t#qd>&W;8zBqTrK_cM~) z+^(8R;Gb7~Rnp`UVHRU2v3Md-B4a4C4HnSfVDSZD0c?cLoY~ObwxliDv?!fi-c-tC zT2%h|thRbOs;xe|+{d(=H5PmxvE9e4guw#(3l=PPfsK&On{{sEDGiMrD_W9C$t^yN z%3pjy_i4YX z^lkntda&)HM-Fl7#j4F-LTH2UfO^`~nVzNyZL%?pAZ7%s=)ty&9@%dE)~CKE@~#SM z;FQS7YItkk_Wff-gUZYhJ=k{9Bhm9>KlP$W%dTX4*3`4SCzI+ZeP4N*O)QE{^kCaX z4>$8-KlP#j`~HDzqJA(`%`QqdFLc-8x7)7RcF`k;IQ60)*7Yd!mvtybIqJcfggSdn z0=XV+yXcYaMgKsW70j8@IEy3JGIf++$=AScB|Ngb3cb?|qtS*KseoD#n1^%V`)LAg=~saU69M|p3a?K=Jdnfy)o zhY<35@VDU+7-!GZP3Be_slqRu^BIf3_wM4Kyz|Ju^~e5UY<^#%+nt^D^!2=k{GI#k zP5$q-=Wh0YPZ_5|Bow*)&i&T{X)UZk@Ldg@w}X1nhxp@U;3{vUBvdS$H+=!L@&b@ofD>xHcuxn~?>UPfg@|zkekGO6< z)4zh>qzjIehU&Bg&yHSRi{ilV+;4KGR{RQHB#aFIjI5<7zb*tfa^p$evm0`5@(>;= zBWjM|Myv$4#J67Q_igT98yx2{4=2{OZufs}`0^vGN8q-kfS%Nmu0XlM4HJe6%o?z# z#2pV!msZd#zOcWe$yA)5hb<{dBPENQXY$(Z1PF+hA*9_NF*p(@zUa3YTAOuHZ(j1UK>$ zMZibMa1Ss29bhsD&%H-Wb)ONOWN#MJcDa%%f7STL@wd{cssbFax528m z%E79$wLGDeP;g^f>Xb5uk*meef3urF-xm$uW+2%38PkYWu3u>*6eG zc$hMG$4h6@Z_qNQPfg&o;jVOdruxw8bSb+}Mz2vyr!2+qM@;EXFTwA4OzG)voq_|E zQ{A0YI`BPP2J7upmf#~AlR8up9)0MNw#?GrMN{w#AU#uXgilLvdxnWrd(RY+9EULi zF#`V#2(&J3>27JouyNR;sYxgK&!BRwV~jwIz!)OH`HwBG4~ZS{WbQwy`lXyFH6!`* zU04&s#EWyUE{ znwjVS6VD7QW$ugT{*Qg(R`>ib+$!_r9Li;$Y|}Y?e0Hakb%4tQX;oV2ue8rw2N=8- zyo2?Qgd?6WcEmcsfq0UqFYNMU2FS?Crwf@Z2PGx$JbP8P>i+BL1FR#GL-#zI9qlLkdQYx;$A-dKC>#FR;^{QSS7lRRHA&F2fX-IUK0c)q*% zE3+6r^x%Wox>sF~1YIRa-HE^~t!F#vZ`vM^EZ!cBHqd1LbA_(8|xzQiB)*sy4CNqxrOMj=(l2fEEn6e=`ez5Ta!L} zb|5`EsC@3DQ{TVO0x$ZkBVlmuj(v6`?210ziO$zSU+Nrmlyz_W%pFSk-e+b+j zeyN|{&JT+xuR4F_f-j%HGOUca@#4@X9|nP3C!02;d3Nzu6?dOqe?5J2-Luy_ICH%b zrz>`4if`gkudMgh&$&mKGWG=^#N=G<-I)*f6SG4&FeAPX3R$Kc*XG~o=eJz6c*ePR zPU3rbG4LUu^vusawMkz;(BJ=%AAjDDXPZ4zhOB(69Vz0yp@{kDzs z=6I@Y<1pisc8+uWwvBWAwvBWAwvBWAwvn2=yzbne&lIs${Y_mjn3>84jcTRjW27Oy zm#=hDaYd!#N*5JZx~RC)Ma31)Dz0=7wFF7sh4pG~2(k*J9}9#g#p% zxUvToSN5Rd${ti)*@KGfc6xGjJH5DWrx(}l^y0dmUR<}+i|ckG4mcH_Px$fN9ZSDpY`Z}<>$MFugdGL^9re4Oq@u;sBzCRK-VkNj`{~H(sM6T`WN@B6XMLz1v#h99Ky%BqKx0yclf`n~#xm2kV{S3TIbXl<%(o5#|-| zzyEsor@-z@*r)o-SNm7veZc^1%coMYEHKMleg4X!D?YI*`OR5*^9$PBt01F{HxbfW z-7EZko|JIbDKpNV>V2%5NppLO`sHOV$+L9xE-L?A@0Xsd7qIfp*A`CkZtRC%fufC6 z&~o;C*7?H?Zm@v<28%BP3t+=?x^P{3 zGTrG5is~g%`ElNDku|CIhW-7PwhJi}EciSn&R_xk4HjPk7QjYm!gXow?Os+C6a}y> zp1+~!nxw@e!z&74!Dj|>1`FtKu=pyl05(DsjzvpXR|@YnI$JjjNL2p%qHB^Cj|`U; zz~a3YslfvJ8!WB{7QjZxg1X?>wy;OLtEH{TU(JllKNja8UxV)_I9_~3l+vMEr%?%m z1@t#qTmvkCjj#oE@$MtsvYzQJ>cEny{N?R%l-8^8V|whATp2HRl?;Ri3+QjK_!_VP zHbUm>(&McHl=7_=Wkls43%l5(02W+V5NEJ}{sxP$0}EgyG$VBBS>Dl+$`t(riBb6* zORG+rofrN?_Yuhyy9hla1^OE-{vB8V8{zYHQS;7@RL{~>vaRSs2P}Y%umyFwFvSBY%D<14%73<3Ulhx5obzE9E2vPwE<(>ihW-YN>wyKZDFTb4 zOk)%*i{g)95~6}L8Q(CkK7kx6@+BjHvwey1sHP zgMH)%+($TGaE;$~YHe8Mm_7pi4Hn-37QjY$M$@I33mcW+U{R)l5R051FKR?79fqEf z0{smZHvkJ@BWyuk_`Ac!uU^>m3w0kVmEZflVLq&uxq3k?uGDr>ALt_!MM;FlE}*}` z;znQrY=o>37RA^EWkluouqe|eSpR5t5qhQ)^fy>M3M_yP<gT>>(g0}HiI2LNX(-N|oXb_81`Dc_c#|>)=vG^*+ixmjv zJ-LIo`*iBB7xl*r=x?xi0yqGh?4$=n?P4jubWa!kG%~V}mC8S>#QKzG{$FD8|1=ho z>*_c5_IrC{7tr5eu>n{B8{rFHSJOwD_+%nfg~O=)W6?)4=p&q8WCG2Uaf8_g3+QjK z_yw>4Ho_Lvg$Ss5v`~y5M&*w>2d7<}r=QKFrGkNaf39*37SP{du@P7R8{rG;V$VC9 zjFAZS$S^AZSlC6swu{+;=GiZu3>MJeVDTid05-xlLYHLH>m5x+PQs(|*C&(Jd{!;; zcp7Q8327I9kntig*Ro&b87!c`!2<8#Two)@d|g^P@#6yR?NU%=7?r;swbqwhtKT?c z(XX-irl0M_Y-kJ?&|k11kqc~u&DTZEp*=+SQ+PtKnJ_9pv1lowzF>2R#hH43@zr3V zl_nOmkmkGCe;_1Iu6`#QVcP4}AhIb>WG_IRb(KAV^dze>pY5hRktSc&Z(r(HV z*{qgzHFT%&jk<0`83AQ`-%#USzr6R)eINTa&7O&U@SgwmdqngXzPwMvdp~&IdZz97 z{u?!cyyutqf0CARk)y-V_x?{hE3A1}fCEX&9Dx6Sb|=zgzseu?bQ zu%8g#eG20Zyj^a`b9m>!`kKP~CA|0k;J5oM`Q3~AZe{5Ax%L*EZYF}PGCyn2s#utQ61CG2!ka9}-0XRMraP0C;?0^w%7aOA8hz)UX4)>2J;w1Kt zT$2;VFFl`Z*!!pFdTFlHJf{nG(KpK<=(O0-LxFOglt9@K9#Z`8qMyTVkB0+0K7<^* zfKd@5l*H_PbBRhF&OaL+;nkU->e;%`b7{ z=GhQrhz+^V;$qwbZ${W2=&zyk0qAeAcox_K8>NZepO$pt zx0~C_pAVGBKNDjuw%X1sr*6@q1y~FraV9+PiQ;SnGj;*}4Hmxw7QiO^``|P7vbNNP zQMXK?`v8(>1!XaRv+MZ?O0^u%K=Hu>cm> z>d;fxIIFQJksqIdW6MM-H5&CykZJ~VDTGZLECt#02ay8eq3+_7A5j0N~_LjYex>p zyB+qC*G;CvB6Qsv`Wq~M3mkw=c2fZ?I?|lY^YOYBzmL1bh%XQsfklb@bG+)RaXTrh zy3kf+@q1jvf{tUSj2EHrcA&q(;(1^JY&=H%8L0~%cuTmpQTe@h!4Zw)a*f4afqQD` zyB+9nuowasz$W|mpj|A&mEoawoyjIV>J|G-em)lE@lQ9kR(n6$R?aJ)_5yYhx()^X z4Ho|cENC0A2C+b|=qRPlf&li{AkUU?XI{E~!lG(xw({OD%S(!4naczwv@pdkS?{BZ3ALF+xep{qWoo zcA?5b_vu1^gT?QG1+WoGzAoz2N69ZXjLh%t^Q)eT&RNE(hN_j{(Q|Ml| zzro@Uz=F21Eci@oY}}Ht`KXUYdHkl2Y`&_36nq}xeZ+qr*?$DB!2g1 z2_u+~MS1-E&AJk*v#zus?bmj3vB^?c1osGd-&$d|DpY1^jv8K<&6EzBeuN%omXEt6d5HX7D)9;8fB-4OtoRKLsA9AA;PyAnS6? z|IzQ&%14kp8{@@%8%E2k*ab z`iwoMGrixPcQ?vcG~~UyKK!%Z$3TkkB?2Oz2nvsy=zRF$IkuDNejPo%Uamh zT3lOP(-mG_ms%C_jER@sqif+|d*Uh(>8s5REt~e&EBB~ zA(LG0uCL{dSInC_bt>u(I@*}+s_P$maP~A=$3&O*)}ZBkbww#W659OH;;KHLe9C&O zoQZp0h1ib3vaeR1ukwjR;Tm?udlLNOIfX=UmHNw6;BeA)*X}iq_w+hBMD!36V!OguB z@1AU%8{<01Lfq)M@hoGGLT{fF+=!Ln#@dLZs#VV5osc;5%xmsG^UTlHzIDuuyYD#Y zGl4NMyp6MUKb;q18{r(A&mGO)X1n<{1=E|CUL1vo+d=A{!LzV=m3STj?vUw{Q6;VZ~Mr-tFqrT@gsk~Y4*pm*Ay-4J1?Qyb)UEQ z(W(AHetI*F{&#(7ggWz>y!^dK3E4i?Mt@)Uwd3}3=nFf_+zb2Tj|kZ#uQ=5%XG$1d zQsFu_S0cC(E7_-;y9@imfuqM;Ex&Dx-&UmyroGIZq7@1O^r;3Q`fF>RMCD*3B$;~5QNZ{s2H_m%(UZqV|CQbNIvX{l4n7?OLmv|Sb@ zPTcAsfP0#MflzufzmcKM5l`LK9JjJ##P@A>-4*yXSbnQRnY-h|LDFx~G88FWJ~MPg^5(p1(|f$LZ_`Wl}Ytv4n6#^qYgXv&}3@a zkw+hX+>wVLF?Hb*9F@|uutO6xF}V=uT=y(YrWUvKwr7|~wf8I>qb9~;VgzCYwqgW& zS~^-=x>ARA@pzohF+o1oX<>#|(t$u^zy+_w{|F8MxpMIbFL2@lymI`y0-&tnn>pD%WF zah4Z!@VsIS`D^Puq8Qx#6=XA6rZme9Jb>TJJqTxa!duy)(In1rSpB_`XE=~pa3fZN z8}o@HL+8006;5^k?uEl^pHS(+a}wXe2ZDE~<20N_`WY#$54V%&i(3Nao=o#c;YJD2YV19m-SnXuj)OG`2}8dzzhnGl z;Gb`4`E^hxug%3F*GF;sS73BW`EpB132wwnY}Q?mZ>52wl5;-J>3wUxFZ29{;YccX97>9s58PTfx>tx601{i$Av z@Yb$2?Fv~~yOJ=ppWZj_NQXY$(Z1PFx!xCMZ;I1jyDBUxTz;{+f*Y|C+{jBDm5gT_ zoWYZGzC7SIIMYiHV@|Ov)>^nW^?8kt;3W4JrdfVC^c?BJ)~@awcSO~F<31Ehuf_!# zGs9$(+pZ^=w#%Z#iCY~6@O~m|R|8+=+zE3ajB&(ML*lqQj=px~cxzX~!<6Z*U4dTK zuBPL_-x(KmrMokDDok}(pWN1-iqh^N@06wKj?|Q%Oz#xEXf-8oO==3)q^9UKDJHNc zHN`pl&?Rk|rM-*7OM_L!=@@|+f$bQ9)}{D;^j7@d!(of2Ch;Xeay!;FRxL&#Mqq3a zz`E5gT)UzZ$$f~(+Lh!jY+h4aF_M32ASKBW~wFFz5HbN61HO_W_*2 zg}FbmBcAUWql)DkC4S~#qwM{bZ4d5{P*ugYZ9^`&5i7Cn+yhvL29AnuWrO3a^lVwB z_eEOS_D#rGt%Vh^UFVylmn++bVfgDNtDVc8o8ZG8&#W8Gw#f}E!$0LzI$TziT)~Z4 z32yE~cz(5QE=mP&6K|n0L9J|V!7~kkmEcBIi6i!Z!OrT?PgOYX^H0ub+$+(UV^~ znTCaMBe(5>X}c^+oc6W={ebKAG_M6aG zyWs!Q_dc@dBlr4wD#mluQ{AUyL1jUADith^o|b-{c-Xhk>?1N3LVn*M#y`6FKB90? ze+4&UW%q01=uybKHpgu^{>{(Txo7EjZ%Es63dK3*(`8kV_jl69{Z4cob&j$=EZKWU ziJm#?%x1Lv$Oz6+CFM1zqy%xh3Uf3UefihmWWV;_1#_MR?1(3pii>h~U(#?D#TOIB z2nYi6Bw~fqw{t)D`?mX-H6}Wri^oI@FNq3n#L6BMiK9nj#>DvwKkvDbCF2^RKR1T$ zKiGDj8~Hw&FaGf`F{doC1iesPSZzNIP>j+uL0OCOwp<|iQ zMp4D`H z6Y}M;Oz4IXAJBA(artyC6FL{RKt9%(7?-av%Y=@0Lq3nLB3~ZMgpTFpQ*^#Oevgzu z{u>AhR#MaO8q4+bcyLWf%W|R3B2He?y1ETEEz5;=0P!R|W!8kyvRr6$h-cv`GmMty zLOX=`fTm4^$Yr_E)-fy{vrxhxmjA;bsZsaqH=%Z1j(ctqZ00l6#}+8V^k zn*;4oNE=u#vN+4;7$gxzMtGl!y?`B)eY0k*x(~4p z1GsiM_!`7f9)!M|)Do!VqH&&^55=PNZu+ztm5ZBq8y24!eyg4rfb8O=y}eFFdy zqpQ(R*l)7v8%g#Rc#d^s`Y@(YVuz1_*mW1;uBnife&W7@-%5nfZNPkcW8r?na=G65 zbXNzS3BMCavn7SyM^$rFKk556c+pQJ9PuuZ{bXUqWY34o6rFE}TB9M~B|~ zmPw%T-?uERxV_>u_yDC&3T{kFoi-)8?eu7I_eI#$-~Hca9gQ|vM%-RSCS|;dkd?YG z<;$9W=7I%tPj76Rx1gyt-I+;UlnF{1Jsp+5p`1zsO?n3J@_7ww0{M2*U;+IN7XJ%u zfsN43pK*F(#(YB2o#F;a$uBmH%wJZm`K|jmjm1g%*?E1`U;+IN7JmX3mTmaDw6`qB z_r?Knn@vXLpIuh1`OQjeEF>4VEzj9^CxZp_H(2}`SO6R0^L0tKb)-6b+R~jR;SrTT zQC6+edKG>VzX8lX@<4vJ`Nn|R1`FtKu-F7FfQ_*Ey0mm=+FIJ%T6#+QN#3aZ^{DmG z`jV@a=6m7s8jItRvVR*|?1MxG3+QjK_zSQAHl7gt@pb7)XJ8afi`sij88o8uH@0+i zwWpHRbG+KCr_4n;&gXMOJ{2-uU&mC%Hy9`R;|){75?=fYP^tK z!NQ(b8!Vu|!Qy3L0c?cN(k0!KY3k}ux2AeZ7&4;r&qJ-%^GdB%TCc*V3SeP>=4!Bj z{sxQx0~WwWr1`q^WYBdbyXY_~e`8s-<~Q#i3k!R^u-~^DETF%^0&`dw*oZV=mvnEY ztGC2ir#<$T$3M5MTBY?WtkGC}CO;d`RlYM=K!3r4r7o}$Dj$nQEfB`KOmv ztF&H)J6d+Z92qa(Wswn!Kd=nX$PXb5dk7Lfi*2iq=Kt=gYVPn(j?EUU{^KFAdOx7E6SpT3;Jc(~MpDMiGz;bzR z&i>M-YtLU_=*uNk-Lg+dS`r>g`@D6zX7b)w??@QB-cW;YiRlZwJedJ9#kmF7<$#so zMtq5**CcPf;c0JuK{fF-;Hc7^Uq7SUEzkb<>$I#lNLtEuu>@+pp~_xwc*eQC;sJOe z85ur}EaDorPD5_?NQm65b6>?c4Zm5!5CSvSf&WdEhc$Qh+?l5|@DUp`0nBbPZK;wT zrJShzmr~gXub2o4-$J`RJDG` zyY6f_7L)H;@O)n{HgXKobYeqH`{l9*uJ&w#3^p`a%li=5tgy$?9S@1OR~$QTAnc-m zjyB7_SICCQ4U)Ir5x1jI3&*t~gkhBm1|u6YY^J9&-g1nk5XyNOagM(^uIs|rzz^v0 zb_Vd|`tGA3yxPV0AUm8`nX6Q_%XsU46YpE-pTSu0tUZpZmdG_{xm@!+y1Gh?k#sV? z?h;6=(n5bv&2o>j+8*hn~;Kqg!N3TJB zw_$vR>wC%zKmBTjhudziOxE~$r3L>8ZvSO3{AlX%eUK+suB@aF7b&>CsBI-kRhTnK z87)nF^Y%f)CVvf4A(s%}HI43$)5Wq6k}_QQFj=EZic4bzMj{~NFvngQhq*_Iuc}q{Eym7dXycmZi3>}Aut0p`2;ckYdbJ#enIJew5OsoVq_cy>8II5QK(%{sc zob$EV1?T9f^p(h50na(f!5W_{5T}#-HPd#vSLpvy^IoL&dp2i0Bpy=Y?=Zsufi&4;>4?vv*UE)@X&(~0!Q^-U3eY4;{Ct`{mET8 zMKQUR`rZs2PP*>ey`~Z0W-xmD{{e{L%XxPKb88o#`$ReC7WoYzl6iJjRiYv|&rbXv z>m2a8A>5OHH}c*h_aTlc5=N|B?d+ul7 zS$k&9cV^a}nYCy3%sTR(je9%Z;4nD#ua5d7Xsr*w;Xv({-WSvTZtZ_+zw4z#?xgjKbr)8Ct_pb15iatmB^r6y4$la( zN1X7biAFl+%ReuLIN{3>T^sO)&s8B#__9Q&4IiUQzK9dPZlW^*AN^iV3S|~P#0g)H z=xo3jK39b};p-u~JK$R$e9sg-#0g&t@-}=|r%*!SL!9u{;+X_|p4aYIMEDRVd}*SQ z4h$WG^Z5`bd>Nu^13t1|?GGP|?hB3^j2M5hDZR8UW}}W729Kk5PtNy3)X>3m9+5K*d zczH+5=X<%IX*!w(QRV*_JN@t8BvX+avVa`@thPRt<}B%5o*bWPdaQx0J2xh0n&{nw z+GKCfG^Nouf_}1rX!M&D^^Fwut6I7;p?-qrfL$1e9d;>cO7t#0`1J|Ekwo*grG~s!C z@B9x;j2clpc1ovq!j=_*@nsXGK%4wI`P^FbAr8yG?UQ#{qn&%y4qkd??SeJ_2>COP`$!M?zTlX6-%d@tpD`Ob&9 z+Z?MUQa49DnoPrM=$Y&HsxI%l{jZ@*a|}~or2txO^xH}}4ypP3XgH?2_tM@VE0J6F zzGpj4oAdWm?z&HNCAoQgZ_CZ`{nNAwM|`B*@O|_m&9H!i+>rO6hyey)S1E?RkCt|+ zXK6nrU8Ok-IUu)ZC>ZJYksnbMulbDATdXCB>J#3Qty60)X!icTkO2<=ANQ0{&jC#g;OiTpP7j=a9Nzn<^yHZ+R*Pn46s z=ZKGNLnqSSgcBWj|4VBf7^jgp#_6!@@>8nK)o{FhpL&kk(DS`)Lxdr1D2yd-;DWZ+ zl}nZ_x3i8#_cs0X)vb#!Y^`ajEO##A6G0o20@FK9fiwMyWGS)$6XYw*QkNBrSHG`y z^}@`u3)|=bti+b~dz*fipKndN+DPfagX;;UI9al?eIR@Q9p!&_!~rjf3MG71G>DMBl-$bb_JKK zKVkhCX!*6I+bTPe8)PMN!#ft_$XQ*|?0Gf!($yG!UrvEKh?y>WZ{NRv?OI8>Oo$kM z7xCaKE;kye@>&PoR@sT%AS;m@vVa^ps}7PI9Qie)wt6*78@z_AwscQgaPKzIg=h{C)K4*+t-_aMyKvNSjA#zku?n5Q8@ zD}h1x-$g#o5)2=HOzP3#$(i-XhiMNhUD+SeJnyH{2auYb^cTcSf5|;)^X+VA&R~w# zaalU=KEQE#Z=!O+`D-AHke1ft#4q@^jyc*fsiXai(}n-rb^dvTFp(OP!w7vKoyZNc z61k`uY0riF5ALGGMO3_vq_gLBu#^$fM*v(GgF2EpLwI>$UMTij2=g(HqDO z*DvToTM0YvRoI6U?#*G&-rbAbAS;nu`X{89UHpLRv zHpBNcFY(4$Z7N^xUkz@<^OAe>*@C-ZUP6yNn3wo_>F*=0a9bolkKHNaca7g&9#jpX zInq}vSjKP2O5}$33dqsJe5B)D>2KVc4fG!0i`?Evg~RVRW4(VOQb z{qyWUMc4GD4Gp?sWFhbj7Ez49H;tZ!JaPZ~5zR%iG$+B_1alMtSVDk0FUbrD&r7mD zr#T5->7UWN->(Y$fb6Imu#I+X=z>}e&oC) zL+9#nxt-KGYF@%A58k{4vJ$!FeolIgIY1=Or)FJ0)F$S&ol>>d#9k{XR-4V}p(HYMYm!-AEfs|B}WxYE!;E`q;cgo>B3> zM=wy3PgPR0pW07th_3w5cz31^QTkGC=+!bWLA#MQl>Kj-+ftiiY4)w}CGv!ew;{Zo zMvV-Ty7#`kFF;lzH@sIsj*MRXdkN+rGVg#d?*|f&dx@v_a^j%N{k?=bO{VC)gaG_J zTyo>o2X9^iS&7_GHpmfvzLWWg`1!F>ch?4wJ^sAp+J4{ia8>3G_Phk|urJ?vNxzr% zyhP6J;H=KG)LhWivLAY~6X$rO^_(-Cc8x4+YsZP53##;cNU8H_zH4 z{%q&C4`_dpvrO2#Q_Nw^!uKlRJx4yuUrTg2jqo8(_|ilp9rK3H?O1#nqLB`K1?P4w zzAVvc!^fzSFXANMZlW^*AMGl{%YivRgE-;K5uFYAItJ(SAx`*ui0%&f_72SFL!9uX zAaBE$Up~YMUoFu{#~j@l(oFdfCwyt5kq&%&$y%AshdANO5M3Ma?dzY|i;X`_)gTJr8%H>G9&r!IXW#|cbYN^g?Q*X{2yoeXx z)KYG<;LS$xB3^iFiAGvrc1Q3cUU<_)BP}qaco8qW8KP_H0$(ly7xBWIB|1%4hWL6S zco8qW-Qc4uMSQ71CXgN4Fyw%E;mr}9#pU2dyzurA-Az}HcxxkY5ih){WyDAKC~Fii z;)S=CXrx71(-F9c7v40{NDIs;Uc?J;27Gj(44DXA#0zhh=rmoZTNE$ig}0mN3|-yC zn~lIlyzu6T&Vt{;i+JJfA-Ws9gc*g4c;QXaSc|k-!tIVI1LB3ZmT06!-J*CAFT81@ zkv2`3QM`y3-VD*T;3wYNh%z8vc>VSVUMfQmUATusn_NUb^acifj6Ln3$)RqwbfxL) zw$fk?dn%2#80qobNz46IdVV5J=Q(hteogPZzfoNTOgQ9;?;VJj_q=?*zIo2*3qhT^ z7W!ZIVncT94$Ql<$PKa*xgkHuk@J<`m^!A3@Bf}=zq`pkXLL3PI)6J!;sdt8r=ZyTm5%iND>L=(o zJ=8Zc)c>+{WrBY458A$fy2D*S8aS1@y5G{!nT6C)N>5kzx3n(vs60bXga7ip5iid> zpKo0=bIUsO4@38g6-9kAXt4gebH@Xeme!rcFIacRZzo+%b|!E|JE`-TRA1CN>^P;) zio)^Lx)-@YRw6fGLymqPsAI!9Imz$Ewf8i?u$J#XL^8QLkjt!~4j&EfG5?0UBoxn~ z=6^j=p)(6t_d9dIhv+gqd4$Lffs&`qfYkPVF*@Z@n|f_wTPl`D;vhGF{gg2FQ6Q?B z>X(nz+uuIwZTf2cb`qXptyDb1H?pAm8(H)x*^+F8U2V|6ynj0hvIrSM3N$*`)X0MB zZ)7omWMQ=pmBq{Zx09rAqvoQrNY@!>WI^>evPh9ENH)TxvUqv_b`oR}>$j7r{zeu9 zNfsoVLRq}Le>(}Xm`Ihf_w-8pKwV9{p!yqG3?f;OYzk%Z^8W24=_CGnQBXPT))Z%C zLG?GX7)-Jt*$9vJk(c*xCy6XjFKG|>z6eSCs{SjwmLG?GXcn!&dWFtIQAF1e9jCz~CTECqnvarVs z+eW*Q1=Zikg5F_MB%4B6RQB6PDvQd}SL?TvAd8Pnr2-$nSs~8Ig6c1_KwOGsBRpD{ zm-lZcNxSgt7gR3tx07g&yo2INbOlbv+=7Tc98k`0Ct-~N6-V9Yta-K*>knyKXXvIY zM{5nW&&#%2;qzkdJf|JCqsdF-U~H@JRJed`a}oiM_tM&shum;&3EGO5i>ZFz>ru)({e|4rV~08bdj$GC*c-QFO~gJ(k?vJ$zWjF6+0wJ-TH zzPaS~um0$#2i9eGs11404^npA^sh!c$a5dt++7gX(ywES=iy@azrVU^6R7l44^KJu zyE``D`IWQ%G}At~tp1vJOq+82Nq22V{Q5cX-1PP1TI>Jc~Z{QD%K z#mCrUJ30SshcS(BYQ-Ji$$T5~^xpPLwjs~wf}SHi<#GqshCJS_i zevNl*eB+anL6^bZM9=w%BV@;pe*ez?lFpORmF^*({C|bIMc%U!FM24S?<;{Eb_S|M)-h?M#JEE&hXP-{4OXpM(hy!k5ww+V&qqICSefyf;R56wbEVX!L*o+3$kBCY#5tloWed&j9ZytEufpmsBEwvAm5ai z4dC^F0Ryh?_uJsfi#|&KndVw_<^D)>)hFEJ6yl}7OCiri2Z$k8uT!EasML*vyc_ajdBAD|y?MF2TjC$sk-*zwFI|9PCs|E-Iw z``t^(-w~FOFKy*Ak{Q;H!VakqhJ)PDMA0T6q6}r+vGb02tafytq~{#_=$FbZnA9CI z8A^$P5&o@<+=~0mZ(V>sjuPoO+xLI#LdGWncC?_F6M&$`J^2V)v!_&jx9 zS>rt9kbQ+~oZa-!MpyPPG_F1A9@7vneKU`*p?~nsAn#iBq5I-b66J&Q-@Ud@p|tew zC4S_)*FIX`#N~EU=cqMKPI>U&y&x-*8%hj0`Xztt9+uPAH>97r?v3doCuY*q-*!^- zqnTgP*jCz!+_DjabA-(R+IzT6qh5e`m1N198HaA-Xo;yLM1MAL4{BOLRKmn=>Gv4{^eW{E!a*oZw{& z`TFNlC|u491{ln>5-*Yc2--nER+^B}~-u2ssz{`JocI@-Sw8ttUcu+ae)^+r44kx{VN*B$?*5c1QNdk4AUoCn%uZ_j!7eS-u989^tZ-(b8zU&+vwwffdM z!8rOC^p!y}`dYuc)bU*Bx*zTA%sxf)n%(Yxf_Qn}xm^}t!zrPDF*kHyTvAd#o|DX> zw3w3we&n2F4%rsM<#u_PAvR8F_Y>}+A+}!MNO$r^P@q;&w}T-Ex4C{BKHz6IDwCEH=%PLk9rRe_z7JhPV4r!L_@Alo!>BDaJ!i)E2o`4$23OI*vJ1I z*@VY4oJ*I>8Cg*MjVul$*^+D|jj7AB6^k!uUD&o7zd6yqtTpO4fh3LX_c}eYwE-)j z+h1f^3=R$Y_K0j`LG?GXXnd~IZX2d97c5>;fheqYRayG!l&q$u+$WGPu#GRUEY{}- z=h>??vY`4KSx|pVk!&QHk;Mm=wSKVtW}&jEFnzCnFd?YKxq&RskV*xXfY)m6dBg^ZSDFBK(^yc9(%H{C8T?Goo{VqWZd{ zDL`#{?&#D#cYWcq`pKDfTLyi3a6=GY)VnC?ki~RJQGih7qjV2l?b10H^{-Y=p^QVf zzT8fvHbd`1zo$6J6z@bf8^6vs&=0fiG2xkj0sQ&bwb3)9zV+-)uBObwWjMkd?>{$lB&=$hPG9Ig=aY*099C zzm{ZjBVDjf@)fEFoXAPe)ZpHZXD<2AavPG8GkacY5Fvhbz>Nbx72pY{_#!vlOP&%3 zAF1v814Tn_4Frxo&Hqilv~TQpMw^2?gC^sp-mu~u#mmvp!x>9p4kzOP;QwWSc~)EN z%9_)wa3I7{fK!&PTG4vSie;;pv@Sj+-Fo5s+E=xm;^0k!6A2^|NF)%Jz>=klS1(@D z-n#naHu|O8#3d3)B#=m;JPFWIJbD9C*FoeV-Vl1N>gSEIe@KPG@t(AZeBXAA&p|ij zaE2e}^l@H4O;;*7vp<*K2*q{;<|zI8)ddz))P`&7SM)mxxc)_Ff%jSSEr#~<^v?lO zyu2r;pRxGze=FfM&pV6e2ypRiTTBYxTKUZWnUof1_5(li%zho6*T)s@>^euC#^;pw znSB>hG=AJrnO{IwBDd_bBx91JkAXA$4d?pv3C6^4C-D6>6wt+i-uys5pAPP2ej)b~ zA4H26ab~~Ed*^^_=n|HEA9CAE*Jmj>YCen9{96h6>7wpZ&2)Zvs-BsR;&FvRZvL5l z!q`Vlm|vvQ`B>+kK6T!yX&l;bU$tuag$q}`=e?~<+E=W~w7O99!+V?lEI+@RImkR8 zIsV1UrtZ2P(X)BqplK4`7Z`04B{CXz| zvemPXWs!EYP1M22g6c1_K)BsDTyZx3YmeFA~s6M5Hpd~c5}9}E~|ED4V-5-&J`A33&MJH@q>=WtubN;` zJi+nf8|iL5VQfJnWb_J5Kn{eP?`s-~O)p8K2+LNM!()_r&0u zdb$vQLy*&dtv~d=RG*ITowTgq{qO(Ru|KH&=N%32|JPTyuK0l0{ENXgZ+m{oom+n~ zxT_)Hx4iP@@x>d4-7E5_q(0tbN8fAL$12P#jFdKESF5Zrv{7m|e97|%+RZK!H(y5C;zuqXr5Q?-&VnJjWIm+zz%EtlQM~)U!LCF zaekPIAm0JrkRze#hBlG->R}()^J4tAiv2QGL1Fp_mJxSsKV$M2Z#Zg-*p-DX*=PN7 zF(~ZJ3j8^<&s~;jUDYeovRMloxTzI1=U+)S`sm8F{jzf}tpn6vqIxLbuB?=#(8s#~ z?7#x=Ir1T%TB5_8!iPBFOB0QB%zK;PXoU}P!j~bsHsI?RoX>|i;mZ=8HhhdKc!(3e zZlW^*pXYr(g)$2t;)E|pbT;7Y7@W_CIN|Fdy4^+(QvhdAL&LDm7E=e79-6h6cW zUoFu{2ZlKV^7BQU@TG}HIv>c(&lhpRmm#_~;F~ibpAT`u2OOk>-!WLrcO>0sDO~KQ zb_YDQRK~Qa57!yIh!@@*(MSv4Yy>ajg|~<3Zn}Wk9l?uu;Z3a~S<*c)qj(W7ytPF8 z*uK28I zc;U?ujkGE7(&Y=xmYKzyB^qhFi4XM)^CDhwyNS-wl_TCLIUrtmb3|ux5pQh-F5-n3 zc_J-v!@P?q4&x>UJ&Ylli+KF>aZwJsy6K`Q-*u3U+3RSO!w5Eb@TG&pwt{nHlNDF` z1)58}sAI9DN4xTE-cr2GAM*Lawt{!1Ic>c4RFn^n*FKRJwt~fnK4zV)wt_Dme6)wl z?WE4%p*n{hr?l5o!yMJQ7r8-JA~zsI&YXkD=@@z!fcrb-Ms=@gd?{@Oqn)s}^9yDE z9c){{Xp_CQ73}wopr7odeu93JqQ22XSBCmvCe%+**;RBMcG#t)iO{?BJvQ}`Cp&TF z_7g_G!u1?^-iVjyoyYgsHF&<{WIvcZ|ChF(phQvM9S(LsfviMsC==vJW_-7L-bb5p z?|Czt+U|MX)_+d>h`HzR{QokZ$l4(8vF^jRW-*q~zOoO0b_RTY|E_7I8@T?|^ixA< zY&n`JE&r>N{6?QIh!MVtIN`P^Fbu@1|>?UQ$yWTNb-&m!{CPZ8jU zT};2BM)&Bi(1W?4-x8be@EqPx)FgWQ9Wvz7!9PI*A}4dt^kCZKg{wcU!47iwS;R}* z%MP&kI*#s>eHL}T%CBkuzk}UpAuEwvF2!>8ON90Ojz{j-(#C~3!3S-2%M;m{J z7?FM-`BB9^XX@E=r=Hn7b#{d|zI&U#TK2v1oJ-mF#(O2&jkF>3QSN_jIhw0d-y2N+ zVDiKFaikr=(=ln9N7pwW7&*afxqmuyP~(W{x``F-C#ntc`_W)}rcqBdW(G0X> zer=Ge-w7KqU45@~YC-9p54mBN3iQD*2#Ux87uvp35Z@OAq#lR+h3jaL`*O-Ex;IVw z7J>l=*5#m!p?9;ScT?o2=@MMnuAWSNVO@$|ochlhFuy54@8RVAxNrQn2I_ongbpeEZ4EAcwf{^1hpa?ysn@ccIjd~yF;8b@hnP1mpKLjOiR;C{rO`3{PEJ3fdGJf4rghWaz+;}n=0M2J)RKj@tl zArnda2odur9&IJ;klIHJM^yP<&#AOq4`TC}%Ind9ZXX_jK zCEosMF)oMpT}*DpQ@c>h4@Y}@jFMpt{3-b~)D^fQ)hOV7sRK4ZHyB4Hr!gSxM2~>? zT~uMzS-7*Ezbj;O9A}+BH*(FDX41F<9rfd&zM{Kuk8s2X`mWeq$s6Kr>yLd6 zl{%eU_5vhE=8zlaN*DuQ$#W$~^DQc&bEv1yr_Be@Yd<8;s3&nw^EpdeSGIcX_<69! z%T^WzbVOz?>~+B&3G7+P{brZnc6;diVE6k;ztI&1vGTV+Xt-m=%tmUL_wofUypz>5 z(YspX0J=l{;oB~CGhv>*?Mo*vIBYU5tdV2i$f>8EIz{%6z<*u;Bfay^t3-l!ZV4?C z*h)nDoBT{TjCH)kNBLL?g?p4e^FKorE^eJZjN8h5b1T`AMw7KED*4ha=ZM1jlAv&Pj}+d zav}|1$ct(92U4yW1M}J}Gy2@8w693cMEjCR{v{H4^-17Z+GIKO)mQDL#)$;-BtY+H zw6~Zq)uF=D;r|As+zlelAACD7y7ycC7t-%D{@T1Vz`702&)8U^pPSB@dS;rwR?hZ4 zK~?{C{cF7QUJe@(w8&MVPC2D2FbPN^fkXl?M+wlOi^KgH6ZRv~SJ8g`^QJA8R;eLK zm_F_4&K|l1$C?I75c#e-SV#Q;zib_t-uZlcQscMSSNinmbp_^sx&POBCd)|fwO*Ku zBkugKe}iPyQLifv@@H7X86Ii;ge+?n{b9YehHAyw$#sN9!Ej=8x9J z13j$M;5U^??@#&dVW-!hfByN<-wkx$hx~@d^Uwb}?i;c8!=G-pHc0!}vHchd_q-ba z>PK_>f!=S3t|Px6U4d&LzX9(Rl1^s)axaYV@Bha!_lDc#Asqw$!{!nC%vH2l)(e+z zJ%90<i0cq>ykg>C4b>V{!1=ivb?qYW4EM?A^{-u7k7TNkccooQWdr>Y(;`J>O-`J+E-|690Z&FT+S zqxlyU9QhwZq4?Ht6ZxpKd~d)QfqPsXUW1p~x}#J0!6W>&L?b=;B#qC%P5Hqi{Ar?* z9{d9W{2zKdywvZNA3VaJA-Xo;r)6uuJQKa`Uh3D%4<6yq5}gkCq1m|n_jswFDnEFH zznkbxzz>--{~x{7PUQ!W@Dq!N^x(r6P8^GV>|~M~eY=5t9wi~*8_T_jqpOGPl8$?D zXJ?AuC+L=3M?Lny@Yw`PObg!ro*0VhNA4(E;ewt&%0q3v`myB8J$$)`k9gt3jqS$z zH>&e+o7%P2e{V_suFZd6q1V<9lo6N9_4iuvVDV^6y211=F_7Md$C_^iNHU`-|Ng)O3XZ-Ia!MSb7j<06g42Lfh?DQ*b z5CE@V+`XmvwtPHY+aI_X?`!oWU9bM_!yDjnendsMw?>5ZE~u*s>C-3pKUq>A z&%^JJkVBm3F^8TV)}ruz2K^})yhr|s=vm8Fwl1XaGDP;up&ue2U`sx=pMSCw`QAg} zem>{SX`BtFUO34I*pg3{XsOdV?Tc4t7WO_P$p_eyPY=<^7w=n~PwxdM`2bt;Nnc0n zhID@m)C1_pdG74~e|sqTWwAhW|@h@m&U!XOvaG&n#~}zuo37mtJ^A zxhabCOIcAqDJxQ-?5meuu(UUYT{ydV-sQ%kthFc`eUE}Z9AE%sPUl(kVx5zmKFjkK z&;m?q$ezw)DGi=S>hL}OoJ1f_pVj+cL`V@B+Qykd!A?1)_n1Xg`-DgQpRPV}zCVh_(C3n-T7FNW z&#NWMmo1LyVzh;@E^cll%LY`l-1gSi^TK)pFCzvg&(L3vHkuO ze1m_m3AWU4JoGOOR18`N@aX_LzB_|ZuBXg%zu49J z|0o3I$o`Vg-ZBTRr!}6lW@Y776Br}EY_JCpdEsKG@9q4ZR>H+c{DY17?hf1T%F|Jw z{e9c5G^Kze9-R9HZv*yllHK{h(Y9niFS6gHmH)JG6~_pZCw?@5k7k z8edNr_NCW%C*KAA?}Cs+{&&H!EHN(e*oE;*#;)|Qc6DMbyX7@CdmwokyH53=L*@UZ z59|!uCGI7xa6Aa-gR(ouuH&BXd^L?-kYBj(R&(r1caS|Ky5tGSGm^0jaZ&kKYwX%U z__$p8BQBgj%6QPmE^2QFYV67-V;AowD`V`!cqL<3>estE?RPI3yT(als?e7{Pj)p0JZ5=DGIk*@D*tMYU8#?e&40RF`6DizKgxKp z#xAtC12uN_Bx4uvk1S*C!gwWP7upQQGHE+9c8!;S3VrDV?LoW5y@d5&^?73nonH#(jPuT#w`%qBj5MW+edz-^t6gHQw|Ys-WVwFy zw%R(m@-r%&@5=dQ&#Uopb~)d5HTd>Z^8@9M;^5jE*_Z!pyBOmruaz<8YkqapB<2ts zDkuw=2XzYOs{(RRd>Ka|%Wyxg<~TMk`)nsJsgyiJ$sci1`B!Tk>n8l{<(j|j1C#s_ zFZmA-_)tbZo4RoEg$tMWa%Y>=Jl~i6k*DO3a-uw%e-#c%2if|o-&PSMf8;6oBO2w= z{1>iR+_rFa>xFb+8ow-Wr7xS52OlJCr2T#m5}kc$`K@PDTqxS-YMkA;dd1@QHLF{_ zioXK@D2$!@KK;f3U4ACPzr1_;{${5^o58(?DP>~_4cU$%7GPq1Gm1O?1F~Pd>AB9P zRhf$=U4?$f>#jNXc24_9gVOUGWsJ$kHRIqGKfH!)s+W}>sRYBP8HY$4M|mFc$2vZj z`UrhPz;D;``1jEElj|Xq1BXFYxI~7KlgKc8hdwj=dCh2D+*{?+L0N`eM*|1g zbwx5iw-=QmdwhXDKEj*(a`;F;4(pLILM3-Ne4yGTads3}|%uc@N?(fk(Ij(QseGS5q9&QH7 zP3WBsNKd>GOU^cq{ahq1a5((>fB%Oi!%cZIMBJ@!O#AW7-%*b?h)dcb% zw8gLtXZJ!|1TsW@gZ9usv@b&{3D+Y}W)zxtUqb=(oeuv488-N&SCI^Zv?{}I7m*?2 zZYd!{$W3IJzMJfjlT1-QTZU(}Ua+wDGK8!i*$Qly+j;jY9g-PE6v|NA(jyHbcVgQN zy1aH+h_m3+_gn4o(Y$tuxclFKOwo1-xrq#+KOj@oEiA*{_hqy}Uxpo2Z=!t}f~N9? zWEQ@!0f)3 zqwAS|WGm=cG8}=Fep;$Obb-(;hw|E?q*a|l&(<$Txq7*gc0#P9vSi=>bmw_AKw^vx zyT)dDZ);rAo7YAgJ4Ne%~>Th}a2-EJsBjpFC;OB@& zeg*hr3i0tyywl)w*&kdxgz{h~_`nqW;oImLM&X}Uh!2!nT7N)Ye)s4CgUjezeqaiI zhG^thQ2vHOeBh=7d|-z2kn#gl@HY^R{0i`ADE^?s|GYuupRw@6c?do*1wZwZot?<9 z0KY}?(N2I5myIDGU<&>mqLE(#{`^9G08{XH5{>){@PDTGpLqO=n}HAc*IM|%wDS;rUfQ5!bh3yJOm$@ zfkPiT{{mC+HxP~d z3h)mv#790k!bdx@pDV)Q){@W&M5Lq1un{NX$V zADDul{@C-K$gcqZv_gEyXM=^0GTV6wJ}?D;9nr`yeMLzBHYmQ`e|rcYxbkir^?nOX z!S5j&`4!;LP<*@p4sT}sOp*6zU<&@Y%bxEQD!?2!3U<`Zy*}^Z3wr| zYZc#~|KYAK#PN~yUtkJ;H_^zi0RI-nUp(ltw*nu1c#gs6{`=W0PB8OS zkv}j6e=pH~9m4XzP4NlVmks;L)Z$n`N`3Vu7$$giOMyA>{0y!^b#^)X-yevWA5SAhSF;@kaqT!7E-B^~t_T{5+x{{mC+hhIhGe-ysQ zHY@S|4~Mn`mm&O8{TG;mpCQ_>L-_d)DZ~fvx&R+}x%w|K1%Ct4$ge;?hZo|beda9u za30b=fhqW@Pty1wg@2@tul;v#4EX?4@aGVX{0honQ-}}w)XvcN2bX++Dfrz)BfkRt zQHA)B&m0TiB_Ci4{$8SyUwGX*HO9tg`_I7ZjUq>|ZD=2?MA-+HUTllDtorkm^UKXB#!Bx?N`n1Vm< zQ-mFb-=g^M`1iC~AJ|~wf8=MUMvgzg6#OjF$giOM^A#VZh5UW_1o$%kd~fxrg7F8K zg1?h!zYgK?VNoGI@)#cc7R&O_jCPOz7Je;#UqOBaI4eC&U z-&Tn4_ul{?GPBzb?xp8>3ZIc zlj^N-MRMb`G--L-4E?h&UtwrPp|>*b zbo-yaYiK)Fe+SN(_iVJvzs=A;`|__1ormM7*O>P_Zsoh%&`&(%HLLs;$t9m7-#V~a zZWph7RG-FB{k)Oivs77K?whp*QY1+0b?>*Ylb- zbd1G6*3cXGoNDM0j-x!|E&d6H-ni#9Lx*teTSHG9I?>{4x6DMCmvs|q+%w(w&fq-ALP35T_dokb;P?*UcIV)F}8m!eE*uo^h-M{ z{SCxMuhO1~e7$Pt%rxuO!f;nRf?l0;>)60XMVFzWS2bMmTsW*(g%5g_9qU!OQ{Ro# z(xmye85(+3!%O3^UKKv*Qg*CYIycV?W z2q$vRGc@$7hL^_q?x>@h@3?<( zAcx}&-Ta?QD+-NgFC)Er=`GKn#$_MX{Kh*T_G#9uc8!=OIY&Ns=+%GUdVGKby~+-H zmBR0od+}Y*3wo8x5b%#RH1w*53yNEhO&dDi$`^W-9rUV}Q$maBpNU2$^y`I&hF%p} zDT=#1(5uQnx%s9o*L?!%pjTHOF<_&O0opB}hUU6k$HGKDxh6wHuWC5Q;=daQdQ}{B zBRkfsa;LrvhxMxPL9eo7y()L=yKtaawLi`>H1w*5$H8f_{zeLo%$~Mh+dU_ffeah+6#Cf^s1J=t5Im^RiSO)RljQLRn4!>=nd#q z4Ohxlo~w`SwD@D_Rmc2?=c|$*=Bw=5|MWFOOBj4td7xL7Z=0c^S2bKIHxA~j;(Di7 z1;z7*nRX4ms^Lnx$}?@~u@*n(sO)&YDtGF;a4=t0t`UaDd{x7ha^YaUs$3%tjrppE zE9JuB`Ks_?zRIo=y((#G2a$z?`D&qam51l6!jJhXJD#t~o%)31(DRtDip$rl5^DSI z@?gFy4s%X+JYSVN^^<;JP5UX}gu73o#l1E1(seP*Cs&n?lb zEGL(IFke+kCVEw6!BnDGi?<(M2NtO%dQ~JLel_Q-f=RztXZmcSS6M1DUzKxU73ozv z`&Dhd`cYa3*5{VYS5+2FCG%C5gG)ar^VL%F!S_{h2X($GndbRe2iAatI$zanEh?F> zvM}8JYo_(Q61{3Q9iN0=J%*@SIzNd3hhAO2YKi}S)!z%{?^U96&WSGdMQHxH+F-#P zwY~o}NQ7^yr+)GnpEe*wxNumP-no@|vG&U}ul-86BDrvQ?N|7*_RBP{{YrQo9IX8c zKh}Pk=5MMJUK)qzsKSpqs^DPlSHer2h@` z+4Qh=DeQU(rqI}*B(%iAcRef2OO?ON(D;t3;fmzK!FN>UuQ4?CCuw*boED3}&CvLc zS`H3$sq%Lj8oE@&OP2?_bkO0;zR#TN4GmqY;iYk)OO=0{p`lAPJPyv|7XNNTLzk9= z16`{8!wik@s2X0nJkX`ef1IJAOEtVS4s_`t&)dqJBMc2)s^O(^pi7m1q@kfpHM}$q zbg8zJQHI8MR1GhU16`{8qYaJyNg5spXN<)^*3kHlS{}}Li+_Tlu|KIioQW2HouTm^ zwHzGiQstj)XnaT2@Hp~mu=tw{jqj-C;Y_voryCmklgh!tdav@&Ff{fjX?UD^&9wMu z85--o<>9ng{Id;>@2KVB%(eLE85-YF%fmU(;$L8B>`y8OM|5eXTwO}`t887Ge`cbx zGc>%$D`#J@#>+JCNs{o=&%ByvXrv6Z8=B@_Tn65g6u&$?FBN|5Nn#qhRA{Z0`(1cV@Hq+ZyQB>0-KtDjCAiaklfKi$wT`4-S>`4+F>`9XFI5^moB>dQuBskcUB;j#zs&|G4YrNUwy7a;& zivBoR?G|{EuMkMpn?s&RXzn79-;zXC`OVgz*5?xxnk0!dbxO@^_T3kMfE-fyf zYT9;4bg6sJB)T+Lt}Z1T{Jqenk>}8`#yj+OwUZNbZI0`1#7&KI9TJ=@^3RV)_66%biFFDlN4DV=u*vhn4z)8tKp@~ zQ^6WBsp-(UgM3#fiCs!Bn7{-65hv)->ocZC+U{wLwZ%)iBLuCBt@1Bc9Q15 zeOzE)q|4CIs~Rro{<}gXP6hTH95^jans1w-p;tA$ba|jx7p)ojN#?}&Qg--udfC6& z){%t4cj;&7RpnoAXnZ@>a7A+AK(A`~w;39GRm0=p;M=LVSoRzuL^dy_8c5IW!rOz#HrxiX(UbsdwLx>W!rOb;FN98!GQz4DsF+Hi`Yqu#1XwJzrR+I zUZvk$llkhtM`72u&{23pVW@jt#C&z#CvM-wX}Syzy{h4g=+YaDXn*hS3tk)G)HFT$ zriX7tsxI2!OW}2jz?2JTVXmc#@(uXg3=O@i;fm(MfnI%X(apZCKq`gNMbN9K{ONMv z#+jnH<-_w;;aqRhLa+YtHxFJVG2*+*1HG#9+-7L#RSg#ucX=>hRXOMD)pFzvy{hsY zW@zYD4KH1uSBqX&7&I5z6rU1pZ51sc+l_SlxIBh4c?x2 z7_=YX{-93>_6LJ-k(yi1Glxd&)$jXueKoyMu5nfLYIkqutMpr=qE~5Nx>fSD{c`84 z(5n;Pe{oXi@NcNcTk7(Iq_GZg-IMPSN})6(>&)fZ1>t~NtM zuWGoWxp1IYkNeHCAbK9j`pURC(5ouXZH9(k)o?{~ zl?QrN<(#iq%aJqms>*Yip`lkbymWb9EqYZXQHlM**Pr>Gw{rT?%|b)33N6_1UC$l! z)#eSijbYw=`-2pIn~hN%XFT%#F7r?Xb~4Y<(5vOOpJ=^W>3nr(Z}jTce7%a_*%pZk z4ZSL~#KCv<59n3p?=m#>s)j3)3kP~t`D+Xfy{h4Ha9S+>HbXU>#WbM;IDsXf(Vu4%UH{f25&thDO6n<6s?F`9~QVdR4q#9OzQzuQ4=qsfNeFX|ed*3=Lgc4i0pw@^={;x>UnUmj}93`PUm7x>UnU z<3N`x|29KImuh$%oX0Kx-G+uPEe8j>RQZP)8oE@&OP2?_RQZoHG<2zkm&SoERsIo% zhA!3c(m2qi%0JT3(4`t)8V9;m`9~QVx>UnU<3N`x|7b%)muh$%oG}*vSVKdXmWMOm z;-6q>=+g3VCR+S;hK4RJ2M4-T`6nA1x>UpC$fv>LZ!$D=X?ZwPE&l0-hAu4!2f9@G zXBZl~RKw%cYo^6N%h1rJ<>9ng{Id-WU0NQ_T#J96p`lC5!#U65UtnnH(sFP_m!{}9 zdm&B7H`PL2`m=mp`iaM{FzXmXLzfDzPpY^sRsOCsfNeFdEDaPZD{Dy za&Vwam4BF_p-VNqba|jlmH#+HLzilJX&mTM=waiB|; zf0Uu2OEtVS4s@yVk2W-PsfNeF8DsH}H8gZ-c{t-O{t1SLE-epdqQzflXz0>%aG*<- zf3l&WOEo->d>SnNCPPD)mWMOd;-7A4=+bgGZ>^pSjBD*M*?iSWL4{&pIF4?E_i ziWAFDQsg&p=u*Y0F*J0khL>(T*psCEvFs#8mIu02ak>l*U8>=w%fsJJMV_(jBt@17 zx>WOxWhcpjQ?{L?NF3-=El(`l4v{$g?NsCw%T7`x4)669oLF{}B5`=Hui*5JGc+pa z(MIObr5awk9r9jZsTaPTG7ViSw4%7*ohz`De4KWY9Q7*O zPEsTe?@1E*;5SjFJkH-5kHq19Ue<`sXbnRcFk`SUCNSj$tTgJ#pT22W~8sjvN;&p*D)`Zae{vb zRmO}&m*NRj^E|4`Inkxuy7m7w+TW}4iDh%p(Vok;Iq1Ntt}e}#t4p6qbg8xurd+xr z(WS-Zljzdo@=0`QarsnWCn<7FO>}7~IhSp7FjCI1bX}S)SC{TOFuGLjqjWV2jqjyG z^V2T=%&WP^tNFGy361ZiLdPjjU(}^q{%xi%_+F~vS~J%>LN)CqX}-gZjU0S0)$r2g zIg7rR>ie#)@$RDUr5auu=WzO7dez@Au4m2>hW;*nFV*nUIA_uKQsp0M=w0-^RKrW- z97f+uwfs6Sy@S4&YItcJ%uCJ5nHM; zdhb!=>JUZkM5H?{`>EWi?hPOXEx@-KzW}4UN4>8eSUbjlOOb zKDCwfX%2l3eLmQee`L}Nb@@XZ)Tkb*tvv)+97^tI%2+ci%ryy7lO_CmP*)^OTR4WiLs~zs=MIx>duqW-dANyjA$} z?K()P?YnTW2CVrGGc$p{-HqkjW#rNtA@wH z8Pj~(pwEq9&asBZ-Xsl=gEQV5yYL%s?4VnPwtcspu{TMa>PNQkE8*(9aCi+^`0yKU z?6A*QXxn$;K({XV<+flPYce!+tA;C*8|T2-b!a-P&bI-BeZH$FeJZxSHtbEBZ`#i+ zLqoS}c$|8*G+#J07szLJ^T&d=gnhmgUZ)65x#csr`MlvD3f^Jn85+7(!xhbq6Rle- zvFm_&Yo@olb;yCytttuZ`(+2+DzxppWK~Vws`+8xFFWW~p>5w)o&%*@C2!1Ig|>ZH zd3fKiaAMytJLp!SZQqSky?LwVhkd{7pj(BueOGyS->-1y>sAT1eHRXN>p!l3cQC&j zVQA=94Ob)=4s@&Xk2ExNtA>}xfo?swc6cz49@RYj@z<(QgmNsM0vlt;#>z z(9o?K9tQ_&!s4(d%#Qc{%ANXd`Mh#<>+m^mxSJ)=)GRb~tI#SP_d7YS2@9vrJ$X%7 z!qs=lnb(Ac5Bq-ELAMHR`z{>l))l6`%`!A}tA;C*8>gkY=WS;O^1)sucF?U99<*}_ zEheA2&6|Gp<$!;lp`lwfJPuBEb?ds`>ej=nuUq*{jmRR=ts)8W!)wA4p6FJVL^XA* z$ky|4riLAKtI)RZ9z#yB_(vKVy46lEve2}8F^sO`IOpj(v>XKL6%w+e0h zZk$B7LQZb^B=+-*%Lm_E#pUZ(3AKHy2k=W5ttt}3+cyKxT8Iy@of_g11$YZ85Gw;j-~_LJySmXu3Ai9RhZpJaYoTt0lZhIu@% zZ+usk(j@v+B_R}_t&zJ|-u$$-spNj(!ujc_us*f-Av2xWP~tYj`c&kjc9VDyu!Kwd za_i;9h7!xjrI!;MN~PqJ*nNP6T%4XrxLC$(Isd8ek%OE`;3AAu6~->_$@AHnV)W`M4vVs7=5bta}s+>+QONt=6bKnIkBe{ zmh&swo|4#{ft_EWF+UaBmW6vGmnnvhgM<0$j;|~TaGDH_{YVZd{oTYKLksu$*`Du>yI#@QJS zkApMU%6FcjadxJh@|;RGA5=aI484PFK4^I9@`%lco+A2m_Oc6>x(q5Iy>CxxhU(VD zo)XL5)s_y_-lW8ylD2nHuT*y%qPqg#cBZWUTl+~sK}-700E z)@|ssNVjUZBDucX_6hZqlekCSfI@Y3ZG-8#J4y*DYAZf#NBO8b$v zYR*dWJ|(>u$|du_o>E{>!?&m8(}6vuAY4$~ZJ?SqAIP3hkgsn~$)^K*O0mmxpmZzQ zQ#u6Fz`0birxe>J8*Dyky?lF0LA`u?O0nxzWqV3NzP>#rpAPIP#V$`^PiY*tkbIjD zWRK`}Z8=Q2+F@W%Dd6|*Dfx6@PboG|U{5LF_iZBibYM>@HV)Q-(}4{f&l_cEd{@0p`lxaRup&t!Z{kXo7DI0DUE4O`TYX+lz#C)Z}#ap^};@-9ox?c z-VG)j8upYlT#?*zuHHEs&3C#f18hEMcQbJIj;-^HvQnU7l+0`_+8snKEGB zs^M|UQ(c=6>E7zr`3FX~sw5Jd4=M|$5}OY!2lto;8~ft&b*qHhz6&R?rxe(y_3bJ7 zbYM>@2v;N*PGC(}pJ{&CK6l%b(pH9Ssv-qM`=)t3W1Hlqy< z-KybnaIhvU4tti^y%Ovxt-awF!Moh#=4_ zd8?EMx>abAJ$zR?gl@g;$70iOhN1C|Rl^m@g@ZL=&3Bfep<6XP4i4D?Hu9WpXv|wR zJPyuWE8lsBhHfpdJm*<*SYT+_DlA7nGH-3~t!`aZechVaQ{wjIYTJo!EiRwLo>D3K zB=(dbAy@yZrX65@68N9ke^6O4Rn2*;V&gZ;*+I7oZTqh0K5c0A=B@ZR(j7y$nggq6 ze`Bcm&bl6m5R%U&)G<8OYHuNB*ahbDwS$KYLDOZdS_E# zWS;0$m4r~DQ&Z{EdzT{TsTYNHs_b<~4ooMul~~%WQ$;?BZ6#@g;wNWUSrV>yvgGV) zarq=?SBuLhIlEe1KD_oTX3%scc+n>QuAt+mYx~ z5?!8i$vM%dEGCzH5`9`+K8ZdpE}ul77MD+=Pm9Z^+WIt8i9WqD(Wm^B^uJ4AB>J>? zdrtIearq?rw77f{eOg>Ti9RhZpK9yVb(QGTYkQ?nxq_kp*z2n{e`48I3L)?0 zdJX;7Hq$pwsyDQqko2H^Yv_f!mL@Gvo1t+=Rl^NC)&ca!qTYD?wN}2m-uvJKN?Yt+ z{{aK+TSH^7@7~n-;2igQL%09wyM{K*M7VHpM)hr*>jIo@hQ{xbYq%o0>V-3^TAtm8 ze&QjoS;H+HN4=m=HQ!-|#u-%&w{RSCo;LI-E8pV`y?cq$isF_J&e6>M=|=+jj4(9L z(P+3Lx#WX$G|E5H&^Sk<;iYjZ(5DJ&QP`LCpO-BU>NVQXI7g%5n!sJJvTZ9Vs71m4 z!y;3j35JIK2MyN*?(#(2R>B!o>HCV}uh-ePhOWStzDa8nu>Y|B-nD_8n+%O}G#aic z-1Wk5y~#L+@1RWc?~+S+X`Bl5se)P*_9baMnPq64qtS3p;I3DTsf*{~w`sU8I7cJ2 zqPU;eG_wDo?PQ*zvDa6_70F#5?DZ9S##--HP>aIa?MZZ>bLi7ES}#}_%l^alVclwF z5|BmgKNK=k2z2YDTgL|H)4L1}`wtqfNnNt4!2W}RS`>7v=G$gy=vEEa1g`RQA5OY; z{inajoLx;F!{?6xz3WF^O?$t$@U4o#luIX8Q@4J2&q+qN3Ju*Vv|T1wy~@_D4xI?y zs`(BxG<2(mYl&RtsitoI+ac+|KEsG+p`lxa*3uN~`zKiZBMlARS`H3$tMZR({^pPG zI12gWjOx;%YfiPx0@^K~w=}=;sr#oe|7b%)w`#bexpBrczx#zF1DvtV8-LbwJW}C| zDuqX#y;V?)f^HrD)cpbf1Vcl&YPcqFmuF)0)vGpL#hlQm?4Vn3+Hzf#{Rd&m^TT_7 zB`waVt~vJcDElgT>E#BxweHrj!I{=3LqoS}xNsMHUSsASv(R}uv&-!)2 z8P(^OKl)mU5#KH6nN~ZQWoYQu^4d>})qZAM?dO~_+s|C9oy;>dbZdF-r|feyBC0%J zbnD*U>ej9Uqgw}#tT}-T+|?*FbgR&IWn68bnz~ie{n<*8uruMKPHK(~(M z0Ds=<(>PB<^TZ(Busg?C%v(M0@PL1tp`lwfJPwXOZw+w#d8WMhV4Hz{D&ei<;EFL&sX>-7#g}& z!xhbqgL$jCeBCOcw(r6T>sCnv-72*0yKtaeJ+J0#%!@OsOhdN{9S`Tg=vK*_ZS2dP z`tEwowA#rmLqoTg*M2Z>mG*;qD?6UIN_&vdV*PzCaDw)RGpbDU8C407gHv7IT01p* z?{DmR>n#UHw=N!ZSul_5Y7`o}RcMuzTjtf&t(tFJlhDwuLdPi&bgS}X9hhAY&0BwZ z)7iJlz4)%S4c(gAnhoZ^>kSRvs^Nm-mJf96yl;FYz}aSK=vEDngY&qR?`}gwx0X{L z=vK{ln4zItHN13ra8_0Mk27U}Zaw#@%Y*us#({3V`Idpfd}@TDp<6Y)G!E8;m4Bq6 zp<6Y)G!As@RTmBGV9rs7#=KR-OXEPdw%vAEAcxV0hHlmHI5=aPn=^}ocaMDCO5tM_ zfhkve#=LdqZHJx8ToVip-Kyb==EmuJx-~QCvhQ-qo0^4&ZWUT<um={x9XFLWw%h-EvlNj zRbktVPK0jNaHU*rshaav&27CYLlHX=%5G6SZfbDzF0~T{h3J?pm-wCpuLmA$|q+3MFZtk3CEp(06p| zhDvqn)ex5l6h)Rr8@P&uuhe|%D`v3h;5~Car}F>t1mcM`(+y6RfV<_x^x(?{R&PEt!*-0 z$ypmo>v>rFWgK4n6?`p`t30ezg$gnfyQ5a>r~;#o+YO7T~%mBao3A&01FP* zegy|>zY?xU?s`@4tc~W2wO=U@_AHfC9<2Qezn-soDbLzyc`#3vdSTC!lrxT;@m*E; zryKgEJZq!nflifrVeMDS8K+*=J8Pr)VxB7HfnEJ_%7gE!!r!~IHZ@fJ;nPa*St_ut z^s_{tYRh5DHU1>}w77f{eOg>Ti9RhZp9*Y2Fkt9^HP5c<_?+m|keEGQ_Z9txZ>gdO z%Rjp+X+5v+=+ks1`t*@RpN88>qEESBB=b{l8QAx${XLnVhWiWl{i=MD`DvkilKClQ z;u=@^JF4jAzN1guE77Nq9T`Cty=p`0m1SE=+sQ1`W^j&1!{a=! z>aF)`JDF$N49?MLc%1T7Z@m|`mAZ@Q(=%GnZy)jQlUJ{5U);WI)yjqMU$eNqb@fUj zz1#5(cF17QOFa?Rty%}665C2FiGFXnwkh}G=YGIG<332y7qWTPizzOFe7PX9HVO66$V;;r&UH z7WR|EtMVrPL15D?~;$$R@zyaZuN|A-F0AetJ*9|Y%A&0WGb<(#By-8ZQiFOHk$Hn zE6rbCSC(z1F*Bbux>acCR-x@@<1Wt$7XL^?L${WL!}C_jv3ItWJY$On`;^2M4fZLO zV~Ym!R^bnyQ5BmxQeO9%k9A?WBt;CYx-zt~qj(tkfey~qT z!bNJuo;&8P!XG}PT2A|!YqgVkhK6n}ul-b4x2C4M_bC;bx2kS^=D_Gy%LY-S(1~p& zZm)@LC6AoM>RtnyqecMVt4c$sMk;-_l_H8Q#{JuRUpN4KN z2M4;9Y$yc<_iZcrbYNRaD-=*}`MkxlIWyYOn75W^i)IXL;{@*>`MOnYE@`pceg|U=~n%%RqusPbS@bFrnTR#Dp92>SrgXOiESm71yg*!Mnc!qc@}nwZ6%gNVq1yj z;MQetq4|P1%v;$dwv|{8i5&=*gS-7CXI3F0mwd3MTSM`g(z?}{Rx<0rLlS*TqRVqG zIVUzCSWGVYBsL(5%cr{Qz|v$BeJYX=KhdYf+aa$5i?px~%nox^p>5yQ-(Sggm1;-; z>nhQwhbQ{fZabh|?I+QvEGd_K5`9`+K8ZdpE}z7vQgQi&_bf4YVpB=vP)*yvH3XWg zM4uiR)~9lA2&H5?v8M!CcwS=vf#pzKpGx}~M(?^zC-#(BZmds5K8ZagmWuvQ>^~Im zU#w51{md}^i)|E2xXRPjPkDYS{Ft9I&GSs`^`n0%wcz!DH1HHFTSUaQSzTZN9Ix5kp z{FL;+>%A_~r^VZIqECys{fTc6IUM4yfc>r*bX{lCcm-hTZe zY!R^id_jn{zc&)6g5OSc;Ix=Mv}`}0%U0yKQzLOI_3FS_Gdf$k|so?u*Bu)kUdn0iw`0dn49JWs=^@n{zc5FXi?$me5r-JXNj`Ebf zzt@3-bE)F;&(27w?Yrv5_6da(_6gbH?2OR1@5U+n>`Y|6D%g({i8F0zgH`@mzw_q6 zfqg=8`8FRU)b?HSso?vmqdaBr?{(l{y;ofR*%=A7eOJ9I_?0d4+EcDBoe|ch@(mZ|X1d6p-pI04@EfU-I2HUxssjgWyi%`NzmXb=Q^7aWNE}|{ zmGZ!b1Jgx*BQ+AIg5OAW;9!kc$`k81QX_FH_+}c3Q^9YfM&eZP8>x{v75oNGBu)k2 zOe1kB_>EKt4%T?(xnqr&>5Y3%H8hW2rN*$be}l$R9<1?7d0^L<=_0?88i~X6Qo)&Q zaM<>sglo-Q?}og_EBvv3(=D<*(}tG)8#IwP6?`*|#HnCUuLGy-J-rT`x#k(g+|%p8 z!5XhTuULDKB5|NgM^W?0I=-0(YrIkR@`oa=Z!f<^_3AGkjkb+M;SJgfm2$O5=+zzD z&$x#O5?ux6ogRz_&e$1Uf^#$zph{N6abPoH;O^N)u8N1fb@@2c0AzHa|k`3TeJp4oi7 zp#=lJ3uj1U^l!VhzEgkaEe_6m))RmFW0RRzZTen)*NM$H+;GEY8w0efJkYDkKibf+ zjilj<=EkYsw^Pk`f++*OooaaL@~j;i{q6KmOQ2&5ovU7lb=v&UtL!%HnPO-OgYUwD zUfr>MdoYeQ8G7TMW<$rpIm6eh!l~a*pC)_x5^DRd@*LG^^W&@xyGzMlzRkbx#W|4M=jNUlJBU++K=efp5ExyMTuVJR;d47{Wa06#rtdW zO|`gul5eWT<&%6;*_UX}G})Pd>b`zk-r z$arsnmCN=W=Sn_?fl$nvHF14RGXqT=?bSX>9C7(o>7MD+=ON+}V(WS-Z zlk8P0E}shQJ4C)CKsQ2{)|RVFFG_SNKOz0^(iMp=E#8(BU0Pf|i7qWJpG21ymrtTg zi_53lx-?yeE?r7R+k5%5o$n-DM=*Dk`S`P)C~fw^ot<-jva_=RH{_aDWiDo_I{%^f zkvH;_ymu0fvUF3v?GNqjlnpI2S{G-klPjZ0-pEh#PG9kCC(4qeeD_}Zyve(9^@@e~ zopz7^_qrI8H}aFbHxP}oq(An2=kUw(^Pauzf~D;q|L<+)k~i{`ylbzdd{KAGciffF zo9BH->jeuBMBd0x@?J+Y%95pg=X^3h?*k!o!D)xtbU02> z!#u_K%Hb7!@sai=Prqf-J$HZay~mB%fKn|Dd@0w-6t{o>S}JG5_qfzu|IhPks0SV1 z2%i2F7_{+JKM!~8q}{`3MbT0JnqM7H`{_ICX`l8Kx`Ms+l0y8B`Y+ya)D+5t@E0^8 zeLru%pGSi?kTP(|Owxya;Sc-8glH~`sG*umq|zTJqQ!7j~#kgeZ#}|kk}<( ziD5s?PieOx46(1f=G@z<%;P-okp@@#s4}_2Y&_8IhaR@&jW^C~^t^HRTNk~SjSDU= zWBC7Lhrjb5c=p37B17+@=g70arQy~t3PU@%kuEs!K{=!-ZZ<`9QP>lYk2&q0Pn~nO z=k02sTkoHL9QXG9Kb*7aiTzLc_w(;~`0c49c5S*SxSw=-_bA182k~z@qP=e7=QRDQ*~{y8TKEfYSX|e3{g5rk1o{7DG;=uX!9{5-&MCxy5sXRH*XE(|J-M{wtH@G=Z${&uE|#XQ^&r0<320>4d1+NqmBQ|Pww0JS1bP&&z*SpYpn7u z{*MKBzria1iqBnjw_U%hSKWHIUH?PR+;O)ppN8!2yPvY;_v=p$-E@;B-yc7H?559I z^55{l*iALo^ZD(f^rmUn^P4eh&Zgt6=llB`7H?W@J^z2sUcSk0A74MBeN&y)e%9T2 z(I&fneZBFLO?LZR+j7ySyN77|eCq#JZ`yqB5nHYg+Hc!u-uwUAdlxuKkFwtXT{7Hn z5p({cq6S!Q10mT*iI_Dm1mJu^EIVU*z*L?PlTC;=iY za!~mnr)7V9-;=}m`}|{{anB2$e(=8i@A2`!}f6wLj-t&NmfAaX1cR%xnx8AeopFI4(Z+g<*w=F#WqFV#M*?aD% z@7lWi`fYdqtH*!ozzuiZU2AOH82HsQzy2$q{M50BZ~I~hcaJ|0*Urzf`)!>V`P#3% z@MpgI@NKi-{IZ3A{M|Ra==FOW+iv?84}bHVPrvBdFS~x*{r~9Ur{46Wi-KFs$auTsJ`al@eoFlC;~o}2{1f=$+d{nf z;TFd8NO)iT@H6nkeIfrF;fFQm!&E5$58;R3%Y1ousGs=Z1=~?t%B-d;i~g_#pi7)$pU8|J%cFhacYYec!m} z{(trG55f<(d}hx*Zwuo|{P6#<-u_bvcaOg@_~Fo-iuiwoAD*AQ{|@-!?MeP$gdZ*? z2X;_mBVWzU+Pviyz+fr9ZxJ=LJ5# z#1H@Zr60fVYj5@4ls{`*;vP{EZKf+;>~a!{UciUw!O- zx4t>V!w=89_>=c$fj@{JzUjwz-MbX{hxp+)wtVoO^8$YnKOA}P!(McD;6LJrcTHTj z?Q4NQi64Gw`{cH_1^y*|_=HcKk@L5F-@slW-#0vE*9WzakUSWFr$jH9>>EaZ`=4*` zE+dvDIX1#ke*UgE|JRRR^EY>V{~P}Dr{7n|-<^AcAN}}ix4(b?^X}d9zdpF_D}OQb zBG02U&1Zi1wcE3w7{2(eADFmE@xQS!eD5=U@3q_CbJ>5mOX2aKf92h;{pxSM==HWY zCjP%)cJY;mzWdPZ!|uID<#xZnBK^Yf#pHL0{H%PnPSDbn9zN3G=Y<;iyzry=}7v3lRi%5SF=?|&IjTd$1 zhi>KYXFmDBeb4&v74*-^_kEh*MQ`7Jxbo*;yYIcP_%9>t?fW~@zNf$QzCWA3XDmeO z$yeW>v~D`-`y+Rrn!dm4mA7rbif$>-{1KH>&v|Fe{cI`_o(mxd(!vIyx$7%lU`#b@B82F%8$MpImLaS=SSa)oIGu*DyK<8KOgVRq&P3P0i9pF0=$w|$Og*_ZCz^jn{~@|G8n z{@gfk|NDQqd&_VBw7*aK5Bs}IHt&f;hg#$(_*CkOy7RmL_h0h@s?9ea)~734O8cJv z&ij5Nea~1h+JuMt{-n=^lD;3k`;_**)lz-`j*qUP@0Z?q&h?|A@0Yyq@7(+e`a8?^ zjDGH1V8(%undRE1-+JHSC*SGmoo9cQzJFcld(wZ{-}SyH&iX#)M?Qy6ao?x;9h!f~ z_uomi*WLHCY2VY|vF}BLA;yCI__K4l^Ue!%DPq^@Cw;$s&#CWw_18;&VAOQ8Ma@>u z`zL?l&(HmV*F15vr2)R+=xeqweDHVdJ@6j|zF0WLzvp=mYwtbsb=pYr=>++%|C5|o|J9*1&0bd0xi2s>{#E~A9& z`bl=(&l@_sc^kgU&kpO+{quh8#;zx3b6SqJIt>Lv(&7%{g>_CjEz> zxm{<}F^B7RTw0#4Hp`hkpMPRAkNIXah?xfev0dSZDtP3NPVbrY>g|YUn5(6T<6$MQ zh;#nWpZEvcYfpXJ)<1vZRU@6b^m?Z=h364*E7Bj*xhr{d_LXJwpL_2`@E1>~IKj`q z_aglGi|tXG?);Qy?YIr3#cg4n#Qd#n;gl1{kRQXnPw5mU-TAoZ5PrXxvvf#xKF8{r zW#_tYc__WNYiav=q5kjryLVr(Av^O^S$6iP!~5IMxOLn6+qZw$GnM}9zxjq|3IB}A z1Nd2XEBLp(q;X!+rjh3WZ}$9Dcj^?@m4_#zU3mTER}5O(e)m_-GFI z=dVBev=^_Rr#_tQR->8d(fw2DF@5kyV$EXOG(O^b`<06d`r*i+IhoZv0LVnxAh8=|_M0Z!FCzvE3n0m8~+AZ!F^g zu*y6odj6yghO7vq%8Ok@7 zA>OPqPl+BTDMR_jGC*f4^Hka4M)^VW?AuX(xKa(~r+R(_Uu)l9{5U5S_bA+V3kW~P z(Meeg4`u(y=I$9Gztz_ISl(LwTn0k!$z`CU$Uw+MF^}tZ?4FxpJBdJj;=fg7AnoJ7 z6~E;_`9{t!J7t{MizjF6yn34?|J-rO>hY_sLk0eePrT|7?=OAfH0&$cdtsaCzn{A5 zuRr$pL+2kljuU2?uwZb=EAbcG6YCf8(HFk^w;FCW{F>iC^g8NzD^72yEvo-NhWZQl z55Tm+>hwDw_`~zhzx*#p-h1!^^oiI1&yW7X*1d<9Z6B-m)!qm4_AYG&KJ>prelOVb zuNOS}onQRa-M2o^_N5!hUyk3|GuQV_=(D~TL+YGY!Jl$o^=I%Z zcvs9Y@~V?kI)9t-sw4m9TgIy{IaRzW_D|t=&-L!GQl_{R?vC?Z#g`(l5=Qg9i&usA zD6j7Pdgr-%x>NtY>I$#Q`DMzhsNGT*uR3(?lP=i;KgxB0;&ZXR&qb#uIEFv{_vbwK z<$wF%F8Rto_?bd77YDpbUElRf=+hOmwqVYy;7>WP`Vzbf-W79*ylQhqoQVHz#;ZpE z^jpEJOo#IEQ^l)}{l{M#>FkQ`x!xUC>J*p4S@!%dT}>DJIj>S`PCo80&fFY%mH5=- z3CFpb+1;k4&>rR0nV<4lAMWJdzmWQ?ZUt{zI;8qP5f|$6zLZz}*oNCap7N><+1XqF zC%h?@!vup1yiT_<6xGr5iQpFZ>9=Wk#7rRh(poylAr@G2*G$1|Z%2Y#)AoL9l0 zBCpcBL-4McN90u|7)RuK{ckf~HS}lS5?-Y-eg3K9RbSwYv9lYx=X!TosZ(4EYtQs< zy12kG?+^XdRn;vCuR63$IN?=Ed-PuMZc(rG;MSA2D8Zp6&RgHDx+T13Y5VJ_@2$9y zx`S6eaKp;v@ zr=`a69OD(IvyZF0=B?xX&6sv=KDvZ${@$ag;bzs5`_cZc;4?k4>v=~gKl+N+eeH*l z1Ex0N{U>El%CJ|tNX~IeHpr>8?9F$0Y5SRviM<BT+A?*6U$dzukyzi z$LrNreCx#hW8^OvbLcK#aoy!B&3vOiH(f2Y%G0y;+RS8p{gnA?|AiE!F?Ke&s?0N! zUKo0&>-kTnzzq-UnhBO!95>1M2t@JJ5#ODz2s>XKkJhkQGD&1IL)ja9SRsgtpp>B?LAr@v$2ynE=*uiw7>oX_7r^gsUM?L$Yd z=&(Ol`l0*3`u3rZT=Bu7yE@~BUi4+NiTNf!wL$*3>rd^_n2eN3SI)wb-3&O=3z!(PbYf3bUtpC3_h z!;+qg(%RIC^K>^rZ^p%I^^ECK+|uEHwtJGDxFOS*rZ{`|P?mM#D1&lST+A=6%hF-b zFU7_DI&q#~CyusJu707lc{_v)Epr^{{N2v>cH>mG*SVlyHqrw}x}WW$pVD>UMq-`w znq*3&I)8p7#YI}BI8S%OB`GfEm$x>_ub{!wNI}z>a%sf-Qti!i4E4L=l9(#X^Aims zHs;rfE5?TB=l5t#rpo^BYsraUuy?mUia3vP8VJs7lZ?}V8zCCkNds_)d*Dd-vmLbZ zbltdOE)->~s0(>{JIEtaK{#tif&*NUPPks_z;%qZ@NR*F?;VzV(w{N6`HA`gH_`)l z_>=GYxqSS^bX_>(rFu8gm~_Hf8C^Jd?$51Am*S|>;Ufn=l(!>{j)3bNLp{=sIIgoV zBQJ?{p^TAY?B=vTygIJ4+&GWOCyuLpjOUn+F`i>byx-C>Ud+|JCi%PGZ-EB+JXg6Z zae3n69&aal8~|810Rw1q~vugJ-Kh zNLSDx<#n{ldae`abxHYTk`A49U+ z?I>_S{6gBpv3|+BBShmm*SrFkw?pX;_ed9Td5$4n+P})*`8|HDi*Pul>xIk9JxnxC z^~=l1aXH4)#4>VhNY_2LyuEoUe|N;o=qMLluXoeAm5s#lm+=d4C%8O6^3s~(?TzUo zE~!gMr!kqgILD>wim_XyD{!&gbls2jD{wIt^%yDUTgx*V6h8E_qZEyt}aql3R>UPi(Hf^1=O1d&$5PMnt}76F8Dm}z5!pqjS0LpfkzW~PXbpGxShbu z3A{gn40uOzrsOMP;yfJ~dCh%wi?@8cF0=E-*If3^l@PPzAn7~I9 z_*eoTPvD{dl+-zaHzx4b1RhP`JqcV%;C2EpC-D9RKA6Bq68LBWA4}ll2|V=2Nu3jT zV*+nY;L!x$lfab(ZYS_^0`E`Y0||UEfsZ8c(F8u0z{eAK>qowvkLS?@-jl%X1YSk@L9D2-jl$`-taeh`UBVfT@D{j z;A3aMHWa65sQ6L^0DA4uSX34A1hk0$W(1m3f=sOSC!-ujKN7GooU_aty7f!hhZoWT1N z_&@?5OyDC4d^CZNCGhbC9{Qg}-OftjjS0LpfkzW~PXbpGxShbu3A{gn4}}l@Nxq0Pv8Ryd@zBJB=FG$K9<186L{z!lKLm`#suD)z@rJgCxI&o+)m)- z1m2&(l8JOqeHOBY3~eG`&DbBrxQ%_{w)Tk|?Gv{riF=q9hornppSX6PxaB@^`}@Ql z=o5FaPu$TyamSLlhj+E_c%Qf-aNRKed0FuiQAgQb@%&d zpSV4J;wpXO+DTmZcv4CTv--qs z>=U=OPuyq{*GU(|SwC`H&J?+C* zi_^YrwK(n5R*TcVZM8V<<5r8)zHYTR?ekWP)4p%DIPC*tT(>--ec@_x+9$3Sr+wpU zaoR_&7N>pXYH`|Ut{TU_bG10_LsyF%V(+(F+*y6%Hui}d?Gv}BPh6!>T)R))auV0Q z{_XD*cc4$)!9H;KuA3LM`@}6Laouw3{yuRB`otaV6L+Lf+|fR9$C9}2_8spNH-ye6_Fs4V&gv7l zu}|FAK5?Uc;`a23tMrL$_laBX6Su!l+<_#nn=c*g6L+Lf+|fR9$NIz_?-MtK&MNj_ zcRkPQ6SuKX+}1vEqkZD`^ogtViEH)@7f=xDnhAT$VkJJDS+72lz7l%L9A`{v`ocnkxe=|0MyIAK$$S`09X{ ze{F!}zcj$t;Kw|b|8)Vs6Mt8L_uyY2;2ZFNG{8TG|B3*Y@MC(tdsD#g#=kMZKZ5_m z0lpc3EWqjmh1K>6o>KvSCBEW>S6YPy>mKAxfE)O;0e%&JGr+ovI2~Z6X$M&Te1PT0 zcjtij1-$%Q0xW+az>D}XPv!sP0sm_J*93S8|EB^h+;V{bJ^oUFg}XJtKZCD0wM#hV zC0KbVPOxZF4e-z6mlN1;IzG*4rf(T4{hN5+7T`DIza_x?@qaGBKY{y)JdV zHNZcQe|vzH$1em}?fB&YzXLz!^G;y3Q~3x^)4VI-@4$a|fZv0EAi(d%|Fr21OSblu>1Hiu#@bW(tVEMlu;NQfLc`E-82mD9yKbpV?11$fy11vwLxfA%V zfWIe!?*mp?ZC4tF1^*V$PX_o9{>KCSG5os&d@ued0{s8re@}qV!dF=NoWXNMAh6>9 zU4VDsKPqFkCQtE7!A+ju72rAig#hb4<*PJ`*E@n2c}BkX6kzcS z;eUvyc#2@*pB&&H!2iJn{@wupBz{cueZUd_I^gdQX2h5#!MrBnWI|Fn*#g+ z{9g~S-c!CxuXw#9_&0feIKUU-e=NYih5zvczb(KQ;=d@s@-GhX3-Lb@;O+PdEB_bs z)H{Ne$K3(`B>tfQD^1Kt@7^2ml8JsFSoay@eLNp?mZ0b3W!GO*p6wa4Hl*$yYfSlk z?ETKQS2SkMzPvnMJ?Hvrvt8ZSJJsq~-EYq2J<1y;>0wKLHqAdQa_H9uI}#2e62)JV z=6>Fb?+VU;N%}O+9Z7n@@t3}<|Cez%#0gfN^s_Vx9McG&!ZH0F$|Ix~9Mfb5i}&+W zny`M1bis#T>}htAM|}6@E?95tr!?_5lB7xB?M{=YPwHlMhFlO%vfXO_rn=oTiEJ;UtaVrBLot7d(>SQ#htq{wW;O zjDT0Z`YF#8b}Tfoc<*1QVFAbSkR@pZ$MKM+Pw{DbrHT2dUWY9&A15iCg*IB<1AJbR zK7F@4P5!Rc&097S%28;k3y$SxmfqW|^s!xnW1W>Ihk*`TSh(WnZS=6yB*2zu0mnD) zNb(Sz=4ow<2?HH6rBC2IP5N$<#_AK&r}gPe&rqh)#NXM#ktY7G)5_C0tTd56p5EVf zyu)dpo=<^~ZMQU`>=F41oTf=(&!w2h3hUjNW~7Tg5uYWrQkq_6Ssg+FJ40O*6dd#E zC`)NVI!m9xF@5@On&-_St@0Nf(`QNj(|%0*S7~CoOT0T0@=`u2oCW-n{2pnPR!%?j zlQc1Xn&#{zz2G!Wgl|sL2wqY;ej{D5!V#asG5y&|dciSG)&(o9pVFl8NWd@QN7~-p z1>1`}lqUW>ec*?NcUbSnG4J^l_&8s>-~C8fLzOc5%`!gH0xS1o9s8(GC(E#$Afj-tJ1=!*MUck;L>_8}P5fJrZ{{?oqgF zagWBm6gP#t2B*E;CAc$iSKuCtyAHP(cR5b=xC}Re)9;lysxS=wcm_Wo_lbTg>S$;0r#Ug$-~#<9*_GmoaFA8;a-J%IZkr*D{xQ5 zsf@F5H{<>tPIdSmoa*>woa(H7x!Nk3UTyjbTotE%N(1);xHj$war3wz!bwJ!oI8g* z8z&+5skmEkPs1(X-iTYoJsmfVdkU_F+lc#doc2&n-1p;D_c!1qpZ^^0yKp~)`)=IN z;+}-l{%i*Ky|_B=^*F_yixaJ1gL@oKWtMTz$GrnLiu)DZi*awmy%+Z`ocdCIqrvox zI4$(!IMq$G{Yl(U;hu+6U50W09`|hA67HF}TXE0Dy&Crnoa*o_+%oPtIJHrA_yyb! z+%Ms@kGT!E3AZ1&1*bNPcA}wZc{WaY{ya`~eJgGR_jcT`;cmxWf>U3r&gxtBnfkhn zQ=i_9Q(aVN)lGF3?Nv9`{dG8vk=Np$fLp?;?^MRqaccWcociJ>ocgqcQy=ZZiPk@Y zQy={>u8!M{Q(xVP(^z>u?tI)&<9->ZG4TSN`dV!o!l_Rmj?-9p1g?d9Bu-=Ihj8k< z@5hODs`FOdPvAsD_00jC`sO`2^~JB^&cVGK_Y|CHsIe|u|0M1LoZ9?m++%SX!;itW zagWB$;vR*IWB(U`HRd!%z7MA{q`B}GoW{cYa2kW}#A(c_Z`Aj9;8drpaqq`ngZm)v zTAb>9748GL>u|q;6Rkgl6D@xo_YvH0;zVn;>7_W8B^rMi_c5Ht!b@=P#p&Jia395O z!YR!b+;8DF<5Y%dawYB#oa&;!P+96Dl_lD$PNI?OtUA05cMx|y?zeF-$El1xxI1w- z;O@d{EZl?pQQUnvje(B`r#k!??vuECaffgkQy1Zsx7zXw+}$|ku??rPK7rFaFT|;g z?Kr)wJW9A1;gse=oZfvgPGw(=Q{8eM0N-VbI)EpF@Ao@d9e}<;_PrGFxITsCI)FZD z`bFtmXKLHX!%{A&x1HuS>$1(%a(G`pJ**qY_wSJ>t(y z;Ik6=$qD?F1U@@~Hzx426Zm-vY~!4;ep_*|T=9Sii+@CTB!Nd0SbQ+1xjKP&Ca`#1 zOmjm5|5yUwoWPX?o=V_)0?#IJJAwBl@T(JeDS?+0_|^pe*#y2Vf%hly+Y;G^EluDe!-&(%0%Kv{JSqf#IVZQHeGTW~SUK##&`^M_& zpxerxh_rBeh;HHV&-PNi=;UNA-a9>Xi}|ax2>0@P#d{40&jAGn6c|uoB?TTQ)b^+I z7#dm`tG%iAeiIWD;rsR7d}rl5-Ixspqt!a7e6&?EeZy0Ok7qdH^>aR&mgRVVF0tiU z-ARtzNts%2e-~fH%jstewSzpBzkVxyCxy!J_$U17YYts-@24-8zZHM<$BO^G>}mcj zJyW`;aM4E5_&kE5!x4yE44s^oFaDv|?+x@F+0OrM(6*Rgj7KLGWi#ZlTsFJyUvHPJ z=4q8?N4+tYop+v;3MclnE|2}+BMYnJ&~pZ|SJs1@S@dFABDDeMp3fR&WWV2$0jcw{Ln`L3`jj4P4-<MeqFNJSs(hn z7pE?)3u}_iwBGiT%?kM}t~V?FZrSX9zBBy%(l_st-zu40$Y<&EAG=mgvqTo6R*d^k!R&QM5j2O|seY@IW>j$Y!bhw_aF-vfn$s z;@3Bj2dM`X7*OCli2^6CH!IEv`qOJeA@Z$THY@mDTE^-+Gtyt0>&;kid&y=+PAg?H zk6YT_Et{o!v*)8XJ2H^XOg0l8R+G)vtT#g*%Vo1Wkj;?QVjm%!HRoD71wP^5nq;$~ z=baweY%ThqrO>o9%umN;TYxHSI6;Fw?ZSF1-F?{ymJ&3e(Q=r8Y& zm2?wk@EcHIK!E`TdQ;#BgCKY$sh@1tQN4Jknd;00hjnLddNbDB zUb0zHpOmMn_#)gbn|15WhHe_1Y3fWJAo27e`m2lj*sAp37a$s-Pn^v7P^6}gY7f1TQA5dUGfdK_l3UtV3X@tS2LN`{HZ+0qVGvu*cHXA`ULspAJ zMzUFBrg}1pvo*)Q$L%8Lxa^xPedz!4by=1eZo-1WCk6VMi*+4dPd$T^W*_!RmkjHY_ z>`G)aWVP5w$Y#xIxpgwa*_vdtq0Og9HjC{j{DEv%(4sdqkj;A2Wq=(}U_gQIBnl*Y zvquz0`;h|u^=3;Q=aBK8Zr`LoN3L5oJDD?0t+(B>ne-S%E7vZY9V>tMzRj z*?Ic1<_Z1QB%3X78OUaxdgOF&M0qmOKZe~O+y&@Gt4FO$Yvf0s{&RD3DU% zA-Jch4~P42-Ljdl7m@eHY}R;Bll8V+HnW8~X0whn&F*`eqXXH@?alhgW^2})A&=#< z*$v2M$ZD~Rkj+DPug;HX+?~U$vrdjN>`x7WxpVlp#os`~;^|qI6c1rBc2C|vkoAr^+ z)_hMBc`TRBZbmjkR*NHQ$F9q3_4>J^)#|L2XD1?|txa!s!Re9BVmk^y)twCN%?i2{ z&_FgTXfc2W6c|w8JCy>qbglXgjs9nvSva%mPrFAK(d(AYB>#nPXTn~O#cHp z{2o%-OzZ9GlFf!n1A8;GH-iqV*_*9dZ-zXU%Vx94X2@!B!0gy{MYH@6{LiN47Y<~z zl`@8UA<7m5*{qWmDP1CMx^Zc^o0jpNIMN6HfC2*w3@DINz-2RiU$)n;zus(Z{6*)Y z;kRDdEb7X-?i{R9Z^n9ix@5D_fo$gXW~V|nLmtazvwg^B$ZB!G?AUeH%mkXVD#x1U zuUl>A|3Wo6SC3goUt=;Gx@aJq4P>)amRc{YQPl69Uh%>Wegg^&C@`QvFAAJ~y;*TD zGFzu?HbVO7bSE@-Yx}pjiyE{ZkTEC!zn5M9JY|5W_X zCat%$kj?x|vyW`H=DPsMW4UbhHe@qo zHSd=!LpH1J%cf%RMEo_$WtwT~(5i2(Y^F-2^Pn4!;h0WgcY|-wM%olKiL@#F zm2?wk@EcHIK!E`TdQ;%U^=51TpG|qmCYwD}|FcQ!Z7&=kIa@p(-WHV&7*hk1_bM-N_qn=S7c$Y$yIUkS&#A^La9 zAOqPf(x#Ixopf4Bw{?%?!3zTl3@Gp&M1d2R&0M$j;H276eC+ihmCdx?o-WyJs605+ zv~OrYhm$_jL>|j!v-cyLA*;nvwPV+{bCt=H`FEOYyr(%jkj+-gW9o%e-iW=D;s$4$ zE9urrpVi|dJqP}P0s{&RD9}v-Q!AX-GtI{qMXpyiJE?DI46)w!lFh8eRwwaL{Z{(j zdNZA6K0lmkHaXKA9mr;GZ`MaPTl1MF@>njLeFWJISCG-1$Y!1MAe|FY)`-0l!|o6CX1!?DNh7CRFI=SQz#mXxK!E`TQVN`Y*{o2T zW$Tp9Mo1rB{{0NeYnS$OvQyuQQQ0!3hY85jyY&6c|uoK!Ft$=#b3{Gx?CN z|F>tepm$o4X$QjpFM#-#rQg0@d$SY$pG{hCPnT?VWFVWlz1gXd&5*}(+3YZ~8M0a& zKs$Er9&eUstLN^lmiM+!NJ3kaY_@#mKsFo5X8mNV2aD5)?U$xkd>rKie?Wl&1qKx8 zra*^m)*YFh3fW9~gx@;#X3pzQR5sIkd%9$^p|OFznc15`ht=%O)_kUkJeJF5zmIH& ztQH51WV5;YYUWmAL`ZmDr(fdW)UktruAe#+jvwpJGgT-lZ^-I$$zW0C}UFJTplCd9}l&;@d_UBLhgOQ~We+3iP7DnL-BHY-PMYi>d#$ zIWaMzv&f5kuMsQXOEDY#s+>@(%4WoM{LjoNn-%4yIj+&(jPF4qaJOvM z{SA%ffo$gXW_@I{HGe|`c`TRBK96jMtQPx7vRR|iKK=G)*PI^NEViTYJJ;rcY*tVv zLK_}-Mz$82HoMH<_}0p_u|HLp2>0@P#e4k+&jAGn6c|uoB?Zzm&6TnJWHVBC=(<+E z?U>{|X`Qm!2XO21n+>%OOXWFVWly;&dGY|Uqy$YZ%| zc0aNivYPjc>CI-!d#h((*=X!NA#1a>{y)uY2eMh`JV@t+;24hcCE^C(&?snA(8O_R zcqQH97$5ip3JfSPpukEBxNIifSg&7yd$W{Z_j=oLk1wLuDVy2dOsxwYIyJ&;yQj%| zd%9$^q49yenc15`hm*E9Lmtazv#%kWA*;n9gWjw$p?{}&-lm9JuWtihZu@rbH&NTBCYQ3_V4qBURruDX$ zY*yqHWy_U*x8AJ#OmlP~o4LJNAK7fpXPU@kxoq|gWHV&7*hk1_b7SphdAuDl>-N_q zn=SwF>5bJvhBK6o-fpscfe8 z_H@W*Tkrk!#mfWP%&;f!n+;?$w>Rq} zo2}X240$Y<&9YCueF#}Cjv{2Usk!N~6EromT-K&H+jDwkv)GQpAIN3}EqX%(*{nBR z2G{`w1{C;CqJS-3+huR&@9d6SOyDz3nBN6*`m? zm(7MM1A8;GH-io*ZEuD=7G*OHlObfaIEs+X7HX~bX_w80t{=!|oqLsZZbW%9_DT%9 zKlp}5FIsid$SKzg7il{12NW1kU_gPC0)=b_Hc@eTn*Op`Rs14W4Jojab*)7?=>DmmBG9f{Wf`(@swV8IcnN2nubF&aqD$h(-E2VaAy4q@&r)Py6ZdS+J229S*wV~Kt zv#KB!ym8A-RIpmAR41yXR9B)*r-mXoXFC?$ASzPs&b_N-n*!V#Q zdGqC_y+LrE7G|~CMn*~e!-kB|Sgk!>Ztcxl^;)G`QZEFEt{9(diu}WsW{o#3Sk*IY zO*IzwRu{8r>a6UjZZ_L!$={SUtMzi57gT<=UY*Y7An3gHruUXgYUU+1t<%dD=+~@H zC|AAIYBz7(0wD~p-BR_I(=U`ZJke}SD|aQP$j#Zfh^lfX)$8@zOqE0pa;AMg5Ev@f z6Rm7U(XGs%!?cD5wyO2I8aAE*jc3DiGnGbZY;GbmKrJ)CvKntp&uUC$(^hCpm1|Y2 zd$Wng_*|=0VKY*m8K<;XyD=+dxnAPMNj@dhs?M|;&1`0Fx-?cVSE$8QZE~vgs=0E# z)?UmeFw7)+yisq^_?xnrRY?>ox4Bd^2VooZ5TmEg+ryQ{1eI@<8`;FZlFbPXoEO}b z*$kpS^>VYQ5ksABghb{K}$uh(X2oB7q5 zN=BnvS)b5+5bP-0*+{Dq5e zOw`(03noydw_D>?`g5X57tS=@r`(B&R+TiMnU2*`ZJLTLj@L78gip`a8Gp6vLaDk) zduWBDO0}6vbzi2KtX^JZL=Tr|YSY>9czJxPnhA!cP0&ndhG^?XW|f1bRvn^`ATkW}7IFT0zXQ+6MXRAPTD&*F4(VjNp6|}kts8nYefr5N|QDC_>%eZRIF8Yvb zQEs&aRok_h$yR2aUh*NqpgNzq2sKrgRw>La3(!HJP#ievR<38JVkqjSq`j9Ox3!zrZrWr zG!_(f3vA5_0RS~4oS3#HW4_R9Fnt>-!7okCu?&ez7TvuGc8QQ-YsRpc0i1md=>S&9 zD!}y83~P*8V9QN5EG$bK!p6O38f};YtH2m+rvBCSSU+1U~^8z{ko7-v7Cg*aSmx`8a@(NpDG(;>COp^}I}9wp<}v-KM6xYe%J z>m}!;PCilKCZJXvGBTApFPX;qz30Wd!?VkV$&lq=yFe9DQ!Hm{qvk$~1ea z)ieujtJR+3Ii)&OD;7%$=VwTQHY6l>DS$xU3PZ)}DU>!O_!fp$mn>}r7R9{{bxRKU zG+^gYF2M}xbO$9)=FnmR-jbCote~Y(!6VYMQ{{St6?&Gv z(@d#K-N(tq_ELKnjYJlhYBX!Nuod#DV%)3+MWC-s)-LNy*ILYO}`P#m5R# z3)7D$(~swv$uD|L>M@ofh&1&uXi|{K#KePidI1{Q$d?GiB=;Q!M6$^27V%OBc*SX1 zpF`vyU(Dtk^=#61ZnSl#T4#Hz4L}Z;YI#Wc#~5J6IHPOtV{ED>0CC=H@`Uw0LaeoA ziCWsqv4_=jb2iD$X<4BTDUIfJsfb8|icROJz1V@U6f?C}Bgw#)4Qm%Y+-}%Q-rL4f z!~#q8Ox|XH5+a5{z+fq}W7S3$>5wrhS<$AZ#XHBE8!Iql4HyA$NeC`!FA_jot{q!t zfsJUU)&z2F4BCd>Q=wF8Bm1#g3^^oHd&}5n-B~N6w&Y#SMpA6NIXT7-+vc8F5Oc6D zo;uB{F9r(#GGAj@T#-$f4Uh<%(CMO9mGxi3C)+|z-6mVNO1Zh$B8NfFYTmJ@5~Kmh z=wsh*OKb#lv`q+0uS6coBPqMFAQrL3-ecP2DFs`)Vb@hnG;7WwCL}o;zsM%0Y&G4t zXpvcEk^K#wnY9>ME-#9OC=|GfKomYAJdn!}f@%RnGGlWfZ$jU%fA)HHauNs(fQ^As7naaOBoiKPXB-uJ|g8Lu~Z+cwFp z*9Mq2Xsa5hjh!X4cy{`cw}YWQ0mcPtz0Gek&WUvfg-j*iwiP=norhvdtE1P(zDs*y9TfYpQ7`^fL}%=v$C;B31=h);%%D*Nlp7w^ETO=d zooTn`>^bkk^qhP1=u#N(bMDQXwrb9v2wZ#Fo$!|X^BHn-+ZcQk9iDAEVhAl`vsT%c zA;ryP3)vLPrsf!wLRIE`omn+2J&N#7Du>3Z^X$Xv5u%$8u{t(pTQmlp`_L*a;`Ej=E)6iTPNoZ;?TW0@ zf(R#71`my&2~DSo@^r1fXj_ZndBeB|;Vf7S{un@eOe1WpfktKAJmtlftRcOk`A~t` zx=GZ)-yHl+(qp(*!|{2T(X-h_7S&Sj zH#FgA?5SG&7@5z=cU}cfWVNhy*{&uEe73`~%Y z39K8H!l+8F279}sWXTDiG-QFGnI*0qr%%fJq_BW#qPB7BLuM(? zU2P{;Ex}ADA*FH?#jPbmbHXfOB0FFVODg4I-=GV0$eJ%*kAP`u!foe`q!@NY;RPFe z-UC*nHrh36U^B|ZS7q4}uMdhu4oT2RF{*V^73h!98KBrBTBgur+VK!P0CCpUkTiU< zIa?4It^TwW3d0k11P=|DI>VduiwaAZ%NL9(A9OmlQa3eFR&P3wrIy8z8L1P7B1Sr1 z(wMFnpIwHCz@Azjy45N=Y(^Q2W|J+DOUrRbQZfp3RFuK1eY(bQ7^i@=-ZTh7nX3#X zyNS(Gki5k#Fl3Y|O&Ug>=t^lA$;$WRYNhQ2q(1Z}SEXt;K4E$y*N0yUe`h?A>twZU z?AcG?YBRPQ5Z_SAJg#D`n-6*)-zFKS2F6>qlL%4XZ< zlS0ZYV}GXAnq;*_W;YE-f+(A=qd+h=RGk7b&WV$WA;YYTFaQ?57RMIZFw=4$^POj- z&PWd|pyaqbR7Ak{S!Xii?IrphhFEhSVsa)RGKROu=BHeT!#kDfY#a$%BgNT|PCtDg zIOYR4NJXlJQZQbOhEd0;hI<2aW|8Y2A&|m8lR{veAvsQ$@xDOiMgzbc3v4N=qS9n%|) zG2)iSFb7d{`}R2KC#3~D*jug6jv{ZNt^3@l5obHtr}8F zgvEgErUET;U9dNXO>s+N>2H0CF#{U)pwB>Zl1`3r z*Fa05Q#WKL)HW^(v*V))+WCnSGW7z$!LACl{c>QBsH!-@jscFvqK@5#c~*MX7I8hD zLrj!m45c8X43BGVwlz-rlAsRMByCpFwwd};A)V>d#u-`$T`bhS&KQz;T{7_j>jX3` zNLqR^5d=JBhiym%o|9gR>wZjMigH0tBo^{gZIc=hm$y>cn01O7i8iLd==!5!cbcxE1T@UWdG`r62f zg`GmXYW#FeBEVG1C0K1kk|mOrpWP}8fh%KYCQ)Ptn8`F&L1H$qG-i9ez>w%4ZCb>W z#Kl6;3iDE2_r{=NN9`xg2$|J7M<_M`^5^(}YkL>q;#& zM`N~UZ;ty0Cqz`>G!_A15w?IB>1UY)-U%>Ejx^EjXr9k8vE)x+AK;KwkL*n8XP9bu z1I-Ew0?5y{%3(<#S=A&aAsn<--;pk6i0B;j#UbQXl7SB_L1ME>&vwA<$M_|V*3c?M zmKCQBT^~rOwc7}bw5GXaO{?ZmJ%@A%9LAi0Fi=bmRE(5}VY=2@byRAmXc@1W;@H>) z+hE(ciP&14I+3C;NR4M$u_P+=4{ZiE`hkV4;c5c&&|GF(N+jJm!omgnsbf`Ik3bsARC_K5UD&* znbTsmI-Db8sh2KwR@BP;utLL#qb_EC*r#Ys!M3Iu4*R9z!H5a<@wh2?D&ZVT%bsK| zlTsXrvVVo;*)UPXMEDYhu;CI|psWhed_<@*RtOtbyA(dsi@YADGiPy2X7jP&dBy?MbM>0vm>ZNHLVF8c(LnbW2B+gZjzx+?Pxh_MPXZ-R zx@$yU%+lJ8Y2$lFZu$=^qS_2HhJ&bNP3D^&#}twoNxkYd=uZ_TJ65cAzCNUwV#?|e zT4J58Fn(lQZ}=9K?82@EjO)Urdw}#Z5o9wKv@X`GX3<3DP@U=&p5cYIxmJ-KmW(Wo zgptA1bEXwzK#y0=u0-d6s2@x^k*FZ66?^!qbPIxE#<4GM?%IUUq|L|$5m8A(YDL6q@h{oy7o0UekO zMc9eNwb5708#lq-IpP{)kqtIISc+yW%l~fyw(s-GUkh&k+iC|5+$;_3jwGW zl_MJygyJw=v=}0IIWd4GJ)slc-PU<2yv+fQ9OsZluwx3_VdicE^Inc;JCehDckjA# zSLxELv%R}t8iCyr*j3uS^XfezHi35+@b#Bop6wmoiMt}(do}RRUD@92FC`3o&7N%U zrB{L=YYNcg5*|5^6jOrb%uO>Ow3H|HTEN^&+@G%E2v`tS!m_UxhjYYq3mX@iIty@3 zmh3rf@sKQEx&De0Y@}tB)^LERm0H;ca&xb%i)IlbYU4U*7XP1Yl(BQO;skn9CX51_ zS>`iw%$FGFQbR0lH^W>}R^r6mEw?P%sUF4yo+te-wri%(s@-lwmtJb=buK8oqN z8i>D9rNPPAv?gMmB@^F3+u+84rjXAjmTg53PfRoM*%y}K>^jOUl`Hd-{3;FOI3`Vn zefPe_TWpG9ThY;4T3RjGh5dqI*TF87VLXXv$mcnH!qj5q{VV()0(24 zQi14(!uV`!4|+W(QwWGsfIl3J$=OQiL%+5sfUXhYGd1m+$bQ}aHnP+IR3q+`h-622* zq)D?RK-eg=dB?;8W@P95S&Q=lwvYAM%h{ReJik86G(s0YJ{B>(O_H-p;y|U)o)MIaHetE7^W0X*m)y9Imk^HntV^&yrN3HE;TPWXSd#I>nOk2E& zT8fO3h$>a?#MIy_G0UzHgEficJY5P!hKwrbqsE{hVNIfswJFtPQDwtvuL@?v7-2WH z^kma>`^W_AR5mSQm{6eLTgt;oHXLWFZ7qhwgtS0_ z^BPP{SQ~r~GB@TT5h@gfL$=ov5p__C(h}Zb7gH>SPW8v?wo=<^`!0K4Vb2|?*^mS| z!64B-^;ouOPwl%5(CUhQ%W|><57rHl&3Jl+^&0C^v|PD47FuZ=%J7&AvVASY!9_i= zm6Bp}(LEV9=oC*UwJc|02n32-&Qjk?fOiuh2^oyV$_r3oS1lezr9=T8!)pPMF+f1D z6`n&M0#|O(ED0r*t!|oWFR}{J7-=!bjRK5DdWDnOMKr{+RWf@kEhIs;sa?J3GA$a~ z3L!qfkK^ZTQIC+BZYEUGy3C=TGNxFXp7i4m9k8{1JPOi15Bb>ZQRl)+Yc$7%u?)G@RS!}P%lQm6Qy0>&f$-~p}1MM!I%T4L{MMKA!m(@4`|#|V_A zwefH(6jsCD+n!7Y(_@6toJQr1FSvk>^2DT6Fx&-Y$32$7t?H{}wl^PiLWCr77oos| zD(CB77Tar@F%j(e@{oidhH?=d5SA64S0u#Hvat{wN&8+{#Ay(k;;IK~MMf<0>QZAq zDZfeCO~Gx#JP^ML#<&!{1z8Ex42Uh?dQt!aqtviEZo~8~reS?R_aG!3#tghT0SihM zXB~4=a>??mh~UD2WJbFwq<)J#9(6=h3f%k@vQizJn`F^}Wf|XPbc^q4np`MNR~Y6~ zbGlI#&g4vn(8bkAxDt9GwtwCiTHU0js!(&Mw_zlInZ>6yjv83QbZN{Q#vIXBB{vxm z5R|U)uo>>}?!&T@O-c-LQxp4Z3#I8$$w=bY&Xrfh>jLP7H>;Dd2i9U=mOUgZ84KHK z3vDsGE-aPHwYs;!rb&t*Z_iMSP+K1{N3NV{E;h0JYhw6UF2~`f?hAaz0s{3ko@prz3Q2Ql(Ss6)arYwkeXGgO8_`|7Gy`IHZ=^= z#bX)$Lwy?*e){E|MqZXsx_e(6bsiqobi<~xj3#Fqr#k%SQiNLUW6Pz!KpPsvscqcR zgso$g@=PtwsW)6jqcpy+c__^Tw%Xo9QK3EW-6D3I4KE}CZ;y$F7 zad2b8q4pD-L{~M7oyMfA`125ar-%~MP1XgXl2AunoPx^U4y!bdx#F%J zii919orhzxCoCgZ5V&COeC{XHDx?VKcgmxN)dyB)Gve-(oC0b(J0FQ5o%~059*N$pX9~>bZj3~c z&NMpgi5LVRJ23|5oGGq*b_56M7$2I;8iHQ&V5Gvnu+88P1_d!-9M&xTSOrV0nwSRr z;w#zUMsE4G_Oj%qtF$9>?(I^r?7F%mkP$G7&m*7^rls0L)*2ygKzZl*>&8jL4I;;w zD#e$Y4t&nG)7P7@AQ^c1tdB-Ko>3kbiVee~D^jD*_N*PzQIz+@l96Fcp%o!yf(vq# zCvj5Rk*Z&cH!>Qfv1LZxhfdm1x{*Qau!}P55cb>SQ(DA3gMk;YAF!8_++~Hr4eAh) zx3ROrIa*pU~gc7qE61oc%Gm}$5zYLk``BH<+8 zGy7BySR`i-Rm0-ZGp5H<*fX790E_u`m&y9Y>41a^s4LG-qCE)15XMOdV0RMmQ4i_{ zHylN~ul(yOZusLz?8V9$mU}HyubN|X;OBuZgS4@av9-y&Obd#kN^ZZbu*W2bVQ!kp zGFSaz8`)u=q>?$GoiVy_rSjSf(GI!2z*^xbmI_}m7xfaNamhdHL6)q-nq$BZrMFJACx4nD?+x^iQS?OYqipuo5dI>e3>%IX70| zuvTO^hA>%7aDNBYJYQas(Fx?6)v1)e>@&<3d=x3ZQl9iRMZ{tH!N!@jB1jH#Cc=k* z5CNj5z8Gc*o3+_)qXf-1vF7Tl>=OnOHsWHRyjfTycqd@lAW;Ygiv430g|HWuyygbM z+OTzo3WFWiSgc87N`;Czy@zOz05aY{WYYdTWYri8S%=s2u$qNEqLK}fiG_W(p1W0=|;HxVj6C{zUcs5OIvF-A2r z-I^6()zDtk6f)u6=90dPBNJrJJUB!kbI@0fO`@L(lU5+x$B+;^BXj~XYs>R3;=*>x zW|b<&t$a;0Yde>7IFRJDPMZX7qLlPSF^kdOl4&42dB5T$&}iEBiqn^@P!P_LdTiml z4B9=s3zLLTPRO?u0%U&f!YK28AJ;o)7BdW>E#N+fOPn}` zEi|8h8#6;$`Sfdsjs@wR%FJ(;#axZEN_*;4MFfn&utV`8G|X(QBTH)ELIX`hqel|< z;Rw&fu2B!8tCW5=Hiogs)5Ql~vfLS_bcmkn9f`>tCt_&qqL6e+0mJRO3=@2fD=nFp z+Plo(5DdRiPFw_sY3s;;ath(_QrV4Z@n|cj}`4r>YacvlJQs{L38!l`LbQh}s?oQi-| zO0M^Cp8uA(HE%(TxHP)zYl^za236)TKrEsEWs16AKh7G_5g0e7N_HMfY11$e$ih#o_z^}==iPoK}w zpt5l%k-$b6>ulZTq1n}B!>|I`N>M`tBwxu0!W-ogc|awE07_$~BR!-yd%)pLi?zop z!b%7OmOeQNyO6>P8NM2ceut^(DhE@sl%{n4;B!+$UH!+J&QojpjAEn=)Q5KX?pT{0 z06YMRmSb-P7+~70!MD(yxB%zOiGgElzO6@e#~cG7Dv-zh7L|C)4C7AhwO+;GP!l{L z#WLfj4lHWdHrftFmZto(FPg>+GCKo{IA~HZLWraeYZ%|&;A2R}&4I>PD|K7j?&@NN zRG&ix()V<*!D5btxy@Wcpp9YIa7ZYeo8~H$Yqd+2SuS3S*|@n>m=>-%gMP!aZYyj6 zdt531K#ifVXNfkDi-<^&h-4UjK~&+~@UbETGtG6^H~DaM0|EO4s3X|hdwpfl#dyW4 z4n-~(fyDCQPi=|DM*L(0VcSy6%B<+cd^onII5BP?tD>MnhGH<~sfDz0P0yNjy$%!5 zt?N1wL}Yc98Lo7r>Y%;Q28+KMDEnL^s~BS^jIh9otlb)T4dxG$0v6WZBo3J;=a3cb zphTR{$Fm@fgYk76HKQQhJp zJ|7SO8>0sAR_ZLXoe6dA^ACHOt3Ju~5v#F^u=3YyzFJ_90nYDm=A^V;XEB8OwTI zgHpcPD>~X?8?9_fEBb7aQrHJnQ-r-DM798(nTvLo;{nr!7}^-4Cm^qeN4t(HCY{uY zqa}g)<$!%07yhNZ#Y!E*e!gx5%klmhmLe$nds}+51s3w=sc!h$TzE3y0 zl*eKOZi#@4XGGZ$nyOhZSkEDVNS&fy3E?oF{wqVMH7>+|gDU;Fd zb3ut5D$0!EP-YSgWr~n`(FmGX)kEQ>JP=+n!Wt9MM$Shag16>}eX`Y{&B}C&`x0$y zyLNfPXvsBeBIGfJ_2HT5+Y+e&vlGrQNNO*`xH?9lU2hTKJ2628jf@isWk5>Is1s78 z_FH`KEQd7JLV+HI>XhY*19w>jE1fi}(N9vF!c_;2MVt;k@(|;Tb6aCImJ|gBMjnb* zO!Sish31RD)^@1RC%f!D7`^3LU`zvF;OxDgI7(D9SELFGEi4c+(GH4M#k)$ofuNg* zSa+(iB~!=S$?om_!TL>qJb>N({(xxlNe2SfaV!Ezs7)h}PG6 zN^_F7l*mH!F(d(17A#2|ebAL!nEVZsXh7H!sSI7m!Z~c!@()366q8s?qMg~A8qxQ{ zNwn#&?bf&tp^%9R?#frFuDq>!o%vfT-RVxsh;NpXa=39BtPGWq5PFsb0nH_ybkIKH zG~%k>XAw2V_}MEauFN9xm3Eq)Vu-PxO!_}24w?3d$@A_J=S6fzxVkD7>wzQzY#JLC zi~{US#7Y%0W=PP9;EGI=zzj1|MA&U4NuYEmhp<0Y&4Err64n%ET*2)-5XsQ#!t1z6_0$c~a5ufQ#RxC7B{k7+ZT-K{-Tl1f~Me9DZc1&8pQ{I2~ME`(#8R1 z8u+@6%RHzwc_3+V(2kfqrZh3k&Y8`!jW)ZDgvz-mCKy>;GC0Bm|J#BMEGKW6w4n}wq!~Kj zS4pe@qPm=h@?EkFD{C~jZE?Dc53F(FB}0paZ62ar#w`U~9sroxWYwI$aWg7Z9{^Zi zu!^}Q>=XisF5Cm0*rP4EEgLyS5= zH|3-xGU*Dfxh&Rckiq8~W3-RnJj7oqfZa|OMSC7_Wwa}Y_3v0b?B}|9B9V*x2I2kL zMZS`(TQ8w`I=;z6wM`cmQO2fCK42}$iuE3ZP6DOY>AJ{zxJMR%+RU>4B z4okuQKQT+Mq(yI1-me4d)9G8)03Yotew6YBqHS`I@GN z5#RnW9gKWyrIarG6CZ}CDk;g!0+FzeJ4ne ztbb8S!PBS9GgDf5{U$bu>Kp{bJhMRXS$9<7MCGSm?J+b?6PS!r6XqJ9CgKzD9&*NM z=kuj0U5rKP$?2t08{cQMQInAS3?@2@)lk!r4WUFNqwK=8^p8w*eS}-;wwz>8Y})ja zZV#lnDfO%gk9Hy=6NPY0>PW7v%Dxt*abrwcUnqznWQJH}mB0@lvUk<-Jt(P-T z`W+RL{uvB1_E0XGJw zxR@!nvJ~Xtb2oIQ+y2F-crExCzrOe+G0aZ!C8il5;}}2JhwN_s!U-@9$NrVR<<5~< zsg$j{nf=+JsV&q}d$F@D=7}f9@Cw;_P z>Rv2E=f?1y<{Yj99GZ!Ww@~?W`Xcp0v`xqZ zX!ZBWY6HbJy@(Q<=OW7lYG<%nlP`!;p0`{@a{iLp=`TmW?29y}IewICyNqFq*Hf|! z|Nks6!xUo3EGpbLIzAo@AJ!>@S@!r4s#KLyF-X~;ggo!~N%qp1zJcux@@<>fF~F*w zBlL|xw{VYQc&G_mflZof!}D8kTRApG|0;!`>BWtPu5vWcZB2pz%m$X8k+GCD)wv%k zdLQiK7A(Yk+5`DZqeMOz)O;lAdW7X@#sCa*T|}|L6!m=3%Gy5LoLm>1tJyzp6Wf>e zK6pqh?dl|pT&NqXD92?SISB|&UXfOoLsk(VOWsaa(1^EYNw(6eO0N}SmX0BU#3e9^ z&=*?hOkHeqkbA*)(5_j7=F>g}G68{Wb$z95n$^XG7qrhzC`ZfU;6|P5>bpxpO<-UU z1jia2VodX$di^IBzRAo5H$AwwWM3AsYeB|7nLYAz>8#CxjTNl%Z3BagScYi(@lXtU zWut`)5{K@U=qeqDrhGhCr;7sYyUhL><6+JuIaIezx1=LYP5oCPKKUS%TVnhM7t@8R zl7qZy3?mTIJZ~NPE5dwTQ)6*4otiOL7aULDdCg zMNZA_`w})}tgc2cHPS+%!De3POO%5RrjOR%VOB8}rtf`m%*94UWPs0eyI)&%)yU(u z5h8D$urkqDsb8fDr+?bUe?&AR56STs6(w_D-Po4!QL!S4)>@r#+C(ea7fcOh?A;T` z0buxG_oa2><@%=u`uvr?T*n-r^@G%jYna{H#HD6-IsbaF|`Rz+DrYG8$Hf_!`i#&->Chfk^9_O%o-OzdxJ zmCF_DCKArg`DbogC~iD|6Vw#s(x}cd!wfS{M6z(^uWLlcp)4%+A3o>^#r=Xdq z4wAH<3`zTUV$d)K^@(AP2Gl>aNk!R|#rRBX7v^!G6eF65k1D-$P7=G5=^0( zQmP)9WM~(Y@jVf?3-kd=eAWukNZqXeEGHqx&u)+b49Hi-B3PRD?Kw2JV`SAH>kV4X z`8N-C*YH&Rdk3bT8!TYCV+QJZZd43+L6ZVz^Gb~)kNxEi+`I`qtg;_iRZ?6YkWme`WKj(R zVI{ruS&y)@Gz9zBUI_cQWv!VC1IldgWR@ZJyM@md=|3WI+lCL%F!E=@r)L&5A>i(5 z5EU<9c#?E2X-$Tv&IW91$=HKe42C}nCO51V@;zrt$&&1iJFFmo2=HXC4kv&DmuW1i6?0quoyp)k^10|A#m61EY zk+N)2Fb2_WPro>@$JjjEC%Yceu<2vh;j{+ln=CWBDR#&Tnwp?wwzm#03OkA6zl+88 z|C3qk-N%#?At;%Ig3B=ehT8cWh%IAcBITq9Te?DvBs9i4BmAfr^feoYY{n zh27oVUD$<Y}LlzMGG;j_}@z7`(=E5PH}2k$|_aptDh=|H5{`HKRR=J~tv^w^9(VmtTgE@Q^1XPF`DTGsC&De8V+?{DX@ zRG2)OwV?Il#%T}?J6hQ|jdl)cbt6yT%?$PS9V7d~x9?G!>+A?N{Q~~g`bbFj!*l3L zP~R(VoRDEbg>k&hFGksGFcTHxUz6h;-!$XYQSH>QW_coy`mIes997~NihW|*T9Kl8 zl_vt!=wVcop&oXW3VI2Vu}5M>WJO^me@%&peO;FzIhcU0KSiFMNx$`n%s?AZc8*zd z4J{v@TG#xlDc`T|t=%CP(8wXS64DWMF$;FCN_Vr7@ri);K?=rRyg%qh&-a>1Y>w#j z4Qfjp*EB)+bOH?%>hz{QQwB6%2Vcaq`M~%XVNws=b)*Z01AKh$oebNYh0KI9SZAa% zY)8%aOxSrAFwByuDMD?fl8qfk(Xtl;6ZQxA)adIJv@?l?M-q+bh`(I8*p?7g+QH!q zrFw>5zjmWI)X^MX=LNjR73NKXB@nmZ42YyxNN%n)a@=L|W|o0^tO z8vdZY-VY+f@Os9Au%|T^G2Q%q^|K#uhK~jNg8h_0rG&|nx{*>!&stU_~xCri~LG3t_ULkk=cjIG+8TU_@y@( zS;z{VvI)aynTa7~CfPya&lZzkerNzjn0->AS^^{Ojc_c{IM%TAbU`SXk4~%1av3(B67bsdy8*!w$bt1rv zDQ%+?9)P3Zv-nn{ZWP%Y{OGK@mym(IH+as zZLzVWTQA0yhu^Ybg#$BXS=ae;*ne8A(enZRVub{w`anDvrnDc9t36l1YkD%mo$#gc z=ws^0ORcP)*7XYKm)@b;Csg}#(Tk0D?O#!ElG%#2VrNSdQRt`$Ab5t&$r^kV|rCKzK*!UV~m&80L)@2^OrY? z(^MNOuBdfb!!)-QR>Em{vzE{)k~(hm*%M;n4r*kaFm)c$C_iEVAm^bNC3V$AeN-p? zLuW|@x~o#GGP>#YcRRqUCw9B}JFF%q^=4k>gVWM!D{uA16&c}Z?~|QTiDwz>g5)(*5VVIm`(8}>}A4@0;CpC z4b!aGvM%Kwn8Z&LX3>}H?B*j?s|UwigJ0~xj=~)y7PUJZ_UURxB~q*RH0?VqHfM_t zII`s=KoY5kNrA@dDJ4xH_7J!<&^~1yVIEbC1R1l<8AxDcmN-T#TlJ>$A;669qgX32 z!+BAfzDle)n4K6tm5f}Iq0g>@QejyaekoZD77Tv72BVgtfMn;6@7} z;)5rT3{3gP-$c@E3E=c*SoBgmA9}E#9rC4Gj3gP6F_OjG>0man z=|Is=Vy0F48*L^_4__RUSlvHFHnCBUTBPMBllerC9xP1>QX-4!TV(cx9i-dd1Js9} zkmYIqPd`6yVpyBhIUAxE#i-F-a5*_=yw$d@1DxkJ{xap_MvG^5j zmju%cUaxl>!(bT}VQ6e5*3!U0hM%z=M67In@{^>AwmX&M%gk~Dr7UOL$A zjEC2tt99J;s`vL2G^^Bw7sE^+Ub-@Uc(>E^p?^Lp(Az!{8Q!h4-NB4|c3NPO%X+vL zlW0i1z?e)KJo$>87D0_tP9gC{Hq2|+oGtcVQ^wGl2B7LGma5q<^`%572%6G*HfvWA@Pr3B7w2 z4P`FUTm4#s>Nk4xNkmr@ad`Y$pFrT_U(q{N{w+hMVtYRuiG;n0r5hOB*37n~dDzWn z7!Wvmf5a9zepLFRr-_~jsmNVauqbZJVak%S>E$XqMHr=B9TMqdRbv%l7B(qon5~57 zqO(q6KEn+98xb6`&{w2FyNGb`*)$^7*@N&EIG)z!v5&}3TUlyR-`gyaY%5xYZS!as zI`qe3Qsgfw0iY*j*%Z`>lNHknoc60vi!n3U80D>yNXrbP2c@8f>Ps+EW=uV8Doe{< zAzUcw0Qmlg0to;+6-GAncZVo8js@7AHcl9OPPvp3Ws z3my^8zT{222C@}l^crkDSKg#&a^PXZ1(7{3La|i=T8)a2nQvTyEmuf*0b5F(2b8<` z*=Q*pO?{S8)rYodn0Sl_l+=OAQ3nT_>|pl-MLgL)X^W8DRxGx7pi`to$(zDA4pZg^q$2c!P*g@*8G3sb!>T6AV#B;yi`c*r zqpC-qya1E6o{EQJU%T>C zP?&2rhP*ZFCVzwg;=^a{_03{M?0dWEn2|I_#1bl6dS9rpLO}Lz?J67Q2#PMR+7`yb z+@(>qF$5!Rmc139$z0)dFiV~qxYKQkC}21&O|78liX}fo@JK5$%I$b0{&I1o_3$joR{Tq9(@uylAy+RMilGaP|NOqW} zY(nsZ49SA^QIqvUMc89Et(G2?&t45x`!k?m2mQxTc~NN-44>ln3fVRJAerQj1PMvJu^=gYZX4_KX5EVbOA`I4r6Lr z?a!`hJHyjD7k+>@G+Fwbg<;c(X=omgd}s?FtvQ%RZ?KqaMqb0@>?5{#w)(aQsr?d> zs+l+6i_j17Y@^j3d)!D$rf|$xkMQ=1-k%cNY&Fa>Lmx%+R2UK_3T?aKj2b=a5n9*- z0@+sf-i+FUIm-5@Cb$wt1e&pDuY;C^!olPzSXm3)#^i^)WO!1Q+WwP%Dg+@7Ph?}D^ zQ84UMC6)H)IrNA&r;oxmhz!Pubr0Q;tTO4<#-Mw@GZXrffcIa{gz1*_p# z${0MSsgt7I81({IUeaP3w}&yr#j`)dIcAQ!>xig*^uwQx&?w_9mVGZ?2{dzTr9r1W z$%JR)jbUN%Q9DRjbUz{`T$h>sXwO>!B zAcyu8lkNXf0K}}}(N8-%ZKpuJO-lF%8_!4*@nEZ;l`ndX)_x2o(XbuMyh1u z-7VLlcL{7$EkVCi`W$u&H^e;w=h+%<^!h`qzT+azcbdoLujy# z4vSYkg(=&=AFYLC_%Rs1OIUBxY1bslk{7mVXUmw`5=mhZ*sIF@G}x>swX`G(js7Jk zX1tkXoP1A}qCde@|Js8*eAZ zXa*5{x)mD$Fn8(zw2Xi1HMF&<$Zz0LWF{|3X&DV@IYg8B@+Jd@&425GrZYb@HYpg< z@>;F?b&$-MFS=Fwp{)IT_hrvqbz?M8+mxP4`TEpZX3YM!rzDjk794q@Vqux2wNfye zSUoaSqJ(U5?nTU&BZbK*gpBE9OmnzT2-TC|6Ee?)9#tf}5PAlhUe1gG2W+Qv5NsRg zZsgF@X}_xGh!i|iH1%k=e>x}Sj1DLYr2?0x`+PnnGGQs21CK3R2a%ypUk}ucI(EjO zQsNI;iz^pU1S&RU3(P}9{Y>46<+BO4cSVFwYic-S*bp&kX3~CfmWkCz$_2V>dUkS} z{j=A$Z>+@ZBe-EuGm8)MF{O-(Ds3PxGpsK%E!d}pGqjb7#%vaoYRnp=*ra;iV4cZM zwnyLH?Y=-;xa?6xs=s#Z?dWSdH5^(s_0%leWVbCQdP9n_k&8daY;9*AHD1D2HR35t z)6`9tmaTG@CJMTrg)nAV>e2pwUB>0ZhjV}e~? z`%qeVrO_Mk7+R;LTqeJOYhz5G{}#4l=w8-P7@UmxdeaQ%U@;{k!teaf;53! z_!2~lq4P&)LcVuC%!G+?qG4~}#I@mT5;AQgDX+?ua&A+wI(!4?2{jf>f@;mLVZnz{ zygnVTH#3sGP{AA3kL_MnMo5YoCdTfY7I~o{QzC9So`^H|vyE}sUU+QUa1A(l9z19$ zQwU!djRZ;Irxeo!B3j{j8WKrOZH9{s(LCmv=qRSh)d)tI3Iz&3{%DMTM1^30!?Wz7 zJi7TNi8*UPrpgQpJA3Ob!uY%wL{GM?&_UU?uCs*Z@HUGPDrH@bZ^T(`q&q4TM4qTx ze|ZcpW#J-!{5YDSv=lafYzQC$^;*qobm?f@*tqO)OWEtgJqs9Bm|;Td-G?wemSTE} zG%|%zMG<=;uup}s;*Gb~JsNUbyU z>FzL}b}tc;o;{K`*}mwi8>BGJgrCsJmseC*(|WmSz1_4vMCKobtivX)?=1$_29$rq zgNkG?(cV{(ZTQ40)IQS$jlm7+fKi@E>ur76n)Q~Vrk1GULTeh;UMyCk3_3-@0AUGf zHR|Ew{`I$*)#Fzl1{i$s2NwhXSjpzgONu*cEfj#^-V`44w|X53xk|PPvH5^ zKs99;$gV$05MAPlj_qWn7+J2Ba%8=}97JwWIc)SrmSL&0?6OK9d8GDq3q3MMk@-rA zY^@^0{F)xt$YP@hggV4!`syPr4U1)UEAz(?h8YNNRcU1u^*>lum`$G}NzE{Lo+32( z9_tT!rO6JHPRKrq3$lTrS;UJWkatCPOo*^Z>?9$ckOmhi)@{N^mQiRKz8%DBQyV{? zL5sGBj9bet5Vy;loAo-QJ(sDRgh!m2x}&qsBF&MlpCF?Win-G>(011{Tsut&Eu$b_ z`Xeq}XEst(VwhpLjs~7QTkN}^agrIi)kKd(2`Pa>!rqk_ecxR*TS}&ejMYn=^&oUa+hFMIgqIf;SSXzVVO_2ZW|=$7EC5X$ zli^={2DC_58sTfTGie6fA4;veCUQyBPx?L$nbUlPt?&KIR3c@mkL)1e;e=RLz$~j! zh~y)N@z&Ee9LAMKykLs24rh43{TUkUfJP*8GJ}uCv|9c9ZWy{qoM+q0nH+CO2<&WK z=8+&~EKb{{4?1L+d)xY?dlS57I18s349uRgo0k-i;ucJrYy5R;k`8xqQ)a(S3W*fS z(j?@UvEIxhnzz@HCAYQC`{u~m1>_jX5)As z7Xh`<_i}Mfli@aDsMWA1j9J_6JDVS2e^TePqS1$_t(4JgSw%N;EJ2jsdT~gQy*11% zF7vdrX#(E5c?&q#wjesFW9up}?iNwv4G0@9Mz#?x*lVVtNZB03M6rn`i9D-JuX>4p zxTf=VetqX-VQyv(VnnbzujBi{sf*~;h3cL4k@}35(p+ZIL&r8u>;+%{rh~1rLpf!} ziRtdqm*4#d8B)e@tf$Q3h6Jx>+Gs~Qp%<(;q^jfGu%kSYWSdbhn?X@ga=AGVk{t!O92G=3Qvq)Io_Q#?pTMWr?J z*@m!3kPw#FFVc%8s;d;&L$&Ce)sP-LcQSDrZ-0l<^YAnWg(O0YS`zp0{ssU!g`JqX*8-3BzXjz5{H=n%1L^_U{^K!I5SQXLy za2Igagt-VPB!2gof%$$PjD>DEM5h;cfhy7>i(=!`HeWfwA69^0nuSkUM{ZFhp1)Do z5ud|(RC_9`ZeFM&K-SY)*!!Cjo^ePOM`ud>vNCODw=!5Q`wJ<|%FJORZK=~1s=Ban zs)JAq%c3f^-DvN9A}8y5g+Zs(H$_@m_fA_!T3Po=Tcc%ZVh?$XIO{Ng7)qNJ;212-$4015|G_kH4R{tcHP3$S{vs?FpPUn8Gk4d%b$mW5(#+S%l1lcZ z?Wa`I^hze+Vr|VMB<+njgx|^f?ZZ^d(9_RkH>7kVVsoaUMHVJ)#Dy5xJ?7=6a#%KV z9!WQwG*L!3(yvB`h%a*$BS+VSEZ2~xS*0d;bR%qXa#)nu@xW}+M0s^2%E4G&J!nLxxqNKORAP*GHFNKzS!-E3 z%j{^qFICN8b! zAgfEzk4Wdr zxeQUSxl{~hP&wZljF9)s15#8p<{}}(7*{X8gAdZHJs~R#h z!%(eN=aiJ=2>8ZoiHR*IDU;82Dbo~@hpAY;(|TWm(41xPMF?FgZ9B7SlzmCpRj_$r z%~T~3krlZbxsofV?QM3nuql&|HY8iV$i5S)b*eJ$tNj;_v+OGUafmEC-xD)K7V9yW zEI-Oymc<}#(q!3GHR^-OSysw>UP*&TKC}Flz=LF2jA72svKSP8{4UFKFuN*Q z7S*#RbCYpmcBPd-iq=X_HqPw%f^w>0W|37?qb8nond4w~L##jeu(PJKC`nT@f8HP~ zL)O(G;jXxLuo0SSzD>S%-IYQ#*f_Ug7Wyk^+s&Ifp$WChj+9|aPvn^jJ=dc_Tf!Cq z#H4wuAHZ3@N9wQ>(w%DiP~d+!xya{`a8otQZ`r~oz6G7#DA5qj@>p&sXBua$*D_Vt z)pmqKmkF}`(HzWn>nTOG&U!HKW&764qU>U1Tf(F+$g(kdzpjlld*8ZaI5eE)!_&0d z3Zs9S<2G`rYFxP901N}aR?l)R)#G1{6Fd#dj4somq<-f7`sP#>WjYn>jC#stlwP6C z?$RP>St-)#;Ewfm@a#6Ltk>YhZGFQ~vQ^lf`IFY;IJ$P7N>Y!r`pZf=mBMp+CUbfvMwaGuE8her`^g~6Fv2>w)YCF5gBUj)G)}e zp&CZ=EQ@QX7&%dlUxQeh+Q!AHx^1Yk8!RI^GUtkUU~SS|5tU+yij5Bv(qhb|ERC}J zPBf}xShF*{i_!_1M0C}*lEt-p0-QRcbQ^`Z;!0ZbCIIKO}#?LSkSogb?xW2$T_sK#$CClYIzK~k|b$hO%LKApjlQ@MXT zA%pICDM2-#Umb)HsoB_2RhzZ3kDwHZ0Bb_Nk;<1*X+<5t^L)NuUru%Yu*X&CqmwCT zTU3m)=ls;ryu0IDugrfGRCYwK?}Bs{)@nHS@&O;@bPj!ZW~FH09!4&hom&lSM(YL>Pz#;N;oti2jaS@~6){NC(_^Gda8 zlpjC*Q%3Jl%{@fmKkQoVzX&K6&qpaX-gk|jKuo~3Y>PC-d9h%ZvNO>=9oMWCwu_bDhFw?Tue*?}hTSJdo2AEKv zCBK*p3o@8&aof3mMpy}2dO~{iF)+)2s821hjGUS&VlK3XHLqHOIsM=QX&W)Q*+zr8 zRoW}xP!L40R0YdWvkoo1LEVW3_T{V&zk!rablv;~t_s!bX;uQ5`2A&&Q)#b5j^Uy4;i<=Qor=X|;~J<+JyD5b>oQbZtXQ5PPvopd8%FaQp}Xu^c&ie! zuQxU+2l4{k)Q!9n`NjqgL#6Z538kR%?(5Nf4f3PZg{s-9^HkW=m`-cDCKCym&JP&b zl^`bZt|{u}jaDBlcx|u40*PIsBPdjAv`}U(kfCC8>wN*n@NOYJwb_yK0@I`-Hj`DO zMedC{s6r>vm*jq4JR)go!%EmTjSr@aw zok|xW5A|!UZBj&Godw^Rsq8U?)sq!lDo71-OHSKmIeIn%W`zYMdSg=}RgAyWVoDY% z(ncQ)1zCtd*qX1la|aIAXI?YJNQV&Uw6l=2MFvJ|!z^BqjLcE^$P91ACz)rZVk*^Z zd66U4>6b>4#V8IZrM!+phBJ#rm``<7I#{&ii=5y#wf7qtBQS@cD$RWxwKHZNxtQ(7Hw+nO zbEIn+!o#ZEc_M0>)^q(vdA&vCkP1hGH!}_q)2+wKHKd(u>~W-wei8LdVVQOirU}z(cseyo(lw0IH`vvwv`;|S=Y9jGf->$tfu|E3^Fsk zQNXpmRFLoPj%QfuFC^8HZTwS+KRr7_EJVN^qSS zv%N8!?YTsk$wo}h^kt>dQHM;+k=i@Sv>@x1+Oo{FqjuM^^R>8^M-~t3@tKlCWX9q&b=PzV0Jp9d%1T*%>qBXE(3aJq1XVIH79O+jMJY<84hB zimd&F?>7U?KH{n*C-xknSw~a58ASdqPBOsxpi#pI`PeeUhVkRGOt1Y|IG>wZJ&TG+ zcO5&E`mSTklfsf)tz%!y;#spxx|kO6sEXn+HyNp^qF8pwt5$9ymzdgzuvt2sdm#hH zHOlW=_7=WakIQ%tR$dUU8}luF8Iw~}GiyI2!!nyMzlJrhuneiFOT|E>OvU!P#+>@; zS++0))tuK!MJ0wQZ8DMB2CRJ1&2Pz61c3FXg*K1fw>i>UZF^HixKn0MeyLB<%_MOM z4?CG2whp$uRA2U0o+@~B)aNJUCCs*x=~v^!3|4^=m!>dgVegcfd#RPXYz{7FPE{Sd z4<=nu81&VAqdC;3s~-CjeOZ<1I&_0of=3MvZ00o1nKjd%nGdZZemn9qT!(8TL+vbl z&uWZ}RpE0kky)%yq_3*iCxa9z!bFax4r0q#52AVx-cH>!MT#=~lIyIUCCrLwgnw;J zS~w&+E0qnip6VgqGG#P^g7_)ZVrH{MbSayW@WyOOF^8xP=lCtYbe?@x{~@ z7cVo@j#%1mbZyE!Z)PzMvN!w9By7D5$?s1P#v~9(x0#+zx?m1yO$uWDAj3Wi%UaMf z>PJm_rwB=we`!r}b1nFozD*V_eKEVRk=YDZ2a!!E(6X5#vP%UIr|HPvr&ik?i^#IvBm*)T_wC9n5%JWq5E)Z5dQ|b~%Cg}lWvtijLRDJo;n&nDA&8ew znbC@=IW@}^iaoRJe1(`5(o$nv;Tc#}GY=!3&hooHJELRki#Sc-vLi{2!mOw%cE*9* zET@cYNxYxs7Opa~>{Ns7D(f&pR1K2p*_qsES+D`u@QiS^KVrOrI9%p_O}NeHX=P}z zp{ThMA|jG4tzSV{Zyh~mZJP|UX^p(vMp)XI-olo6OkFl5csC0ZcBQNst#s6odZgS_ zgF9togg&ya8>BNe3>DpuNqHHhvpoOpr6xMw^WWaG6B8FA@sM^v!;ZCqH2=%zx=H_+ z?+xc5>`4EI9IWm0zjLs*@9Z3iY}rvb4fPGAy?#IIrn-KA+39&QyMct(a$GlswLD}; zU7{TX&JF3n;06*{ua|X`S+BS3#A-rjXafnYv+jdAa%fJ11YTQzHSoh`iU6% z)G%SeFUi7`bd9a!g_B`iSN8K;Dl_Z&s&1S)PkcQy)&!)~5S{<<+k|+de)?LixlWWL zd6cVhrupiX(K-LiA3HJ|PPQ0USEn(dFOn)SBW~DlO=A;V-=fC<;YsJ8rsy7ObWLN! z@l|m1l4_QR=KqM1<=rIhul`r<^)4OZAF|qTYQ13;!)NUNBQZMxk-j9Jif-MGRKmfr zM%#p2Ss{6A=XNCBc4k8Wx7=MFD9`AFF8EPS z29l>j*A2TuOmZ9Vmb!)H`DWJyE~i{dXRbRscD2$8zIOMy>nTy!V5zGN#^Z;yT|ZZt zgT|e%AHwV3bkfLkJ%dABhuB>FP33Q8;y%KTcPrc>?ssL%6$X{T@u10#<&Ouoz*16N z7#xq^``piN8F~BKjdY#xeKw{;sNr^`akjgUGLI#1-@D^+tHgFZYHOf>g_O4wah*;n zOR4$uDd+j_cQDY6%vsaAAO2gD^JUa!Pq!vHm(Z;#@i!q&rOYcvwkasZsxzI`q}?t4b{U6dd%SV>O!t~0&79kGrhbx}NC=OOMUTAas>(d(D5V46PiBhz^PH2xKX z^!n3SUx=!*RM(6u86VS_iK!Jp;99yka3F96*cX8U>$thvOxGwwY>FQD2`9(!9#o1@#DJZ<6nkXm1I zz6;nj!~bsR`+?oT9-s~ApQ@JxV=CzefW5%pq&JWp`@9#qLBv&zf2CalNMRp34ts8xo5q0|?RPAtw1!(Sz+q9$5d-E?)siDv|EBk{WrD5GUYk$yGq zHJC?RT)u5;2|EV6vD9ELa6s+0FW3)zwbTC8Y>~z7=)nnh05}kvI{c0Y^_UyL1j0;2 zodhP6$0_udsk93N-!+1REZ^IaPSQ;S)4>cd6SrBQiB^-_Y%m8jgSptx17)^wdyEmIws{;p0hWU&8HZ0Xik`-= z=Cx2g73ih;0N#{_zC`YaF&6|$7XxvS2==gkoSE+&?8~X^V#_)7I*6fnE=dQ;11&&4;R=F1p|7gL zKJbJCTuZ_gfmZkzO>2!l>gyYkb{p*5f_CWDp6U}DV{RYpMaz3Swh3W6fR5O!?`(?S z%|NF>=|GRM-yCca6u2(<+Y)Srd27%WYy-B%ZadHoY!A8z{oM}1-fqWWp!LNb#J3av zb_VLBJyCms-k=X|eJ!n|+Xelulyx`a=!brHa1Inyv%*u<#~zsbgEIQi-l_4PbbI1| z0N4xc4F-Zipcs^ZQlNGyLoEjtU@#a0hJs$cVU<4RR-u3~bKsBfVqd_eg15}Qv z&d1_^U$7t8pZtvj2jJ&GPzO}rvnYk=Ynpx}-FW=hg9=7;Ls0A{1ftt&Th-s5ZepNu zxtE(nJx&e=xhd4mRIrGdq$TBPBle!Djqs_Fs*=x!BDE^T7hJ5G(?V!NK4Va40y8 zesMVQYy#9KQGZ>6+Y#VMa1=Ni_hZ1Z;5cwREH}-CO8Yb zv%xvwTyP#ZA6$Ujh2SD^F}MU=3N8begDb$5;3{x6xCUHHxa&ywdTX10?gq>^0=2_U z);?;ta;w9e@qY`r72F1vg4@9z;7)KCxSO!|fP2Ax;C}2L01tv?;Gv*`npT@6+{3iR zBcK9~AYuK&xkoWS2Flz_Z{vuo65EUI44W zi{K^jGI#~N3SI-RQ^q&Q+nea$0&jzNz-sU=cn`c!9@c;lz=zb&N8n@ZKLMX&_Zj#c z{TJX%@D=zPyKlg^lxYt54tx)O!0t!z6ZjeYg5O`kZ{T36{cWvDI7pIzCYq0Dk-IS=Z>yl ztP1YDipr{j&lv7@CyeNs=-M9W`;(?$FKCSbjm10w>;?7)1Hm9r4BF#ff?66I0Y9U( z#D^8RGSV*x6*1AZA#N~rB|0^P_=f_`>1Bi!9n)MdS~iS$DnS+b8y@RoG;9RskzgOt zkv80&I7SgyHK+ljK`j^q#^PsRupihT^SIa+#GG^oVD@o9%Sn3-=8mLS2It%!h=Z0K zOLcIdxvMS`u8#U1k9igL^{5SC0+da= z;^!i8F?DwdxRiLtkltmemlNg+a3#1ZHU@4vvu@PKqIwwXu8!^Nu8HmEu8r;Qu8WOx z*T)WUH^dHfH^%DRO)+G0v3hq)tijzHo8WGXO>|3%@AlXvcSmfpyA#|6?gsaOd&y5f z%5fj+{on!cAXo+-B46qLo3Of8ovU6S#=VyEK0`YL)qKpr1wV&b^4;OSrdTMJBoI z%f!78<&0x~g|M%JHcl%!XgmI157T^!dPtCV4rAoF4Z=#HTVX63%gC9T}R?zBmcT>MVV*V*Mm-tn_c_yn-`fDuS`Bs-dqi@5?7_X?3 zb1clzFM`KggzX}WLu*0JtG`%ytv9unb?(>LV%ltx`z^M+`yD#+2a){`KYxP1Vh39s zzmcE6!I$74Z~&?Ni`s+!>f*?8;)hUYio^5gZK>N>Tr~I4wd`Xqj(sA2SePbl5Jwgj z_w!9Mj{GTpcq&W_{0MkPb2AeB7ZyM))Vx?U+*yPKGnwBkZo9@$hW<;z-np^s#?g<8fy};gJAgG`xvPz&W zVr~#=6;tk7TkFA3Se&OZf}*@RSBjnb`zFw*1mVj-IoK<%H3fV!;Rj` z#)5spe(?+3{`emU4j{~dpe}x)8y~+YERzpcAHUco`fnHiWEzclPOe#}fFuakjf z9#i6y<|NoL5xtgF$IF@;<5w`#rRzcMa!}YdtB?RqBi`wRnSm-gG&6p=n?+nrm}i4I zpb__GFc-`N^T7hf@WS|&;aI=QEh4Xr!NK@H1RM$u3)3k>niTaD$x&H$^BZbkV#6SMqF#&{O`IrN)$=I18o`^L>-8$0?s z>qq>Zjd~6^7pPq4p`H&epe|J23rYK;_$|x>zCA9+{t|F0*cpG90gXSUBVMl!EBMal z_cnKVe5tzve^-L5@OL%Pn79VCV@|pj^*V4pxB=V2ZYMu? zfIIP%hyO8sMq65riDN}P|Oe;m6fP?yK=OvUjec2D8|X|MwQGvHb9-2XR@yHas< zA#r;Lgv-TD44r$*#?xpy>?q%Z8yjX@L)AtpPJ=VM6Rr1u1exkZn zeE}3jCER5HI_fHKz>lemPtbpg`Wfoy;3V+B*u%u< z+fVUoZ{`c^zXV@_ufaFqTjH3F+jr;}k@N2{{{VgjKY^dI?}}768oR%cpI^bQxcvtG z_}%g?p5W1tj`)0Mj-@|BKN>r$kPL5R`ReTcM?8Omzrf$%AMh{nx&-TY5MvK=Id*Z> z1b7Cw92iLTg9BKRi_h`>v$H#axWzAPjH+*mp5_ooQTz#L%5s-Wc)zAvjs!hgH?XE* z?$P=#iI6~H^H5uWd?4PvfbDX~DMP{u=Zou8`0LDmx5~&|Ox)rxA#Te1!(=gE2?A#yP@_2 zyMsMIf3PReoIL=w2)}y~=iZb<^*#`F5GV#EpcIsWa>`Tz27@6$bupB1!$2jdBCg?J z1Q-eS0i!@Qr~#uvEf@pFf_=e$V1MEo2M!>O13?`akGUQ+pg)Y3n1FsFekXy+)X5Yu z6*Pi_u$zXz$LMp@(LYVy%pgBA6VJO@gwy#G$=YY*HV6OBU@n*k<|kf2rn|~5NDOrg z@wW&pCa&4k+rzQz-NA_$-64sK-J#&HM7}#5EFtbAz>$PM3LFiNNxbBaO}y-mBaPz| zJGv9FJ2CN;J1HS~(<|^!uTY9ttUql-JE`s^5B5Bh`eMX0CEUrRul{rjaSe&T3axpS zu&-L!oe8UOr{eZDV@0&&H1d2p`8gwTl{=I2Xva?Ncoy-T4fbL@o`ZTWI1ii;E+G7c z;39A_xCC4ZE(4c?E5McDDsVNp23!lS1J{Eaz>VN0a5K0C+zM_3OTq2n4sa*9E1`X+ z*WBIc?;)Rg(8qfdufv~69>*RQ_V<$~<@o{J%h*-Q0S;*GrTO7O8zXN*XWqpAO|xHy z--m$cRvT*RVf;Koy+4{bhn;Ed1fFC5G^QWJ-{as3upB%Io&rw;^<%}O{)5>k-UM%f zx4}DLHFy`i2i^y3zz5(%@DcbJd;&fNpMlSb>kIHD`maEBVimi7KHpy_-f`a~R=aP> zr(_%7QHJmF^8@A|QGWtIgI~a};5YC)_yhb8{E7d+@cTFFKbZdoG=K{r@Mn@n3^k6> zHUV;S-gdc|lVCLE&dcFk0>}pixEF$!pa`@At-(g14QQM5u4{+CjY0by+9*dn|Ld*; z=8j-fuo>}o%6ZS~w{y<*?6O|xHpgxYP(lCDxadM$TY|0dzcp%CunqccQMUu#&~FdA zgB=LBBj^Ek0$MljjM@{oUZ6MVLs|Qx?gDnr(Yz6JyJ6Q4?2g?Y`0tOpCm4W!FQ7Kx z8}mRgi2N2~*AKfA%%z|Vl!FQ|7!1LEDC)4B_mT2Ob4Rp?;p!D zXBhL^BX|~6W3BsjnP3)Z!frO01De5H?B;>_U;$W&-6F6U91IQthl0bv;kYjWM}Q;2QQ&Bx zdOQaAW3ApZ_jJUch;~YLFWLDT_?|WN?lm^1_hu{{XYIg#6!Dypqcz+I@N)(3#GC?m z5^g7hQ^2Xu?M5_67J7dI$HImm~(f@|q@8A#g{{w%b{|o$${yFe0_y?>6|B`nmLl@*iYk_#ZIGbY$Aexth znhTO353~UJxouqmD9ml+TIM3%#I6-+oeM7v+JLs89r109+8%5II)IM&+Z1dDI)Tn$ zbFc+&UBH&;w*p(E?+UgdZ`%^jcGz_T9cZiVvF{Fcz->p+1MCEL#$QkT^a8y>AJ7+n zyMSH6ZkYRl-O=xX+8^vmm;tDJfxW>%FbMZzQ0umJCAgQOFC+f)+^<~)=E3+G0(8de z5$b3t`iD`6{8%>v{5qzcFAe*ca>v_6Os@0pLJTM_$LH)`JF1TWgsg-FBR4 znSgmBShruXpN0KoFa_)q`_4^8Z3I8l9}mj?!A&DRPxC#mCz?MU_lWM#KtB^?(|_nV zc1?tx4d#GmFc-UdpcdLPpZp#j{6u&BiIVpdLz`hoRPTGN&acbq*(P@pem4j{rx4qi~l>KQ$c_7aT@WT4$c5) z=1ShE`JuBrEBAloUwQKRJsbb$pg$M&Ja9g^0F>eP!rVV8zx?VnQMw%B7jqe-7v)ZH z7hAf2vwrmX6>W;e|G~%K?hgDLKuyF9<=&wS5HR?5}*P>nru19|Z>W$R@P2gs53%C`#+i+WodONrS+zIXicjpGd zJ-M-SHVO0 zJ76{L?}GQxzmNSI@B#P`d;~rQpMX!nXW(=21%AII%va!R@D2Djx3l{W^?UFG_!0aB zeg?mQU%_wSckl=JANZ4a{sMo4f55-k(M*meax{^nyGlIb7?O@;T@vJh7D>+Tf&x$o zS|;I#!O`@YR(NU+HbSh@CK(IbCKG|q`?ka1#-Kge1atr$f#1u@Atd}Uac>4X5my`Q zft+E$kJdMvqjJ{H{B1$}UBH%Lt7H#&=!oCc_7n2X=L3 z$(BKRQaoW%&0kz!ncO&-mDCAANr5+^tVOPg zHkpmv9Q-$-1Vw&f;4?gs05Q^x3q z+5mb>z87&)v;7ABbO>%E-KF4ma0j>(C~tRxyTLugA%1xg>yUfN*L~prWPA4j_4Hs; zcO*8HzTz%&%aWaghlu0h>@~60zudRYOCsZAfyyThW)_)msm(afj-Ujc0)!<$59(bSl)_@Pdhu|adF=>ASw8td*gzElN%%9=*E_L}i`Y#Ck zWpevqqjk!aa9@$`*U9d|H`M>P;Jf4w!S~RYAHa{v9fO|;|1xJKh!@vm==DWNimz&3o1oHBF2W>b#%ngpU{PYZ3;GPc(2v#)NotTWHxnLE2rZeWviA#G)TadQes|)Iu*lh*223^4t`o}hT zy9HaWlU_u3w{_c+ukAoLD+704P`eX$2e2ddJ-|+2XY6}|UZ6MVLmv9(wQ;+EU2)$H z^drpfU=Q5;gFVrYixs#5_}we7AMK_2yTI*D9S#J8KrtvGta$EH{Fj09yxsA;K047a zs32aQrP!V@6~r|-Zx3dyJ*bI2XgAI4{evO6X`gi{aShAcGvMA2?(3U(GzQzd$~@g` z@%>$Esw(m;`C4Y3ccQNh&r|%xZUpg;B#nJQhZt)u@>C5rCY2i8a#_cY&KnTaTKny_ zfwG7O_%zGmQT*7}N%OslWpC?)V~D>!{d8aIW-NN{tsz0$P+1bRo8l>Q`;yoF$jAO* z9CinQ1M>zE_u65-tf3BnTej@n={<|(8wFxZ4ZZ_sQpc%{s^T4%?kNKpzAg`S9Tuzkb7H?Zl>Mta&MPM;F7(a*L|4?uk zI2HM4l&ID(H zv%xu}DL#&K*3fNeICkd|=6rC0wcSwoUgs{v{vym5gIaD9bSC{v@+yK$!DZlba0R#$ zTm`NM*MMumb>Mn%1Go{~1a1bmfLqDiZFxh2rNnc>WqklB&kurS;34oZcmzBO9s`eqC%|&>BzOuu4OW0>Nc-8mp}}+LSAyrk z3t$y^5xfLm2Cslu!E4}k@CJAjyanC{?|{|dUGN@wAFKf%fDge(;A8L!_!N8wJ_lcb zFTq#fYw!*D7JLW32S0!x!B604@C*1A{04ppe}MmiKfzz%Z}1QJ7ck{Gm;x6AagYEx zAQvP-9%upbK>;WPEkO}z1zLlRKpW5&v;!N1_Fxmx0dxeLg3UlD&>3tFwg6qgmS8Ke zHRuYq0o#J@KsT^G=ni%OJAxiyC$KZ<33`FvpbzK^b^*JB-9SGe+2-!3dw~96PcQ)N z1@;C5!5~l!NYRZtrve z-jWoOC$d~7<_rcz;l|^5lW^HqP3+>^Jg6?o`8vTjjBych~ z1)R!d1eK)+w~h`b>}jNVIuMV02I`r_eHJ(yoCD4U=YjLV1>iz(5x5w?mk`&b;4*MI zxB^@WuEOnVa1FQ?^L5~Q^f!PT!A;<1a0}QMx^^q^-3DsO*HZl64(@1Cg5H@ ztAJ$EFQUE#UIwp#SHWxGb?^phzX{#~Z-aLTznbvx;`SbRAFKf%fDge(xP1&h0iWXc zGwePGUts0Q!9OiV1^=QV9CSf`4SiQU7k9Yxi(DKeKofG4Q|S#k`IH?XqHwUyoCSbJ zq2_}EPzYLrBG3x71_@-#8xf{We!HM;J~z1YN5kumrk{?cpNXCGcn9 zknN-28g#{NoBT1sw&Z8K{QX!b>_?pY*|_PJzdtgT{W0&4c^qj#2l3w>C=WZJ?g)B- zop9S3wI}G6uYIZmg5LQDGTsg({DBrw7e*I_?8@MRkv>_QoLrQUbT zhcBiLXH%Yjgo)PfyQ9wss-HbbPxW5Lt-X%4OMh#dBDW{%fc$#+)_UTvCw}p%ZQNeO zxpzif1JMrx#TK9LOtANXUiH)hlz<{o3d#gl7fPobRDi)?2p9^K<}li{lKfOrkHhmP z1bPu*1mQ-4eZVN(67ia#I=_djp^ip_S~|-Z?8kz}youEPMDje5JnLTaB+OdZG3N2R zU;bq1oL_J3k6CMrarskNS;C`YJ}`eOb&cF9ADI)V$IkbYM&rL4NaLNP;*Gfp z6HzCD$+%4c%Q!LA5+Uss4TL#7e_F5v9087`O^(W+9vn?xj=@cPqQ{~h2adQd-X2kf!#UE}@K<=Ffr-AjiV)a&QH> z68~3$tMi*|Zn_4$Yr%EkdT;}7J5irEqTZB0n|`1@D)Gm2tRLKrpIdO#+AtS?x8^sS zpWCosnm?B~;bU>X1GCm0camStk=HWj?n1we+oLT25=H9^+P9Xw+VpP1-9uUL&EGD# zFMmG$bYAdVY-(^naXpZ~fOKTu+dY`SFhjp6^v8PER%(lhSN;x8*)Jn}88=gvuI>Xo zgjwenA4YuyXodGE>SLtenw!qKZh(6{e}H=eEC)}5r@+(shvIf9c|Vji((;%U)OCMu zyygK1)^+oD=g#ExdJo{h+J0J7qQBUWdWL*F3!Vc5so$04X*6}CGr!Mc_X1c2UIZ_J zmx0a}*Hea9(7y`AgS>|NI(UP;y$Rj|Z-aNhYVa<254;a_Pj3xsIqC1C_UuO?~#QvxJ6D+U(OtI`wBwpla zg#RThQyI6GwUwhVzhd_r7{GXx+_RS3%u(KZQ!k^Tm8yq!@l%LbVbsp>75S%_HpS5Lkud=ggpxxS}>|iC%e9K8sMrhw3~4rxDO`!@J;&pcVFd z{iZePY*cWbwTI5mYfp7&ZhyCOD_k4=_&B4nQm=tcOd>9f%b^{Qs&;+=^Sql>~>PS7hJ}i?#re(1w0)}*PZVxY7>>~ za_UNHA?c$p_au&9U<7%VzjoNwa?@U~7%30x|LQXu3#x^;>XJ##MK|{NgM;fUc~cN{?#^y_NH6|G5p45kdKchRRI_!|m_VOL2RiG9332U?kWFj4C*n_B)rcbuRfoH*0LE4^&e&KbF*P(;0_ahv>Z--4!ozH3c2r z=mPOVzAw*36>k%bhmQ0`&HH8ey%^LM_`TRM1-DR7w~+2Fq^r2u$E2<$dricLayG%Q zclIsN{wn+m@$Oe}D`yjK#mB9L5kGWmuni-7f6F6#kCf*Ca3H9o4zyo19(_G%026@f zNp(6AeJ=fN66$0y1xy8vKyPMftRF;v@`Kxu^D8g@-ukqHA~zk(ATKiumIkvZPm`s^ zITQHf+32;d(VaEzna#m`A@Ma6*IY0U%m)jwUkDa~#o%CY2spIhcKU||MbU5k~(8fJy{qG3$M}nik(ZqQSI2IfSbiVv})Dyso;3WK<3{C;3g3}7_2zKE0 z2?u;#>KwWsGwN5T6Q-DPc?NZRCO8W$gsz@Vxz8c&HiSEudN>c9U!Xezo!tf4Ur7C3 zgx{MegYE+84#36O>D+%m=*AwzIUZ;nUxNLmKxh6hL%kea0j>mBfvdqa;9BbVx`JmY zbCJ8gpvK)m-jqktup23hWc|7aeiMFgCO@}ecPqG!a7)4M1-i#TNek|ztg^og8Y7i+ z!o+naxC{N=;2!k%TKt@8#C$(^06bW5H>J6o`nsDq*xw|6jp2tVYg=B2dAMK&qC?+j zA0ZFdgGWIh`hfgBhX2Qb_9FA}*Malf*B1S=YZYU4RC$umBKIs2___+^1{%o<_o-Mea zx#oWC@5f$qXGAkNH$yrrt(?Byo~J%u2*>;?^e+}X0R4S{un!QnvwI1@rHrkYsmE8W zE`40D7U(4t(Ls$}UoWpwN3TPxe3)fHD+`aTCJgr`>RT3HXZJShJEXT7XbiuL`X26n zuF%+i2wJANSc75zK3D_PS3bb*L+}y!7<^LjF!V=$Idcg<1D;MP?|NCqyQ%Fywe%ld zkDYF&ukG(~qvxVMFDITrFL%YcJj@$sJ4ycx;#I!3Mn3rkdGzxnawYToWa!tIEx|cW ztyjh0`#Do##j_~hr&4*)y#JNiJ)LDIezY{cA}nuomoeeKCS8A@=9yI9RNil>i*L!} zcObjY6wkBp^(s?mcP{=k_k54PAHa{`C-5`)1^fzr1HXrDAiC(w`JC~cs(Yn3B({=1 znXX6ChCi$v&okdd^@og%c>cuxFYq_<{saC69BOg_h=DjrfESI zdMEGdr|pSn6VL&41iBNb{ls>(*QVroGtj9}@{G6OXC(KI`nIP%or!yMum$J>wgg*& zRlF|L5g@@OFK-817mAj!PeOd+Q?|j6=eu}&4E=V6?*!d&>qefoCm-Dl3)~La?+AKO zhn_D%et~}H!ncE-g{y;Jg>MDD3*QZTaaw}iDbjg2=ws=;7slmjsp>&#sb5cpSJK+2 zFY#*cUGaZPnsb;dT0-M?A--*(`<3jIZ-ahU%Dx-<@p*z?QGW5n{jl2|>;d|NJ;~Pq z^1m1H?F|NEHwYA?F9D^Lr>wB8D+d)|Fm^-0P{P&n>e8^n{^Xzi?f4q{M*l!-SG}iM z#!E~&ZcR{0+*SA=4n|mgtfn8YrrfKo+#|{BKGe%7P>s9#Tp1j-%HnyV55qe7D5xp) z=NyKzZ#|mw)#6`#@)*>yVb}qrvoDY=PkYGwq2C{j!~FpAe<0y}eSI9%k@xY~m$^@Z zddk@VCSab3Itfe$Q@~Wv2o5Uzlu^VQ59qyyp3s+G1)qg>TJJ`E>~nfIdvS~@?g^ya zr%|t-zJ5vBIrmoh6?Nw06AhhFs28dHc%51J4Py(r8#ohu%6elKb=gE&%6PF#GPHq= zBgu&*Gn!4@bF3`i;r4CNT=;D;7t90maa#Zu7Jg5g_&xVUm=}YC!6Ah|SbTC*yhGS~ zR$n;`9H@%PrPf5Cm75)s}PRo_&p+B6wE&+N|w2D4^1ZnAwha*vs!d~yH z9Zi`Yrmc=4j$;ddVV*~BiTm-OBYc}=5+|Tv#Tkg5sm~MfU&d=(k}IBs{mI0$Gqkph z*SU13^%U$RS1sbDF3DH6cDhsH>oAt{2W8>ze&HAHG}2SO#&A2`>P;_t!H*K(nV2i^ z_gq5$;7!3*u|F+uXA}Q9;9Q`$ht5MiA6!7V3&BN&f6>2V?qc+pfJ?z;xL*#g09S&m z3je0wqB{M@`pOE@ySngS`h~_mQw{1h{9Fs}f*xN-JgU>{39t7|Z$P~fh~}xiZYm6* z4h8OJ`spo&v6#*~>n@7c;Ho#h3!u0fF|Q*0t%SV|Od)%umZy9M53?EdC^GeXg*GyeaO?IDGgrUSErc>8`Z6T8D9Ml(K)` z?AxTwFPOP)%Df8mi-qk{X374`c(u*9aeL~~)32BC_p*iEgi}z;4}7iFEB7kNYe&Le zNgo%ldn5F9Q+iA-Z!^AD*ddIoqp7bKZc4vFzDk%k!CS=nHtIWIHFy{Ed*FSr27CZM zEZof6;C1@OM}?jKUti||T}9Ca;LQ+PlHGlTE(QVwLQCkO1d;%GB=p{!5~_fdfb`y* z^eP>ZE=`&uMX`ViB7zMR6{Jb;P5$rhyiFo_{&&uIW~be`GdnvwZRepYdm^|_#Pm-W zLiw<_0{aD!e*9mUQhzQ6<)uvB`7_>+_+7&9a!@{GF#m~cIfvqEP^fcXPtvEl8kFDB z^J-85-1ycAovsBHq#WF5LAQO^gTlxM^Pr65q@OF_{oNq!O}GWOiE{_;!aeNw;XzO= zwO_wKs$)JR{YSL-kKqaOo)YF6`~%OyFryd)ajq0?xSz?B59z=k(nAK2wn%yldY;JN zX%jP=<>@o(Gfgw`VSZ-91z-kZ27$@7g=u4YFtdr3S-LUMPXK1Hz?!@oF` zfC>0T;1&rbVFl|ilD2%aQ3`u$!qg&68O*X!j&#aH6jXqUgsB9TAzDoIuR^%05CgHe z$@d^}TvvnY*lR#Mc%ddFKqAyK!$~QerX!sCq;<)~_c^i)PS&t%6Tc34Il)ljQkOXO z$h-D0qGZ0KKK>2NqDsyjmp+6ZFEM|?7^fkAji52qre5p$sbWsu?VhO%_pGRDf?rcO zOh2F*W^-s^hWNEKi>X#-ai={zMcWxhJ{zHhoVh0Bj@D)gCGS%43*kPuLASOLmM#MK z5Tl(Lsj}lALYv+m_h?R8l=oT((&#IF zYetZ?7rIZa^|=>N1{q}tQ^prYzBkfg$-r8_#G4~S52ke+-4 zEqRKA9@s^Xo@vsTZxDLnCUYlmnp$RWvz*F;dv5AWAHsHkzR(Ynp+5|Ow_qR)g26BZ zIr6LxMUKpwMDS(U+bR9RC^ZbZ!%g{~T8E3~S(QGBjN?WSN6udzi7E3zqcBG!Zww?5 zW-Rt`Fdk&Cd;;b~m;|$!AD@gl1*XC@m=3ZQC2LgD2EUDc2Ds-7%;b6&%!WDWJ{RV} zd{_VrVG%6GU%nT7hwCM<6qZ5i`Wnv_{g>sqt$>xV3Rc6r=q_t-M_>)t?;&d~tivzu zI^25f8(<@Bg3a(gY=Nz?4dmPkxmVk{-T@!LPLQ*ucOiQ>$Tur{F!$pAA$$b;;A7Yi z_X&Fdb33x!GY}49KSZ2QK=y8aiv2Kr2A{(h@Fg69qwp1c4d1{qI1b;!3HT09!uQBJ z1*d7-et;iw`w4!gja%<0=U7Gs-y^$Bf@7pL6iLxtdmUHBa+u z+R^gr53{WLlV@pupnJwa1$Ex6pe~qvNemawS;i%EiE$aOAoHqOQT>f6^TDTim&y8w zoFkINb8rn^uA`rCO*J?2#?^gSxG%H-7^9# zv;pPw0ZX{us`nV-*#Kj6zTtvgSmb;!ZlU=F7MjdprNC zPW$SPNyr`TyR=JE_A#`7F|=(lv~5*s>-B#BJd}L|af4~SBdu8C#}X!%FqTmg`K25` z_N`lS^qu4Ii*x*D5~hsLPvVz_a_CncqM!m)wAk-x9YqUw%qrg}i!SWlA$+tIXjHMP zktX|fNGk?nLF$Q@9U*a6b=rK1TSHZ|YN+a#Wz@hwp15A9i9G=lkx>h?Hq?Q-P|u22 z^`QYY#NNot=GPc~nm|)zg&~vGBk~exG_#ueHHQ}XwM1?!XbtXOpf+5$h3T}HEg7%1 zD?xR!5>;1p?grh_;|)jz*)P-svnTYjWS>bb z6%6d~L?@Xyk^NKbtwdgLkoH^FQu}b-7y3am^am-=0hpnfUQPsh%c?^QRR>vhkX1_! zv}&nAR$cngb#beU8z=aY?hx`@1f7QxcbHGkaP%C(eHlr)(aRuwyiXs)7)6|2%pZ>? zOfaXRGsBIl#htO4*0-L@&Ays3#2;&k9@W%1;*7V7`%SQ9Z<^LMf>VUqA%*Pv$d;a@ zv>WdHkzRM3O|4P%1N6LA1Ns1re@S-|Oa{F^-O#D;a<1?c>f2P9hM)9Xg6UmI96hff z&wxH-xS48ztl!8B2(_l=5AM>{#4u(r458ZR7NZmZ#{~mcE7TIBttPS(9k3 z;<)dT{_=k+ZPW_F$vGvl=q&Z86l1BC$exdTX4>z5_^l$1)mA&ofH63JYpnK^k(|KV z9+_VCnN^~d;Rd!<@-MI79nQ~$oNe1wUXO|u zcL-UZz`nq)+;8#Y{0`hdwYt&1yJ7Vj;9=b5JuGX%2MPC?)!j+w0Pdf|Icl7o0UFK8 z*jkpJTl&I^EBH@fRJAKy`~*M4FK`CV zqQkG&cq85zXZ&XMq~9B8oU>{hzrz{&K7Uxf)Sp%!gVWiJ^OzUlFXCN~%o}hMq%R|9q}}5BHhy>DF5H9r@BsIRaFTcIBkYg4egZNEe2V=U`~%VtcuqMo zePa08v^2Klm-9U^{jsNq43N=gPb*}G(h%z_yVSs@!_ zha8a8p1`R&QYLcNshlHP$;gF!ZsK&JoL}KO54;MpQ$e2h5Uw+EKk{PcgHXaw)znG2plTJn8oal1ElSoWZ%?qMx~J`r{hUkAI-lgw{2Hw3F85}Eq{ zab)jnANqzeU*1=hv;&P&$SX}Aqz#t+sj}8z#+Lo8HCPjs|J%txVd{PzApkoC2TUzn`j#dyL(mXG+{?W3l(}8^H4uXv7h=8hCN9j(ZJ=7dyy$ zdQI#JkO;M)Hq;?anMbV4bv>vL4V?5u?_~bTAeoAl?6gbL|89tXqm*#mSNh703Eu=c zO>u7qvDhWg%`sbG??*mcqJx~P(+aaS?rm^yYwNWIS@-pFvb~JC+u;#>m3v`8U&>g?Mytm)r zx(d%q590TPUfACR`NnWC@2%dr^&xCu=*M*~HJJB-&R;V2{;IMiN%*HOvV!${wyV zbCN&%PO(dU(9ezR0T@l#F)$X!*(128BM3KwaLn`L=I%4`Iw${&Zj8UlXE5*8iKHiU za+3(>J)|JopPQ=j4PA-weeJ|_=f zAmd9oVvlv6tD{`^LdRfZ9Q85O_=@l{U-UKp-`HbRk~yBbHJ(x!&;8T=nq$a0PPlLF zag6CC%s6$zmVbhnK)4Bn<2{3n?+7F3_efu8urZOgXd?a-@t1qesg%^0@9pvG6mm|Z z#|bweGVc8oJ><;L^OzUlFSrPo;4&oePh@$S%e!JT z58;#NruR4gBI_FFb+`dH;TGJ6J8&27!F_lD58)9!h9~e8p20ux95}GW@B`)H{~SG& zD8osV;Ur%f>bm9cVV^A|kf#hD-sg}BGDCBowLEIF3h+$f{!St86ynPGf)y&_L>Lzt zgeet!-HfY?M5|#NZFaM14VmYSzFIGCw%wzlF$i2ywPX0wDwS4oC#;cwsFUisF zlE%{i)KUApIxb6dznA~V{a*2se4RIuzcP(Jx_*RsR=p%6#IyP(8E%~k@w`jhC3&LX z=+vP#DR${&c=@*%w=D9JUm2^-tJg7J@qC7 z|5l^xE9?H)ix96U$U1#7%;HeONq<{PdfAqqQ_f5zB(_JfBpUk)m<4t From 08c60cfc30563d0a6042d8bf2692deba06ac26cf Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 30 Oct 2017 20:06:05 +0000 Subject: [PATCH 047/195] Binoculars: Only set property if necessary to reduce mesh reloading --- mods/binoculars/init.lua | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/mods/binoculars/init.lua b/mods/binoculars/init.lua index cd07ef9b..153044ae 100644 --- a/mods/binoculars/init.lua +++ b/mods/binoculars/init.lua @@ -3,7 +3,12 @@ binoculars = {} --- Cache creative mode setting +-- Detect creative mod + +local creative_mod = minetest.get_modpath("creative") + + +-- Cache creative mode setting as fallback if creative mod not present local creative_mode_cache = minetest.settings:get_bool("creative_mode") @@ -13,14 +18,13 @@ local creative_mode_cache = minetest.settings:get_bool("creative_mode") function binoculars.update_player_property(player) local creative_enabled = - (creative and creative.is_enabled_for(player:get_player_name())) or + (creative_mod and creative.is_enabled_for(player:get_player_name())) or creative_mode_cache - - if creative_enabled or - player:get_inventory():contains_item("main", "binoculars:binoculars") then - player:set_properties({can_zoom = true}) - else - player:set_properties({can_zoom = false}) + -- Only set property if necessary to avoid player mesh reload + local new_can_zoom = creative_enabled or player:get_inventory():contains_item( + "main", "binoculars:binoculars") + if player:get_properties().can_zoom ~= new_can_zoom then + player:set_properties({can_zoom = new_can_zoom}) end end From dbfe435abf5a79f727d7527471489ce465a4f6aa Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Mon, 23 Oct 2017 20:25:46 +0200 Subject: [PATCH 048/195] Bookshelf: Count written and empty books --- mods/default/nodes.lua | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 00756210..00bb2985 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -2137,23 +2137,41 @@ local bookshelf_formspec = "listring[current_player;main]" .. default.get_hotbar_bg(0,2.85) -local function get_bookshelf_formspec(inv) +local function update_bookshelf(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local invlist = inv:get_list("books") + local formspec = bookshelf_formspec - local invlist = inv and inv:get_list("books") -- Inventory slots overlay local bx, by = 0, 0.3 + local n_written, n_empty = 0, 0 for i = 1, 16 do if i == 9 then bx = 0 by = by + 1 end - if not invlist or invlist[i]:is_empty() then + local stack = invlist[i] + if stack:is_empty() then formspec = formspec .. "image[" .. bx .. "," .. by .. ";1,1;default_bookshelf_slot.png]" + else + local metatable = stack:get_meta():to_table() or {} + if metatable.fields and metatable.fields.text then + n_written = n_written + stack:get_count() + else + n_empty = n_empty + stack:get_count() + end end bx = bx + 1 end - return formspec + meta:set_string("formspec", formspec) + if n_written + n_empty == 0 then + meta:set_string("infotext", "Empty Bookshelf") + else + meta:set_string("infotext", "Bookshelf (" .. n_written .. + " written, " .. n_empty .. " empty books)") + end end minetest.register_node("default:bookshelf", { @@ -2167,9 +2185,9 @@ minetest.register_node("default:bookshelf", { on_construct = function(pos) local meta = minetest.get_meta(pos) - meta:set_string("formspec", get_bookshelf_formspec(nil)) local inv = meta:get_inventory() inv:set_size("books", 8 * 2) + update_bookshelf(pos) end, can_dig = function(pos,player) local inv = minetest.get_meta(pos):get_inventory() @@ -2184,20 +2202,17 @@ minetest.register_node("default:bookshelf", { on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name() .. " moves stuff in bookshelf at " .. minetest.pos_to_string(pos)) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory())) + update_bookshelf(pos) end, on_metadata_inventory_put = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name() .. - " moves stuff to bookshelf at " .. minetest.pos_to_string(pos)) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory())) + " puts stuff to bookshelf at " .. minetest.pos_to_string(pos)) + update_bookshelf(pos) end, on_metadata_inventory_take = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name() .. " takes stuff from bookshelf at " .. minetest.pos_to_string(pos)) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory())) + update_bookshelf(pos) end, on_blast = function(pos) local drops = {} From 9d9e9b67090423ef8447b93af9109b87dc430d27 Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 2 Nov 2017 04:30:19 +0000 Subject: [PATCH 049/195] Stairs: Set world-aligned textures for all stairs and slabs Fix 'stair_images' code to avoid 'stair_images' being empty in some situations. Change stairs back to nodeboxes to make world-aligned textures work. --- mods/stairs/README.txt | 9 -- mods/stairs/init.lua | 101 ++++++++------ mods/stairs/license.txt | 42 +----- mods/stairs/models/stairs_stair.obj | 115 ---------------- mods/stairs/models/stairs_stair_inner.obj | 161 ---------------------- mods/stairs/models/stairs_stair_outer.obj | 136 ------------------ 6 files changed, 59 insertions(+), 505 deletions(-) delete mode 100644 mods/stairs/models/stairs_stair.obj delete mode 100644 mods/stairs/models/stairs_stair_inner.obj delete mode 100644 mods/stairs/models/stairs_stair_outer.obj diff --git a/mods/stairs/README.txt b/mods/stairs/README.txt index f2b5b74f..e411c332 100644 --- a/mods/stairs/README.txt +++ b/mods/stairs/README.txt @@ -7,12 +7,3 @@ Authors of source code Originally by Kahrl (LGPL 2.1) and celeron55, Perttu Ahola (LGPL 2.1) Various Minetest developers and contributors (LGPL 2.1) - -Authors of media (models) -------------------------- -Jean-Patrick G. (kilbith) (CC BY-SA 3.0): - stairs_stair.obj -GreenXenith (CC BY-SA 3.0) - stairs_stair_inner.obj stairs_stair_outer.obj - - diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 2fdd54b0..8b3ceed0 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -46,41 +46,40 @@ end -- Node will be called stairs:stair_ function stairs.register_stair(subname, recipeitem, groups, images, description, sounds) + -- Set backface culling and world-aligned textures local stair_images = {} for i, image in ipairs(images) do if type(image) == "string" then stair_images[i] = { name = image, backface_culling = true, + align_style = "world", } - elseif image.backface_culling == nil then -- override using any other value + else stair_images[i] = table.copy(image) - stair_images[i].backface_culling = true + if stair_images[i].backface_culling == nil then + stair_images[i].backface_culling = true + end + if stair_images[i].align_style == nil then + stair_images[i].align_style = "world" + end end end groups.stair = 1 minetest.register_node(":stairs:stair_" .. subname, { description = description, - drawtype = "mesh", - mesh = "stairs_stair.obj", + drawtype = "nodebox", tiles = stair_images, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, groups = groups, sounds = sounds, - selection_box = { + node_box = { type = "fixed", fixed = { - {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - {-0.5, 0, 0, 0.5, 0.5, 0.5}, - }, - }, - collision_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - {-0.5, 0, 0, 0.5, 0.5, 0.5}, + {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5}, + {-0.5, 0.0, 0.0, 0.5, 0.5, 0.5}, }, }, on_place = function(itemstack, placer, pointed_thing) @@ -144,11 +143,26 @@ local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4} -- Node will be called stairs:slab_ function stairs.register_slab(subname, recipeitem, groups, images, description, sounds) + -- Set world-aligned textures + local slab_images = {} + for i, image in ipairs(images) do + if type(image) == "string" then + slab_images[i] = { + name = image, + align_style = "world", + } + else + slab_images[i] = table.copy(image) + if image.align_style == nil then + slab_images[i].align_style = "world" + end + end + end groups.slab = 1 minetest.register_node(":stairs:slab_" .. subname, { description = description, drawtype = "nodebox", - tiles = images, + tiles = slab_images, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, @@ -280,43 +294,41 @@ end -- Node will be called stairs:stair_inner_ function stairs.register_stair_inner(subname, recipeitem, groups, images, description, sounds) + -- Set backface culling and world-aligned textures local stair_images = {} for i, image in ipairs(images) do if type(image) == "string" then stair_images[i] = { name = image, backface_culling = true, + align_style = "world", } - elseif image.backface_culling == nil then -- override using any other value + else stair_images[i] = table.copy(image) - stair_images[i].backface_culling = true + if stair_images[i].backface_culling == nil then + stair_images[i].backface_culling = true + end + if stair_images[i].align_style == nil then + stair_images[i].align_style = "world" + end end end groups.stair = 1 minetest.register_node(":stairs:stair_inner_" .. subname, { description = description .. " Inner", - drawtype = "mesh", - mesh = "stairs_stair_inner.obj", + drawtype = "nodebox", tiles = stair_images, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, groups = groups, sounds = sounds, - selection_box = { + node_box = { type = "fixed", fixed = { - {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - {-0.5, 0, 0, 0.5, 0.5, 0.5}, - {-0.5, 0, -0.5, 0, 0.5, 0}, - }, - }, - collision_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - {-0.5, 0, 0, 0.5, 0.5, 0.5}, - {-0.5, 0, -0.5, 0, 0.5, 0}, + {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5}, + {-0.5, 0.0, 0.0, 0.5, 0.5, 0.5}, + {-0.5, 0.0, -0.5, 0.0, 0.5, 0.0}, }, }, on_place = function(itemstack, placer, pointed_thing) @@ -358,41 +370,40 @@ end -- Node will be called stairs:stair_outer_ function stairs.register_stair_outer(subname, recipeitem, groups, images, description, sounds) + -- Set backface culling and world-aligned textures local stair_images = {} for i, image in ipairs(images) do if type(image) == "string" then stair_images[i] = { name = image, backface_culling = true, + align_style = "world", } - elseif image.backface_culling == nil then -- override using any other value + else stair_images[i] = table.copy(image) - stair_images[i].backface_culling = true + if stair_images[i].backface_culling == nil then + stair_images[i].backface_culling = true + end + if stair_images[i].align_style == nil then + stair_images[i].align_style = "world" + end end end groups.stair = 1 minetest.register_node(":stairs:stair_outer_" .. subname, { description = description .. " Outer", - drawtype = "mesh", - mesh = "stairs_stair_outer.obj", + drawtype = "nodebox", tiles = stair_images, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, groups = groups, sounds = sounds, - selection_box = { + node_box = { type = "fixed", fixed = { - {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - {-0.5, 0, 0, 0, 0.5, 0.5}, - }, - }, - collision_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - {-0.5, 0, 0, 0, 0.5, 0.5}, + {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5}, + {-0.5, 0.0, 0.0, 0.0, 0.5, 0.5}, }, }, on_place = function(itemstack, placer, pointed_thing) diff --git a/mods/stairs/license.txt b/mods/stairs/license.txt index 411823ae..57bd98cf 100644 --- a/mods/stairs/license.txt +++ b/mods/stairs/license.txt @@ -2,9 +2,9 @@ License of source code ---------------------- GNU Lesser General Public License, version 2.1 -Copyright (C) 2011-2016 Kahrl -Copyright (C) 2011-2016 celeron55, Perttu Ahola -Copyright (C) 2012-2016 Various Minetest developers and contributors +Copyright (C) 2011-2017 Kahrl +Copyright (C) 2011-2017 celeron55, Perttu Ahola +Copyright (C) 2012-2017 Various Minetest developers and contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; @@ -14,39 +14,3 @@ This program is distributed in the hope that it will be useful, but WITHOUT ANY without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html - - -Licenses of media (models) --------------------------- - -Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) -Copyright (C) 2015-2016 Jean-Patrick G. (kilbith) -Copyright (C) 2017 GreenXenith - -You are free to: -Share — copy and redistribute the material in any medium or format. -Adapt — remix, transform, and build upon the material for any purpose, even commercially. -The licensor cannot revoke these freedoms as long as you follow the license terms. - -Under the following terms: - -Attribution — You must give appropriate credit, provide a link to the license, and -indicate if changes were made. You may do so in any reasonable manner, but not in any way -that suggests the licensor endorses you or your use. - -ShareAlike — If you remix, transform, or build upon the material, you must distribute -your contributions under the same license as the original. - -No additional restrictions — You may not apply legal terms or technological measures that -legally restrict others from doing anything the license permits. - -Notices: - -You do not have to comply with the license for elements of the material in the public -domain or where your use is permitted by an applicable exception or limitation. -No warranties are given. The license may not give you all of the permissions necessary -for your intended use. For example, other rights such as publicity, privacy, or moral -rights may limit how you use the material. - -For more details: -http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/stairs/models/stairs_stair.obj b/mods/stairs/models/stairs_stair.obj deleted file mode 100644 index 198edf6e..00000000 --- a/mods/stairs/models/stairs_stair.obj +++ /dev/null @@ -1,115 +0,0 @@ -# Blender v2.72 (sub 0) OBJ File: '' -# www.blender.org -mtllib stairs.mtl -o stairs_top -v -0.500000 0.000000 -0.500000 -v -0.500000 0.000000 0.000000 -v 0.500000 0.000000 0.000000 -v 0.500000 0.000000 -0.500000 -v -0.500000 0.500000 0.000000 -v 0.500000 0.500000 0.000000 -v -0.500000 0.500000 0.500000 -v 0.500000 0.500000 0.500000 -vt 0.000000 0.000000 -vt 1.000000 0.000000 -vt 1.000000 0.500000 -vt 0.000000 0.500000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vn 0.000000 1.000000 0.000000 -g stairs_top -usemtl None -s off -f 4/1/1 1/2/1 2/3/1 3/4/1 -f 7/5/1 8/6/1 6/4/1 5/3/1 -o stairs_bottom -v -0.500000 -0.500000 -0.500000 -v 0.500000 -0.500000 -0.500000 -v -0.500000 -0.500000 0.500000 -v 0.500000 -0.500000 0.500000 -vt 1.000000 0.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 0.000000 -vn 0.000000 -1.000000 -0.000000 -g stairs_bottom -usemtl None -s off -f 11/7/2 9/8/2 10/9/2 12/10/2 -o stairs_right -v -0.500000 0.000000 -0.500000 -v -0.500000 -0.500000 -0.500000 -v -0.500000 0.000000 0.000000 -v -0.500000 -0.500000 0.500000 -v -0.500000 0.500000 0.000000 -v -0.500000 0.500000 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.000000 -vt 0.500000 0.500000 -vt 1.000000 1.000000 -vt 0.500000 1.000000 -vt 1.000000 0.000000 -vn -1.000000 0.000000 0.000000 -g stairs_right -usemtl None -s off -f 13/11/3 14/12/3 15/13/3 -f 15/13/3 18/14/3 17/15/3 -f 14/12/3 16/16/3 15/13/3 -f 16/16/3 18/14/3 15/13/3 -o stairs_left -v 0.500000 0.000000 0.000000 -v 0.500000 -0.500000 -0.500000 -v 0.500000 0.000000 -0.500000 -v 0.500000 -0.500000 0.500000 -v 0.500000 0.500000 0.000000 -v 0.500000 0.500000 0.500000 -vt 0.500000 0.500000 -vt 1.000000 0.000000 -vt 1.000000 0.500000 -vt 0.500000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 0.000000 -vn 1.000000 0.000000 0.000000 -g stairs_left -usemtl None -s off -f 19/17/4 20/18/4 21/19/4 -f 19/17/4 23/20/4 24/21/4 -f 20/18/4 19/17/4 22/22/4 -f 19/17/4 24/21/4 22/22/4 -o stairs_back -v -0.500000 -0.500000 0.500000 -v 0.500000 -0.500000 0.500000 -v -0.500000 0.500000 0.500000 -v 0.500000 0.500000 0.500000 -vt 1.000000 0.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 0.000000 -vn 0.000000 -0.000000 1.000000 -g stairs_back -usemtl None -s off -f 26/23/5 28/24/5 27/25/5 25/26/5 -o stairs_front -v -0.500000 0.000000 -0.500000 -v -0.500000 -0.500000 -0.500000 -v -0.500000 0.000000 0.000000 -v 0.500000 0.000000 0.000000 -v 0.500000 -0.500000 -0.500000 -v 0.500000 0.000000 -0.500000 -v -0.500000 0.500000 0.000000 -v 0.500000 0.500000 0.000000 -vt 1.000000 0.000000 -vt 1.000000 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vn 0.000000 0.000000 -1.000000 -g stairs_front -usemtl None -s off -f 30/27/6 29/28/6 34/29/6 33/30/6 -f 31/28/6 35/31/6 36/32/6 32/29/6 diff --git a/mods/stairs/models/stairs_stair_inner.obj b/mods/stairs/models/stairs_stair_inner.obj deleted file mode 100644 index 5e4968e8..00000000 --- a/mods/stairs/models/stairs_stair_inner.obj +++ /dev/null @@ -1,161 +0,0 @@ -# Blender v2.78 (sub 0) OBJ File: '' -# www.blender.org -mtllib stairs_inner_stair.mtl -o stairs_back_right_stairs_back.001 -v 0.500000 -0.500000 0.500000 -v 0.500000 0.500000 0.500000 -v -0.500000 0.500000 0.500000 -v -0.500000 -0.500000 0.500000 -vt 1.0000 0.0000 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.0000 -vn 0.0000 -0.0000 1.0000 -usemtl None.001 -s 1 -f 1/1/1 2/2/1 3/3/1 4/4/1 -o stairs_front_right_stairs_back.003 -v 0.000000 0.000000 -0.500000 -v 0.000000 0.000000 0.000000 -v 0.000000 0.500000 0.000000 -v 0.000000 0.500000 -0.500000 -v -0.500000 0.000000 -0.500000 -v -0.500000 -0.500000 -0.500000 -v -0.500000 0.000000 0.000000 -v -0.500000 0.500000 0.500000 -v -0.500000 0.500000 0.000000 -v -0.500000 -0.500000 0.500000 -vt 0.0000 0.5000 -vt 0.5000 0.5000 -vt 0.5000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.5000 -vt 0.0000 0.0000 -vt 0.5000 0.5000 -vt 1.0000 1.0000 -vt 0.5000 1.0000 -vt 1.0000 0.0000 -vn -1.0000 0.0000 0.0000 -usemtl None -s 1 -f 5/5/2 6/6/2 7/7/2 8/8/2 -f 9/9/2 10/10/2 11/11/2 -f 11/11/2 12/12/2 13/13/2 -f 10/10/2 14/14/2 11/11/2 -f 14/14/2 12/12/2 11/11/2 -o stairs_bottom -v -0.500000 -0.500000 0.500000 -v -0.500000 -0.500000 -0.500000 -v 0.500000 -0.500000 -0.500000 -v 0.500000 -0.500000 0.500000 -vt 1.0000 0.0000 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.0000 -vn 0.0000 -1.0000 -0.0000 -usemtl None -s 1 -f 15/15/3 16/16/3 17/17/3 18/18/3 -o stairs_front_left_stairs_front.002 -v -0.500000 0.000000 0.000000 -v -0.500000 0.500000 0.000000 -v 0.000000 0.500000 0.000000 -v 0.000000 0.000000 0.000000 -v -0.500000 -0.500000 -0.500000 -v -0.500000 0.000000 -0.500000 -v 0.500000 0.000000 -0.500000 -v 0.500000 -0.500000 -0.500000 -v 0.000000 0.000000 -0.500000 -v 0.000000 0.500000 -0.500000 -v 0.500000 0.500000 -0.500000 -v 0.500000 0.000000 -0.500000 -vt 1.0000 0.5000 -vt 1.0000 1.0000 -vt 0.5000 1.0000 -vt 0.5000 0.5000 -vt 1.0000 0.0000 -vt 1.0000 0.5000 -vt 0.0000 0.5000 -vt 0.0000 0.0000 -vt 0.5000 0.5000 -vt 0.5000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.5000 -vn 0.0000 0.0000 -1.0000 -usemtl None -s 1 -f 19/19/4 20/20/4 21/21/4 22/22/4 -f 23/23/4 24/24/4 25/25/4 26/26/4 -f 27/27/4 28/28/4 29/29/4 30/30/4 -o stairs_top_stairs_top.001 -v 0.000000 0.000000 -0.500000 -v -0.500000 0.000000 -0.500000 -v -0.500000 0.000000 0.000000 -v 0.000000 0.000000 0.000000 -v 0.500000 0.500000 -0.500000 -v 0.000000 0.500000 -0.500000 -v 0.000000 0.500000 0.000000 -v 0.500000 0.500000 0.000000 -v -0.500000 0.500000 0.500000 -v 0.500000 0.500000 0.500000 -v 0.500000 0.500000 0.000000 -v -0.500000 0.500000 0.000000 -vt 0.5000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.5000 -vt 0.5000 0.5000 -vt 1.0000 1.0000 -vt 0.5000 1.0000 -vt 0.5000 0.5000 -vt 1.0000 0.5000 -vt 0.0000 0.0000 -vt 1.0000 0.0000 -vt 1.0000 0.5000 -vt 0.0000 0.5000 -vn 0.0000 1.0000 0.0000 -usemtl None -s 1 -f 31/31/5 32/32/5 33/33/5 34/34/5 -f 35/35/5 36/36/5 37/37/5 38/38/5 -f 39/39/5 40/40/5 41/41/5 42/42/5 -o stairs_back_left_stairs_back.005 -v 0.500000 0.000000 -0.500000 -v 0.500000 0.500000 -0.500000 -v 0.500000 0.500000 0.000000 -v 0.500000 0.000000 0.000000 -v 0.500000 0.000000 0.000000 -v 0.500000 0.500000 0.000000 -v 0.500000 0.500000 0.500000 -v 0.500000 -0.000000 0.500000 -v 0.500000 -0.500000 -0.500000 -v 0.500000 0.000000 -0.500000 -v 0.500000 0.000000 0.000000 -v 0.500000 -0.500000 -0.000000 -v 0.500000 -0.500000 -0.000000 -v 0.500000 0.000000 0.000000 -v 0.500000 -0.000000 0.500000 -v 0.500000 -0.500000 0.500000 -vt 0.5000 0.5000 -vt 0.5000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.5000 -vt 1.0000 0.0000 -vt 1.0000 0.5000 -vt 0.5000 0.5000 -vt 0.5000 0.0000 -vt 0.5000 0.0000 -vt 0.5000 0.5000 -vt 0.0000 0.5000 -vt 0.0000 0.0000 -vt 1.0000 0.5000 -vt 1.0000 1.0000 -vt 0.5000 1.0000 -vt 0.5000 0.5000 -vn 1.0000 0.0000 0.0000 -usemtl None -s 1 -f 47/43/6 48/44/6 49/45/6 50/46/6 -f 51/47/6 52/48/6 53/49/6 54/50/6 -f 55/51/6 56/52/6 57/53/6 58/54/6 -usemtl None.002 -f 43/55/6 44/56/6 45/57/6 46/58/6 diff --git a/mods/stairs/models/stairs_stair_outer.obj b/mods/stairs/models/stairs_stair_outer.obj deleted file mode 100644 index cc1975b0..00000000 --- a/mods/stairs/models/stairs_stair_outer.obj +++ /dev/null @@ -1,136 +0,0 @@ -# Blender v2.78 (sub 0) OBJ File: '' -# www.blender.org -mtllib stairs_outer_stair.mtl -o stairs_bottom -v -0.500000 -0.500000 0.500000 -v -0.500000 -0.500000 -0.500000 -v 0.500000 -0.500000 -0.500000 -v 0.500000 -0.500000 0.500000 -vt 1.0000 0.0000 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.0000 -vn 0.0000 -1.0000 -0.0000 -usemtl None -s 1 -f 1/1/1 2/2/1 3/3/1 4/4/1 -o stairs_back_left_stairs_left -v 0.500000 0.000000 0.000000 -v 0.500000 -0.500000 -0.500000 -v 0.500000 0.000000 -0.500000 -v 0.500000 0.500000 0.000000 -v 0.500000 0.500000 0.500000 -v 0.500000 -0.500000 0.500000 -vt 0.5000 0.5000 -vt 1.0000 0.0000 -vt 1.0000 0.5000 -vt 0.5000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.0000 -vn 1.0000 0.0000 0.0000 -usemtl None -s 1 -f 5/5/2 6/6/2 7/7/2 -f 5/5/2 8/8/2 9/9/2 -f 6/6/2 5/5/2 10/10/2 -f 5/5/2 9/9/2 10/10/2 -o stairs_back_right_stairs_back -v 0.000000 -0.500000 0.500000 -v 0.000000 -0.000000 0.500000 -v -0.500000 -0.000000 0.500000 -v -0.500000 -0.500000 0.500000 -v 0.500000 -0.500000 0.500000 -v 0.500000 -0.000000 0.500000 -v 0.500000 0.500000 0.500000 -v 0.000000 0.500000 0.500000 -vt 0.5000 0.0000 -vt 0.5000 0.5000 -vt 0.0000 0.5000 -vt 0.0000 0.0000 -vt 1.0000 0.0000 -vt 1.0000 0.5000 -vt 1.0000 1.0000 -vt 0.5000 1.0000 -vn 0.0000 -0.0000 1.0000 -usemtl None -s 1 -f 11/11/3 12/12/3 13/13/3 14/14/3 -f 15/15/3 16/16/3 12/12/3 11/11/3 -f 16/16/3 17/17/3 18/18/3 12/12/3 -o stairs_top_stairs_top.001 -v 0.000000 0.500000 0.500000 -v 0.501689 0.500000 0.500000 -v 0.501689 0.500000 0.000000 -v 0.000000 0.500000 0.000000 -v -0.500000 -0.000000 0.500000 -v 0.001689 -0.000000 0.500000 -v 0.001689 0.000000 0.000000 -v -0.500000 0.000000 0.000000 -v 0.500000 0.000000 -0.500000 -v -0.500000 0.000000 -0.500000 -v -0.500000 0.000000 0.000000 -v 0.500000 0.000000 0.000000 -vt 0.5000 0.0000 -vt 1.0000 0.0000 -vt 1.0000 0.5000 -vt 0.5000 0.5000 -vt 0.0000 0.0000 -vt 0.5000 0.0000 -vt 0.5000 0.5000 -vt 0.0000 0.5000 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.5000 -vt 1.0000 0.5000 -vn 0.0000 1.0000 0.0000 -usemtl None -s 1 -f 19/19/4 20/20/4 21/21/4 22/22/4 -usemtl None.004 -f 23/23/4 24/24/4 25/25/4 26/26/4 -f 27/27/4 28/28/4 29/29/4 30/30/4 -o stairs_front_left_stairs_front.000 -v -0.500000 -0.500000 -0.500000 -v -0.500000 0.000000 -0.500000 -v 0.500000 0.000000 -0.500000 -v 0.500000 -0.500000 -0.500000 -v 0.500000 0.500000 0.000000 -v 0.500000 0.000000 0.000000 -v 0.000000 0.000000 0.000000 -v 0.000000 0.500000 0.000000 -vt 1.0000 0.0000 -vt 1.0000 0.5000 -vt -0.0000 0.5000 -vt -0.0000 0.0000 -vt 0.5000 0.5000 -vt 0.5000 1.0000 -vt -0.0000 1.0000 -vt -0.0000 0.5000 -vn 0.0000 0.0000 -1.0000 -usemtl None.001 -s 1 -f 31/31/5 32/32/5 33/33/5 34/34/5 -usemtl None.003 -f 37/35/5 38/36/5 35/37/5 36/38/5 -o stairs_front_right_stairs_right.001_stairs_front_left_stairs_front.002 -v -0.500000 -0.500000 0.500000 -v -0.500000 0.000000 0.500000 -v -0.500000 0.000000 -0.500000 -v -0.500000 -0.500000 -0.500000 -v 0.000000 0.000000 0.500000 -v 0.000000 0.500000 0.500000 -v 0.000000 0.500000 -0.000000 -v -0.000000 0.000000 0.000000 -vt 1.0000 0.0000 -vt 1.0000 0.5021 -vt -0.0000 0.5021 -vt -0.0000 0.0000 -vt 1.0000 0.5021 -vt 1.0000 1.0000 -vt 0.5000 1.0000 -vt 0.5000 0.5021 -vn -1.0000 0.0000 0.0000 -usemtl None.002 -s 1 -f 39/39/6 40/40/6 41/41/6 42/42/6 -f 43/43/6 44/44/6 45/45/6 46/46/6 From d4e1bd053ed572573aeca2ec0e89f4c208a5b5f1 Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 5 Nov 2017 04:28:52 +0000 Subject: [PATCH 050/195] Player API: Set eye height property for new player model Correct the collisionbox height. --- game_api.txt | 3 ++- mods/player_api/api.lua | 4 +++- mods/player_api/init.lua | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/game_api.txt b/game_api.txt index 379e3f85..82711288 100644 --- a/game_api.txt +++ b/game_api.txt @@ -364,8 +364,9 @@ The player API can register player models and update the player's appearence bar = {x = 20, y = 39}, -- ... }, - collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.77, 0.3}, -- In nodes from feet position + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}, -- In nodes from feet position stepheight = 0.6, -- In nodes + eye_height = 1.47, -- In nodes above feet position } diff --git a/mods/player_api/api.lua b/mods/player_api/api.lua index c79aedc3..e309b08d 100644 --- a/mods/player_api/api.lua +++ b/mods/player_api/api.lua @@ -45,8 +45,9 @@ function player_api.set_model(player, model_name) textures = player_textures[name] or model.textures, visual = "mesh", visual_size = model.visual_size or {x = 1, y = 1}, - collisionbox = model.collisionbox or {-0.3, 0.0, -0.3, 0.3, 1.77, 0.3}, + collisionbox = model.collisionbox or {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}, stepheight = model.stepheight or 0.6, + eye_height = model.eye_height or 1.47, }) player_api.set_animation(player, "stand") else @@ -55,6 +56,7 @@ function player_api.set_model(player, model_name) visual = "upright_sprite", collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.75, 0.3}, stepheight = 0.6, + eye_height = 1.625, }) end player_model[name] = model_name diff --git a/mods/player_api/init.lua b/mods/player_api/init.lua index 86ea340d..7a1f353e 100644 --- a/mods/player_api/init.lua +++ b/mods/player_api/init.lua @@ -15,6 +15,7 @@ player_api.register_model("character.b3d", { }, collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}, stepheight = 0.6, + eye_height = 1.47, }) -- Update appearance when the player joins From 319b9eeeaff57dcb40212c34f8c1ebfad1d9ce8f Mon Sep 17 00:00:00 2001 From: raymoo Date: Sun, 1 Oct 2017 18:20:50 -0700 Subject: [PATCH 051/195] Creative: Make handle_node_drops override work for non-player diggers --- mods/creative/init.lua | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mods/creative/init.lua b/mods/creative/init.lua index 9295c8a6..09dc2dc7 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -53,10 +53,8 @@ end) -- Don't pick up if the item is already in the inventory local old_handle_node_drops = minetest.handle_node_drops function minetest.handle_node_drops(pos, drops, digger) - if not digger or not digger:is_player() then - return - end - if not creative.is_enabled_for(digger:get_player_name()) then + if not digger or not digger:is_player() or + not creative.is_enabled_for(digger:get_player_name()) then return old_handle_node_drops(pos, drops, digger) end local inv = digger:get_inventory() From 8b5ad0f02813cefada44d93d31b2556d8277b5bf Mon Sep 17 00:00:00 2001 From: raymoo Date: Sun, 1 Oct 2017 18:32:01 -0700 Subject: [PATCH 052/195] Creative: Make the placenode registration check for non-player placers --- mods/creative/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/creative/init.lua b/mods/creative/init.lua index 09dc2dc7..ef190b8d 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -47,7 +47,9 @@ end -- Unlimited node placement minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) - return creative.is_enabled_for(placer:get_player_name()) + if placer and placer:is_player() then + return creative.is_enabled_for(placer:get_player_name()) + end end) -- Don't pick up if the item is already in the inventory From 91997d93423a621c0c974e376cf9f10287227675 Mon Sep 17 00:00:00 2001 From: bertrandda Date: Tue, 7 Nov 2017 19:30:56 -0500 Subject: [PATCH 053/195] README: Update minetest.net downloads link to avoid redirection --- README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.txt b/README.txt index 97ad70ab..2964ae2c 100644 --- a/README.txt +++ b/README.txt @@ -18,7 +18,7 @@ Additionally, when the Minetest engine is tagged to be a certain version (eg. 0.4.10), Minetest Game is tagged with the version too. When stable releases are made, Minetest Game is packaged and made available in - http://minetest.net/download + http://minetest.net/downloads/ and in case the repository has grown too much, it may be reset. In that sense, this is not a "real" git repository. (Package maintainers please note!) From 3ae382c91302b87c2deac2d5284a7e04cf1878c9 Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 8 Nov 2017 12:44:56 +0000 Subject: [PATCH 054/195] River water renewability: Add comments to nodes.lua and bucket mod --- mods/bucket/init.lua | 6 ++++++ mods/default/nodes.lua | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/mods/bucket/init.lua b/mods/bucket/init.lua index 5076dece..44565326 100644 --- a/mods/bucket/init.lua +++ b/mods/bucket/init.lua @@ -188,6 +188,12 @@ bucket.register_liquid( {water_bucket = 1} ) +-- River water source is 'liquid_renewable = false' to avoid horizontal spread +-- of water sources in sloping rivers that can cause water to overflow +-- riverbanks and cause floods. +-- River water source is instead made renewable by the 'force renew' option +-- used here. + bucket.register_liquid( "default:river_water_source", "default:river_water_flowing", diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 00bb2985..545d02c0 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1656,6 +1656,10 @@ minetest.register_node("default:river_water_source", { liquid_alternative_flowing = "default:river_water_flowing", liquid_alternative_source = "default:river_water_source", liquid_viscosity = 1, + -- Not renewable to avoid horizontal spread of water sources in sloping + -- rivers that can cause water to overflow riverbanks and cause floods. + -- River water source is instead made renewable by the 'force renew' + -- option used in the 'bucket' mod by the river water bucket. liquid_renewable = false, liquid_range = 2, post_effect_color = {a = 103, r = 30, g = 76, b = 90}, From a2d7678ffd532dd82dcaa108eac3dace61ac94a2 Mon Sep 17 00:00:00 2001 From: DTA7 Date: Sun, 1 Oct 2017 15:41:58 +0200 Subject: [PATCH 055/195] Add nil checks for placer --- mods/beds/api.lua | 22 +++++++++++++--------- mods/boats/init.lua | 12 ++++++++---- mods/bucket/init.lua | 3 ++- mods/carts/cart_entity.lua | 3 ++- mods/default/functions.lua | 2 +- mods/default/nodes.lua | 4 +--- mods/default/tools.lua | 3 ++- mods/default/torch.lua | 3 ++- mods/default/trees.lua | 6 ++++-- mods/doors/init.lua | 7 ++++--- mods/farming/api.lua | 15 +++++++++------ mods/flowers/init.lua | 2 +- mods/screwdriver/init.lua | 9 +++++---- mods/stairs/init.lua | 34 ++++++++++++++++++---------------- 14 files changed, 72 insertions(+), 53 deletions(-) diff --git a/mods/beds/api.lua b/mods/beds/api.lua index 3632dc0c..9349545a 100644 --- a/mods/beds/api.lua +++ b/mods/beds/api.lua @@ -49,7 +49,8 @@ function beds.register_bed(name, def) local node = minetest.get_node(under) local udef = minetest.registered_nodes[node.name] if udef and udef.on_rightclick and - not (placer and placer:get_player_control().sneak) then + not (placer and placer:is_player() and + placer:get_player_control().sneak) then return udef.on_rightclick(under, node, placer, itemstack, pointed_thing) or itemstack end @@ -61,9 +62,11 @@ function beds.register_bed(name, def) pos = pointed_thing.above end - if minetest.is_protected(pos, placer:get_player_name()) and - not minetest.check_player_privs(placer, "protection_bypass") then - minetest.record_protection_violation(pos, placer:get_player_name()) + local player_name = placer and placer:get_player_name() or "" + + if minetest.is_protected(pos, player_name) and + not minetest.check_player_privs(player_name, "protection_bypass") then + minetest.record_protection_violation(pos, player_name) return itemstack end @@ -72,12 +75,13 @@ function beds.register_bed(name, def) return itemstack end - local dir = minetest.dir_to_facedir(placer:get_look_dir()) + local dir = placer and placer:get_look_dir() and + minetest.dir_to_facedir(placer:get_look_dir()) or 0 local botpos = vector.add(pos, minetest.facedir_to_dir(dir)) - if minetest.is_protected(botpos, placer:get_player_name()) and - not minetest.check_player_privs(placer, "protection_bypass") then - minetest.record_protection_violation(botpos, placer:get_player_name()) + if minetest.is_protected(botpos, player_name) and + not minetest.check_player_privs(player_name, "protection_bypass") then + minetest.record_protection_violation(botpos, player_name) return itemstack end @@ -90,7 +94,7 @@ function beds.register_bed(name, def) minetest.set_node(botpos, {name = name .. "_top", param2 = dir}) if not (creative and creative.is_enabled_for - and creative.is_enabled_for(placer:get_player_name())) then + and creative.is_enabled_for(player_name)) then itemstack:take_item() end return itemstack diff --git a/mods/boats/init.lua b/mods/boats/init.lua index 38025d16..72ca478f 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -230,7 +230,8 @@ minetest.register_craftitem("boats:boat", { local node = minetest.get_node(under) local udef = minetest.registered_nodes[node.name] if udef and udef.on_rightclick and - not (placer and placer:get_player_control().sneak) then + not (placer and placer:is_player() and + placer:get_player_control().sneak) then return udef.on_rightclick(under, node, placer, itemstack, pointed_thing) or itemstack end @@ -244,9 +245,12 @@ minetest.register_craftitem("boats:boat", { pointed_thing.under.y = pointed_thing.under.y + 0.5 boat = minetest.add_entity(pointed_thing.under, "boats:boat") if boat then - boat:setyaw(placer:get_look_horizontal()) - if not (creative and creative.is_enabled_for - and creative.is_enabled_for(placer:get_player_name())) then + if placer then + boat:setyaw(placer:get_look_horizontal()) + end + local player_name = placer and placer:get_player_name() or "" + if not (creative and creative.is_enabled_for and + creative.is_enabled_for(player_name)) then itemstack:take_item() end end diff --git a/mods/bucket/init.lua b/mods/bucket/init.lua index 44565326..9c1481ef 100644 --- a/mods/bucket/init.lua +++ b/mods/bucket/init.lua @@ -69,7 +69,8 @@ function bucket.register_liquid(source, flowing, itemname, inventory_image, name -- Call on_rightclick if the pointed node defines it if ndef and ndef.on_rightclick and - user and not user:get_player_control().sneak then + not (user and user:is_player() and + user:get_player_control().sneak) then return ndef.on_rightclick( pointed_thing.under, node, user, diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua index 88fd2be6..434ea943 100644 --- a/mods/carts/cart_entity.lua +++ b/mods/carts/cart_entity.lua @@ -363,7 +363,8 @@ minetest.register_craftitem("carts:cart", { local node = minetest.get_node(under) local udef = minetest.registered_nodes[node.name] if udef and udef.on_rightclick and - not (placer and placer:get_player_control().sneak) then + not (placer and placer:is_player() and + placer:get_player_control().sneak) then return udef.on_rightclick(under, node, placer, itemstack, pointed_thing) or itemstack end diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 4eb1a1c9..20cf492a 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -334,7 +334,7 @@ end -- Prevent decay of placed leaves default.after_place_leaves = function(pos, placer, itemstack, pointed_thing) - if placer and not placer:get_player_control().sneak then + if placer and placer:is_player() and not placer:get_player_control().sneak then local node = minetest.get_node(pos) node.param2 = 1 minetest.set_node(pos, node) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 545d02c0..4aa35dc6 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -667,9 +667,7 @@ minetest.register_node("default:apple", { sounds = default.node_sound_leaves_defaults(), after_place_node = function(pos, placer, itemstack) - if placer:is_player() then - minetest.set_node(pos, {name = "default:apple", param2 = 1}) - end + minetest.set_node(pos, {name = "default:apple", param2 = 1}) end, }) diff --git a/mods/default/tools.lua b/mods/default/tools.lua index 1e719785..067613d3 100644 --- a/mods/default/tools.lua +++ b/mods/default/tools.lua @@ -389,7 +389,8 @@ minetest.register_tool("default:key", { local node = minetest.get_node(under) local def = minetest.registered_nodes[node.name] if def and def.on_rightclick and - not (placer and placer:get_player_control().sneak) then + not (placer and placer:is_player() and + placer:get_player_control().sneak) then return def.on_rightclick(under, node, placer, itemstack, pointed_thing) or itemstack end diff --git a/mods/default/torch.lua b/mods/default/torch.lua index 016ae685..a99a38db 100644 --- a/mods/default/torch.lua +++ b/mods/default/torch.lua @@ -78,7 +78,8 @@ minetest.register_node("default:torch", { local node = minetest.get_node(under) local def = minetest.registered_nodes[node.name] if def and def.on_rightclick and - ((not placer) or (placer and not placer:get_player_control().sneak)) then + not (placer and placer:is_player() and + placer:get_player_control().sneak) then return def.on_rightclick(under, node, placer, itemstack, pointed_thing) or itemstack end diff --git a/mods/default/trees.lua b/mods/default/trees.lua index d00a6b5e..44176d77 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -468,7 +468,9 @@ function default.sapling_on_place(itemstack, placer, pointed_thing, local node = minetest.get_node_or_nil(pos) local pdef = node and minetest.registered_nodes[node.name] - if pdef and pdef.on_rightclick and not placer:get_player_control().sneak then + if pdef and pdef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then return pdef.on_rightclick(pos, node, placer, itemstack, pointed_thing) end @@ -481,7 +483,7 @@ function default.sapling_on_place(itemstack, placer, pointed_thing, end end - local player_name = placer:get_player_name() + local player_name = placer and placer:get_player_name() or "" -- Check sapling position for protection if minetest.is_protected(pos, player_name) then minetest.record_protection_violation(pos, player_name) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 2fcc23de..51879678 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -266,7 +266,8 @@ function doors.register(name, def) local node = minetest.get_node(pointed_thing.under) local pdef = minetest.registered_nodes[node.name] if pdef and pdef.on_rightclick and - not placer:get_player_control().sneak then + not (placer and placer:is_player() and + placer:get_player_control().sneak) then return pdef.on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing) end @@ -290,12 +291,12 @@ function doors.register(name, def) return itemstack end - local pn = placer:get_player_name() + local pn = placer and placer:get_player_name() or "" if minetest.is_protected(pos, pn) or minetest.is_protected(above, pn) then return itemstack end - local dir = minetest.dir_to_facedir(placer:get_look_dir()) + local dir = placer and minetest.dir_to_facedir(placer:get_look_dir()) or 0 local ref = { {x = -1, y = 0, z = 0}, diff --git a/mods/farming/api.lua b/mods/farming/api.lua index 150301ad..1c63ee34 100644 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -144,12 +144,14 @@ farming.place_seed = function(itemstack, placer, pointed_thing, plantname) local under = minetest.get_node(pt.under) local above = minetest.get_node(pt.above) - if minetest.is_protected(pt.under, placer:get_player_name()) then - minetest.record_protection_violation(pt.under, placer:get_player_name()) + local player_name = placer and placer:get_player_name() or "" + + if minetest.is_protected(pt.under, player_name) then + minetest.record_protection_violation(pt.under, player_name) return end - if minetest.is_protected(pt.above, placer:get_player_name()) then - minetest.record_protection_violation(pt.above, placer:get_player_name()) + if minetest.is_protected(pt.above, player_name) then + minetest.record_protection_violation(pt.above, player_name) return end @@ -180,7 +182,7 @@ farming.place_seed = function(itemstack, placer, pointed_thing, plantname) minetest.add_node(pt.above, {name = plantname, param2 = 1}) tick(pt.above) if not (creative and creative.is_enabled_for - and creative.is_enabled_for(placer:get_player_name())) then + and creative.is_enabled_for(player_name)) then itemstack:take_item() end return itemstack @@ -310,7 +312,8 @@ farming.register_plant = function(name, def) local node = minetest.get_node(under) local udef = minetest.registered_nodes[node.name] if udef and udef.on_rightclick and - not (placer and placer:get_player_control().sneak) then + not (placer and placer:is_player() and + placer:get_player_control().sneak) then return udef.on_rightclick(under, node, placer, itemstack, pointed_thing) or itemstack end diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index d28764f9..6836baa7 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -278,7 +278,7 @@ minetest.register_node("flowers:waterlily", { local pos = pointed_thing.above local node = minetest.get_node(pointed_thing.under) local def = minetest.registered_nodes[node.name] - local player_name = placer:get_player_name() + local player_name = placer and placer:get_player_name() or "" if def and def.on_rightclick then return def.on_rightclick(pointed_thing.under, node, placer, itemstack, diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index e76f0545..634edf85 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -85,9 +85,10 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) end local pos = pointed_thing.under + local player_name = user and user:get_player_name() or "" - if minetest.is_protected(pos, user:get_player_name()) then - minetest.record_protection_violation(pos, user:get_player_name()) + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) return end @@ -133,8 +134,8 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) minetest.check_for_falling(pos) end - if not (creative and creative.is_enabled_for - and creative.is_enabled_for(user:get_player_name())) then + if not (creative and creative.is_enabled_for and + creative.is_enabled_for(player_name)) then itemstack:add_wear(65535 / ((uses or 200) - 1)) end diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 8b3ceed0..bb9f8ec8 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -22,21 +22,23 @@ local function rotate_and_place(itemstack, placer, pointed_thing) local p1 = pointed_thing.above local param2 = 0 - local placer_pos = placer:getpos() - if placer_pos then - param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) - end + if placer then + local placer_pos = placer:getpos() + if placer_pos then + param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) + end - local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) - local fpos = finepos.y % 1 + local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) + local fpos = finepos.y % 1 - if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) - or (fpos < -0.5 and fpos > -0.999999999) then - param2 = param2 + 20 - if param2 == 21 then - param2 = 23 - elseif param2 == 23 then - param2 = 21 + if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) + or (fpos < -0.5 and fpos > -0.999999999) then + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 + end end end return minetest.item_place(itemstack, placer, pointed_thing, param2) @@ -175,8 +177,9 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, on_place = function(itemstack, placer, pointed_thing) local under = minetest.get_node(pointed_thing.under) local wield_item = itemstack:get_name() + local player_name = placer and placer:get_player_name() or "" local creative_enabled = (creative and creative.is_enabled_for - and creative.is_enabled_for(placer:get_player_name())) + and creative.is_enabled_for(player_name)) if under and under.name:find("stairs:slab_") then -- place slab using under node orientation @@ -192,9 +195,8 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, if not recipeitem then return itemstack end - local player_name = placer:get_player_name() if minetest.is_protected(pointed_thing.under, player_name) and not - minetest.check_player_privs(placer, "protection_bypass") then + minetest.check_player_privs(player_name, "protection_bypass") then minetest.record_protection_violation(pointed_thing.under, player_name) return From b75a17984a56bb05310bfe575e4ce17509fad43b Mon Sep 17 00:00:00 2001 From: ForbiddenJ Date: Sun, 26 Nov 2017 12:44:55 +0100 Subject: [PATCH 056/195] Default: Expose open_chests and chest_lid_obstructed --- game_api.txt | 55 +++++++++++++++++++++++++++++++++++++---- mods/default/legacy.lua | 3 +++ mods/default/nodes.lua | 52 +++++++++++++++++++------------------- 3 files changed, 80 insertions(+), 30 deletions(-) diff --git a/game_api.txt b/game_api.txt index 82711288..bc5a8c7a 100644 --- a/game_api.txt +++ b/game_api.txt @@ -88,6 +88,56 @@ The contents of `creative.formspec_add` is appended to every creative inventory page. Mods can use it to add additional formspec elements onto the default creative inventory formspec to be drawn after each update. +Chests API +---------- + +The chests API allows the creation of chests, which have their own inventories for holding items. + +`default.chest.get_chest_formspec(pos)` + + * Returns a formspec for a specific chest. + * `pos` Location of the chest node, e.g `{x = 1, y = 1, z = 1}` + +`default.chest.chest_lid_obstructed(pos)` + + * Returns a boolean depending on whether or not a chest has its top obstructed by a solid node. + * `pos` Location of the chest node, e.g `{x = 1, y = 1, z = 1}` + +`default.chest.chest_lid_close(pn)` + + * Closes the chest that a player is currently looking in. + * `pn` The name of the player whose chest is going to be closed + +`default.chest.open_chests` + + * A table indexed by player name to keep track of who opened what chest. + * Key: The name of the player. + * Value: A table containing information about the chest the player is looking at. + e.g `{ pos = {1, 1, 1}, sound = null, swap = "chest" }` + +`default.chest.register_chest(name, def)` + + * Registers new chest + * `name` Name for chest + * `def` See [#Chest Definition] + +### Chest Definition + + description = "Chest", + tiles = { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_front.png", + "default_chest_inside.png" + }, -- Textures which are applied to the chest model. + sounds = default.node_sound_wood_defaults(), + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, + protected = false, -- If true, only placer can modify chest. + Doors API --------- @@ -706,11 +756,6 @@ GUI and formspecs * Entire formspec for the survival inventory -`default.get_chest_formspec(pos)` - - * Get the chest formspec using the defined GUI elements - * pos: Location of the node - `default.get_furnace_active_formspec(fuel_percent, item_percent)` * Get the active furnace formspec using the defined GUI elements diff --git a/mods/default/legacy.lua b/mods/default/legacy.lua index 37f03212..0669914c 100644 --- a/mods/default/legacy.lua +++ b/mods/default/legacy.lua @@ -34,3 +34,6 @@ if minetest.get_modpath("player_api") then default.player_set_textures = player_api.set_textures default.player_set_animation = player_api.set_animation end + +-- Chests +default.register_chest = default.chest.register_chest diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 4aa35dc6..b60c4837 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1811,7 +1811,9 @@ minetest.register_node("default:lava_flowing", { -- Tools / "Advanced" crafting / Non-"natural" -- -function default.get_chest_formspec(pos) +default.chest = {} + +function default.chest.get_chest_formspec(pos) local spos = pos.x .. "," .. pos.y .. "," .. pos.z local formspec = "size[8,9]" .. @@ -1827,7 +1829,7 @@ function default.get_chest_formspec(pos) return formspec end -local function chest_lid_obstructed(pos) +function default.chest.chest_lid_obstructed(pos) local above = {x = pos.x, y = pos.y + 1, z = pos.z} local def = minetest.registered_nodes[minetest.get_node(above).name] -- allow ladders, signs, wallmounted things and torches to not obstruct @@ -1841,15 +1843,14 @@ local function chest_lid_obstructed(pos) return true end -local open_chests = {} +function default.chest.chest_lid_close(pn) + local chest_open_info = default.chest.open_chests[pn] + local pos = chest_open_info.pos + local sound = chest_open_info.sound + local swap = chest_open_info.swap -local function chest_lid_close(pn) - local pos = open_chests[pn].pos - local sound = open_chests[pn].sound - local swap = open_chests[pn].swap - - open_chests[pn] = nil - for k, v in pairs(open_chests) do + default.chest.open_chests[pn] = nil + for k, v in pairs(default.chest.open_chests) do if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then return true end @@ -1861,6 +1862,8 @@ local function chest_lid_close(pn) minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10}) end +default.chest.open_chests = {} + minetest.register_on_player_receive_fields(function(player, formname, fields) if formname ~= "default:chest" then return @@ -1870,22 +1873,22 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end local pn = player:get_player_name() - if not open_chests[pn] then + if not default.chest.open_chests[pn] then return end - chest_lid_close(pn) + default.chest.chest_lid_close(pn) return true end) minetest.register_on_leaveplayer(function(player) local pn = player:get_player_name() - if open_chests[pn] then - chest_lid_close(pn) + if default.chest.open_chests[pn] then + default.chest.chest_lid_close(pn) end end) -function default.register_chest(name, d) +function default.chest.register_chest(name, d) local def = table.copy(d) def.drawtype = "mesh" def.visual = "mesh" @@ -1940,15 +1943,15 @@ function default.register_chest(name, d) minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos, max_hear_distance = 10}) - if not chest_lid_obstructed(pos) then + if not default.chest.chest_lid_obstructed(pos) then minetest.swap_node(pos, { name = "default:" .. name .. "_open", param2 = node.param2 }) end minetest.after(0.2, minetest.show_formspec, clicker:get_player_name(), - "default:chest", default.get_chest_formspec(pos)) - open_chests[clicker:get_player_name()] = { pos = pos, + "default:chest", default.chest.get_chest_formspec(pos)) + default.chest.open_chests[clicker:get_player_name()] = { pos = pos, sound = def.sound_close, swap = name } end def.on_blast = function() end @@ -1969,7 +1972,7 @@ function default.register_chest(name, d) minetest.show_formspec( player:get_player_name(), "default:chest_locked", - default.get_chest_formspec(pos) + default.chest.get_chest_formspec(pos) ) end def.on_skeleton_key_use = function(pos, player, newsecret) @@ -2007,15 +2010,15 @@ function default.register_chest(name, d) def.on_rightclick = function(pos, node, clicker) minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos, max_hear_distance = 10}) - if not chest_lid_obstructed(pos) then + if not default.chest.chest_lid_obstructed(pos) then minetest.swap_node(pos, { name = "default:" .. name .. "_open", param2 = node.param2 }) end minetest.after(0.2, minetest.show_formspec, clicker:get_player_name(), - "default:chest", default.get_chest_formspec(pos)) - open_chests[clicker:get_player_name()] = { pos = pos, + "default:chest", default.chest.get_chest_formspec(pos)) + default.chest.open_chests[clicker:get_player_name()] = { pos = pos, sound = def.sound_close, swap = name } end def.on_blast = function(pos) @@ -2093,8 +2096,7 @@ function default.register_chest(name, d) }) end - -default.register_chest("chest", { +default.chest.register_chest("chest", { description = "Chest", tiles = { "default_chest_top.png", @@ -2110,7 +2112,7 @@ default.register_chest("chest", { groups = {choppy = 2, oddly_breakable_by_hand = 2}, }) -default.register_chest("chest_locked", { +default.chest.register_chest("chest_locked", { description = "Locked Chest", tiles = { "default_chest_top.png", From 2c5670563adac0286828fafcf71f66ebf38b7d6f Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 20 Nov 2017 04:13:41 +0000 Subject: [PATCH 057/195] Flowers: Add black tulip, green chrysanthemum Adds a direct resource of green dye, and a flower resource of black dye. Completes the colour sequence: red, orange, yellow, green, blue, violet. Makes all base dyes cultivatable and sustainable, without the presence of coal. Add the new flowers to the world with the same density variation as the others, but obviously with different noise seeds. Results in more flowers in a world and more variety of flower combinations. --- mods/flowers/README.txt | 2 ++ mods/flowers/init.lua | 12 ++++++++++++ mods/flowers/mapgen.lua | 2 ++ .../textures/flowers_chrysanthemum_green.png | Bin 0 -> 236 bytes mods/flowers/textures/flowers_tulip_black.png | Bin 0 -> 172 bytes 5 files changed, 16 insertions(+) create mode 100644 mods/flowers/textures/flowers_chrysanthemum_green.png create mode 100644 mods/flowers/textures/flowers_tulip_black.png diff --git a/mods/flowers/README.txt b/mods/flowers/README.txt index 6fd30942..4b3149c4 100644 --- a/mods/flowers/README.txt +++ b/mods/flowers/README.txt @@ -26,3 +26,5 @@ yyt16384 (CC BY-SA 3.0): paramat (CC BY-SA 3.0): flowers_dandelion_yellow.png -- Derived from RHRhino's texture + flowers_tulip_black.png -- Derived from RHRhino's texture + flowers_chrysanthemum_green.png diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index 6836baa7..51b0d87f 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -75,6 +75,12 @@ flowers.datas = { {-4 / 16, -0.5, -4 / 16, 4 / 16, -2 / 16, 4 / 16}, {color_yellow = 1, flammable = 1} }, + { + "chrysanthemum_green", + "Green Chrysanthemum", + {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16}, + {color_green = 1, flammable = 1} + }, { "geranium", "Blue Geranium", @@ -93,6 +99,12 @@ flowers.datas = { {-5 / 16, -0.5, -5 / 16, 5 / 16, -2 / 16, 5 / 16}, {color_white = 1, flammable = 1} }, + { + "tulip_black", + "Black Tulip", + {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16}, + {color_black = 1, flammable = 1} + }, } for _,item in pairs(flowers.datas) do diff --git a/mods/flowers/mapgen.lua b/mods/flowers/mapgen.lua index 6ea796cd..8e8c4936 100644 --- a/mods/flowers/mapgen.lua +++ b/mods/flowers/mapgen.lua @@ -147,9 +147,11 @@ function flowers.register_decorations() register_flower(436, "rose") register_flower(19822, "tulip") register_flower(1220999, "dandelion_yellow") + register_flower(800081, "chrysanthemum_green") register_flower(36662, "geranium") register_flower(1133, "viola") register_flower(73133, "dandelion_white") + register_flower(42, "tulip_black") register_mushroom("mushroom_brown") register_mushroom("mushroom_red") diff --git a/mods/flowers/textures/flowers_chrysanthemum_green.png b/mods/flowers/textures/flowers_chrysanthemum_green.png new file mode 100644 index 0000000000000000000000000000000000000000..11980463d28c1c7dbc49f6e83f600077ab983ce2 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}RDe&2D}y3~oIRJUi>9ipu8NnS zqK}BIAFol6pk|=Caiok{gspjmuVtLJb+mItpFz|tw%FMsnX6eBJ!eEuBp~r}==kFqQ=Q1v5B2yO9RuIC#1^hDcma zPLMd`5W_T8|CqYM$pZ?y-2#F_i3t-PiBECt_`tAng~6QDXOA8@cHlr~4wo@Ev$Zh0 g{w4us?J0~5jeU$;bge#h0nK9YboFyt=akR{099E@-v9sr literal 0 HcmV?d00001 diff --git a/mods/flowers/textures/flowers_tulip_black.png b/mods/flowers/textures/flowers_tulip_black.png new file mode 100644 index 0000000000000000000000000000000000000000..1dd09f746caaf3baf52b57c6d262cb2bfe5fbaf6 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF3h)VWWl&_W7F5-fQq_&JG)s0e z&bIQX2@UDdjhShfu+SuVnOVwmv!Yei?FXj&JW_oJ)Wuj5{Oq QfqEG{UHx3vIVCg!00H$fAOHXW literal 0 HcmV?d00001 From ed83e30d6826083f273ca323420402485c260cdc Mon Sep 17 00:00:00 2001 From: ezhh Date: Sat, 25 Nov 2017 22:49:32 +0000 Subject: [PATCH 058/195] Default: Make burntimes more rational and consistent --- mods/default/crafting.lua | 52 +++++++++++---------------------------- 1 file changed, 14 insertions(+), 38 deletions(-) diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index dce630da..2d11d26c 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -853,7 +853,7 @@ minetest.register_craft({ -- Fuels -- --- Support use of group:tree +-- Support use of group:tree, includes default:tree which has the same burn time minetest.register_craft({ type = "fuel", recipe = "group:tree", @@ -876,12 +876,6 @@ minetest.register_craft({ burntime = 26, }) -minetest.register_craft({ - type = "fuel", - recipe = "default:tree", - burntime = 30, -}) - minetest.register_craft({ type = "fuel", recipe = "default:acacia_tree", @@ -895,7 +889,7 @@ minetest.register_craft({ }) --- Support use of group:wood +-- Support use of group:wood, includes default:wood which has the same burn time minetest.register_craft({ type = "fuel", recipe = "group:wood", @@ -914,12 +908,6 @@ minetest.register_craft({ burntime = 6, }) -minetest.register_craft({ - type = "fuel", - recipe = "default:wood", - burntime = 7, -}) - minetest.register_craft({ type = "fuel", recipe = "default:acacia_wood", @@ -933,53 +921,47 @@ minetest.register_craft({ }) --- Support use of group:sapling +-- Support use of group:sapling, includes default:sapling which has the same burn time minetest.register_craft({ type = "fuel", recipe = "group:sapling", - burntime = 10, + burntime = 5, }) minetest.register_craft({ type = "fuel", recipe = "default:bush_sapling", - burntime = 6, + burntime = 3, }) minetest.register_craft({ type = "fuel", recipe = "default:acacia_bush_sapling", - burntime = 7, + burntime = 4, }) minetest.register_craft({ type = "fuel", recipe = "default:aspen_sapling", - burntime = 8, + burntime = 4, }) minetest.register_craft({ type = "fuel", recipe = "default:pine_sapling", - burntime = 9, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:sapling", - burntime = 10, + burntime = 5, }) minetest.register_craft({ type = "fuel", recipe = "default:acacia_sapling", - burntime = 11, + burntime = 6, }) minetest.register_craft({ type = "fuel", recipe = "default:junglesapling", - burntime = 12, + burntime = 6, }) @@ -1029,13 +1011,13 @@ minetest.register_craft({ minetest.register_craft({ type = "fuel", recipe = "default:junglegrass", - burntime = 2, + burntime = 3, }) minetest.register_craft({ type = "fuel", recipe = "group:leaves", - burntime = 1, + burntime = 4, }) minetest.register_craft({ @@ -1047,7 +1029,7 @@ minetest.register_craft({ minetest.register_craft({ type = "fuel", recipe = "default:papyrus", - burntime = 1, + burntime = 3, }) minetest.register_craft({ @@ -1059,7 +1041,7 @@ minetest.register_craft({ minetest.register_craft({ type = "fuel", recipe = "default:ladder_wood", - burntime = 2, + burntime = 7, }) minetest.register_craft({ @@ -1092,12 +1074,6 @@ minetest.register_craft({ burntime = 30, }) -minetest.register_craft({ - type = "fuel", - recipe = "default:apple", - burntime = 3, -}) - minetest.register_craft({ type = "fuel", recipe = "default:coal_lump", From 2824e4bb7c4e16c512c2d9a6260e1751516317cb Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 26 Nov 2017 04:40:59 +0000 Subject: [PATCH 059/195] Binoculars: Update to use 'zoom_fov' player property In survival mode, zoom is disabled, the binoculars item is needed to allow a zoom with a 10 degree FOV, realistic for compact binoculars. Creative mode or per-player creative privilege allows a zoom with a 15 degree field of view (the default MT engine zoom FOV). --- mods/binoculars/README.txt | 10 ++++++---- mods/binoculars/init.lua | 19 +++++++++++-------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/mods/binoculars/README.txt b/mods/binoculars/README.txt index 3b90b4c4..0c65f6ea 100644 --- a/mods/binoculars/README.txt +++ b/mods/binoculars/README.txt @@ -24,12 +24,14 @@ O_O Usage ----- -In survival mode, use of zoom requires the binoculars item in your inventory. +In survival mode, use of zoom requires the binoculars item in your inventory, +they will allow a 10 degree field of view. It can take up to 5 seconds for adding to or removal from inventory to have an -effect, however to instantly allow the use of zoom 'use' (leftclick) the item. +effect, however to instantly allow the use of this zoom 'use' (leftclick) the +item. -Zoom is automatically allowed in creative mode and for any player with the -'creative' privilege. +Zoom with a field of view of 15 degrees is automatically allowed in creative +mode and for any player with the 'creative' privilege. The 'binoculars.update_player_property()' function is global so can be redefined by a mod for alternative behaviour. diff --git a/mods/binoculars/init.lua b/mods/binoculars/init.lua index 153044ae..0b43a061 100644 --- a/mods/binoculars/init.lua +++ b/mods/binoculars/init.lua @@ -4,12 +4,8 @@ binoculars = {} -- Detect creative mod - local creative_mod = minetest.get_modpath("creative") - - -- Cache creative mode setting as fallback if creative mod not present - local creative_mode_cache = minetest.settings:get_bool("creative_mode") @@ -20,11 +16,18 @@ function binoculars.update_player_property(player) local creative_enabled = (creative_mod and creative.is_enabled_for(player:get_player_name())) or creative_mode_cache + local new_zoom_fov = 0 + + if player:get_inventory():contains_item( + "main", "binoculars:binoculars") then + new_zoom_fov = 10 + elseif creative_enabled then + new_zoom_fov = 15 + end + -- Only set property if necessary to avoid player mesh reload - local new_can_zoom = creative_enabled or player:get_inventory():contains_item( - "main", "binoculars:binoculars") - if player:get_properties().can_zoom ~= new_can_zoom then - player:set_properties({can_zoom = new_can_zoom}) + if player:get_properties().zoom_fov ~= new_zoom_fov then + player:set_properties({zoom_fov = new_zoom_fov}) end end From 0132bfe41e03f400dbef85354f47ea44d962b0ce Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 5 Dec 2017 05:40:16 +0000 Subject: [PATCH 060/195] Stairs: Improve inner/outer stair descriptions. Code cleanup --- mods/stairs/init.lua | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index bb9f8ec8..e85c7081 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -44,7 +44,8 @@ local function rotate_and_place(itemstack, placer, pointed_thing) return minetest.item_place(itemstack, placer, pointed_thing, param2) end --- Register stairs. + +-- Register stair -- Node will be called stairs:stair_ function stairs.register_stair(subname, recipeitem, groups, images, description, sounds) @@ -141,7 +142,8 @@ end -- Slab facedir to placement 6d matching table local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4} --- Register slabs. + +-- Register slab -- Node will be called stairs:slab_ function stairs.register_slab(subname, recipeitem, groups, images, description, sounds) @@ -292,7 +294,8 @@ if replace then }) end --- Register stairs. + +-- Register inner stair -- Node will be called stairs:stair_inner_ function stairs.register_stair_inner(subname, recipeitem, groups, images, description, sounds) @@ -317,7 +320,7 @@ function stairs.register_stair_inner(subname, recipeitem, groups, images, descri end groups.stair = 1 minetest.register_node(":stairs:stair_inner_" .. subname, { - description = description .. " Inner", + description = "Inner " .. description, drawtype = "nodebox", tiles = stair_images, paramtype = "light", @@ -368,7 +371,8 @@ function stairs.register_stair_inner(subname, recipeitem, groups, images, descri end end --- Register stairs. + +-- Register outer stair -- Node will be called stairs:stair_outer_ function stairs.register_stair_outer(subname, recipeitem, groups, images, description, sounds) @@ -393,7 +397,7 @@ function stairs.register_stair_outer(subname, recipeitem, groups, images, descri end groups.stair = 1 minetest.register_node(":stairs:stair_outer_" .. subname, { - description = description .. " Outer", + description = "Outer " .. description, drawtype = "nodebox", tiles = stair_images, paramtype = "light", @@ -443,6 +447,7 @@ function stairs.register_stair_outer(subname, recipeitem, groups, images, descri end end + -- Stair/slab registration function. -- Nodes will be called stairs:{stair,slab}_ @@ -453,6 +458,7 @@ function stairs.register_stair_and_slab(subname, recipeitem, groups, images, des stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds) end + -- Register default stairs and slabs stairs.register_stair_and_slab( From 0c841771a75e6688c99814d4314d491986d7f0cb Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 11 Dec 2017 08:55:39 +0000 Subject: [PATCH 061/195] Book textures: Replace with more original textures --- mods/default/README.txt | 10 +++++----- mods/default/license.txt | 4 ++-- mods/default/textures/default_book.png | Bin 255 -> 2833 bytes mods/default/textures/default_book_written.png | Bin 282 -> 262 bytes .../textures/default_bookshelf_slot.png | Bin 191 -> 2769 bytes 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index 977594f2..d67f6205 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -113,6 +113,7 @@ paramat (CC BY-SA 3.0): default_silver_sandstone.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) default_silver_sandstone_brick.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) default_silver_sandstone_block.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) + default_bookshelf_slot.png -- Derived from a texture by Gambit (CC-BY-SA 3.0) TumeniNodes (CC BY-SA 4.0): default_desert_cobble.png -- Derived from a texture by brunob.santos (CC BY-SA 4.0) @@ -125,7 +126,6 @@ BlockMen (CC BY-SA 3.0): default_gold_ingot.png default_tool_steelsword.png default_diamond.png - default_book.png default_tool_*.png default_lava_source_animated.png default_lava_flowing_animated.png @@ -139,11 +139,7 @@ BlockMen (CC BY-SA 3.0): bubble.png gui_*.png -Wuzzy (CC BY-SA 3.0): - default_bookshelf_slot.png (based on default_book.png) - sofar (CC BY-SA 3.0): - default_book_written.png, based on default_book.png default_aspen_sapling default_aspen_tree default_aspen_tree_top, derived from default_pine_tree_top (by paramat) @@ -180,6 +176,7 @@ Gambit (CC BY-SA 3.0): default_snowball.png default_key.png default_key_skeleton.png + default_book.png asl97 (CC BY-SA 3.0): default_ice.png @@ -218,6 +215,9 @@ kilbith (CC BY-SA 3.0): tobyplowy (CC BY-SA 3.0): default_kelp.png +CloudyProton (CC BY-SA 3.0): + default_book_written.png, based on default_book.png by Gambit + Glass breaking sounds (CC BY 3.0): 1: http://www.freesound.org/people/cmusounddesign/sounds/71947/ 2: http://www.freesound.org/people/Tomlija/sounds/97669/ diff --git a/mods/default/license.txt b/mods/default/license.txt index a6ec47a3..32cd7510 100644 --- a/mods/default/license.txt +++ b/mods/default/license.txt @@ -19,7 +19,7 @@ Licenses of media (textures, models and sounds) ----------------------------------------------- Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) -Copyright (C) 2010-2016: +Copyright (C) 2010-2017: celeron55, Perttu Ahola Cisoun G4JC @@ -45,6 +45,7 @@ Copyright (C) 2010-2016: kaeza kilbith tobyplowy + CloudyProton You are free to: Share — copy and redistribute the material in any medium or format. @@ -112,7 +113,6 @@ http://creativecommons.org/licenses/by-sa/4.0/ Attribution-ShareAlike 2.0 Generic (CC BY-SA 2.0) Copyright (C) 2014-2016 Neuromancer - You are free to: Share — copy and redistribute the material in any medium or format. Adapt — remix, transform, and build upon the material for any purpose, even commercially. diff --git a/mods/default/textures/default_book.png b/mods/default/textures/default_book.png index 448a7df0287088582d9e12eaa1189052ace175e2..d7190ddf6d05d290213eff43cbfb65af6f1c9489 100644 GIT binary patch delta 2827 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 Ybl-D_2&{CR2egC1)78&qol`;+0MXz|nE(I) diff --git a/mods/default/textures/default_book_written.png b/mods/default/textures/default_book_written.png index 9196ac64764e2ada74ef8d7c3684716b680239ff..f23d122575be2970be79e02bdbc7aa8b9afd9c6c 100644 GIT binary patch delta 246 zcmVh} zh$14FCMK3CDRWE%oT8MVprE0snyIg%ueGSl%gfBr$I;Qz-Qe2p?(X#T^ul@h8UO$Q z0d!JMQvg8b*k%9#0CGu0K~xyih0ehagdhw>QObi>tAZWI|8M`*ff0=^jNSF5X|8h* z6GFJ{qljE-lwr6KGuN#Vbx{3ml>}42kE`l83N88gCvzp{j0PYyVpiT?gk+6Sp(mwc w2AWQAKq;0od+(1ff+hO*oT;F_FuM2o0R_ARwI5qZZ2$lO07*qoM6N<$g6}A2mjD0& delta 267 zcmZo;n#D9hqMn7Bfq~)e-A6${N;kkK#IYh7ML)4ruu{l3pP$z%n{HL=vlF@Yr!Oj<^_{yeN<6(Wn^2Z>~)?;)>T@fC25XGuj^rH z2?=jknbxDyjklICxwaluGt%P~ZkwUAH&7sneKEs@l9KF328KUId@Ac#r?>%aWbkzL Lb75KMl+XkKRjXKP diff --git a/mods/default/textures/default_bookshelf_slot.png b/mods/default/textures/default_bookshelf_slot.png index 715a3dce79d22d9e3d73db7cb18d1ab4dd435a29..ca3306b16d9032f1a5403599eefdb0d5d3d78c40 100644 GIT binary patch delta 2731 zcmV;c3RLyK0nrtZBYz4xX+uL$P-t&-Z*ypGa3D!TLm+T+Z)Rz1WdHzp+MSknR8-d% zhtIutdZEoQ0#b(FyTAa_dy`&8VVD_UC<6{NG_fI~0ue<-nj%P0#DLLIBvwSR5EN9f z2P6n6F&ITuEN@2Ei>|D^_ww@l3o6c zm;e!*vpE?o5f_L!B}k0Z0NWkO#^@ z9q0f3Xv3lIchAu>dPU)xk0{A5EKc;LJ1HL z5<+>u$9dISw03U@r;Pdb`_%=KWKZEBGfDjQHqKX(I48#TTN1~8;gpaI8ijWGV z0cl0Lkv`-mGK$O~Z&4T&1w}_0qHIx~s8AFOwFb2wRf4KU9Y%GadQmq~W2jlwM>H9& zh}K8jpuNx$=mc~Yx)5D~ZbG-CFQRXwCx6hdF&GRDqm8k`cw!#HrxSaPGJ$91oX|tH2$>oxu&^ zCUFaRDZD1$2Jeq&<8$z(_(ps;{yKgFzd(>CXcO!RA%rBtCPF2lm2i>pfbfz?B!8+A zt%-p|E^#BVl6Z`GnK(v#OOhe!kz7d8Bq3=B=@980=`QIdnM~FqJCdWw0`d-WGx-Af z5&4Y-MZ!qJOM)%2L83;YLt;qcxg=gvQ_@LtwPdbjh2#mz>yk54cquI@7b&LHdZ`+z zlTss6bJ7%PQ)z$cROu4wBhpu-r+;LyGFmcjGHjUwnS(MHWX357MV;b8VNo_y8Yvek z6I2XUo9abPq83xXqYhAKWo2ZS$%e^h%ht%AmK~)bG%cDJErnJ}J5C#>y<4KR#Ayj< z$@V3!ONN%r%Pp02l;g-1$+gMdmU|~pmv@s-mft1cDgRIbrJ$z}sF0Amz>RYg@#RiSFV>VWEknzmY~TE1GF+Cz1MIzv5PyLvhF_J8+x#wgi;89Ete8nzgY z8PSY1jmyXF)a;mc^>(B7bo*HQ1NNg1st!zt z28YLv>W*y3CdWx9U4N$}r=w2KolTti&h5_gE;cUfT+X>7t{$#Mt^;l|ZlP|~Zjap6 z+!Nee+-E&3Jl1-g^F(|4c<%BX@lx_)c{O{@dRuv~^X~N_`2_n^`#kp5^X2 zj2>R4y()XvmDLKXQ&yjjk&I!+oQOrohQ}U>eb4k~HZbSnyy9x(W?3$*y{u`s_YbV#g7oZ-4~tGO?dJd^5@=9B%C4<&y}2~TND#ihok zp5)2!l6k#p%4ykYgX#L|h3TVfY}V{qGt2kkH)TK>t1`L-RMF2=zfecGML3pepIMXn zCMzuKM7DG`FS|cSFK2tsWUhPew`);rS!;XpRP#3Fjeo6kT35dwS|7K*XM_5Nf(;WJ zJvJWRMA($P>8E^?{IdL4o5MGE7bq2MEEwP7v8AO@qL5!WvekBL-8R%V?zVyL=G&{b ze=K4bT`e{#t|)$A!YaA?jp;X)-+bB;zhj`(vULAW%ue3U;av{94wp%n<(7@__S@Z2 zPA@Mie}AQwPOQFN<6P5Lt600ec77jw-_U-? z{jGIMb;Wh>4sZ|LsrRVwXwYh?IEXozdGJYNSYzL}jBlHp6q<^gJ{;m58a*6zxVPD= zx%r6Vkr^j5!`X2{BzCX?yfA&kpFYhM` zo{*nZOsY&aPnk`fns%SQ@pR?WiD&807FT8pf0h2V_PNgUAAWQEt$#LRcH#y9#i!p( zUdq2b^lI6wp1FXzN3T;~FU%Lck$-deE#qz9yYP3D3t8{6?<+s(e(3(_^YOu_)K8!O z1p}D#{E@&~+mRt6Ni<1BK~xCWV_;xlU_8LUWWd1M!@!ZkAjZR>IEBGMg`vQM!Dj-4 lvjT&G0|QS312Y2z005x81|rn5wNU^7002ovPDHLkV1mH^J;MM1 delta 135 zcmca8x}R}^^5hIIg&M{rZ+91l4pvzY1_lPs0*}aI1_o|n5N2eUHAey{$X?><>&pI+ zRg#xWeKCV|08q%t)5S4_<9c!eLlZmC873YZIUY7mo<27o_FEES9)><1Ngr~O112X3 icqBZ?Nk~X;U|=}Z$L`Cs&Y&8oo59o7&t;ucLK6U3bs`P` From 21b3c841bdb6afe2b45dcc3d4273b27efdda7d89 Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 11 Dec 2017 13:12:24 +0000 Subject: [PATCH 062/195] Default texture licenses: Move some to CC BY-SA 3.0. Remove WTFPL --- mods/default/README.txt | 10 +++--- mods/default/license.txt | 70 +++------------------------------------- 2 files changed, 8 insertions(+), 72 deletions(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index d67f6205..fb30e268 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -115,8 +115,8 @@ paramat (CC BY-SA 3.0): default_silver_sandstone_block.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) default_bookshelf_slot.png -- Derived from a texture by Gambit (CC-BY-SA 3.0) -TumeniNodes (CC BY-SA 4.0): - default_desert_cobble.png -- Derived from a texture by brunob.santos (CC BY-SA 4.0) +TumeniNodes (CC BY-SA 3.0): + default_desert_cobble.png -- Derived from a texture by brunob.santos (CC BY-SA 3.0) BlockMen (CC BY-SA 3.0): default_aspen_leaves.png -- Derived from Sofar's texture @@ -146,14 +146,12 @@ sofar (CC BY-SA 3.0): default_aspen_wood, derived from default_pine_wood (by paramat) default_chest_inside -sofar (WTFPL): +sofar (CC0 1.0): default_gravel.png -- Derived from Gambit's PixelBOX texture pack light gravel -Neuromancer (CC BY-SA 2.0): +Neuromancer (CC BY-SA 3.0): default_cobble.png, based on texture by Brane praefect default_mossycobble.png, based on texture by Brane praefect - -Neuromancer (CC BY-SA 3.0): default_dirt.png default_furnace_*.png diff --git a/mods/default/license.txt b/mods/default/license.txt index 32cd7510..ce143ee5 100644 --- a/mods/default/license.txt +++ b/mods/default/license.txt @@ -20,6 +20,7 @@ Licenses of media (textures, models and sounds) Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) Copyright (C) 2010-2017: + celeron55, Perttu Ahola Cisoun G4JC @@ -46,6 +47,7 @@ Copyright (C) 2010-2017: kilbith tobyplowy CloudyProton + TumeniNodes You are free to: Share — copy and redistribute the material in any medium or format. @@ -77,73 +79,8 @@ http://creativecommons.org/licenses/by-sa/3.0/ ----------------------- -Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) -Copyright (C) 2017 TumeniNodes - -You are free to: -Share — copy and redistribute the material in any medium or format. -Adapt — remix, transform, and build upon the material for any purpose, even commercially. -The licensor cannot revoke these freedoms as long as you follow the license terms. - -Under the following terms: - -Attribution — You must give appropriate credit, provide a link to the license, and -indicate if changes were made. You may do so in any reasonable manner, but not in any way -that suggests the licensor endorses you or your use. - -ShareAlike — If you remix, transform, or build upon the material, you must distribute -your contributions under the same license as the original. - -No additional restrictions — You may not apply legal terms or technological measures that -legally restrict others from doing anything the license permits. - -Notices: - -You do not have to comply with the license for elements of the material in the public -domain or where your use is permitted by an applicable exception or limitation. -No warranties are given. The license may not give you all of the permissions necessary -for your intended use. For example, other rights such as publicity, privacy, or moral -rights may limit how you use the material. - -For more details: -http://creativecommons.org/licenses/by-sa/4.0/ - ------------------------ - -Attribution-ShareAlike 2.0 Generic (CC BY-SA 2.0) -Copyright (C) 2014-2016 Neuromancer - -You are free to: -Share — copy and redistribute the material in any medium or format. -Adapt — remix, transform, and build upon the material for any purpose, even commercially. -The licensor cannot revoke these freedoms as long as you follow the license terms. - -Under the following terms: - -Attribution — You must give appropriate credit, provide a link to the license, and -indicate if changes were made. You may do so in any reasonable manner, but not in any way -that suggests the licensor endorses you or your use. - -ShareAlike — If you remix, transform, or build upon the material, you must distribute -your contributions under the same license as the original. - -No additional restrictions — You may not apply legal terms or technological measures that -legally restrict others from doing anything the license permits. - -Notices: - -You do not have to comply with the license for elements of the material in the public -domain or where your use is permitted by an applicable exception or limitation. -No warranties are given. The license may not give you all of the permissions necessary -for your intended use. For example, other rights such as publicity, privacy, or moral -rights may limit how you use the material. - -For more details: -http://creativecommons.org/licenses/by-sa/2.0/ - ------------------------ - Attribution 3.0 Unported (CC BY 3.0) + Copyright (C) 2009 cmusounddesign Copyright (C) 2010 Tomlija Copyright (C) 2010 lsprice @@ -180,6 +117,7 @@ http://creativecommons.org/licenses/by/3.0/ ----------------------- CC0 1.0 Universal (CC0 1.0) Public Domain Dedication + Iwan Gabovitch Ottomaani138 Ogrebane From 51345103561a59d2d16409cdcd226106d24c3e70 Mon Sep 17 00:00:00 2001 From: Reedych Date: Sat, 16 Dec 2017 11:10:35 +0600 Subject: [PATCH 063/195] Replace setpos with set_pos in sethome --- mods/sethome/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/sethome/init.lua b/mods/sethome/init.lua index 13a33e57..7f1ebced 100644 --- a/mods/sethome/init.lua +++ b/mods/sethome/init.lua @@ -61,7 +61,7 @@ sethome.go = function(name) local pos = sethome.get(name) local player = minetest.get_player_by_name(name) if player and pos then - player:setpos(pos) + player:set_pos(pos) return true end return false From d603707e1a5177211ba5d6ea5852a740e2ae24ef Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 14 Dec 2017 20:11:29 +0000 Subject: [PATCH 064/195] Dirt sounds: Remove extreme sub frequencies, trim for zero amplitude starts --- .../sounds/default_dirt_footstep.1.ogg | Bin 11144 -> 9155 bytes .../sounds/default_dirt_footstep.2.ogg | Bin 7504 -> 7553 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/sounds/default_dirt_footstep.1.ogg b/mods/default/sounds/default_dirt_footstep.1.ogg index 84a197d2b0a96cc10438596893c6e37cf5958c8d..201aa3b2daff77452b721edb2f7dfc796fd6cf5c 100644 GIT binary patch delta 7714 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 R?9W|`lRI4(^cbyy{{sGL8A<>E delta 9720 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 D>uv6j delta 3895 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 Date: Wed, 20 Dec 2017 14:39:49 +0000 Subject: [PATCH 065/195] Book textures: Reset colour profiles to remove warnings --- mods/default/textures/default_book.png | Bin 2833 -> 204 bytes .../textures/default_bookshelf_slot.png | Bin 2769 -> 140 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/textures/default_book.png b/mods/default/textures/default_book.png index d7190ddf6d05d290213eff43cbfb65af6f1c9489..bcf1e6a00f20d78ba884b85432ca9760292f04dc 100644 GIT binary patch delta 10 RcmbOzc7}0+^5hJzl>ikn1J(cl delta 2657 zcmV-n3ZC`M0g)DvBYz4xX+uL$P-t&-Z*ypGa3D!TLm+T+Z)Rz1WdHzp+MSknR8-d% zhtIutdZEoQ0#b(FyTAa_dy`&8VVD_UC<6{NG_fI~0ue<-nj%P0#DLLIBvwSR5EN9f z2P6n6F&ITuEN@2Ei>|D^_ww@l3o6c zm;e!*vpE?o5f_L!B}k0Z0NWkO#^@ z9q0f3Xv3lIchAu>dPU)xk0{A5EKc;LJ1HL z5<+>u$9dISw03U@r;Pdb`_%=KWKZEBGfDjQHqKX(I48#TTN1~8;gpaI8ijWGV z0cl0Lkv`-mGK$O~Z&4T&1w}_0qHIx~s8AFOwFb2wRf4KU9Y%GadQmq~W2jlwM>H9& zh}K8jpuNx$=mc~Yx)5D~ZbG-CFQRXwCx6hdF&GRDqm8k`cw!#HrxSaPGJ$91oX|tH2$>oxu&^ zCUFaRDZD1$2Jeq&<8$z(_(ps;{yKgFzd(>CXcO!RA%rBtCPF2lm2i>pfbfz?B!8+A zt%-p|E^#BVl6Z`GnK(v#OOhe!kz7d8Bq3=B=@980=`QIdnM~FqJCdWw0`d-WGx-Af z5&4Y-MZ!qJOM)%2L83;YLt;qcxg=gvQ_@LtwPdbjh2#mz>yk54cquI@7b&LHdZ`+z zlTss6bJ7%PQ)z$cROu4wBhpu-r+;LyGFmcjGHjUwnS(MHWX357MV;b8VNo_y8Yvek z6I2XUo9abPq83xXqYhAKWo2ZS$%e^h%ht%AmK~)bG%cDJErnJ}J5C#>y<4KR#Ayj< z$@V3!ONN%r%Pp02l;g-1$+gMdmU|~pmv@s-mft1cDgRIbrJ$z}sF0Amz>RYg@#RiSFV>VWEknzmY~TE1GF+Cz1MIzv5PyLvhF_J8+x#wgi;89Ete8nzgY z8PSY1jmyXF)a;mc^>(B7bo*HQ1NNg1st!zt z28YLv>W*y3CdWx9U4N$}r=w2KolTti&h5_gE;cUfT+X>7t{$#Mt^;l|ZlP|~Zjap6 z+!Nee+-E&3Jl1-g^F(|4c<%BX@lx_)c{O{@dRuv~^X~N_`2_n^`#kp5^X2 zj2>R4y()XvmDLKXQ&yjjk&I!+oQOrohQ}U>eb4k~HZbSnyy9x(W?3$*y{u`s_YbV#g7oZ-4~tGO?dJd^5@=9B%C4<&y}2~TND#ihok zp5)2!l6k#p%4ykYgX#L|h3TVfY}V{qGt2kkH)TK>t1`L-RMF2=zfecGML3pepIMXn zCMzuKM7DG`FS|cSFK2tsWUhPew`);rS!;XpRP#3Fjeo6kT35dwS|7K*XM_5Nf(;WJ zJvJWRMA($P>8E^?{IdL4o5MGE7bq2MEEwP7v8AO@qL5!WvekBL-8R%V?zVyL=G&{b ze=K4bT`e{#t|)$A!YaA?jp;X)-+bB;zhj`(vULAW%ue3U;av{94wp%n<(7@__S@Z2 zPA@Mie}AQwPOQFN<6P5Lt600ec77jw-_U-? z{jGIMb;Wh>4sZ|LsrRVwXwYh?IEXozdGJYNSYzL}jBlHp6q<^gJ{;m58a*6zxVPD= zx%r6Vkr^j5!`X2{BzCX?yfA&kpFYhM` zo{*nZOsY&aPnk`fns%SQ@pR?WiD&807FT8pf0h2V_PNgUAAWQEt$#LRcH#y9#i!p( zUdq2b^lI6wp1FXzN3T;~FU%Lck$-deE#qz9yYP3D3t8{6?<+s(e(3(_^YOu_)K8!O P1p}D#{E@&~+mRuwo2DT9 diff --git a/mods/default/textures/default_bookshelf_slot.png b/mods/default/textures/default_bookshelf_slot.png index ca3306b16d9032f1a5403599eefdb0d5d3d78c40..cd2c8bceb3832f799198366b569798d872ee252e 100644 GIT binary patch delta 10 Rcmca8+QT?Od2$9|D^_ww@l3o6c zm;e!*vpE?o5f_L!B}k0Z0NWkO#^@ z9q0f3Xv3lIchAu>dPU)xk0{A5EKc;LJ1HL z5<+>u$9dISw03U@r;Pdb`_%=KWKZEBGfDjQHqKX(I48#TTN1~8;gpaI8ijWGV z0cl0Lkv`-mGK$O~Z&4T&1w}_0qHIx~s8AFOwFb2wRf4KU9Y%GadQmq~W2jlwM>H9& zh}K8jpuNx$=mc~Yx)5D~ZbG-CFQRXwCx6hdF&GRDqm8k`cw!#HrxSaPGJ$91oX|tH2$>oxu&^ zCUFaRDZD1$2Jeq&<8$z(_(ps;{yKgFzd(>CXcO!RA%rBtCPF2lm2i>pfbfz?B!8+A zt%-p|E^#BVl6Z`GnK(v#OOhe!kz7d8Bq3=B=@980=`QIdnM~FqJCdWw0`d-WGx-Af z5&4Y-MZ!qJOM)%2L83;YLt;qcxg=gvQ_@LtwPdbjh2#mz>yk54cquI@7b&LHdZ`+z zlTss6bJ7%PQ)z$cROu4wBhpu-r+;LyGFmcjGHjUwnS(MHWX357MV;b8VNo_y8Yvek z6I2XUo9abPq83xXqYhAKWo2ZS$%e^h%ht%AmK~)bG%cDJErnJ}J5C#>y<4KR#Ayj< z$@V3!ONN%r%Pp02l;g-1$+gMdmU|~pmv@s-mft1cDgRIbrJ$z}sF0Amz>RYg@#RiSFV>VWEknzmY~TE1GF+Cz1MIzv5PyLvhF_J8+x#wgi;89Ete8nzgY z8PSY1jmyXF)a;mc^>(B7bo*HQ1NNg1st!zt z28YLv>W*y3CdWx9U4N$}r=w2KolTti&h5_gE;cUfT+X>7t{$#Mt^;l|ZlP|~Zjap6 z+!Nee+-E&3Jl1-g^F(|4c<%BX@lx_)c{O{@dRuv~^X~N_`2_n^`#kp5^X2 zj2>R4y()XvmDLKXQ&yjjk&I!+oQOrohQ}U>eb4k~HZbSnyy9x(W?3$*y{u`s_YbV#g7oZ-4~tGO?dJd^5@=9B%C4<&y}2~TND#ihok zp5)2!l6k#p%4ykYgX#L|h3TVfY}V{qGt2kkH)TK>t1`L-RMF2=zfecGML3pepIMXn zCMzuKM7DG`FS|cSFK2tsWUhPew`);rS!;XpRP#3Fjeo6kT35dwS|7K*XM_5Nf(;WJ zJvJWRMA($P>8E^?{IdL4o5MGE7bq2MEEwP7v8AO@qL5!WvekBL-8R%V?zVyL=G&{b ze=K4bT`e{#t|)$A!YaA?jp;X)-+bB;zhj`(vULAW%ue3U;av{94wp%n<(7@__S@Z2 zPA@Mie}AQwPOQFN<6P5Lt600ec77jw-_U-? z{jGIMb;Wh>4sZ|LsrRVwXwYh?IEXozdGJYNSYzL}jBlHp6q<^gJ{;m58a*6zxVPD= zx%r6Vkr^j5!`X2{BzCX?yfA&kpFYhM` zo{*nZOsY&aPnk`fns%SQ@pR?WiD&807FT8pf0h2V_PNgUAAWQEt$#LRcH#y9#i!p( zUdq2b^lI6wp1FXzN3T;~FU%Lck$-deE#qz9yYP3D3t8{6?<+s(e(3(_^YOu_)K8!O P1p}D#{E@&~+mRt_kcc3< From dfe74948e298f6f9014e075512532c5fdd195a5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20Mart=C3=ADnez?= Date: Sat, 25 Mar 2017 18:26:17 -0300 Subject: [PATCH 066/195] creative: Use icons for buttons. --- mods/creative/README.txt | 12 +++++++++++- mods/creative/inventory.lua | 8 ++++---- mods/creative/textures/creative_clear_icon.png | Bin 0 -> 129 bytes mods/creative/textures/creative_next_icon.png | Bin 0 -> 132 bytes mods/creative/textures/creative_prev_icon.png | Bin 0 -> 132 bytes mods/creative/textures/creative_search_icon.png | Bin 0 -> 136 bytes mods/creative/textures/creative_trash_icon.png | Bin 179 -> 126 bytes 7 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 mods/creative/textures/creative_clear_icon.png create mode 100644 mods/creative/textures/creative_next_icon.png create mode 100644 mods/creative/textures/creative_prev_icon.png create mode 100644 mods/creative/textures/creative_search_icon.png diff --git a/mods/creative/README.txt b/mods/creative/README.txt index 82357f30..a61b5ff0 100644 --- a/mods/creative/README.txt +++ b/mods/creative/README.txt @@ -9,4 +9,14 @@ Jean-Patrick G. (kilbith) (MIT) Author of media (textures) -------------------------- -Jean-Patrick G. (kilbith) (CC BY-SA 3.0) + +Jean-Patrick G. (kilbith) (CC BY-SA 3.0): + +* creative_trash_icon.png + +Diego Martínez (kaeza) (CC BY-SA 3.0): + +* creative_prev_icon.png +* creative_next_icon.png +* creative_search_icon.png +* creative_clear_icon.png diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua index 8b7f0c3a..24e88a68 100644 --- a/mods/creative/inventory.lua +++ b/mods/creative/inventory.lua @@ -112,10 +112,10 @@ function creative.register_tab(name, title, items) list[current_player;main;0,5.85;8,3;8] list[detached:creative_trash;main;4,3.3;1,1;] listring[] - button[5.4,3.2;0.8,0.9;creative_prev;<] - button[7.25,3.2;0.8,0.9;creative_next;>] - button[2.1,3.4;0.8,0.5;creative_search;?] - button[2.75,3.4;0.8,0.5;creative_clear;X] + image_button[5.4,3.25;0.8,0.8;creative_prev_icon.png;creative_prev;] + image_button[7.2,3.25;0.8,0.8;creative_next_icon.png;creative_next;] + image_button[2.1,3.25;0.8,0.8;creative_search_icon.png;creative_search;] + image_button[2.75,3.25;0.8,0.8;creative_clear_icon.png;creative_clear;] tooltip[creative_search;Search] tooltip[creative_clear;Reset] listring[current_player;main] diff --git a/mods/creative/textures/creative_clear_icon.png b/mods/creative/textures/creative_clear_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..af225c275a4a9107b83e7c54c213f8804a172a81 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDH3?y^UWFG-iYymzYu0Z<#|Nl#G&c6#}F_r}R z1v5B2yO9RuXnMLhhDcmaPFSE?aiHCE99gp1FpusnBnc#D?M>SSY7#PHg WWiQ^Us%r=8VeoYIb6Mw<&;$U3PbQK8 literal 0 HcmV?d00001 diff --git a/mods/creative/textures/creative_prev_icon.png b/mods/creative/textures/creative_prev_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0d7f8c902aa5847cab8f570d3784f49aaa893129 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDD3?#L31Vw-pXMj(LE0F#V2E`RilYtzjk|4ie z28Oc9XDxs{4Nn)x5RLQ62@*jLCOM3PGS@DIx)g5ecvP@fsmpmurpvBgkNJF-3=B^H W6tZV>scZx4VeoYIb6Mw<&;$U2swMOQ literal 0 HcmV?d00001 diff --git a/mods/creative/textures/creative_search_icon.png b/mods/creative/textures/creative_search_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..02c69cf7720961d8d45edfb72028c6c5501741ca GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDH3?y^UWFG-iYymzYu0Z<#|Nl#G&c6#}F_r}R z1v5B2yO9Ru7tZMq`nLATgerDFG2@Q-0j9XPBJy;D2Ll(x3j; fqz%X2CNeT)HHufoo-{oJ)XU)M>gTe~DWM4fU!*OU literal 0 HcmV?d00001 diff --git a/mods/creative/textures/creative_trash_icon.png b/mods/creative/textures/creative_trash_icon.png index e789ad634450a5fa5227e9efd8fe804703d3eece..649945a7f0aea124710709f0b0e39cd390cb5acd 100644 GIT binary patch delta 8 PcmdnYSU16WVudvT4^;z7 delta 59 zcmb>1%s9c>h%w3A-G!lpRn~)nfq}EYBeIx*fm;}a85w5HkpK#^mw5WRvOi$t66Kcv L6LU6rqJtd(exnVE From 5b57815af164325c6e6cc5cd37c68dcc9add23e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20Mart=C3=ADnez?= Date: Sat, 25 Mar 2017 18:26:50 -0300 Subject: [PATCH 067/195] creative: Add missing tooltips. --- mods/creative/inventory.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua index 24e88a68..79a85293 100644 --- a/mods/creative/inventory.lua +++ b/mods/creative/inventory.lua @@ -118,6 +118,8 @@ function creative.register_tab(name, title, items) image_button[2.75,3.25;0.8,0.8;creative_clear_icon.png;creative_clear;] tooltip[creative_search;Search] tooltip[creative_clear;Reset] + tooltip[creative_prev;Previous page] + tooltip[creative_next;Next page] listring[current_player;main] field_close_on_enter[creative_filter;false] ]] .. From 8ab7c54d760b53cdc952657fa0125fd977ce97f9 Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 22 Dec 2017 00:59:42 +0000 Subject: [PATCH 068/195] Biomes: Add 'dirt with coniferous litter' node for coniferous forest --- mods/default/README.txt | 2 ++ mods/default/mapgen.lua | 9 ++++----- mods/default/nodes.lua | 16 ++++++++++++++++ .../textures/default_coniferous_litter.png | Bin 0 -> 865 bytes .../textures/default_coniferous_litter_side.png | Bin 0 -> 604 bytes mods/flowers/mapgen.lua | 4 ++-- 6 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 mods/default/textures/default_coniferous_litter.png create mode 100644 mods/default/textures/default_coniferous_litter_side.png diff --git a/mods/default/README.txt b/mods/default/README.txt index fb30e268..d27e8a87 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -117,6 +117,8 @@ paramat (CC BY-SA 3.0): TumeniNodes (CC BY-SA 3.0): default_desert_cobble.png -- Derived from a texture by brunob.santos (CC BY-SA 3.0) + default_coniferous_litter.png + default_coniferous_litter_side.png BlockMen (CC BY-SA 3.0): default_aspen_leaves.png -- Derived from Sofar's texture diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 7cd60666..e06d1285 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1064,7 +1064,7 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "coniferous_forest", --node_dust = "", - node_top = "default:dirt_with_grass", + node_top = "default:dirt_with_coniferous_litter", depth_top = 1, node_filler = "default:dirt", depth_filler = 3, @@ -1613,8 +1613,7 @@ local function register_grass_decoration(offset, scale, length) persist = 0.6 }, biomes = {"grassland", "grassland_dunes", "deciduous_forest", - "coniferous_forest", "coniferous_forest_dunes", - "floatland_grassland"}, + "coniferous_forest_dunes", "floatland_grassland"}, y_min = 1, y_max = 31000, decoration = "default:grass_" .. length, @@ -1718,7 +1717,7 @@ function default.register_decorations() minetest.register_decoration({ deco_type = "schematic", - place_on = {"default:dirt_with_snow", "default:dirt_with_grass"}, + place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, sidelen = 16, noise_params = { offset = 0.036, @@ -1737,7 +1736,7 @@ function default.register_decorations() minetest.register_decoration({ deco_type = "schematic", - place_on = {"default:dirt_with_snow", "default:dirt_with_grass"}, + place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, sidelen = 80, noise_params = { offset = 0.0018, diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index b60c4837..25222308 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -51,6 +51,7 @@ default:dirt_with_grass_footsteps default:dirt_with_dry_grass default:dirt_with_snow default:dirt_with_rainforest_litter +default:dirt_with_coniferous_litter default:sand default:desert_sand @@ -464,6 +465,21 @@ minetest.register_node("default:dirt_with_rainforest_litter", { }), }) +minetest.register_node("default:dirt_with_coniferous_litter", { + description = "Dirt with Coniferous Litter", + tiles = { + "default_coniferous_litter.png", + "default_dirt.png", + {name = "default_dirt.png^default_coniferous_litter_side.png", + tileable_vertical = false} + }, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.4}, + }), +}) + minetest.register_node("default:sand", { description = "Sand", tiles = {"default_sand.png"}, diff --git a/mods/default/textures/default_coniferous_litter.png b/mods/default/textures/default_coniferous_litter.png new file mode 100644 index 0000000000000000000000000000000000000000..9a77b34ea2c73fc91c75891eace52c0198a55950 GIT binary patch literal 865 zcmWlY>sA_907ef0hGzWzyN24VYo=Zgu4O*2(?g&BwC}Q zXiVCq7}GSpH(jfJi#|br^(p!WU8O(v-s^jSuggM8JTg8401$gUBsb{T{|sLqSfv>a z0dPsg`gxa4C2?x6JJFj2I!@@u$;Bzx;-m|kbYl}POh#ccH$Fk(Qa3(D>1C8&;W5a) z2ARh&O&Mo=h8fx@r%lteY1U_+3z!vtvl5z>0gJ+Kne|(g&^isRv(T#KZp#_l9BWgC zYzoe<3fl)>2s!3Chc>jV;g@w`r#j+9qJ$=PM;jq^F;aimWms|JX-bv!pgHQ+Dy?6o zt!Y}9q0xIjJnb_UeDf*4DeK450b4P!P!1qPh!mh93mqk>&N9|A)aDuE8iQ3Jl4p$- zMq6bxWmYS&nhJ|lS#>VBRAteP!3=6^L1c}yN6P-r!Lo zY+sMKHY1DWDA|f&wdis=Mpj~ED~7dWXnlpK#;Ho2Zp5991l34->q*#363tbrm4fZG z??IYwW%#WOyPffFXMBfgV<$^L%uzczS34i-<&1j;a=+j{SoiK1{oSH>uLQd#>Yx-j zEcuVizI}n~3e15JJ`&)u5a?ClNhNSpWlyTUUX^=XOP_v;|Z^irV#6^4Mypws|Nxa(0zwH)&KNT+IqkjS*l6pxef8#IFnCPE> zK_dEns?iWX!6na|%2}ryEJ(GH<1gMqEPffjS#=_y*R`zOwtm2??w@6c-?=9Rqw=E< zzsyv*A2&A$$;}u5*YC()itD6xo;o8p}-X}s5#%=3dujm6ql}i z%mV5Kn0xsPQU7Xt;p#O^x8wM<57vi1!Q#_p)6WI}wQn9VdVr)g?r<^ngJCgqeq-iP z4Y10vnZLL@#S{An53uDuV3FiXa3~>3{x(5JRxBf+fur*-ABMMvMsT6zMbx`cmin9Q P46XybE=c}C+~55VMim4D literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_coniferous_litter_side.png b/mods/default/textures/default_coniferous_litter_side.png new file mode 100644 index 0000000000000000000000000000000000000000..a254bf549be81607ea8ffc94153b2663da101bfc GIT binary patch literal 604 zcmV-i0;BzjP)!(Yd+idnZIQGB7YOI2lOYI661io&gHxR0W+nIycwc*FwJE*FwG@ zCeFyfz`(F~LNw#F^=IbD3$n&2tE(US^7)glldZ+sC95{*Ok96io`HdZ!9h>rt&x(* z8(nQxvD5}@ku^{?ZY=U*A5g;1ZVmv0&k%%@fyOmh-ic@7I*&59(TdNuGs) zfq_9)jPvus6X$t)sx#h~wao}IP!tK$z5i4!B{8XU^0b-d>T>)Ax1a4{n7Q>jBLf2i z!`C0b9nal)^XlgQh59Vbxxow^ydsTr7Oz^$E2g-eo0DClZ^M;Br~7Y?FW!36W8Z~m zj2%g4|5-Wt4_@6d)qK{>8LPv5U3Rl`^WU1>-?^XR#G96$CwFU|?Xlw6RauPFJFB?}TW^BXe>*7##E@jxZpBsz{^v zN9N=-oL*krm+r0k9~#Y%lKo5%FfcGM+}O83A0~cePEG@afPx$Q7U Date: Sun, 24 Dec 2017 02:23:29 +0000 Subject: [PATCH 069/195] Ferns: Add 3 sizes for coniferous forest biome Remove flowers from coniferous forest. Add 'dirt with coniferous litter' to farming mod overrides. --- mods/default/README.txt | 3 ++ mods/default/crafting.lua | 6 +++ mods/default/license.txt | 1 + mods/default/mapgen.lua | 26 +++++++++++ mods/default/nodes.lua | 56 +++++++++++++++++++++++ mods/default/textures/default_fern_1.png | Bin 0 -> 370 bytes mods/default/textures/default_fern_2.png | Bin 0 -> 691 bytes mods/default/textures/default_fern_3.png | Bin 0 -> 1172 bytes mods/farming/nodes.lua | 8 ++++ mods/flowers/mapgen.lua | 5 +- 10 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 mods/default/textures/default_fern_1.png create mode 100644 mods/default/textures/default_fern_2.png create mode 100644 mods/default/textures/default_fern_3.png diff --git a/mods/default/README.txt b/mods/default/README.txt index d27e8a87..f749b0e3 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -218,6 +218,9 @@ tobyplowy (CC BY-SA 3.0): CloudyProton (CC BY-SA 3.0): default_book_written.png, based on default_book.png by Gambit +Mossmanikin (CC BY-SA 3.0): + default_fern_*.png + Glass breaking sounds (CC BY 3.0): 1: http://www.freesound.org/people/cmusounddesign/sounds/71947/ 2: http://www.freesound.org/people/Tomlija/sounds/97669/ diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index 2d11d26c..dd91ad42 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -1098,6 +1098,12 @@ minetest.register_craft({ burntime = 2, }) +minetest.register_craft({ + type = "fuel", + recipe = "default:fern_1", + burntime = 2, +}) + minetest.register_craft({ type = "fuel", recipe = "default:paper", diff --git a/mods/default/license.txt b/mods/default/license.txt index ce143ee5..4610bac8 100644 --- a/mods/default/license.txt +++ b/mods/default/license.txt @@ -48,6 +48,7 @@ Copyright (C) 2010-2017: tobyplowy CloudyProton TumeniNodes + Mossmanikin You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index e06d1285..a12fe580 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1640,6 +1640,26 @@ local function register_dry_grass_decoration(offset, scale, length) }) end +local function register_fern_decoration(seed, length) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_coniferous_litter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.2, + spread = {x = 100, y = 100, z = 100}, + seed = seed, + octaves = 3, + persist = 0.7 + }, + biomes = {"coniferous_forest"}, + y_min = 6, + y_max = 31000, + decoration = "default:fern_" .. length, + }) +end + function default.register_decorations() @@ -1960,6 +1980,12 @@ function default.register_decorations() register_dry_grass_decoration(0.07, -0.01, 2) register_dry_grass_decoration(0.09, -0.03, 1) + -- Ferns + + register_fern_decoration(14936, 3) + register_fern_decoration(801, 2) + register_fern_decoration(5, 1) + -- Junglegrass minetest.register_decoration({ diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 25222308..a366892d 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -143,6 +143,10 @@ default:dry_grass_3 default:dry_grass_4 default:dry_grass_5 +default:fern_1 +default:fern_2 +default:fern_3 + default:bush_stem default:bush_leaves default:bush_sapling @@ -1315,6 +1319,58 @@ for i = 2, 5 do end +minetest.register_node("default:fern_1", { + description = "Fern", + drawtype = "plantlike", + waving = 1, + tiles = {"default_fern_1.png"}, + inventory_image = "default_fern_1.png", + wield_image = "default_fern_1.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random fern node + local stack = ItemStack("default:fern_" .. math.random(1, 3)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:fern_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 3 do + minetest.register_node("default:fern_" .. i, { + description = "Fern", + drawtype = "plantlike", + waving = 1, + visual_scale = 2, + tiles = {"default_fern_" .. i .. ".png"}, + inventory_image = "default_fern_" .. i .. ".png", + wield_image = "default_fern_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, + not_in_creative_inventory=1}, + drop = "default:fern_1", + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + }) +end + + minetest.register_node("default:bush_stem", { description = "Bush Stem", drawtype = "plantlike", diff --git a/mods/default/textures/default_fern_1.png b/mods/default/textures/default_fern_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b307986d43d26c9fabd118ab81a85475f7cf6771 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMffdHQnS0F8|#Al!{qH6Txu9rsuxyb5nf>uTVWPaWfoa&kyNFh zRI4A_WE5L(9oB4|(yW)Vre}9T756};cB|(0{3=Yq3qyaezo-U3d5|@(`B=#IQ za){3(ih1MGg@O?-SFcQSboB2%=;JKE%FX+vm!CsGkO$Kt(=fB^f)5`(5WBWDa3lLC z-ijM3KSWKhZauo>iDZhSmW$*O%gCiaZ&WJAa3rLqBsOhea9GFw@45^p6VNUOPgg&e IbxsLQ00R7XrvLx| literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_fern_2.png b/mods/default/textures/default_fern_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6c5f7d544af1d0485a97cbc478c16089ece8e622 GIT binary patch literal 691 zcmV;k0!;mhP)bPRc|d& zaWGDDHCJ&aM|C<>ax+qMGf{LhQ*<{|bum_TE>?6nRd_X1c`;RZHduKzU3fNLcr;jg zHdcHzS$jBQdM{LcJzIP^T75WKemhlwGh%%&Re~~Ie>+x#Gi84J%H+z^pdz(CNowpg?+~NqeMHcc)E-q(geCWqYkqg|AkRuTP6A)kXjS z00DGTPE!Ct=GbNc006^DL_t(I%VS^|1*2eyg81_6b}*x%7DSe$$HbzkXwu0|Enr}% z$#eH*V5m$q@kUqR?3NtS!oXk~8tK8{km4U3j%iC^zI|z+m9meTk*kJ2hHPtHV{uua zypyn~rGTDzNOW}ts(f%E literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_fern_3.png b/mods/default/textures/default_fern_3.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1f605e79efb7f8426ed8200077c3beba757f17 GIT binary patch literal 1172 zcmV;F1Z(?=P)MiW9kBPB-{CP)@1NEIna z5;a5_D@YnQMH)RtBrZ%KHcKcsP9`o=A~RAKJWv}nQXe`{B{)$bF;*HnQz9}}CrnN& zGFKx^Pb@N6BtBInGg=%#Rwg-FAV60qJz66^S|&VQAV6FsLR=|AT_-(XCq-T&N?s&G zU?x9eCP!c-Kw}+6U@tvnCq-f@JZ3FMWF|poB|&BCJLNo+4jY%)%3FidPROKv4cZzoM|C`)fIPi`|uaV<}8FHdkV zP;f9+Z!J!7F;HJemGfvJ5_))Vtp@NemYfxGF^W=U4S}PgEMA-EMHD850YJ)OfhB;t`K3#@AR*5!ahBjz}PGN^UY=tvo zh&x}1Om2oWZHGH#iacG7H)D%CV~aj$iaT+LJ!FhMWsE>=j4^MEHg1eGa*H)*jY4IP zKyHmPYmGZ{j5KGCLu8LdXpcc^k3?vYKxmIlYLG%}kV9mVPjHV$X_7x@lRb8iI%$$d zXOu;1ls|BjJ!_OhXO=#3kz8?>7*I&Pjube>6co=Sh5L3N%?f1N;dphtt8LwBG;e4j&lpiF+D zLVTh?g`hxoq(^$ANqnPAd!$l$r%HFHO@*XGeWpu#sbzPrM1-kPd#zA@txAEeRe`Wl zg|AkHuvd1rP>-)q#r5?F00001bW%=J06^y0W&i*IT1iAfR5;6HU>F6XfHd&w`TN$b zaNb8aYyZ&;=OC=F%P#L(@d3hq`S>n`acawg+(l5On;D)toj$nk2#|TZ<4|Q2kiI@~ zRb(B*BDiVA^i)JG^!3NuGRt@5#oKXWK6t7byCvC&{^aYfiZ{|JK!O zQ2FlrOKpJc|boc&RszW=*qWnXUt-7un`bR zZ9X1o5v&!E&$%mz!3ZtD6B(RUtnA~LYed`e*7`CiVTlt@hA3s896f$jRt7E{(I(Ev mB*x9cCWR+v8QD3QQAGf}41PZ|#X6e+0000 Date: Sun, 24 Dec 2017 19:24:11 +0000 Subject: [PATCH 070/195] Resize junglegrass selection box --- mods/default/nodes.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index a366892d..55032f2b 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1210,7 +1210,7 @@ minetest.register_node("default:junglegrass", { sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", - fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 1.19, 7 / 16}, + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, }, }) From bd0c627a207b70975dd020dbaa33e0e3a58037bc Mon Sep 17 00:00:00 2001 From: Ekdohibs Date: Thu, 21 Dec 2017 10:28:06 +0100 Subject: [PATCH 071/195] Furnace: Fix being able to cook items without enough fuel This was triggered when too much time had elapsed when timer was called. Also, fix timer resolution giving free fuel time. --- mods/default/furnace.lua | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua index 162ee4e9..09966a6b 100644 --- a/mods/default/furnace.lua +++ b/mods/default/furnace.lua @@ -118,7 +118,7 @@ local function furnace_node_timer(pos, elapsed) local fuel local update = true - while update do + while elapsed > 0 and update do update = false srclist = inv:get_list("src") @@ -133,13 +133,18 @@ local function furnace_node_timer(pos, elapsed) cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) cookable = cooked.time ~= 0 + local el = math.min(elapsed, fuel_totaltime - fuel_time) + if cookable then -- fuel lasts long enough, adjust el to cooking duration + el = math.min(el, cooked.time - src_time) + end + -- Check if we have enough fuel to burn if fuel_time < fuel_totaltime then -- The furnace is currently active and has enough fuel - fuel_time = fuel_time + elapsed + fuel_time = fuel_time + el -- If there is a cookable item then check if it is ready yet if cookable then - src_time = src_time + elapsed + src_time = src_time + el if src_time >= cooked.time then -- Place result in dst list if possible if inv:room_for_item("dst", cooked.item) then @@ -148,6 +153,9 @@ local function furnace_node_timer(pos, elapsed) src_time = src_time - cooked.time update = true end + else + -- Item could not be cooked: probably missing fuel + update = true end end else @@ -165,8 +173,7 @@ local function furnace_node_timer(pos, elapsed) -- Take fuel from fuel list inv:set_stack("fuel", 1, afterfuel.items[1]) update = true - fuel_totaltime = fuel.time + (fuel_time - fuel_totaltime) - src_time = src_time + elapsed + fuel_totaltime = fuel.time + (fuel_totaltime - fuel_time) end else -- We don't need to get new fuel since there is no cookable item @@ -176,7 +183,7 @@ local function furnace_node_timer(pos, elapsed) fuel_time = 0 end - elapsed = 0 + elapsed = elapsed - el end if fuel and fuel_totaltime > fuel.time then From faa088e2c5a9ddc4e73f2353c1217d105c78fda5 Mon Sep 17 00:00:00 2001 From: MarkuBu Date: Sun, 24 Dec 2017 22:36:41 +0100 Subject: [PATCH 072/195] Xpanes: Add optional 'use_texture_alpha' parameter to registration --- game_api.txt | 1 + mods/xpanes/init.lua | 2 ++ 2 files changed, 3 insertions(+) diff --git a/game_api.txt b/game_api.txt index bc5a8c7a..f7bcc1eb 100644 --- a/game_api.txt +++ b/game_api.txt @@ -690,6 +690,7 @@ Creates panes that automatically connect to each other groups = {group = rating}, -- Uses the known node groups, see [Known damage and digging time defining groups] sounds = SoundSpec, -- See [#Default sounds] recipe = {{"","","","","","","","",""}}, -- Recipe field only + use_texture_alpha = true, -- Optional boolean (default: `false`) for colored glass panes } Raillike definitions diff --git a/mods/xpanes/init.lua b/mods/xpanes/init.lua index 40fddba6..755667de 100644 --- a/mods/xpanes/init.lua +++ b/mods/xpanes/init.lua @@ -104,6 +104,7 @@ function xpanes.register_pane(name, def) groups = flatgroups, drop = "xpanes:" .. name .. "_flat", sounds = def.sounds, + use_texture_alpha = def.use_texture_alpha or false, node_box = { type = "fixed", fixed = {{-1/2, -1/2, -1/32, 1/2, 1/2, 1/32}}, @@ -128,6 +129,7 @@ function xpanes.register_pane(name, def) groups = groups, drop = "xpanes:" .. name .. "_flat", sounds = def.sounds, + use_texture_alpha = def.use_texture_alpha or false, node_box = { type = "connected", fixed = {{-1/32, -1/2, -1/32, 1/32, 1/2, 1/32}}, From f52085a40f682c68c54936de7d5451d990245090 Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 1 Jan 2018 07:47:00 +0000 Subject: [PATCH 073/195] Biomes: Make coastal grassy dune biomes larger --- mods/default/mapgen.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index a12fe580..1a85bf30 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1033,7 +1033,7 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 5, + y_min = 4, y_max = 5, heat_point = 50, humidity_point = 35, @@ -1054,7 +1054,7 @@ function default.register_biomes(upper_limit) node_riverbed = "default:sand", depth_riverbed = 2, y_min = -112, - y_max = 4, + y_max = 3, heat_point = 50, humidity_point = 35, }) @@ -1095,7 +1095,7 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 5, + y_min = 4, y_max = 5, heat_point = 45, humidity_point = 70, @@ -1116,7 +1116,7 @@ function default.register_biomes(upper_limit) node_riverbed = "default:sand", depth_riverbed = 2, y_min = -112, - y_max = 4, + y_max = 3, heat_point = 45, humidity_point = 70, }) From 223562d687da721729a4295f8a5030a2c7ed3a2f Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 1 Jan 2018 09:24:15 +0000 Subject: [PATCH 074/195] Dry shrub: Use plantlike meshoption for bushy appearence Adjust selectionbox width for a better fit and consistency with other grasses. --- mods/default/mapgen.lua | 2 ++ mods/default/nodes.lua | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 1a85bf30..1cb74cbc 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1593,6 +1593,7 @@ function default.register_mgv6_decorations() y_min = 1, y_max = 30, decoration = "default:dry_shrub", + param2 = 4, }) end @@ -2018,6 +2019,7 @@ function default.register_decorations() y_min = 2, y_max = 31000, decoration = "default:dry_shrub", + param2 = 4, }) -- Coral reef diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 55032f2b..2e5f4dad 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1183,6 +1183,8 @@ minetest.register_node("default:dry_shrub", { inventory_image = "default_dry_shrub.png", wield_image = "default_dry_shrub.png", paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 4, sunlight_propagates = true, walkable = false, buildable_to = true, @@ -1190,7 +1192,7 @@ minetest.register_node("default:dry_shrub", { sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", - fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 4 / 16, 5 / 16}, + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16}, }, }) From a6aa68d5b4ed0abb8dd27ca62c8de670313a2e1a Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 13 Jan 2018 11:46:35 +0000 Subject: [PATCH 075/195] default:dirt_with_snow: Re-add to soil group Previously, saplings were not growing if the dirt they are on turned to 'dirt with snow' before growth. Also for consistency with other dirt nodes. --- mods/default/nodes.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 2e5f4dad..c642fc39 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -447,7 +447,7 @@ minetest.register_node("default:dirt_with_snow", { tiles = {"default_snow.png", "default_dirt.png", {name = "default_dirt.png^default_snow_side.png", tileable_vertical = false}}, - groups = {crumbly = 3, spreading_dirt_type = 1, snowy = 1}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1, snowy = 1}, drop = 'default:dirt', sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_snow_footstep", gain = 0.2}, From 41a4073d4c155d8286a81e7c6af6aadfd533d99b Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 16 Jan 2018 04:52:26 +0000 Subject: [PATCH 076/195] Creative: New textures for less distortion Use 128px textures with a slight blur to reduce distortion caused by formspec texture scaling. Cross is shifted slightly up and left to compensate for formspec button image shift. --- mods/creative/README.txt | 9 ++------- mods/creative/license.txt | 1 + mods/creative/textures/creative_clear_icon.png | Bin 129 -> 708 bytes mods/creative/textures/creative_next_icon.png | Bin 132 -> 728 bytes mods/creative/textures/creative_prev_icon.png | Bin 132 -> 729 bytes .../creative/textures/creative_search_icon.png | Bin 136 -> 1908 bytes mods/creative/textures/creative_trash_icon.png | Bin 126 -> 712 bytes 7 files changed, 3 insertions(+), 7 deletions(-) diff --git a/mods/creative/README.txt b/mods/creative/README.txt index a61b5ff0..32e8d22a 100644 --- a/mods/creative/README.txt +++ b/mods/creative/README.txt @@ -9,14 +9,9 @@ Jean-Patrick G. (kilbith) (MIT) Author of media (textures) -------------------------- - -Jean-Patrick G. (kilbith) (CC BY-SA 3.0): - -* creative_trash_icon.png - -Diego Martínez (kaeza) (CC BY-SA 3.0): - +paramat (CC BY-SA 3.0): * creative_prev_icon.png * creative_next_icon.png * creative_search_icon.png * creative_clear_icon.png +* creative_trash_icon.png derived from a texture by kilbith (CC BY-SA 3.0) diff --git a/mods/creative/license.txt b/mods/creative/license.txt index 4ad1d5ff..50ff9c74 100644 --- a/mods/creative/license.txt +++ b/mods/creative/license.txt @@ -30,6 +30,7 @@ Licenses of media (textures) Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) Copyright (C) 2016 Jean-Patrick G. (kilbith) +Copyright (C) 2018 paramat You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/creative/textures/creative_clear_icon.png b/mods/creative/textures/creative_clear_icon.png index af225c275a4a9107b83e7c54c213f8804a172a81..9244264adcf8a710ff13a2d684f148f997f1522f 100644 GIT binary patch literal 708 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVCwdCaSW-r_4ck|p0J|`+k@?8 z)4T38Ghetp_qK?~6E??3JeK}D7|j>(if@>5FNQ(xtQ%9xq#I|>oJ-rk-tWo9fB*MH zp5A261T+u{c%448b?emavpj!@3x2dSE|*=GYrgL7A+xn2b!l~{&a|J|bNs}_tEEWpk`5!2*`a}1RyVnJUKYCsTDmAJZ691N{Rw#iPDykKZKfD4SDBXYZavSfp zt(M8LUICfU&F8YHzp0s=(DY%oUz2h9J|Q20x{sb8K$MJ(p@+4@qz<4 z!kg0dK3Eysi%9);Rd;NiTfc_o`reublauX^hYkL8bi5ZVT=BywU-{9yDV`H%&hFSD z{eSy3XBU}c*&BW+C(O>xi5IGCE-m?*7^bhf!nSDs-Ve5G964XH7nBIy_{nX@*CKED zC9J9A$E62L@3|g1-|-{rXX!rIBX13O=8G=aFLdP6;d1{6XTq5t?lu(JC&Y2TP@!hB z!wW0ribzTW? zv>WHHXDQnUw9_l$Ihb?k|95ulYSoBmH}=bWKa)PledlLA%OVzTzIe`-^(=?Nn=}vK z|5|oXdfI~7>hssAan;KT<|{qg^yu`QKY#yx%+Ejmf9+EvCB5Qf=OwiwTl#JLZgovQ z!0-C6bfNb@zk-X!W`9H8=%_c!chCE&^5PxeZU@em`wuKW9OwuSX$khe@MP~-NmYTm zX3qx;1G)7Yj~~>EaktaqI1!y?MfpA`TCY z(>7Xrv21cZ%&p)es8PXjPgJF%k;PKT<4S-^gqo<(T*H$AZ*+7fE>+<>d&YLY$kXM; z=ia>edS1_Cl8Pq=%G6)^jeSD#K4zcO>z`{bou9UM-nz!)1@bePjT7b;$1R;=wruaM zC5^{7Fz_{mAK-ovc#~J;!HIef8^*Y4tp>Wwn}y38zCAwQP<`O>r(*U$THFu3ye^0?Pjk z*mb-r{232E>K8xo`Jz(9F6JX0_I9i#PygKC$$X@SKQ@;uDmRnJz#wC{4f?(cga zu20UYXRv&3`L|av?Mwc}bv*Lw|EBCOKXT(**~~3ik`6F2t>oIzc>Ce(H7ZX_R{~Qk NgQu&X%Q~loCICs?Scw1t literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDD3?#L31Vw-pXMj(LE0F#V2E`RilYtzjk|4ie z28Oc9XDxs{4Nn)x5RLQ62@+ln*;yQcb3zv~x)g>99gp1FpusnBnc#D?M>SSY7#PHg WWiQ^Us%r=8VeoYIb6Mw<&;$U3PbQK8 diff --git a/mods/creative/textures/creative_prev_icon.png b/mods/creative/textures/creative_prev_icon.png index 0d7f8c902aa5847cab8f570d3784f49aaa893129..4fa6f26f02b3a94404f9715008fdb74cd1787ea7 100644 GIT binary patch literal 729 zcmeAS@N?(olHy`uVBq!ia0vp^^+4Rf!3HFiD!1KdU|?F{>EaktaqI0}-)!MPnbwcb zw_SX5=hmetmi-M=#U{7j=K8gEw_tf4^TMbjYj^K4xqkGHLx-pAuG4d#voGAT`{d65 zGmC@Mm?o)sVxp=^kD@Qcul;ISaHnqW^dLFDpA~Lyx2%5{7O>4>GJYWUBlX8&{(llX z816AoKT!T)^}}?ZKdc`Zf802Q~e|H1E;InS>+%&%SECLi;T$9~5h$-07_-Te1E`FTOu zzS3G;_Mh8_;9dWZ`%l_d+;7Rn^Uo&JTHNwywcP>39}C;xvs)~D82!%a@b){cVs@uv zUp#?w+VXdD^WHBKkNTlgzHl;#v;VGqy;J%2HBa?&KF#0y`d9RWxli@p&$4IAs@Cl> zNdF{W;(z4FwQt{&*MC=hI6dgu)@#+fmM5*bHGlbmZ2$j^x%;OWt={^NVcJ^eHT{Pl znSc4PUF^X0-p2)}rwi0YGw^S{w!8P!_9Oh&Mu+ZOG3OL9sG0w0ENyTF|N4Y>h;3$gG=JCJJq$JX>OL?T{CU8d@Z%u&fe+2%4G-D% z84lOq0t#MWE#UmK@V8XyVg4uv?Op4A|8xE^`?H31!=m4>zDV9(`>4G(#_e`|wa%Ge p=N`CfroP*)geCm|QscZx4VeoYIb6Mw<&;$U2swMOQ diff --git a/mods/creative/textures/creative_search_icon.png b/mods/creative/textures/creative_search_icon.png index 02c69cf7720961d8d45edfb72028c6c5501741ca..aace8044ac235bcf5935ed8a72c4cb136746a916 100644 GIT binary patch literal 1908 zcmZ`)do;r*hEgWpDPBKS7mN|uQ4@RU{bU;RZBGG9cM4QZ&YGw2;badcT z8^0=@n`5_k4cg)jkHrR_ZUs6C)#;ru{p*MnFzSSy14BnK9k99qvx%(Q|Ku6*tVeE= z;j}fOm}70k#m=-1{B|WKep=e`sqE6mH$a&vhfe)BT5{~=GqH7W4FDtAPF6XfUJMg0 zG)SRiFgWX|#Hdo<6h%bjftQL_(g^a6TBkuGS!%-M3?v2!!-LD$RV3F+$;z#Y3Lq&# z_lXLz)euUtSfqnLL7jl2b-JcIw!dO0JQC!^>f882mU~^SkXzr`0xD$%3+f2q+OnxW z1#r9If&|iNnfe3`b*4|E043HiVCS~J?2$Nf98bhA$TsSxMtQ>bU0iB`d;--0U8=Ry zJ$(nF6is0}714=%paq!4^8&7*G-=qVnCc)Uq1GXZTEy1xasEqQke2{%ythu6(G*D6 zDF?-+D!Ue41yd=tX`8nuzFuMdv3v8p=sx4(#)k(VUp+7uXc=E9WXOjk_@2pQs9(A3 z%Fe+(gW#yEwq~Ezh<5oM;;RAsmL}jVtqyDg;3RO6+(ZS+wa!eGy%Xv)cY8sdSn&;K z=Ps^SBI2ddjn|*vyW-*bv2?_ZIuz7pOr~qbsWd5m^(%dw z+V538xQ3H(-4_xppDzC3sA8pkh`&sY6Nru)^Z(SD+qXv7TA(SYSIuP68ayyP+H0?< zaowVMuFU-jk-0cLhl6vgDyMeXaRacK-*^{WOw9U|9&j|Vd<#9+JeGf*Iy5>ye)R3f z!qwGPGPOQQ{6H;&(Wc;AI2huTl){mQQt=*;F&g!IJS<08ZLf>0u+ENg7s343c&1m7mb$YSA$oW=Ou(;WVMAGQ+9 zU{v(RH~IzT(6ZnE)c?h#57hs2bs8di1zc28QeyD_;W>7ZU(8N^yT}Ash708loHCa&7K!Wixy30l1~_H zt%s71ttI{vsu(~*IL^WdO-8p|;mo$+Ut=}jyoU52j>@^LpIy;y;Aknl_Rb!tje;t0 z4`ZQ&Pd~ODxH|QAh4G_8Ov>8b6FKrNMcniQ{aQW-sL+^9m+j?+iW)Y8u-@$4+ZyKqr5_OPwunRDLxq8ZX8<(~$=F88q9F&sb0`#Qm~!Ma?^gL*o;c9xJrXIg(l#>Bs<*5P z_Oorurv`1CY#wa(+`Gd3dpUO9?{|2zxdX|~OX;BN^lt;g?q=M*AyZzwcOF=an-aR$ zWvqD9Pja5@lpfUFh3giFZ@YlBpa8ns&|&HPv69cekehvTx1-3K!uJ{pthx&pQMU_X zz_OYBuTku;iCT@2eL`2sndtrXyaIV!7w1Pc;qV4`&`*DVI@)O3>nZp58l2 zh86Z3I>$`!bGRg_`o{BU|3AaXW{t-BrPl3lJI0##E>?4JbBElN!tO>W;jyUC9TP&C zcdY$f=J{hbR^H#JQa?PKHouPy0s)EE-W+MDc;Xz%zs`T$`R%Yt?QXQVAN^tty#4`5(6Lbv2~siR@4 z@`h)pegmd;G66wTd;1v6$`5#mabMDZA>){oRw~(J+i2oaY0;7FQaR<-xTRoy>!JU5 oz)Hy+PJ7*y{67!tO!d0_mw-1lpr~N2?{5lnuywWJ5y{E_0lF-AYXATM literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDH3?y^UWFG-iYymzYu0Z<#|Nl#G&c6#}F_r}R z1v5B2yO9Ru7tZMq`nLATgerDFG2@Q-0j9XPBJy;D2Ll(x3j; fqz%X2CNeT)HHufoo-{oJ)XU)M>gTe~DWM4fU!*OU diff --git a/mods/creative/textures/creative_trash_icon.png b/mods/creative/textures/creative_trash_icon.png index 649945a7f0aea124710709f0b0e39cd390cb5acd..7d7a0a62f36472ffcc08cd07422d1c5e17e45e3b 100644 GIT binary patch literal 712 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVCwgDaSW-r_4e+?-dhe5trxww zq*naqXuWX$%VVcGb_I&R1tv_`WU!j2d1GzgmQ#n_%r@D(8r!SMY)V`@C3wbkp`zrO9YquH$qXGj<1H+Alhfi&G|FJ(}SLs?`@OU z=Ko=Q^1aIOQ@pdR=KhzuvG=pT`FdxDxp@Z+zq8vWPg;3>!84VT2}&@z?=%LBL9Hq~$8|9AiV@%4Xy%;s14dR}%* zon77A&m;qutR!##$3==^`3{2oa1xFUptOVYBf1?jSv-y|x zQ#1GeuC3o5=i4=WKHIvdyz#uX-M?+jJ8Bj`d-DSr7ho$7bd@n~t^F`3MPuolJ6-v_ z)3Z&!%~Jltw_qE;+@zXk@59#=*ZUcKouw=zcJKN8Nip?5uFpu(S=s~FpY@DkZE@4y u*Z=k$xWstn8Ot*UZhL(O28IL6Y8X5J>6=+Z`J_5B`&HX5el>faqfR}V Date: Sun, 21 Jan 2018 20:23:29 +0000 Subject: [PATCH 077/195] Dungeon loot: Reduce maximum processed rooms to 8 --- mods/dungeon_loot/mapgen.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/dungeon_loot/mapgen.lua b/mods/dungeon_loot/mapgen.lua index 9d42c530..1e463450 100644 --- a/mods/dungeon_loot/mapgen.lua +++ b/mods/dungeon_loot/mapgen.lua @@ -131,8 +131,8 @@ minetest.register_on_generated(function(minp, maxp, blockseed) local rand = PcgRandom(noise3d_integer(noise, poslist[1])) local candidates = {} - -- process at most 16 rooms to keep runtime of this predictable - local num_process = math.min(#poslist, 16) + -- process at most 8 rooms to keep runtime of this predictable + local num_process = math.min(#poslist, 8) for i = 1, num_process do local room = find_walls(poslist[i]) -- skip small rooms and everything that doesn't at least have 3 walls From 5f121b586d5427098febd32dcc7b700d3d240800 Mon Sep 17 00:00:00 2001 From: Jat15 Date: Wed, 31 Jan 2018 20:49:27 +0100 Subject: [PATCH 078/195] Stairs: unbind table groups (#2036) Unbind table groups for base block, stairs, slabs. --- mods/stairs/init.lua | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index e85c7081..4b31540d 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -68,7 +68,8 @@ function stairs.register_stair(subname, recipeitem, groups, images, description, end end end - groups.stair = 1 + local new_groups = table.copy(groups) + new_groups.stair = 1 minetest.register_node(":stairs:stair_" .. subname, { description = description, drawtype = "nodebox", @@ -76,7 +77,7 @@ function stairs.register_stair(subname, recipeitem, groups, images, description, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, - groups = groups, + groups = new_groups, sounds = sounds, node_box = { type = "fixed", @@ -162,7 +163,8 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, end end end - groups.slab = 1 + local new_groups = table.copy(groups) + new_groups.slab = 1 minetest.register_node(":stairs:slab_" .. subname, { description = description, drawtype = "nodebox", @@ -170,7 +172,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, - groups = groups, + groups = new_groups, sounds = sounds, node_box = { type = "fixed", @@ -318,7 +320,8 @@ function stairs.register_stair_inner(subname, recipeitem, groups, images, descri end end end - groups.stair = 1 + local new_groups = table.copy(groups) + new_groups.stair = 1 minetest.register_node(":stairs:stair_inner_" .. subname, { description = "Inner " .. description, drawtype = "nodebox", @@ -326,7 +329,7 @@ function stairs.register_stair_inner(subname, recipeitem, groups, images, descri paramtype = "light", paramtype2 = "facedir", is_ground_content = false, - groups = groups, + groups = new_groups, sounds = sounds, node_box = { type = "fixed", @@ -395,7 +398,8 @@ function stairs.register_stair_outer(subname, recipeitem, groups, images, descri end end end - groups.stair = 1 + local new_groups = table.copy(groups) + new_groups.stair = 1 minetest.register_node(":stairs:stair_outer_" .. subname, { description = "Outer " .. description, drawtype = "nodebox", @@ -403,7 +407,7 @@ function stairs.register_stair_outer(subname, recipeitem, groups, images, descri paramtype = "light", paramtype2 = "facedir", is_ground_content = false, - groups = groups, + groups = new_groups, sounds = sounds, node_box = { type = "fixed", From 496a1a24d223076e186555dbb7e747adb4394e40 Mon Sep 17 00:00:00 2001 From: TumeniNodes Date: Wed, 31 Jan 2018 14:49:54 -0500 Subject: [PATCH 079/195] Add obsidian_pane (#2035) --- mods/xpanes/init.lua | 15 ++++++++++++++- mods/xpanes/textures/xpanes_bar_top.png | Bin 3516 -> 3516 bytes mods/xpanes/textures/xpanes_edge.png | Bin 0 -> 84 bytes mods/xpanes/textures/xpanes_edge_obsidian.png | Bin 0 -> 98 bytes mods/xpanes/textures/xpanes_space.png | Bin 149 -> 149 bytes mods/xpanes/textures/xpanes_white.png | Bin 3496 -> 0 bytes 6 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 mods/xpanes/textures/xpanes_edge.png create mode 100644 mods/xpanes/textures/xpanes_edge_obsidian.png delete mode 100644 mods/xpanes/textures/xpanes_white.png diff --git a/mods/xpanes/init.lua b/mods/xpanes/init.lua index 755667de..c0a91c7b 100644 --- a/mods/xpanes/init.lua +++ b/mods/xpanes/init.lua @@ -149,7 +149,7 @@ end xpanes.register_pane("pane", { description = "Glass Pane", - textures = {"default_glass.png","xpanes_pane_half.png","xpanes_white.png"}, + textures = {"default_glass.png","xpanes_pane_half.png","xpanes_edge.png"}, inventory_image = "default_glass.png", wield_image = "default_glass.png", sounds = default.node_sound_glass_defaults(), @@ -160,6 +160,19 @@ xpanes.register_pane("pane", { } }) +xpanes.register_pane("obsidian_pane", { + description = "Obsidian Glass Pane", + textures = {"default_obsidian_glass.png","xpanes_pane_half.png","xpanes_edge_obsidian.png"}, + inventory_image = "default_obsidian_glass.png", + wield_image = "default_obsidian_glass.png", + sounds = default.node_sound_glass_defaults(), + groups = {snappy=2, cracky=3}, + recipe = { + {"default:obsidian_glass", "default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default:obsidian_glass", "default:obsidian_glass"} + } +}) + xpanes.register_pane("bar", { description = "Iron Bar", textures = {"xpanes_bar.png","xpanes_bar.png","xpanes_bar_top.png"}, diff --git a/mods/xpanes/textures/xpanes_bar_top.png b/mods/xpanes/textures/xpanes_bar_top.png index 887518aa2aa038594626d0583cb5ecf70de269b8..7b74508f27402c1b469870a321e629efd05db576 100644 GIT binary patch delta 22 dcmdlZy+?XO125M@HfB*1(`w(mw#i+*MgUq<2X+7e delta 22 dcmdlZy+?XO125MDZgyc|>wm($qLaILjR04Z2G{@q diff --git a/mods/xpanes/textures/xpanes_edge.png b/mods/xpanes/textures/xpanes_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..92f78a1994fc3fb12c069af3e1aee3b2f9fd00ec GIT binary patch literal 84 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;bAV5X>wyE0kLa8i19EvhT^vI= dt|uob@B(=T42;KDwe|s744$rjF6*2UngD}<5(fYP literal 0 HcmV?d00001 diff --git a/mods/xpanes/textures/xpanes_edge_obsidian.png b/mods/xpanes/textures/xpanes_edge_obsidian.png new file mode 100644 index 0000000000000000000000000000000000000000..abdd14e340c5bb68b8aae84d4d1600838fd87e51 GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9tAK!jyqck~k&F~jMBLNG tF@)oKasmVMF*df8gab@Y8BGZc4C*%-vn#!d;(FKNUcJ&>cJ+8|dB6OVhm{PQ0}W1< zzOFp&e?s!to~OCDS5A0s?fmo(e_ucUE3+f}Wbg28S6+D9(PrDiUA&z6=U?u!Uzd6` z=FUC+g}Hw>&R=ixBSvbM%CSh}NT>N0vz|8XEcR*J^Hp-ijZgnAe$~k5g}V9FcpY?K z&%yf8ds^4L3y(wls{Mj4Y<}~kS*$%{#&qlT@$vDla_=sff9hZHUh;4EAK8~1gsSW( z__usA{uku;OO5~iM7_NCHqZZ5{8KQmjInugs5igoUGkjkud+@>6y59IHGNas1?#kJ z*Pv8g#t`1 zUVKRj%|a||rilDLJ}H?$RMdCXtgBbHW}Kar-ug7Ba^8xoM<%UIH7?c;YwlJLKcDw5 zZjYE=lW;iqtBn-(kGp6c5!&GfVVoVk4d(>2V|xhFiF-Q~<`rWm|(&Q1Qi@-KVVmX#lsOhw-= zWLtSNx9M5oqREmSg-Q(DJsVUE{L?OKs?K|&wmCu~bYYJ|>7kb7Rs;*q&%d|Mn6 z{CB-A<-vC5e}z2%8Pe*uJbduicquS{Bx21NnFS@upp0SbwUf8Of#bpU)fv^7*YmoT<5Tyl zPYi~NBDbd3{kg@!z?qc^%!LuYK32*3xq68y`AMmI6}bgKS1>Tx*jE%JCTFLXC?ut( zXXe=|z2CiGNg*@ERw>-n*TA>HIW;5GqpB!1xXLdixhgx^GDXSWj?1RP3TQxXYDuC( zMQ%=Bu~mhw64+cTAR8pCucQE0Qj%?}6yY17;GAESs$imLqGzD%T9H|1q-4jXU{jQm zW)m6U+;3Q)sSlHq0-losWHO-@PHPt8fqP0cGQ z);H8M)Ca3iNw#v!FUm~>>d(wgOi$G>$V*q!2f0=s>Rh1j_2J$Jxq_1 zgNvjPAW89P>KY9$l0twa#iOZfXayG+q5+kf2W&N!1Di(-{~H{DO)KUApAgso|Nk#P zB7FkLWlZvRcVXyYmGuB}I14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sf18#OeCk|A^<>}%W!f`!00mx=zV0@&w R#~8?B@O1TaS?83{1OUBqR%rkL From 8f85ca57f3a50569e1cd310652dd519a8fe5cb43 Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 27 Jan 2018 00:52:14 +0000 Subject: [PATCH 080/195] Intersects_protection(): Remove from Minetest Game Add compatibility code with deprecation warning. --- mods/default/functions.lua | 40 -------------------------------------- mods/default/legacy.lua | 7 +++++++ mods/default/trees.lua | 2 +- 3 files changed, 8 insertions(+), 41 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 20cf492a..d43ab7b9 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -497,46 +497,6 @@ minetest.register_abm({ }) --- --- Checks if specified volume intersects a protected volume --- - -function default.intersects_protection(minp, maxp, player_name, interval) - -- 'interval' is the largest allowed interval for the 3D lattice of checks - - -- Compute the optimal float step 'd' for each axis so that all corners and - -- borders are checked. 'd' will be smaller or equal to 'interval'. - -- Subtracting 1e-4 ensures that the max co-ordinate will be reached by the - -- for loop (which might otherwise not be the case due to rounding errors). - local d = {} - for _, c in pairs({"x", "y", "z"}) do - if maxp[c] > minp[c] then - d[c] = (maxp[c] - minp[c]) / math.ceil((maxp[c] - minp[c]) / interval) - 1e-4 - elseif maxp[c] == minp[c] then - d[c] = 1 -- Any value larger than 0 to avoid division by zero - else -- maxp[c] < minp[c], print error and treat as protection intersected - minetest.log("error", "maxp < minp in 'default.intersects_protection()'") - return true - end - end - - for zf = minp.z, maxp.z, d.z do - local z = math.floor(zf + 0.5) - for yf = minp.y, maxp.y, d.y do - local y = math.floor(yf + 0.5) - for xf = minp.x, maxp.x, d.x do - local x = math.floor(xf + 0.5) - if minetest.is_protected({x = x, y = y, z = z}, player_name) then - return true - end - end - end - end - - return false -end - - -- -- Coral death near air -- diff --git a/mods/default/legacy.lua b/mods/default/legacy.lua index 0669914c..17e30360 100644 --- a/mods/default/legacy.lua +++ b/mods/default/legacy.lua @@ -37,3 +37,10 @@ end -- Chests default.register_chest = default.chest.register_chest + +-- Check for a volume intersecting protection +function default.intersects_protection(minp, maxp, player_name, interval) + minetest.log("warning", "default.intersects_protection() is " .. + "deprecated, use minetest.intersects_protection() instead.") + minetest.intersects_protection(minp, maxp, player_name, interval) +end diff --git a/mods/default/trees.lua b/mods/default/trees.lua index 44176d77..2934330d 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -490,7 +490,7 @@ function default.sapling_on_place(itemstack, placer, pointed_thing, return itemstack end -- Check tree volume for protection - if default.intersects_protection( + if minetest.intersects_protection( vector.add(pos, minp_relative), vector.add(pos, maxp_relative), player_name, From 12f1703537248c4e6cabc3e0a34364b0d5f2999f Mon Sep 17 00:00:00 2001 From: ezhh Date: Mon, 29 Jan 2018 01:40:09 +0000 Subject: [PATCH 081/195] Add fireflies mod --- mods/fireflies/README.txt | 22 +++ mods/fireflies/depends.txt | 2 + mods/fireflies/init.lua | 172 ++++++++++++++++++ mods/fireflies/license.txt | 58 ++++++ mods/fireflies/textures/fireflies_bottle.png | Bin 0 -> 172 bytes .../textures/fireflies_bottle_animated.png | Bin 0 -> 205 bytes mods/fireflies/textures/fireflies_bugnet.png | Bin 0 -> 192 bytes mods/fireflies/textures/fireflies_firefly.png | Bin 0 -> 113 bytes .../textures/fireflies_firefly_animated.png | Bin 0 -> 121 bytes 9 files changed, 254 insertions(+) create mode 100644 mods/fireflies/README.txt create mode 100644 mods/fireflies/depends.txt create mode 100644 mods/fireflies/init.lua create mode 100644 mods/fireflies/license.txt create mode 100644 mods/fireflies/textures/fireflies_bottle.png create mode 100644 mods/fireflies/textures/fireflies_bottle_animated.png create mode 100644 mods/fireflies/textures/fireflies_bugnet.png create mode 100644 mods/fireflies/textures/fireflies_firefly.png create mode 100644 mods/fireflies/textures/fireflies_firefly_animated.png diff --git a/mods/fireflies/README.txt b/mods/fireflies/README.txt new file mode 100644 index 00000000..7382578d --- /dev/null +++ b/mods/fireflies/README.txt @@ -0,0 +1,22 @@ +Minetest Game mod: fireflies +============================ +Adds fireflies to the world on mapgen, which can then be caught in a net and placed in +bottles to provide light. + +Authors of source code +---------------------- +Shara RedCat (MIT) + +Authors of media (textures) +--------------------------- +Shara RedCat (CC BY-SA 3.0): + fireflies_firefly.png + fireflies_firefly_animated.png + fireflies_bugnet.png + fireflies_bottle.png + fireflies_bottle_animated.png + +fireflies_bugnet.png is modified from a texture by tenplus1 (CC0) + +fireflies_bottle.png and fireflies_bottle_animated.png are +modified from a texture by Vanessa Ezekowitz (CC BY-SA 3.0) \ No newline at end of file diff --git a/mods/fireflies/depends.txt b/mods/fireflies/depends.txt new file mode 100644 index 00000000..e0585b46 --- /dev/null +++ b/mods/fireflies/depends.txt @@ -0,0 +1,2 @@ +default +vessels \ No newline at end of file diff --git a/mods/fireflies/init.lua b/mods/fireflies/init.lua new file mode 100644 index 00000000..8294baff --- /dev/null +++ b/mods/fireflies/init.lua @@ -0,0 +1,172 @@ +-- firefly +minetest.register_node("fireflies:firefly", { + description = "Firefly", + drawtype = "plantlike", + tiles = {{ + name = "fireflies_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "fireflies_firefly.png", + wield_image = "fireflies_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_flood = function(pos, oldnode, newnode) + minetest.add_item(pos, "fireflies:firefly 1") + end +}) + + +-- bug net +minetest.register_tool("fireflies:bug_net", { + description = "Bug Net", + inventory_image = "fireflies_bugnet.png", + on_use = function(itemstack, player, pointed_thing) + if not pointed_thing or pointed_thing.type ~= "node" or + minetest.is_protected(pointed_thing.under, player:get_player_name()) then + return + end + local node_name = minetest.get_node(pointed_thing.under).name + local inv = player:get_inventory() + if minetest.get_item_group(node_name, "catchable") == 1 then + minetest.set_node(pointed_thing.under, {name = "air"}) + local stack = ItemStack(node_name.." 1") + local leftover = inv:add_item("main", stack) + if leftover:get_count() > 0 then + minetest.add_item(pointed_thing.under, node_name.." 1") + end + end + if not minetest.setting_getbool("creative_mode") then + itemstack:add_wear(256) + return itemstack + end + end +}) + +minetest.register_craft( { + output = "fireflies:bug_net", + recipe = { + {"farming:string", "farming:string", ""}, + {"farming:string", "farming:string", ""}, + {"default:stick", "", ""} + } +}) + + +-- firefly in a bottle +minetest.register_node("fireflies:firefly_bottle", { + description = "Firefly in a Bottle", + inventory_image = "fireflies_bottle.png", + wield_image = "fireflies_bottle.png", + tiles = {{ + name = "fireflies_bottle_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + light_source = 9, + walkable = false, + groups = {dig_immediate = 3, attached_node = 1}, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + sounds = default.node_sound_glass_defaults(), + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local lower_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + if minetest.is_protected(pos, player:get_player_name()) or + minetest.get_node(lower_pos).name ~= "air" then + return + end + + local upper_pos = {x = pos.x, y = pos.y + 2, z = pos.z} + local firefly_pos + + if not minetest.is_protected(upper_pos, player:get_player_name()) and + minetest.get_node(upper_pos).name == "air" then + firefly_pos = upper_pos + elseif not minetest.is_protected(lower_pos, player:get_player_name()) then + firefly_pos = lower_pos + end + + if firefly_pos then + minetest.set_node(pos, {name = "vessels:glass_bottle"}) + minetest.set_node(firefly_pos, {name = "fireflies:firefly"}) + end + end +}) + +minetest.register_craft( { + output = "fireflies:firefly_bottle", + recipe = { + {"", "", ""}, + {"", "fireflies:firefly", ""}, + {"", "vessels:glass_bottle", ""} + } +}) + + +-- register fireflies as decorations +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", + "default:dirt_with_coniferous_litter", + "default:dirt_with_rainforest_litter", + "default:dirt" + }, + place_offset_y = 2, + sidelen = 80, + fill_ratio = 0.002, + biomes = { + "deciduous_forest", + "coniferous_forest", + "rainforest", + "rainforest_swamp" + }, + y_min = -1, + y_max = 31000, + decoration = "fireflies:firefly", +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", + "default:dirt_with_coniferous_litter", + "default:dirt_with_rainforest_litter", + "default:dirt" + }, + place_offset_y = 3, + sidelen = 80, + fill_ratio = 0.002, + biomes = { + "deciduous_forest", + "coniferous_forest", + "rainforest", + "rainforest_swamp" + }, + y_min = -1, + y_max = 31000, + decoration = "fireflies:firefly", +}) diff --git a/mods/fireflies/license.txt b/mods/fireflies/license.txt new file mode 100644 index 00000000..eebdad63 --- /dev/null +++ b/mods/fireflies/license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (c) 2018 Shara RedCat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2018 Shara RedCat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file diff --git a/mods/fireflies/textures/fireflies_bottle.png b/mods/fireflies/textures/fireflies_bottle.png new file mode 100644 index 0000000000000000000000000000000000000000..ecca0363096bddd994397af8de7a04d786f096e9 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnY1=1I;JlL}5?7kycZryr% z?97d=ThFZCdSYf{ZbxqH|Nm*Rr~8_KiWp0R{DK)Ap4~_Tax6Vv978y+Co2dQ_%vKN z)7Zo)5O&06MF^8}&q1DrGbJQ=6nMlm79Zf&;7Bvra6p33XGNE!kZU6gL#!?9`)lr> RHGqaNc)I$ztaD0e0sta1JbC~C literal 0 HcmV?d00001 diff --git a/mods/fireflies/textures/fireflies_bottle_animated.png b/mods/fireflies/textures/fireflies_bottle_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..96062b3c15c1cea67f971d7112eb158f84797d20 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0zjO=!VDyz{eM3hNT~$)gt!9fEql(MzkGk+kt?@u zJw0~j#@4N8R&PCV>H5Q&jkz7UvH$<4U7z%5E>Im~NswPKgTu2MX+Tc6r;B5V#`$Cg zp#r^z3uhdC83n?gD6I%#67D(3vrtk}f=7X88n1v`BXfYjnS_K!Lm7!cQDc>@Oq^1? z*-vSFkV|>z*m8cF<1@L49|inE-+B5zC|dnxV3=m5J)!f@?Kq$n44$rjF6*2UngC*! BOsW6? literal 0 HcmV?d00001 diff --git a/mods/fireflies/textures/fireflies_bugnet.png b/mods/fireflies/textures/fireflies_bugnet.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec3d33bae24643cd67bb0fc5b388c055ef831c9 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ1=5F4-Q&m*5zIlez7I)Rojc)I$ztaD0e0sw<|LUjND literal 0 HcmV?d00001 diff --git a/mods/fireflies/textures/fireflies_firefly.png b/mods/fireflies/textures/fireflies_firefly.png new file mode 100644 index 0000000000000000000000000000000000000000..c0866894ca0be53a3715199b484589beaa1a70f4 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-u0Z<#D~A8y`tG0QJa~8A zb0D9wB*-tA!Qt7BG$2RV)5S4_<9f0Jn}H<*=P~9Z8mtWJJd7-wW%D-yr5QY3{an^L HB{Ts50`?tG literal 0 HcmV?d00001 diff --git a/mods/fireflies/textures/fireflies_firefly_animated.png b/mods/fireflies/textures/fireflies_firefly_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..e6932e37c69eb1f2ec57ccdeceb2a8f80fba8d0f GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^0zllr#0(_se=}|bQak}ZA+A9B|0{<7-}>&KccM2A0Q+Y?BVGSm=Ckg`;2sgRmKgq<`D` QLZC7RPgg&ebxsLQ0FcHbBLDyZ literal 0 HcmV?d00001 From d5907d5f1e5dedb7ecc7a20e740e971403cf0f5a Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 2 Feb 2018 18:11:17 +0000 Subject: [PATCH 082/195] Doors: Avoid crash on nil player in 'can dig door' --- mods/doors/init.lua | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 51879678..2685357a 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -203,12 +203,7 @@ end local function can_dig_door(pos, digger) replace_old_owner_information(pos) - if default.can_interact_with_node(digger, pos) then - return true - else - minetest.record_protection_violation(pos, digger:get_player_name()) - return false - end + return default.can_interact_with_node(digger, pos) end function doors.register(name, def) From a587972010d8ecf83f10010ada91d43db06f976c Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 15 Jan 2018 05:33:27 +0000 Subject: [PATCH 083/195] Flower spread ABM: Optimise Match maximum spread density to maximum mapgen density for flowers. Place 3 flora nodes at once instead of 1. Change ABM chance value to 300 to match previous spread rate. ABM becomes 3 times less intensive. --- mods/flowers/init.lua | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index 51b0d87f..011160ed 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -139,24 +139,29 @@ function flowers.flower_spread(pos, node) local pos0 = vector.subtract(pos, 4) local pos1 = vector.add(pos, 4) - if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 3 then + -- Maximum flower density created by mapgen is 13 per 9x9 area. + -- The limit of 7 below was tuned by in-game testing to result in a maximum + -- flower density by ABM spread of 13 per 9x9 area. + -- Warning: Setting this limit theoretically without in-game testing + -- results in a maximum flower density by ABM spread that is far too high. + if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 7 then return end local soils = minetest.find_nodes_in_area_under_air( pos0, pos1, "group:soil") - if #soils > 0 then - local seedling = soils[math.random(#soils)] - local seedling_above = - {x = seedling.x, y = seedling.y + 1, z = seedling.z} - light = minetest.get_node_light(seedling_above) - if not light or light < 13 or - -- Desert sand is in the soil group - minetest.get_node(seedling).name == "default:desert_sand" then - return + local num_soils = #soils + if num_soils >= 1 then + for si = 1, math.min(3, num_soils) do + local soil = soils[math.random(num_soils)] + local soil_above = {x = soil.x, y = soil.y + 1, z = soil.z} + light = minetest.get_node_light(soil_above) + if light and light >= 13 and + -- Desert sand is in the soil group + minetest.get_node(soil).name ~= "default:desert_sand" then + minetest.set_node(soil_above, {name = node.name}) + end end - - minetest.set_node(seedling_above, {name = node.name}) end end @@ -164,7 +169,7 @@ minetest.register_abm({ label = "Flower spread", nodenames = {"group:flora"}, interval = 13, - chance = 96, + chance = 300, action = function(...) flowers.flower_spread(...) end, From ca81e9b8c633578b2f42b730a59fcb04412e8779 Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 2 Feb 2018 00:53:51 +0000 Subject: [PATCH 084/195] Coniferous litter: Improve textures Greyer, lighter, reduce lines, remove dark patches. Shorter and more consistent side texture. --- .../textures/default_coniferous_litter.png | Bin 865 -> 873 bytes .../textures/default_coniferous_litter_side.png | Bin 604 -> 371 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/textures/default_coniferous_litter.png b/mods/default/textures/default_coniferous_litter.png index 9a77b34ea2c73fc91c75891eace52c0198a55950..da340e0a6ef0d0dff2526113dc2ed2da6fae0401 100644 GIT binary patch literal 873 zcmWkr`%)Tr82zEeyT;bmTGO;mYa1F@KoCSO%WZ*Ot_v)CVYy#~WnsB07$x37)Fh@h z7?ZR!oyotQ$y4+V+9&7(G!M|3PB$~(`Of*y%=gbZ7r5UwJGDFo0GP#4BqZ|u2TY8L zTefy541nY>+)Fs@s{2muic9wZ)33Vq58VcFAg@8@H9#KYs@DX0O>!T+=7SYDtn`@` zezQDaQ3NdOL8}6{s&MN@*s8{D8zGxAXj6yn>tVZ^KvX0mCmqU&LrpuCq*F^eb(Cw9 zbm>V{Ph&a;+oCaJ)U9Vd2F7cO`7ANNCE>Rv1Ey?Xb333-hpgFGv!FJNV zm$Wugcr8sd(}7xsY-S^^9NEd?t$ehTC-#bLuZZq*%mGJtOH{YSJmOPbo_Sm*56h7O zk98}_lM2xj$bOCK*V#dx8q}H7M*OT1J8wjL&D5Y7?>DpO&DdotdeMqswqk>wT&v;IOpw-0bIHvT=Cfy z-Yy(|vw25W2hxv7XXfcZlXt47b(&KFJU`V`K0m?Zt{3~)Mtp1%Y{R3pYq<&C#mD9y zz^DOVJ$tR^E`$|)271`hl%9g5^kb-fFT4IKWtsVD7hMA~>IcM|W^R^#y!}W8eHIn8sQgx?&pPe1s-SHW+NPmR#obac_8Hc$3fh&NV>aYaavjHf&^gCBwZSC~ zzoZMf)L|DA!8Os_+AyJu5{5f&4)3}Y)nZH_UmF<2QQIo4EWv?8M^v08!El-Ujd#aMwVk#J?5&%$$G+DOTcCVZ>*BdBy6SV`zflK<~P&qR@%FjraK2I zQ#(U-vgCHw-O2@fS<`Nw*votN*S&iMU$@}hEy8Y*+%NhMioT-~y(e&8f!P;AhXOnj z{JkBhq!Br5FwdLpd6VgH#`>-J zd28jYoqpA6$6svc-gNW7oe1ZO;XeS7$h?G$zy7CWMDp){ARhTHS+5U0)JvZsRe%Q5a4M9OPEHljK{@;n~sl=78o3e2a5g2 z&T_y$yy!gXgBK^x&nAu&IqsVWuSsxe2vl6}Z3Y#eW6BGcK4t;=6wEyT8Lxf4HGkzQ zrrUOY+6U`{pJ1`clKH2+@9N7h7z0338c(Q@{NA{bKD$13paxi(xM<G=64RszI#SXN_ zHl(bDfBV3Y6jB%WRuTZc)q^4zv9z*jSn(K)40H%U{nYSjVtTA!0E5f(Ge15+9Ut!d r+9t<_1Rv!)>M!}@|10On@sGR%`hRXT-{lB)00000NkvXXu0mjfX3wH+ delta 580 zcmV-K0=xb50^9_UBYy%TNkl!(Yd+idnZIQGB7YOI2lOY zI661io&gHxR0W+nIycwc*FwJE*FwG@CeFyfz`(F~LNw#F^=IbD3$n&2tE(US^7)gl zldZ+sC95{*Ok96io`HdZ!9h>rt&x(*8(nQxvD1F<> z85kHCj?T?B&+s!kk{x8a+ud0D*V_jdRh{%CI*I~xZXRD)TL1RJMO8OrnVU`qQm=3B zU#PctLNp_zgPueKFAsN`gSj5l=Do)kwB&{SXJBC1sOggWwy_}kR&03SgkRr2tl$!s z`>|l*qRkW6Uw@YKwUF=El;scVT75~Lg@J*AK~;?N^T8A6d3vfd-j}t_2r*C;3DUj) zR4gSisdMtQndRzo`~|n4?O~X?^*SR10|Ud?AHN;X-Ffrs=Kh8HEX}#W3>>^7jdK>S zTFNV?xSgAmU7~Npl|rZcZ;mhCdeURxg=dT%NoN09Ie+;NUfnU(eAdhvtHXRE~<7F1U+M5U|_hk zu}{}dSE6n2glNVib8 Date: Wed, 24 Jan 2018 11:29:02 +0000 Subject: [PATCH 085/195] Add marram grass for coastal sand dunes Use noise with 1 octave and flag 'absvalue' to create sand paths in dunes. --- mods/default/README.txt | 1 + mods/default/crafting.lua | 6 ++ mods/default/mapgen.lua | 30 +++++++++- mods/default/nodes.lua | 55 ++++++++++++++++++ .../textures/default_marram_grass_1.png | Bin 0 -> 253 bytes .../textures/default_marram_grass_2.png | Bin 0 -> 447 bytes .../textures/default_marram_grass_3.png | Bin 0 -> 341 bytes 7 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 mods/default/textures/default_marram_grass_1.png create mode 100644 mods/default/textures/default_marram_grass_2.png create mode 100644 mods/default/textures/default_marram_grass_3.png diff --git a/mods/default/README.txt b/mods/default/README.txt index f749b0e3..3861eddd 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -114,6 +114,7 @@ paramat (CC BY-SA 3.0): default_silver_sandstone_brick.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) default_silver_sandstone_block.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) default_bookshelf_slot.png -- Derived from a texture by Gambit (CC-BY-SA 3.0) + default_marram_grass_*.png -- Derived from textures by TumeniNodes (CC-BY-SA 3.0) TumeniNodes (CC BY-SA 3.0): default_desert_cobble.png -- Derived from a texture by brunob.santos (CC BY-SA 3.0) diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index dd91ad42..847f188f 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -1104,6 +1104,12 @@ minetest.register_craft({ burntime = 2, }) +minetest.register_craft({ + type = "fuel", + recipe = "default:marram_grass_1", + burntime = 2, +}) + minetest.register_craft({ type = "fuel", recipe = "default:paper", diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 1cb74cbc..243d1ed7 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1603,7 +1603,7 @@ end local function register_grass_decoration(offset, scale, length) minetest.register_decoration({ deco_type = "simple", - place_on = {"default:dirt_with_grass", "default:sand"}, + place_on = {"default:dirt_with_grass"}, sidelen = 16, noise_params = { offset = offset, @@ -1613,8 +1613,7 @@ local function register_grass_decoration(offset, scale, length) octaves = 3, persist = 0.6 }, - biomes = {"grassland", "grassland_dunes", "deciduous_forest", - "coniferous_forest_dunes", "floatland_grassland"}, + biomes = {"grassland", "deciduous_forest", "floatland_grassland"}, y_min = 1, y_max = 31000, decoration = "default:grass_" .. length, @@ -2022,6 +2021,31 @@ function default.register_decorations() param2 = 4, }) + -- Marram grass + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 4, + noise_params = { + offset = -0.4, + scale = 3.0, + spread = {x = 16, y = 16, z = 16}, + seed = 513337, + octaves = 1, + persist = 0.5, + flags = "absvalue" + }, + biomes = {"coniferous_forest_dunes", "grassland_dunes"}, + y_min = 4, + y_max = 5, + decoration = { + "default:marram_grass_1", + "default:marram_grass_2", + "default:marram_grass_3", + }, + }) + -- Coral reef minetest.register_decoration({ diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index c642fc39..4033f37c 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -147,6 +147,10 @@ default:fern_1 default:fern_2 default:fern_3 +default:marram_grass_1 +default:marram_grass_2 +default:marram_grass_3 + default:bush_stem default:bush_leaves default:bush_sapling @@ -1373,6 +1377,57 @@ for i = 2, 3 do end +minetest.register_node("default:marram_grass_1", { + description = "Marram Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_marram_grass_1.png"}, + inventory_image = "default_marram_grass_1.png", + wield_image = "default_marram_grass_1.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random marram grass node + local stack = ItemStack("default:marram_grass_" .. math.random(1, 3)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:marram_grass_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 3 do + minetest.register_node("default:marram_grass_" .. i, { + description = "Marram Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_marram_grass_" .. i .. ".png"}, + inventory_image = "default_marram_grass_" .. i .. ".png", + wield_image = "default_marram_grass_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, attached_node = 1, + not_in_creative_inventory=1}, + drop = "default:marram_grass_1", + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + }) +end + + minetest.register_node("default:bush_stem", { description = "Bush Stem", drawtype = "plantlike", diff --git a/mods/default/textures/default_marram_grass_1.png b/mods/default/textures/default_marram_grass_1.png new file mode 100644 index 0000000000000000000000000000000000000000..73ec9e9d1109cd50041cad225495430c684db935 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}cz{ocE0ER=HZqAaGmbSgPBgbj zur*1svPiKsO|`O1wzki7vMsiCEOv1%^mD87@vRLFs0;OP4h?LM@ox?DYYPbJiVp3L zj_QdydwklBiwkdEUVQi3(g!zJcrTst7HBkMNswPKgTu2MX+Tbhr;B5V#O1SHo_q}o z49xB^f`U_B9smFLd)Sb_!Ep!p1*u6{1-oD!M<_1Rhs literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_marram_grass_2.png b/mods/default/textures/default_marram_grass_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2db75c706409472f32463a32f4c09d897940d280 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMf!vLQUR|WttKYRBM|QC#y6Y%XAxiAem|DkZx<6>12~- zXP@b0m1A$4>tLVjssjN zTv=vnITR^{VW73fnF;#U*uR~O>d;N#Wc@7ECK+ZgQA z65!t)>fag?&=wZd79Q9c8rBgW+!+zv85PnM71|vWF(Kyc@oCr2&%beT;jPPy?_OK_ z;O2_Zsq41_JGde;{4-%a()Usb7q{hagP3)rWbnFFAi`rz1hFwkf41_#EoX{V!kai9U_yY z4*f9Wx)NE>#u@20ThwjB^c4Y%uB$J*yof9B%CQX%&*ki|FS{$v$6It-Byu6=W{Jc% lHT5%$y(QWzY(!r(==c8RjdYjny$N&|gQu&X%Q~loCIBbBqFVp} literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_marram_grass_3.png b/mods/default/textures/default_marram_grass_3.png new file mode 100644 index 0000000000000000000000000000000000000000..f6c155f489cae6641344777ed45f6070e1aa4d98 GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}W`IwKD+7a}Zm^L_gsDlCnQ^R{ zaiY0Nij_r*rD>{_U9z=(rjv8NuWhldW3h{Cp`Tlkw_BBuZ*6EmU8sL^sBddvU~`Or zYnWeKKuA|~Xm@l}PfW_Jyu^74XOB<2c7FbiiwkdEUVQi3(g!zJ>|3;XDbP~Jk|4ie z28U-i(tw;d>gLgD?O9 literal 0 HcmV?d00001 From 1e9c61f241f6495d944d7e8e21fa5e150e7f8315 Mon Sep 17 00:00:00 2001 From: ezhh Date: Tue, 6 Feb 2018 00:50:12 +0000 Subject: [PATCH 086/195] Kelp: Improve placement/removal and extend selection box --- mods/default/nodes.lua | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 4033f37c..a2ce2993 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1571,13 +1571,22 @@ minetest.register_node("default:acacia_bush_sapling", { }) minetest.register_node("default:sand_with_kelp", { - description = "Kelp On Sand", + description = "Kelp", drawtype = "plantlike_rooted", + waving = 1, tiles = {"default_sand.png"}, special_tiles = {{name = "default_kelp.png", tileable_vertical = true}}, inventory_image = "default_kelp.png", paramtype2 = "leveled", groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-2/16, 0.5, -2/16, 2/16, 3.5, 2/16}, + }, + }, + node_dig_prediction = "default:sand", node_placement_prediction = "", on_place = function(itemstack, placer, pointed_thing) @@ -1592,7 +1601,11 @@ minetest.register_node("default:sand_with_kelp", { end end - local pos = pointed_thing.above + local pos = pointed_thing.under + if minetest.get_node(pos).name ~= "default:sand" then + return itemstack + end + local height = math.random(4, 6) local pos_top = {x = pos.x, y = pos.y + height, z = pos.z} local node_top = minetest.get_node(pos_top) @@ -1616,6 +1629,10 @@ minetest.register_node("default:sand_with_kelp", { end return itemstack + end, + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:sand"}) end }) From 7754555707a6a1bf1e8f4b57788e27e57fde1cd8 Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 9 Feb 2018 04:52:54 +0000 Subject: [PATCH 087/195] Boats: Prevent entering 'ignore' nodes At world edge make boat bounce back into world by inverting speed. At world base avoid falling into ignore by setting y velocity to 0. --- mods/boats/init.lua | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/mods/boats/init.lua b/mods/boats/init.lua index 72ca478f..9e4e5b30 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -172,15 +172,23 @@ function boat.on_step(self, dtime) local new_velo local new_acce = {x = 0, y = 0, z = 0} if not is_water(p) then - local nodedef = minetest.registered_nodes[minetest.get_node(p).name] - if (not nodedef) or nodedef.walkable then + local nodename = minetest.get_node(p).name + local nodedef = minetest.registered_nodes[nodename] + if nodename == "ignore" then + -- at world edge bounce boat back into world + self.v = -self.v + -- at world base avoid falling into ignore + new_velo = get_velocity(self.v, self.object:getyaw(), 0) + elseif (not nodedef) or nodedef.walkable then self.v = 0 new_acce = {x = 0, y = 1, z = 0} + new_velo = get_velocity(self.v, self.object:getyaw(), + self.object:getvelocity().y) else new_acce = {x = 0, y = -9.8, z = 0} + new_velo = get_velocity(self.v, self.object:getyaw(), + self.object:getvelocity().y) end - new_velo = get_velocity(self.v, self.object:getyaw(), - self.object:getvelocity().y) self.object:setpos(self.object:getpos()) else p.y = p.y + 1 From 495fa32873202c667c589ae691f5e67186762521 Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 11 Feb 2018 08:47:15 +0000 Subject: [PATCH 088/195] Flower spread: Only spread to the same surface node --- mods/flowers/init.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index 011160ed..923a7d66 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -154,11 +154,14 @@ function flowers.flower_spread(pos, node) if num_soils >= 1 then for si = 1, math.min(3, num_soils) do local soil = soils[math.random(num_soils)] + local soil_name = minetest.get_node(soil).name local soil_above = {x = soil.x, y = soil.y + 1, z = soil.z} light = minetest.get_node_light(soil_above) if light and light >= 13 and + -- Only spread to same surface node + soil_name == under.name and -- Desert sand is in the soil group - minetest.get_node(soil).name ~= "default:desert_sand" then + soil_name ~= "default:desert_sand" then minetest.set_node(soil_above, {name = node.name}) end end From b90aabec80b427f84d0bf2da2fae9bcdfceb10ec Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 10 May 2017 08:23:26 +0100 Subject: [PATCH 089/195] Rainforest: Add emergent jungle tree and sapling Height 20 to 32 nodes. Dependent on chunksize >= 5. Base limited to maximum altitude y = 32. Craft sapling from 9 jungle saplings. --- mods/default/README.txt | 1 + mods/default/crafting.lua | 19 +++++++++ mods/default/mapgen.lua | 28 ++++++++++++++ mods/default/nodes.lua | 36 ++++++++++++++++++ .../schematics/emergent_jungle_tree.mts | Bin 0 -> 504 bytes .../emergent_jungle_tree_from_sapling.mts | Bin 0 -> 497 bytes .../default_emergent_jungle_sapling.png | Bin 0 -> 190 bytes mods/default/trees.lua | 14 +++++++ 8 files changed, 98 insertions(+) create mode 100644 mods/default/schematics/emergent_jungle_tree.mts create mode 100644 mods/default/schematics/emergent_jungle_tree_from_sapling.mts create mode 100644 mods/default/textures/default_emergent_jungle_sapling.png diff --git a/mods/default/README.txt b/mods/default/README.txt index 3861eddd..cd4e768c 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -115,6 +115,7 @@ paramat (CC BY-SA 3.0): default_silver_sandstone_block.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) default_bookshelf_slot.png -- Derived from a texture by Gambit (CC-BY-SA 3.0) default_marram_grass_*.png -- Derived from textures by TumeniNodes (CC-BY-SA 3.0) + default_emergent_jungle_sapling.png TumeniNodes (CC BY-SA 3.0): default_desert_cobble.png -- Derived from a texture by brunob.santos (CC BY-SA 3.0) diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index 847f188f..428c0f45 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -763,14 +763,26 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "default:emergent_jungle_sapling", + recipe = { + {"default:junglesapling", "default:junglesapling", "default:junglesapling"}, + {"default:junglesapling", "default:junglesapling", "default:junglesapling"}, + {"default:junglesapling", "default:junglesapling", "default:junglesapling"}, + } +}) + + -- -- Crafting (tool repair) -- + minetest.register_craft({ type = "toolrepair", additional_wear = -0.02, }) + -- -- Cooking recipes -- @@ -849,6 +861,7 @@ minetest.register_craft({ cooktime = 5, }) + -- -- Fuels -- @@ -964,6 +977,12 @@ minetest.register_craft({ burntime = 6, }) +minetest.register_craft({ + type = "fuel", + recipe = "default:emergent_jungle_sapling", + burntime = 7, +}) + minetest.register_craft({ type = "fuel", diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 243d1ed7..e3684c00 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1705,6 +1705,34 @@ function default.register_decorations() rotation = "random", }) + -- Emergent jungle tree + -- Due to 32 node height, altitude is limited and prescence depends on chunksize + + local chunksize = tonumber(minetest.get_mapgen_setting("chunksize")) + if chunksize >= 5 then + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + sidelen = 80, + noise_params = { + offset = 0.0, + scale = 0.0025, + spread = {x = 250, y = 250, z = 250}, + seed = 2685, + octaves = 3, + persist = 0.7 + }, + biomes = {"rainforest"}, + y_min = 1, + y_max = 32, + schematic = minetest.get_modpath("default") .. + "/schematics/emergent_jungle_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + place_offset_y = -4, + }) + end + -- Jungle tree and log minetest.register_decoration({ diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index a2ce2993..3de6f2e4 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -80,6 +80,7 @@ default:jungletree default:junglewood default:jungleleaves default:junglesapling +default:emergent_jungle_sapling default:pine_tree default:pine_wood @@ -775,6 +776,41 @@ minetest.register_node("default:junglesapling", { end, }) +minetest.register_node("default:emergent_jungle_sapling", { + description = "Emergent Jungle Tree Sapling", + drawtype = "plantlike", + tiles = {"default_emergent_jungle_sapling.png"}, + inventory_image = "default_emergent_jungle_sapling.png", + wield_image = "default_emergent_jungle_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:emergent_jungle_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -3, y = -5, z = -3}, + {x = 3, y = 31, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + minetest.register_node("default:pine_tree", { description = "Pine Tree", diff --git a/mods/default/schematics/emergent_jungle_tree.mts b/mods/default/schematics/emergent_jungle_tree.mts new file mode 100644 index 0000000000000000000000000000000000000000..b526430950f44afb3c793bf99d9346a49ed4063c GIT binary patch literal 504 zcmeYb3HD`RVPI!aWniyI2KGn*S)75HfjKd=h(RbNH7&6;r^G6&G%r0TwWKIDl|ckm zEGIRwEVZ~|&f9Qqp(6r3OT~+q$Q-;VbN1I1A+M;k+jGB`xvA8K*u5}vV>|z=l-1u%eDO2{rtR3^q z?bd8u^MA>+#ii%I{1V)~r!ScIIiK-m%X8@q_vU+F+xb?iTk2f-YOZ&WbbtQdCbsJ7 zKb?hM$L_a(u3KOuc`edl-O}Idx0zdZWh6}dEqi>PYuR6(%11gsuD@>*+VXqvQMvgG z?bY7)*N9(e$oE+FZTAkb#ZuKZY_C?_{4XeRdEeRABB$6m6-I^&TQB%5b&c4;{w+{X zU`z3xAK9^aoJ(shuIwpj(2LR3F$qo-+{c<3#kpYV6e))&haQ*9<+WN2 zV`-|J^4(W^Hi@Tx(37xLUL10a(|kF@^JQP>O5RWAh`D`?=YQUD*K!RrmAi$9e(LR6 zEYQW+`hYdGp*1>ilJDN>tJhDz%W-i=_=&$-6`yoER=oLs=Zj-~piCsFcIPj9_k@KW0JSIhT=+qF{ZHD`8CHhq?pGDrK(@mVJ~@mKiAtlvHF znuw(R%AYy1#(U=#yZ_#CrQ)r{=9tG7qBlQpJ9J(*Lo0L7y}f!ny0%|=e>v*SwAZVT z=*_H`TVL%~YqVx_LY(&Z`0V_wX%|nd`EGrFuh*MzlAn%5epr2<)imY(ce(1i){k?F zY(B>-FxNYKZGC@qr_9zHpS3;G@BWo{)O@`@gn`TA?GlD#GZwn0tINu$ri+0^{jPTsbdtJ%GqixF~{(lV%L<;yf@zh4%D&E>4-H_y|DbyiaE2b z_Xy20aue^J=cv(J*^u3I&|qTxGKTfFF6aL}J8Uyw+I@1byW6sQnpazw$%|5 zkrPlf5LXmq^|zD?DO3;#Dq}1O@(X5gcy=QV$O-gxaSY+Oo}2&#z6lKs<{ERe7*Y*p zs5w0KkzhJt#QBEzj6&oyhBWqOgAF{JH#2vnaTn?}yjs=p(mb=l$SXnV8D9WfHTRT* gZ Date: Thu, 15 Feb 2018 06:51:11 +0000 Subject: [PATCH 090/195] Schematics: Various improvements Acacia bush: Create a unique form different to normal bush, with more leaf nodes at top than at base. Acacia tree: Maximum height increased by 1 node. 2 extra nodes of height variation. Jungle tree: Add an extra node of height variation. Y-slices moved downwards to be more balanced between trunk and branches, makes branches more common. Pine tree: Increase maximum height by 1 node. Add an extra node of height variation. Update sapling 'on place' protection checks for acacia and pine trees. --- mods/default/nodes.lua | 4 ++-- mods/default/schematics/acacia_bush.mts | Bin 113 -> 114 bytes mods/default/schematics/acacia_tree.mts | Bin 204 -> 207 bytes .../schematics/acacia_tree_from_sapling.mts | Bin 205 -> 208 bytes mods/default/schematics/jungle_tree.mts | Bin 255 -> 255 bytes .../schematics/jungle_tree_from_sapling.mts | Bin 247 -> 247 bytes mods/default/schematics/pine_tree.mts | Bin 176 -> 178 bytes .../schematics/pine_tree_from_sapling.mts | Bin 174 -> 175 bytes .../schematics/snowy_pine_tree_from_sapling.mts | Bin 232 -> 235 bytes 9 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 3de6f2e4..e037984e 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -882,7 +882,7 @@ minetest.register_node("default:pine_sapling", { -- minp, maxp to be checked, relative to sapling pos -- minp_relative.y = 1 because sapling pos has been checked {x = -2, y = 1, z = -2}, - {x = 2, y = 12, z = 2}, + {x = 2, y = 14, z = 2}, -- maximum interval of interior volume check 4) @@ -962,7 +962,7 @@ minetest.register_node("default:acacia_sapling", { -- minp, maxp to be checked, relative to sapling pos -- minp_relative.y = 1 because sapling pos has been checked {x = -4, y = 1, z = -4}, - {x = 4, y = 6, z = 4}, + {x = 4, y = 7, z = 4}, -- maximum interval of interior volume check 4) diff --git a/mods/default/schematics/acacia_bush.mts b/mods/default/schematics/acacia_bush.mts index df95586110928918f10e78311b6a0a974b7e150a..3322e3b37e47c716b6cf9b4b57ba4fbe74ef26cf 100644 GIT binary patch delta 28 kcmXRcnh-6XET1nQFVCNHRJMWb&vGLy^~sPeQYv%$QIGbHpd@6DsyLXNSJ2-3^EIP7f5*A!CwpD5sh)q04_0 z>K)Q(=5dnH7;QJESO~W8Y4U|YOZsILg7-S5plBpF;cc|Uhv?1zh#JmCRuLlgh2{HO MEIz^p1YOZHAKG6-x&QzG delta 155 zcmV;M0A&Bq0n7mqO;l4&00aOD00;mHe}6xJkr6w8-41{t2u76`<`H~!YLzDbFfFpp zdAtF!voDMph`mmIQku=22da6>6YV@8-uCP#H)-8S*zD*7LN_vp1SHkpc~U0NgFCE2 z;j!d#4&%o4dMNhXO|yr1$^XlHD0?jw9P~8i38Kh%eE(oK%t+^w-grVDEl>Au7K@MB J0Lz5}G9GThMRWiF diff --git a/mods/default/schematics/acacia_tree_from_sapling.mts b/mods/default/schematics/acacia_tree_from_sapling.mts index 23e8e4b3a8dadb62539672269d9248d9bb6cbb76..c32a995cb921351166e6cb27a2dad9b5c8915bd2 100644 GIT binary patch delta 159 zcmV;Q0AT;k0nh;vO;l4&00aOD00{sIe}6weKamhSe_IlOAP7a34YLH6UQMNm4<=31 zCXYWLcIJjsUD4-BPhzt-88IP5bEGHj6M}e~v%}ET?nXif=M6yU41JPGfLD!|(C5Di zaf3A|Jia9)Lbst}A-Te<$rlnY`7axxeY6Ch2?YlYxe2Y&5$~cW`(tW47Fk7Ts4pzv N-(>O;1y;f>ET8;lJ}3YH delta 156 zcmV;N0Av5q0nGsrO;l4&00aOD00;mHe}6xJkr6w8VGe*G2u76)a|DiFt}M&6Ati($5P;arR->uLDQW7C@^X`FJDrO;KUeQm@$S}k6-o8MT~(#lS?WUxDoD;y cpgDtm^#6?>J*>pApigX diff --git a/mods/default/schematics/pine_tree_from_sapling.mts b/mods/default/schematics/pine_tree_from_sapling.mts index e42a9965cda4e177a5acac0b2c6753684085b5cf..0800387c07f3ee33220e03352e6b1828e86fe238 100644 GIT binary patch delta 118 zcmV-+0Ez#u0j~iMO;l4&00aO901yBLe}6xb4nkfEV1z?z%TmvM$Rs1xWI=$5ViqHm z1+jw(ZU^bI2=`GlJZT$#)N$WHrN8+6`uuoexkP~cdWQOZhWh$?Vz>+pV8(wq3zMja YK(G#iTcKO;l4&00aO901p5Ke}9n=LS6tc!XdR~DRmVx$w)O>5MUyc#Rz3V zOlE?cOu8(>Rg{MvZNrKZR}DbAiqEglk0+LkALQ3F)aNtQ*VhxnWncg^{=-=)L_Gw8 X6%*uA)m8Wa6~k&2&U z)Uh!Tf%B$_14{E$1MO|(-Iv!!HJCi_y@{XAb9or)8RZ=d8O&8f#ZSr4ujie#C*Np>~6ud>p+n)z1* z*I+3tmmO&k03pbVX~klXpmq<4mtgp|TC+~pWBt@Np3a6;$6aSFrAF>nTy;=o6;}-M RIt(W@lhuzmu><%SJ7R6VOR)d| From 283636bfdbc5f35f1fdeeb4b270575b0cd10a53c Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 20 Feb 2018 19:15:03 +0100 Subject: [PATCH 091/195] Bones: Iterate player inventory lists dynamically (#1229) Avoid hard-coded player inventory lists. Expose `bones.player_inventory_lists` for mods to look up or change, which player inventory lists are being dropped or placed into bones. --- game_api.txt | 9 ++++++++ mods/bones/init.lua | 54 ++++++++++++++++++++++++--------------------- 2 files changed, 38 insertions(+), 25 deletions(-) diff --git a/game_api.txt b/game_api.txt index f7bcc1eb..bf342674 100644 --- a/game_api.txt +++ b/game_api.txt @@ -67,6 +67,15 @@ Beds API } } +Bones API +--------- + +An ordered list of listnames (default: "main", "craft") of the player inventory, +that will be placed into bones or dropped on player death can be looked up or changed +in `bones.player_inventory_lists`. + +e.g. `table.insert(bones.player_inventory_lists, "backpack")` + Creative API ------------ diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 8688fa1e..42945182 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -1,6 +1,8 @@ -- Minetest 0.4 mod: bones -- See README.txt for licensing and other information. +bones = {} + local function is_owner(pos, name) local owner = minetest.get_meta(pos):get_string("owner") if owner == "" or owner == name or minetest.check_player_privs(name, "protection_bypass") then @@ -165,6 +167,18 @@ local drop = function(pos, itemstack) end end +local player_inventory_lists = { "main", "craft" } +bones.player_inventory_lists = player_inventory_lists + +local function is_all_empty(player_inv) + for _, list_name in ipairs(player_inventory_lists) do + if not player_inv:is_empty(list_name) then + return false + end + end + return true +end + minetest.register_on_dieplayer(function(player) local bones_mode = minetest.settings:get("bones_mode") or "bones" @@ -179,8 +193,7 @@ minetest.register_on_dieplayer(function(player) end local player_inv = player:get_inventory() - if player_inv:is_empty("main") and - player_inv:is_empty("craft") then + if is_all_empty(player_inv) then return end @@ -198,19 +211,12 @@ minetest.register_on_dieplayer(function(player) end if bones_mode == "drop" then - - -- drop inventory items - for i = 1, player_inv:get_size("main") do - drop(pos, player_inv:get_stack("main", i)) + for _, list_name in ipairs(player_inventory_lists) do + for i = 1, player_inv:get_size(list_name) do + drop(pos, player_inv:get_stack(list_name, i)) + end + player_inv:set_list(list_name, {}) end - player_inv:set_list("main", {}) - - -- drop crafting grid items - for i = 1, player_inv:get_size("craft") do - drop(pos, player_inv:get_stack("craft", i)) - end - player_inv:set_list("craft", {}) - drop(pos, ItemStack("bones:bones")) return end @@ -221,21 +227,19 @@ minetest.register_on_dieplayer(function(player) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() inv:set_size("main", 8 * 4) - inv:set_list("main", player_inv:get_list("main")) - for i = 1, player_inv:get_size("craft") do - local stack = player_inv:get_stack("craft", i) - if inv:room_for_item("main", stack) then - inv:add_item("main", stack) - else - --drop if no space left - drop(pos, stack) + for _, list_name in ipairs(player_inventory_lists) do + for i = 1, player_inv:get_size(list_name) do + local stack = player_inv:get_stack(list_name, i) + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + else -- no space left + drop(pos, stack) + end end + player_inv:set_list(list_name, {}) end - player_inv:set_list("main", {}) - player_inv:set_list("craft", {}) - meta:set_string("formspec", bones_formspec) meta:set_string("owner", player_name) From 280f1b1c396b014c062ed9c94197c3b3d20adff5 Mon Sep 17 00:00:00 2001 From: Ezhh Date: Sun, 25 Feb 2018 11:25:34 +0000 Subject: [PATCH 092/195] Put y_max above y_min in mapgen registrations (#2051) Switch y_max and y_min for flowers, fireflies and default --- mods/default/mapgen.lua | 232 ++++++++++++++++++++-------------------- mods/fireflies/init.lua | 4 +- mods/flowers/mapgen.lua | 12 +-- 3 files changed, 124 insertions(+), 124 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index e3684c00..170af2c0 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -59,8 +59,8 @@ function default.register_mgv6_ores() wherein = {"default:sand"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -15, y_max = 0, + y_min = -15, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -80,8 +80,8 @@ function default.register_mgv6_ores() wherein = {"default:stone", "default:desert_stone"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -31, y_max = 0, + y_min = -31, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -101,8 +101,8 @@ function default.register_mgv6_ores() wherein = {"default:stone"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -31, y_max = 31000, + y_min = -31, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -122,8 +122,8 @@ function default.register_mgv6_ores() wherein = {"default:stone"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -31000, y_max = 31000, + y_min = -31000, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -146,8 +146,8 @@ function default.register_mgv6_ores() clust_scarcity = 8 * 8 * 8, clust_num_ores = 9, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -157,8 +157,8 @@ function default.register_mgv6_ores() clust_scarcity = 8 * 8 * 8, clust_num_ores = 8, clust_size = 3, - y_min = -31000, y_max = 64, + y_min = -31000, }) minetest.register_ore({ @@ -168,8 +168,8 @@ function default.register_mgv6_ores() clust_scarcity = 24 * 24 * 24, clust_num_ores = 27, clust_size = 6, - y_min = -31000, y_max = 0, + y_min = -31000, }) -- Iron @@ -181,8 +181,8 @@ function default.register_mgv6_ores() clust_scarcity = 9 * 9 * 9, clust_num_ores = 12, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -192,8 +192,8 @@ function default.register_mgv6_ores() clust_scarcity = 7 * 7 * 7, clust_num_ores = 5, clust_size = 3, - y_min = -31000, y_max = 0, + y_min = -31000, }) minetest.register_ore({ @@ -203,8 +203,8 @@ function default.register_mgv6_ores() clust_scarcity = 24 * 24 * 24, clust_num_ores = 27, clust_size = 6, - y_min = -31000, y_max = -64, + y_min = -31000, }) -- Copper @@ -216,8 +216,8 @@ function default.register_mgv6_ores() clust_scarcity = 9 * 9 * 9, clust_num_ores = 5, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -227,8 +227,8 @@ function default.register_mgv6_ores() clust_scarcity = 12 * 12 * 12, clust_num_ores = 4, clust_size = 3, - y_min = -63, y_max = -16, + y_min = -63, }) minetest.register_ore({ @@ -238,8 +238,8 @@ function default.register_mgv6_ores() clust_scarcity = 9 * 9 * 9, clust_num_ores = 5, clust_size = 3, - y_min = -31000, y_max = -64, + y_min = -31000, }) -- Tin @@ -251,8 +251,8 @@ function default.register_mgv6_ores() clust_scarcity = 10 * 10 * 10, clust_num_ores = 5, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -262,8 +262,8 @@ function default.register_mgv6_ores() clust_scarcity = 13 * 13 * 13, clust_num_ores = 4, clust_size = 3, - y_min = -127, y_max = -32, + y_min = -127, }) minetest.register_ore({ @@ -273,8 +273,8 @@ function default.register_mgv6_ores() clust_scarcity = 10 * 10 * 10, clust_num_ores = 5, clust_size = 3, - y_min = -31000, y_max = -128, + y_min = -31000, }) -- Gold @@ -286,8 +286,8 @@ function default.register_mgv6_ores() clust_scarcity = 13 * 13 * 13, clust_num_ores = 5, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -297,8 +297,8 @@ function default.register_mgv6_ores() clust_scarcity = 15 * 15 * 15, clust_num_ores = 3, clust_size = 2, - y_min = -255, y_max = -64, + y_min = -255, }) minetest.register_ore({ @@ -308,8 +308,8 @@ function default.register_mgv6_ores() clust_scarcity = 13 * 13 * 13, clust_num_ores = 5, clust_size = 3, - y_min = -31000, y_max = -256, + y_min = -31000, }) -- Mese crystal @@ -321,8 +321,8 @@ function default.register_mgv6_ores() clust_scarcity = 14 * 14 * 14, clust_num_ores = 5, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -332,8 +332,8 @@ function default.register_mgv6_ores() clust_scarcity = 18 * 18 * 18, clust_num_ores = 3, clust_size = 2, - y_min = -255, y_max = -64, + y_min = -255, }) minetest.register_ore({ @@ -343,8 +343,8 @@ function default.register_mgv6_ores() clust_scarcity = 14 * 14 * 14, clust_num_ores = 5, clust_size = 3, - y_min = -31000, y_max = -256, + y_min = -31000, }) -- Diamond @@ -356,8 +356,8 @@ function default.register_mgv6_ores() clust_scarcity = 15 * 15 * 15, clust_num_ores = 4, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -367,8 +367,8 @@ function default.register_mgv6_ores() clust_scarcity = 17 * 17 * 17, clust_num_ores = 4, clust_size = 3, - y_min = -255, y_max = -128, + y_min = -255, }) minetest.register_ore({ @@ -378,8 +378,8 @@ function default.register_mgv6_ores() clust_scarcity = 15 * 15 * 15, clust_num_ores = 4, clust_size = 3, - y_min = -31000, y_max = -256, + y_min = -31000, }) -- Mese block @@ -391,8 +391,8 @@ function default.register_mgv6_ores() clust_scarcity = 36 * 36 * 36, clust_num_ores = 3, clust_size = 2, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -402,8 +402,8 @@ function default.register_mgv6_ores() clust_scarcity = 36 * 36 * 36, clust_num_ores = 3, clust_size = 2, - y_min = -31000, y_max = -1024, + y_min = -31000, }) end @@ -424,8 +424,8 @@ function default.register_ores() wherein = {"default:sand"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -15, y_max = 0, + y_min = -15, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -445,8 +445,8 @@ function default.register_ores() wherein = {"default:stone"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -31000, y_max = 31000, + y_min = -31000, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -474,8 +474,8 @@ function default.register_ores() wherein = {"default:stone"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -31, y_max = 31000, + y_min = -31, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -498,8 +498,8 @@ function default.register_ores() wherein = {"default:stone"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -31000, y_max = 31000, + y_min = -31000, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -530,8 +530,8 @@ function default.register_ores() clust_scarcity = 8 * 8 * 8, clust_num_ores = 9, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -541,8 +541,8 @@ function default.register_ores() clust_scarcity = 8 * 8 * 8, clust_num_ores = 8, clust_size = 3, - y_min = -31000, y_max = 64, + y_min = -31000, }) minetest.register_ore({ @@ -552,8 +552,8 @@ function default.register_ores() clust_scarcity = 24 * 24 * 24, clust_num_ores = 27, clust_size = 6, - y_min = -31000, y_max = 0, + y_min = -31000, }) -- Iron @@ -565,8 +565,8 @@ function default.register_ores() clust_scarcity = 9 * 9 * 9, clust_num_ores = 12, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -576,8 +576,8 @@ function default.register_ores() clust_scarcity = 7 * 7 * 7, clust_num_ores = 5, clust_size = 3, - y_min = -31000, y_max = 0, + y_min = -31000, }) minetest.register_ore({ @@ -587,8 +587,8 @@ function default.register_ores() clust_scarcity = 24 * 24 * 24, clust_num_ores = 27, clust_size = 6, - y_min = -31000, y_max = -64, + y_min = -31000, }) -- Tin @@ -600,8 +600,8 @@ function default.register_ores() clust_scarcity = 10 * 10 * 10, clust_num_ores = 5, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -611,8 +611,8 @@ function default.register_ores() clust_scarcity = 13 * 13 * 13, clust_num_ores = 4, clust_size = 3, - y_min = -127, y_max = -64, + y_min = -127, }) minetest.register_ore({ @@ -622,8 +622,8 @@ function default.register_ores() clust_scarcity = 10 * 10 * 10, clust_num_ores = 5, clust_size = 3, - y_min = -31000, y_max = -128, + y_min = -31000, }) -- Copper @@ -635,8 +635,8 @@ function default.register_ores() clust_scarcity = 9 * 9 * 9, clust_num_ores = 5, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -646,8 +646,8 @@ function default.register_ores() clust_scarcity = 12 * 12 * 12, clust_num_ores = 4, clust_size = 3, - y_min = -255, y_max = -128, + y_min = -255, }) minetest.register_ore({ @@ -657,8 +657,8 @@ function default.register_ores() clust_scarcity = 9 * 9 * 9, clust_num_ores = 5, clust_size = 3, - y_min = -31000, y_max = -256, + y_min = -31000, }) -- Gold @@ -670,8 +670,8 @@ function default.register_ores() clust_scarcity = 13 * 13 * 13, clust_num_ores = 5, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -681,8 +681,8 @@ function default.register_ores() clust_scarcity = 15 * 15 * 15, clust_num_ores = 3, clust_size = 2, - y_min = -1023, y_max = -256, + y_min = -1023, }) minetest.register_ore({ @@ -692,8 +692,8 @@ function default.register_ores() clust_scarcity = 13 * 13 * 13, clust_num_ores = 5, clust_size = 3, - y_min = -31000, y_max = -1024, + y_min = -31000, }) -- Diamond @@ -705,8 +705,8 @@ function default.register_ores() clust_scarcity = 15 * 15 * 15, clust_num_ores = 4, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -716,8 +716,8 @@ function default.register_ores() clust_scarcity = 17 * 17 * 17, clust_num_ores = 4, clust_size = 3, - y_min = -1023, y_max = -512, + y_min = -1023, }) minetest.register_ore({ @@ -727,8 +727,8 @@ function default.register_ores() clust_scarcity = 15 * 15 * 15, clust_num_ores = 4, clust_size = 3, - y_min = -31000, y_max = -1024, + y_min = -31000, }) -- Mese crystal @@ -740,8 +740,8 @@ function default.register_ores() clust_scarcity = 14 * 14 * 14, clust_num_ores = 5, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -751,8 +751,8 @@ function default.register_ores() clust_scarcity = 18 * 18 * 18, clust_num_ores = 3, clust_size = 2, - y_min = -1023, y_max = -512, + y_min = -1023, }) minetest.register_ore({ @@ -762,8 +762,8 @@ function default.register_ores() clust_scarcity = 14 * 14 * 14, clust_num_ores = 5, clust_size = 3, - y_min = -31000, y_max = -1024, + y_min = -31000, }) -- Mese block @@ -775,8 +775,8 @@ function default.register_ores() clust_scarcity = 36 * 36 * 36, clust_num_ores = 3, clust_size = 2, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -786,8 +786,8 @@ function default.register_ores() clust_scarcity = 36 * 36 * 36, clust_num_ores = 3, clust_size = 2, - y_min = -2047, y_max = -1024, + y_min = -2047, }) minetest.register_ore({ @@ -797,8 +797,8 @@ function default.register_ores() clust_scarcity = 28 * 28 * 28, clust_num_ores = 5, clust_size = 3, - y_min = -31000, y_max = -2048, + y_min = -31000, }) end @@ -827,8 +827,8 @@ function default.register_biomes(upper_limit) node_river_water = "default:ice", node_riverbed = "default:gravel", depth_riverbed = 2, - y_min = -8, y_max = upper_limit, + y_min = -8, heat_point = 0, humidity_point = 73, }) @@ -845,8 +845,8 @@ function default.register_biomes(upper_limit) depth_water_top = 10, --node_water = "", --node_river_water = "", - y_min = -112, y_max = -9, + y_min = -112, heat_point = 0, humidity_point = 73, }) @@ -867,8 +867,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:gravel", depth_riverbed = 2, - y_min = 2, y_max = upper_limit, + y_min = 2, heat_point = 0, humidity_point = 40, }) @@ -887,8 +887,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:gravel", depth_riverbed = 2, - y_min = -3, y_max = 1, + y_min = -3, heat_point = 0, humidity_point = 40, }) @@ -907,8 +907,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:gravel", depth_riverbed = 2, - y_min = -112, y_max = -4, + y_min = -112, heat_point = 0, humidity_point = 40, }) @@ -929,8 +929,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 2, y_max = upper_limit, + y_min = 2, heat_point = 25, humidity_point = 70, }) @@ -949,8 +949,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -112, y_max = 1, + y_min = -112, heat_point = 25, humidity_point = 70, }) @@ -971,8 +971,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 5, y_max = upper_limit, + y_min = 5, heat_point = 20, humidity_point = 35, }) @@ -991,8 +991,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -112, y_max = 4, + y_min = -112, heat_point = 20, humidity_point = 35, }) @@ -1013,8 +1013,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 6, y_max = upper_limit, + y_min = 6, heat_point = 50, humidity_point = 35, }) @@ -1033,8 +1033,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 4, y_max = 5, + y_min = 4, heat_point = 50, humidity_point = 35, }) @@ -1053,8 +1053,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -112, y_max = 3, + y_min = -112, heat_point = 50, humidity_point = 35, }) @@ -1075,8 +1075,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 6, y_max = upper_limit, + y_min = 6, heat_point = 45, humidity_point = 70, }) @@ -1095,8 +1095,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 4, y_max = 5, + y_min = 4, heat_point = 45, humidity_point = 70, }) @@ -1115,8 +1115,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -112, y_max = 3, + y_min = -112, heat_point = 45, humidity_point = 70, }) @@ -1137,8 +1137,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 1, y_max = upper_limit, + y_min = 1, heat_point = 60, humidity_point = 68, }) @@ -1157,8 +1157,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -1, y_max = 0, + y_min = -1, heat_point = 60, humidity_point = 68, }) @@ -1177,8 +1177,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -112, y_max = -2, + y_min = -112, heat_point = 60, humidity_point = 68, }) @@ -1199,8 +1199,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 5, y_max = upper_limit, + y_min = 5, heat_point = 92, humidity_point = 16, }) @@ -1219,8 +1219,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -112, y_max = 4, + y_min = -112, heat_point = 92, humidity_point = 16, }) @@ -1241,8 +1241,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 5, y_max = upper_limit, + y_min = 5, heat_point = 60, humidity_point = 0, }) @@ -1261,8 +1261,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -112, y_max = 4, + y_min = -112, heat_point = 60, humidity_point = 0, }) @@ -1283,8 +1283,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 5, y_max = upper_limit, + y_min = 5, heat_point = 40, humidity_point = 0, }) @@ -1303,8 +1303,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -112, y_max = 4, + y_min = -112, heat_point = 40, humidity_point = 0, }) @@ -1325,8 +1325,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 1, y_max = upper_limit, + y_min = 1, heat_point = 89, humidity_point = 42, }) @@ -1345,8 +1345,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -1, y_max = 0, + y_min = -1, heat_point = 89, humidity_point = 42, }) @@ -1365,8 +1365,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -112, y_max = -2, + y_min = -112, heat_point = 89, humidity_point = 42, }) @@ -1387,8 +1387,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 1, y_max = upper_limit, + y_min = 1, heat_point = 86, humidity_point = 65, }) @@ -1407,8 +1407,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -1, y_max = 0, + y_min = -1, heat_point = 86, humidity_point = 65, }) @@ -1427,8 +1427,8 @@ function default.register_biomes(upper_limit) --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -112, y_max = -2, + y_min = -112, heat_point = 86, humidity_point = 65, }) @@ -1447,8 +1447,8 @@ function default.register_biomes(upper_limit) --depth_water_top = , --node_water = "", --node_river_water = "", - y_min = -31000, y_max = -113, + y_min = -31000, heat_point = 50, humidity_point = 50, }) @@ -1475,8 +1475,8 @@ function default.register_floatland_biomes(floatland_level, shadow_limit) --node_river_water = "", --node_riverbed = "", --depth_riverbed = , - y_min = floatland_level + 4, y_max = 31000, + y_min = floatland_level + 4, heat_point = 50, humidity_point = 50, }) @@ -1495,8 +1495,8 @@ function default.register_floatland_biomes(floatland_level, shadow_limit) --node_river_water = "", --node_riverbed = "", --depth_riverbed = , - y_min = shadow_limit, y_max = floatland_level + 3, + y_min = shadow_limit, heat_point = 50, humidity_point = 50, }) @@ -1525,8 +1525,8 @@ function default.register_mgv6_decorations() octaves = 3, persist = 0.7 }, - y_min = 1, y_max = 1, + y_min = 1, decoration = "default:papyrus", height = 2, height_max = 4, @@ -1548,8 +1548,8 @@ function default.register_mgv6_decorations() octaves = 3, persist = 0.6 }, - y_min = 1, y_max = 30, + y_min = 1, decoration = "default:cactus", height = 3, height_max = 4, @@ -1570,8 +1570,8 @@ function default.register_mgv6_decorations() octaves = 3, persist = 0.6 }, - y_min = 1, y_max = 30, + y_min = 1, decoration = "default:grass_"..length, }) end @@ -1590,8 +1590,8 @@ function default.register_mgv6_decorations() octaves = 3, persist = 0.6 }, - y_min = 1, y_max = 30, + y_min = 1, decoration = "default:dry_shrub", param2 = 4, }) @@ -1614,8 +1614,8 @@ local function register_grass_decoration(offset, scale, length) persist = 0.6 }, biomes = {"grassland", "deciduous_forest", "floatland_grassland"}, - y_min = 1, y_max = 31000, + y_min = 1, decoration = "default:grass_" .. length, }) end @@ -1634,8 +1634,8 @@ local function register_dry_grass_decoration(offset, scale, length) persist = 0.6 }, biomes = {"savanna"}, - y_min = 1, y_max = 31000, + y_min = 1, decoration = "default:dry_grass_" .. length, }) end @@ -1654,8 +1654,8 @@ local function register_fern_decoration(seed, length) persist = 0.7 }, biomes = {"coniferous_forest"}, - y_min = 6, y_max = 31000, + y_min = 6, decoration = "default:fern_" .. length, }) end @@ -1678,8 +1678,8 @@ function default.register_decorations() persist = 0.66 }, biomes = {"deciduous_forest"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/apple_tree.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -1698,8 +1698,8 @@ function default.register_decorations() persist = 0.66 }, biomes = {"deciduous_forest"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/apple_log.mts", flags = "place_center_x", rotation = "random", @@ -1723,8 +1723,8 @@ function default.register_decorations() persist = 0.7 }, biomes = {"rainforest"}, - y_min = 1, y_max = 32, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/emergent_jungle_tree.mts", flags = "place_center_x, place_center_z", @@ -1741,8 +1741,8 @@ function default.register_decorations() sidelen = 16, fill_ratio = 0.1, biomes = {"rainforest", "rainforest_swamp"}, - y_min = -1, y_max = 31000, + y_min = -1, schematic = minetest.get_modpath("default") .. "/schematics/jungle_tree.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -1754,8 +1754,8 @@ function default.register_decorations() sidelen = 16, fill_ratio = 0.005, biomes = {"rainforest", "rainforest_swamp"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/jungle_log.mts", flags = "place_center_x", rotation = "random", @@ -1776,8 +1776,8 @@ function default.register_decorations() persist = 0.66 }, biomes = {"taiga", "coniferous_forest"}, - y_min = 2, y_max = 31000, + y_min = 2, schematic = minetest.get_modpath("default") .. "/schematics/pine_tree.mts", flags = "place_center_x, place_center_z", }) @@ -1795,8 +1795,8 @@ function default.register_decorations() persist = 0.66 }, biomes = {"taiga", "coniferous_forest"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/pine_log.mts", flags = "place_center_x", rotation = "random", @@ -1817,8 +1817,8 @@ function default.register_decorations() persist = 0.66 }, biomes = {"savanna"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/acacia_tree.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -1837,8 +1837,8 @@ function default.register_decorations() persist = 0.66 }, biomes = {"savanna"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/acacia_log.mts", flags = "place_center_x", rotation = "random", @@ -1859,8 +1859,8 @@ function default.register_decorations() persist = 0.66 }, biomes = {"deciduous_forest"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/aspen_tree.mts", flags = "place_center_x, place_center_z", }) @@ -1878,8 +1878,8 @@ function default.register_decorations() persist = 0.66 }, biomes = {"deciduous_forest"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/aspen_log.mts", flags = "place_center_x", rotation = "random", @@ -1900,8 +1900,8 @@ function default.register_decorations() persist = 0.6 }, biomes = {"desert"}, - y_min = 5, y_max = 31000, + y_min = 5, schematic = minetest.get_modpath("default") .. "/schematics/large_cactus.mts", flags = "place_center_x", rotation = "random", @@ -1922,8 +1922,8 @@ function default.register_decorations() persist = 0.6 }, biomes = {"desert"}, - y_min = 5, y_max = 31000, + y_min = 5, decoration = "default:cactus", height = 2, height_max = 5, @@ -1944,8 +1944,8 @@ function default.register_decorations() persist = 0.7 }, biomes = {"savanna_shore"}, - y_min = 0, y_max = 0, + y_min = 0, schematic = minetest.get_modpath("default") .. "/schematics/papyrus.mts", }) @@ -1965,8 +1965,8 @@ function default.register_decorations() }, biomes = {"snowy_grassland", "grassland", "deciduous_forest", "floatland_grassland"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/bush.mts", flags = "place_center_x, place_center_z", }) @@ -1986,8 +1986,8 @@ function default.register_decorations() persist = 0.7, }, biomes = {"savanna"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/acacia_bush.mts", flags = "place_center_x, place_center_z", }) @@ -2022,8 +2022,8 @@ function default.register_decorations() sidelen = 16, fill_ratio = 0.1, biomes = {"rainforest"}, - y_min = 1, y_max = 31000, + y_min = 1, decoration = "default:junglegrass", }) @@ -2043,8 +2043,8 @@ function default.register_decorations() persist = 0.6 }, biomes = {"desert", "sandstone_desert", "cold_desert"}, - y_min = 2, y_max = 31000, + y_min = 2, decoration = "default:dry_shrub", param2 = 4, }) @@ -2065,8 +2065,8 @@ function default.register_decorations() flags = "absvalue" }, biomes = {"coniferous_forest_dunes", "grassland_dunes"}, - y_min = 4, y_max = 5, + y_min = 4, decoration = { "default:marram_grass_1", "default:marram_grass_2", @@ -2092,8 +2092,8 @@ function default.register_decorations() "savanna_ocean", "rainforest_ocean", }, - y_min = -8, y_max = -2, + y_min = -8, schematic = minetest.get_modpath("default") .. "/schematics/corals.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2122,8 +2122,8 @@ function default.register_decorations() "deciduous_forest_ocean", "sandstone_desert_ocean", "cold_desert_ocean"}, - y_min = -10, y_max = -5, + y_min = -10, flags = "force_placement", decoration = "default:sand_with_kelp", param2 = 48, diff --git a/mods/fireflies/init.lua b/mods/fireflies/init.lua index 8294baff..b403eeac 100644 --- a/mods/fireflies/init.lua +++ b/mods/fireflies/init.lua @@ -144,8 +144,8 @@ minetest.register_decoration({ "rainforest", "rainforest_swamp" }, - y_min = -1, y_max = 31000, + y_min = -1, decoration = "fireflies:firefly", }) @@ -166,7 +166,7 @@ minetest.register_decoration({ "rainforest", "rainforest_swamp" }, - y_min = -1, y_max = 31000, + y_min = -1, decoration = "fireflies:firefly", }) diff --git a/mods/flowers/mapgen.lua b/mods/flowers/mapgen.lua index c8cc604f..b7b4bebc 100644 --- a/mods/flowers/mapgen.lua +++ b/mods/flowers/mapgen.lua @@ -15,8 +15,8 @@ local function register_mgv6_flower(name) octaves = 3, persist = 0.6 }, - y_min = 1, y_max = 30, + y_min = 1, decoration = "flowers:"..name, }) end @@ -34,8 +34,8 @@ local function register_mgv6_mushroom(name) octaves = 3, persist = 0.6 }, - y_min = 1, y_max = 30, + y_min = 1, decoration = "flowers:"..name, spawn_by = "default:tree", num_spawn_by = 1, @@ -55,8 +55,8 @@ local function register_mgv6_waterlily() octaves = 3, persist = 0.7 }, - y_min = 0, y_max = 0, + y_min = 0, schematic = minetest.get_modpath("flowers").."/schematics/waterlily.mts", rotation = "random", }) @@ -95,8 +95,8 @@ local function register_flower(seed, name) persist = 0.6 }, biomes = {"grassland", "deciduous_forest", "floatland_grassland"}, - y_min = 1, y_max = 31000, + y_min = 1, decoration = "flowers:"..name, }) end @@ -115,8 +115,8 @@ local function register_mushroom(name) persist = 0.66 }, biomes = {"deciduous_forest", "coniferous_forest"}, - y_min = 1, y_max = 31000, + y_min = 1, decoration = "flowers:"..name, }) end @@ -135,8 +135,8 @@ local function register_waterlily() persist = 0.7 }, biomes = {"rainforest_swamp", "savanna_shore", "deciduous_forest_shore"}, - y_min = 0, y_max = 0, + y_min = 0, schematic = minetest.get_modpath("flowers") .. "/schematics/waterlily.mts", rotation = "random", }) From 70d91bc64d0bc4be80adf34ff2a45971d7e1c4ac Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 26 Feb 2018 18:47:18 +0000 Subject: [PATCH 093/195] Revert "Boats: Prevent entering 'ignore' nodes" This reverts commit 7754555707a6a1bf1e8f4b57788e27e57fde1cd8. Due to recent engine commit boats now collide with 'ignore' nodes. --- mods/boats/init.lua | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/mods/boats/init.lua b/mods/boats/init.lua index 9e4e5b30..72ca478f 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -172,23 +172,15 @@ function boat.on_step(self, dtime) local new_velo local new_acce = {x = 0, y = 0, z = 0} if not is_water(p) then - local nodename = minetest.get_node(p).name - local nodedef = minetest.registered_nodes[nodename] - if nodename == "ignore" then - -- at world edge bounce boat back into world - self.v = -self.v - -- at world base avoid falling into ignore - new_velo = get_velocity(self.v, self.object:getyaw(), 0) - elseif (not nodedef) or nodedef.walkable then + local nodedef = minetest.registered_nodes[minetest.get_node(p).name] + if (not nodedef) or nodedef.walkable then self.v = 0 new_acce = {x = 0, y = 1, z = 0} - new_velo = get_velocity(self.v, self.object:getyaw(), - self.object:getvelocity().y) else new_acce = {x = 0, y = -9.8, z = 0} - new_velo = get_velocity(self.v, self.object:getyaw(), - self.object:getvelocity().y) end + new_velo = get_velocity(self.v, self.object:getyaw(), + self.object:getvelocity().y) self.object:setpos(self.object:getpos()) else p.y = p.y + 1 From 04a46d0671756b2f8136de5ceac18273f26b75f9 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 25 Feb 2018 12:30:36 +0100 Subject: [PATCH 094/195] Rename intersects_protection to is_area_protected --- mods/default/legacy.lua | 4 ++-- mods/default/trees.lua | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/default/legacy.lua b/mods/default/legacy.lua index 17e30360..123fcd5e 100644 --- a/mods/default/legacy.lua +++ b/mods/default/legacy.lua @@ -41,6 +41,6 @@ default.register_chest = default.chest.register_chest -- Check for a volume intersecting protection function default.intersects_protection(minp, maxp, player_name, interval) minetest.log("warning", "default.intersects_protection() is " .. - "deprecated, use minetest.intersects_protection() instead.") - minetest.intersects_protection(minp, maxp, player_name, interval) + "deprecated, use minetest.is_area_protected() instead.") + minetest.is_area_protected(minp, maxp, player_name, interval) end diff --git a/mods/default/trees.lua b/mods/default/trees.lua index f5ee8ca3..c4403096 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -504,7 +504,7 @@ function default.sapling_on_place(itemstack, placer, pointed_thing, return itemstack end -- Check tree volume for protection - if minetest.intersects_protection( + if minetest.is_area_protected( vector.add(pos, minp_relative), vector.add(pos, maxp_relative), player_name, From 702070accb8c01bc0b215b9b245ca5d1e686e803 Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 25 Feb 2018 20:19:41 +0000 Subject: [PATCH 095/195] Floatland biomes: Add forest, tune beach height --- mods/default/mapgen.lua | 34 +++++++++++++++++++++++++++------- mods/flowers/mapgen.lua | 3 ++- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 170af2c0..ff9491b7 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1476,13 +1476,33 @@ function default.register_floatland_biomes(floatland_level, shadow_limit) --node_riverbed = "", --depth_riverbed = , y_max = 31000, - y_min = floatland_level + 4, + y_min = floatland_level + 2, heat_point = 50, - humidity_point = 50, + humidity_point = 25, }) minetest.register_biome({ - name = "floatland_grassland_ocean", + name = "floatland_coniferous_forest", + --node_dust = "", + node_top = "default:dirt_with_coniferous_litter", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + --node_riverbed = "", + --depth_riverbed = , + y_max = 31000, + y_min = floatland_level + 2, + heat_point = 50, + humidity_point = 75, + }) + + minetest.register_biome({ + name = "floatland_ocean", --node_dust = "", node_top = "default:sand", depth_top = 1, @@ -1495,7 +1515,7 @@ function default.register_floatland_biomes(floatland_level, shadow_limit) --node_river_water = "", --node_riverbed = "", --depth_riverbed = , - y_max = floatland_level + 3, + y_max = floatland_level + 1, y_min = shadow_limit, heat_point = 50, humidity_point = 50, @@ -1653,7 +1673,7 @@ local function register_fern_decoration(seed, length) octaves = 3, persist = 0.7 }, - biomes = {"coniferous_forest"}, + biomes = {"coniferous_forest", "floatland_coniferous_forest"}, y_max = 31000, y_min = 6, decoration = "default:fern_" .. length, @@ -1775,7 +1795,7 @@ function default.register_decorations() octaves = 3, persist = 0.66 }, - biomes = {"taiga", "coniferous_forest"}, + biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, y_max = 31000, y_min = 2, schematic = minetest.get_modpath("default") .. "/schematics/pine_tree.mts", @@ -1794,7 +1814,7 @@ function default.register_decorations() octaves = 3, persist = 0.66 }, - biomes = {"taiga", "coniferous_forest"}, + biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, y_max = 31000, y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/pine_log.mts", diff --git a/mods/flowers/mapgen.lua b/mods/flowers/mapgen.lua index b7b4bebc..1c155add 100644 --- a/mods/flowers/mapgen.lua +++ b/mods/flowers/mapgen.lua @@ -114,7 +114,8 @@ local function register_mushroom(name) octaves = 3, persist = 0.66 }, - biomes = {"deciduous_forest", "coniferous_forest"}, + biomes = {"deciduous_forest", "coniferous_forest", + "floatland_coniferous_forest"}, y_max = 31000, y_min = 1, decoration = "flowers:"..name, From 63ebdfd139febe9ff9be612ec539daab8940697e Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 25 Feb 2018 21:03:54 +0000 Subject: [PATCH 096/195] Waterlily: Place as Y-offset simple decoration --- mods/flowers/init.lua | 1 - mods/flowers/mapgen.lua | 16 ++++++++++------ mods/flowers/schematics/waterlily.mts | Bin 75 -> 0 bytes 3 files changed, 10 insertions(+), 7 deletions(-) delete mode 100644 mods/flowers/schematics/waterlily.mts diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index 923a7d66..f2affb99 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -280,7 +280,6 @@ minetest.register_node("flowers:waterlily", { liquids_pointable = true, walkable = false, buildable_to = true, - sunlight_propagates = true, floodable = true, groups = {snappy = 3, flower = 1, flammable = 1}, sounds = default.node_sound_leaves_defaults(), diff --git a/mods/flowers/mapgen.lua b/mods/flowers/mapgen.lua index 1c155add..5e81925b 100644 --- a/mods/flowers/mapgen.lua +++ b/mods/flowers/mapgen.lua @@ -44,7 +44,7 @@ end local function register_mgv6_waterlily() minetest.register_decoration({ - deco_type = "schematic", + deco_type = "simple", place_on = {"default:dirt"}, sidelen = 16, noise_params = { @@ -57,8 +57,10 @@ local function register_mgv6_waterlily() }, y_max = 0, y_min = 0, - schematic = minetest.get_modpath("flowers").."/schematics/waterlily.mts", - rotation = "random", + decoration = "flowers:waterlily", + param2 = 0, + param2_max = 3, + place_offset_y = 1, }) end @@ -124,7 +126,7 @@ end local function register_waterlily() minetest.register_decoration({ - deco_type = "schematic", + deco_type = "simple", place_on = {"default:dirt"}, sidelen = 16, noise_params = { @@ -138,8 +140,10 @@ local function register_waterlily() biomes = {"rainforest_swamp", "savanna_shore", "deciduous_forest_shore"}, y_max = 0, y_min = 0, - schematic = minetest.get_modpath("flowers") .. "/schematics/waterlily.mts", - rotation = "random", + decoration = "flowers:waterlily", + param2 = 0, + param2_max = 3, + place_offset_y = 1, }) end diff --git a/mods/flowers/schematics/waterlily.mts b/mods/flowers/schematics/waterlily.mts deleted file mode 100644 index 69e1d8e0c76ea232c9e17f52b6d4dbcb30e378fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75 zcmeYb3HD`RVPIrnW?-zZuLn{*DXD3Rr8y;5DVaqj49tm{MGS&zIr-(OMa5R-i6yB; dIhi??6?2jk5)x7pew`0Ef8YQE1BWDI695=37 Date: Sun, 25 Feb 2018 23:29:16 +0000 Subject: [PATCH 097/195] Fireflies: Add dedicated mgv6 register_decoration --- mods/fireflies/init.lua | 113 +++++++++++++++++++++++++--------------- 1 file changed, 71 insertions(+), 42 deletions(-) diff --git a/mods/fireflies/init.lua b/mods/fireflies/init.lua index b403eeac..f879d8b7 100644 --- a/mods/fireflies/init.lua +++ b/mods/fireflies/init.lua @@ -127,46 +127,75 @@ minetest.register_craft( { -- register fireflies as decorations -minetest.register_decoration({ - deco_type = "simple", - place_on = { - "default:dirt_with_grass", - "default:dirt_with_coniferous_litter", - "default:dirt_with_rainforest_litter", - "default:dirt" - }, - place_offset_y = 2, - sidelen = 80, - fill_ratio = 0.002, - biomes = { - "deciduous_forest", - "coniferous_forest", - "rainforest", - "rainforest_swamp" - }, - y_max = 31000, - y_min = -1, - decoration = "fireflies:firefly", -}) -minetest.register_decoration({ - deco_type = "simple", - place_on = { - "default:dirt_with_grass", - "default:dirt_with_coniferous_litter", - "default:dirt_with_rainforest_litter", - "default:dirt" - }, - place_offset_y = 3, - sidelen = 80, - fill_ratio = 0.002, - biomes = { - "deciduous_forest", - "coniferous_forest", - "rainforest", - "rainforest_swamp" - }, - y_max = 31000, - y_min = -1, - decoration = "fireflies:firefly", -}) +if minetest.get_mapgen_setting("mg_name") == "v6" then + + minetest.register_decoration({ + deco_type = "simple", + place_on = "default:dirt_with_grass", + place_offset_y = 2, + sidelen = 80, + fill_ratio = 0.0002, + y_max = 31000, + y_min = 1, + decoration = "fireflies:firefly", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = "default:dirt_with_grass", + place_offset_y = 3, + sidelen = 80, + fill_ratio = 0.0002, + y_max = 31000, + y_min = 1, + decoration = "fireflies:firefly", + }) + +else + + minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", + "default:dirt_with_coniferous_litter", + "default:dirt_with_rainforest_litter", + "default:dirt" + }, + place_offset_y = 2, + sidelen = 80, + fill_ratio = 0.002, + biomes = { + "deciduous_forest", + "coniferous_forest", + "rainforest", + "rainforest_swamp" + }, + y_max = 31000, + y_min = -1, + decoration = "fireflies:firefly", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", + "default:dirt_with_coniferous_litter", + "default:dirt_with_rainforest_litter", + "default:dirt" + }, + place_offset_y = 3, + sidelen = 80, + fill_ratio = 0.002, + biomes = { + "deciduous_forest", + "coniferous_forest", + "rainforest", + "rainforest_swamp" + }, + y_max = 31000, + y_min = -1, + decoration = "fireflies:firefly", + }) + +end From 3afcd68e9bdfbe2b7ee6d728b3760dbc12f03491 Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 25 Feb 2018 18:27:23 +0000 Subject: [PATCH 098/195] Ores: Remove region overlaps. Make some regions deeper --- mods/default/mapgen.lua | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index ff9491b7..0a1b41e6 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -542,17 +542,17 @@ function default.register_ores() clust_num_ores = 8, clust_size = 3, y_max = 64, - y_min = -31000, + y_min = -127, }) minetest.register_ore({ ore_type = "scatter", ore = "default:stone_with_coal", wherein = "default:stone", - clust_scarcity = 24 * 24 * 24, - clust_num_ores = 27, - clust_size = 6, - y_max = 0, + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 30, + clust_size = 5, + y_max = -128, y_min = -31000, }) @@ -577,17 +577,17 @@ function default.register_ores() clust_num_ores = 5, clust_size = 3, y_max = 0, - y_min = -31000, + y_min = -127, }) minetest.register_ore({ ore_type = "scatter", ore = "default:stone_with_iron", wherein = "default:stone", - clust_scarcity = 24 * 24 * 24, - clust_num_ores = 27, - clust_size = 6, - y_max = -64, + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 29, + clust_size = 5, + y_max = -128, y_min = -31000, }) @@ -611,8 +611,8 @@ function default.register_ores() clust_scarcity = 13 * 13 * 13, clust_num_ores = 4, clust_size = 3, - y_max = -64, - y_min = -127, + y_max = -128, + y_min = -255, }) minetest.register_ore({ @@ -622,7 +622,7 @@ function default.register_ores() clust_scarcity = 10 * 10 * 10, clust_num_ores = 5, clust_size = 3, - y_max = -128, + y_max = -256, y_min = -31000, }) From 1afb8f249e21fd6e85b11af9410f74c869bbf7c2 Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 1 Mar 2018 12:02:10 +0000 Subject: [PATCH 099/195] Creative: Fix width of arrow textures --- mods/creative/textures/creative_next_icon.png | Bin 728 -> 727 bytes mods/creative/textures/creative_prev_icon.png | Bin 729 -> 728 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/creative/textures/creative_next_icon.png b/mods/creative/textures/creative_next_icon.png index 83bd2403a8c37a2000003534e8b54e85208388e6..82cf3d3616bfeb8cef3bbd14e5811c349cce3226 100644 GIT binary patch literal 727 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV4COY;uunK>+PMrdBTn&4iAk_ zCzVg(Na=19?+|cZ@IbL5e8K}(p%j$~LCzBsW`=l_98+=LxOqcU#KxZ4bF1w%xt0{a z`}n5x5A!4yPfR4$8*;e!gynrkwWs^THJ8fwm6_+NZhvfNz`X2$*7H3+nrmg>zn$fk zcU;DTEsp7Yqx;j4fC<766bo4PXc+pOTKe$LWCb^d;0JOacKq4RS~rcuZuyjTGNpGJ zdGs?sCo&vRd%owBN{66>{6Xdinj19ZyXSmv6+FVRpg$o@?6BAl?l~2f9l{R##m}7n zuvdnKCqd%iW=9Tg|0WBd0qnUq*`xfMA{hVF3Oz`Y&}R^LW-c%^fl>ZU%pX(?803|t z4oqwB*k7+NsASMk@89(JA%AxN0fuev7cTA1*!Id^O!B}t4yQjGPcSs;x3LM-7@9OZ z=w8Uk63@e{@FOXM;ULghj(rkR4j+zQ04pijarA>!#Pd1(`(A$LlzLtR)BDcFwBi3|wtWop4gCi;u{`7xI8ZA2L-PYy1jFf#wRRI3-_)Pq&*Imx z{ps&h?Ts7z{(f(M7~k`?l9BmF{*UDcW^d%bulm8@@b{Ao7I4RluIDspxZ8IB{^$7q z%7?}cf4Be5TKAJ}!~JbQq4U|*l{*+&ZhqrE(0ZO>k$w%({XjJjxaR}i|AR;2$Dwqf z`|W`4{~+n`0jQ)&zs5XMrtS@Ycb-gLPVZrJhW300zWWR^`xq^1m zyWUxR_7M!z4@iFKeHXjyz0AM7AYOB&=QfLf7qn^Ky}aAIU0%C^v)*oIvhlX<8Qz#F e2P9I`9q-0Hd(Hm59fiOI%i!ti=d#Wzp$P!RnKjM; literal 728 zcmeAS@N?(olHy`uVBq!ia0vp^^+4Rf!3HFiD!1KdU|^c>>EaktaqI1!y?MfpA`TCY z(>7Xrv21cZ%&p)es8PXjPgJF%k;PKT<4S-^gqo<(T*H$AZ*+7fE>+<>d&YLY$kXM; z=ia>edS1_Cl8Pq=%G6)^jeSD#K4zcO>z`{bou9UM-nz!)1@bePjT7b;$1R;=wruaM zC5^{7Fz_{mAK-ovc#~J;!HIef8^*Y4tp>Wwn}y38zCAwQP<`O>r(*U$THFu3ye^0?Pjk z*mb-r{232E>K8xo`Jz(9F6JX0_I9i#PygKC$$X@SKQ@;uDmRnJz#wC{4f?(cga zu20UYXRv&3`L|av?Mwc}bv*Lw|EBCOKXT(**~~3ik`6F2t>oIzc>Ce(H7ZX_R{~Qk NgQu&X%Q~loCICs?Scw1t diff --git a/mods/creative/textures/creative_prev_icon.png b/mods/creative/textures/creative_prev_icon.png index 4fa6f26f02b3a94404f9715008fdb74cd1787ea7..b26cd157f95aec853fce734574e5d319686b8399 100644 GIT binary patch literal 728 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV4Cmg;uunK>+N0tY+*-+wvXwz zGV{>pV?eWW(PFe13zpU}_uI~@{8;u``%wXt0z|TCv@W=53 ztRMJxFuiNkXH!Uj7SHg$kzbdg{D8B3-}@7a_p+b$H~Jso*ufG9bg|50?E~*-*6%X= zp{oh6V%o%>4{WH7l z+KFfIj_uWexoBz8%lvY1e!z>W-gU6xbp)te5*7FQ4;`@FuSbT0~ zesG4L&*4{?z7>OZv;DH)_5U<-S8qQZ_~60(<+)##!W(qOD`oz)FjP!bw_p(4_kbbd zN0ax0R{aXr4Ifz94;&JgVc?E0V9=>KsCwa$_#P&pH1mab=j|8n_P%~ddT!%xg0c8qq1w4R9hWi^tX~{&$kePP23tw zeX`cxZ>W6Da{BQG9yOK(U6%RbeTUyBcriqA%*$HKuiaYEC*D%Tv|*dj8Y31>#v1}n zJC7RZFi3YLX3l4f(>TR(pe@NFWB$b5%@Y{bh#r3WZow{V4z7mX%*+XfCJbWEc&QD$ zCG=cd75-&De5v@MmhqvY0RuYzFUG_yAk(D%K>V)u6JCc14zZH;J^%Usm@rf-MqJoy zR_9bc``1JH*@t)U|JE_EaktaqI0}-)!MPnbwcb zw_SX5=hmetmi-M=#U{7j=K8gEw_tf4^TMbjYj^K4xqkGHLx-pAuG4d#voGAT`{d65 zGmC@Mm?o)sVxp=^kD@Qcul;ISaHnqW^dLFDpA~Lyx2%5{7O>4>GJYWUBlX8&{(llX z816AoKT!T)^}}?ZKdc`Zf802Q~e|H1E;InS>+%&%SECLi;T$9~5h$-07_-Te1E`FTOu zzS3G;_Mh8_;9dWZ`%l_d+;7Rn^Uo&JTHNwywcP>39}C;xvs)~D82!%a@b){cVs@uv zUp#?w+VXdD^WHBKkNTlgzHl;#v;VGqy;J%2HBa?&KF#0y`d9RWxli@p&$4IAs@Cl> zNdF{W;(z4FwQt{&*MC=hI6dgu)@#+fmM5*bHGlbmZ2$j^x%;OWt={^NVcJ^eHT{Pl znSc4PUF^X0-p2)}rwi0YGw^S{w!8P!_9Oh&Mu+ZOG3OL9sG0w0ENyTF|N4Y>h;3$gG=JCJJq$JX>OL?T{CU8d@Z%u&fe+2%4G-D% z84lOq0t#MWE#UmK@V8XyVg4uv?Op4A|8xE^`?H31!=m4>zDV9(`>4G(#_e`|wa%Ge p=N`CfroP*)geCm|Q Date: Mon, 5 Mar 2018 21:45:45 +0000 Subject: [PATCH 100/195] Fireflies: Reduce density in non-mgv6 mapgens --- mods/fireflies/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/fireflies/init.lua b/mods/fireflies/init.lua index f879d8b7..31647efb 100644 --- a/mods/fireflies/init.lua +++ b/mods/fireflies/init.lua @@ -164,7 +164,7 @@ else }, place_offset_y = 2, sidelen = 80, - fill_ratio = 0.002, + fill_ratio = 0.0005, biomes = { "deciduous_forest", "coniferous_forest", @@ -186,7 +186,7 @@ else }, place_offset_y = 3, sidelen = 80, - fill_ratio = 0.002, + fill_ratio = 0.0005, biomes = { "deciduous_forest", "coniferous_forest", From ac50b3e3ce5183e1cc61ea7067d556c4afa35222 Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 26 Feb 2018 19:21:24 +0000 Subject: [PATCH 101/195] Icesheet biome: Add 'default:cave_ice' node to enable caves in land ice Has 'is_ground_content = true'. Drops 'default:ice'. --- mods/default/mapgen.lua | 2 +- mods/default/nodes.lua | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 0a1b41e6..5810bb6d 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -820,7 +820,7 @@ function default.register_biomes(upper_limit) depth_top = 1, node_filler = "default:snowblock", depth_filler = 3, - node_stone = "default:ice", + node_stone = "default:cave_ice", node_water_top = "default:ice", depth_water_top = 10, --node_water = "", diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index e037984e..0d19256d 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -65,6 +65,7 @@ default:snow default:snowblock default:ice +default:cave_ice Trees ----- @@ -574,6 +575,7 @@ minetest.register_node("default:snowblock", { end, }) +-- 'is ground content = false' to avoid tunnels in sea ice or ice rivers minetest.register_node("default:ice", { description = "Ice", tiles = {"default_ice.png"}, @@ -583,6 +585,16 @@ minetest.register_node("default:ice", { sounds = default.node_sound_glass_defaults(), }) +-- Mapgen-placed ice with 'is ground content = true' to contain tunnels +minetest.register_node("default:cave_ice", { + description = "Cave Ice", + tiles = {"default_ice.png"}, + paramtype = "light", + groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 3}, + drop = "default:ice", + sounds = default.node_sound_glass_defaults(), +}) + -- -- Trees -- From 160dc21bc14a9869fb1dcae30a2eed3f3112c004 Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 4 Mar 2018 19:47:06 +0000 Subject: [PATCH 102/195] Pine trees: Add small pine tree and mix into coniferous forests Use noises to create a varying mix in coniferous forest biomes: Areas of large pines only, areas of small pines only, mixed areas. While also having areas of high and low tree densities. Saplings grow into large or small pines with equal chance. --- mods/default/mapgen.lua | 30 ++++++++++++------ mods/default/schematics/small_pine_tree.mts | Bin 0 -> 173 bytes .../small_pine_tree_from_sapling.mts | Bin 0 -> 171 bytes .../snowy_small_pine_tree_from_sapling.mts | Bin 0 -> 202 bytes mods/default/trees.lua | 20 +++++++++--- 5 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 mods/default/schematics/small_pine_tree.mts create mode 100644 mods/default/schematics/small_pine_tree_from_sapling.mts create mode 100644 mods/default/schematics/snowy_small_pine_tree_from_sapling.mts diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 5810bb6d..f236f7b2 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1758,7 +1758,7 @@ function default.register_decorations() minetest.register_decoration({ deco_type = "schematic", place_on = {"default:dirt_with_rainforest_litter", "default:dirt"}, - sidelen = 16, + sidelen = 80, fill_ratio = 0.1, biomes = {"rainforest", "rainforest_swamp"}, y_max = 31000, @@ -1771,7 +1771,7 @@ function default.register_decorations() minetest.register_decoration({ deco_type = "schematic", place_on = {"default:dirt_with_rainforest_litter", "default:dirt"}, - sidelen = 16, + sidelen = 80, fill_ratio = 0.005, biomes = {"rainforest", "rainforest_swamp"}, y_max = 31000, @@ -1781,15 +1781,15 @@ function default.register_decorations() rotation = "random", }) - -- Taiga and temperate coniferous forest pine tree and log + -- Taiga and temperate coniferous forest pine tree, small pine tree and log minetest.register_decoration({ deco_type = "schematic", place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, sidelen = 16, noise_params = { - offset = 0.036, - scale = 0.022, + offset = 0.010, + scale = 0.048, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, @@ -1805,10 +1805,10 @@ function default.register_decorations() minetest.register_decoration({ deco_type = "schematic", place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, - sidelen = 80, + sidelen = 16, noise_params = { - offset = 0.0018, - scale = 0.0011, + offset = 0.010, + scale = -0.048, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, @@ -1816,6 +1816,18 @@ function default.register_decorations() }, biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, y_max = 31000, + y_min = 2, + schematic = minetest.get_modpath("default") .. "/schematics/small_pine_tree.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, + sidelen = 80, + fill_ratio = 0.0018, + biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, + y_max = 31000, y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/pine_log.mts", flags = "place_center_x", @@ -2039,7 +2051,7 @@ function default.register_decorations() minetest.register_decoration({ deco_type = "simple", place_on = {"default:dirt_with_rainforest_litter"}, - sidelen = 16, + sidelen = 80, fill_ratio = 0.1, biomes = {"rainforest"}, y_max = 31000, diff --git a/mods/default/schematics/small_pine_tree.mts b/mods/default/schematics/small_pine_tree.mts new file mode 100644 index 0000000000000000000000000000000000000000..1b27a84f88287b093a8d9b99ab7d4287b2d224e1 GIT binary patch literal 173 zcmeYb3HD`RVPIw8VPLJVx3{;ihX4j<2Ij=fA_kF^)U?FXoD!>o%)He2ywuc`oYZ0l zK@`!FqSVxiId20U`3@*>Fx#EGJhSJlu7}#JotIZ-R!!LE(qK|xzx*H9v`WKWdWEZ> z*G&ni(D=OkRzsHF-b+W5kM8^VWb6OaXHFF_E|bhl2|MR6^~mYz-W826)_jRQR($y3 P%i8)QHyHl;t8fAUJ_b#< literal 0 HcmV?d00001 diff --git a/mods/default/schematics/small_pine_tree_from_sapling.mts b/mods/default/schematics/small_pine_tree_from_sapling.mts new file mode 100644 index 0000000000000000000000000000000000000000..dc438a9d11e28503f53f2f17c120f422af4d46a2 GIT binary patch literal 171 zcmeYb3HD`RVPIw8VPLJVx3{;ihX4j<2Ij=fA_kF^)U?FXoD!>o%)He2ywuc`oYZ0l zK@`!FqSVxiId22s@---Mu*Ch5+bcH1a!H%s@2d|b&fR67tigND>iPPFdEx2PRsFus z@fQ-Fe)7vwwF$4Z*Qb1p*qDE>^6h^ni(fKV`Br4AJ^k`!SKw!^AhoK->ZyhIC)n(L M-!Eakqg0_206@k_!2kdN literal 0 HcmV?d00001 diff --git a/mods/default/schematics/snowy_small_pine_tree_from_sapling.mts b/mods/default/schematics/snowy_small_pine_tree_from_sapling.mts new file mode 100644 index 0000000000000000000000000000000000000000..76fe345b131df15ba2350e7236c8c048c9caa168 GIT binary patch literal 202 zcmeYb3HD`RVPIw8WnitZx3{l{0iYmrVrCJ8NJ?s2Vrfo^RY7K6YJ6U5YD!LOF#``w zv^X!noIw!A1FI=1N=>bp^LEljz6J#jS4X=!{_6vd%}7*UJ8xHBla*e&Ps5fCdV!Wn z7jGNsRYa_{zIJcL#o(hg8DFn2nQ|gv^R>>N)}B^Bo$Qdk_vSjzd$_v(z?of)=dXHi kJrQZS|J)Wi^Mds}&jfb%tX1Q5YTqjPXV*$u+r!#w07tY|UjP6A literal 0 HcmV?d00001 diff --git a/mods/default/trees.lua b/mods/default/trees.lua index c4403096..7f5556b2 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -411,8 +411,14 @@ end -- New pine tree function default.grow_new_pine_tree(pos) - local path = minetest.get_modpath("default") .. - "/schematics/pine_tree_from_sapling.mts" + local path + if math.random() > 0.5 then + path = minetest.get_modpath("default") .. + "/schematics/pine_tree_from_sapling.mts" + else + path = minetest.get_modpath("default") .. + "/schematics/small_pine_tree_from_sapling.mts" + end minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, path, "0", nil, false) end @@ -421,8 +427,14 @@ end -- New snowy pine tree function default.grow_new_snowy_pine_tree(pos) - local path = minetest.get_modpath("default") .. - "/schematics/snowy_pine_tree_from_sapling.mts" + local path + if math.random() > 0.5 then + path = minetest.get_modpath("default") .. + "/schematics/snowy_pine_tree_from_sapling.mts" + else + path = minetest.get_modpath("default") .. + "/schematics/snowy_small_pine_tree_from_sapling.mts" + end minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, path, "random", nil, false) end From da877ccf579e1e22c11d9fb26ee715a8fa032dd7 Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 13 Mar 2018 20:00:29 +0000 Subject: [PATCH 103/195] Rename 'subgame' to 'game' --- README.txt | 6 +++--- game_api.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.txt b/README.txt index 2964ae2c..04f3d43a 100644 --- a/README.txt +++ b/README.txt @@ -1,9 +1,9 @@ Minetest Game [minetest_game] ============================= -The main subgame for the Minetest engine -======================================== +The main game for the Minetest engine +===================================== -To use this subgame with the Minetest engine, insert this repository as +To use this game with the Minetest engine, insert this repository as /games/minetest_game The Minetest engine can be found in: diff --git a/game_api.txt b/game_api.txt index bf342674..1ef26792 100644 --- a/game_api.txt +++ b/game_api.txt @@ -5,7 +5,7 @@ GitHub Repo: https://github.com/minetest/minetest_game Introduction ------------ -The Minetest Game subgame offers multiple new possibilities in addition to the Minetest engine's built-in API, +The Minetest Game game offers multiple new possibilities in addition to the Minetest engine's built-in API, allowing you to add new plants to farming mod, buckets for new liquids, new stairs and custom panes. For information on the Minetest API, visit https://github.com/minetest/minetest/blob/master/doc/lua_api.txt Please note: From c2209c120ea3f31cd56f9ea298a7c01fa2f9dd7f Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 13 Mar 2018 20:02:18 +0000 Subject: [PATCH 104/195] Add new pine needles texture by Splizard --- mods/default/README.txt | 4 +--- mods/default/textures/default_pine_needles.png | Bin 391 -> 766 bytes 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index cd4e768c..1c5e9e35 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -23,9 +23,6 @@ Cisoun's texture pack (CC BY-SA 3.0): default_tree_top.png default_water.png -Cisoun's conifers mod (CC BY-SA 3.0): - default_pine_needles.png - Originating from G4JC's Almost MC Texture Pack (CC BY-SA 3.0): default_torch.png default_torch_on_ceiling.png @@ -69,6 +66,7 @@ InfinityProject (CC BY-SA 3.0): Splizard (CC BY-SA 3.0): default_pine_sapling.png + default_pine_needles.png Zeg9 (CC BY-SA 3.0): default_coal_block.png diff --git a/mods/default/textures/default_pine_needles.png b/mods/default/textures/default_pine_needles.png index ad7373b0398f1c778b5a1e9e7ea8cfc7726f221c..f6997271012a7d38ade189ff58584193443dc3bb 100644 GIT binary patch delta 743 zcmV=1O5e&BYy(LNkl+in_H6oBD>?KvNqVE|){l%$E2#PUTh`u?v_ zsZwuRtE#QKiH!>w2IjyV_Uc8y2l#}aXS!}1euNRXtDM0quVq8IZ@6A0Y@SMyiKhT- zb>-N0F!eQ#J$4UAG1LS5lW@15a;`i6{AEMg_RPf<&o!*F2!HhrI#`<2sOFwFqvddH zi9-(qu$(H}x0-EzAxmJLMr5JKKV?JqZlcR5z`XVB`+;;4pf4?5H*#`SO^|w+<$}>F zpI15M#c;TE*uvMFwq^TpkggxGj>FgMoW&%>j!Hg@ND?36LxN`v-qhEo9guy;)#oXj zZ3S;5AHU6c*ngejsli$LjDdsmyy4TFGZ1ZFNz&n3MoMFy^G;N`-_0Xg<^*i@3nK0Gx{ zT^HdtQ@`xF{yIkh1x|mw%3%>J3IOTxLU$DtiebG>xqpA$;~hKt+{fSu<1)l?gzkCA z?$A)RfNPlbBGN&BOkTNsNQ&H;v@pL>H7m07@Yre}N^rgB`lo7Ppf}<2lKwYf%b$V~)GL186XmR;WNaKvB z*Js?$SJ2R6dS?H~=VrIbW75zr%~6V1GuTSZn%ipgYY*7q@6Gi8KeF)3x|*@>BJ>_v zSeR(nt`hXVbfJDI4U7$*OU1=FX`HiRM174fLNloSfcAwjvBC2nu%Gl14EWmO00000 LNkvXXu0mjf>ei?B From c0557b2c231cbcc7837031544558283bab929bda Mon Sep 17 00:00:00 2001 From: Ezhh Date: Sun, 18 Mar 2018 00:25:16 +0000 Subject: [PATCH 105/195] Add names for register_decoration --- mods/default/mapgen.lua | 29 +++++++++++++++++++++++++++++ mods/fireflies/init.lua | 4 ++++ mods/flowers/mapgen.lua | 22 ++++++++++++++-------- 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index f236f7b2..0ca7d02f 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1534,6 +1534,7 @@ function default.register_mgv6_decorations() -- Papyrus minetest.register_decoration({ + name = "default:papyrus", deco_type = "simple", place_on = {"default:dirt_with_grass"}, sidelen = 16, @@ -1557,6 +1558,7 @@ function default.register_mgv6_decorations() -- Cacti minetest.register_decoration({ + name = "default:cactus", deco_type = "simple", place_on = {"default:desert_sand"}, sidelen = 16, @@ -1579,6 +1581,7 @@ function default.register_mgv6_decorations() for length = 1, 5 do minetest.register_decoration({ + name = "default:grass_"..length, deco_type = "simple", place_on = {"default:dirt_with_grass"}, sidelen = 16, @@ -1599,6 +1602,7 @@ function default.register_mgv6_decorations() -- Dry shrubs minetest.register_decoration({ + name = "default:dry_shrub", deco_type = "simple", place_on = {"default:desert_sand", "default:dirt_with_snow"}, sidelen = 16, @@ -1622,6 +1626,7 @@ end local function register_grass_decoration(offset, scale, length) minetest.register_decoration({ + name = "default:grass_" .. length, deco_type = "simple", place_on = {"default:dirt_with_grass"}, sidelen = 16, @@ -1642,6 +1647,7 @@ end local function register_dry_grass_decoration(offset, scale, length) minetest.register_decoration({ + name = "default:dry_grass_" .. length, deco_type = "simple", place_on = {"default:dirt_with_dry_grass"}, sidelen = 16, @@ -1662,6 +1668,7 @@ end local function register_fern_decoration(seed, length) minetest.register_decoration({ + name = "default:fern_" .. length, deco_type = "simple", place_on = {"default:dirt_with_coniferous_litter"}, sidelen = 16, @@ -1686,6 +1693,7 @@ function default.register_decorations() -- Apple tree and log minetest.register_decoration({ + name = "default:apple_tree", deco_type = "schematic", place_on = {"default:dirt_with_grass"}, sidelen = 16, @@ -1706,6 +1714,7 @@ function default.register_decorations() }) minetest.register_decoration({ + name = "default:apple_log", deco_type = "schematic", place_on = {"default:dirt_with_grass"}, sidelen = 16, @@ -1731,6 +1740,7 @@ function default.register_decorations() local chunksize = tonumber(minetest.get_mapgen_setting("chunksize")) if chunksize >= 5 then minetest.register_decoration({ + name = "default:emergent_jungle_tree", deco_type = "schematic", place_on = {"default:dirt_with_rainforest_litter"}, sidelen = 80, @@ -1756,6 +1766,7 @@ function default.register_decorations() -- Jungle tree and log minetest.register_decoration({ + name = "default:jungle_tree", deco_type = "schematic", place_on = {"default:dirt_with_rainforest_litter", "default:dirt"}, sidelen = 80, @@ -1769,6 +1780,7 @@ function default.register_decorations() }) minetest.register_decoration({ + name = "default:jungle_log", deco_type = "schematic", place_on = {"default:dirt_with_rainforest_litter", "default:dirt"}, sidelen = 80, @@ -1784,6 +1796,7 @@ function default.register_decorations() -- Taiga and temperate coniferous forest pine tree, small pine tree and log minetest.register_decoration({ + name = "default:pine_tree", deco_type = "schematic", place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, sidelen = 16, @@ -1803,6 +1816,7 @@ function default.register_decorations() }) minetest.register_decoration({ + name = "default:small_pine_tree", deco_type = "schematic", place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, sidelen = 16, @@ -1822,6 +1836,7 @@ function default.register_decorations() }) minetest.register_decoration({ + name = "default:pine_log", deco_type = "schematic", place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, sidelen = 80, @@ -1837,6 +1852,7 @@ function default.register_decorations() -- Acacia tree and log minetest.register_decoration({ + name = "default:acacia_tree", deco_type = "schematic", place_on = {"default:dirt_with_dry_grass"}, sidelen = 16, @@ -1857,6 +1873,7 @@ function default.register_decorations() }) minetest.register_decoration({ + name = "default:acacia_log", deco_type = "schematic", place_on = {"default:dirt_with_dry_grass"}, sidelen = 16, @@ -1879,6 +1896,7 @@ function default.register_decorations() -- Aspen tree and log minetest.register_decoration({ + name = "default:aspen_tree", deco_type = "schematic", place_on = {"default:dirt_with_grass"}, sidelen = 16, @@ -1898,6 +1916,7 @@ function default.register_decorations() }) minetest.register_decoration({ + name = "default:aspen_log", deco_type = "schematic", place_on = {"default:dirt_with_grass"}, sidelen = 16, @@ -1920,6 +1939,7 @@ function default.register_decorations() -- Large cactus minetest.register_decoration({ + name = "default:large_cactus", deco_type = "schematic", place_on = {"default:desert_sand"}, sidelen = 16, @@ -1942,6 +1962,7 @@ function default.register_decorations() -- Cactus minetest.register_decoration({ + name = "default:cactus", deco_type = "simple", place_on = {"default:desert_sand"}, sidelen = 16, @@ -1964,6 +1985,7 @@ function default.register_decorations() -- Papyrus minetest.register_decoration({ + name = "default:papyrus", deco_type = "schematic", place_on = {"default:dirt"}, sidelen = 16, @@ -1984,6 +2006,7 @@ function default.register_decorations() -- Bush minetest.register_decoration({ + name = "default:bush", deco_type = "schematic", place_on = {"default:dirt_with_grass", "default:dirt_with_snow"}, sidelen = 16, @@ -2006,6 +2029,7 @@ function default.register_decorations() -- Acacia bush minetest.register_decoration({ + name = "default:acacia_bush", deco_type = "schematic", place_on = {"default:dirt_with_dry_grass"}, sidelen = 16, @@ -2049,6 +2073,7 @@ function default.register_decorations() -- Junglegrass minetest.register_decoration({ + name = "default:junglegrass", deco_type = "simple", place_on = {"default:dirt_with_rainforest_litter"}, sidelen = 80, @@ -2062,6 +2087,7 @@ function default.register_decorations() -- Dry shrub minetest.register_decoration({ + name = "default:dry_shrub", deco_type = "simple", place_on = {"default:desert_sand", "default:sand", "default:silver_sand"}, @@ -2084,6 +2110,7 @@ function default.register_decorations() -- Marram grass minetest.register_decoration({ + name = "default:marram_grass", deco_type = "simple", place_on = {"default:sand"}, sidelen = 4, @@ -2109,6 +2136,7 @@ function default.register_decorations() -- Coral reef minetest.register_decoration({ + name = "default:corals", deco_type = "schematic", place_on = {"default:sand"}, noise_params = { @@ -2134,6 +2162,7 @@ function default.register_decorations() -- Kelp minetest.register_decoration({ + name = "default:kelp", deco_type = "simple", place_on = {"default:sand"}, place_offset_y = -1, diff --git a/mods/fireflies/init.lua b/mods/fireflies/init.lua index 31647efb..104b5cdb 100644 --- a/mods/fireflies/init.lua +++ b/mods/fireflies/init.lua @@ -131,6 +131,7 @@ minetest.register_craft( { if minetest.get_mapgen_setting("mg_name") == "v6" then minetest.register_decoration({ + name = "fireflies:firefly_low", deco_type = "simple", place_on = "default:dirt_with_grass", place_offset_y = 2, @@ -142,6 +143,7 @@ if minetest.get_mapgen_setting("mg_name") == "v6" then }) minetest.register_decoration({ + name = "fireflies:firefly_high", deco_type = "simple", place_on = "default:dirt_with_grass", place_offset_y = 3, @@ -155,6 +157,7 @@ if minetest.get_mapgen_setting("mg_name") == "v6" then else minetest.register_decoration({ + name = "fireflies:firefly_low", deco_type = "simple", place_on = { "default:dirt_with_grass", @@ -177,6 +180,7 @@ else }) minetest.register_decoration({ + name = "fireflies:firefly_high", deco_type = "simple", place_on = { "default:dirt_with_grass", diff --git a/mods/flowers/mapgen.lua b/mods/flowers/mapgen.lua index 5e81925b..ad759c25 100644 --- a/mods/flowers/mapgen.lua +++ b/mods/flowers/mapgen.lua @@ -2,8 +2,9 @@ -- Mgv6 -- -local function register_mgv6_flower(name) +local function register_mgv6_flower(flower_name) minetest.register_decoration({ + name = "flowers:"..flower_name, deco_type = "simple", place_on = {"default:dirt_with_grass"}, sidelen = 16, @@ -17,12 +18,13 @@ local function register_mgv6_flower(name) }, y_max = 30, y_min = 1, - decoration = "flowers:"..name, + decoration = "flowers:"..flower_name, }) end -local function register_mgv6_mushroom(name) +local function register_mgv6_mushroom(mushroom_name) minetest.register_decoration({ + name = "flowers:"..mushroom_name, deco_type = "simple", place_on = {"default:dirt_with_grass"}, sidelen = 16, @@ -36,7 +38,7 @@ local function register_mgv6_mushroom(name) }, y_max = 30, y_min = 1, - decoration = "flowers:"..name, + decoration = "flowers:"..mushroom_name, spawn_by = "default:tree", num_spawn_by = 1, }) @@ -44,6 +46,7 @@ end local function register_mgv6_waterlily() minetest.register_decoration({ + name = "flowers:waterlily", deco_type = "simple", place_on = {"default:dirt"}, sidelen = 16, @@ -83,8 +86,9 @@ end -- All other biome API mapgens -- -local function register_flower(seed, name) +local function register_flower(seed, flower_name) minetest.register_decoration({ + name = "flowers:"..flower_name, deco_type = "simple", place_on = {"default:dirt_with_grass"}, sidelen = 16, @@ -99,12 +103,13 @@ local function register_flower(seed, name) biomes = {"grassland", "deciduous_forest", "floatland_grassland"}, y_max = 31000, y_min = 1, - decoration = "flowers:"..name, + decoration = "flowers:"..flower_name, }) end -local function register_mushroom(name) +local function register_mushroom(mushroom_name) minetest.register_decoration({ + name = "flowers:"..mushroom_name, deco_type = "simple", place_on = {"default:dirt_with_grass", "default:dirt_with_coniferous_litter"}, sidelen = 16, @@ -120,12 +125,13 @@ local function register_mushroom(name) "floatland_coniferous_forest"}, y_max = 31000, y_min = 1, - decoration = "flowers:"..name, + decoration = "flowers:"..mushroom_name, }) end local function register_waterlily() minetest.register_decoration({ + name = "default:waterlily", deco_type = "simple", place_on = {"default:dirt"}, sidelen = 16, From 465d8cae3e2b202b61542bdbb68f600bf35df535 Mon Sep 17 00:00:00 2001 From: Ezhh Date: Thu, 22 Mar 2018 20:33:54 +0000 Subject: [PATCH 106/195] Hide fireflies during day time --- mods/fireflies/init.lua | 83 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/mods/fireflies/init.lua b/mods/fireflies/init.lua index 104b5cdb..8f888cef 100644 --- a/mods/fireflies/init.lua +++ b/mods/fireflies/init.lua @@ -27,6 +27,59 @@ minetest.register_node("fireflies:firefly", { floodable = true, on_flood = function(pos, oldnode, newnode) minetest.add_item(pos, "fireflies:firefly 1") + end, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "fireflies:firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "fireflies:hidden_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("fireflies:hidden_firefly", { + description = "Hidden Firefly", + drawtype = "airlike", + inventory_image = "fireflies_firefly.png", + wield_image = "fireflies_firefly.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "fireflies:hidden_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "fireflies:firefly"}) + end + minetest.get_node_timer(pos):start(30) end }) @@ -112,6 +165,7 @@ minetest.register_node("fireflies:firefly_bottle", { if firefly_pos then minetest.set_node(pos, {name = "vessels:glass_bottle"}) minetest.set_node(firefly_pos, {name = "fireflies:firefly"}) + minetest.get_node_timer(firefly_pos):start(1) end end }) @@ -203,3 +257,32 @@ else }) end + + +-- get decoration IDs +local firefly_low = minetest.get_decoration_id("fireflies:firefly_low") +local firefly_high = minetest.get_decoration_id("fireflies:firefly_high") + +minetest.set_gen_notify({decoration = true}, {firefly_low, firefly_high}) + +-- start nodetimers +minetest.register_on_generated(function(minp, maxp, blockseed) + local gennotify = minetest.get_mapgen_object("gennotify") + local poslist = {} + + for _, pos in ipairs(gennotify["decoration#"..firefly_low] or {}) do + local firefly_low_pos = {x = pos.x, y = pos.y + 3, z = pos.z} + table.insert(poslist, firefly_low_pos) + end + for _, pos in ipairs(gennotify["decoration#"..firefly_high] or {}) do + local firefly_high_pos = {x = pos.x, y = pos.y + 4, z = pos.z} + table.insert(poslist, firefly_high_pos) + end + + if #poslist ~= 0 then + for i = 1, #poslist do + local pos = poslist[i] + minetest.get_node_timer(pos):start(1) + end + end +end) From fb0217042bd8d774a4d57f816db864654e65ad25 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Sun, 25 Mar 2018 13:47:20 +0200 Subject: [PATCH 107/195] Fix creative mode check in fireflies mod --- mods/fireflies/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/fireflies/init.lua b/mods/fireflies/init.lua index 8f888cef..6282636c 100644 --- a/mods/fireflies/init.lua +++ b/mods/fireflies/init.lua @@ -103,7 +103,7 @@ minetest.register_tool("fireflies:bug_net", { minetest.add_item(pointed_thing.under, node_name.." 1") end end - if not minetest.setting_getbool("creative_mode") then + if not creative.is_enabled_for(player:get_player_name()) then itemstack:add_wear(256) return itemstack end From 7e9000b502af6ff502d219901779911a0221fa12 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Sun, 25 Mar 2018 14:05:25 +0200 Subject: [PATCH 108/195] Fix creative mode check again --- mods/fireflies/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/fireflies/init.lua b/mods/fireflies/init.lua index 6282636c..47ad373f 100644 --- a/mods/fireflies/init.lua +++ b/mods/fireflies/init.lua @@ -103,7 +103,7 @@ minetest.register_tool("fireflies:bug_net", { minetest.add_item(pointed_thing.under, node_name.." 1") end end - if not creative.is_enabled_for(player:get_player_name()) then + if not (creative and creative.is_enabled_for(player:get_player_name())) then itemstack:add_wear(256) return itemstack end From f3ce25fc7240eadcd75a757e1acb08b545415918 Mon Sep 17 00:00:00 2001 From: Paramat Date: Wed, 28 Mar 2018 12:09:44 +0100 Subject: [PATCH 109/195] Xpanes: Description 'Iron Bar' -> 'Steel Bars' --- mods/xpanes/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/xpanes/init.lua b/mods/xpanes/init.lua index c0a91c7b..653c8cd9 100644 --- a/mods/xpanes/init.lua +++ b/mods/xpanes/init.lua @@ -174,7 +174,7 @@ xpanes.register_pane("obsidian_pane", { }) xpanes.register_pane("bar", { - description = "Iron Bar", + description = "Steel Bars", textures = {"xpanes_bar.png","xpanes_bar.png","xpanes_bar_top.png"}, inventory_image = "xpanes_bar.png", wield_image = "xpanes_bar.png", From b0e55c52c827c44770bd2575a8293544e02d5e48 Mon Sep 17 00:00:00 2001 From: Andrew Ward Date: Wed, 28 Mar 2018 18:28:26 +0100 Subject: [PATCH 110/195] Add formspec theming, remove sfinv's dependency on default --- game_api.txt | 9 ++++++--- mods/default/init.lua | 13 ++++++++++--- mods/sfinv/README.md | 2 ++ mods/sfinv/api.lua | 6 +----- mods/sfinv/depends.txt | 1 - 5 files changed, 19 insertions(+), 12 deletions(-) delete mode 100644 mods/sfinv/depends.txt diff --git a/game_api.txt b/game_api.txt index 1ef26792..86938f26 100644 --- a/game_api.txt +++ b/game_api.txt @@ -548,6 +548,9 @@ set a players home position and teleport a player to home position. Sfinv API --------- +It is recommended that you read this link for a good introduction to the +sfinv API by its author: https://rubenwardy.com/minetest_modding_book/en/chapters/sfinv.html + ### sfinv Methods **Pages** @@ -752,15 +755,15 @@ GUI and formspecs `default.gui_bg` - * Background color formspec element + * Deprecated, remove from mods. `default.gui_bg_img` - * Image overlay formspec element for the background to use in formspecs + * Deprecated, remove from mods. `default.gui_slots` - * `listcolors` formspec element that is used to format the slots in formspecs + * Deprecated, remove from mods. `default.gui_survival_form` diff --git a/mods/default/init.lua b/mods/default/init.lua index 2d5a9bd2..5fef4be8 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -9,9 +9,16 @@ default = {} default.LIGHT_MAX = 14 -- GUI related stuff -default.gui_bg = "bgcolor[#080808BB;true]" -default.gui_bg_img = "background[5,5;1,1;gui_formbg.png;true]" -default.gui_slots = "listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" +default.gui_bg = "" +default.gui_bg_img = "" +default.gui_slots = "" + +minetest.register_on_joinplayer(function(player) + player:set_formspec_prepend([[ + bgcolor[#080808BB;true] + background[5,5;1,1;gui_formbg.png;true] + listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] ]]) +end) function default.get_hotbar_bg(x,y) local out = "" diff --git a/mods/sfinv/README.md b/mods/sfinv/README.md index 6ff33923..0b152a0e 100644 --- a/mods/sfinv/README.md +++ b/mods/sfinv/README.md @@ -5,6 +5,8 @@ Simple Fast Inventory A cleaner, simpler, solution to having an advanced inventory in Minetest. +Available for use outside of MTG here: + Written by rubenwardy. License: MIT diff --git a/mods/sfinv/api.lua b/mods/sfinv/api.lua index fdb652b8..b9ddb39b 100644 --- a/mods/sfinv/api.lua +++ b/mods/sfinv/api.lua @@ -36,10 +36,7 @@ function sfinv.get_nav_fs(player, context, nav, current_idx) end end -local theme_main = "bgcolor[#080808BB;true]" .. default.gui_bg .. - default.gui_bg_img - -local theme_inv = default.gui_slots .. [[ +local theme_inv = [[ list[current_player;main;0,4.7;8,1;] list[current_player;main;0,5.85;8,3;8] ]] @@ -47,7 +44,6 @@ local theme_inv = default.gui_slots .. [[ function sfinv.make_formspec(player, context, content, show_inv, size) local tmp = { size or "size[8,8.6]", - theme_main, sfinv.get_nav_fs(player, context, context.nav_titles, context.nav_idx), content } diff --git a/mods/sfinv/depends.txt b/mods/sfinv/depends.txt deleted file mode 100644 index 4ad96d51..00000000 --- a/mods/sfinv/depends.txt +++ /dev/null @@ -1 +0,0 @@ -default From 11b34076719ded242e73465ba0c63d1d790b5761 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Wed, 4 Apr 2018 09:59:15 +0100 Subject: [PATCH 111/195] Add food_* groups to default edibles (#2089) --- mods/default/nodes.lua | 2 +- mods/farming/api.lua | 2 +- mods/farming/init.lua | 6 +++--- mods/flowers/init.lua | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 0d19256d..77bccb28 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -699,7 +699,7 @@ minetest.register_node("default:apple", { fixed = {-3 / 16, -7 / 16, -3 / 16, 3 / 16, 4 / 16, 3 / 16} }, groups = {fleshy = 3, dig_immediate = 3, flammable = 2, - leafdecay = 3, leafdecay_drop = 1}, + leafdecay = 3, leafdecay_drop = 1, food_apple = 1}, on_use = minetest.item_eat(2), sounds = default.node_sound_leaves_defaults(), diff --git a/mods/farming/api.lua b/mods/farming/api.lua index 1c63ee34..0f8e6816 100644 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -330,7 +330,7 @@ farming.register_plant = function(name, def) minetest.register_craftitem(":" .. mname .. ":" .. pname, { description = pname:gsub("^%l", string.upper), inventory_image = mname .. "_" .. pname .. ".png", - groups = {flammable = 2}, + groups = def.groups or {flammable = 2}, }) -- Register growing steps diff --git a/mods/farming/init.lua b/mods/farming/init.lua index fff48fa5..723201de 100644 --- a/mods/farming/init.lua +++ b/mods/farming/init.lua @@ -21,21 +21,21 @@ farming.register_plant("farming:wheat", { minlight = 13, maxlight = default.LIGHT_MAX, fertility = {"grassland"}, - groups = {flammable = 4}, + groups = {food_wheat = 1, flammable = 4}, place_param2 = 3, }) minetest.register_craftitem("farming:flour", { description = "Flour", inventory_image = "farming_flour.png", - groups = {flammable = 1}, + groups = {food_flour = 1, flammable = 1}, }) minetest.register_craftitem("farming:bread", { description = "Bread", inventory_image = "farming_bread.png", on_use = minetest.item_eat(5), - groups = {flammable = 2}, + groups = {food_bread = 1, flammable = 2}, }) minetest.register_craft({ diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index f2affb99..2afb5a01 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -212,7 +212,7 @@ minetest.register_node("flowers:mushroom_brown", { sunlight_propagates = true, walkable = false, buildable_to = true, - groups = {snappy = 3, attached_node = 1, flammable = 1}, + groups = {food_mushroom = 1, snappy = 3, attached_node = 1, flammable = 1}, sounds = default.node_sound_leaves_defaults(), on_use = minetest.item_eat(1), selection_box = { From 9c459e77ac943f10c74de3bdd420e07a2b8bb56f Mon Sep 17 00:00:00 2001 From: Paramat Date: Sun, 8 Apr 2018 17:55:19 +0100 Subject: [PATCH 112/195] Farming: Deprecate bronze, mese and diamond hoes. Tune steel uses (#2103) Remove unnecessary "air" fallback recipe for hoes to avoid this showing in crafting guides. --- mods/farming/api.lua | 11 ++--------- mods/farming/hoes.lua | 13 +++++++++---- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/mods/farming/api.lua b/mods/farming/api.lua index 0f8e6816..1c613a6f 100644 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -83,13 +83,6 @@ farming.register_hoe = function(name, def) if def.inventory_image == nil then def.inventory_image = "unknown_item.png" end - if def.recipe == nil then - def.recipe = { - {"air","air",""}, - {"","group:stick",""}, - {"","group:stick",""} - } - end if def.max_uses == nil then def.max_uses = 30 end @@ -104,12 +97,12 @@ farming.register_hoe = function(name, def) sound = {breaks = "default_tool_breaks"}, }) -- Register its recipe - if def.material == nil then + if def.recipe then minetest.register_craft({ output = name:sub(2), recipe = def.recipe }) - else + elseif def.material then minetest.register_craft({ output = name:sub(2), recipe = { diff --git a/mods/farming/hoes.lua b/mods/farming/hoes.lua index 5aae3903..d6a65650 100644 --- a/mods/farming/hoes.lua +++ b/mods/farming/hoes.lua @@ -16,27 +16,32 @@ farming.register_hoe(":farming:hoe_stone", { farming.register_hoe(":farming:hoe_steel", { description = "Steel Hoe", inventory_image = "farming_tool_steelhoe.png", - max_uses = 200, + max_uses = 500, material = "default:steel_ingot" }) +-- The following are deprecated by removing the 'material' field to prevent +-- crafting and removing from creative inventory, to cause them to eventually +-- disappear from worlds. The registrations should be removed in a future +-- release. + farming.register_hoe(":farming:hoe_bronze", { description = "Bronze Hoe", inventory_image = "farming_tool_bronzehoe.png", max_uses = 220, - material = "default:bronze_ingot" + groups = {not_in_creative_inventory = 1}, }) farming.register_hoe(":farming:hoe_mese", { description = "Mese Hoe", inventory_image = "farming_tool_mesehoe.png", max_uses = 350, - material = "default:mese_crystal" + groups = {not_in_creative_inventory = 1}, }) farming.register_hoe(":farming:hoe_diamond", { description = "Diamond Hoe", inventory_image = "farming_tool_diamondhoe.png", max_uses = 500, - material = "default:diamond" + groups = {not_in_creative_inventory = 1}, }) From 8c71f3d82604b36a17edd40bb2c0274004d92ca3 Mon Sep 17 00:00:00 2001 From: sofar Date: Sun, 8 Apr 2018 09:57:00 -0700 Subject: [PATCH 113/195] Prevent divide by zero (#2106) This forces all explosions to damage entities within the 1 node range. If that needs to be disabled, the damage_radius needs to be set to 0. --- mods/tnt/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 133431c7..2f9ccc5a 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -401,7 +401,7 @@ function tnt.boom(pos, def) local drops, radius = tnt_explode(pos, def.radius, def.ignore_protection, def.ignore_on_blast, owner, def.explode_center) -- append entity drops - local damage_radius = (radius / def.radius) * def.damage_radius + local damage_radius = (radius / math.max(1, def.radius)) * def.damage_radius entity_physics(pos, damage_radius, drops) if not def.disable_drops then eject_drops(drops, pos, radius) From 8d8f2f79d02ff4cd2a03b67ae19ab23b9a566c41 Mon Sep 17 00:00:00 2001 From: Paramat Date: Thu, 12 Apr 2018 00:51:56 +0100 Subject: [PATCH 114/195] Ore distribution: Deeper iron, diamond and mese block, tune gold (#2107) Iron at y = 0 was far too easy to find. Adjust gold lower region to be twice the depth of highest level, like all other ores. Diamond at y = -500 was too easy to progress to. Make diamond and mese block deeper to create a depth progression from mese crystal to diamond, to reflect tool progression. This all creates a satisfying 2^n depth progression, with lower regions being at twice the depth of highest levels. --- mods/default/mapgen.lua | 80 ++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 0ca7d02f..96bfd2d7 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -576,7 +576,7 @@ function default.register_ores() clust_scarcity = 7 * 7 * 7, clust_num_ores = 5, clust_size = 3, - y_max = 0, + y_max = -64, y_min = -127, }) @@ -682,7 +682,7 @@ function default.register_ores() clust_num_ores = 3, clust_size = 2, y_max = -256, - y_min = -1023, + y_min = -511, }) minetest.register_ore({ @@ -692,42 +692,7 @@ function default.register_ores() clust_scarcity = 13 * 13 * 13, clust_num_ores = 5, clust_size = 3, - y_max = -1024, - y_min = -31000, - }) - - -- Diamond - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_diamond", - wherein = "default:stone", - clust_scarcity = 15 * 15 * 15, - clust_num_ores = 4, - clust_size = 3, - y_max = 31000, - y_min = 1025, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_diamond", - wherein = "default:stone", - clust_scarcity = 17 * 17 * 17, - clust_num_ores = 4, - clust_size = 3, y_max = -512, - y_min = -1023, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_diamond", - wherein = "default:stone", - clust_scarcity = 15 * 15 * 15, - clust_num_ores = 4, - clust_size = 3, - y_max = -1024, y_min = -31000, }) @@ -766,6 +731,41 @@ function default.register_ores() y_min = -31000, }) + -- Diamond + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 4, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 17 * 17 * 17, + clust_num_ores = 4, + clust_size = 3, + y_max = -1024, + y_min = -2047, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 4, + clust_size = 3, + y_max = -2048, + y_min = -31000, + }) + -- Mese block minetest.register_ore({ @@ -786,8 +786,8 @@ function default.register_ores() clust_scarcity = 36 * 36 * 36, clust_num_ores = 3, clust_size = 2, - y_max = -1024, - y_min = -2047, + y_max = -2048, + y_min = -4095, }) minetest.register_ore({ @@ -797,7 +797,7 @@ function default.register_ores() clust_scarcity = 28 * 28 * 28, clust_num_ores = 5, clust_size = 3, - y_max = -2048, + y_max = -4096, y_min = -31000, }) end From 0b025e63928913b8b9406c311bcee9c988508c75 Mon Sep 17 00:00:00 2001 From: Paramat Date: Fri, 13 Apr 2018 02:21:43 +0100 Subject: [PATCH 115/195] Add 'spawn' mod to spawn new players in suitable starting biomes (#2091) Disabled in mgv6 and singlenode mapgens, by setting, or if 'static_spawnpoint' is set. Cleanup format of minetest.conf.example. --- minetest.conf.example | 44 +++++++++------ mods/spawn/README.txt | 7 +++ mods/spawn/depends.txt | 1 + mods/spawn/init.lua | 124 +++++++++++++++++++++++++++++++++++++++++ mods/spawn/license.txt | 24 ++++++++ settingtypes.txt | 4 ++ 6 files changed, 187 insertions(+), 17 deletions(-) create mode 100644 mods/spawn/README.txt create mode 100644 mods/spawn/depends.txt create mode 100644 mods/spawn/init.lua create mode 100644 mods/spawn/license.txt diff --git a/minetest.conf.example b/minetest.conf.example index 9393b1a5..672709d3 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -1,18 +1,21 @@ -# This file contains settings of Minetest Game that can be changed in minetest.conf +# This file contains settings of Minetest Game that can be changed in +# minetest.conf. # By default, all the settings are commented and not functional. # Uncomment settings by removing the preceding #. -# Whether creative mode (fast digging of all blocks, unlimited resources) should be enabled +# Whether creative mode (fast digging of all blocks, unlimited resources) should +# be enabled. #creative_mode = false # Sets the behaviour of the inventory items when a player dies. -# "bones": Store all items inside a bone node but drop items if inside protected area -# "drop": Drop all items on the ground -# "keep": Player keeps all items +# "bones": Store items in a bone node but drop items if inside protected area. +# "drop": Drop items on the ground. +# "keep": Player keeps items. #bones_mode = "bones" -# The time in seconds after which the bones of a dead player can be looted by everyone -# 0 to disable +# The time in seconds after which the bones of a dead player can be looted by +# everyone. +# 0 to disable. #share_bones_time = 1200 # How much earlier the bones of a dead player can be looted by @@ -20,8 +23,9 @@ # 0 to disable. By default it is "share_bones_time" divide by four. #share_bones_time_early = 300 -# Whether fire should be enabled. If disabled, 'basic flame' nodes will disappear. -# 'permanent flame' nodes will remain with either setting. +# Whether fire should be enabled. If disabled, 'basic_flame' nodes will +# disappear. +# 'permanent_flame' nodes will remain with either setting. #enable_fire = true # Enable flame sound. @@ -30,24 +34,30 @@ # Whether lavacooling should be enabled. #enable_lavacooling = true -# Whether the stuff in initial_stuff should be given to new players +# Whether the stuff in initial_stuff should be given to new players. #give_initial_stuff = false -#initial_stuff = default:pick_steel,default:axe_steel,default:shovel_steel,default:torch 99,default:cobble 99 +#initial_stuff = default:pick_steel,default:axe_steel,default:shovel_steel, +default:torch 99,default:cobble 99 -# Whether the TNT mod should be enabled +# Whether the TNT mod should be enabled. #enable_tnt = -# The radius of a TNT explosion +# The radius of a TNT explosion. #tnt_radius = 3 # Enable the stairs mod ABM that replaces the old 'upside down' # stair and slab nodes in old maps with the new param2 versions. #enable_stairs_replace_abm = false -# Whether you allow respawning in beds -# Default value is true +# Whether to allow respawning in beds. +# Default value is true. #enable_bed_respawn = true -# Whether players can skip night by sleeping -# Default value is true +# Whether players can skip night by sleeping. +# Default value is true. #enable_bed_night_skip = true + +# Whether the engine's spawn search, which does not check for a suitable +# starting biome, is used. +# Default value is false. +#engine_spawn = false diff --git a/mods/spawn/README.txt b/mods/spawn/README.txt new file mode 100644 index 00000000..fc16c2a6 --- /dev/null +++ b/mods/spawn/README.txt @@ -0,0 +1,7 @@ +Minetest Game mod: spawn +======================== +See license.txt for license information. + +Authors of source code +---------------------- +paramat (MIT) diff --git a/mods/spawn/depends.txt b/mods/spawn/depends.txt new file mode 100644 index 00000000..4ad96d51 --- /dev/null +++ b/mods/spawn/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/spawn/init.lua b/mods/spawn/init.lua new file mode 100644 index 00000000..ae8287f2 --- /dev/null +++ b/mods/spawn/init.lua @@ -0,0 +1,124 @@ +-- Disable by mapgen, setting or if 'static_spawnpoint' is set +-------------------------------------------------------------- + +local mg_name = minetest.get_mapgen_setting("mg_name") +if mg_name == "v6" or mg_name == "singlenode" or + minetest.settings:get("static_spawnpoint") or + minetest.settings:get_bool("engine_spawn") then + return +end + + +-- Parameters +------------- + +-- Resolution of search grid in nodes. +local res = 64 +-- Number of points checked in the square search grid (edge * edge). +local checks = 128 * 128 +-- Starting point for biome checks. This also sets the y co-ordinate for all +-- points checked, so the suitable biomes must be active at this y. +local pos = {x = 0, y = 8, z = 0} + + +-- Table of suitable biomes + +local biome_ids = { + minetest.get_biome_id("taiga"), + minetest.get_biome_id("coniferous_forest"), + minetest.get_biome_id("deciduous_forest"), + minetest.get_biome_id("grassland"), + minetest.get_biome_id("savanna"), +} + +-- End of parameters +-------------------- + + +-- Direction table + +local dirs = { + {x = 0, y = 0, z = 1}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, + {x = 1, y = 0, z = 0}, +} + + +-- Initial variables + +local edge_len = 1 +local edge_dist = 0 +local dir_step = 0 +local dir_ind = 1 +local searched = false +local success = false +local spawn_pos = {} + + +--Functions +----------- + +-- Get next position on square search spiral + +local function next_pos() + if edge_dist == edge_len then + edge_dist = 0 + dir_ind = dir_ind + 1 + if dir_ind == 5 then + dir_ind = 1 + end + dir_step = dir_step + 1 + edge_len = math.floor(dir_step / 2) + 1 + end + + local dir = dirs[dir_ind] + local move = vector.multiply(dir, res) + + edge_dist = edge_dist + 1 + + return vector.add(pos, move) +end + + +-- Spawn position search + +local function search() + for iter = 1, checks do + local biome_data = minetest.get_biome_data(pos) + -- Sometimes biome_data is nil + local biome = biome_data and biome_data.biome + for id_ind = 1, #biome_ids do + local biome_id = biome_ids[id_ind] + if biome == biome_id then + local spawn_y = minetest.get_spawn_level(pos.x, pos.z) + if spawn_y then + spawn_pos = {x = pos.x, y = spawn_y, z = pos.z} + return true + end + end + end + + pos = next_pos() + end + + return false +end + + +-- On new player spawn + +-- Search for new player spawn once per server session. If successful, store +-- position and reposition new players, otherwise leave them at engine spawn +-- position. + +minetest.register_on_newplayer(function(player) + if not searched then + success = search() + searched = true + end + + if success then + player:setpos(spawn_pos) + end +end) diff --git a/mods/spawn/license.txt b/mods/spawn/license.txt new file mode 100644 index 00000000..a466aabd --- /dev/null +++ b/mods/spawn/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2018 paramat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/settingtypes.txt b/settingtypes.txt index 855235c2..343d041d 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -46,3 +46,7 @@ share_bones_time (Bone share time) int 1200 0 # Replaces old stairs with new ones. Only required for older worlds. enable_stairs_replace_abm (Replace old stairs) bool false + +# If enabled, use the engine's spawn search which does not check for a +# suitable starting biome. +engine_spawn (Use engine spawn search) bool false From bbb88e6387201ffa6d3231fe9ed9d1b619ace7a9 Mon Sep 17 00:00:00 2001 From: Paramat Date: Fri, 20 Apr 2018 20:13:16 +0100 Subject: [PATCH 116/195] Rebalance bronze and steel tools, swap ore depths Reduce bronze tool capabilities to be between stone and steel. Swap depths of iron ore and tin / copper ores for corresponding progression. --- mods/default/mapgen.lua | 80 ++++++++++++++-------------- mods/default/tools.lua | 114 ++++++++++++++++++++-------------------- 2 files changed, 97 insertions(+), 97 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 96bfd2d7..6892743b 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -556,41 +556,6 @@ function default.register_ores() y_min = -31000, }) - -- Iron - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_iron", - wherein = "default:stone", - clust_scarcity = 9 * 9 * 9, - clust_num_ores = 12, - clust_size = 3, - y_max = 31000, - y_min = 1025, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_iron", - wherein = "default:stone", - clust_scarcity = 7 * 7 * 7, - clust_num_ores = 5, - clust_size = 3, - y_max = -64, - y_min = -127, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_iron", - wherein = "default:stone", - clust_scarcity = 12 * 12 * 12, - clust_num_ores = 29, - clust_size = 5, - y_max = -128, - y_min = -31000, - }) - -- Tin minetest.register_ore({ @@ -611,8 +576,8 @@ function default.register_ores() clust_scarcity = 13 * 13 * 13, clust_num_ores = 4, clust_size = 3, - y_max = -128, - y_min = -255, + y_max = -64, + y_min = -127, }) minetest.register_ore({ @@ -622,7 +587,7 @@ function default.register_ores() clust_scarcity = 10 * 10 * 10, clust_num_ores = 5, clust_size = 3, - y_max = -256, + y_max = -128, y_min = -31000, }) @@ -646,8 +611,8 @@ function default.register_ores() clust_scarcity = 12 * 12 * 12, clust_num_ores = 4, clust_size = 3, - y_max = -128, - y_min = -255, + y_max = -64, + y_min = -127, }) minetest.register_ore({ @@ -657,6 +622,41 @@ function default.register_ores() clust_scarcity = 9 * 9 * 9, clust_num_ores = 5, clust_size = 3, + y_max = -128, + y_min = -31000, + }) + + -- Iron + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 12, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 7 * 7 * 7, + clust_num_ores = 5, + clust_size = 3, + y_max = -128, + y_min = -255, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 29, + clust_size = 5, y_max = -256, y_min = -31000, }) diff --git a/mods/default/tools.lua b/mods/default/tools.lua index 067613d3..9f503ed4 100644 --- a/mods/default/tools.lua +++ b/mods/default/tools.lua @@ -50,6 +50,20 @@ minetest.register_tool("default:pick_stone", { sound = {breaks = "default_tool_breaks"}, }) +minetest.register_tool("default:pick_bronze", { + description = "Bronze Pickaxe", + inventory_image = "default_tool_bronzepick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + cracky = {times={[1]=4.50, [2]=1.80, [3]=0.90}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + minetest.register_tool("default:pick_steel", { description = "Steel Pickaxe", inventory_image = "default_tool_steelpick.png", @@ -64,20 +78,6 @@ minetest.register_tool("default:pick_steel", { sound = {breaks = "default_tool_breaks"}, }) -minetest.register_tool("default:pick_bronze", { - description = "Bronze Pickaxe", - inventory_image = "default_tool_bronzepick.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=30, maxlevel=2}, - }, - damage_groups = {fleshy=4}, - }, - sound = {breaks = "default_tool_breaks"}, -}) - minetest.register_tool("default:pick_mese", { description = "Mese Pickaxe", inventory_image = "default_tool_mesepick.png", @@ -141,6 +141,21 @@ minetest.register_tool("default:shovel_stone", { sound = {breaks = "default_tool_breaks"}, }) +minetest.register_tool("default:shovel_bronze", { + description = "Bronze Shovel", + inventory_image = "default_tool_bronzeshovel.png", + wield_image = "default_tool_bronzeshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.1, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.65, [2]=1.05, [3]=0.45}, uses=25, maxlevel=2}, + }, + damage_groups = {fleshy=3}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + minetest.register_tool("default:shovel_steel", { description = "Steel Shovel", inventory_image = "default_tool_steelshovel.png", @@ -156,21 +171,6 @@ minetest.register_tool("default:shovel_steel", { sound = {breaks = "default_tool_breaks"}, }) -minetest.register_tool("default:shovel_bronze", { - description = "Bronze Shovel", - inventory_image = "default_tool_bronzeshovel.png", - wield_image = "default_tool_bronzeshovel.png^[transformR90", - tool_capabilities = { - full_punch_interval = 1.1, - max_drop_level=1, - groupcaps={ - crumbly = {times={[1]=1.50, [2]=0.90, [3]=0.40}, uses=40, maxlevel=2}, - }, - damage_groups = {fleshy=3}, - }, - sound = {breaks = "default_tool_breaks"}, -}) - minetest.register_tool("default:shovel_mese", { description = "Mese Shovel", inventory_image = "default_tool_meseshovel.png", @@ -234,6 +234,20 @@ minetest.register_tool("default:axe_stone", { sound = {breaks = "default_tool_breaks"}, }) +minetest.register_tool("default:axe_bronze", { + description = "Bronze Axe", + inventory_image = "default_tool_bronzeaxe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.75, [2]=1.70, [3]=1.15}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + minetest.register_tool("default:axe_steel", { description = "Steel Axe", inventory_image = "default_tool_steelaxe.png", @@ -248,20 +262,6 @@ minetest.register_tool("default:axe_steel", { sound = {breaks = "default_tool_breaks"}, }) -minetest.register_tool("default:axe_bronze", { - description = "Bronze Axe", - inventory_image = "default_tool_bronzeaxe.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - choppy={times={[1]=2.50, [2]=1.40, [3]=1.00}, uses=30, maxlevel=2}, - }, - damage_groups = {fleshy=4}, - }, - sound = {breaks = "default_tool_breaks"}, -}) - minetest.register_tool("default:axe_mese", { description = "Mese Axe", inventory_image = "default_tool_meseaxe.png", @@ -323,6 +323,20 @@ minetest.register_tool("default:sword_stone", { sound = {breaks = "default_tool_breaks"}, }) +minetest.register_tool("default:sword_bronze", { + description = "Bronze Sword", + inventory_image = "default_tool_bronzesword.png", + tool_capabilities = { + full_punch_interval = 0.8, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=2.75, [2]=1.30, [3]=0.375}, uses=25, maxlevel=2}, + }, + damage_groups = {fleshy=6}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + minetest.register_tool("default:sword_steel", { description = "Steel Sword", inventory_image = "default_tool_steelsword.png", @@ -337,20 +351,6 @@ minetest.register_tool("default:sword_steel", { sound = {breaks = "default_tool_breaks"}, }) -minetest.register_tool("default:sword_bronze", { - description = "Bronze Sword", - inventory_image = "default_tool_bronzesword.png", - tool_capabilities = { - full_punch_interval = 0.8, - max_drop_level=1, - groupcaps={ - snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=40, maxlevel=2}, - }, - damage_groups = {fleshy=6}, - }, - sound = {breaks = "default_tool_breaks"}, -}) - minetest.register_tool("default:sword_mese", { description = "Mese Sword", inventory_image = "default_tool_mesesword.png", From aedd20944081c23382ec9a17d406224ff29618dc Mon Sep 17 00:00:00 2001 From: Paramat Date: Sun, 29 Apr 2018 07:15:11 +0100 Subject: [PATCH 117/195] Use stratum ore to add the missing sandstone types Add silver sandstone strata to 'cold desert' biome. Add sandstone and desert_sandstone strata to 'desert' biome. --- mods/default/mapgen.lua | 104 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 101 insertions(+), 3 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 6892743b..7f0fbd88 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -412,11 +412,109 @@ end function default.register_ores() - -- Blob ore - -- These first to avoid other ores in blobs + -- Stratum ores. + -- These obviously first. + + -- Silver sandstone + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:silver_sandstone", + wherein = {"default:stone"}, + clust_scarcity = 1, + y_max = 46, + y_min = 10, + noise_params = { + offset = 28, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 4, + biomes = {"cold_desert"}, + }) + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:silver_sandstone", + wherein = {"default:stone"}, + clust_scarcity = 1, + y_max = 42, + y_min = 6, + noise_params = { + offset = 24, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 2, + biomes = {"cold_desert"}, + }) + + -- Desert sandstone + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:desert_sandstone", + wherein = {"default:desert_stone"}, + clust_scarcity = 1, + y_max = 46, + y_min = 10, + noise_params = { + offset = 28, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 4, + biomes = {"desert"}, + }) + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:desert_sandstone", + wherein = {"default:desert_stone"}, + clust_scarcity = 1, + y_max = 42, + y_min = 6, + noise_params = { + offset = 24, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 2, + biomes = {"desert"}, + }) + + -- Sandstone + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:sandstone", + wherein = {"default:desert_stone"}, + clust_scarcity = 1, + y_max = 39, + y_min = 3, + noise_params = { + offset = 21, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 2, + biomes = {"desert"}, + }) + + -- Blob ore. + -- These before scatter ores to avoid other ores in blobs. -- Clay - -- This first to avoid clay in sand blobs minetest.register_ore({ ore_type = "blob", From b52ea3de159a135bad608360ce8d68c57bf64ce7 Mon Sep 17 00:00:00 2001 From: Ezhh Date: Mon, 30 Apr 2018 22:14:23 +0100 Subject: [PATCH 118/195] Remove commented lines from biome definitions --- mods/default/mapgen.lua | 203 ---------------------------------------- 1 file changed, 203 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 7f0fbd88..c84e2076 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -921,7 +921,6 @@ function default.register_biomes(upper_limit) node_stone = "default:cave_ice", node_water_top = "default:ice", depth_water_top = 10, - --node_water = "", node_river_water = "default:ice", node_riverbed = "default:gravel", depth_riverbed = 2, @@ -938,11 +937,8 @@ function default.register_biomes(upper_limit) depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", node_water_top = "default:ice", depth_water_top = 10, - --node_water = "", - --node_river_water = "", y_max = -9, y_min = -112, heat_point = 0, @@ -954,15 +950,6 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "tundra", node_dust = "default:snowblock", - --node_top = , - --depth_top = , - --node_filler = , - --depth_filler = , - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:gravel", depth_riverbed = 2, y_max = upper_limit, @@ -973,16 +960,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "tundra_beach", - --node_dust = "", node_top = "default:gravel", depth_top = 1, node_filler = "default:gravel", depth_filler = 2, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:gravel", depth_riverbed = 2, y_max = 1, @@ -993,16 +974,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "tundra_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:gravel", depth_riverbed = 2, y_max = -4, @@ -1020,11 +995,6 @@ function default.register_biomes(upper_limit) depth_top = 1, node_filler = "default:dirt", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = upper_limit, @@ -1035,16 +1005,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "taiga_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = 1, @@ -1062,11 +1026,6 @@ function default.register_biomes(upper_limit) depth_top = 1, node_filler = "default:dirt", depth_filler = 1, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = upper_limit, @@ -1077,16 +1036,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "snowy_grassland_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = 4, @@ -1099,16 +1052,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "grassland", - --node_dust = "", node_top = "default:dirt_with_grass", depth_top = 1, node_filler = "default:dirt", depth_filler = 1, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = upper_limit, @@ -1119,16 +1066,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "grassland_dunes", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 2, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = 5, @@ -1139,16 +1080,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "grassland_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = 3, @@ -1161,16 +1096,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "coniferous_forest", - --node_dust = "", node_top = "default:dirt_with_coniferous_litter", depth_top = 1, node_filler = "default:dirt", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = upper_limit, @@ -1181,16 +1110,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "coniferous_forest_dunes", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = 5, @@ -1201,16 +1124,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "coniferous_forest_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = 3, @@ -1223,16 +1140,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "deciduous_forest", - --node_dust = "", node_top = "default:dirt_with_grass", depth_top = 1, node_filler = "default:dirt", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = upper_limit, @@ -1243,16 +1154,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "deciduous_forest_shore", - --node_dust = "", node_top = "default:dirt", depth_top = 1, node_filler = "default:dirt", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = 0, @@ -1263,16 +1168,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "deciduous_forest_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = -2, @@ -1285,16 +1184,11 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "desert", - --node_dust = "", node_top = "default:desert_sand", depth_top = 1, node_filler = "default:desert_sand", depth_filler = 1, node_stone = "default:desert_stone", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = upper_limit, @@ -1305,16 +1199,11 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "desert_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, node_stone = "default:desert_stone", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = 4, @@ -1327,16 +1216,11 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "sandstone_desert", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 1, node_stone = "default:sandstone", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = upper_limit, @@ -1347,16 +1231,11 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "sandstone_desert_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, node_stone = "default:sandstone", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = 4, @@ -1369,16 +1248,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "cold_desert", - --node_dust = "", node_top = "default:silver_sand", depth_top = 1, node_filler = "default:silver_sand", depth_filler = 1, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = upper_limit, @@ -1389,16 +1262,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "cold_desert_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = 4, @@ -1411,16 +1278,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "savanna", - --node_dust = "", node_top = "default:dirt_with_dry_grass", depth_top = 1, node_filler = "default:dirt", depth_filler = 1, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = upper_limit, @@ -1431,16 +1292,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "savanna_shore", - --node_dust = "", node_top = "default:dirt", depth_top = 1, node_filler = "default:dirt", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = 0, @@ -1451,16 +1306,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "savanna_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = -2, @@ -1473,16 +1322,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "rainforest", - --node_dust = "", node_top = "default:dirt_with_rainforest_litter", depth_top = 1, node_filler = "default:dirt", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = upper_limit, @@ -1493,16 +1336,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "rainforest_swamp", - --node_dust = "", node_top = "default:dirt", depth_top = 1, node_filler = "default:dirt", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = 0, @@ -1513,16 +1350,10 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "rainforest_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, y_max = -2, @@ -1535,16 +1366,6 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "underground", - --node_dust = "", - --node_top = "", - --depth_top = , - --node_filler = "", - --depth_filler = , - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", y_max = -113, y_min = -31000, heat_point = 50, @@ -1561,18 +1382,10 @@ function default.register_floatland_biomes(floatland_level, shadow_limit) minetest.register_biome({ name = "floatland_grassland", - --node_dust = "", node_top = "default:dirt_with_grass", depth_top = 1, node_filler = "default:dirt", depth_filler = 1, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", - --node_riverbed = "", - --depth_riverbed = , y_max = 31000, y_min = floatland_level + 2, heat_point = 50, @@ -1581,18 +1394,10 @@ function default.register_floatland_biomes(floatland_level, shadow_limit) minetest.register_biome({ name = "floatland_coniferous_forest", - --node_dust = "", node_top = "default:dirt_with_coniferous_litter", depth_top = 1, node_filler = "default:dirt", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", - --node_riverbed = "", - --depth_riverbed = , y_max = 31000, y_min = floatland_level + 2, heat_point = 50, @@ -1601,18 +1406,10 @@ function default.register_floatland_biomes(floatland_level, shadow_limit) minetest.register_biome({ name = "floatland_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", - --node_riverbed = "", - --depth_riverbed = , y_max = floatland_level + 1, y_min = shadow_limit, heat_point = 50, From ace7ec953ea492c7c641dfeb2ce22985956fb7db Mon Sep 17 00:00:00 2001 From: Paramat Date: Fri, 4 May 2018 23:05:47 +0100 Subject: [PATCH 119/195] Biomes: Add tundra lowland with permafrost, stones, moss and snow Move previous tundra to highland and remove the snowblocks that are unsuitable for a fairly dry biome, use snow slabs instead. --- mods/default/README.txt | 4 ++ mods/default/mapgen.lua | 64 ++++++++++++++++++- mods/default/nodes.lua | 33 +++++++++- mods/default/textures/default_moss.png | Bin 0 -> 485 bytes mods/default/textures/default_moss_side.png | Bin 0 -> 328 bytes mods/default/textures/default_permafrost.png | Bin 0 -> 283 bytes mods/default/textures/default_stones.png | Bin 0 -> 411 bytes 7 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 mods/default/textures/default_moss.png create mode 100644 mods/default/textures/default_moss_side.png create mode 100644 mods/default/textures/default_permafrost.png create mode 100644 mods/default/textures/default_stones.png diff --git a/mods/default/README.txt b/mods/default/README.txt index 1c5e9e35..bb7523ef 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -114,6 +114,10 @@ paramat (CC BY-SA 3.0): default_bookshelf_slot.png -- Derived from a texture by Gambit (CC-BY-SA 3.0) default_marram_grass_*.png -- Derived from textures by TumeniNodes (CC-BY-SA 3.0) default_emergent_jungle_sapling.png + default_permafrost.png -- Derived from a texture by Neuromancer (CC BY-SA 3.0) + default_stones.png -- Derived from a texture by sofar (CC0 1.0) + default_moss.png + default_moss_side.png TumeniNodes (CC BY-SA 3.0): default_desert_cobble.png -- Derived from a texture by brunob.santos (CC BY-SA 3.0) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index c84e2076..8b1c9574 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -948,11 +948,25 @@ function default.register_biomes(upper_limit) -- Tundra minetest.register_biome({ - name = "tundra", - node_dust = "default:snowblock", + name = "tundra_highland", + node_dust = "default:snow", node_riverbed = "default:gravel", depth_riverbed = 2, y_max = upper_limit, + y_min = 49, + heat_point = 0, + humidity_point = 40, + }) + + minetest.register_biome({ + name = "tundra", + node_top = "default:permafrost_with_stones", + depth_top = 1, + node_filler = "default:permafrost", + depth_filler = 1, + node_riverbed = "default:gravel", + depth_riverbed = 2, + y_max = 48, y_min = 2, heat_point = 0, humidity_point = 40, @@ -2028,6 +2042,52 @@ function default.register_decorations() }, }) + -- Tundra moss + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:permafrost_with_stones"}, + sidelen = 4, + noise_params = { + offset = -0.8, + scale = 2.0, + spread = {x = 100, y = 100, z = 100}, + seed = 53995, + octaves = 3, + persist = 1.0 + }, + biomes = {"tundra"}, + y_max = 48, + y_min = 2, + decoration = "default:permafrost_with_moss", + place_offset_y = -1, + flags = "force_placement", + }) + + -- Tundra patchy snow + + minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:permafrost_with_moss", + "default:permafrost_with_stones", + "default:stone" + }, + sidelen = 4, + noise_params = { + offset = 0, + scale = 1.0, + spread = {x = 100, y = 100, z = 100}, + seed = 172555, + octaves = 3, + persist = 1.0 + }, + biomes = {"tundra"}, + y_max = 48, + y_min = 2, + decoration = "default:snow", + }) + -- Coral reef minetest.register_decoration({ diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 77bccb28..7d65f300 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -53,6 +53,10 @@ default:dirt_with_snow default:dirt_with_rainforest_litter default:dirt_with_coniferous_litter +default:permafrost +default:permafrost_with_stones +default:permafrost_with_moss + default:sand default:desert_sand default:silver_sand @@ -63,7 +67,6 @@ default:clay default:snow default:snowblock - default:ice default:cave_ice @@ -490,6 +493,34 @@ minetest.register_node("default:dirt_with_coniferous_litter", { }), }) +minetest.register_node("default:permafrost", { + description = "Permafrost", + tiles = {"default_permafrost.png"}, + groups = {cracky = 3}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("default:permafrost_with_stones", { + description = "Permafrost with Stones", + tiles = {"default_permafrost.png^default_stones.png", + "default_permafrost.png"}, + groups = {cracky = 3}, + drop = "default:permafrost", + sounds = default.node_sound_gravel_defaults(), +}) + +minetest.register_node("default:permafrost_with_moss", { + description = "Permafrost with Moss", + tiles = {"default_moss.png", "default_permafrost.png", + {name = "default_permafrost.png^default_moss_side.png", + tileable_vertical = false}}, + groups = {cracky = 3}, + drop = "default:permafrost", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + minetest.register_node("default:sand", { description = "Sand", tiles = {"default_sand.png"}, diff --git a/mods/default/textures/default_moss.png b/mods/default/textures/default_moss.png new file mode 100644 index 0000000000000000000000000000000000000000..479038e9c2107b3d4dff4f80cb527308927bd516 GIT binary patch literal 485 zcmV+YDO!FhTz@KEfh%5u zD`15zVTUbZh%IA^E@X=?WsNUqkT7YHFlv)9Ym_l;mN9LYGH;qQaGW!7oiuWvHFKaf zbfPwQr8jt{H+iTydZ{>jt2lhDIexD?f3Z7&vO9sZJcPGBhPpn7yFQ7&KZ?IVi@-sR z!9VRhY+Do5)+8%3zR3(=R&%oD*}vYdT?MylBsB1E;Yj3wH@3t|Ba|}{GJu1?D>MD z4k1)e(~c)Ad1^paG{QwuF7B&Nb55ZuDQABFnAV?PPQwhYZj>y>(hke4W8z>P)?Twc z67Ce^_p^ikZ<#y!fjLtuBC!J7cQ)Z-SEk862#|(Qw>rY;v$|VWhdu@(n77%+-83~i b%R~Pk(t;bo&@^<}00000NkvXXu0mjfZ_~(a literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_moss_side.png b/mods/default/textures/default_moss_side.png new file mode 100644 index 0000000000000000000000000000000000000000..4a20345e6b72152983bd907641ef72e0dc207251 GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}SAb85D?=cIbF92uqJn#}f_J8} zPnNQOu1a8mYEYqCaIsownR-}-Mr4gCD->4DNL`27ZSo=&6)7&Z>H!lONvr|2uQ| XCXO(bPjjSz_A+?7`njxgN@xNAkQI4q literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_permafrost.png b/mods/default/textures/default_permafrost.png new file mode 100644 index 0000000000000000000000000000000000000000..f1edbab44e66a521cfe54feee3af6e95254f60fc GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!aez;VD?3mD8-oxRqbN6vC?C57 zAG@R=w~Pp%yttr}q=>4FxQ4u>mXeIFs=R@QlA)%uwXtr2t@;(9_Qjqqjv*44dHWrO zSQI&!BPCTBMgIT4_4Lrf%Tq-zJ+07>)6ffazoXQ}5!Vvw_|0$Ds=4X^qHnXU$QM{6 za&Rv literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_stones.png b/mods/default/textures/default_stones.png new file mode 100644 index 0000000000000000000000000000000000000000..09c5ee1481b2f9a4ec709f7c82f1005576b6c2ed GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMfmH?j+S0Eh`5fK9du|NFJr7nHgCb8CjWGAds7#ot=}D zlM4bx1qB7gg+(PGP+C$_US3`a1T`SgPzwU}wYAN4b#?Xi&2U{n8{^==EtMB*U`=VxP%W84g>ZZX= z)pbW|b8C+@cnLk3S~&9$&!f`56{l=E96Ez-PTkm~top~zHK}X=o4_Z<$Jd7Fni#(o z)Nc`+7QHW~KdsLA7%%tzjygvEl25OEgU($&d+UR>`mJ4F;hl$HytF^aKWEOWc^hYB b|7H`I&FM5f;p`=#0~tJB{an^LB{Ts5(Mhai literal 0 HcmV?d00001 From 3d709dfa1d3aee61e0325895ff077f7074c676f6 Mon Sep 17 00:00:00 2001 From: Ezhh Date: Fri, 11 May 2018 16:42:28 +0100 Subject: [PATCH 120/195] Enable regrowth of apples Apples only regrow where they first appear on trees, either on mapgen or when grown from saplings (meaning apples that were placed by players won't regrow). Once the tree is cut down in full (leaves removed), regrowth will stop. New apples only grow in daylight, and take the same time as a sapling to grow. --- mods/default/nodes.lua | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 7d65f300..c07cc6ef 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -737,6 +737,35 @@ minetest.register_node("default:apple", { after_place_node = function(pos, placer, itemstack) minetest.set_node(pos, {name = "default:apple", param2 = 1}) end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if oldnode.param2 == 0 then + minetest.set_node(pos, {name = "default:apple_mark"}) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end + end, +}) + +minetest.register_node("default:apple_mark", { + description = "Apple Marker", + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_timer = function(pos, elapsed) + if not minetest.find_node_near(pos, 1, "default:leaves") then + minetest.remove_node(pos) + elseif minetest.get_node_light(pos) < 11 then + minetest.get_node_timer(pos):start(200) + else + minetest.set_node(pos, {name = "default:apple"}) + end + end }) From 64470dc786370b9d855e77a38df362c61ccfdedc Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 15 May 2018 22:27:39 +0100 Subject: [PATCH 121/195] Biomes: Add vertical biome blends (#2120) Alter a few biome y-limits for consistency. --- mods/default/mapgen.lua | 52 +++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 8b1c9574..dfe03f58 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -953,7 +953,7 @@ function default.register_biomes(upper_limit) node_riverbed = "default:gravel", depth_riverbed = 2, y_max = upper_limit, - y_min = 49, + y_min = 47, heat_point = 0, humidity_point = 40, }) @@ -966,7 +966,8 @@ function default.register_biomes(upper_limit) depth_filler = 1, node_riverbed = "default:gravel", depth_riverbed = 2, - y_max = 48, + vertical_blend = 4, + y_max = 46, y_min = 2, heat_point = 0, humidity_point = 40, @@ -980,6 +981,7 @@ function default.register_biomes(upper_limit) depth_filler = 2, node_riverbed = "default:gravel", depth_riverbed = 2, + vertical_blend = 1, y_max = 1, y_min = -3, heat_point = 0, @@ -994,6 +996,7 @@ function default.register_biomes(upper_limit) depth_filler = 3, node_riverbed = "default:gravel", depth_riverbed = 2, + vertical_blend = 1, y_max = -4, y_min = -112, heat_point = 0, @@ -1012,7 +1015,7 @@ function default.register_biomes(upper_limit) node_riverbed = "default:sand", depth_riverbed = 2, y_max = upper_limit, - y_min = 2, + y_min = 4, heat_point = 25, humidity_point = 70, }) @@ -1025,7 +1028,8 @@ function default.register_biomes(upper_limit) depth_filler = 3, node_riverbed = "default:sand", depth_riverbed = 2, - y_max = 1, + vertical_blend = 1, + y_max = 3, y_min = -112, heat_point = 25, humidity_point = 70, @@ -1043,7 +1047,7 @@ function default.register_biomes(upper_limit) node_riverbed = "default:sand", depth_riverbed = 2, y_max = upper_limit, - y_min = 5, + y_min = 4, heat_point = 20, humidity_point = 35, }) @@ -1056,7 +1060,8 @@ function default.register_biomes(upper_limit) depth_filler = 3, node_riverbed = "default:sand", depth_riverbed = 2, - y_max = 4, + vertical_blend = 1, + y_max = 3, y_min = -112, heat_point = 20, humidity_point = 35, @@ -1086,6 +1091,7 @@ function default.register_biomes(upper_limit) depth_filler = 2, node_riverbed = "default:sand", depth_riverbed = 2, + vertical_blend = 1, y_max = 5, y_min = 4, heat_point = 50, @@ -1130,6 +1136,7 @@ function default.register_biomes(upper_limit) depth_filler = 3, node_riverbed = "default:sand", depth_riverbed = 2, + vertical_blend = 1, y_max = 5, y_min = 4, heat_point = 45, @@ -1188,6 +1195,7 @@ function default.register_biomes(upper_limit) depth_filler = 3, node_riverbed = "default:sand", depth_riverbed = 2, + vertical_blend = 1, y_max = -2, y_min = -112, heat_point = 60, @@ -1206,7 +1214,7 @@ function default.register_biomes(upper_limit) node_riverbed = "default:sand", depth_riverbed = 2, y_max = upper_limit, - y_min = 5, + y_min = 4, heat_point = 92, humidity_point = 16, }) @@ -1220,7 +1228,8 @@ function default.register_biomes(upper_limit) node_stone = "default:desert_stone", node_riverbed = "default:sand", depth_riverbed = 2, - y_max = 4, + vertical_blend = 1, + y_max = 3, y_min = -112, heat_point = 92, humidity_point = 16, @@ -1238,7 +1247,7 @@ function default.register_biomes(upper_limit) node_riverbed = "default:sand", depth_riverbed = 2, y_max = upper_limit, - y_min = 5, + y_min = 4, heat_point = 60, humidity_point = 0, }) @@ -1252,7 +1261,7 @@ function default.register_biomes(upper_limit) node_stone = "default:sandstone", node_riverbed = "default:sand", depth_riverbed = 2, - y_max = 4, + y_max = 3, y_min = -112, heat_point = 60, humidity_point = 0, @@ -1269,7 +1278,7 @@ function default.register_biomes(upper_limit) node_riverbed = "default:sand", depth_riverbed = 2, y_max = upper_limit, - y_min = 5, + y_min = 4, heat_point = 40, humidity_point = 0, }) @@ -1282,7 +1291,8 @@ function default.register_biomes(upper_limit) depth_filler = 3, node_riverbed = "default:sand", depth_riverbed = 2, - y_max = 4, + vertical_blend = 1, + y_max = 3, y_min = -112, heat_point = 40, humidity_point = 0, @@ -1326,6 +1336,7 @@ function default.register_biomes(upper_limit) depth_filler = 3, node_riverbed = "default:sand", depth_riverbed = 2, + vertical_blend = 1, y_max = -2, y_min = -112, heat_point = 89, @@ -1370,6 +1381,7 @@ function default.register_biomes(upper_limit) depth_filler = 3, node_riverbed = "default:sand", depth_riverbed = 2, + vertical_blend = 1, y_max = -2, y_min = -112, heat_point = 86, @@ -1719,7 +1731,7 @@ function default.register_decorations() }, biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, y_max = 31000, - y_min = 2, + y_min = 4, schematic = minetest.get_modpath("default") .. "/schematics/pine_tree.mts", flags = "place_center_x, place_center_z", }) @@ -1739,7 +1751,7 @@ function default.register_decorations() }, biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, y_max = 31000, - y_min = 2, + y_min = 4, schematic = minetest.get_modpath("default") .. "/schematics/small_pine_tree.mts", flags = "place_center_x, place_center_z", }) @@ -1752,7 +1764,7 @@ function default.register_decorations() fill_ratio = 0.0018, biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, y_max = 31000, - y_min = 1, + y_min = 4, schematic = minetest.get_modpath("default") .. "/schematics/pine_log.mts", flags = "place_center_x", rotation = "random", @@ -1862,7 +1874,7 @@ function default.register_decorations() }, biomes = {"desert"}, y_max = 31000, - y_min = 5, + y_min = 4, schematic = minetest.get_modpath("default") .. "/schematics/large_cactus.mts", flags = "place_center_x", rotation = "random", @@ -1885,7 +1897,7 @@ function default.register_decorations() }, biomes = {"desert"}, y_max = 31000, - y_min = 5, + y_min = 4, decoration = "default:cactus", height = 2, height_max = 5, @@ -2033,7 +2045,7 @@ function default.register_decorations() flags = "absvalue" }, biomes = {"coniferous_forest_dunes", "grassland_dunes"}, - y_max = 5, + y_max = 6, y_min = 4, decoration = { "default:marram_grass_1", @@ -2057,7 +2069,7 @@ function default.register_decorations() persist = 1.0 }, biomes = {"tundra"}, - y_max = 48, + y_max = 50, y_min = 2, decoration = "default:permafrost_with_moss", place_offset_y = -1, @@ -2083,7 +2095,7 @@ function default.register_decorations() persist = 1.0 }, biomes = {"tundra"}, - y_max = 48, + y_max = 50, y_min = 2, decoration = "default:snow", }) From b389f38120a00f9ee39cb0855ba614b290a90117 Mon Sep 17 00:00:00 2001 From: Paramat Date: Sat, 19 May 2018 18:57:01 +0100 Subject: [PATCH 122/195] Kelp: Add 'paramtype = light' to avoid black plantlike extension --- mods/default/nodes.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index c07cc6ef..261c2e7c 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1685,6 +1685,7 @@ minetest.register_node("default:sand_with_kelp", { tiles = {"default_sand.png"}, special_tiles = {{name = "default_kelp.png", tileable_vertical = true}}, inventory_image = "default_kelp.png", + paramtype = "light", paramtype2 = "leveled", groups = {snappy = 3}, selection_box = { From 145b7bfef33eb640b5960fd9a8699af9302fe1d7 Mon Sep 17 00:00:00 2001 From: Ezhh Date: Fri, 25 May 2018 22:33:03 +0100 Subject: [PATCH 123/195] Place hidden instead of visible fireflies on mapgen --- mods/fireflies/init.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/fireflies/init.lua b/mods/fireflies/init.lua index 47ad373f..ec1d7120 100644 --- a/mods/fireflies/init.lua +++ b/mods/fireflies/init.lua @@ -193,7 +193,7 @@ if minetest.get_mapgen_setting("mg_name") == "v6" then fill_ratio = 0.0002, y_max = 31000, y_min = 1, - decoration = "fireflies:firefly", + decoration = "fireflies:hidden_firefly", }) minetest.register_decoration({ @@ -205,7 +205,7 @@ if minetest.get_mapgen_setting("mg_name") == "v6" then fill_ratio = 0.0002, y_max = 31000, y_min = 1, - decoration = "fireflies:firefly", + decoration = "fireflies:hidden_firefly", }) else @@ -230,7 +230,7 @@ else }, y_max = 31000, y_min = -1, - decoration = "fireflies:firefly", + decoration = "fireflies:hidden_firefly", }) minetest.register_decoration({ @@ -253,7 +253,7 @@ else }, y_max = 31000, y_min = -1, - decoration = "fireflies:firefly", + decoration = "fireflies:hidden_firefly", }) end From ed1d64d8aaa8af78034c316b708f75c1c5824f2a Mon Sep 17 00:00:00 2001 From: Paramat Date: Thu, 31 May 2018 03:14:46 +0100 Subject: [PATCH 124/195] Snow: Make players sink into 'default:snow' by 3/16 node --- mods/default/nodes.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 261c2e7c..6b0785e2 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -581,6 +581,12 @@ minetest.register_node("default:snow", { {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, }, }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -7 / 16, 0.5}, + }, + }, groups = {crumbly = 3, falling_node = 1, puts_out_fire = 1, snowy = 1}, sounds = default.node_sound_snow_defaults(), From e74e091e78705c9209eb693eb53e09433cd54244 Mon Sep 17 00:00:00 2001 From: Paramat Date: Fri, 1 Jun 2018 22:39:50 +0100 Subject: [PATCH 125/195] Biomes: Make beaches snowy in snowy biomes --- mods/default/mapgen.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index dfe03f58..e7914934 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1022,6 +1022,7 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "taiga_ocean", + node_dust = "default:snow", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", @@ -1054,6 +1055,7 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "snowy_grassland_ocean", + node_dust = "default:snow", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", @@ -2083,7 +2085,8 @@ function default.register_decorations() place_on = { "default:permafrost_with_moss", "default:permafrost_with_stones", - "default:stone" + "default:stone", + "default:gravel" }, sidelen = 4, noise_params = { @@ -2094,9 +2097,9 @@ function default.register_decorations() octaves = 3, persist = 1.0 }, - biomes = {"tundra"}, + biomes = {"tundra", "tundra_beach"}, y_max = 50, - y_min = 2, + y_min = 1, decoration = "default:snow", }) From 37b206e49f670e30f61d4c3db8f5e4acab1c1ad4 Mon Sep 17 00:00:00 2001 From: Paramat Date: Fri, 1 Jun 2018 23:41:45 +0100 Subject: [PATCH 126/195] TNT: Raise cost of TNT by adding a TNT stick crafting stage 6 gunpowder and 1 paper crafts to 2 TNT stick craftitems. 9 TNT sticks craft to 1 TNT. TNT stick is not yet usable as an explosive, possibly later. --- mods/tnt/README.txt | 31 ++++++++++++++++++++-------- mods/tnt/init.lua | 21 ++++++++++++++++--- mods/tnt/license.txt | 1 + mods/tnt/textures/tnt_tnt_stick.png | Bin 0 -> 149 bytes 4 files changed, 41 insertions(+), 12 deletions(-) create mode 100644 mods/tnt/textures/tnt_tnt_stick.png diff --git a/mods/tnt/README.txt b/mods/tnt/README.txt index 4e74841c..1970804f 100644 --- a/mods/tnt/README.txt +++ b/mods/tnt/README.txt @@ -23,22 +23,35 @@ All gunpowder textures except tnt_gunpowder_inventory.png. sofar (sofar@foo-projects.org) (CC BY-SA 3.0): tnt_blast.png +paramat (CC BY-SA 3.0) +tnt_tnt_stick.png - Derived from a texture by benrob0329. + Introduction ------------ This mod adds TNT to Minetest. TNT is a tool to help the player in mining. How to use the mod: -Craft gunpowder by placing coal and gravel in the crafting area. -The gunpowder can be used to craft TNT or as fuse for TNT. -To craft TNT place items like this: --- wood - gunpowder -- wood - -gunpowder gunpowder gunpowder --- wood - gunpowder -- wood - -There are different ways to blow up TNT: +Craft gunpowder by placing coal and gravel in the crafting area. +The gunpowder can be used to craft TNT sticks or as a fuse trail for TNT. + +To craft 2 TNT sticks: +G_G +GPG +G_G +G = gunpowder +P = paper +The sticks are not usable as an explosive. + +Craft TNT from 9 TNT sticks. + +There are different ways to ignite TNT: 1. Hit it with a torch. - 2. Hit a gunpowder fuse that leads to a TNT block with a torch or flint-and-steel. + 2. Hit a gunpowder fuse trail that leads to TNT with a torch or + flint-and-steel. 3. Activate it with mesecons (fastest way). -Be aware of the damage radius of 6 blocks! +For 1 TNT: +Node destruction radius is 3 nodes. +Player and object damage radius is 6 nodes. diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 2f9ccc5a..26a4d696 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -546,13 +546,28 @@ minetest.register_craft({ recipe = {"default:coal_lump", "default:gravel"} }) +minetest.register_craftitem("tnt:tnt_stick", { + description = "TNT Stick", + inventory_image = "tnt_tnt_stick.png", + groups = {flammable = 5}, +}) + if enable_tnt then + minetest.register_craft({ + output = "tnt:tnt_stick 2", + recipe = { + {"tnt:gunpowder", "", "tnt:gunpowder"}, + {"tnt:gunpowder", "default:paper", "tnt:gunpowder"}, + {"tnt:gunpowder", "", "tnt:gunpowder"}, + } + }) + minetest.register_craft({ output = "tnt:tnt", recipe = { - {"group:wood", "tnt:gunpowder", "group:wood"}, - {"tnt:gunpowder", "tnt:gunpowder", "tnt:gunpowder"}, - {"group:wood", "tnt:gunpowder", "group:wood"} + {"tnt:tnt_stick", "tnt:tnt_stick", "tnt:tnt_stick"}, + {"tnt:tnt_stick", "tnt:tnt_stick", "tnt:tnt_stick"}, + {"tnt:tnt_stick", "tnt:tnt_stick", "tnt:tnt_stick"} } }) diff --git a/mods/tnt/license.txt b/mods/tnt/license.txt index 210f2bdc..2c57df38 100644 --- a/mods/tnt/license.txt +++ b/mods/tnt/license.txt @@ -35,6 +35,7 @@ Copyright (C) 2014-2016 BlockMen Copyright (C) 2014-2016 ShadowNinja Copyright (C) 2015-2016 Wuzzy Copyright (C) 2016 sofar (sofar@foo-projects.org) +Copyright (C) 2018 paramat You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/tnt/textures/tnt_tnt_stick.png b/mods/tnt/textures/tnt_tnt_stick.png new file mode 100644 index 0000000000000000000000000000000000000000..bc47a291902b7251dc20e237df4d1c3af5f4184f GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ%`eIYGP@WU7BVpGVqmzy z!0?KJ;i%8HDL_%ik|4ie28U-i(tsR2PZ!4!j_b(@4vb9!vnDz+91>tKQdD5nIwZy< r>QNfjz$GzJ>%f5|md$~TR~Z>v-m^*UJjzl5)XCuK>gTe~DWM4f67?qE literal 0 HcmV?d00001 From e376d57bd290107a14271b8a62eade46a3f305ff Mon Sep 17 00:00:00 2001 From: Jacob Gustafson <7557867+poikilos@users.noreply.github.com> Date: Sat, 2 Jun 2018 09:54:45 +0200 Subject: [PATCH 127/195] Add optional bones messages for player and log --- minetest.conf.example | 3 +++ mods/bones/init.lua | 31 ++++++++++++++++++++++++++++--- settingtypes.txt | 3 +++ 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/minetest.conf.example b/minetest.conf.example index 672709d3..08365e11 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -23,6 +23,9 @@ # 0 to disable. By default it is "share_bones_time" divide by four. #share_bones_time_early = 300 +# Inform player of condition and location of new bones. +#bones_position_message = false + # Whether fire should be enabled. If disabled, 'basic_flame' nodes will # disappear. # 'permanent_flame' nodes will remain with either setting. diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 42945182..480a55c4 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -186,20 +186,32 @@ minetest.register_on_dieplayer(function(player) bones_mode = "bones" end + local bones_position_message = minetest.settings:get_bool("bones_position_message") == true + local player_name = player:get_player_name() + local pos = vector.round(player:get_pos()) + local pos_string = minetest.pos_to_string(pos) + -- return if keep inventory set or in creative mode if bones_mode == "keep" or (creative and creative.is_enabled_for and creative.is_enabled_for(player:get_player_name())) then + minetest.log("action", player_name .. " dies at " .. pos_string .. + ". No bones placed") + if bones_position_message then + minetest.chat_send_player(player_name, player_name .. " died at " .. pos_string .. ".") + end return end local player_inv = player:get_inventory() if is_all_empty(player_inv) then + minetest.log("action", player_name .. " dies at " .. pos_string .. + ". No bones placed") + if bones_position_message then + minetest.chat_send_player(player_name, player_name .. " died at " .. pos_string .. ".") + end return end - local pos = vector.round(player:getpos()) - local player_name = player:get_player_name() - -- check if it's possible to place bones, if not find space near player if bones_mode == "bones" and not may_replace(pos, player) then local air = minetest.find_node_near(pos, 1, {"air"}) @@ -218,12 +230,25 @@ minetest.register_on_dieplayer(function(player) player_inv:set_list(list_name, {}) end drop(pos, ItemStack("bones:bones")) + minetest.log("action", player_name .. " dies at " .. pos_string .. + ". Inventory dropped") + if bones_position_message then + minetest.chat_send_player(player_name, player_name .. " died at " .. pos_string .. + ", and dropped their inventory.") + end return end local param2 = minetest.dir_to_facedir(player:get_look_dir()) minetest.set_node(pos, {name = "bones:bones", param2 = param2}) + minetest.log("action", player_name .. " dies at " .. pos_string .. + ". Bones placed") + if bones_position_message then + minetest.chat_send_player(player_name, player_name .. " died at " .. pos_string .. + ", and bones were placed.") + end + local meta = minetest.get_meta(pos) local inv = meta:get_inventory() inv:set_size("main", 8 * 4) diff --git a/settingtypes.txt b/settingtypes.txt index 343d041d..4f930a8b 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -44,6 +44,9 @@ tnt_radius (TNT radius) int 3 0 # Setting this to 0 will disable sharing of bones completely. share_bones_time (Bone share time) int 1200 0 +# Inform player of condition and location of new bones. +bones_position_message (Inform player about bones) bool false + # Replaces old stairs with new ones. Only required for older worlds. enable_stairs_replace_abm (Replace old stairs) bool false From bcf76eab1d8ad4939a6c9e48b207ac083bccd651 Mon Sep 17 00:00:00 2001 From: Paramat Date: Mon, 4 Jun 2018 00:01:56 +0100 Subject: [PATCH 128/195] Settings: Add missing settings to settingtypes.txt Conf.example: Remove quotes from bones modes. Setting does not work if quotes are used. --- minetest.conf.example | 8 ++++---- settingtypes.txt | 13 ++++++++++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/minetest.conf.example b/minetest.conf.example index 08365e11..452251e1 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -8,10 +8,10 @@ #creative_mode = false # Sets the behaviour of the inventory items when a player dies. -# "bones": Store items in a bone node but drop items if inside protected area. -# "drop": Drop items on the ground. -# "keep": Player keeps items. -#bones_mode = "bones" +# bones: Store items in a bone node but drop items if inside protected area. +# drop: Drop items on the ground. +# keep: Player keeps items. +#bones_mode = bones # The time in seconds after which the bones of a dead player can be looted by # everyone. diff --git a/settingtypes.txt b/settingtypes.txt index 4f930a8b..7f6a12ba 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -39,10 +39,21 @@ enable_tnt (TNT) bool true # The radius in which nodes will be destroyed by a TNT explosion. tnt_radius (TNT radius) int 3 0 +# Sets the behaviour of the inventory items when a player dies. +# bones: Store items in a bone node but drop items if inside protected area. +# drop: Drop items on the ground. +# keep: Player keeps items. +bones_mode (Bones mode) enum bones bones,drop,keep + # The time in seconds after which the bones of a dead player can be looted # by everyone. # Setting this to 0 will disable sharing of bones completely. -share_bones_time (Bone share time) int 1200 0 +share_bones_time (Bones share time) int 1200 0 + +# How much earlier the bones of a dead player can be looted by +# everyone if the player dies in a protected area they don't own. +# 0 to disable. By default it is "share_bones_time" divide by four. +share_bones_time_early (Earlier bones share time) int 300 0 # Inform player of condition and location of new bones. bones_position_message (Inform player about bones) bool false From abe1b9f5598d8616ba7834372130acf6edbc035a Mon Sep 17 00:00:00 2001 From: Paramat Date: Thu, 7 Jun 2018 04:14:56 +0100 Subject: [PATCH 129/195] Spawn mod: Also reposition players on respawn To avoid respawn position being possibly very distant from new player spawn position. --- mods/spawn/init.lua | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/mods/spawn/init.lua b/mods/spawn/init.lua index ae8287f2..dc6366c1 100644 --- a/mods/spawn/init.lua +++ b/mods/spawn/init.lua @@ -106,19 +106,28 @@ local function search() end --- On new player spawn +-- On new player spawn and player respawn --- Search for new player spawn once per server session. If successful, store --- position and reposition new players, otherwise leave them at engine spawn +-- Search for spawn position once per server session. If successful, store +-- position and reposition players, otherwise leave them at engine spawn -- position. -minetest.register_on_newplayer(function(player) +local function on_spawn(player) if not searched then success = search() searched = true end - if success then - player:setpos(spawn_pos) + player:set_pos(spawn_pos) end +end + +minetest.register_on_newplayer(function(player) + on_spawn(player) +end) + +minetest.register_on_respawnplayer(function(player) + on_spawn(player) + + return true end) From e9fbd3d75df9f0a165b41b870df3fb4d3958f1c9 Mon Sep 17 00:00:00 2001 From: Ezhh Date: Fri, 15 Jun 2018 07:25:43 +0100 Subject: [PATCH 130/195] Add longer log schematics These use 'spawn_by' to avoid steep slopes. --- mods/default/mapgen.lua | 17 ++++++++++++++++- mods/default/schematics/acacia_log.mts | Bin 65 -> 55 bytes mods/default/schematics/apple_log.mts | Bin 90 -> 90 bytes mods/default/schematics/aspen_log.mts | Bin 118 -> 120 bytes mods/default/schematics/jungle_log.mts | Bin 96 -> 94 bytes mods/default/schematics/pine_log.mts | Bin 93 -> 93 bytes 6 files changed, 16 insertions(+), 1 deletion(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index e7914934..fdbe4a83 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1640,6 +1640,7 @@ function default.register_decorations() name = "default:apple_log", deco_type = "schematic", place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, sidelen = 16, noise_params = { offset = 0.0018, @@ -1655,6 +1656,8 @@ function default.register_decorations() schematic = minetest.get_modpath("default") .. "/schematics/apple_log.mts", flags = "place_center_x", rotation = "random", + spawn_by = "default:dirt_with_grass", + num_spawn_by = 8, }) -- Emergent jungle tree @@ -1705,7 +1708,8 @@ function default.register_decorations() minetest.register_decoration({ name = "default:jungle_log", deco_type = "schematic", - place_on = {"default:dirt_with_rainforest_litter", "default:dirt"}, + place_on = {"default:dirt_with_rainforest_litter"}, + place_offset_y = 1, sidelen = 80, fill_ratio = 0.005, biomes = {"rainforest", "rainforest_swamp"}, @@ -1714,6 +1718,8 @@ function default.register_decorations() schematic = minetest.get_modpath("default") .. "/schematics/jungle_log.mts", flags = "place_center_x", rotation = "random", + spawn_by = "default:dirt_with_rainforest_litter", + num_spawn_by = 8, }) -- Taiga and temperate coniferous forest pine tree, small pine tree and log @@ -1762,6 +1768,7 @@ function default.register_decorations() name = "default:pine_log", deco_type = "schematic", place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, + place_offset_y = 1, sidelen = 80, fill_ratio = 0.0018, biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, @@ -1770,6 +1777,8 @@ function default.register_decorations() schematic = minetest.get_modpath("default") .. "/schematics/pine_log.mts", flags = "place_center_x", rotation = "random", + spawn_by = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, + num_spawn_by = 8, }) -- Acacia tree and log @@ -1799,6 +1808,7 @@ function default.register_decorations() name = "default:acacia_log", deco_type = "schematic", place_on = {"default:dirt_with_dry_grass"}, + place_offset_y = 1, sidelen = 16, noise_params = { offset = 0, @@ -1814,6 +1824,8 @@ function default.register_decorations() schematic = minetest.get_modpath("default") .. "/schematics/acacia_log.mts", flags = "place_center_x", rotation = "random", + spawn_by = "default:dirt_with_dry_grass", + num_spawn_by = 8, }) -- Aspen tree and log @@ -1842,6 +1854,7 @@ function default.register_decorations() name = "default:aspen_log", deco_type = "schematic", place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, sidelen = 16, noise_params = { offset = 0.0, @@ -1857,6 +1870,8 @@ function default.register_decorations() schematic = minetest.get_modpath("default") .. "/schematics/aspen_log.mts", flags = "place_center_x", rotation = "random", + spawn_by = "default:dirt_with_grass", + num_spawn_by = 8, }) -- Large cactus diff --git a/mods/default/schematics/acacia_log.mts b/mods/default/schematics/acacia_log.mts index 037bca8c32152f0927ff027811e918e713872b91..aff3bd6add32084e3fd941c616b39bf598f1a41d 100644 GIT binary patch literal 55 zcmeYb3HD`RVPIuoWMHfZ62d8|X^EvdC02>aiOHFX@g+s6sTFgQ6B-zQ|N2!`EhoUh JAh3YR0sxNm5VQaQ delta 47 zcmXqa6!i@W_GMsUU}j)qV63kPlFW&jMHBfYg&COL3{nz0)^BH@WMgB)z&VxC6#&;n B3P1n= diff --git a/mods/default/schematics/apple_log.mts b/mods/default/schematics/apple_log.mts index e7ee8f2b84ab06165c4537cd4607ec56e3066608..3c1aae45042c79aca5fd426bd10aa4fcf41e6740 100644 GIT binary patch literal 90 zcmeYb3HD`RVPIuoVqmPVXJBUFNl8shEX^sgDk(}$WnfOsEMgE#%gHZKEh@IkEiKL{ u%FoY@Pb$hU&#Rb|oY27RrjWuk@!Qw0U%&D2eB$A;QDB(H!k~VgDHZ^$P#v=X literal 90 zcmeYb3HD`RVPFPA#`^kt5F;_Oh=C_1H7&6;r^KqHC^eNqEG;L$JhiCUDz~&aqbNT= qH$JH-zdWyEPI3YRvztLmLITt0N3Y*XK5^uclao{6WDtsDOalOtHXH!} diff --git a/mods/default/schematics/aspen_log.mts b/mods/default/schematics/aspen_log.mts index 180e6fd1be8b31d1578f057edd7e3fb3f321c5ed..d0c723d71d002232207e0d1e77c99903dd0cd564 100644 GIT binary patch delta 103 zcmXS`(DV%n_GMsUU}a!pV63kPvV>An(-KQ_N~{u#3sUpqONvrc8JH6@izYfqm@|l^ z<>Z&A78P6NmKJ9e<>%+d7p10D%t=mYV0KeTNlHjd*s^~8`t9in6Q-v>U}W5&!k}5n GR0jY|jv~?k delta 86 zcmb;@6Y~uT_GMsUUyH1XTluV26M@HiY{W=im6&@5-F1pwbr7GD4W delta 58 zcmaz`5c3TQ_GMsUUzjW0?~shE?T(7^1bkisirq7RFzm Date: Tue, 19 Jun 2018 23:07:01 +0200 Subject: [PATCH 131/195] Disallow digging a bed if in use Use a new table beds.bed_position to check if a bed is in use. --- game_api.txt | 1 + mods/beds/api.lua | 9 +++++++++ mods/beds/functions.lua | 11 +++++++++++ mods/beds/init.lua | 1 + 4 files changed, 22 insertions(+) diff --git a/game_api.txt b/game_api.txt index 86938f26..90594e8f 100644 --- a/game_api.txt +++ b/game_api.txt @@ -42,6 +42,7 @@ Beds API def -- See [#Bed definition] ) + * `beds.can_dig(bed_pos)` Returns a boolean whether the bed at `bed_pos` may be dug * `beds.read_spawns() ` Returns a table containing players respawn positions * `beds.kick_players()` Forces all players to leave bed * `beds.skip_night()` Sets world time to morning and saves respawn position of all players currently sleeping diff --git a/mods/beds/api.lua b/mods/beds/api.lua index 9349545a..ef07fc00 100644 --- a/mods/beds/api.lua +++ b/mods/beds/api.lua @@ -141,6 +141,9 @@ function beds.register_bed(name, def) minetest.set_node(newp, {name = name .. "_top", param2 = new_param2}) return true end, + can_dig = function(pos, player) + return beds.can_dig(pos) + end, }) minetest.register_node(name .. "_top", { @@ -160,6 +163,12 @@ function beds.register_bed(name, def) on_destruct = function(pos) destruct_bed(pos, 2) end, + can_dig = function(pos, player) + local node = minetest.get_node(pos) + local dir = minetest.facedir_to_dir(node.param2) + local p = vector.add(pos, dir) + return beds.can_dig(p) + end, }) minetest.register_alias(name, name .. "_bottom") diff --git a/mods/beds/functions.lua b/mods/beds/functions.lua index 099f41fe..88ae31e7 100644 --- a/mods/beds/functions.lua +++ b/mods/beds/functions.lua @@ -61,6 +61,7 @@ local function lay_down(player, pos, bed_pos, state, skip) local p = beds.pos[name] or nil if beds.player[name] ~= nil then beds.player[name] = nil + beds.bed_position[name] = nil player_in_bed = player_in_bed - 1 end -- skip here to prevent sending player specific changes (used for leaving players) @@ -83,6 +84,7 @@ local function lay_down(player, pos, bed_pos, state, skip) else beds.player[name] = 1 beds.pos[name] = pos + beds.bed_position[name] = bed_pos player_in_bed = player_in_bed + 1 -- physics, eye_offset, etc @@ -174,6 +176,15 @@ function beds.on_rightclick(pos, player) end end +function beds.can_dig(bed_pos) + -- Check all players in bed which one is at the expected position + for _, player_bed_pos in pairs(beds.bed_position) do + if vector.equals(bed_pos, player_bed_pos) then + return false + end + end + return true +end -- Callbacks -- Only register respawn callback if respawn enabled diff --git a/mods/beds/init.lua b/mods/beds/init.lua index 8b258901..6c4e0819 100644 --- a/mods/beds/init.lua +++ b/mods/beds/init.lua @@ -1,5 +1,6 @@ beds = {} beds.player = {} +beds.bed_position = {} beds.pos = {} beds.spawn = {} From 0ea6065a09f1fee014c7f2a9a36605d57986a209 Mon Sep 17 00:00:00 2001 From: Ezhh Date: Mon, 25 Jun 2018 21:28:39 +0100 Subject: [PATCH 132/195] Add butterflies mod --- mods/butterflies/README.txt | 14 ++ mods/butterflies/depends.txt | 2 + mods/butterflies/init.lua | 133 ++++++++++++++++++ mods/butterflies/license.txt | 58 ++++++++ .../textures/butterflies_butterfly_red.png | Bin 0 -> 110 bytes .../butterflies_butterfly_red_animated.png | Bin 0 -> 125 bytes .../textures/butterflies_butterfly_violet.png | Bin 0 -> 110 bytes .../butterflies_butterfly_violet_animated.png | Bin 0 -> 125 bytes .../textures/butterflies_butterfly_white.png | Bin 0 -> 110 bytes .../butterflies_butterfly_white_animated.png | Bin 0 -> 125 bytes 10 files changed, 207 insertions(+) create mode 100644 mods/butterflies/README.txt create mode 100644 mods/butterflies/depends.txt create mode 100644 mods/butterflies/init.lua create mode 100644 mods/butterflies/license.txt create mode 100644 mods/butterflies/textures/butterflies_butterfly_red.png create mode 100644 mods/butterflies/textures/butterflies_butterfly_red_animated.png create mode 100644 mods/butterflies/textures/butterflies_butterfly_violet.png create mode 100644 mods/butterflies/textures/butterflies_butterfly_violet_animated.png create mode 100644 mods/butterflies/textures/butterflies_butterfly_white.png create mode 100644 mods/butterflies/textures/butterflies_butterfly_white_animated.png diff --git a/mods/butterflies/README.txt b/mods/butterflies/README.txt new file mode 100644 index 00000000..a7f52a07 --- /dev/null +++ b/mods/butterflies/README.txt @@ -0,0 +1,14 @@ +Minetest Game mod: Butterflies +============================== +Adds butterflies to the world on mapgen, which can be caught in a net if the +fireflies mod is also enabled. + +Authors of source code +---------------------- +Shara RedCat (MIT) + +Authors of media (textures) +--------------------------- +Shara RedCat (CC BY-SA 3.0): + butterflies_butterfly_*.png + butterflies_butterfly_*_animated.png \ No newline at end of file diff --git a/mods/butterflies/depends.txt b/mods/butterflies/depends.txt new file mode 100644 index 00000000..df07aca3 --- /dev/null +++ b/mods/butterflies/depends.txt @@ -0,0 +1,2 @@ +default +flowers \ No newline at end of file diff --git a/mods/butterflies/init.lua b/mods/butterflies/init.lua new file mode 100644 index 00000000..008211ee --- /dev/null +++ b/mods/butterflies/init.lua @@ -0,0 +1,133 @@ +-- register butterflies +local butter_list = { + {"white", "White"}, + {"red", "Red"}, + {"violet", "Violet"} +} + +for i in ipairs (butter_list) do + local name = butter_list[i][1] + local desc = butter_list[i][2] + + minetest.register_node("butterflies:butterfly_"..name, { + description = desc.." Butterfly", + drawtype = "plantlike", + tiles = {{ + name = "butterflies_butterfly_"..name.."_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3 + }, + }}, + inventory_image = "butterflies_butterfly_"..name..".png", + wield_image = "butterflies_butterfly_"..name..".png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "butterflies:butterfly_"..name}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) < 11 then + minetest.set_node(pos, {name = "butterflies:hidden_butterfly_"..name}) + end + minetest.get_node_timer(pos):start(30) + end + }) + + minetest.register_node("butterflies:hidden_butterfly_"..name, { + description = "Hidden "..desc.." Butterfly", + drawtype = "airlike", + inventory_image = "insects_butterfly_"..name..".png", + wield_image = "insects_butterfly_"..name..".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "butterflies:hidden_butterfly_"..name}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) >= 11 then + minetest.set_node(pos, {name = "butterflies:butterfly_"..name}) + end + minetest.get_node_timer(pos):start(30) + end + }) +end + +-- register decoration +minetest.register_decoration({ + name = "butterflies:butterfly", + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 2, + sidelen = 80, + fill_ratio = 0.005, + biomes = {"grassland", "deciduous_forest", "floatland_grassland"}, + y_max = 31000, + y_min = 1, + decoration = { + "butterflies:butterfly_white", + "butterflies:butterfly_red", + "butterflies:butterfly_violet" + }, + spawn_by = "group:flower", + num_spawn_by = 1 +}) + +-- get decoration ID +local butterflies = minetest.get_decoration_id("butterflies:butterfly") +minetest.set_gen_notify({decoration = true}, {butterflies}) + +-- start nodetimers +minetest.register_on_generated(function(minp, maxp, blockseed) + local gennotify = minetest.get_mapgen_object("gennotify") + local poslist = {} + + for _, pos in ipairs(gennotify["decoration#"..butterflies] or {}) do + local deco_pos = {x = pos.x, y = pos.y + 3, z = pos.z} + table.insert(poslist, deco_pos) + end + + if #poslist ~= 0 then + for i = 1, #poslist do + local pos = poslist[i] + minetest.get_node_timer(pos):start(1) + end + end +end) diff --git a/mods/butterflies/license.txt b/mods/butterflies/license.txt new file mode 100644 index 00000000..eebdad63 --- /dev/null +++ b/mods/butterflies/license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (c) 2018 Shara RedCat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2018 Shara RedCat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file diff --git a/mods/butterflies/textures/butterflies_butterfly_red.png b/mods/butterflies/textures/butterflies_butterfly_red.png new file mode 100644 index 0000000000000000000000000000000000000000..8edfc3659c113f648b8efa5771c2731110e254c3 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|u0Z;FaPSgNt$)$s%0Lcd zNswPKgTu2MX+Vy!r;B3<$Ms|dHUldL&Sh*#QgTe~DWM4f DxxpD+ literal 0 HcmV?d00001 diff --git a/mods/butterflies/textures/butterflies_butterfly_red_animated.png b/mods/butterflies/textures/butterflies_butterfly_red_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..4a2097bd0447df99bbf0c6388fdf5e8124b86fdd GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0zllr#0(_se=}|bQk(%kA+A9BdT{U(POX2@;mSY` zV@Z%-FoVOh8)-m}lBbJfh{pM31qKO67GdV8jm#Yx3clw9$~BMFHlGM>Ryx2Ce1n;{ TOe@C&sG7mk)z4*}Q$iB}%%LCs literal 0 HcmV?d00001 diff --git a/mods/butterflies/textures/butterflies_butterfly_violet.png b/mods/butterflies/textures/butterflies_butterfly_violet.png new file mode 100644 index 0000000000000000000000000000000000000000..8b8c29ddf0edf7a2267a5ffb622b8bfe409962a7 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|u0Xm?XIC7gTe~DWM4f DkqH>G literal 0 HcmV?d00001 diff --git a/mods/butterflies/textures/butterflies_butterfly_violet_animated.png b/mods/butterflies/textures/butterflies_butterfly_violet_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..3f9d72e9fce79e261a27e5126b6dbfef4d548d42 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0zllr#0(_se=}|bQk(%kA+A8WO=nje!<029YLY+> zV@Z%-FoVOh8)-m}lBbJfh{pM31qKO67GdV8jm#Yx3clw9$~BMFHlGM>Ryx2Ce1n;{ TOe@C&sG7mk)z4*}Q$iB}ne!i0 literal 0 HcmV?d00001 diff --git a/mods/butterflies/textures/butterflies_butterfly_white.png b/mods/butterflies/textures/butterflies_butterfly_white.png new file mode 100644 index 0000000000000000000000000000000000000000..db4eaec81fd2e2c958f22a6623f316a331f95bfc GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|u0Z<#|NnRH+zH(qeG~V%8lDfAy0;L%|UHx3vIVCg! E0GjX|`~Uy| literal 0 HcmV?d00001 diff --git a/mods/butterflies/textures/butterflies_butterfly_white_animated.png b/mods/butterflies/textures/butterflies_butterfly_white_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..e7cada39a9bc439eb7501472c4ccc843cef1b096 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0zllr#0(_se=}|bQk(%kA+A9B|NsAw?_U0_cXbPp z!&nmJ7tG-B>_!@pqvYx07@~1LS%E>qkwut!Y9n(;hJx?;fO5?vwaq6&o0SeQ1m9rh UEz`>J0IFv2boFyt=akR{00r125C8xG literal 0 HcmV?d00001 From 0df2753a68f43e8e759e5c201183464e66d24449 Mon Sep 17 00:00:00 2001 From: Ezhh Date: Mon, 25 Jun 2018 21:29:24 +0100 Subject: [PATCH 133/195] Make hidden fireflies floodable --- mods/fireflies/init.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mods/fireflies/init.lua b/mods/fireflies/init.lua index ec1d7120..b9263c1a 100644 --- a/mods/fireflies/init.lua +++ b/mods/fireflies/init.lua @@ -25,9 +25,6 @@ minetest.register_node("fireflies:firefly", { }, light_source = 6, floodable = true, - on_flood = function(pos, oldnode, newnode) - minetest.add_item(pos, "fireflies:firefly 1") - end, on_place = function(itemstack, placer, pointed_thing) local player_name = placer:get_player_name() local pos = pointed_thing.above @@ -62,6 +59,7 @@ minetest.register_node("fireflies:hidden_firefly", { buildable_to = true, drop = "", groups = {not_in_creative_inventory = 1}, + floodable = true, on_place = function(itemstack, placer, pointed_thing) local player_name = placer:get_player_name() local pos = pointed_thing.above From 255031fc913cddf39ad9d11af09dad7c9ed09712 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 1 Jul 2018 21:44:03 +0200 Subject: [PATCH 134/195] Replace deprecated function calls --- mods/beds/functions.lua | 8 ++--- mods/beds/spawns.lua | 2 +- mods/boats/init.lua | 60 ++++++++++++++++++------------------ mods/bones/init.lua | 2 +- mods/bucket/init.lua | 2 +- mods/default/craftitems.lua | 4 +-- mods/default/item_entity.lua | 4 +-- mods/dungeon_loot/mapgen.lua | 2 +- mods/fire/init.lua | 2 +- mods/sethome/init.lua | 2 +- mods/stairs/init.lua | 2 +- mods/tnt/init.lua | 12 ++++---- 12 files changed, 51 insertions(+), 51 deletions(-) diff --git a/mods/beds/functions.lua b/mods/beds/functions.lua index 88ae31e7..32721cd4 100644 --- a/mods/beds/functions.lua +++ b/mods/beds/functions.lua @@ -69,7 +69,7 @@ local function lay_down(player, pos, bed_pos, state, skip) return end if p then - player:setpos(p) + player:set_pos(p) end -- physics, eye_offset, etc @@ -94,7 +94,7 @@ local function lay_down(player, pos, bed_pos, state, skip) local dir = minetest.facedir_to_dir(param2) local p = {x = bed_pos.x + dir.x / 2, y = bed_pos.y, z = bed_pos.z + dir.z / 2} player:set_physics_override(0, 0, 0) - player:setpos(p) + player:set_pos(p) default.player_attached[name] = true hud_flags.wielditem = false default.player_set_animation(player, "lay" , 0) @@ -139,7 +139,7 @@ end function beds.on_rightclick(pos, player) local name = player:get_player_name() - local ppos = player:getpos() + local ppos = player:get_pos() local tod = minetest.get_timeofday() if tod > 0.2 and tod < 0.805 then @@ -194,7 +194,7 @@ if enable_respawn then local name = player:get_player_name() local pos = beds.spawn[name] if pos then - player:setpos(pos) + player:set_pos(pos) return true end end) diff --git a/mods/beds/spawns.lua b/mods/beds/spawns.lua index 6b1f4041..baee364d 100644 --- a/mods/beds/spawns.lua +++ b/mods/beds/spawns.lua @@ -53,7 +53,7 @@ end function beds.set_spawns() for name,_ in pairs(beds.player) do local player = minetest.get_player_by_name(name) - local p = player:getpos() + local p = player:get_pos() -- but don't change spawn location if borrowing a bed if not minetest.is_protected(p, name) then beds.spawn[name] = p diff --git a/mods/boats/init.lua b/mods/boats/init.lua index 72ca478f..82722ee1 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -58,10 +58,10 @@ function boat.on_rightclick(self, clicker) clicker:set_detach() player_api.player_attached[name] = false player_api.set_animation(clicker, "stand" , 30) - local pos = clicker:getpos() + local pos = clicker:get_pos() pos = {x = pos.x, y = pos.y + 0.2, z = pos.z} minetest.after(0.1, function() - clicker:setpos(pos) + clicker:set_pos(pos) end) elseif not self.driver then local attach = clicker:get_attach() @@ -79,7 +79,7 @@ function boat.on_rightclick(self, clicker) minetest.after(0.2, function() player_api.set_animation(clicker, "sit" , 30) end) - clicker:set_look_horizontal(self.object:getyaw()) + clicker:set_look_horizontal(self.object:get_yaw()) end end @@ -116,7 +116,7 @@ function boat.on_punch(self, puncher) local leftover = inv:add_item("main", "boats:boat") -- if no room in inventory add a replacement boat to the world if not leftover:is_empty() then - minetest.add_item(self.object:getpos(), leftover) + minetest.add_item(self.object:get_pos(), leftover) end end -- delay remove to ensure player is detached @@ -128,10 +128,10 @@ end function boat.on_step(self, dtime) - self.v = get_v(self.object:getvelocity()) * get_sign(self.v) + self.v = get_v(self.object:get_velocity()) * get_sign(self.v) if self.driver then local ctrl = self.driver:get_player_control() - local yaw = self.object:getyaw() + local yaw = self.object:get_yaw() if ctrl.up then self.v = self.v + 0.1 elseif ctrl.down then @@ -139,27 +139,27 @@ function boat.on_step(self, dtime) end if ctrl.left then if self.v < 0 then - self.object:setyaw(yaw - (1 + dtime) * 0.03) + self.object:set_yaw(yaw - (1 + dtime) * 0.03) else - self.object:setyaw(yaw + (1 + dtime) * 0.03) + self.object:set_yaw(yaw + (1 + dtime) * 0.03) end elseif ctrl.right then if self.v < 0 then - self.object:setyaw(yaw + (1 + dtime) * 0.03) + self.object:set_yaw(yaw + (1 + dtime) * 0.03) else - self.object:setyaw(yaw - (1 + dtime) * 0.03) + self.object:set_yaw(yaw - (1 + dtime) * 0.03) end end end - local velo = self.object:getvelocity() + local velo = self.object:get_velocity() if self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then - self.object:setpos(self.object:getpos()) + self.object:set_pos(self.object:get_pos()) return end local s = get_sign(self.v) self.v = self.v - 0.02 * s if s ~= get_sign(self.v) then - self.object:setvelocity({x = 0, y = 0, z = 0}) + self.object:set_velocity({x = 0, y = 0, z = 0}) self.v = 0 return end @@ -167,7 +167,7 @@ function boat.on_step(self, dtime) self.v = 5 * get_sign(self.v) end - local p = self.object:getpos() + local p = self.object:get_pos() p.y = p.y - 0.5 local new_velo local new_acce = {x = 0, y = 0, z = 0} @@ -179,13 +179,13 @@ function boat.on_step(self, dtime) else new_acce = {x = 0, y = -9.8, z = 0} end - new_velo = get_velocity(self.v, self.object:getyaw(), - self.object:getvelocity().y) - self.object:setpos(self.object:getpos()) + new_velo = get_velocity(self.v, self.object:get_yaw(), + self.object:get_velocity().y) + self.object:set_pos(self.object:get_pos()) else p.y = p.y + 1 if is_water(p) then - local y = self.object:getvelocity().y + local y = self.object:get_velocity().y if y >= 5 then y = 5 elseif y < 0 then @@ -193,24 +193,24 @@ function boat.on_step(self, dtime) else new_acce = {x = 0, y = 5, z = 0} end - new_velo = get_velocity(self.v, self.object:getyaw(), y) - self.object:setpos(self.object:getpos()) + new_velo = get_velocity(self.v, self.object:get_yaw(), y) + self.object:set_pos(self.object:get_pos()) else new_acce = {x = 0, y = 0, z = 0} - if math.abs(self.object:getvelocity().y) < 1 then - local pos = self.object:getpos() + if math.abs(self.object:get_velocity().y) < 1 then + local pos = self.object:get_pos() pos.y = math.floor(pos.y) + 0.5 - self.object:setpos(pos) - new_velo = get_velocity(self.v, self.object:getyaw(), 0) + self.object:set_pos(pos) + new_velo = get_velocity(self.v, self.object:get_yaw(), 0) else - new_velo = get_velocity(self.v, self.object:getyaw(), - self.object:getvelocity().y) - self.object:setpos(self.object:getpos()) + new_velo = get_velocity(self.v, self.object:get_yaw(), + self.object:get_velocity().y) + self.object:set_pos(self.object:get_pos()) end end end - self.object:setvelocity(new_velo) - self.object:setacceleration(new_acce) + self.object:set_velocity(new_velo) + self.object:set_acceleration(new_acce) end @@ -246,7 +246,7 @@ minetest.register_craftitem("boats:boat", { boat = minetest.add_entity(pointed_thing.under, "boats:boat") if boat then if placer then - boat:setyaw(placer:get_look_horizontal()) + boat:set_yaw(placer:get_look_horizontal()) end local player_name = placer and placer:get_player_name() or "" if not (creative and creative.is_enabled_for and diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 480a55c4..0043118d 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -159,7 +159,7 @@ end local drop = function(pos, itemstack) local obj = minetest.add_item(pos, itemstack:take_item(itemstack:get_count())) if obj then - obj:setvelocity({ + obj:set_velocity({ x = math.random(-10, 10) / 9, y = 5, z = math.random(-10, 10) / 9, diff --git a/mods/bucket/init.lua b/mods/bucket/init.lua index 9c1481ef..1d37cb42 100644 --- a/mods/bucket/init.lua +++ b/mods/bucket/init.lua @@ -148,7 +148,7 @@ minetest.register_craftitem("bucket:bucket_empty", { if inv:room_for_item("main", {name=liquiddef.itemname}) then inv:add_item("main", liquiddef.itemname) else - local pos = user:getpos() + local pos = user:get_pos() pos.y = math.floor(pos.y + 0.5) minetest.add_item(pos, liquiddef.itemname) end diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index e1d224d1..6c079349 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -121,7 +121,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if inv:room_for_item("main", new_stack) then inv:add_item("main", new_stack) else - minetest.add_item(player:getpos(), new_stack) + minetest.add_item(player:get_pos(), new_stack) end else stack:get_meta():from_table({ fields = data }) @@ -247,7 +247,7 @@ minetest.register_craftitem("default:skeleton_key", { itemstack = new_stack else if inv:add_item("main", new_stack):get_count() > 0 then - minetest.add_item(user:getpos(), new_stack) + minetest.add_item(user:get_pos(), new_stack) end -- else: added to inventory successfully end diff --git a/mods/default/item_entity.lua b/mods/default/item_entity.lua index c34e60e9..2a61f08e 100644 --- a/mods/default/item_entity.lua +++ b/mods/default/item_entity.lua @@ -16,7 +16,7 @@ local item = { burn_up = function(self) -- disappear in a smoke puff self.object:remove() - local p = self.object:getpos() + local p = self.object:get_pos() minetest.sound_play("default_item_smoke", { pos = p, max_hear_distance = 8, @@ -48,7 +48,7 @@ local item = { if self.ignite_timer > 10 then self.ignite_timer = 0 - local node = minetest.get_node_or_nil(self.object:getpos()) + local node = minetest.get_node_or_nil(self.object:get_pos()) if not node then return end diff --git a/mods/dungeon_loot/mapgen.lua b/mods/dungeon_loot/mapgen.lua index 1e463450..c6a45094 100644 --- a/mods/dungeon_loot/mapgen.lua +++ b/mods/dungeon_loot/mapgen.lua @@ -1,7 +1,7 @@ minetest.set_gen_notify({dungeon = true, temple = true}) local function noise3d_integer(noise, pos) - return math.abs(math.floor(noise:get3d(pos) * 0x7fffffff)) + return math.abs(math.floor(noise:get_3d(pos) * 0x7fffffff)) end local function random_sample(rand, list, count) diff --git a/mods/fire/init.lua b/mods/fire/init.lua index f97636b5..dfe6dd12 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -169,7 +169,7 @@ if flame_sound then function fire.update_player_sound(player) local player_name = player:get_player_name() -- Search for flame nodes in radius around player - local ppos = player:getpos() + local ppos = player:get_pos() local areamin = vector.subtract(ppos, radius) local areamax = vector.add(ppos, radius) local fpos, num = minetest.find_nodes_in_area( diff --git a/mods/sethome/init.lua b/mods/sethome/init.lua index 7f1ebced..4563381d 100644 --- a/mods/sethome/init.lua +++ b/mods/sethome/init.lua @@ -89,7 +89,7 @@ minetest.register_chatcommand("sethome", { func = function(name) name = name or "" -- fallback to blank name if nil local player = minetest.get_player_by_name(name) - if player and sethome.set(name, player:getpos()) then + if player and sethome.set(name, player:get_pos()) then return true, "Home set!" end return false, "Player not found!" diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 4b31540d..f6511187 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -23,7 +23,7 @@ local function rotate_and_place(itemstack, placer, pointed_thing) local param2 = 0 if placer then - local placer_pos = placer:getpos() + local placer_pos = placer:get_pos() if placer_pos then param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) end diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 26a4d696..3efc6ec0 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -58,8 +58,8 @@ local function eject_drops(drops, pos, radius) local obj = minetest.add_item(drop_pos, dropitem) if obj then obj:get_luaentity().collect = true - obj:setacceleration({x = 0, y = -10, z = 0}) - obj:setvelocity({x = math.random(-3, 3), + obj:set_acceleration({x = 0, y = -10, z = 0}) + obj:set_velocity({x = math.random(-3, 3), y = math.random(0, 10), z = math.random(-3, 3)}) end @@ -152,7 +152,7 @@ end local function entity_physics(pos, radius, drops) local objs = minetest.get_objects_inside_radius(pos, radius) for _, obj in pairs(objs) do - local obj_pos = obj:getpos() + local obj_pos = obj:get_pos() local dist = math.max(1, vector.distance(pos, obj_pos)) local damage = (4 / dist) * radius @@ -164,7 +164,7 @@ local function entity_physics(pos, radius, drops) local moveoff = vector.multiply(dir, dist + 1.0) local newpos = vector.add(pos, moveoff) newpos = vector.add(newpos, {x = 0, y = 0.2, z = 0}) - obj:setpos(newpos) + obj:set_pos(newpos) obj:set_hp(obj:get_hp() - damage) else @@ -179,8 +179,8 @@ local function entity_physics(pos, radius, drops) end if do_knockback then - local obj_vel = obj:getvelocity() - obj:setvelocity(calc_velocity(pos, obj_pos, + local obj_vel = obj:get_velocity() + obj:set_velocity(calc_velocity(pos, obj_pos, obj_vel, radius * 10)) end if do_damage then From 876a9ca5d22b337b8f5d12d1325fbd1280a0bacb Mon Sep 17 00:00:00 2001 From: beyondlimits Date: Tue, 3 Jul 2018 20:50:16 +0200 Subject: [PATCH 135/195] Beds: Fix input checking for "Force night skip" --- mods/beds/functions.lua | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/mods/beds/functions.lua b/mods/beds/functions.lua index 32721cd4..18d96e77 100644 --- a/mods/beds/functions.lua +++ b/mods/beds/functions.lua @@ -219,16 +219,25 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if formname ~= "beds_form" then return end + + -- Because "Force night skip" button is a button_exit, it will set fields.quit + -- and lay_down call will change value of player_in_bed, so it must be taken + -- earlier. + local last_player_in_bed = player_in_bed + if fields.quit or fields.leave then lay_down(player, nil, nil, false) update_formspecs(false) end if fields.force then - update_formspecs(is_night_skip_enabled()) - if is_night_skip_enabled() then + local is_majority = (#minetest.get_connected_players() / 2) < last_player_in_bed + if is_majority and is_night_skip_enabled() then + update_formspecs(true) beds.skip_night() beds.kick_players() + else + update_formspecs(false) end end end) From 59dbeebc2f282f85be5d1135aa70c6c2f36d8376 Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 3 Jul 2018 19:52:28 +0100 Subject: [PATCH 136/195] Boats: Add cruise mode (boat autoforward) Document controls in README.txt. Optimise 'get yaw' and 'set yaw' code. --- mods/boats/README.txt | 16 ++++++++++++++++ mods/boats/init.lua | 29 +++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/mods/boats/README.txt b/mods/boats/README.txt index 59631d9d..a2ccb485 100644 --- a/mods/boats/README.txt +++ b/mods/boats/README.txt @@ -13,3 +13,19 @@ Textures: Zeg9 (CC BY-SA 3.0) Model: thetoon and Zeg9 (CC BY-SA 3.0), modified by PavelS(SokolovPavel) (CC BY-SA 3.0), modified by sofar (CC BY-SA 3.0) + +Controls +-------- +Right mouse button = Enter or exit boat when pointing at boat. +Forward = Speed up. + Slow down when moving backwards. +Forward + backward = Enable cruise mode: Boat will accelerate to maximum forward + speed and remain at that speed without needing to hold the + forward key. +Backward = Slow down. + Speed up when moving backwards. + Disable cruise mode. +Left = Turn to the left. + Turn to the right when moving backwards. +Right = Turn to the right. + Turn to the left when moving backwards. diff --git a/mods/boats/init.lua b/mods/boats/init.lua index 82722ee1..3d781b73 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -44,7 +44,8 @@ local boat = { driver = nil, v = 0, last_v = 0, - removed = false + removed = false, + auto = false } @@ -55,6 +56,7 @@ function boat.on_rightclick(self, clicker) local name = clicker:get_player_name() if self.driver and clicker == self.driver then self.driver = nil + self.auto = false clicker:set_detach() player_api.player_attached[name] = false player_api.set_animation(clicker, "stand" , 30) @@ -130,24 +132,35 @@ end function boat.on_step(self, dtime) self.v = get_v(self.object:get_velocity()) * get_sign(self.v) if self.driver then + local driver_name = self.driver:get_player_name() local ctrl = self.driver:get_player_control() - local yaw = self.object:get_yaw() - if ctrl.up then - self.v = self.v + 0.1 + if ctrl.up and ctrl.down then + if not self.auto then + self.auto = true + minetest.chat_send_player(driver_name, + "[boats] Cruise on") + end elseif ctrl.down then self.v = self.v - 0.1 + if self.auto then + self.auto = false + minetest.chat_send_player(driver_name, + "[boats] Cruise off") + end + elseif ctrl.up or self.auto then + self.v = self.v + 0.1 end if ctrl.left then if self.v < 0 then - self.object:set_yaw(yaw - (1 + dtime) * 0.03) + self.object:set_yaw(self.object:get_yaw() - (1 + dtime) * 0.03) else - self.object:set_yaw(yaw + (1 + dtime) * 0.03) + self.object:set_yaw(self.object:get_yaw() + (1 + dtime) * 0.03) end elseif ctrl.right then if self.v < 0 then - self.object:set_yaw(yaw + (1 + dtime) * 0.03) + self.object:set_yaw(self.object:get_yaw() + (1 + dtime) * 0.03) else - self.object:set_yaw(yaw - (1 + dtime) * 0.03) + self.object:set_yaw(self.object:get_yaw() - (1 + dtime) * 0.03) end end end From ecea5364f1bf0e1e6dd553c52c4122affd006c39 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sat, 7 Jul 2018 03:08:36 +0200 Subject: [PATCH 137/195] Update carts from boost_cart Better pathfinder algorithm, allows tuning the lag spike compensation. Smoother movement (when it's laggy). Set the player animation to stand on attach. Remove driver when they leave. Only update velocity when it's necessary. --- mods/carts/cart_entity.lua | 54 ++++++++++++++++++++++++++++---------- mods/carts/functions.lua | 48 ++++++++++++++++++++++----------- mods/carts/init.lua | 2 ++ 3 files changed, 74 insertions(+), 30 deletions(-) diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua index 434ea943..38337dbc 100644 --- a/mods/carts/cart_entity.lua +++ b/mods/carts/cart_entity.lua @@ -27,6 +27,10 @@ function cart_entity:on_rightclick(clicker) elseif not self.driver then self.driver = player_name carts:manage_attachment(clicker, self.object) + + -- player_api does not update the animation + -- when the player is attached, reset to default animation + player_api.set_animation(clicker, "stand") end end @@ -36,7 +40,7 @@ function cart_entity:on_activate(staticdata, dtime_s) return end local data = minetest.deserialize(staticdata) - if not data or type(data) ~= "table" then + if type(data) ~= "table" then return end self.railtype = data.railtype @@ -52,6 +56,13 @@ function cart_entity:get_staticdata() }) end +-- 0.5.x and later: When the driver leaves +function cart_entity:on_detach_child(child) + if child and child:get_player_name() == self.driver then + self.driver = nil + end +end + function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) local pos = self.object:get_pos() local vel = self.object:get_velocity() @@ -82,7 +93,7 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, local player = minetest.get_player_by_name(self.driver) carts:manage_attachment(player, nil) end - for _,obj_ in ipairs(self.attached_items) do + for _, obj_ in ipairs(self.attached_items) do if obj_ then obj_:set_detach() end @@ -165,6 +176,7 @@ local function get_railparams(pos) return carts.railparams[node.name] or {} end +local v3_len = vector.length local function rail_on_step(self, dtime) local vel = self.object:get_velocity() if self.punched then @@ -201,17 +213,23 @@ local function rail_on_step(self, dtime) local stop_wiggle = false if self.old_pos and same_dir then - -- Detection for "skipping" nodes - local found_path = carts:pathfinder( - pos, self.old_pos, self.old_dir, ctrl, self.old_switch, self.railtype + -- Detection for "skipping" nodes (perhaps use average dtime?) + -- It's sophisticated enough to take the acceleration in account + local acc = self.object:get_acceleration() + local distance = dtime * (v3_len(vel) + 0.5 * dtime * v3_len(acc)) + + local new_pos, new_dir = carts:pathfinder( + pos, self.old_pos, self.old_dir, distance, ctrl, + self.old_switch, self.railtype ) - if not found_path then - -- No rail found: reset back to the expected position - pos = vector.new(self.old_pos) + if new_pos then + -- No rail found: set to the expected position + pos = new_pos update.pos = true + cart_dir = new_dir end - elseif self.old_pos and cart_dir.y ~= -1 and not self.punched then + elseif self.old_pos and self.old_dir.y ~= 1 and not self.punched then -- Stop wiggle stop_wiggle = true end @@ -223,12 +241,14 @@ local function rail_on_step(self, dtime) local dir, switch_keys = carts:get_rail_direction( pos, cart_dir, ctrl, self.old_switch, self.railtype ) + local dir_changed = not vector.equals(dir, self.old_dir) local new_acc = {x=0, y=0, z=0} if stop_wiggle or vector.equals(dir, {x=0, y=0, z=0}) then vel = {x = 0, y = 0, z = 0} local pos_r = vector.round(pos) - if not carts:is_rail(pos_r, self.railtype) then + if not carts:is_rail(pos_r, self.railtype) + and self.old_pos then pos = self.old_pos elseif not stop_wiggle then pos = pos_r @@ -239,7 +259,7 @@ local function rail_on_step(self, dtime) update.vel = true else -- Direction change detected - if not vector.equals(dir, self.old_dir) then + if dir_changed then vel = vector.multiply(dir, math.abs(vel.x + vel.z)) update.vel = true if dir.y ~= self.old_dir.y then @@ -291,7 +311,7 @@ local function rail_on_step(self, dtime) end self.object:set_acceleration(new_acc) - self.old_pos = vector.new(pos) + self.old_pos = vector.round(pos) if not vector.equals(dir, {x=0, y=0, z=0}) and not stop_wiggle then self.old_dir = vector.new(dir) end @@ -338,9 +358,15 @@ local function rail_on_step(self, dtime) end self.object:set_animation(anim, 1, 0) - self.object:set_velocity(vel) + if update.vel then + self.object:set_velocity(vel) + end if update.pos then - self.object:set_pos(pos) + if dir_changed then + self.object:set_pos(pos) + else + self.object:move_to(pos) + end end -- call event handler diff --git a/mods/carts/functions.lua b/mods/carts/functions.lua index 8408cc1a..a54b5948 100644 --- a/mods/carts/functions.lua +++ b/mods/carts/functions.lua @@ -99,6 +99,16 @@ function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) right.z = -dir.x end + local straight_priority = ctrl and dir.y ~= 0 + + -- Normal, to disallow rail switching up- & downhill + if straight_priority then + cur = self:check_front_up_down(pos, dir, true, railtype) + if cur then + return cur + end + end + if ctrl then if old_switch == 1 then left_check = false @@ -106,14 +116,14 @@ function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) right_check = false end if ctrl.left and left_check then - cur = carts:check_front_up_down(pos, left, false, railtype) + cur = self:check_front_up_down(pos, left, false, railtype) if cur then return cur, 1 end left_check = false end if ctrl.right and right_check then - cur = carts:check_front_up_down(pos, right, false, railtype) + cur = self:check_front_up_down(pos, right, false, railtype) if cur then return cur, 2 end @@ -122,9 +132,11 @@ function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) end -- Normal - cur = carts:check_front_up_down(pos, dir, true, railtype) - if cur then - return cur + if not straight_priority then + cur = self:check_front_up_down(pos, dir, true, railtype) + if cur then + return cur + end end -- Left, if not already checked @@ -158,33 +170,37 @@ function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) return {x=0, y=0, z=0} end -function carts:pathfinder(pos_, old_pos, old_dir, ctrl, pf_switch, railtype) - if vector.equals(old_pos, pos_) then - return true - end +function carts:pathfinder(pos_, old_pos, old_dir, distance, ctrl, + pf_switch, railtype) local pos = vector.round(pos_) + if vector.equals(old_pos, pos) then + return + end + local pf_pos = vector.round(old_pos) local pf_dir = vector.new(old_dir) + distance = math.min(carts.path_distance_max, + math.floor(distance + 1)) - for i = 1, 3 do - pf_dir, pf_switch = carts:get_rail_direction( - pf_pos, pf_dir, ctrl, pf_switch, railtype) + for i = 1, distance do + pf_dir, pf_switch = self:get_rail_direction( + pf_pos, pf_dir, ctrl, pf_switch or 0, railtype) if vector.equals(pf_dir, {x=0, y=0, z=0}) then -- No way forwards - return false + return pf_pos, pf_dir end pf_pos = vector.add(pf_pos, pf_dir) if vector.equals(pf_pos, pos) then -- Success! Cart moved on correctly - return true + return end end - -- Cart not found - return false + -- Not found. Put cart to predicted position + return pf_pos, pf_dir end function carts:register_rail(name, def_overwrite, railparams) diff --git a/mods/carts/init.lua b/mods/carts/init.lua index b2ba5f37..fe45303a 100644 --- a/mods/carts/init.lua +++ b/mods/carts/init.lua @@ -7,6 +7,8 @@ carts.railparams = {} carts.speed_max = 7 -- Set to -1 to disable punching the cart from inside (min = -1) carts.punch_speed_max = 5 +-- Maximal distance for the path correction (for dtime peaks) +carts.path_distance_max = 3 dofile(carts.modpath.."/functions.lua") From 7e1b07fdddae7a397d82d446d4a37577c1527b7b Mon Sep 17 00:00:00 2001 From: TumeniNodes Date: Sat, 7 Jul 2018 14:03:33 -0400 Subject: [PATCH 138/195] Add fence rails Dedicated fence rail textures coming in a follow-up PR. --- mods/default/crafting.lua | 31 ++++++ mods/default/functions.lua | 67 ++++++++++++- mods/default/nodes.lua | 90 ++++++++++++++++-- .../textures/default_fence_rail_overlay.png | Bin 0 -> 141 bytes mods/walls/init.lua | 2 +- 5 files changed, 178 insertions(+), 12 deletions(-) create mode 100644 mods/default/textures/default_fence_rail_overlay.png diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index 428c0f45..c0f2252f 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -1015,6 +1015,37 @@ minetest.register_craft({ }) +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_aspen_wood", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_pine_wood", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_wood", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_acacia_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_junglewood", + burntime = 7, +}) + + minetest.register_craft({ type = "fuel", recipe = "default:bush_stem", diff --git a/mods/default/functions.lua b/mods/default/functions.lua index d43ab7b9..5dd0d2c8 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -303,7 +303,7 @@ function default.register_fence(name, def) connect_right = {{1/8,3/16,-1/16,1/2,5/16,1/16}, {1/8,-5/16,-1/16,1/2,-3/16,1/16}}, }, - connects_to = {"group:fence", "group:wood", "group:tree"}, + connects_to = {"group:fence", "group:wood", "group:tree", "group:wall"}, inventory_image = fence_texture, wield_image = fence_texture, tiles = {def.texture}, @@ -327,6 +327,71 @@ function default.register_fence(name, def) end +-- +-- Fence rail registration helper +-- + +function default.register_fence_rail(name, def) + minetest.register_craft({ + output = name .. " 16", + recipe = { + { def.material, def.material }, + { "", ""}, + { def.material, def.material }, + } + }) + + local fence_rail_texture = "default_fence_rail_overlay.png^" .. def.texture .. + "^default_fence_rail_overlay.png^[makealpha:255,126,126" + -- Allow almost everything to be overridden + local default_fields = { + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = { + {-1/16, 3/16, -1/16, 1/16, 5/16, 1/16}, + {-1/16, -3/16, -1/16, 1/16, -5/16, 1/16} + }, + -- connect_top = + -- connect_bottom = + connect_front = { + {-1/16, 3/16, -1/2, 1/16, 5/16, -1/16}, + {-1/16, -5/16, -1/2, 1/16, -3/16, -1/16}}, + connect_left = { + {-1/2, 3/16, -1/16, -1/16, 5/16, 1/16}, + {-1/2, -5/16, -1/16, -1/16, -3/16, 1/16}}, + connect_back = { + {-1/16, 3/16, 1/16, 1/16, 5/16, 1/2}, + {-1/16, -5/16, 1/16, 1/16, -3/16, 1/2}}, + connect_right = { + {1/16, 3/16, -1/16, 1/2, 5/16, 1/16}, + {1/16, -5/16, -1/16, 1/2, -3/16, 1/16}}, + }, + connects_to = {"group:fence", "group:wood", "group:tree", "group:wall"}, + inventory_image = fence_rail_texture, + wield_image = fence_rail_texture, + tiles = {def.texture}, + sunlight_propagates = true, + is_ground_content = false, + groups = {}, + } + for k, v in pairs(default_fields) do + if def[k] == nil then + def[k] = v + end + end + + -- Always add to the fence group, even if no group provided + def.groups.fence = 1 + + def.texture = nil + def.material = nil + + minetest.register_node(name, def) +end + + -- -- Leafdecay -- diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 6b0785e2..2ef3b93b 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -2590,8 +2590,10 @@ minetest.register_node("default:ladder_steel", { default.register_fence("default:fence_wood", { description = "Apple Wood Fence", texture = "default_fence_wood.png", - inventory_image = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126", - wield_image = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + inventory_image = "default_fence_overlay.png^default_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", material = "default:wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() @@ -2600,8 +2602,10 @@ default.register_fence("default:fence_wood", { default.register_fence("default:fence_acacia_wood", { description = "Acacia Wood Fence", texture = "default_fence_acacia_wood.png", - inventory_image = "default_fence_overlay.png^default_acacia_wood.png^default_fence_overlay.png^[makealpha:255,126,126", - wield_image = "default_fence_overlay.png^default_acacia_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + inventory_image = "default_fence_overlay.png^default_acacia_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_acacia_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", material = "default:acacia_wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() @@ -2610,8 +2614,10 @@ default.register_fence("default:fence_acacia_wood", { default.register_fence("default:fence_junglewood", { description = "Jungle Wood Fence", texture = "default_fence_junglewood.png", - inventory_image = "default_fence_overlay.png^default_junglewood.png^default_fence_overlay.png^[makealpha:255,126,126", - wield_image = "default_fence_overlay.png^default_junglewood.png^default_fence_overlay.png^[makealpha:255,126,126", + inventory_image = "default_fence_overlay.png^default_junglewood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_junglewood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", material = "default:junglewood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() @@ -2620,8 +2626,10 @@ default.register_fence("default:fence_junglewood", { default.register_fence("default:fence_pine_wood", { description = "Pine Wood Fence", texture = "default_fence_pine_wood.png", - inventory_image = "default_fence_overlay.png^default_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126", - wield_image = "default_fence_overlay.png^default_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + inventory_image = "default_fence_overlay.png^default_pine_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_pine_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", material = "default:pine_wood", groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, sounds = default.node_sound_wood_defaults() @@ -2630,13 +2638,75 @@ default.register_fence("default:fence_pine_wood", { default.register_fence("default:fence_aspen_wood", { description = "Aspen Wood Fence", texture = "default_fence_aspen_wood.png", - inventory_image = "default_fence_overlay.png^default_aspen_wood.png^default_fence_overlay.png^[makealpha:255,126,126", - wield_image = "default_fence_overlay.png^default_aspen_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + inventory_image = "default_fence_overlay.png^default_aspen_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_aspen_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", material = "default:aspen_wood", groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, sounds = default.node_sound_wood_defaults() }) +default.register_fence_rail("default:fence_rail_wood", { + description = "Apple Wood Fence Rail", + texture = "default_wood.png", + inventory_image = "default_fence_rail_overlay.png^default_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_acacia_wood", { + description = "Acacia Wood Fence Rail", + texture = "default_acacia_wood.png", + inventory_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:acacia_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_junglewood", { + description = "Jungle Wood Fence Rail", + texture = "default_junglewood.png", + inventory_image = "default_fence_rail_overlay.png^default_junglewood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_junglewood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:junglewood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_pine_wood", { + description = "Pine Wood Fence Rail", + texture = "default_pine_wood.png", + inventory_image = "default_fence_rail_overlay.png^default_pine_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_pine_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:pine_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_aspen_wood", { + description = "Aspen Wood Fence Rail", + texture = "default_aspen_wood.png", + inventory_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:aspen_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + minetest.register_node("default:glass", { description = "Glass", drawtype = "glasslike_framed_optional", diff --git a/mods/default/textures/default_fence_rail_overlay.png b/mods/default/textures/default_fence_rail_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..4da47aecf1e334627c721be3a72123cb12c7c0c4 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMVWnp1v1hN?z{{R2a!~|mg z|MLgP{s%;VfaIV5b#(_dn)rYcj3q&S!3+-1ZlnP@;+`&!Asp9}Z}776R7glm9B7a} dxL~Fp!!#vNUbiLR6M#w>JYD@<);T3K0RXa;E`$I8 literal 0 HcmV?d00001 diff --git a/mods/walls/init.lua b/mods/walls/init.lua index bee8e465..564d6df0 100644 --- a/mods/walls/init.lua +++ b/mods/walls/init.lua @@ -14,7 +14,7 @@ walls.register = function(wall_name, wall_desc, wall_texture, wall_mat, wall_sou connect_back = {{-3/16, -1/2, 1/4, 3/16, 3/8, 1/2}}, connect_right = {{ 1/4, -1/2, -3/16, 1/2, 3/8, 3/16}}, }, - connects_to = { "group:wall", "group:stone" }, + connects_to = { "group:wall", "group:stone", "group:fence" }, paramtype = "light", is_ground_content = false, tiles = { wall_texture, }, From 5c8bd349577f3967ab541a5da7f3a5f6f2ff5971 Mon Sep 17 00:00:00 2001 From: Paramat Date: Sat, 7 Jul 2018 21:00:31 +0100 Subject: [PATCH 139/195] Boats: Properly use 'dtime' for consistent responsiveness Previously, boat responsiveness varied greatly depending on server lag and singleplayer / multiplayer. 'dtime' is the time from the last execution of the boat entity 'on step' function, so must multiply acceleration and yaw change. Retune acceleration, turn rate and drift deceleration. Make reversed turn only happen with significant backwards speed. --- mods/boats/init.lua | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mods/boats/init.lua b/mods/boats/init.lua index 3d781b73..da0f463d 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -141,26 +141,26 @@ function boat.on_step(self, dtime) "[boats] Cruise on") end elseif ctrl.down then - self.v = self.v - 0.1 + self.v = self.v - dtime * 1.8 if self.auto then self.auto = false minetest.chat_send_player(driver_name, "[boats] Cruise off") end elseif ctrl.up or self.auto then - self.v = self.v + 0.1 + self.v = self.v + dtime * 1.8 end if ctrl.left then - if self.v < 0 then - self.object:set_yaw(self.object:get_yaw() - (1 + dtime) * 0.03) + if self.v < -0.001 then + self.object:set_yaw(self.object:get_yaw() - dtime * 0.9) else - self.object:set_yaw(self.object:get_yaw() + (1 + dtime) * 0.03) + self.object:set_yaw(self.object:get_yaw() + dtime * 0.9) end elseif ctrl.right then - if self.v < 0 then - self.object:set_yaw(self.object:get_yaw() + (1 + dtime) * 0.03) + if self.v < -0.001 then + self.object:set_yaw(self.object:get_yaw() + dtime * 0.9) else - self.object:set_yaw(self.object:get_yaw() - (1 + dtime) * 0.03) + self.object:set_yaw(self.object:get_yaw() - dtime * 0.9) end end end @@ -170,7 +170,7 @@ function boat.on_step(self, dtime) return end local s = get_sign(self.v) - self.v = self.v - 0.02 * s + self.v = self.v - dtime * 0.6 * s if s ~= get_sign(self.v) then self.object:set_velocity({x = 0, y = 0, z = 0}) self.v = 0 From 513609dcfdb42e28a30bcf5a3fd37fecf845ab5f Mon Sep 17 00:00:00 2001 From: Paramat Date: Sun, 8 Jul 2018 22:22:07 +0100 Subject: [PATCH 140/195] Fence rails: Add fence rail textures Minor clean up of README.txt, including deletion of credits for removed torch textures. --- mods/default/README.txt | 20 ++++++++++++------ mods/default/nodes.lua | 10 ++++----- .../default_fence_rail_acacia_wood.png | Bin 0 -> 444 bytes .../default_fence_rail_aspen_wood.png | Bin 0 -> 235 bytes .../default_fence_rail_junglewood.png | Bin 0 -> 230 bytes .../textures/default_fence_rail_pine_wood.png | Bin 0 -> 235 bytes .../textures/default_fence_rail_wood.png | Bin 0 -> 230 bytes 7 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 mods/default/textures/default_fence_rail_acacia_wood.png create mode 100644 mods/default/textures/default_fence_rail_aspen_wood.png create mode 100644 mods/default/textures/default_fence_rail_junglewood.png create mode 100644 mods/default/textures/default_fence_rail_pine_wood.png create mode 100644 mods/default/textures/default_fence_rail_wood.png diff --git a/mods/default/README.txt b/mods/default/README.txt index bb7523ef..6a01cbf4 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -12,6 +12,9 @@ Authors of media (textures, models and sounds) Everything not listed in here: celeron55, Perttu Ahola (CC BY-SA 3.0) + +Textures +-------- Cisoun's texture pack (CC BY-SA 3.0): default_jungletree.png default_lava.png @@ -23,11 +26,6 @@ Cisoun's texture pack (CC BY-SA 3.0): default_tree_top.png default_water.png -Originating from G4JC's Almost MC Texture Pack (CC BY-SA 3.0): - default_torch.png - default_torch_on_ceiling.png - default_torch_on_floor.png - VanessaE's animated torches (CC BY-SA 3.0): default_torch_animated.png default_torch_on_ceiling_animated.png @@ -118,6 +116,11 @@ paramat (CC BY-SA 3.0): default_stones.png -- Derived from a texture by sofar (CC0 1.0) default_moss.png default_moss_side.png + default_fence_rail_acacia_wood + default_fence_rail_aspen_wood -- Derived from a texture by sofar (CC BY-SA 3.0) + default_fence_rail_junglewood + default_fence_rail_pine_wood + default_fence_rail_wood -- Derived from a texture by BlockMen (CC BY-SA 3.0) TumeniNodes (CC BY-SA 3.0): default_desert_cobble.png -- Derived from a texture by brunob.santos (CC BY-SA 3.0) @@ -195,7 +198,6 @@ Pithydon (CC BY-SA 3.0) Ferk (CC0 1.0): default_item_smoke.png - default_item_smoke.ogg, based on sound by http://opengameart.org/users/bart npx (CC BY-SA 3.0): default_rainforest_litter.png @@ -225,6 +227,9 @@ CloudyProton (CC BY-SA 3.0): Mossmanikin (CC BY-SA 3.0): default_fern_*.png + +Sounds +------ Glass breaking sounds (CC BY 3.0): 1: http://www.freesound.org/people/cmusounddesign/sounds/71947/ 2: http://www.freesound.org/people/Tomlija/sounds/97669/ @@ -303,3 +308,6 @@ Chests sounds added by sofar, derived of several files mixed together: Ryding (CC0 1.0): http://freesound.org/people/Ryding/sounds/94337/ default_snow_footstep.*.ogg + +Ferk (CC0 1.0): + default_item_smoke.ogg, based on a sound by http://opengameart.org/users/bart diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 2ef3b93b..b1d965d0 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -2649,7 +2649,7 @@ default.register_fence("default:fence_aspen_wood", { default.register_fence_rail("default:fence_rail_wood", { description = "Apple Wood Fence Rail", - texture = "default_wood.png", + texture = "default_fence_rail_wood.png", inventory_image = "default_fence_rail_overlay.png^default_wood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", wield_image = "default_fence_rail_overlay.png^default_wood.png^" .. @@ -2661,7 +2661,7 @@ default.register_fence_rail("default:fence_rail_wood", { default.register_fence_rail("default:fence_rail_acacia_wood", { description = "Acacia Wood Fence Rail", - texture = "default_acacia_wood.png", + texture = "default_fence_rail_acacia_wood.png", inventory_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", wield_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" .. @@ -2673,7 +2673,7 @@ default.register_fence_rail("default:fence_rail_acacia_wood", { default.register_fence_rail("default:fence_rail_junglewood", { description = "Jungle Wood Fence Rail", - texture = "default_junglewood.png", + texture = "default_fence_rail_junglewood.png", inventory_image = "default_fence_rail_overlay.png^default_junglewood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", wield_image = "default_fence_rail_overlay.png^default_junglewood.png^" .. @@ -2685,7 +2685,7 @@ default.register_fence_rail("default:fence_rail_junglewood", { default.register_fence_rail("default:fence_rail_pine_wood", { description = "Pine Wood Fence Rail", - texture = "default_pine_wood.png", + texture = "default_fence_rail_pine_wood.png", inventory_image = "default_fence_rail_overlay.png^default_pine_wood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", wield_image = "default_fence_rail_overlay.png^default_pine_wood.png^" .. @@ -2697,7 +2697,7 @@ default.register_fence_rail("default:fence_rail_pine_wood", { default.register_fence_rail("default:fence_rail_aspen_wood", { description = "Aspen Wood Fence Rail", - texture = "default_aspen_wood.png", + texture = "default_fence_rail_aspen_wood.png", inventory_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", wield_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" .. diff --git a/mods/default/textures/default_fence_rail_acacia_wood.png b/mods/default/textures/default_fence_rail_acacia_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..64dc90f121118a8207219451ae5d1e6e1f18023a GIT binary patch literal 444 zcmV;t0YmZD=t3O~ixMR!qy`LBORdre zt-~edGx1Efz31I`&Ush3xi|p;z;~TOHYNK4fX-lOSiDuqb1`_EOnodNTon&wNx(X4 zDl;rjHFfzspig$1lmR^2v$Nd(+97LHKTHAe92m{z1R`-b~z!18AG$Mp+|E_}4={m%KME(!J@SRmo!uTnqq&EiMKm0RZa^ zh9oic2cVkGP`KfUki!5RCnBWPRoGpBRESGq3>)wqn;8~2EORyThtGK>jkY<)E-c<5 zyirD=C!+8HpjpiAH~^rmrB~zQSOn7h{?QXrYH=~>O{Sh>vuZZ;Jo()iQ;J0!Weq@Y zGVKn(&h?ZWkvzw)W;4QdMccl&Ssf>m^0cO ledn4vSDi*PXyFj<(jTLFFTeQ?XRZJM002ovPDHLkV1kV&XEXo+ literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_fence_rail_junglewood.png b/mods/default/textures/default_fence_rail_junglewood.png new file mode 100644 index 0000000000000000000000000000000000000000..ebc1ef06a14f45ed06d6be169de15cd44713f7c9 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnYl@?%-6Jk^qXE9Y~H&f-b z)Znwy;nv>_Lhp$N+b&&1@Z0x71~e=NK4 zmUXKM-=S}DN6y`HHCP+*Wd5c3FWV}a<6f8lReR{vQ6M*gcc)flK!weProa<(SCtw6 z$Xl~ziN519pTJF$wR6sjF(|Tfw``yFD?4PZb1tiW(Z85^!a05it&M-Ly6wtx>s_(U b%72XiQqsf>m^0cO ledn4vSDi*PXyFj<(jTLFFTeQ?XRZJM002ovPDHLkV1n%TWYPct literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_fence_rail_wood.png b/mods/default/textures/default_fence_rail_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..f84b755b90e33be5a9cf0e8810963d6a328aedd5 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnY4YF4bcUDdI)~ZV|XiPS4 z&9rIHw(ZQeom=U;u+C#yqt|Bj4kMuA22U5q5RU7jrwzH73`JNjcqS%K6-Y6?{$tsV zx2#)D_zr!GJ96%ptHIicC-X1Of7w>a9QV5Xui8VWjsm#}ygRib11fATGzFfRyQ<9i zN8Xw(OY|L=`2=o~tetaKj6so=yJh>VU)dpRopV|3i~hyT6VCBFXl?v^)ooXnTknc( bR{mrBm!cN;#^|98&@Bv}u6{1-oD!M<@|Rc! literal 0 HcmV?d00001 From ef7bd43829b5e68008c5067802084e0af506f7ed Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 10 Jul 2018 03:51:41 +0100 Subject: [PATCH 141/195] Remove coral air-death ABM --- mods/default/functions.lua | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 5dd0d2c8..d951e8e6 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -562,22 +562,6 @@ minetest.register_abm({ }) --- --- Coral death near air --- - -minetest.register_abm({ - nodenames = {"default:coral_brown", "default:coral_orange"}, - neighbors = {"air"}, - interval = 17, - chance = 5, - catch_up = false, - action = function(pos, node) - minetest.set_node(pos, {name = "default:coral_skeleton"}) - end, -}) - - -- -- NOTICE: This method is not an official part of the API yet. -- This method may change in future. From d4b0b73ae004d83dd1ef8643efbedce532d08b05 Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 10 Jul 2018 23:02:22 +0100 Subject: [PATCH 142/195] Move chests to a new file. Update credits for chests and torches Move chests code out of nodes.lua and into a new file. Credit torch code, and chest and torch models in README.txt. Remove 'torches' mod text from torch.lua. Minor cleanups in README.txt. --- mods/default/README.txt | 22 ++- mods/default/chests.lua | 317 +++++++++++++++++++++++++++++++++++++++ mods/default/init.lua | 1 + mods/default/nodes.lua | 321 ---------------------------------------- mods/default/torch.lua | 37 ----- 5 files changed, 334 insertions(+), 364 deletions(-) create mode 100644 mods/default/chests.lua diff --git a/mods/default/README.txt b/mods/default/README.txt index 6a01cbf4..87e0d31c 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -7,6 +7,9 @@ Authors of source code Originally by celeron55, Perttu Ahola (LGPL 2.1) Various Minetest developers and contributors (LGPL 2.1) +The torch code was derived by sofar from the 'torches' mod by +BlockMen (LGPL 2.1) + Authors of media (textures, models and sounds) ---------------------------------------------- Everything not listed in here: @@ -26,17 +29,15 @@ Cisoun's texture pack (CC BY-SA 3.0): default_tree_top.png default_water.png -VanessaE's animated torches (CC BY-SA 3.0): - default_torch_animated.png - default_torch_on_ceiling_animated.png - default_torch_on_floor_animated.png - default_torch_on_floor.png - RealBadAngel's animated water (CC BY-SA 3.0): default_water_source_animated.png default_water_flowing_animated.png VanessaE (CC BY-SA 3.0): + default_torch_animated.png + default_torch_on_ceiling_animated.png + default_torch_on_floor_animated.png + default_torch_on_floor.png default_desert_sand.png default_desert_stone.png default_sand.png @@ -311,3 +312,12 @@ http://freesound.org/people/Ryding/sounds/94337/ Ferk (CC0 1.0): default_item_smoke.ogg, based on a sound by http://opengameart.org/users/bart + + +Models +------ +sofar (CC BY-SA 3.0): + chest_open.obj + torch_ceiling.obj + torch_floor.obj + torch_wall.obj diff --git a/mods/default/chests.lua b/mods/default/chests.lua new file mode 100644 index 00000000..cd707991 --- /dev/null +++ b/mods/default/chests.lua @@ -0,0 +1,317 @@ +default.chest = {} + +function default.chest.get_chest_formspec(pos) + local spos = pos.x .. "," .. pos.y .. "," .. pos.z + local formspec = + "size[8,9]" .. + default.gui_bg .. + default.gui_bg_img .. + default.gui_slots .. + "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" .. + "list[current_player;main;0,4.85;8,1;]" .. + "list[current_player;main;0,6.08;8,3;8]" .. + "listring[nodemeta:" .. spos .. ";main]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,4.85) + return formspec +end + +function default.chest.chest_lid_obstructed(pos) + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local def = minetest.registered_nodes[minetest.get_node(above).name] + -- allow ladders, signs, wallmounted things and torches to not obstruct + if def and + (def.drawtype == "airlike" or + def.drawtype == "signlike" or + def.drawtype == "torchlike" or + (def.drawtype == "nodebox" and def.paramtype2 == "wallmounted")) then + return false + end + return true +end + +function default.chest.chest_lid_close(pn) + local chest_open_info = default.chest.open_chests[pn] + local pos = chest_open_info.pos + local sound = chest_open_info.sound + local swap = chest_open_info.swap + + default.chest.open_chests[pn] = nil + for k, v in pairs(default.chest.open_chests) do + if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then + return true + end + end + + local node = minetest.get_node(pos) + minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap, + param2 = node.param2 }) + minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10}) +end + +default.chest.open_chests = {} + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "default:chest" then + return + end + if not player or not fields.quit then + return + end + local pn = player:get_player_name() + + if not default.chest.open_chests[pn] then + return + end + + default.chest.chest_lid_close(pn) + return true +end) + +minetest.register_on_leaveplayer(function(player) + local pn = player:get_player_name() + if default.chest.open_chests[pn] then + default.chest.chest_lid_close(pn) + end +end) + +function default.chest.register_chest(name, d) + local def = table.copy(d) + def.drawtype = "mesh" + def.visual = "mesh" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.legacy_facedir_simple = true + def.is_ground_content = false + + if def.protected then + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Locked Chest") + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end + def.after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", "Locked Chest (owned by " .. + meta:get_string("owner") .. ")") + end + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") and + default.can_interact_with_node(player, pos) + end + def.allow_metadata_inventory_move = function(pos, from_list, from_index, + to_list, to_index, count, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return count + end + def.allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return stack:get_count() + end + def.allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return stack:get_count() + end + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if not default.can_interact_with_node(clicker, pos) then + return itemstack + end + + minetest.sound_play(def.sound_open, {gain = 0.3, + pos = pos, max_hear_distance = 10}) + if not default.chest.chest_lid_obstructed(pos) then + minetest.swap_node(pos, + { name = "default:" .. name .. "_open", + param2 = node.param2 }) + end + minetest.after(0.2, minetest.show_formspec, + clicker:get_player_name(), + "default:chest", default.chest.get_chest_formspec(pos)) + default.chest.open_chests[clicker:get_player_name()] = { pos = pos, + sound = def.sound_close, swap = name } + end + def.on_blast = function() end + def.on_key_use = function(pos, player) + local secret = minetest.get_meta(pos):get_string("key_lock_secret") + local itemstack = player:get_wielded_item() + local key_meta = itemstack:get_meta() + + if key_meta:get_string("secret") == "" then + key_meta:set_string("secret", minetest.parse_json(itemstack:get_metadata()).secret) + itemstack:set_metadata("") + end + + if secret ~= key_meta:get_string("secret") then + return + end + + minetest.show_formspec( + player:get_player_name(), + "default:chest_locked", + default.chest.get_chest_formspec(pos) + ) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pn = player:get_player_name() + + -- verify placer is owner of lockable chest + if owner ~= pn then + minetest.record_protection_violation(pos, pn) + minetest.chat_send_player(pn, "You do not own this chest.") + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, "a locked chest", owner + end + else + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end + def.on_rightclick = function(pos, node, clicker) + minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos, + max_hear_distance = 10}) + if not default.chest.chest_lid_obstructed(pos) then + minetest.swap_node(pos, { + name = "default:" .. name .. "_open", + param2 = node.param2 }) + end + minetest.after(0.2, minetest.show_formspec, + clicker:get_player_name(), + "default:chest", default.chest.get_chest_formspec(pos)) + default.chest.open_chests[clicker:get_player_name()] = { pos = pos, + sound = def.sound_close, swap = name } + end + def.on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "main", drops) + drops[#drops+1] = "default:" .. name + minetest.remove_node(pos) + return drops + end + end + + def.on_metadata_inventory_move = function(pos, from_list, from_index, + to_list, to_index, count, player) + minetest.log("action", player:get_player_name() .. + " moves stuff in chest at " .. minetest.pos_to_string(pos)) + end + def.on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name() .. + " moves " .. stack:get_name() .. + " to chest at " .. minetest.pos_to_string(pos)) + end + def.on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name() .. + " takes " .. stack:get_name() .. + " from chest at " .. minetest.pos_to_string(pos)) + end + + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + def_opened.mesh = "chest_open.obj" + for i = 1, #def_opened.tiles do + if type(def_opened.tiles[i]) == "string" then + def_opened.tiles[i] = {name = def_opened.tiles[i], backface_culling = true} + elseif def_opened.tiles[i].backface_culling == nil then + def_opened.tiles[i].backface_culling = true + end + end + def_opened.drop = "default:" .. name + def_opened.groups.not_in_creative_inventory = 1 + def_opened.selection_box = { + type = "fixed", + fixed = { -1/2, -1/2, -1/2, 1/2, 3/16, 1/2 }, + } + def_opened.can_dig = function() + return false + end + def_opened.on_blast = function() end + + def_closed.mesh = nil + def_closed.drawtype = nil + def_closed.tiles[6] = def.tiles[5] -- swap textures around for "normal" + def_closed.tiles[5] = def.tiles[3] -- drawtype to make them match the mesh + def_closed.tiles[3] = def.tiles[3].."^[transformFX" + + minetest.register_node("default:" .. name, def_closed) + minetest.register_node("default:" .. name .. "_open", def_opened) + + -- convert old chests to this new variant + minetest.register_lbm({ + label = "update chests to opening chests", + name = "default:upgrade_" .. name .. "_v2", + nodenames = {"default:" .. name}, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", nil) + local inv = meta:get_inventory() + local list = inv:get_list("default:chest") + if list then + inv:set_size("main", 8*4) + inv:set_list("main", list) + inv:set_list("default:chest", nil) + end + end + }) +end + +default.chest.register_chest("chest", { + description = "Chest", + tiles = { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_front.png", + "default_chest_inside.png" + }, + sounds = default.node_sound_wood_defaults(), + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, +}) + +default.chest.register_chest("chest_locked", { + description = "Locked Chest", + tiles = { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_lock.png", + "default_chest_inside.png" + }, + sounds = default.node_sound_wood_defaults(), + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, + protected = true, +}) diff --git a/mods/default/init.lua b/mods/default/init.lua index 5fef4be8..b0609ffa 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -47,6 +47,7 @@ local default_path = minetest.get_modpath("default") dofile(default_path.."/functions.lua") dofile(default_path.."/trees.lua") dofile(default_path.."/nodes.lua") +dofile(default_path.."/chests.lua") dofile(default_path.."/furnace.lua") dofile(default_path.."/torch.lua") dofile(default_path.."/tools.lua") diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index b1d965d0..13a4c0bf 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -188,9 +188,6 @@ default:lava_flowing Tools / "Advanced" crafting / Non-"natural" ------------------------------------------- -default:chest -default:chest_locked - default:bookshelf default:sign_wall_wood @@ -2072,324 +2069,6 @@ minetest.register_node("default:lava_flowing", { -- Tools / "Advanced" crafting / Non-"natural" -- -default.chest = {} - -function default.chest.get_chest_formspec(pos) - local spos = pos.x .. "," .. pos.y .. "," .. pos.z - local formspec = - "size[8,9]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" .. - "list[current_player;main;0,4.85;8,1;]" .. - "list[current_player;main;0,6.08;8,3;8]" .. - "listring[nodemeta:" .. spos .. ";main]" .. - "listring[current_player;main]" .. - default.get_hotbar_bg(0,4.85) - return formspec -end - -function default.chest.chest_lid_obstructed(pos) - local above = {x = pos.x, y = pos.y + 1, z = pos.z} - local def = minetest.registered_nodes[minetest.get_node(above).name] - -- allow ladders, signs, wallmounted things and torches to not obstruct - if def and - (def.drawtype == "airlike" or - def.drawtype == "signlike" or - def.drawtype == "torchlike" or - (def.drawtype == "nodebox" and def.paramtype2 == "wallmounted")) then - return false - end - return true -end - -function default.chest.chest_lid_close(pn) - local chest_open_info = default.chest.open_chests[pn] - local pos = chest_open_info.pos - local sound = chest_open_info.sound - local swap = chest_open_info.swap - - default.chest.open_chests[pn] = nil - for k, v in pairs(default.chest.open_chests) do - if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then - return true - end - end - - local node = minetest.get_node(pos) - minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap, - param2 = node.param2 }) - minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10}) -end - -default.chest.open_chests = {} - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "default:chest" then - return - end - if not player or not fields.quit then - return - end - local pn = player:get_player_name() - - if not default.chest.open_chests[pn] then - return - end - - default.chest.chest_lid_close(pn) - return true -end) - -minetest.register_on_leaveplayer(function(player) - local pn = player:get_player_name() - if default.chest.open_chests[pn] then - default.chest.chest_lid_close(pn) - end -end) - -function default.chest.register_chest(name, d) - local def = table.copy(d) - def.drawtype = "mesh" - def.visual = "mesh" - def.paramtype = "light" - def.paramtype2 = "facedir" - def.legacy_facedir_simple = true - def.is_ground_content = false - - if def.protected then - def.on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("infotext", "Locked Chest") - meta:set_string("owner", "") - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end - def.after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - meta:set_string("owner", placer:get_player_name() or "") - meta:set_string("infotext", "Locked Chest (owned by " .. - meta:get_string("owner") .. ")") - end - def.can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") and - default.can_interact_with_node(player, pos) - end - def.allow_metadata_inventory_move = function(pos, from_list, from_index, - to_list, to_index, count, player) - if not default.can_interact_with_node(player, pos) then - return 0 - end - return count - end - def.allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if not default.can_interact_with_node(player, pos) then - return 0 - end - return stack:get_count() - end - def.allow_metadata_inventory_take = function(pos, listname, index, stack, player) - if not default.can_interact_with_node(player, pos) then - return 0 - end - return stack:get_count() - end - def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if not default.can_interact_with_node(clicker, pos) then - return itemstack - end - - minetest.sound_play(def.sound_open, {gain = 0.3, - pos = pos, max_hear_distance = 10}) - if not default.chest.chest_lid_obstructed(pos) then - minetest.swap_node(pos, - { name = "default:" .. name .. "_open", - param2 = node.param2 }) - end - minetest.after(0.2, minetest.show_formspec, - clicker:get_player_name(), - "default:chest", default.chest.get_chest_formspec(pos)) - default.chest.open_chests[clicker:get_player_name()] = { pos = pos, - sound = def.sound_close, swap = name } - end - def.on_blast = function() end - def.on_key_use = function(pos, player) - local secret = minetest.get_meta(pos):get_string("key_lock_secret") - local itemstack = player:get_wielded_item() - local key_meta = itemstack:get_meta() - - if key_meta:get_string("secret") == "" then - key_meta:set_string("secret", minetest.parse_json(itemstack:get_metadata()).secret) - itemstack:set_metadata("") - end - - if secret ~= key_meta:get_string("secret") then - return - end - - minetest.show_formspec( - player:get_player_name(), - "default:chest_locked", - default.chest.get_chest_formspec(pos) - ) - end - def.on_skeleton_key_use = function(pos, player, newsecret) - local meta = minetest.get_meta(pos) - local owner = meta:get_string("owner") - local pn = player:get_player_name() - - -- verify placer is owner of lockable chest - if owner ~= pn then - minetest.record_protection_violation(pos, pn) - minetest.chat_send_player(pn, "You do not own this chest.") - return nil - end - - local secret = meta:get_string("key_lock_secret") - if secret == "" then - secret = newsecret - meta:set_string("key_lock_secret", secret) - end - - return secret, "a locked chest", owner - end - else - def.on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("infotext", "Chest") - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end - def.can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") - end - def.on_rightclick = function(pos, node, clicker) - minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos, - max_hear_distance = 10}) - if not default.chest.chest_lid_obstructed(pos) then - minetest.swap_node(pos, { - name = "default:" .. name .. "_open", - param2 = node.param2 }) - end - minetest.after(0.2, minetest.show_formspec, - clicker:get_player_name(), - "default:chest", default.chest.get_chest_formspec(pos)) - default.chest.open_chests[clicker:get_player_name()] = { pos = pos, - sound = def.sound_close, swap = name } - end - def.on_blast = function(pos) - local drops = {} - default.get_inventory_drops(pos, "main", drops) - drops[#drops+1] = "default:" .. name - minetest.remove_node(pos) - return drops - end - end - - def.on_metadata_inventory_move = function(pos, from_list, from_index, - to_list, to_index, count, player) - minetest.log("action", player:get_player_name() .. - " moves stuff in chest at " .. minetest.pos_to_string(pos)) - end - def.on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " moves " .. stack:get_name() .. - " to chest at " .. minetest.pos_to_string(pos)) - end - def.on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " takes " .. stack:get_name() .. - " from chest at " .. minetest.pos_to_string(pos)) - end - - local def_opened = table.copy(def) - local def_closed = table.copy(def) - - def_opened.mesh = "chest_open.obj" - for i = 1, #def_opened.tiles do - if type(def_opened.tiles[i]) == "string" then - def_opened.tiles[i] = {name = def_opened.tiles[i], backface_culling = true} - elseif def_opened.tiles[i].backface_culling == nil then - def_opened.tiles[i].backface_culling = true - end - end - def_opened.drop = "default:" .. name - def_opened.groups.not_in_creative_inventory = 1 - def_opened.selection_box = { - type = "fixed", - fixed = { -1/2, -1/2, -1/2, 1/2, 3/16, 1/2 }, - } - def_opened.can_dig = function() - return false - end - def_opened.on_blast = function() end - - def_closed.mesh = nil - def_closed.drawtype = nil - def_closed.tiles[6] = def.tiles[5] -- swap textures around for "normal" - def_closed.tiles[5] = def.tiles[3] -- drawtype to make them match the mesh - def_closed.tiles[3] = def.tiles[3].."^[transformFX" - - minetest.register_node("default:" .. name, def_closed) - minetest.register_node("default:" .. name .. "_open", def_opened) - - -- convert old chests to this new variant - minetest.register_lbm({ - label = "update chests to opening chests", - name = "default:upgrade_" .. name .. "_v2", - nodenames = {"default:" .. name}, - action = function(pos, node) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", nil) - local inv = meta:get_inventory() - local list = inv:get_list("default:chest") - if list then - inv:set_size("main", 8*4) - inv:set_list("main", list) - inv:set_list("default:chest", nil) - end - end - }) -end - -default.chest.register_chest("chest", { - description = "Chest", - tiles = { - "default_chest_top.png", - "default_chest_top.png", - "default_chest_side.png", - "default_chest_side.png", - "default_chest_front.png", - "default_chest_inside.png" - }, - sounds = default.node_sound_wood_defaults(), - sound_open = "default_chest_open", - sound_close = "default_chest_close", - groups = {choppy = 2, oddly_breakable_by_hand = 2}, -}) - -default.chest.register_chest("chest_locked", { - description = "Locked Chest", - tiles = { - "default_chest_top.png", - "default_chest_top.png", - "default_chest_side.png", - "default_chest_side.png", - "default_chest_lock.png", - "default_chest_inside.png" - }, - sounds = default.node_sound_wood_defaults(), - sound_open = "default_chest_open", - sound_close = "default_chest_close", - groups = {choppy = 2, oddly_breakable_by_hand = 2}, - protected = true, -}) - local bookshelf_formspec = "size[8,7;]" .. default.gui_bg .. diff --git a/mods/default/torch.lua b/mods/default/torch.lua index a99a38db..5de5f89f 100644 --- a/mods/default/torch.lua +++ b/mods/default/torch.lua @@ -1,40 +1,3 @@ - ---[[ - -Torch mod - formerly mod "Torches" -====================== - -(c) Copyright BlockMen (2013-2015) -(C) Copyright sofar (2016) - -This mod changes the default torch drawtype from "torchlike" to "mesh", -giving the torch a three dimensional appearance. The mesh contains the -proper pixel mapping to make the animation appear as a particle above -the torch, while in fact the animation is just the texture of the mesh. - - -License: -~~~~~~~~ -(c) Copyright BlockMen (2013-2015) - -Textures and Meshes/Models: -CC-BY 3.0 BlockMen -Note that the models were entirely done from scratch by sofar. - -Code: -Licensed under the GNU LGPL version 2.1 or higher. -You can redistribute it and/or modify it under -the terms of the GNU Lesser General Public License -as published by the Free Software Foundation; - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -See LICENSE.txt and http://www.gnu.org/licenses/lgpl-2.1.txt - ---]] - local function on_flood(pos, oldnode, newnode) minetest.add_item(pos, ItemStack("default:torch 1")) -- Play flame-extinguish sound if liquid is not an 'igniter' From 9318c71659df9c80653b71a438303ac43107f9c7 Mon Sep 17 00:00:00 2001 From: TumeniNodes Date: Thu, 12 Jul 2018 20:17:07 -0400 Subject: [PATCH 143/195] Biomes: Add pine bush to taiga and snowy grassland Replaces 'bush' in snowy grassland. --- game_api.txt | 3 + mods/default/README.txt | 2 + mods/default/crafting.lua | 19 +++++ mods/default/mapgen.lua | 26 +++++- mods/default/nodes.lua | 80 ++++++++++++++++++ mods/default/schematics/pine_bush.mts | Bin 0 -> 111 bytes .../textures/default_pine_bush_sapling.png | Bin 0 -> 166 bytes .../textures/default_pine_bush_stem.png | Bin 0 -> 280 bytes mods/default/trees.lua | 14 +++ 9 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 mods/default/schematics/pine_bush.mts create mode 100644 mods/default/textures/default_pine_bush_sapling.png create mode 100644 mods/default/textures/default_pine_bush_stem.png diff --git a/game_api.txt b/game_api.txt index 90594e8f..97ee3caa 100644 --- a/game_api.txt +++ b/game_api.txt @@ -918,6 +918,9 @@ Trees * `default.grow_acacia_bush(pos)` * Grows an acaia bush at pos + + * `default.grow_pine_bush(pos)` + * Grows a pine bush at pos Carts ----- diff --git a/mods/default/README.txt b/mods/default/README.txt index 87e0d31c..e3efdd20 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -79,11 +79,13 @@ paramat (CC BY-SA 3.0): default_acacia_leaves_simple.png default_acacia_sapling.png default_acacia_bush_sapling.png + default_pine_bush_sapling.png default_acacia_tree.png default_acacia_tree_top.png default_acacia_wood.png default_acacia_bush_stem.png default_bush_stem.png + default_pine_bush_stem.png default_junglewood.png default_jungletree_top.png default_sandstone_brick.png diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index c0f2252f..b8651c0c 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -49,6 +49,13 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "default:pine_wood", + recipe = { + {"default:pine_bush_stem"}, + } +}) + minetest.register_craft({ output = 'default:stick 4', recipe = { @@ -953,6 +960,12 @@ minetest.register_craft({ burntime = 4, }) +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_bush_sapling", + burntime = 2, +}) + minetest.register_craft({ type = "fuel", recipe = "default:aspen_sapling", @@ -1058,6 +1071,12 @@ minetest.register_craft({ burntime = 8, }) +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_bush_stem", + burntime = 6, +}) + minetest.register_craft({ type = "fuel", recipe = "default:junglegrass", diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index fdbe4a83..f0da5d5a 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1946,7 +1946,7 @@ function default.register_decorations() minetest.register_decoration({ name = "default:bush", deco_type = "schematic", - place_on = {"default:dirt_with_grass", "default:dirt_with_snow"}, + place_on = {"default:dirt_with_grass"}, sidelen = 16, noise_params = { offset = -0.004, @@ -1956,7 +1956,7 @@ function default.register_decorations() octaves = 3, persist = 0.7, }, - biomes = {"snowy_grassland", "grassland", "deciduous_forest", + biomes = {"grassland", "deciduous_forest", "floatland_grassland"}, y_max = 31000, y_min = 1, @@ -1986,6 +1986,28 @@ function default.register_decorations() flags = "place_center_x, place_center_z", }) + -- Pine bush + + minetest.register_decoration({ + name = "default:pine_bush", + deco_type = "schematic", + place_on = {"default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"taiga", "snowy_grassland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("default") .. "/schematics/pine_bush.mts", + flags = "place_center_x, place_center_z", + }) + -- Grasses register_grass_decoration(-0.03, 0.09, 5) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 13a4c0bf..4f427f43 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -162,6 +162,9 @@ default:bush_sapling default:acacia_bush_stem default:acacia_bush_leaves default:acacia_bush_sapling +default:pine_bush_stem +default:pine_bush_needles +default:pine_bush_sapling default:sand_with_kelp @@ -1681,6 +1684,77 @@ minetest.register_node("default:acacia_bush_sapling", { end, }) +minetest.register_node("default:pine_bush_stem", { + description = "Pine Bush Stem", + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"default_pine_bush_stem.png"}, + inventory_image = "default_pine_bush_stem.png", + wield_image = "default_pine_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("default:pine_bush_needles", { + description = "Pine Bush Needles", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"default_pine_needles.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:pine_bush_sapling"}, rarity = 5}, + {items = {"default:pine_bush_needles"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:pine_bush_sapling", { + description = "Pine Bush Sapling", + drawtype = "plantlike", + tiles = {"default_pine_bush_sapling.png"}, + inventory_image = "default_pine_bush_sapling.png", + wield_image = "default_pine_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:pine_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + minetest.register_node("default:sand_with_kelp", { description = "Kelp", drawtype = "plantlike_rooted", @@ -2532,3 +2606,9 @@ default.register_leafdecay({ leaves = {"default:acacia_bush_leaves"}, radius = 1, }) + +default.register_leafdecay({ + trunks = {"default:pine_bush_stem"}, + leaves = {"default:pine_bush_needles"}, + radius = 1, +}) diff --git a/mods/default/schematics/pine_bush.mts b/mods/default/schematics/pine_bush.mts new file mode 100644 index 0000000000000000000000000000000000000000..fbc6e17796ead10a08d02f4bb8c6b3c38356b84c GIT binary patch literal 111 zcmeYb3HD`RVPFQq`uchhm6%z?AeoYymROooVpWitml~f`TAUG|mztWAlUmFmhACBC ulA2pFCpm$E*-eE*IPs8xV_5P3|9}5}|IRG=|NnpXO%q)U7#V5>1egGgP$z}} literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_pine_bush_sapling.png b/mods/default/textures/default_pine_bush_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..fadeff8711a31948791764056cef8b2313e70b89 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(aO=MsY))v=Ol@~RaFw;>H zwUn?k((rD zhXNQD-C&&|al>I#4r>k{C!4}T9y4=xfwM7}*e)++yL_HWiQ(H>*6)d_;md)BFnGH9 KxvXU>WC^)QwM`2{mLJiCzw;v{*y zyD)UH%6b4foCO|{#S9GG!XV7ZFl&wkP>{XE)7O>#5j&Tds7^R@Wd=|v(bL5-gyVX0 zf&yQLYO@C`8{5|eHa4}klRP}L90W_-GTC@;o#XKdmei9re!(aUqa4OXN_*<4}HN=&%5Gvjd{>xN49a9uX(Gf(!MVn}K|6{Nt(@P<_+IqgZY7SJ*V MPgg&ebxsLQ0LSS{(*OVf literal 0 HcmV?d00001 diff --git a/mods/default/trees.lua b/mods/default/trees.lua index 7f5556b2..a46ac5ac 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -85,6 +85,10 @@ function default.grow_sapling(pos) minetest.log("action", "An acacia bush sapling grows into a bush at ".. minetest.pos_to_string(pos)) default.grow_acacia_bush(pos) + elseif node.name == "default:pine_bush_sapling" then + minetest.log("action", "A pine bush sapling grows into a bush at ".. + minetest.pos_to_string(pos)) + default.grow_pine_bush(pos) elseif node.name == "default:emergent_jungle_sapling" then minetest.log("action", "An emergent jungle sapling grows into a tree at ".. minetest.pos_to_string(pos)) @@ -483,6 +487,16 @@ function default.grow_acacia_bush(pos) end +-- Pine bush + +function default.grow_pine_bush(pos) + local path = minetest.get_modpath("default") .. + "/schematics/pine_bush.mts" + minetest.place_schematic({x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, + path, "0", nil, false) +end + + -- -- Sapling 'on place' function to check protection of node and resulting tree volume -- From 57db3f748c8e6bd36c63cbcb1787f75ab131869e Mon Sep 17 00:00:00 2001 From: Paramat Date: Sat, 14 Jul 2018 22:52:12 +0100 Subject: [PATCH 144/195] Default: Credit schematics and licence as media --- mods/default/README.txt | 42 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index e3efdd20..d78941ad 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -10,8 +10,8 @@ Various Minetest developers and contributors (LGPL 2.1) The torch code was derived by sofar from the 'torches' mod by BlockMen (LGPL 2.1) -Authors of media (textures, models and sounds) ----------------------------------------------- +Authors of media (textures, sounds, models and schematics) +---------------------------------------------------------- Everything not listed in here: celeron55, Perttu Ahola (CC BY-SA 3.0) @@ -323,3 +323,41 @@ sofar (CC BY-SA 3.0): torch_ceiling.obj torch_floor.obj torch_wall.obj + + +Schematics +---------- +paramat (CC BY-SA 3.0): + acacia_bush.mts + acacia_tree.mts + acacia_tree_from_sapling.mts + apple_tree.mts + apple_tree_from_sapling.mts + aspen_tree.mts + aspen_tree_from_sapling.mts + bush.mts + emergent_jungle_tree.mts + emergent_jungle_tree_from_sapling.mts + jungle_tree.mts + jungle_tree_from_sapling.mts + large_cactus.mts + papyrus.mts + pine_tree.mts + pine_tree_from_sapling.mts + snowy_pine_tree_from_sapling.mts + small_pine_tree.mts + small_pine_tree_from_sapling.mts + snowy_small_pine_tree_from_sapling.mts + +Shara RedCat (CC BY-SA 3.0): + acacia_log.mts + apple_log.mts + aspen_log.mts + jungle_log.mts + pine_log.mts + +sofar (CC BY-SA 3.0): + corals.mts + +TumeniNodes (CC BY-SA 3.0): + pine_bush.mts From ee72bc722c4068adea7cb90457f80616bb0fcd7f Mon Sep 17 00:00:00 2001 From: Paramat Date: Sun, 15 Jul 2018 21:50:07 +0100 Subject: [PATCH 145/195] Boats: Use driver name string instead of objectref --- mods/boats/init.lua | 75 +++++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 33 deletions(-) diff --git a/mods/boats/init.lua b/mods/boats/init.lua index da0f463d..c6d0e291 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -54,7 +54,7 @@ function boat.on_rightclick(self, clicker) return end local name = clicker:get_player_name() - if self.driver and clicker == self.driver then + if self.driver and name == self.driver then self.driver = nil self.auto = false clicker:set_detach() @@ -74,7 +74,7 @@ function boat.on_rightclick(self, clicker) end clicker:set_detach() end - self.driver = clicker + self.driver = name clicker:set_attach(self.object, "", {x = 0.5, y = 1, z = -3}, {x = 0, y = 0, z = 0}) player_api.player_attached[name] = true @@ -86,6 +86,13 @@ function boat.on_rightclick(self, clicker) end +-- If driver leaves server while driving boat +function boat.on_detach_child(self, child) + self.driver = nil + self.auto = false +end + + function boat.on_activate(self, staticdata, dtime_s) self.object:set_armor_groups({immortal = 1}) if staticdata then @@ -104,16 +111,18 @@ function boat.on_punch(self, puncher) if not puncher or not puncher:is_player() or self.removed then return end - if self.driver and puncher == self.driver then + + local name = puncher:get_player_name() + if self.driver and name == self.driver then self.driver = nil puncher:set_detach() - player_api.player_attached[puncher:get_player_name()] = false + player_api.player_attached[name] = false end if not self.driver then self.removed = true local inv = puncher:get_inventory() if not (creative and creative.is_enabled_for - and creative.is_enabled_for(puncher:get_player_name())) + and creative.is_enabled_for(name)) or not inv:contains_item("main", "boats:boat") then local leftover = inv:add_item("main", "boats:boat") -- if no room in inventory add a replacement boat to the world @@ -132,35 +141,35 @@ end function boat.on_step(self, dtime) self.v = get_v(self.object:get_velocity()) * get_sign(self.v) if self.driver then - local driver_name = self.driver:get_player_name() - local ctrl = self.driver:get_player_control() - if ctrl.up and ctrl.down then - if not self.auto then - self.auto = true - minetest.chat_send_player(driver_name, - "[boats] Cruise on") + local driver_objref = minetest.get_player_by_name(self.driver) + if driver_objref then + local ctrl = driver_objref:get_player_control() + if ctrl.up and ctrl.down then + if not self.auto then + self.auto = true + minetest.chat_send_player(self.driver, "[boats] Cruise on") + end + elseif ctrl.down then + self.v = self.v - dtime * 1.8 + if self.auto then + self.auto = false + minetest.chat_send_player(self.driver, "[boats] Cruise off") + end + elseif ctrl.up or self.auto then + self.v = self.v + dtime * 1.8 end - elseif ctrl.down then - self.v = self.v - dtime * 1.8 - if self.auto then - self.auto = false - minetest.chat_send_player(driver_name, - "[boats] Cruise off") - end - elseif ctrl.up or self.auto then - self.v = self.v + dtime * 1.8 - end - if ctrl.left then - if self.v < -0.001 then - self.object:set_yaw(self.object:get_yaw() - dtime * 0.9) - else - self.object:set_yaw(self.object:get_yaw() + dtime * 0.9) - end - elseif ctrl.right then - if self.v < -0.001 then - self.object:set_yaw(self.object:get_yaw() + dtime * 0.9) - else - self.object:set_yaw(self.object:get_yaw() - dtime * 0.9) + if ctrl.left then + if self.v < -0.001 then + self.object:set_yaw(self.object:get_yaw() - dtime * 0.9) + else + self.object:set_yaw(self.object:get_yaw() + dtime * 0.9) + end + elseif ctrl.right then + if self.v < -0.001 then + self.object:set_yaw(self.object:get_yaw() + dtime * 0.9) + else + self.object:set_yaw(self.object:get_yaw() - dtime * 0.9) + end end end end From bf3efa0bb71ae5131e4aec053c9f614b52f8a36e Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 17 Jul 2018 05:04:46 +0100 Subject: [PATCH 146/195] Flora spread: Reduce maximum density Previously, maximum flora density was chosen based on the extremely rare occurrence of all 8 flowers being at high density at one location. This caused flora everywhere to spread to an unacceptably high density. Revert the threshold to 3, which in testing results in a more acceptable maximum density of 7 flora per 9x9 area. --- mods/flowers/init.lua | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index 2afb5a01..3ad4bf6c 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -139,12 +139,9 @@ function flowers.flower_spread(pos, node) local pos0 = vector.subtract(pos, 4) local pos1 = vector.add(pos, 4) - -- Maximum flower density created by mapgen is 13 per 9x9 area. - -- The limit of 7 below was tuned by in-game testing to result in a maximum - -- flower density by ABM spread of 13 per 9x9 area. - -- Warning: Setting this limit theoretically without in-game testing - -- results in a maximum flower density by ABM spread that is far too high. - if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 7 then + -- Testing shows that a threshold of 3 results in an appropriate maximum + -- density of approximately 7 flora per 9x9 area. + if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 3 then return end From 506eca22bcc054690fd4a6533dc0a089ece07453 Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 24 Jul 2018 16:14:52 +0100 Subject: [PATCH 147/195] Make apple log shorter, to be no longer than appletree trunk --- mods/default/schematics/apple_log.mts | Bin 90 -> 88 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/schematics/apple_log.mts b/mods/default/schematics/apple_log.mts index 3c1aae45042c79aca5fd426bd10aa4fcf41e6740..92fb900ae3fee7ef2619457273d932dbed84e3ec 100644 GIT binary patch delta 39 vcma!w;P4Fz_GMsUV428aA;ILvrlyd#W&Qf~=@Zfu9xyUZFkq0r!6XO($$|?H delta 41 xcma!u;_wX#_GMsUV4cWeA;s*bkis Date: Thu, 26 Jul 2018 15:50:51 -0400 Subject: [PATCH 148/195] wall.register: Allow table as texture value --- mods/walls/init.lua | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/mods/walls/init.lua b/mods/walls/init.lua index 564d6df0..91a89cf1 100644 --- a/mods/walls/init.lua +++ b/mods/walls/init.lua @@ -1,6 +1,10 @@ walls = {} -walls.register = function(wall_name, wall_desc, wall_texture, wall_mat, wall_sounds) +walls.register = function(wall_name, wall_desc, wall_texture_table, wall_mat, wall_sounds) + --make wall_texture_table paramenter backwards compatible for mods passing single texture + if type(wall_texture_table) ~= "table" then + wall_texture_table = { wall_texture_table } + end -- inventory node, and pole-type wall start item minetest.register_node(wall_name, { description = wall_desc, @@ -17,7 +21,7 @@ walls.register = function(wall_name, wall_desc, wall_texture, wall_mat, wall_sou connects_to = { "group:wall", "group:stone", "group:fence" }, paramtype = "light", is_ground_content = false, - tiles = { wall_texture, }, + tiles = wall_texture_table, walkable = true, groups = { cracky = 3, wall = 1, stone = 2 }, sounds = wall_sounds, @@ -35,12 +39,12 @@ walls.register = function(wall_name, wall_desc, wall_texture, wall_mat, wall_sou end -walls.register("walls:cobble", "Cobblestone Wall", "default_cobble.png", +walls.register("walls:cobble", "Cobblestone Wall", {"default_cobble.png"}, "default:cobble", default.node_sound_stone_defaults()) -walls.register("walls:mossycobble", "Mossy Cobblestone Wall", "default_mossycobble.png", +walls.register("walls:mossycobble", "Mossy Cobblestone Wall", {"default_mossycobble.png"}, "default:mossycobble", default.node_sound_stone_defaults()) -walls.register("walls:desertcobble", "Desert Cobblestone Wall", "default_desert_cobble.png", +walls.register("walls:desertcobble", "Desert Cobblestone Wall", {"default_desert_cobble.png"}, "default:desert_cobble", default.node_sound_stone_defaults()) From c284e52963ee78afda8f12bbaf915c55df2eb3d1 Mon Sep 17 00:00:00 2001 From: Paramat Date: Mon, 30 Jul 2018 00:32:18 +0100 Subject: [PATCH 149/195] Boats, carts mods: Use 'initial_properties' table --- mods/boats/init.lua | 16 +++++++++------- mods/carts/cart_entity.lua | 14 ++++++++------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/mods/boats/init.lua b/mods/boats/init.lua index c6d0e291..00cf7918 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -33,13 +33,15 @@ end -- local boat = { - physical = true, - -- Warning: Do not change the position of the collisionbox top surface, - -- lowering it causes the boat to fall through the world if underwater - collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5}, - visual = "mesh", - mesh = "boats_boat.obj", - textures = {"default_wood.png"}, + initial_properties = { + physical = true, + -- Warning: Do not change the position of the collisionbox top surface, + -- lowering it causes the boat to fall through the world if underwater + collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5}, + visual = "mesh", + mesh = "boats_boat.obj", + textures = {"default_wood.png"}, + }, driver = nil, v = 0, diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua index 38337dbc..855450da 100644 --- a/mods/carts/cart_entity.lua +++ b/mods/carts/cart_entity.lua @@ -1,10 +1,12 @@ local cart_entity = { - physical = false, -- otherwise going uphill breaks - collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, - visual = "mesh", - mesh = "carts_cart.b3d", - visual_size = {x=1, y=1}, - textures = {"carts_cart.png"}, + initial_properties = { + physical = false, -- otherwise going uphill breaks + collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + visual = "mesh", + mesh = "carts_cart.b3d", + visual_size = {x=1, y=1}, + textures = {"carts_cart.png"}, + }, driver = nil, punched = false, -- used to re-send velocity and position From ab3b1a35f50c7f9b667e1868cfd0762a28139f8d Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 31 Jul 2018 10:55:28 +0100 Subject: [PATCH 150/195] sfinv, player_api mods: Fix and cleanup README and license files sfinv: Move license information to create the missing license.txt file. Make README consistent with other Minetest Game mods. player_api: Add missing texture and sound credits to README. Update and add extra license information. default: Remove credit for 'player_damage.ogg' sound. --- mods/default/README.txt | 4 ---- mods/player_api/README.txt | 20 ++++++++++++++---- mods/player_api/license.txt | 41 +++++++++++++++++++++++++++++++++---- mods/sfinv/README.md | 23 --------------------- mods/sfinv/README.txt | 13 ++++++++++++ mods/sfinv/license.txt | 24 ++++++++++++++++++++++ 6 files changed, 90 insertions(+), 35 deletions(-) delete mode 100644 mods/sfinv/README.md create mode 100644 mods/sfinv/README.txt create mode 100644 mods/sfinv/license.txt diff --git a/mods/default/README.txt b/mods/default/README.txt index d78941ad..1f747bce 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -238,10 +238,6 @@ Glass breaking sounds (CC BY 3.0): 2: http://www.freesound.org/people/Tomlija/sounds/97669/ 3: http://www.freesound.org/people/lsprice/sounds/88808/ -sonictechtonic (CC BY 3.0): -https://www.freesound.org/people/sonictechtonic/sounds/241872/ - player_damage.ogg - Mito551 (sounds) (CC BY-SA 3.0): default_dig_choppy.ogg default_dig_cracky.ogg diff --git a/mods/player_api/README.txt b/mods/player_api/README.txt index cf124686..62e37c69 100644 --- a/mods/player_api/README.txt +++ b/mods/player_api/README.txt @@ -10,11 +10,23 @@ Authors of source code Originally by celeron55, Perttu Ahola (LGPL 2.1) Various Minetest developers and contributors (LGPL 2.1) -Authors of media (textures and models) --------------------------------------- - +Authors of media (textures, models and sounds) +---------------------------------------------- stujones11 (CC BY-SA 3.0): - character.* -- Derived from a model by MirceaKitsune (CC BY-SA 3.0) + character.b3d + character.blend -- Both derived from a model by MirceaKitsune (CC BY-SA 3.0) Jordach (CC BY-SA 3.0): character.png + +BlockMen (CC BY-SA 3.0): + gui_hotbar.png + gui_hotbar_selected.png + +celeron55, Perttu Ahola (CC BY-SA 3.0): + player.png + player_back.png + +sonictechtonic (CC BY 3.0): +https://www.freesound.org/people/sonictechtonic/sounds/241872/ + player_damage.ogg diff --git a/mods/player_api/license.txt b/mods/player_api/license.txt index 4bee6c52..9d89425d 100644 --- a/mods/player_api/license.txt +++ b/mods/player_api/license.txt @@ -2,8 +2,8 @@ License of source code ---------------------- GNU Lesser General Public License, version 2.1 -Copyright (C) 2011-2017 celeron55, Perttu Ahola -Copyright (C) 2011-2017 Various Minetest developers and contributors +Copyright (C) 2011-2018 celeron55, Perttu Ahola +Copyright (C) 2011-2018 Various Minetest developers and contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; @@ -19,8 +19,10 @@ Licenses of media (textures, models and sounds) ----------------------------------------------- Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) -Copyright (C) 2017 stujones11 -Copyright (C) 2012-2017 Jordach +Copyright (C) 2011-2018 celeron55, Perttu Ahola +Copyright (C) 2012-2018 Jordach +Copyright (C) 2014-2018 BlockMen +Copyright (C) 2018 stujones11 You are free to: Share — copy and redistribute the material in any medium or format. @@ -49,3 +51,34 @@ rights may limit how you use the material. For more details: http://creativecommons.org/licenses/by-sa/3.0/ + +------------------------------------ + +Attribution 3.0 Unported (CC BY 3.0) +Copyright (C) 2014-2018 sonictechtonic + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by/3.0/ + diff --git a/mods/sfinv/README.md b/mods/sfinv/README.md deleted file mode 100644 index 0b152a0e..00000000 --- a/mods/sfinv/README.md +++ /dev/null @@ -1,23 +0,0 @@ -Simple Fast Inventory -==================== - -![SFINV Screeny](https://cdn.pbrd.co/images/1yQhd1TI.png) - -A cleaner, simpler, solution to having an advanced inventory in Minetest. - -Available for use outside of MTG here: - -Written by rubenwardy. -License: MIT - -See game_api.txt for this mod's API - -License of source code and media files: ---------------------------------------- -Copyright (C) 2016 rubenwardy - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/mods/sfinv/README.txt b/mods/sfinv/README.txt new file mode 100644 index 00000000..a7ac794f --- /dev/null +++ b/mods/sfinv/README.txt @@ -0,0 +1,13 @@ +Minetest Game mod: sfinv +======================== +See license.txt for license information. + +Simple Fast Inventory. +A cleaner, simpler, solution to having an advanced inventory in Minetest. +See game_api.txt for this mod's API. +Available for use outside of MTG here: +https://forum.minetest.net/viewtopic.php?t=19765 + +Authors of source code +---------------------- +rubenwardy (MIT) diff --git a/mods/sfinv/license.txt b/mods/sfinv/license.txt new file mode 100644 index 00000000..e27dc85f --- /dev/null +++ b/mods/sfinv/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2016-2018 rubenwardy + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT From 70c0181b59d47ab50616fbe1035ee25deeced481 Mon Sep 17 00:00:00 2001 From: Paramat Date: Sat, 4 Aug 2018 20:26:30 +0100 Subject: [PATCH 151/195] Pine bush: Do not force-place needles nodes --- mods/default/schematics/pine_bush.mts | Bin 111 -> 110 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/schematics/pine_bush.mts b/mods/default/schematics/pine_bush.mts index fbc6e17796ead10a08d02f4bb8c6b3c38356b84c..ca572a7d936614eef2de1906e7fb5c5e78ab695f 100644 GIT binary patch delta 27 icmd1Ln-C!;950_QpU Date: Sat, 11 Aug 2018 22:32:23 +0100 Subject: [PATCH 152/195] Add 'schematic_tables.txt' document --- schematic_tables.txt | 2165 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2165 insertions(+) create mode 100644 schematic_tables.txt diff --git a/schematic_tables.txt b/schematic_tables.txt new file mode 100644 index 00000000..cb9d82f0 --- /dev/null +++ b/schematic_tables.txt @@ -0,0 +1,2165 @@ +Minetest Game schematic tables +============================== + +This document acts as the official record of all schematic tables used in +Minetest Game, and should be updated by any commit that adds a table type +schematic. + +The following tables are for pasting into mods that contain a function to +convert the Lua tables into .mts files. Such mods often have two functions to +process two formats of the 'data' table: + +The standard table format is described in the 'Schematic specifier' section of +the lua_api.txt file in the Minetest Engine. +The 'data' table appears as a sequence of vertical slices through the structure +the schematic describes. +Each XY-plane slice has the X-rows formatted in order of increasing Y, so the +slices of the structure visually appear upside-down in the table. +In this document this format is used where 'mts_save()' appears. + +The transformed table format was created to be easier to work with. +Each XY-plane slice has the X-rows formatted in order of decreasing Y, so the +slices of the structure visually appear upright in the table. +In this document this format is used where 'mts_save_up()' appears. + + +-- This node will not replace existing world nodes + +local _ = {name = "air", prob = 0} + + +-- Mapgen Apple tree + +local L = {name = "default:leaves", prob = 191} +local N = {name = "default:leaves", prob = 223} +local M = {name = "default:leaves", prob = 255} +local F = {name = "default:apple", prob = 63} +local T = {name = "default:tree", prob = 255} +local Y = {name = "default:tree", prob = 255, force_place = true} +local U = {name = "default:tree", prob = 127} +local I = {name = "default:tree", prob = 127, force_place = true} + +mts_save("apple_tree", { + size = {x = 5, y = 8, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, N, N, N, L, + L, N, N, N, L, + L, N, N, N, L, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, Y, F, I, N, + N, M, M, M, N, + N, M, M, M, N, + _, N, N, N, _, + + _, _, Y, _, _, + _, _, Y, _, _, + _, _, Y, _, _, + _, _, Y, _, _, + N, F, M, F, N, + N, M, M, M, N, + N, M, M, M, N, + _, N, M, N, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, I, F, Y, N, + N, M, M, M, N, + N, M, M, M, N, + _, N, N, N, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, N, N, N, L, + L, N, N, N, L, + L, N, N, N, L, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 6, prob = 127}, + }, +}) + + +-- Apple tree from sapling + +mts_save("apple_tree_from_sapling", { + size = {x = 5, y = 8, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, N, N, N, L, + L, N, N, N, L, + L, N, N, N, L, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, T, F, U, N, + N, M, M, M, N, + N, M, M, M, N, + _, N, N, N, _, + + _, _, T, _, _, + _, _, Y, _, _, + _, _, T, _, _, + _, _, T, _, _, + N, F, M, F, N, + N, M, M, M, N, + N, M, M, M, N, + _, N, M, N, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, U, F, T, N, + N, M, M, M, N, + N, M, M, M, N, + _, N, N, N, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, N, N, N, L, + L, N, N, N, L, + L, N, N, N, L, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 6, prob = 127}, + }, +}) + + +-- Mapgen Jungle tree + +local L = {name = "default:jungleleaves", prob = 255} +local N = {name = "default:jungleleaves", prob = 223} +local M = {name = "default:jungleleaves", prob = 191} +local B = {name = "default:jungletree", prob = 255, force_place = true} +local Y = {name = "default:jungletree", prob = 191, force_place = true} +local U = {name = "default:jungletree", prob = 127, force_place = true} +local I = {name = "default:jungletree", prob = 255} + +mts_save("jungle_tree", { + size = {x = 5, y = 17, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, L, N, _, _, + _, _, N, L, N, + _, _, _, _, _, + _, _, _, _, _, + M, N, N, N, M, + M, N, N, N, M, + _, _, _, _, _, + + _, _, B, _, _, + _, _, B, _, _, + _, _, U, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, B, L, _, _, + _, _, L, B, L, + _, _, _, _, _, + _, _, _, _, _, + N, B, L, B, N, + N, L, L, L, N, + _, N, N, N, _, + + _, B, B, B, _, + _, B, B, B, _, + _, U, B, U, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, L, N, + N, L, B, _, _, + N, L, B, _, _, + _, _, B, L, N, + _, _, B, L, N, + _, _, B, _, _, + N, L, L, L, N, + N, L, L, L, N, + _, N, L, N, _, + + _, _, B, _, _, + _, _, B, _, _, + _, _, U, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, L, B, L, + L, B, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, L, B, L, + _, _, _, _, _, + N, B, L, B, N, + N, L, L, L, N, + _, N, N, N, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, N, L, N, + N, L, N, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, N, L, N, + _, _, _, _, _, + M, N, N, N, M, + M, N, N, N, M, + _, _, _, _, _, + }, + yslice_prob = { + {ypos=6, prob=191}, + {ypos=7, prob=191}, + {ypos=8, prob=191}, + {ypos=9, prob=191}, + {ypos=10, prob=191}, + }, +}) + + +-- Jungle tree from sapling + +local B = {name = "default:jungletree", prob = 255} +local C = {name = "default:jungletree", prob = 255, force_place = true} +local Y = {name = "default:jungletree", prob = 191} +local U = {name = "default:jungletree", prob = 127} + +mts_save("jungle_tree_from_sapling", { + size = {x = 5, y = 17, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, L, N, _, _, + _, _, N, L, N, + _, _, _, _, _, + _, _, _, _, _, + M, N, N, N, M, + M, N, N, N, M, + _, _, _, _, _, + + _, _, B, _, _, + _, _, B, _, _, + _, _, U, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, B, L, _, _, + _, _, L, B, L, + _, _, _, _, _, + _, _, _, _, _, + N, B, L, B, N, + N, L, L, L, N, + _, N, N, N, _, + + _, B, B, B, _, + _, B, C, B, _, + _, U, B, U, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, L, N, + N, L, B, _, _, + N, L, B, _, _, + _, _, B, L, N, + _, _, B, L, N, + _, _, B, _, _, + N, L, L, L, N, + N, L, L, L, N, + _, N, L, N, _, + + _, _, B, _, _, + _, _, B, _, _, + _, _, U, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, L, B, L, + L, B, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, L, B, L, + _, _, _, _, _, + N, B, L, B, N, + N, L, L, L, N, + _, N, N, N, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, N, L, N, + N, L, N, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, N, L, N, + _, _, _, _, _, + M, N, N, N, M, + M, N, N, N, M, + _, _, _, _, _, + }, + yslice_prob = { + {ypos=6, prob=191}, + {ypos=7, prob=191}, + {ypos=8, prob=191}, + {ypos=9, prob=191}, + {ypos=10, prob=191}, + }, +}) + + +-- Mapgen Pine tree + +local L = {name = "default:pine_needles", prob = 255} +local M = {name = "default:pine_needles", prob = 223} +local N = {name = "default:pine_needles", prob = 191} +local T = {name = "default:pine_tree", prob = 255, force_place = true} +local B = {name = "default:pine_tree", prob = 255} + +mts_save("pine_tree", { + size = {x = 5, y = 16, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + L, _, T, _, L, + _, L, T, L, _, + _, _, T, _, _, + L, _, T, _, L, + _, L, T, L, _, + _, _, T, _, _, + L, _, T, _, L, + _, L, L, L, _, + _, _, L, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + {ypos = 5, prob = 127}, + {ypos = 9, prob = 127}, + {ypos = 12, prob = 127}, + }, +}) + + +-- Pine tree from sapling + +local T = {name = "default:pine_tree", prob = 255} +local U = {name = "default:pine_tree", prob = 255, force_place = true} + +mts_save("pine_tree_from_sapling", { + size = {x = 5, y = 16, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + + _, _, T, _, _, + _, _, U, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + L, _, T, _, L, + _, L, T, L, _, + _, _, T, _, _, + L, _, T, _, L, + _, L, T, L, _, + _, _, T, _, _, + L, _, T, _, L, + _, L, L, L, _, + _, _, L, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + {ypos = 5, prob = 127}, + {ypos = 9, prob = 127}, + {ypos = 12, prob = 127}, + }, +}) + + +-- Snowy pine tree from sapling + +local T = {name = "default:pine_tree", prob = 255} +local U = {name = "default:pine_tree", prob = 255, force_place = true} +local L = {name = "default:pine_needles", prob = 255} +local S = {name = "default:snow", prob = 255} + +mts_save("snowy_pine_tree_from_sapling", { + size = {x = 5, y = 16, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + L, L, L, L, L, + S, S, S, S, S, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + L, L, _, L, M, + S, L, L, L, _, + _, _, _, _, _, + _, L, _, L, L, + _, L, L, L, S, + _, S, S, S, _, + _, _, _, _, _, + + _, _, T, _, _, + _, _, U, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + L, _, T, _, L, + _, L, T, L, _, + _, _, T, _, _, + L, _, T, _, L, + _, L, T, L, _, + _, _, T, _, _, + L, _, T, _, L, + S, L, L, L, S, + _, S, L, S, _, + _, _, S, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + L, L, _, L, L, + S, L, L, L, S, + _, S, S, S, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, L, + _, _, _, _, S, + _, _, _, _, _, + L, L, L, L, _, + S, S, S, S, _, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + {ypos = 8, prob = 127}, + {ypos = 11, prob = 127}, + }, +}) + + +-- Mapgen Acacia tree + +local L = {name = "default:acacia_leaves", prob = 255} +local M = {name = "default:acacia_leaves", prob = 223} +local T = {name = "default:acacia_tree", prob = 255, force_place = true} + +mts_save("acacia_tree", { + size = {x = 9, y = 9, z = 9}, + data = { + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + M, M, M, M, _, _, _, _, _, + _, _, _, _, M, M, M, M, M, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + M, L, L, M, _, _, _, _, _, + _, _, _, _, M, L, L, L, M, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, T, _, _, _, _, _, _, + M, L, L, M, _, _, T, _, _, + _, _, _, _, M, L, L, L, M, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, T, _, _, _, _, _, + _, _, _, _, _, T, _, _, _, + M, M, M, M, _, _, _, _, _, + _, _, _, _, M, L, L, L, M, + + _, _, _, _, T, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + M, M, M, M, M, M, M, M, M, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, T, _, _, _, + _, _, _, T, _, _, _, _, _, + _, _, _, _, _, M, M, M, M, + M, L, L, L, M, _, _, _, _, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, T, _, _, + _, _, T, _, _, M, L, L, M, + M, L, L, L, M, _, _, _, _, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, M, L, L, M, + M, L, L, L, M, _, _, _, _, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, M, M, M, M, + M, M, M, M, M, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + }, +}) + + +-- Acacia tree from sapling + +local T = {name = "default:acacia_tree", prob = 255} +local U = {name = "default:acacia_tree", prob = 255, force_place = true} + +mts_save("acacia_tree_from_sapling", { + size = {x = 9, y = 9, z = 9}, + data = { + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + M, M, M, M, _, _, _, _, _, + _, _, _, _, M, M, M, M, M, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + M, L, L, M, _, _, _, _, _, + _, _, _, _, M, L, L, L, M, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, T, _, _, _, _, _, _, + M, L, L, M, _, _, T, _, _, + _, _, _, _, M, L, L, L, M, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, T, _, _, _, _, _, + _, _, _, _, _, T, _, _, _, + M, M, M, M, _, _, _, _, _, + _, _, _, _, M, L, L, L, M, + + _, _, _, _, T, _, _, _, _, + _, _, _, _, U, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + M, M, M, M, M, M, M, M, M, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, T, _, _, _, + _, _, _, T, _, _, _, _, _, + _, _, _, _, _, M, M, M, M, + M, L, L, L, M, _, _, _, _, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, T, _, _, + _, _, T, _, _, M, L, L, M, + M, L, L, L, M, _, _, _, _, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, M, L, L, M, + M, L, L, L, M, _, _, _, _, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, M, M, M, M, + M, M, M, M, M, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + }, +}) + + +-- Mapgen Aspen tree + +local T = {name = "default:aspen_tree", prob = 255, force_place = true} +local B = {name = "default:aspen_tree", prob = 255} +local L = {name = "default:aspen_leaves", prob = 255} +local M = {name = "default:aspen_leaves", prob = 223} +local N = {name = "default:aspen_leaves", prob = 127} + +mts_save("aspen_tree", { + size = {x = 5, y = 14, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + _, _, _, _, _, + + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, L, T, L, _, + L, L, T, L, L, + _, L, T, L, _, + L, L, T, L, L, + _, L, T, L, _, + L, L, T, L, L, + _, L, L, L, _, + _, _, L, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + {ypos = 8, prob = 127}, + {ypos = 10, prob = 127}, + }, +}) + + +-- Aspen tree from sapling + +mts_save("aspen_tree_from_sapling", { + size = {x = 5, y = 14, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + _, _, _, _, _, + + _, _, B, _, _, + _, _, T, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, L, B, L, _, + L, L, B, L, L, + _, L, B, L, _, + L, L, B, L, L, + _, L, B, L, _, + L, L, B, L, L, + _, L, L, L, _, + _, _, L, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + {ypos = 8, prob = 127}, + {ypos = 10, prob = 127}, + }, +}) + + +-- Mapgen emergent jungle tree + +local L = {name = "default:jungleleaves", prob = 255} +local N = {name = "default:jungleleaves", prob = 223} +local M = {name = "default:jungleleaves", prob = 127} +local B = {name = "default:jungletree", prob = 255, force_place = true} +local U = {name = "default:jungletree", prob = 127, force_place = true} + +mts_save("emergent_jungle_tree", { + size = {x = 7, y = 37, z = 7}, + data = { + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + B, _, _, _, _, _, B, + B, _, _, _, _, _, B, + B, _, _, _, _, _, B, + U, _, _, _, _, _, U, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, N, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, N, N, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, N, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, N, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, N, N, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, M, M, M, M, M, _, + _, N, N, N, N, N, _, + _, N, N, N, N, N, _, + _, N, N, N, N, N, _, + _, _, _, _, _, _, _, + + _, _, _, _, _, _, _, + _, _, B, _, B, _, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, U, B, _, B, U, _, + _, _, U, _, U, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, B, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, B, N, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, B, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, B, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, B, N, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + M, _, _, _, _, _, M, + N, L, _, _, _, L, N, + N, B, L, L, L, B, N, + N, L, L, L, L, L, N, + _, N, N, N, N, N, _, + + _, _, B, _, B, _, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, U, B, B, B, U, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + N, N, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, _, B, B, N, N, + N, N, N, B, _, _, _, + _, _, _, B, _, _, _, + _, _, N, B, N, _, _, + _, _, _, B, _, _, _, + _, _, _, B, N, N, N, + N, N, B, B, _, _, _, + _, _, _, B, _, _, _, + _, _, _, B, B, N, N, + N, N, N, B, _, _, _, + _, _, _, B, _, _, _, + M, _, B, B, B, _, M, + N, _, B, _, B, _, N, + N, L, L, _, L, L, N, + N, L, L, L, L, L, N, + _, N, L, L, L, N, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + N, B, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, B, N, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + N, B, B, B, B, _, _, + _, _, B, B, B, _, _, + M, _, B, _, B, _, M, + N, _, _, _, _, _, N, + N, L, _, _, _, L, N, + N, L, L, L, L, L, N, + _, N, L, L, L, N, _, + + _, _, B, _, B, _, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, U, B, B, B, U, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, _, B, _, _, _, + N, N, N, B, _, _, _, + _, _, _, B, B, N, N, + _, _, _, B, _, _, _, + N, N, B, B, _, _, _, + _, _, _, B, N, N, N, + _, _, _, B, _, _, _, + _, _, N, B, N, _, _, + _, _, _, B, _, _, _, + N, N, N, B, _, _, _, + _, _, _, B, _, _, _, + M, _, B, B, B, _, M, + N, _, B, _, B, _, N, + N, L, L, _, L, L, N, + N, L, L, L, L, L, N, + _, N, L, L, L, N, _, + + _, _, _, _, _, _, _, + _, _, B, _, B, _, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, U, B, _, B, U, _, + _, _, U, _, U, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, B, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, B, N, + _, _, _, _, _, _, _, + N, B, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, B, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + M, _, _, _, _, _, M, + N, L, _, _, _, L, N, + N, B, L, L, L, B, N, + N, L, L, L, L, L, N, + _, N, N, N, N, N, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + B, _, _, _, _, _, B, + B, _, _, _, _, _, B, + B, _, _, _, _, _, B, + U, _, _, _, _, _, U, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, N, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, N, N, + _, _, _, _, _, _, _, + N, N, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, N, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, M, M, M, M, M, _, + _, N, N, N, N, N, _, + _, N, N, N, N, N, _, + _, N, N, N, N, N, _, + _, _, _, _, _, _, _, + }, + yslice_prob = { + {ypos = 13, prob = 127}, + {ypos = 14, prob = 127}, + {ypos = 15, prob = 127}, + {ypos = 16, prob = 127}, + {ypos = 17, prob = 127}, + {ypos = 18, prob = 127}, + {ypos = 19, prob = 127}, + {ypos = 20, prob = 127}, + {ypos = 21, prob = 127}, + {ypos = 22, prob = 127}, + {ypos = 23, prob = 127}, + {ypos = 24, prob = 127}, + }, +}) + + +-- Emergent jungle tree from sapling + +local L = {name = "default:jungleleaves", prob = 255} +local N = {name = "default:jungleleaves", prob = 223} +local M = {name = "default:jungleleaves", prob = 127} +local S = {name = "default:jungletree", prob = 255, force_place = true} +local B = {name = "default:jungletree", prob = 255} +local U = {name = "default:jungletree", prob = 127} + +mts_save("emergent_jungle_tree_from_sapling", { + size = {x = 7, y = 37, z = 7}, + data = { + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + B, _, _, _, _, _, B, + B, _, _, _, _, _, B, + B, _, _, _, _, _, B, + U, _, _, _, _, _, U, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, N, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, N, N, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, N, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, N, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, N, N, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, M, M, M, M, M, _, + _, N, N, N, N, N, _, + _, N, N, N, N, N, _, + _, N, N, N, N, N, _, + _, _, _, _, _, _, _, + + _, _, _, _, _, _, _, + _, _, B, _, B, _, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, U, B, _, B, U, _, + _, _, U, _, U, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, B, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, B, N, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, B, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, B, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, B, N, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + M, _, _, _, _, _, M, + N, L, _, _, _, L, N, + N, B, L, L, L, B, N, + N, L, L, L, L, L, N, + _, N, N, N, N, N, _, + + _, _, B, _, B, _, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, U, B, B, B, U, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + N, N, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, _, B, B, N, N, + N, N, N, B, _, _, _, + _, _, _, B, _, _, _, + _, _, N, B, N, _, _, + _, _, _, B, _, _, _, + _, _, _, B, N, N, N, + N, N, B, B, _, _, _, + _, _, _, B, _, _, _, + _, _, _, B, B, N, N, + N, N, N, B, _, _, _, + _, _, _, B, _, _, _, + M, _, B, B, B, _, M, + N, _, B, _, B, _, N, + N, L, L, _, L, L, N, + N, L, L, L, L, L, N, + _, N, L, L, L, N, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, B, B, B, _, _, + _, _, B, S, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + N, B, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, B, N, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + N, B, B, B, B, _, _, + _, _, B, B, B, _, _, + M, _, B, _, B, _, M, + N, _, _, _, _, _, N, + N, L, _, _, _, L, N, + N, L, L, L, L, L, N, + _, N, L, L, L, N, _, + + _, _, B, _, B, _, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, U, B, B, B, U, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, _, B, _, _, _, + N, N, N, B, _, _, _, + _, _, _, B, B, N, N, + _, _, _, B, _, _, _, + N, N, B, B, _, _, _, + _, _, _, B, N, N, N, + _, _, _, B, _, _, _, + _, _, N, B, N, _, _, + _, _, _, B, _, _, _, + N, N, N, B, _, _, _, + _, _, _, B, _, _, _, + M, _, B, B, B, _, M, + N, _, B, _, B, _, N, + N, L, L, _, L, L, N, + N, L, L, L, L, L, N, + _, N, L, L, L, N, _, + + _, _, _, _, _, _, _, + _, _, B, _, B, _, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, U, B, _, B, U, _, + _, _, U, _, U, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, B, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, B, N, + _, _, _, _, _, _, _, + N, B, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, B, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + M, _, _, _, _, _, M, + N, L, _, _, _, L, N, + N, B, L, L, L, B, N, + N, L, L, L, L, L, N, + _, N, N, N, N, N, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + B, _, _, _, _, _, B, + B, _, _, _, _, _, B, + B, _, _, _, _, _, B, + U, _, _, _, _, _, U, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, N, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, N, N, + _, _, _, _, _, _, _, + N, N, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, N, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, M, M, M, M, M, _, + _, N, N, N, N, N, _, + _, N, N, N, N, N, _, + _, N, N, N, N, N, _, + _, _, _, _, _, _, _, + }, + yslice_prob = { + {ypos = 13, prob = 127}, + {ypos = 14, prob = 127}, + {ypos = 15, prob = 127}, + {ypos = 16, prob = 127}, + {ypos = 17, prob = 127}, + {ypos = 18, prob = 127}, + {ypos = 19, prob = 127}, + {ypos = 20, prob = 127}, + {ypos = 21, prob = 127}, + {ypos = 22, prob = 127}, + {ypos = 23, prob = 127}, + {ypos = 24, prob = 127}, + }, +}) + + +-- Mapgen small pine tree + +local L = {name = "default:pine_needles", prob = 255} +local M = {name = "default:pine_needles", prob = 223} +local N = {name = "default:pine_needles", prob = 191} +local T = {name = "default:pine_tree", prob = 255, force_place = true} +local B = {name = "default:pine_tree", prob = 255} +local S = {name = "default:snow", prob = 255} + +mts_save("small_pine_tree", { + size = {x = 5, y = 12, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, L, _, L, L, + _, L, L, L, _, + _, L, L, L, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + L, _, T, _, L, + L, L, T, L, L, + _, L, T, L, _, + _, L, T, L, _, + _, L, L, L, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, L, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, L, _, L, L, + _, L, L, L, _, + _, L, L, L, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + }, +}) + + +-- Small pine tree from sapling + +mts_save("small_pine_tree_from_sapling", { + size = {x = 5, y = 12, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, L, _, L, L, + _, L, L, L, _, + _, L, L, L, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, B, _, _, + _, _, T, _, _, + _, _, B, _, _, + _, _, B, _, _, + L, _, B, _, L, + L, L, B, L, L, + _, L, B, L, _, + _, L, B, L, _, + _, L, L, L, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, L, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, L, _, L, L, + _, L, L, L, _, + _, L, L, L, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + }, +}) + + +-- Snowy small pine tree from sapling + +mts_save("snowy_small_pine_tree_from_sapling", { + size = {x = 5, y = 13, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, L, L, L, _, + _, S, L, S, _, + _, _, S, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, L, _, L, L, + S, L, L, L, S, + _, L, L, L, _, + _, L, L, L, _, + _, S, L, S, _, + _, _, L, _, _, + _, _, S, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, B, _, _, + _, _, T, _, _, + _, _, B, _, _, + _, _, B, _, _, + L, _, B, _, L, + L, L, B, L, L, + S, L, B, L, S, + _, L, B, L, _, + _, L, L, L, _, + _, L, L, L, _, + _, S, L, S, _, + _, _, L, _, _, + _, _, S, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, L, _, L, L, + S, L, L, L, S, + _, L, L, L, _, + _, L, L, L, _, + _, S, L, S, _, + _, _, L, _, _, + _, _, S, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, L, L, L, _, + _, S, L, S, _, + _, _, S, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + }, +}) + + +-- Apple tree log + +mts_save("apple_log", { + size = {x = 4, y = 2, z = 1}, + data = { + {name = "default:tree", param2 = 12, prob = 127}, + {name = "default:tree", param2 = 12}, + {name = "default:tree", param2 = 12}, + {name = "default:tree", param2 = 12}, + {name = "air", prob = 0}, + {name = "flowers:mushroom_brown", prob = 63}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + }, +}) + + +-- Jungletree log + +mts_save("jungle_log", { + size = {x = 5, y = 2, z = 1}, + data = { + {name = "default:jungletree", param2 = 12, prob = 127}, + {name = "default:jungletree", param2 = 12}, + {name = "default:jungletree", param2 = 12}, + {name = "default:jungletree", param2 = 12}, + {name = "default:jungletree", param2 = 12, prob = 127}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "flowers:mushroom_brown", prob = 127}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + }, +}) + + +-- Pine tree log + +mts_save("pine_log", { + size = {x = 5, y = 2, z = 1}, + data = { + {name = "default:pine_tree", param2 = 12, prob = 127}, + {name = "default:pine_tree", param2 = 12}, + {name = "default:pine_tree", param2 = 12}, + {name = "default:pine_tree", param2 = 12}, + {name = "default:pine_tree", param2 = 12, prob = 127}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "flowers:mushroom_red", prob = 63}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + }, +}) + + +-- Acacia tree log + +mts_save("acacia_log", { + size = {x = 5, y = 1, z = 1}, + data = { + {name = "default:acacia_tree", param2 = 12, prob = 127}, + {name = "default:acacia_tree", param2 = 12}, + {name = "default:acacia_tree", param2 = 12}, + {name = "default:acacia_tree", param2 = 12}, + {name = "default:acacia_tree", param2 = 12, prob = 127}, + }, +}) + + +-- Aspen tree log + +mts_save("aspen_log", { + size = {x = 5, y = 2, z = 1}, + data = { + {name = "default:aspen_tree", param2 = 12, prob = 127}, + {name = "default:aspen_tree", param2 = 12}, + {name = "default:aspen_tree", param2 = 12}, + {name = "default:aspen_tree", param2 = 12}, + {name = "default:aspen_tree", param2 = 12, prob = 127}, + {name = "air", prob = 0}, + {name = "flowers:mushroom_red", prob = 63}, + {name = "flowers:mushroom_brown", prob = 63}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + }, +}) + + +-- Large cactus + +local C = {name = "default:cactus", prob = 255, param2 = 20} +local R = {name = "default:cactus", prob = 255, param2 = 20, force_place = true} +local E = {name = "default:cactus", prob = 127, param2 = 20} + +mts_save("large_cactus", { + size = {x = 5, y = 7, z = 1}, + data = { + _, _, R, _, _, + _, _, C, _, _, + _, _, C, _, _, + C, C, C, C, C, + C, _, C, _, C, + E, _, C, _, E, + _, _, C, _, _, + }, +}) + + +-- Papyrus + +mts_save("papyrus", { + size = {x = 1, y = 7, z = 1}, + data = { + {name = "default:dirt", prob = 255, force_place = true}, + {name = "default:dirt", prob = 255, force_place = true}, + {name = "default:papyrus", prob = 255}, + {name = "default:papyrus", prob = 255}, + {name = "default:papyrus", prob = 255}, + {name = "default:papyrus", prob = 255}, + {name = "default:papyrus", prob = 255}, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + }, +}) + + +-- Corals + +local C = {name = "default:coral_brown", prob = 255, force_place = true} +local c = {name = "default:coral_brown", prob = 191, force_place = true} +local O = {name = "default:coral_orange", prob = 255, force_place = true} +local o = {name = "default:coral_orange", prob = 191, force_place = true} +local X = {name = "default:coral_skeleton", prob = 255, force_place = true} +local x = {name = "default:coral_skeleton", prob = 63, force_place = true} + +mts_save("corals", { + size = {x = 5, y = 3, z = 5}, + data = { + _, _, _, _, _, + o, C, O, c, _, + _, C, x, _, _, + + _, _, X, _, _, + C, O, O, C, o, + c, c, O, o, x, + + _, X, X, X, _, + c, C, C, O, O, + O, C, O, C, c, + + _, _, X, _, _, + x, O, C, O, C, + _, x, C, O, _, + + _, _, _, _, _, + _, o, O, C, c, + _, _, o, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + } +}) + + +-- Bush + +local L = {name = "default:bush_leaves", prob = 255} +local M = {name = "default:bush_leaves", prob = 191} +local N = {name = "default:bush_leaves", prob = 127} +local S = {name = "default:bush_stem", prob = 255, force_place = true} + +mts_save("bush", { + size = {x = 3, y = 3, z = 3}, + data = { + _, _, _, + M, L, M, + N, M, N, + + _, _, _, + L, S, L, + M, L, M, + + _, _, _, + M, L, M, + N, M, N, + }, +}) + + +-- Acacia bush + +local L = {name = "default:acacia_bush_leaves", prob = 255} +local M = {name = "default:acacia_bush_leaves", prob = 191} +local N = {name = "default:acacia_bush_leaves", prob = 127} +local S = {name = "default:acacia_bush_stem", prob = 255, force_place = true} + +mts_save("acacia_bush", { + size = {x = 3, y = 3, z = 3}, + data = { + _, _, _, + N, M, N, + M, L, M, + + _, _, _, + M, S, M, + L, L, L, + + _, _, _, + N, M, N, + M, L, M, + }, +}) + + +-- Pine bush + +local L = {name = "default:pine_bush_needles", prob = 255} +local M = {name = "default:pine_bush_needles", prob = 191} +local N = {name = "default:pine_bush_needles", prob = 127} +local S = {name = "default:pine_bush_stem", prob = 255, force_place = true} + +mts_save("pine_bush", { + size = {x = 3, y = 3, z = 3}, + data = { + _, _, _, + M, L, M, + N, M, N, + + _, _, _, + L, S, L, + M, L, M, + + _, _, _, + M, L, M, + N, M, N, + }, +}) From 20b433881b733409e13729d6d7b9df3607c9ca82 Mon Sep 17 00:00:00 2001 From: Paramat Date: Mon, 20 Aug 2018 23:56:00 +0100 Subject: [PATCH 153/195] New wider apple tree schematic Precisely reduce trees and logs per mapchunk division to compensate. --- mods/default/mapgen.lua | 8 +- mods/default/nodes.lua | 4 +- mods/default/schematics/apple_tree.mts | Bin 169 -> 209 bytes .../schematics/apple_tree_from_sapling.mts | Bin 173 -> 208 bytes mods/default/trees.lua | 2 +- schematic_tables.txt | 211 ++++++++++-------- 6 files changed, 128 insertions(+), 97 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index f0da5d5a..7e1cf7df 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1621,8 +1621,8 @@ function default.register_decorations() place_on = {"default:dirt_with_grass"}, sidelen = 16, noise_params = { - offset = 0.036, - scale = 0.022, + offset = 0.024, + scale = 0.015, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, @@ -1643,8 +1643,8 @@ function default.register_decorations() place_offset_y = 1, sidelen = 16, noise_params = { - offset = 0.0018, - scale = 0.0011, + offset = 0.0012, + scale = 0.0007, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 4f427f43..9b01456b 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -684,8 +684,8 @@ minetest.register_node("default:sapling", { "default:sapling", -- minp, maxp to be checked, relative to sapling pos -- minp_relative.y = 1 because sapling pos has been checked - {x = -2, y = 1, z = -2}, - {x = 2, y = 6, z = 2}, + {x = -3, y = 1, z = -3}, + {x = 3, y = 6, z = 3}, -- maximum interval of interior volume check 4) diff --git a/mods/default/schematics/apple_tree.mts b/mods/default/schematics/apple_tree.mts index 2bd57c1fc4aa36e2f03c6ac2989c86b575e2784e..d56cd54b8efb295ccb5ab11b99cc914c8627dca1 100644 GIT binary patch literal 209 zcmeYb3HD`RVPI$AU|_GWx332QAfGugvxtE&B{eOvG^fNWCpEDwwU~hy#!oCL$Vp}3 zfpJTUQd2ADyq$QFx50peHIVIPN6!bh<3X(^QI|8W>Srn?70vPQWXsZ8KJUIx@!7;V zkG9-@$|-$(Zv4+9`_7-6u6}x(-)F_^(wTFg8x(xqGX4F!kGub0zh${6ULkvb8zZNI zRO@%$+SzGgMt)Hb^R91hn-bmBU?!9HKASgydCG+kw)5V9`~K(k<|u|ZPwndfaEDza literal 169 zcmeYb3HD`RVPIw8U|_AUx333bAfGugvxtE&B{eOvG^fNWCpEDwwU~hi#xE&KO=aMP z@e&IPa#AbiBqt~c89ZuT!tBPT#+IgVELCpPPM?C<9g#f_mlbAgsJv1pU-)dIY~9D7 zKYxDYU|PQG&;L)qKYxDx`n4hpbAVyM7kg%_iTd&S{fpMw$?vZG{q%qGEcboC+msj> J$|h)D1OV1LMcM!W diff --git a/mods/default/schematics/apple_tree_from_sapling.mts b/mods/default/schematics/apple_tree_from_sapling.mts index d258ab1a80a20520986cd0d37f560aeebac359f8..232510034d7d858e36a8a9fcfdd96c76d988f07e 100644 GIT binary patch literal 208 zcmeYb3HD`RVPI$AU|_GWx332QAfGugvxtE&B{eOvG^fNWCpEDwwU~hy#!oCL$Vp}3 zfpJTUQd2ADyq$QLw?ToYrIGJYM^C|G?bay^oH+LTPdl=>?e+1MLBdN9pZY!bsLtdL ztF@nE!!BsNec~zl%i6lMe2#9}v&q@+Q6Gbq0={jVnm?uD-T$d+e&@>z0)OW;u-@o> yFkLfumif=kaYef?2tKVU(b*8E6LVv;Y)*di%?7Ld%6$*t|Gd6&7o&!g`gH((_g#ko literal 173 zcmeYb3HD`RVPIw8U|_AUx333bAfGugvxtE&B{eOvG^fNWCpEDwwU~hi#xE&KO=aMP z@e&IPa#AbiBqt~c89ZuT!tBPT#+IgVELCpPPM?C<9g#f_mlbAgsJv1pU-)dIY~9D7 zKYxDYU|PQGPgUjbKYxDxs^U1v5W*v}mfiDjdc(#Bmwh#RZMt^-s(JJ5=IQInv)uRn NZc}1l2)v>e2mk;gNd5o- diff --git a/mods/default/trees.lua b/mods/default/trees.lua index a46ac5ac..dc18ea41 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -387,7 +387,7 @@ end function default.grow_new_apple_tree(pos) local path = minetest.get_modpath("default") .. "/schematics/apple_tree_from_sapling.mts" - minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + minetest.place_schematic({x = pos.x - 3, y = pos.y - 1, z = pos.z - 3}, path, "random", nil, false) end diff --git a/schematic_tables.txt b/schematic_tables.txt index cb9d82f0..ee25b822 100644 --- a/schematic_tables.txt +++ b/schematic_tables.txt @@ -30,66 +30,80 @@ local _ = {name = "air", prob = 0} -- Mapgen Apple tree -local L = {name = "default:leaves", prob = 191} -local N = {name = "default:leaves", prob = 223} local M = {name = "default:leaves", prob = 255} +local N = {name = "default:leaves", prob = 223} local F = {name = "default:apple", prob = 63} -local T = {name = "default:tree", prob = 255} local Y = {name = "default:tree", prob = 255, force_place = true} -local U = {name = "default:tree", prob = 127} -local I = {name = "default:tree", prob = 127, force_place = true} +local T = {name = "default:tree", prob = 255} mts_save("apple_tree", { - size = {x = 5, y = 8, z = 5}, + size = {x = 7, y = 8, z = 7}, data = { - _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - L, N, N, N, L, - L, N, N, N, L, - L, N, N, N, L, - _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, M, N, _, _, + _, _, _, N, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - N, Y, F, I, N, - N, M, M, M, N, - N, M, M, M, N, - _, N, N, N, _, - - _, _, Y, _, _, - _, _, Y, _, _, - _, _, Y, _, _, - _, _, Y, _, _, - N, F, M, F, N, - N, M, M, M, N, - N, M, M, M, N, - _, N, M, N, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, M, M, F, M, M, _, + _, N, M, M, M, N, _, + _, _, N, M, N, _, _, + _, _, _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - N, I, F, Y, N, - N, M, M, M, N, - N, M, M, M, N, - _, N, N, N, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, M, Y, _, _, M, N, + _, M, M, _, Y, M, _, + _, N, M, M, M, N, _, + _, _, _, N, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - L, N, N, N, L, - L, N, N, N, L, - L, N, N, N, L, - _, _, _, _, _, + _, _, _, Y, _, _, _, + _, _, _, Y, _, _, _, + _, _, _, Y, _, _, _, + _, _, _, Y, _, _, _, + M, F, _, Y, _, F, M, + N, M, _, _, _, M, N, + _, M, M, M, M, M, _, + _, _, N, M, N, _, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, M, _, _, Y, M, N, + _, M, Y, _, M, M, _, + _, N, M, M, M, N, _, + _, _, _, N, _, _, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, M, M, F, M, M, _, + _, N, M, M, M, N, _, + _, _, N, M, N, _, _, + _, _, _, _, _, _, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, M, N, _, _, + _, _, _, N, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, }, yslice_prob = { {ypos = 2, prob = 127}, - {ypos = 6, prob = 127}, }, }) @@ -97,56 +111,73 @@ mts_save("apple_tree", { -- Apple tree from sapling mts_save("apple_tree_from_sapling", { - size = {x = 5, y = 8, z = 5}, + size = {x = 7, y = 8, z = 7}, data = { - _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - L, N, N, N, L, - L, N, N, N, L, - L, N, N, N, L, - _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, M, N, _, _, + _, _, _, N, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - N, T, F, U, N, - N, M, M, M, N, - N, M, M, M, N, - _, N, N, N, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, M, M, F, M, M, _, + _, N, M, M, M, N, _, + _, _, N, M, N, _, _, + _, _, _, _, _, _, _, - _, _, T, _, _, - _, _, Y, _, _, - _, _, T, _, _, - _, _, T, _, _, - N, F, M, F, N, - N, M, M, M, N, - N, M, M, M, N, - _, N, M, N, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, M, T, _, _, M, N, + _, M, M, _, T, M, _, + _, N, M, M, M, N, _, + _, _, _, N, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - N, U, F, T, N, - N, M, M, M, N, - N, M, M, M, N, - _, N, N, N, _, + _, _, _, T, _, _, _, + _, _, _, Y, _, _, _, + _, _, _, T, _, _, _, + _, _, _, T, _, _, _, + M, F, _, T, _, F, M, + N, M, _, _, _, M, N, + _, M, M, M, M, M, _, + _, _, N, M, N, _, _, - _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - _, _, _, _, _, - L, N, N, N, L, - L, N, N, N, L, - L, N, N, N, L, - _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, M, _, _, T, M, N, + _, M, T, _, M, M, _, + _, N, M, M, M, N, _, + _, _, _, N, _, _, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, M, M, F, M, M, _, + _, N, M, M, M, N, _, + _, _, N, M, N, _, _, + _, _, _, _, _, _, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, M, N, _, _, + _, _, _, N, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, }, yslice_prob = { {ypos = 2, prob = 127}, - {ypos = 6, prob = 127}, }, }) From f4f90520ec5c69ad3196af5c02d6000f4703ecd4 Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 21 Aug 2018 20:41:26 +0100 Subject: [PATCH 154/195] Add new dirt texture by random-geek --- mods/default/README.txt | 4 +++- mods/default/license.txt | 7 ++++--- mods/default/textures/default_dirt.png | Bin 277 -> 5889 bytes 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index 1f747bce..53035dcc 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -164,7 +164,6 @@ sofar (CC0 1.0): Neuromancer (CC BY-SA 3.0): default_cobble.png, based on texture by Brane praefect default_mossycobble.png, based on texture by Brane praefect - default_dirt.png default_furnace_*.png Gambit (CC BY-SA 3.0): @@ -230,6 +229,9 @@ CloudyProton (CC BY-SA 3.0): Mossmanikin (CC BY-SA 3.0): default_fern_*.png +random-geek (CC BY-SA 3.0): + default_dirt.png -- Derived from a texture by Neuromancer (CC BY-SA 3.0) + Sounds ------ diff --git a/mods/default/license.txt b/mods/default/license.txt index 4610bac8..a5ea24b5 100644 --- a/mods/default/license.txt +++ b/mods/default/license.txt @@ -2,8 +2,8 @@ License of source code ---------------------- GNU Lesser General Public License, version 2.1 -Copyright (C) 2011-2016 celeron55, Perttu Ahola -Copyright (C) 2011-2016 Various Minetest developers and contributors +Copyright (C) 2011-2018 celeron55, Perttu Ahola +Copyright (C) 2011-2018 Various Minetest developers and contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; @@ -19,7 +19,7 @@ Licenses of media (textures, models and sounds) ----------------------------------------------- Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) -Copyright (C) 2010-2017: +Copyright (C) 2010-2018: celeron55, Perttu Ahola Cisoun @@ -49,6 +49,7 @@ Copyright (C) 2010-2017: CloudyProton TumeniNodes Mossmanikin + random-geek You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/default/textures/default_dirt.png b/mods/default/textures/default_dirt.png index ca7e4aef1415057e60b7f6427ba09ffd0a7546cc..afe4a2e13f0af9e556fab8362cb502ffa16e5344 100644 GIT binary patch literal 5889 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 delta 261 zcmV+g0s8)dE|mh17=H)@0000eEe}%w001*kOjJc-LMmN9CS*h`TRkLKHyme3FjO=d zaZx#KO*LyvGFdtxMkoq=TtshBI8-+rP%#xuE)uWSpOyds0G&xhK~xyi4a&C>1VIb~ zL4cYoZa@EMpDnpn$W5mv|a_kNZQgf4<;-x0qJ27RM^ zNXQjXts~iP(6OC>BMo4}zECzal7{_Fy57?X)El1s^!t9}U`Lu4CQ|GNh{}dwTHG4} zkcrzujLjbqUNvuiWZx5;I8Y6ItXR#*zgW_2s@$00000 LNkvXXu0mjfiSA|# From 689f0c5478429443d8d60675ab2e6e54f5195b3a Mon Sep 17 00:00:00 2001 From: Paramat Date: Wed, 22 Aug 2018 01:23:00 +0100 Subject: [PATCH 155/195] README.txt files: Change 'LGPL 2.1' to 'LGPLv2.1+'. Remove 'WTFPL' --- mods/bucket/README.txt | 6 +++--- mods/carts/README.txt | 3 ++- mods/default/README.txt | 6 +++--- mods/fire/README.txt | 4 ++-- mods/player_api/README.txt | 4 ++-- mods/screwdriver/README.txt | 4 ++-- mods/stairs/README.txt | 6 +++--- mods/vessels/README.txt | 6 +++--- mods/walls/README.txt | 2 +- 9 files changed, 21 insertions(+), 20 deletions(-) diff --git a/mods/bucket/README.txt b/mods/bucket/README.txt index 45e0ec54..58997b26 100644 --- a/mods/bucket/README.txt +++ b/mods/bucket/README.txt @@ -4,9 +4,9 @@ See license.txt for license information. Authors of source code ---------------------- -Kahrl (LGPL 2.1) -celeron55, Perttu Ahola (LGPL 2.1) -Various Minetest developers and contributors (LGPL 2.1) +Kahrl (LGPLv2.1+) +celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest developers and contributors (LGPLv2.1+) Authors of media (textures) --------------------------- diff --git a/mods/carts/README.txt b/mods/carts/README.txt index 31ce6449..c0be2d73 100644 --- a/mods/carts/README.txt +++ b/mods/carts/README.txt @@ -6,7 +6,8 @@ itself is based on (and fully compatible with) the carts mod [2]. The model was originally designed by stujones11 [3] (CC-0). -Cart textures are based on original work from PixelBOX (WTFPL). +Cart textures are based on original work from PixelBOX by Gambit (permissive +license). [1] https://github.com/SmallJoker/boost_cart/ diff --git a/mods/default/README.txt b/mods/default/README.txt index 53035dcc..474ef0ec 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -4,11 +4,11 @@ See license.txt for license information. Authors of source code ---------------------- -Originally by celeron55, Perttu Ahola (LGPL 2.1) -Various Minetest developers and contributors (LGPL 2.1) +Originally by celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest developers and contributors (LGPLv2.1+) The torch code was derived by sofar from the 'torches' mod by -BlockMen (LGPL 2.1) +BlockMen (LGPLv2.1+) Authors of media (textures, sounds, models and schematics) ---------------------------------------------------------- diff --git a/mods/fire/README.txt b/mods/fire/README.txt index 099da1c2..25ba26ef 100644 --- a/mods/fire/README.txt +++ b/mods/fire/README.txt @@ -4,8 +4,8 @@ See license.txt for license information. Authors of source code ---------------------- -Originally by Perttu Ahola (celeron55) (LGPL 2.1) -Various Minetest developers and contributors (LGPL 2.1) +Originally by Perttu Ahola (celeron55) (LGPLv2.1+) +Various Minetest developers and contributors (LGPLv2.1+) Authors of media (textures and sounds) -------------------------------------- diff --git a/mods/player_api/README.txt b/mods/player_api/README.txt index 62e37c69..0b3ac02e 100644 --- a/mods/player_api/README.txt +++ b/mods/player_api/README.txt @@ -7,8 +7,8 @@ Also sets the default model, texture, and player flags. Authors of source code ---------------------- -Originally by celeron55, Perttu Ahola (LGPL 2.1) -Various Minetest developers and contributors (LGPL 2.1) +Originally by celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest developers and contributors (LGPLv2.1+) Authors of media (textures, models and sounds) ---------------------------------------------- diff --git a/mods/screwdriver/README.txt b/mods/screwdriver/README.txt index 9d39c58c..14c073e7 100644 --- a/mods/screwdriver/README.txt +++ b/mods/screwdriver/README.txt @@ -4,8 +4,8 @@ See license.txt for license information. License of source code ---------------------- -Originally by RealBadAngel, Maciej Kasatkin (LGPL 2.1) -Various Minetest developers and contributors (LGPL 2.1) +Originally by RealBadAngel, Maciej Kasatkin (LGPLv2.1+) +Various Minetest developers and contributors (LGPLv2.1+) License of media (textures) --------------------------- diff --git a/mods/stairs/README.txt b/mods/stairs/README.txt index e411c332..c6b8c337 100644 --- a/mods/stairs/README.txt +++ b/mods/stairs/README.txt @@ -4,6 +4,6 @@ See license.txt for license information. Authors of source code ---------------------- -Originally by Kahrl (LGPL 2.1) and -celeron55, Perttu Ahola (LGPL 2.1) -Various Minetest developers and contributors (LGPL 2.1) +Originally by Kahrl (LGPLv2.1+) and +celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest developers and contributors (LGPLv2.1+) diff --git a/mods/vessels/README.txt b/mods/vessels/README.txt index 5bb798c8..a54e330f 100644 --- a/mods/vessels/README.txt +++ b/mods/vessels/README.txt @@ -4,9 +4,9 @@ See license.txt for license information. Authors of source code ---------------------- -Originally by Vanessa Ezekowitz (LGPL 2.1) -Modified by Perttu Ahola (LGPL 2.1) -Various Minetest developers and contributors (LGPL 2.1) +Originally by Vanessa Ezekowitz (LGPLv2.1+) +Modified by Perttu Ahola (LGPLv2.1+) +Various Minetest developers and contributors (LGPLv2.1+) Authors of media (textures) --------------------------- diff --git a/mods/walls/README.txt b/mods/walls/README.txt index 0389174d..ba33bd77 100644 --- a/mods/walls/README.txt +++ b/mods/walls/README.txt @@ -4,4 +4,4 @@ See license.txt for license information. Authors of source code ---------------------- -Auke Kok (LGPL 2.1) +Auke Kok (LGPLv2.1+) From 3484ff23add2855e0cea7c83004425b53778d8e4 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Thu, 23 Aug 2018 20:39:16 +0100 Subject: [PATCH 156/195] Dye mod: Remove 'basecolor', 'excolor', 'unicolor' groups --- mods/dye/init.lua | 45 +++++++++++---------------------------------- 1 file changed, 11 insertions(+), 34 deletions(-) diff --git a/mods/dye/init.lua b/mods/dye/init.lua index 8f26fed4..f094dd2f 100644 --- a/mods/dye/init.lua +++ b/mods/dye/init.lua @@ -1,9 +1,4 @@ --- Other mods can use these for looping through available colors - dye = {} -dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"} -dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", - "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"} -- Make dye names and descriptions available globally @@ -25,47 +20,28 @@ dye.dyes = { {"pink", "Pink"}, } --- This collection of colors is partly a historic thing, partly something else - -local dyes = { - {"white", "White Dye", {dye=1, basecolor_white=1, excolor_white=1, unicolor_white=1}}, - {"grey", "Grey Dye", {dye=1, basecolor_grey=1, excolor_grey=1, unicolor_grey=1}}, - {"dark_grey", "Dark Grey Dye", {dye=1, basecolor_grey=1, excolor_darkgrey=1, unicolor_darkgrey=1}}, - {"black", "Black Dye", {dye=1, basecolor_black=1, excolor_black=1, unicolor_black=1}}, - {"violet", "Violet Dye", {dye=1, basecolor_magenta=1, excolor_violet=1, unicolor_violet=1}}, - {"blue", "Blue Dye", {dye=1, basecolor_blue=1, excolor_blue=1, unicolor_blue=1}}, - {"cyan", "Cyan Dye", {dye=1, basecolor_cyan=1, excolor_cyan=1, unicolor_cyan=1}}, - {"dark_green", "Dark Green Dye", {dye=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}}, - {"green", "Green Dye", {dye=1, basecolor_green=1, excolor_green=1, unicolor_green=1}}, - {"yellow", "Yellow Dye", {dye=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}}, - {"brown", "Brown Dye", {dye=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1}}, - {"orange", "Orange Dye", {dye=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}}, - {"red", "Red Dye", {dye=1, basecolor_red=1, excolor_red=1, unicolor_red=1}}, - {"magenta", "Magenta Dye", {dye=1, basecolor_magenta=1, excolor_red_violet=1, unicolor_red_violet=1}}, - {"pink", "Pink Dye", {dye=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}}, -} - -- Define items -for _, row in ipairs(dyes) do +for _, row in ipairs(dye.dyes) do local name = row[1] local description = row[2] - local groups = row[3] - local item_name = "dye:" .. name - local item_image = "dye_" .. name .. ".png" - minetest.register_craftitem(item_name, { - inventory_image = item_image, - description = description, + local groups = {dye = 1} + groups["color_" .. name] = 1 + + minetest.register_craftitem("dye:" .. name, { + inventory_image = "dye_" .. name .. ".png", + description = description .. " Dye", groups = groups }) + minetest.register_craft({ type = "shapeless", - output = item_name .. " 4", + output = "dye:" .. name .. " 4", recipe = {"group:flower,color_" .. name}, }) end --- Manually add coal->black dye +-- Manually add coal -> black dye minetest.register_craft({ type = "shapeless", @@ -74,6 +50,7 @@ minetest.register_craft({ }) -- Mix recipes + local dye_recipes = { -- src1, src2, dst -- RYB mixes From 6f80fd3737cd4de30e548dd48bc0ab8c288d9930 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Thu, 23 Aug 2018 20:42:36 +0100 Subject: [PATCH 157/195] Wool mod: Remove 'basecolor', 'excolor', 'unicolor' groups --- mods/wool/init.lua | 42 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/mods/wool/init.lua b/mods/wool/init.lua index a36e4dd8..3e565a47 100644 --- a/mods/wool/init.lua +++ b/mods/wool/init.lua @@ -1,27 +1,23 @@ --- This uses a trick: you can first define the recipes using all of the base --- colors, and then some recipes using more specific colors for a few non-base --- colors available. When crafting, the last recipes will be checked first. - local dyes = { - {"white", "White", "basecolor_white"}, - {"grey", "Grey", "basecolor_grey"}, - {"black", "Black", "basecolor_black"}, - {"red", "Red", "basecolor_red"}, - {"yellow", "Yellow", "basecolor_yellow"}, - {"green", "Green", "basecolor_green"}, - {"cyan", "Cyan", "basecolor_cyan"}, - {"blue", "Blue", "basecolor_blue"}, - {"magenta", "Magenta", "basecolor_magenta"}, - {"orange", "Orange", "excolor_orange"}, - {"violet", "Violet", "excolor_violet"}, - {"brown", "Brown", "unicolor_dark_orange"}, - {"pink", "Pink", "unicolor_light_red"}, - {"dark_grey", "Dark Grey", "unicolor_darkgrey"}, - {"dark_green", "Dark Green", "unicolor_dark_green"}, + {"white", "White"}, + {"grey", "Grey"}, + {"black", "Black"}, + {"red", "Red"}, + {"yellow", "Yellow"}, + {"green", "Green"}, + {"cyan", "Cyan"}, + {"blue", "Blue"}, + {"magenta", "Magenta"}, + {"orange", "Orange"}, + {"violet", "Violet"}, + {"brown", "Brown"}, + {"pink", "Pink"}, + {"dark_grey", "Dark Grey"}, + {"dark_green", "Dark Green"}, } for i = 1, #dyes do - local name, desc, craft_color_group = unpack(dyes[i]) + local name, desc = unpack(dyes[i]) minetest.register_node("wool:" .. name, { description = desc .. " Wool", @@ -35,13 +31,11 @@ for i = 1, #dyes do minetest.register_craft{ type = "shapeless", output = "wool:" .. name, - recipe = {"group:dye," .. craft_color_group, "group:wool"}, + recipe = {"group:dye,color_" .. name, "group:wool"}, } end - --- legacy - +-- Legacy -- Backwards compatibility with jordach's 16-color wool mod minetest.register_alias("wool:dark_blue", "wool:blue") minetest.register_alias("wool:gold", "wool:yellow") From 02c4a05e600112bf2183ed743ffdf29245486d9d Mon Sep 17 00:00:00 2001 From: Paramat Date: Fri, 24 Aug 2018 19:08:06 +0100 Subject: [PATCH 158/195] Rename 'killme' mod to 'game_commands', add README and license files --- mods/game_commands/README.txt | 7 +++++++ mods/{killme => game_commands}/init.lua | 3 ++- mods/game_commands/license.txt | 24 ++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 mods/game_commands/README.txt rename mods/{killme => game_commands}/init.lua (96%) create mode 100644 mods/game_commands/license.txt diff --git a/mods/game_commands/README.txt b/mods/game_commands/README.txt new file mode 100644 index 00000000..a4516082 --- /dev/null +++ b/mods/game_commands/README.txt @@ -0,0 +1,7 @@ +Minetest Game mod: game_commands +================================ +See license.txt for license information. + +Authors of source code +---------------------- +rubenwardy (MIT) diff --git a/mods/killme/init.lua b/mods/game_commands/init.lua similarity index 96% rename from mods/killme/init.lua rename to mods/game_commands/init.lua index 9b674754..609c4a75 100644 --- a/mods/killme/init.lua +++ b/mods/game_commands/init.lua @@ -13,7 +13,8 @@ minetest.register_chatcommand("killme", { end end - -- There doesn't seem to be a way to get a default spawn pos from the lua API + -- There doesn't seem to be a way to get a default spawn pos + -- from the lua API return false, "No static_spawnpoint defined" end else diff --git a/mods/game_commands/license.txt b/mods/game_commands/license.txt new file mode 100644 index 00000000..fa855644 --- /dev/null +++ b/mods/game_commands/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2017-2018 rubenwardy + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT From 5673a717526bc6ef7aa58aac4422ebe1c0f6f519 Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 28 Aug 2018 19:12:10 +0100 Subject: [PATCH 159/195] Game_api.txt: Update and improve dye documentation --- game_api.txt | 95 +++++++++++++++++++++++----------------------------- 1 file changed, 41 insertions(+), 54 deletions(-) diff --git a/game_api.txt b/game_api.txt index 97ee3caa..4b17b7b2 100644 --- a/game_api.txt +++ b/game_api.txt @@ -2,6 +2,7 @@ Minetest Game API ================= GitHub Repo: https://github.com/minetest/minetest_game + Introduction ------------ @@ -14,6 +15,7 @@ Please note: * [#ABC] refers to a section in this document * [pos] refers to a position table `{x = -5, y = 0, z = 200}` + Bucket API ---------- @@ -34,6 +36,7 @@ The bucket API allows registering new types of buckets for non-default liquids. The filled bucket item is returned to the player that uses an empty bucket pointing to the given liquid source. When punching with an empty bucket pointing to an entity or a non-liquid node, the on_punch of the entity or node will be triggered. + Beds API -------- @@ -68,6 +71,7 @@ Beds API } } + Bones API --------- @@ -77,6 +81,7 @@ in `bones.player_inventory_lists`. e.g. `table.insert(bones.player_inventory_lists, "backpack")` + Creative API ------------ @@ -98,6 +103,7 @@ The contents of `creative.formspec_add` is appended to every creative inventory page. Mods can use it to add additional formspec elements onto the default creative inventory formspec to be drawn after each update. + Chests API ---------- @@ -148,6 +154,7 @@ The chests API allows the creation of chests, which have their own inventories f groups = {choppy = 2, oddly_breakable_by_hand = 2}, protected = false, -- If true, only placer can modify chest. + Doors API --------- @@ -221,6 +228,7 @@ The doors mod allows modders to register custom doors and trapdoors. groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults(), -- optional + Dungeon Loot API ---------------- @@ -253,6 +261,7 @@ The mod that places chests with loot in dungeons provides an API to register add -- supported types: "normal" (the cobble/mossycobble one), "sandstone", "desert" -- optional, defaults to no type restrictions + Fence API --------- @@ -274,6 +283,7 @@ Allows creation of new fences with "fencelike" drawtype. groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults(), + Walls API --------- @@ -286,6 +296,7 @@ walls.register(name, desc, texture, mat, sounds) ^ mat = "default:stone". Used to auto-generate crafting recipe. ^ sounds = sounds: see [#Default sounds] + Farming API ----------- @@ -326,6 +337,7 @@ The farming API allows you to easily register plants and hoes. maxlight = default.LIGHT_MAX -- Maximum light to grow } + Fire API -------- @@ -653,6 +665,7 @@ And override this function to change the layout: return table.concat(tmp, "") end + Stairs API ---------- @@ -686,6 +699,7 @@ delivered with Minetest Game, to keep them compatible with other mods. * `desc_stair`: Description for stair node * `desc_slab`: Description for slab node + Xpanes API ---------- @@ -706,6 +720,7 @@ Creates panes that automatically connect to each other use_texture_alpha = true, -- Optional boolean (default: `false`) for colored glass panes } + Raillike definitions -------------------- @@ -739,6 +754,7 @@ Sounds inside the default table can be used within the sounds field of node defi * `default.node_sound_glass_defaults()` * `default.node_sound_metal_defaults()` + Default constants ----------------- @@ -818,70 +834,39 @@ callback overridden. All the nodes listed in `leaves` have their Dyes ---- -To make recipes that will work with any dye ever made by anybody, define -them based on groups. You can select any group of groups, based on your need for -amount of colors. +Minetest Game dyes are registered with: -### Color groups + groups = {dye = 1, color_ = 1}, -Base color groups: +To make recipes that will work with dyes from many mods, define them using the +dye group and the color groups. - * `basecolor_white` - * `basecolor_grey` - * `basecolor_black` - * `basecolor_red` - * `basecolor_yellow` - * `basecolor_green` - * `basecolor_cyan` - * `basecolor_blue` - * `basecolor_magenta` +Dye color groups: -Extended color groups ( * means also base color ) + * `color_white` + * `color_grey` + * `color_dark_grey` + * `color_black` + * `color_red` + * `color_pink` + * `color_orange` + * `color_brown` + * `color_yellow` + * `color_green` + * `color_dark_green` + * `color_blue` + * `color_cyan` + * `color_violet` + * `color_magenta` - * `excolor_white` * - * `excolor_lightgrey` - * `excolor_grey` * - * `excolor_darkgrey` - * `excolor_black` * - * `excolor_red` * - * `excolor_orange` - * `excolor_yellow` * - * `excolor_lime` - * `excolor_green` * - * `excolor_aqua` - * `excolor_cyan` * - * `excolor_sky_blue` - * `excolor_blue` * - * `excolor_violet` - * `excolor_magenta` * - * `excolor_red_violet` - -The whole unifieddyes palette as groups: - - * `unicolor_` - -For the following, no white/grey/black is allowed: - - * `unicolor_medium_` - * `unicolor_dark_` - * `unicolor_light_` - * `unicolor__s50` - * `unicolor_medium__s50` - * `unicolor_dark__s50` - -Example of one shapeless recipe using a color group: +Example of one shapeless recipe using the dye group and a color group: minetest.register_craft({ type = "shapeless", - output = ':item_yellow', - recipe = {':item_no_color', 'group:basecolor_yellow'}, + output = ":item_yellow", + recipe = {":item_no_color", "group:dye,color_yellow"}, }) -### Color lists - - * `dye.basecolors` are an array containing the names of available base colors - - * `dye.excolors` are an array containing the names of the available extended colors Trees ----- @@ -922,6 +907,7 @@ Trees * `default.grow_pine_bush(pos)` * Grows a pine bush at pos + Carts ----- @@ -944,6 +930,7 @@ Carts likely be called many times per second, so the function needs to make sure that the event is handled properly. + Key API ------- From ef20f9e12b541eb657f4e7345c206ec2448cc841 Mon Sep 17 00:00:00 2001 From: Paramat Date: Sun, 2 Sep 2018 02:43:59 +0100 Subject: [PATCH 160/195] Fire: Make flames floodable, remove extinguish ABM --- mods/fire/init.lua | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/mods/fire/init.lua b/mods/fire/init.lua index dfe6dd12..9686a228 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -7,6 +7,20 @@ fire = {} -- Items -- +-- Flood flame function + +local function flood_flame(pos, oldnode, newnode) + -- Play flame extinguish sound if liquid is not an 'igniter' + local nodedef = minetest.registered_items[newnode.name] + if not (nodedef and nodedef.groups and + nodedef.groups.igniter and nodedef.groups.igniter > 0) then + minetest.sound_play("fire_extinguish_flame", + {pos = pos, max_hear_distance = 16, gain = 0.15}) + end + -- Remove the flame + return false +end + -- Flame nodes minetest.register_node("fire:basic_flame", { @@ -28,8 +42,11 @@ minetest.register_node("fire:basic_flame", { walkable = false, buildable_to = true, sunlight_propagates = true, + floodable = true, damage_per_second = 4, groups = {igniter = 2, dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "", + on_timer = function(pos) local f = minetest.find_node_near(pos, 1, {"group:flammable"}) if not f then @@ -39,11 +56,12 @@ minetest.register_node("fire:basic_flame", { -- Restart timer return true end, - drop = "", on_construct = function(pos) minetest.get_node_timer(pos):start(math.random(30, 60)) end, + + on_flood = flood_flame, }) minetest.register_node("fire:permanent_flame", { @@ -66,9 +84,12 @@ minetest.register_node("fire:permanent_flame", { walkable = false, buildable_to = true, sunlight_propagates = true, + floodable = true, damage_per_second = 4, groups = {igniter = 2, dig_immediate = 3}, drop = "", + + on_flood = flood_flame, }) @@ -271,23 +292,6 @@ end -- ABMs -- --- Extinguish all flames quickly with water, snow, ice - -minetest.register_abm({ - label = "Extinguish flame", - nodenames = {"fire:basic_flame", "fire:permanent_flame"}, - neighbors = {"group:puts_out_fire"}, - interval = 3, - chance = 1, - catch_up = false, - action = function(pos, node, active_object_count, active_object_count_wider) - minetest.remove_node(pos) - minetest.sound_play("fire_extinguish_flame", - {pos = pos, max_hear_distance = 16, gain = 0.15}) - end, -}) - - -- Enable the following ABMs according to 'enable fire' setting local fire_enabled = minetest.settings:get_bool("enable_fire") @@ -327,10 +331,6 @@ else -- Fire enabled chance = 12, catch_up = false, action = function(pos, node, active_object_count, active_object_count_wider) - -- If there is water or stuff like that around node, don't ignite - if minetest.find_node_near(pos, 1, {"group:puts_out_fire"}) then - return - end local p = minetest.find_node_near(pos, 1, {"air"}) if p then minetest.set_node(p, {name = "fire:basic_flame"}) From aafe31c14ea41afbb243c9443658863bd9460b6b Mon Sep 17 00:00:00 2001 From: 12Me21 <12Me21.MC@gmail.com> Date: Sun, 2 Sep 2018 22:34:56 -0400 Subject: [PATCH 161/195] Stairs: Safer slab name check Before, it checked if the node name *contained* "stairs:slab_", which could detect things like "xxxxxstairs:slab_xxxx". Changed the pattern to "^stairs:slab_". --- mods/stairs/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index f6511187..0bbb034b 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -185,7 +185,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, local creative_enabled = (creative and creative.is_enabled_for and creative.is_enabled_for(player_name)) - if under and under.name:find("stairs:slab_") then + if under and under.name:find("^stairs:slab_") then -- place slab using under node orientation local dir = minetest.dir_to_facedir(vector.subtract( pointed_thing.above, pointed_thing.under), true) From 7fedf0b5d9bfee27c509027ce5ce850dff5064e5 Mon Sep 17 00:00:00 2001 From: Paramat Date: Fri, 14 Sep 2018 17:59:49 +0100 Subject: [PATCH 162/195] Player_api: New hotbar textures (#2207) --- mods/player_api/README.txt | 2 +- mods/player_api/license.txt | 2 +- mods/player_api/textures/gui_hotbar.png | Bin 284 -> 411 bytes .../textures/gui_hotbar_selected.png | Bin 1649 -> 175 bytes 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/player_api/README.txt b/mods/player_api/README.txt index 0b3ac02e..22d040cb 100644 --- a/mods/player_api/README.txt +++ b/mods/player_api/README.txt @@ -19,7 +19,7 @@ stujones11 (CC BY-SA 3.0): Jordach (CC BY-SA 3.0): character.png -BlockMen (CC BY-SA 3.0): +paramat (CC BY-SA 3.0): gui_hotbar.png gui_hotbar_selected.png diff --git a/mods/player_api/license.txt b/mods/player_api/license.txt index 9d89425d..69bb2f8e 100644 --- a/mods/player_api/license.txt +++ b/mods/player_api/license.txt @@ -21,8 +21,8 @@ Licenses of media (textures, models and sounds) Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) Copyright (C) 2011-2018 celeron55, Perttu Ahola Copyright (C) 2012-2018 Jordach -Copyright (C) 2014-2018 BlockMen Copyright (C) 2018 stujones11 +Copyright (C) 2018 paramat You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/player_api/textures/gui_hotbar.png b/mods/player_api/textures/gui_hotbar.png index 73fb3ca8f2485ca10114cf40fa793c45d1a541ea..7bc788755243f163c95c0f5ed028bd3d4c61db76 100644 GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0y~yUEY1>t% z&wZ1kZhiBlU)iH0zj*pxELG)7#S2+z%_zIIkXrU99dzaFhx*Nkm+>L z3bF>|G$gkm*$NUx^#+oIacfOT)AclGW;kF03fKP}kkOqSPFyN&AdNYvE zS`y?JT+C1%W8ZRBr3xsp-P6S}q~g}wI|q3k92i^zFCJ`Ta$$F3Ui5z+OZhjY*`D|2 z{C_EG5WDfzLZ{HWg;v+T=em9g=>2@X>|$LoZ}9hhb%MGp0v0+=6H| z!YQZ~vLZm$1uP*zxx_5jb^BH+vlnfh812O0cRgV1ZO#p^ygze3YugX}3pP)1l$3u?AF zp81<@-Z!Hr)RS~-I@-NKDwRs5zv$ABq3Mbmq&w=Dw>V@KwHTmg(hJte?a;=6kX`@) N002ovPDHLkV1kn}M8N<6 delta 1644 zcmV-y29x=(0r3ow7=H)@0000hwczsr004wgOjJbx0000005mi-TU%RWV`EfQRG*)p zS65eASy^6QUW9~%XlQ6hM@NW=h^MEgjEszHYio9Pc94*eQBhHFaBxaWN?>4Me0+RP zPEKWIWyi#+Vv9 z$fYdtvkTqP)qm^b+O%|!@}WBs^i;KOS&A&nlB`&^aU8>87}7M%5=fR6q?(5z4CizX zA^tjUP@|NN3#rCs+x7EMo<9DZDlN(gydrVVt;sTm>CkoE5bn=OP`5yphW>{n4YwkR zqKy7I%!DkmqyQ7r-54DsBtOucIuV=6Xlnrlm2g$n*yen$8eIowf=VhSJxh2f-Ge2Rh4^-=PM-UiHkB-s zEc)|n0ktjqPn!L+Y-CxC3kTF(ivE#%sFnFRq<_DM3Q=E*>$9Zp6Lfw)e-E7|K)Y*s ztkYY1zw<(+)wi@~fC@mD>j9O*&DSUMn5y~}4p)xZC+I!jp+S^hd!{jc?(0Lu>Pf z)_*nAn6}2m7}NZKE_a^UpFEUxq5?6Y`_BVfazRC#3?6zmY|u&23tzHAYaxQy+#OJ+ z*`KryqIn=_Ww@42JC1`-DnK!&KRZ9eabn@S zfwV(q9i?6OduU@dpwFBY3YXDD*riyzFMq2_Mc0QTs8Vf`b_`I_R2tCZG-ZMsCF|sX zY7Fn(aX4uE;>>;b{g`t2QqmN4 zppz2*;5#gRu|S1Be5qshhsT4*Kh2KUl(trUr!qm0?)%ln(S0M#50p;pzGpd2}%Rk-rdKTGPynJ z4mG9)pXD_r=J2?l6QC?_l=|8F{P5oI98d}9?w=|N7k~vSt@(C)EQ&+V zG5gX^-^WQq&}YxmeSw4Nwp%J*>3@~w+{YP0&?ANta(F0OD%w!?V3%Zq3WCBx+h>1r zOi+2ak_0vD%n?J;jh)_O$^}(TBVI$lTdHcju|12^tKmW92b5>=TR@|(KcH9$9GkSX zwoVSHRybKWKF*Ys_0PfAQVivBO_4Du5M19VjGrXVMOoq~Hhx1SokH#-Du0S_MD%~8 znEy--wgnX%;`x_JHjQ?O_IT+28Tomg(X2?&0*w*6cP>GwKLR#)YqHI0Ncv*j@Wd_c z1`nmH9W!o|s4|8CZZ;j`yQ5L2^&NEpGD%o1r zWNFlWLjw%&^ExjG|08V>fqzvbt8*wJeX%VWL}Dc$@j9k^5J89< zv`cGXKgOj|rZ!qyYn2H|KoMF11fH_CA)$|3%1{{MQ;9MGT2HYn+GP`^j?e;NV^s4+ z(n!=w(80G#Q!YYUpE3|)*PqWvnnGwTCQ}1V&s7lJ%9BrWRc9~N*IzGRbo2GTIqp#M qg3?jp;rNA6>8L*c{U9iRI_@9eQ6fVC0000 Date: Fri, 14 Sep 2018 18:33:46 +0100 Subject: [PATCH 163/195] Fire: Remove the ABM active when fire mod is disabled (#2209) --- mods/fire/init.lua | 50 +++++++++++++++++++--------------------------- 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/mods/fire/init.lua b/mods/fire/init.lua index 9686a228..612e052d 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -2,6 +2,19 @@ fire = {} +-- 'Enable fire' setting + +local fire_enabled = minetest.settings:get_bool("enable_fire") +if fire_enabled == nil then + -- enable_fire setting not specified, check for disable_fire + local fire_disabled = minetest.settings:get_bool("disable_fire") + if fire_disabled == nil then + -- Neither setting specified, check whether singleplayer + fire_enabled = minetest.is_singleplayer() + else + fire_enabled = not fire_disabled + end +end -- -- Items @@ -49,7 +62,7 @@ minetest.register_node("fire:basic_flame", { on_timer = function(pos) local f = minetest.find_node_near(pos, 1, {"group:flammable"}) - if not f then + if not fire_enabled or not f then minetest.remove_node(pos) return end @@ -58,7 +71,11 @@ minetest.register_node("fire:basic_flame", { end, on_construct = function(pos) - minetest.get_node_timer(pos):start(math.random(30, 60)) + if not fire_enabled then + minetest.remove_node(pos) + else + minetest.get_node_timer(pos):start(math.random(30, 60)) + end end, on_flood = flood_flame, @@ -292,34 +309,7 @@ end -- ABMs -- --- Enable the following ABMs according to 'enable fire' setting - -local fire_enabled = minetest.settings:get_bool("enable_fire") -if fire_enabled == nil then - -- enable_fire setting not specified, check for disable_fire - local fire_disabled = minetest.settings:get_bool("disable_fire") - if fire_disabled == nil then - -- Neither setting specified, check whether singleplayer - fire_enabled = minetest.is_singleplayer() - else - fire_enabled = not fire_disabled - end -end - -if not fire_enabled then - - -- Remove basic flames only if fire disabled - - minetest.register_abm({ - label = "Remove disabled fire", - nodenames = {"fire:basic_flame"}, - interval = 7, - chance = 1, - catch_up = false, - action = minetest.remove_node, - }) - -else -- Fire enabled +if fire_enabled then -- Ignite neighboring nodes, add basic flames From e10e0f94d6339cef1f38e27acd98cf85d8e5fef5 Mon Sep 17 00:00:00 2001 From: Ezhh Date: Fri, 21 Sep 2018 18:52:55 +0100 Subject: [PATCH 164/195] Remove cave ice from creative inventory --- mods/default/nodes.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 9b01456b..9aa3606f 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -627,7 +627,8 @@ minetest.register_node("default:cave_ice", { description = "Cave Ice", tiles = {"default_ice.png"}, paramtype = "light", - groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 3}, + groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 3, + not_in_creative_inventory = 1}, drop = "default:ice", sounds = default.node_sound_glass_defaults(), }) From f42deb4026f3a4048fa47e2927cbc29898886d00 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Mon, 24 Sep 2018 21:13:01 +0200 Subject: [PATCH 165/195] map: Use wood group crafting recipe --- mods/map/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/map/init.lua b/mods/map/init.lua index 03024fa0..72b04c70 100644 --- a/mods/map/init.lua +++ b/mods/map/init.lua @@ -67,7 +67,7 @@ minetest.register_craft({ recipe = { {"default:glass", "default:paper", "default:stick"}, {"default:steel_ingot", "default:paper", "default:steel_ingot"}, - {"default:wood", "default:paper", "dye:black"}, + {"group:wood", "default:paper", "dye:black"}, } }) From 24900f7da571f9851e50be35753c091f11b7be1e Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 25 Sep 2018 19:42:19 +0100 Subject: [PATCH 166/195] Fence rail: Only connect to fences. Update map mod README recipe Fence rail: Only connect to 'group:fence'. Update map mod README crafting recipe documentation. --- mods/default/functions.lua | 2 +- mods/map/README.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index d951e8e6..367ded0b 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -368,7 +368,7 @@ function default.register_fence_rail(name, def) {1/16, 3/16, -1/16, 1/2, 5/16, 1/16}, {1/16, -5/16, -1/16, 1/2, -3/16, 1/16}}, }, - connects_to = {"group:fence", "group:wood", "group:tree", "group:wall"}, + connects_to = {"group:fence"}, inventory_image = fence_rail_texture, wield_image = fence_rail_texture, tiles = {def.texture}, diff --git a/mods/map/README.txt b/mods/map/README.txt index 8f35f696..c91e0d97 100644 --- a/mods/map/README.txt +++ b/mods/map/README.txt @@ -22,7 +22,7 @@ default:glass G default:paper P default:stick S default:steel_ingot I -default:wood W +group:wood W dye:black D GPS From 5b3b60927000706f3613423d30e2ed108e2c38fd Mon Sep 17 00:00:00 2001 From: Paramat Date: Thu, 4 Oct 2018 00:33:11 +0100 Subject: [PATCH 167/195] Stairs: Add field to determine world-aligned textures (#2219) All stair/slab nodes with parent nodes that are rotatable (wood and bricks) are reverted to not having world-aligned textures, to fix the breakage of rotated stair/slab appearence in worlds. Update, and add missing documentation to, game_api.txt. --- game_api.txt | 56 ++++++++++----- mods/farming/nodes.lua | 3 +- mods/stairs/init.lua | 153 +++++++++++++++++++++++++++-------------- 3 files changed, 144 insertions(+), 68 deletions(-) diff --git a/game_api.txt b/game_api.txt index 4b17b7b2..27d5b339 100644 --- a/game_api.txt +++ b/game_api.txt @@ -672,31 +672,55 @@ Stairs API The stairs API lets you register stairs and slabs and ensures that they are registered the same way as those delivered with Minetest Game, to keep them compatible with other mods. -`stairs.register_stair(subname, recipeitem, groups, images, description, sounds)` +`stairs.register_stair(subname, recipeitem, groups, images, description, sounds, worldaligntex)` - * Registers a stair. + * Registers a stair * `subname`: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_subname" * `recipeitem`: Item used in the craft recipe, e.g. "default:cobble", may be `nil` - * `groups`: see [Known damage and digging time defining groups] - * `images`: see [Tile definition] - * `description`: used for the description field in the stair's definition - * `sounds`: see [#Default sounds] + * `groups`: See [Known damage and digging time defining groups] + * `images`: See [Tile definition] + * `description`: Used for the description field in the stair's definition + * `sounds`: See [#Default sounds] + * `worldaligntex`: A bool to set all textures world-aligned. Default false. See [Tile definition] -`stairs.register_slab(subname, recipeitem, groups, images, description, sounds)` +`stairs.register_slab(subname, recipeitem, groups, images, description, sounds, worldaligntex)` - * Registers a slabs - * `subname`: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_subname" + * Registers a slab + * `subname`: Basically the material name (e.g. cobble) used for the slab name. Nodename pattern: "stairs:slab_subname" * `recipeitem`: Item used in the craft recipe, e.g. "default:cobble" - * `groups`: see [Known damage and digging time defining groups] - * `images`: see [Tile definition] - * `description`: used for the description field in the stair's definition - * `sounds`: see [#Default sounds] + * `groups`: See [Known damage and digging time defining groups] + * `images`: See [Tile definition] + * `description`: Used for the description field in the slab's definition + * `sounds`: See [#Default sounds] + * `worldaligntex`: A bool to set all textures world-aligned. Default false. See [Tile definition] -`stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds)` +`stairs.register_stair_inner(subname, recipeitem, groups, images, description, sounds, worldaligntex)` - * A wrapper for stairs.register_stair and stairs.register_slab + * Registers an inner corner stair + * `subname`: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_inner_subname" + * `recipeitem`: Item used in the craft recipe, e.g. "default:cobble", may be `nil` + * `groups`: See [Known damage and digging time defining groups] + * `images`: See [Tile definition] + * `description`: Used for the description field in the stair's definition + * `sounds`: See [#Default sounds] + * `worldaligntex`: A bool to set all textures world-aligned. Default false. See [Tile definition] + +`stairs.register_stair_outer(subname, recipeitem, groups, images, description, sounds, worldaligntex)` + + * Registers an outer corner stair + * `subname`: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_outer_subname" + * `recipeitem`: Item used in the craft recipe, e.g. "default:cobble", may be `nil` + * `groups`: See [Known damage and digging time defining groups] + * `images`: See [Tile definition] + * `description`: Used for the description field in the stair's definition + * `sounds`: See [#Default sounds] + * `worldaligntex`: A bool to set all textures world-aligned. Default false. See [Tile definition] + +`stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds, worldaligntex)` + + * A wrapper for stairs.register_stair, stairs.register_slab, stairs.register_stair_inner, stairs.register_stair_outer * Uses almost the same arguments as stairs.register_stair - * `desc_stair`: Description for stair node + * `desc_stair`: Description for stair nodes. For corner stairs 'Inner' or 'Outer' will be prefixed * `desc_slab`: Description for slab node diff --git a/mods/farming/nodes.lua b/mods/farming/nodes.lua index c85c7c87..cc9d1f66 100644 --- a/mods/farming/nodes.lua +++ b/mods/farming/nodes.lua @@ -113,7 +113,8 @@ stairs.register_stair_and_slab( {"farming_straw.png"}, "Straw Stair", "Straw Slab", - default.node_sound_leaves_defaults() + default.node_sound_leaves_defaults(), + true ) minetest.register_abm({ diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 0bbb034b..59bd0377 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -48,7 +48,8 @@ end -- Register stair -- Node will be called stairs:stair_ -function stairs.register_stair(subname, recipeitem, groups, images, description, sounds) +function stairs.register_stair(subname, recipeitem, groups, images, description, + sounds, worldaligntex) -- Set backface culling and world-aligned textures local stair_images = {} for i, image in ipairs(images) do @@ -56,14 +57,16 @@ function stairs.register_stair(subname, recipeitem, groups, images, description, stair_images[i] = { name = image, backface_culling = true, - align_style = "world", } + if worldaligntex then + stair_images[i].align_style = "world" + end else stair_images[i] = table.copy(image) if stair_images[i].backface_culling == nil then stair_images[i].backface_culling = true end - if stair_images[i].align_style == nil then + if worldaligntex and stair_images[i].align_style == nil then stair_images[i].align_style = "world" end end @@ -147,18 +150,21 @@ local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4} -- Register slab -- Node will be called stairs:slab_ -function stairs.register_slab(subname, recipeitem, groups, images, description, sounds) +function stairs.register_slab(subname, recipeitem, groups, images, description, + sounds, worldaligntex) -- Set world-aligned textures local slab_images = {} for i, image in ipairs(images) do if type(image) == "string" then slab_images[i] = { name = image, - align_style = "world", } + if worldaligntex then + slab_images[i].align_style = "world" + end else slab_images[i] = table.copy(image) - if image.align_style == nil then + if worldaligntex and image.align_style == nil then slab_images[i].align_style = "world" end end @@ -300,7 +306,8 @@ end -- Register inner stair -- Node will be called stairs:stair_inner_ -function stairs.register_stair_inner(subname, recipeitem, groups, images, description, sounds) +function stairs.register_stair_inner(subname, recipeitem, groups, images, + description, sounds, worldaligntex) -- Set backface culling and world-aligned textures local stair_images = {} for i, image in ipairs(images) do @@ -308,14 +315,16 @@ function stairs.register_stair_inner(subname, recipeitem, groups, images, descri stair_images[i] = { name = image, backface_culling = true, - align_style = "world", } + if worldaligntex then + stair_images[i].align_style = "world" + end else stair_images[i] = table.copy(image) if stair_images[i].backface_culling == nil then stair_images[i].backface_culling = true end - if stair_images[i].align_style == nil then + if worldaligntex and stair_images[i].align_style == nil then stair_images[i].align_style = "world" end end @@ -378,7 +387,8 @@ end -- Register outer stair -- Node will be called stairs:stair_outer_ -function stairs.register_stair_outer(subname, recipeitem, groups, images, description, sounds) +function stairs.register_stair_outer(subname, recipeitem, groups, images, + description, sounds, worldaligntex) -- Set backface culling and world-aligned textures local stair_images = {} for i, image in ipairs(images) do @@ -386,14 +396,16 @@ function stairs.register_stair_outer(subname, recipeitem, groups, images, descri stair_images[i] = { name = image, backface_culling = true, - align_style = "world", } + if worldaligntex then + stair_images[i].align_style = "world" + end else stair_images[i] = table.copy(image) if stair_images[i].backface_culling == nil then stair_images[i].backface_culling = true end - if stair_images[i].align_style == nil then + if worldaligntex and stair_images[i].align_style == nil then stair_images[i].align_style = "world" end end @@ -455,11 +467,16 @@ end -- Stair/slab registration function. -- Nodes will be called stairs:{stair,slab}_ -function stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds) - stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds) - stairs.register_stair_inner(subname, recipeitem, groups, images, desc_stair, sounds) - stairs.register_stair_outer(subname, recipeitem, groups, images, desc_stair, sounds) - stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds) +function stairs.register_stair_and_slab(subname, recipeitem, groups, images, + desc_stair, desc_slab, sounds, worldaligntex) + stairs.register_stair(subname, recipeitem, groups, images, desc_stair, + sounds, worldaligntex) + stairs.register_stair_inner(subname, recipeitem, groups, images, desc_stair, + sounds, worldaligntex) + stairs.register_stair_outer(subname, recipeitem, groups, images, desc_stair, + sounds, worldaligntex) + stairs.register_slab(subname, recipeitem, groups, images, desc_slab, + sounds, worldaligntex) end @@ -472,7 +489,8 @@ stairs.register_stair_and_slab( {"default_wood.png"}, "Wooden Stair", "Wooden Slab", - default.node_sound_wood_defaults() + default.node_sound_wood_defaults(), + false ) stairs.register_stair_and_slab( @@ -482,7 +500,8 @@ stairs.register_stair_and_slab( {"default_junglewood.png"}, "Jungle Wood Stair", "Jungle Wood Slab", - default.node_sound_wood_defaults() + default.node_sound_wood_defaults(), + false ) stairs.register_stair_and_slab( @@ -492,7 +511,8 @@ stairs.register_stair_and_slab( {"default_pine_wood.png"}, "Pine Wood Stair", "Pine Wood Slab", - default.node_sound_wood_defaults() + default.node_sound_wood_defaults(), + false ) stairs.register_stair_and_slab( @@ -502,7 +522,8 @@ stairs.register_stair_and_slab( {"default_acacia_wood.png"}, "Acacia Wood Stair", "Acacia Wood Slab", - default.node_sound_wood_defaults() + default.node_sound_wood_defaults(), + false ) stairs.register_stair_and_slab( @@ -512,7 +533,8 @@ stairs.register_stair_and_slab( {"default_aspen_wood.png"}, "Aspen Wood Stair", "Aspen Wood Slab", - default.node_sound_wood_defaults() + default.node_sound_wood_defaults(), + false ) stairs.register_stair_and_slab( @@ -522,7 +544,8 @@ stairs.register_stair_and_slab( {"default_stone.png"}, "Stone Stair", "Stone Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -532,7 +555,8 @@ stairs.register_stair_and_slab( {"default_cobble.png"}, "Cobblestone Stair", "Cobblestone Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -542,7 +566,8 @@ stairs.register_stair_and_slab( {"default_mossycobble.png"}, "Mossy Cobblestone Stair", "Mossy Cobblestone Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -552,7 +577,8 @@ stairs.register_stair_and_slab( {"default_stone_brick.png"}, "Stone Brick Stair", "Stone Brick Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + false ) stairs.register_stair_and_slab( @@ -562,7 +588,8 @@ stairs.register_stair_and_slab( {"default_stone_block.png"}, "Stone Block Stair", "Stone Block Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -572,7 +599,8 @@ stairs.register_stair_and_slab( {"default_desert_stone.png"}, "Desert Stone Stair", "Desert Stone Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -582,7 +610,8 @@ stairs.register_stair_and_slab( {"default_desert_cobble.png"}, "Desert Cobblestone Stair", "Desert Cobblestone Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -592,7 +621,8 @@ stairs.register_stair_and_slab( {"default_desert_stone_brick.png"}, "Desert Stone Brick Stair", "Desert Stone Brick Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + false ) stairs.register_stair_and_slab( @@ -602,7 +632,8 @@ stairs.register_stair_and_slab( {"default_desert_stone_block.png"}, "Desert Stone Block Stair", "Desert Stone Block Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -612,7 +643,8 @@ stairs.register_stair_and_slab( {"default_sandstone.png"}, "Sandstone Stair", "Sandstone Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -622,7 +654,8 @@ stairs.register_stair_and_slab( {"default_sandstone_brick.png"}, "Sandstone Brick Stair", "Sandstone Brick Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + false ) stairs.register_stair_and_slab( @@ -632,7 +665,8 @@ stairs.register_stair_and_slab( {"default_sandstone_block.png"}, "Sandstone Block Stair", "Sandstone Block Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -642,7 +676,8 @@ stairs.register_stair_and_slab( {"default_desert_sandstone.png"}, "Desert Sandstone Stair", "Desert Sandstone Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -652,7 +687,8 @@ stairs.register_stair_and_slab( {"default_desert_sandstone_brick.png"}, "Desert Sandstone Brick Stair", "Desert Sandstone Brick Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + false ) stairs.register_stair_and_slab( @@ -662,7 +698,8 @@ stairs.register_stair_and_slab( {"default_desert_sandstone_block.png"}, "Desert Sandstone Block Stair", "Desert Sandstone Block Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -672,7 +709,8 @@ stairs.register_stair_and_slab( {"default_silver_sandstone.png"}, "Silver Sandstone Stair", "Silver Sandstone Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -682,7 +720,8 @@ stairs.register_stair_and_slab( {"default_silver_sandstone_brick.png"}, "Silver Sandstone Brick Stair", "Silver Sandstone Brick Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + false ) stairs.register_stair_and_slab( @@ -692,7 +731,8 @@ stairs.register_stair_and_slab( {"default_silver_sandstone_block.png"}, "Silver Sandstone Block Stair", "Silver Sandstone Block Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -702,7 +742,8 @@ stairs.register_stair_and_slab( {"default_obsidian.png"}, "Obsidian Stair", "Obsidian Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -712,7 +753,8 @@ stairs.register_stair_and_slab( {"default_obsidian_brick.png"}, "Obsidian Brick Stair", "Obsidian Brick Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + false ) stairs.register_stair_and_slab( @@ -722,7 +764,8 @@ stairs.register_stair_and_slab( {"default_obsidian_block.png"}, "Obsidian Block Stair", "Obsidian Block Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -732,7 +775,8 @@ stairs.register_stair_and_slab( {"default_brick.png"}, "Brick Stair", "Brick Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + false ) stairs.register_stair_and_slab( @@ -742,7 +786,8 @@ stairs.register_stair_and_slab( {"default_steel_block.png"}, "Steel Block Stair", "Steel Block Slab", - default.node_sound_metal_defaults() + default.node_sound_metal_defaults(), + true ) stairs.register_stair_and_slab( @@ -752,7 +797,8 @@ stairs.register_stair_and_slab( {"default_tin_block.png"}, "Tin Block Stair", "Tin Block Slab", - default.node_sound_metal_defaults() + default.node_sound_metal_defaults(), + true ) stairs.register_stair_and_slab( @@ -762,7 +808,8 @@ stairs.register_stair_and_slab( {"default_copper_block.png"}, "Copper Block Stair", "Copper Block Slab", - default.node_sound_metal_defaults() + default.node_sound_metal_defaults(), + true ) stairs.register_stair_and_slab( @@ -772,7 +819,8 @@ stairs.register_stair_and_slab( {"default_bronze_block.png"}, "Bronze Block Stair", "Bronze Block Slab", - default.node_sound_metal_defaults() + default.node_sound_metal_defaults(), + true ) stairs.register_stair_and_slab( @@ -782,7 +830,8 @@ stairs.register_stair_and_slab( {"default_gold_block.png"}, "Gold Block Stair", "Gold Block Slab", - default.node_sound_metal_defaults() + default.node_sound_metal_defaults(), + true ) stairs.register_stair_and_slab( @@ -792,7 +841,8 @@ stairs.register_stair_and_slab( {"default_ice.png"}, "Ice Stair", "Ice Slab", - default.node_sound_glass_defaults() + default.node_sound_glass_defaults(), + true ) stairs.register_stair_and_slab( @@ -802,5 +852,6 @@ stairs.register_stair_and_slab( {"default_snow.png"}, "Snow Block Stair", "Snow Block Slab", - default.node_sound_snow_defaults() + default.node_sound_snow_defaults(), + true ) From 2696b0cd91765f15125c1305133c64c780289aa2 Mon Sep 17 00:00:00 2001 From: TumeniNodes Date: Tue, 9 Oct 2018 15:44:15 -0400 Subject: [PATCH 168/195] Stairs: Add glass and obsidian glass. Fix slab combine bug Fix slabs combining into a cube: Facedir is only set for the cube if it has paramtype2 = "facedir". This avoids liquid appearing in connected framed glasslike. --- mods/stairs/README.txt | 15 +++ mods/stairs/init.lua | 100 ++++++++++++++++++ .../textures/stairs_glass_outer_stairside.png | Bin 0 -> 169 bytes mods/stairs/textures/stairs_glass_split.png | Bin 0 -> 162 bytes .../textures/stairs_glass_stairside.png | Bin 0 -> 167 bytes .../stairs_obsidian_glass_outer_stairside.png | Bin 0 -> 3626 bytes .../textures/stairs_obsidian_glass_split.png | Bin 0 -> 129 bytes .../stairs_obsidian_glass_stairside.png | Bin 0 -> 3629 bytes 8 files changed, 115 insertions(+) create mode 100644 mods/stairs/textures/stairs_glass_outer_stairside.png create mode 100644 mods/stairs/textures/stairs_glass_split.png create mode 100644 mods/stairs/textures/stairs_glass_stairside.png create mode 100644 mods/stairs/textures/stairs_obsidian_glass_outer_stairside.png create mode 100644 mods/stairs/textures/stairs_obsidian_glass_split.png create mode 100644 mods/stairs/textures/stairs_obsidian_glass_stairside.png diff --git a/mods/stairs/README.txt b/mods/stairs/README.txt index c6b8c337..8a3d8ea2 100644 --- a/mods/stairs/README.txt +++ b/mods/stairs/README.txt @@ -7,3 +7,18 @@ Authors of source code Originally by Kahrl (LGPLv2.1+) and celeron55, Perttu Ahola (LGPLv2.1+) Various Minetest developers and contributors (LGPLv2.1+) + +Authors of media (textures) +--------------------------- + +Textures +-------- +Copyright (c) 2018 Shara RedCat (CC BY-SA 3.0) + stairs_obsidian_glass_outer_stairside.png -- Derived from a texture by PilzAdam (CC BY-SA 3.0) + stairs_obsidian_glass_stairside.png -- Derived from a texture by PilzAdam (CC BY-SA 3.0) + +Copyright (c) 2018 TumeniNodes (CC BY-SA 3.0): + stairs_glass_outer_stairside.png -- Derived from a texture by celeron55 (CC BY-SA 3.0) + stairs_glass_stairside.png -- Derived from a texture by celeron55 (CC BY-SA 3.0) + default_glass_split -- Derived from a texture by celeron55 (CC BY-SA 3.0) + default_obsidian_glass_split -- Derived from a texture by PilzAdam (CC BY-SA 3.0) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 59bd0377..53a56e24 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -211,6 +211,12 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, player_name) return end + -- If paramtype2 of cubic version is not 'facedir' set its + -- param2 to 0 to avoid bugs such as liquid in connected + -- framed glass. + if minetest.registered_nodes[recipeitem].paramtype2 ~= "facedir" then + p2 = 0 + end minetest.set_node(pointed_thing.under, {name = recipeitem, param2 = p2}) if not creative_enabled then itemstack:take_item() @@ -855,3 +861,97 @@ stairs.register_stair_and_slab( default.node_sound_snow_defaults(), true ) + +-- Glass stair nodes need to be registered individually to utilize specialized textures. + +stairs.register_stair( + "glass", + "default:glass", + {cracky = 3}, + {"stairs_glass_split.png", "default_glass.png", + "stairs_glass_stairside.png^[transformFX", "stairs_glass_stairside.png", + "default_glass.png", "stairs_glass_split.png"}, + "Glass Stair", + default.node_sound_glass_defaults(), + false +) + +stairs.register_slab( + "glass", + "default:glass", + {cracky = 3}, + {"default_glass.png", "default_glass.png", "stairs_glass_split.png"}, + "Glass Slab", + default.node_sound_glass_defaults(), + false +) + +stairs.register_stair_inner( + "glass", + "default:glass", + {cracky = 3}, + {"stairs_glass_stairside.png^[transformR270", "default_glass.png", + "stairs_glass_stairside.png^[transformFX", "default_glass.png", + "default_glass.png", "stairs_glass_stairside.png"}, + "Glass Inner Stair", + default.node_sound_glass_defaults(), + false +) + +stairs.register_stair_outer( + "glass", + "default:glass", + {cracky = 3}, + {"stairs_glass_stairside.png^[transformR90", "default_glass.png", + "stairs_glass_outer_stairside.png", "stairs_glass_stairside.png", + "stairs_glass_stairside.png^[transformR90","stairs_glass_outer_stairside.png"}, + "Glass Outer Stair", + default.node_sound_glass_defaults(), + false +) + +stairs.register_stair( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 3}, + {"stairs_obsidian_glass_split.png", "default_obsidian_glass.png", + "stairs_obsidian_glass_stairside.png^[transformFX", "stairs_obsidian_glass_stairside.png", + "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"}, + "Obsidian Glass Stair", + default.node_sound_glass_defaults(), + false +) + +stairs.register_slab( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 3}, + {"default_obsidian_glass.png", "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"}, + "Obsidian Glass Slab", + default.node_sound_glass_defaults(), + false +) + +stairs.register_stair_inner( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 3}, + {"stairs_obsidian_glass_stairside.png^[transformR270", "default_obsidian_glass.png", + "stairs_obsidian_glass_stairside.png^[transformFX", "default_obsidian_glass.png", + "default_obsidian_glass.png", "stairs_obsidian_glass_stairside.png"}, + "Obsidian Glass Inner Stair", + default.node_sound_glass_defaults(), + false +) + +stairs.register_stair_outer( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 3}, + {"stairs_obsidian_glass_stairside.png^[transformR90", "default_obsidian_glass.png", + "stairs_obsidian_glass_outer_stairside.png", "stairs_obsidian_glass_stairside.png", + "stairs_obsidian_glass_stairside.png^[transformR90","stairs_obsidian_glass_outer_stairside.png"}, + "Obsidian Glass Outer Stair", + default.node_sound_glass_defaults(), + false +) diff --git a/mods/stairs/textures/stairs_glass_outer_stairside.png b/mods/stairs/textures/stairs_glass_outer_stairside.png new file mode 100644 index 0000000000000000000000000000000000000000..f0b94423063941a7abc3644b959671c28c786aed GIT binary patch literal 169 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 literal 0 HcmV?d00001 diff --git a/mods/stairs/textures/stairs_obsidian_glass_split.png b/mods/stairs/textures/stairs_obsidian_glass_split.png new file mode 100644 index 0000000000000000000000000000000000000000..7647b9b0858e976a6b6dbfda04594bc1b66d0094 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t_%$60s;c^YKGP7c6C5O z#*!evUYoHDWPgg&ebxsLQ0LSAX9smFU literal 0 HcmV?d00001 diff --git a/mods/stairs/textures/stairs_obsidian_glass_stairside.png b/mods/stairs/textures/stairs_obsidian_glass_stairside.png new file mode 100644 index 0000000000000000000000000000000000000000..a117cdd2f8307cbec80153c6ca9912eba3830745 GIT binary patch literal 3629 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 literal 0 HcmV?d00001 From ab1a79b13c5739d73083236ca29869b60ff3b380 Mon Sep 17 00:00:00 2001 From: random-geek <35757396+random-geek@users.noreply.github.com> Date: Tue, 9 Oct 2018 12:54:22 -0700 Subject: [PATCH 169/195] Add blueberry bushes --- game_api.txt | 5 +- mods/default/README.txt | 7 ++ mods/default/craftitems.lua | 6 ++ mods/default/mapgen.lua | 23 +++++ mods/default/nodes.lua | 82 ++++++++++++++++++ mods/default/schematics/blueberry_bush.mts | Bin 0 -> 80 bytes mods/default/textures/default_blueberries.png | Bin 0 -> 166 bytes .../default_blueberry_bush_leaves.png | Bin 0 -> 813 bytes .../default_blueberry_bush_sapling.png | Bin 0 -> 204 bytes .../textures/default_blueberry_overlay.png | Bin 0 -> 165 bytes mods/default/trees.lua | 13 +++ mods/dye/init.lua | 8 ++ schematic_tables.txt | 20 ++++- 13 files changed, 162 insertions(+), 2 deletions(-) create mode 100644 mods/default/schematics/blueberry_bush.mts create mode 100644 mods/default/textures/default_blueberries.png create mode 100644 mods/default/textures/default_blueberry_bush_leaves.png create mode 100644 mods/default/textures/default_blueberry_bush_sapling.png create mode 100644 mods/default/textures/default_blueberry_overlay.png diff --git a/game_api.txt b/game_api.txt index 27d5b339..47df8e7f 100644 --- a/game_api.txt +++ b/game_api.txt @@ -927,10 +927,13 @@ Trees * `default.grow_acacia_bush(pos)` * Grows an acaia bush at pos - + * `default.grow_pine_bush(pos)` * Grows a pine bush at pos + * `default.grow_blueberry_bush(pos)` + * Grows a blueberry bush at pos + Carts ----- diff --git a/mods/default/README.txt b/mods/default/README.txt index 474ef0ec..3d33e31c 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -230,6 +230,10 @@ Mossmanikin (CC BY-SA 3.0): default_fern_*.png random-geek (CC BY-SA 3.0): + default_blueberries.png + default_blueberry_overlay.png + default_blueberry_bush_leaves.png, derived from default_bush_leaves (by paramat) + default_blueberry_bush_sapling.png default_dirt.png -- Derived from a texture by Neuromancer (CC BY-SA 3.0) @@ -359,3 +363,6 @@ sofar (CC BY-SA 3.0): TumeniNodes (CC BY-SA 3.0): pine_bush.mts + +random-geek (CC BY-SA 3.0): + blueberry_bush.mts diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index 6c079349..3e3852ce 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -341,3 +341,9 @@ minetest.register_craftitem("default:flint", { description = "Flint", inventory_image = "default_flint.png" }) + +minetest.register_craftitem("default:blueberries", { + description = "Blueberries", + inventory_image = "default_blueberries.png", + on_use = minetest.item_eat(2), +}) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 7e1cf7df..d53467d3 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1964,6 +1964,29 @@ function default.register_decorations() flags = "place_center_x, place_center_z", }) + -- Blueberry bush + + minetest.register_decoration({ + name = "default:blueberry_bush", + deco_type = "schematic", + place_on = {"default:dirt_with_grass", "default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"grassland", "snowy_grassland"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = minetest.get_modpath("default") .. "/schematics/blueberry_bush.mts", + flags = "place_center_x, place_center_z", + }) + -- Acacia bush minetest.register_decoration({ diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 9aa3606f..c8020127 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -165,6 +165,9 @@ default:acacia_bush_sapling default:pine_bush_stem default:pine_bush_needles default:pine_bush_sapling +default:blueberry_bush_leaves_with_berries +default:blueberry_bush_leaves +default:blueberry_bush_sapling default:sand_with_kelp @@ -1614,6 +1617,85 @@ minetest.register_node("default:bush_sapling", { end, }) +minetest.register_node("default:blueberry_bush_leaves_with_berries", { + description = "Blueberry Bush Leaves with Berries", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"default_blueberry_bush_leaves.png^default_blueberry_overlay.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, dig_immediate = 3}, + drop = "default:blueberries", + sounds = default.node_sound_leaves_defaults(), + node_dig_prediction = "default:blueberry_bush_leaves", + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, {name = "default:blueberry_bush_leaves"}) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, +}) + +minetest.register_node("default:blueberry_bush_leaves", { + description = "Blueberry Bush Leaves", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"default_blueberry_bush_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:blueberry_bush_sapling"}, rarity = 5}, + {items = {"default:blueberry_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) < 11 then + minetest.get_node_timer(pos):start(200) + else + minetest.set_node(pos, {name = "default:blueberry_bush_leaves_with_berries"}) + end + end, + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:blueberry_bush_sapling", { + description = "Blueberry Bush Sapling", + drawtype = "plantlike", + tiles = {"default_blueberry_bush_sapling.png"}, + inventory_image = "default_blueberry_bush_sapling.png", + wield_image = "default_blueberry_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:blueberry_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + minetest.register_node("default:acacia_bush_stem", { description = "Acacia Bush Stem", drawtype = "plantlike", diff --git a/mods/default/schematics/blueberry_bush.mts b/mods/default/schematics/blueberry_bush.mts new file mode 100644 index 0000000000000000000000000000000000000000..cf4d8ef84af1d3cec7e274013bf59dc56173cf6f GIT binary patch literal 80 zcmeYb3HD`RVPIxpWMHlb5?U##X^EvdC00o}rKw4&MMahINu|XZ@j0o9WvRvS<(VZJ g@gU*M)Z&Uc$q5eZzkdGu`M)tjUXO{vU>S1-0OD*Mv;Y7A literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_blueberries.png b/mods/default/textures/default_blueberries.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbb0d64fd3a6eb38944c124c3ce257bb23559bb GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ1=6x2A*xc@rn25Hs)-Q> zwc)nE+*^)m0VNnqg8YIR9G=}s19I#=T^vI=t|uofkl3KurvfLW{@qfkrWSy85}S Ib4q9e0RCbv761SM literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_blueberry_bush_leaves.png b/mods/default/textures/default_blueberry_bush_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd112c8c3a8792bb5d63652bd723b21e414229b GIT binary patch literal 813 zcmV+|1JeA7P){ zO^aJ~6o;Slzb{GV#w3mtYa6E(?Nsb&Ww7)GanVkxx)|KpS%~5X5b-0-sfAKB*L!d7|F{Sl3Oyg-{LcA3j~qVKpnfjXu#>X? zaEU*^GEzU9Y3z^j5{ImiGyJV2^`n_`0E)9N_pXe{du0JI%WI;i&X%Y)e0KX8(@7JH zttoLQXJy@0fOKR5$a`g3UK5>PRW;i!%g;Z=JiX|Ubu9IBnfA6kaYu%%V>xgpAWCuo zvW{hEBVvA4_3CF4&pZpp#7fvo>34;3ZaHxOSX4>^C)XqH+0#z>bwvfBIJlkR5B%c})~ibuOCQY<*^duayK z+wvrB1>*R^6Y~YqRv@>wEndNJ^1T`EewQ=9s!C;&Y{$y^i$-Oiu(J^%7e3yv{jSh% ziY%{*ZnrFhc1o${67P=jLql)NlgD33)z);fr4Qka!h}Mkj1x4 zT)Sk%Z;UkU1hTU3>h2)JOn-m%LO@XQICLTapj`8K>djpLxt&rv=z{eDs8)Se)?NMj zlU?q21v&Y~llowgq84h4KH>oFpY)dH_`5|mn+bC#e0G1$i2X6< z@0KTNCy;W@qt@^+Mwq6)xLU;>8Pbs@yjhT+J{{sVgz)~D-j*j`;^0o3Z#R7z^oI)U zrQZG~BDzzOg)^uhW;)hM$b-KoX8zmqMUK5TtFOFMWEf8nUAtst=3uN|!w_CAJc6&X zH0fezBjWWBs+g&g0DpXu01zB;$vT#W_jv?gyD9RpwPyBM5e9JM$AqBlQazoh;~896 rC|6t--tzhH?u>Ld;|UGmVQc>fv>b8Yj%znL00000NkvXXu0mjfAjXiM literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_blueberry_bush_sapling.png b/mods/default/textures/default_blueberry_bush_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7393f7b2a69abe041cd7912df8ae681058674b GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ1=22#O2(o5QDJ&6MIwbc zmZ5!;k0-Nm0wowrg8YIR9G=}s196hP-CYEal|aXmRfK}f|RbD9aq+hb1{5?81=r_NyEP3Ssw$3Z2Usd*(+#IfGc240=zr%pX! pO54D>oUL)H)f-_5+P$@O1TaS?83{1OT?eHi`fM literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_blueberry_overlay.png b/mods/default/textures/default_blueberry_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..de9de623497f7a0488c1e278d5e7913182451baa GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t_2M9RHd@*bhdtcx8gZa zkg+7lFPOpM*^M-iiUNviolet dye + +minetest.register_craft({ + type = "shapeless", + output = "dye:violet 2", + recipe = {"default:blueberries"}, +}) + -- Mix recipes local dye_recipes = { diff --git a/schematic_tables.txt b/schematic_tables.txt index ee25b822..261dcf19 100644 --- a/schematic_tables.txt +++ b/schematic_tables.txt @@ -9,7 +9,7 @@ The following tables are for pasting into mods that contain a function to convert the Lua tables into .mts files. Such mods often have two functions to process two formats of the 'data' table: -The standard table format is described in the 'Schematic specifier' section of +The standard table format is described in the 'Schematic specifier' section of the lua_api.txt file in the Minetest Engine. The 'data' table appears as a sequence of vertical slices through the structure the schematic describes. @@ -2146,6 +2146,24 @@ mts_save("bush", { }) +-- Blueberry bush + +local L = {name = "default:blueberry_bush_leaves_with_berries", prob = 255, force_place = true} +local M = {name = "default:blueberry_bush_leaves_with_berries", prob = 223} +local N = {name = "default:blueberry_bush_leaves_with_berries", prob = 95} + +mts_save("blueberry_bush", { + size = {x = 3, y = 1, z = 3}, + data = { + N, M, N, + + M, L, M, + + N, M, N, + }, +}) + + -- Acacia bush local L = {name = "default:acacia_bush_leaves", prob = 255} From f583d90c94bfaa8e8a9851b61a8df20033800943 Mon Sep 17 00:00:00 2001 From: TumeniNodes Date: Thu, 11 Oct 2018 14:31:35 -0400 Subject: [PATCH 170/195] Fence rails: Allow connections to walls --- mods/default/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 367ded0b..1165c89c 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -368,7 +368,7 @@ function default.register_fence_rail(name, def) {1/16, 3/16, -1/16, 1/2, 5/16, 1/16}, {1/16, -5/16, -1/16, 1/2, -3/16, 1/16}}, }, - connects_to = {"group:fence"}, + connects_to = {"group:fence", "group:wall"}, inventory_image = fence_rail_texture, wield_image = fence_rail_texture, tiles = {def.texture}, From b042106fdc3bc56beb6c263e790c31a6f13f1ead Mon Sep 17 00:00:00 2001 From: TumeniNodes Date: Thu, 11 Oct 2018 14:33:33 -0400 Subject: [PATCH 171/195] Stairs: Remove combine slabs code --- mods/stairs/init.lua | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 53a56e24..3e01a28e 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -143,10 +143,6 @@ function stairs.register_stair(subname, recipeitem, groups, images, description, end --- Slab facedir to placement 6d matching table -local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4} - - -- Register slab -- Node will be called stairs:slab_ @@ -198,32 +194,6 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, local p2 = under.param2 - -- combine two slabs if possible - if slab_trans_dir[math.floor(p2 / 4)] == dir - and wield_item == under.name then - - if not recipeitem then - return itemstack - end - if minetest.is_protected(pointed_thing.under, player_name) and not - minetest.check_player_privs(player_name, "protection_bypass") then - minetest.record_protection_violation(pointed_thing.under, - player_name) - return - end - -- If paramtype2 of cubic version is not 'facedir' set its - -- param2 to 0 to avoid bugs such as liquid in connected - -- framed glass. - if minetest.registered_nodes[recipeitem].paramtype2 ~= "facedir" then - p2 = 0 - end - minetest.set_node(pointed_thing.under, {name = recipeitem, param2 = p2}) - if not creative_enabled then - itemstack:take_item() - end - return itemstack - end - -- Placing a slab on an upside down slab should make it right-side up. if p2 >= 20 and dir == 8 then p2 = p2 - 20 From 382e2acd9b4320866d2bfdc29dd5e122bcb54994 Mon Sep 17 00:00:00 2001 From: Paramat Date: Sun, 14 Oct 2018 02:36:40 +0100 Subject: [PATCH 172/195] Spawn mod: Avoid respawn conflict with beds mod (#2240) --- mods/spawn/depends.txt | 1 + mods/spawn/init.lua | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/mods/spawn/depends.txt b/mods/spawn/depends.txt index 4ad96d51..548489e2 100644 --- a/mods/spawn/depends.txt +++ b/mods/spawn/depends.txt @@ -1 +1,2 @@ default +beds? diff --git a/mods/spawn/init.lua b/mods/spawn/init.lua index dc6366c1..6707932c 100644 --- a/mods/spawn/init.lua +++ b/mods/spawn/init.lua @@ -126,7 +126,18 @@ minetest.register_on_newplayer(function(player) on_spawn(player) end) +local enable_bed_respawn = minetest.settings:get_bool("enable_bed_respawn") +if enable_bed_respawn == nil then + enable_bed_respawn = true +end + minetest.register_on_respawnplayer(function(player) + -- Avoid respawn conflict with beds mod + if beds and enable_bed_respawn and + beds.spawn[player:get_player_name()] then + return + end + on_spawn(player) return true From cf0e49fb4aee91085011b0eb6cbb9e15c0d4614c Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Thu, 18 Oct 2018 06:45:35 +0200 Subject: [PATCH 173/195] Chests: Fix crash on empty key metadata --- mods/default/chests.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/default/chests.lua b/mods/default/chests.lua index cd707991..33389056 100644 --- a/mods/default/chests.lua +++ b/mods/default/chests.lua @@ -147,6 +147,10 @@ function default.chest.register_chest(name, d) local itemstack = player:get_wielded_item() local key_meta = itemstack:get_meta() + if itemstack:get_metadata() == "" then + return + end + if key_meta:get_string("secret") == "" then key_meta:set_string("secret", minetest.parse_json(itemstack:get_metadata()).secret) itemstack:set_metadata("") From 58f6994e085e60c6a5c78661d2355c42d280623a Mon Sep 17 00:00:00 2001 From: Paramat Date: Sat, 27 Oct 2018 13:57:16 +0100 Subject: [PATCH 174/195] Liquid sources: Backface-cull sides and base. Remove unused special tiles Fixes most z-fighting caused by underwater nodeboxes. Special tiles were for 'new style water' (lowered water level) which was removed a few years ago. --- mods/default/nodes.lua | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index c8020127..4f186e1c 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1944,6 +1944,7 @@ minetest.register_node("default:water_source", { tiles = { { name = "default_water_source_animated.png", + backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, @@ -1951,18 +1952,15 @@ minetest.register_node("default:water_source", { length = 2.0, }, }, - }, - special_tiles = { - -- New-style water source material (mostly unused) { name = "default_water_source_animated.png", + backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 2.0, }, - backface_culling = false, }, }, alpha = 160, @@ -2036,6 +2034,7 @@ minetest.register_node("default:river_water_source", { tiles = { { name = "default_river_water_source_animated.png", + backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, @@ -2043,17 +2042,15 @@ minetest.register_node("default:river_water_source", { length = 2.0, }, }, - }, - special_tiles = { { name = "default_river_water_source_animated.png", + backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 2.0, }, - backface_culling = false, }, }, alpha = 160, @@ -2135,6 +2132,7 @@ minetest.register_node("default:lava_source", { tiles = { { name = "default_lava_source_animated.png", + backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, @@ -2142,18 +2140,15 @@ minetest.register_node("default:lava_source", { length = 3.0, }, }, - }, - special_tiles = { - -- New-style lava source material (mostly unused) { name = "default_lava_source_animated.png", + backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.0, }, - backface_culling = false, }, }, paramtype = "light", From 5ccf965825981e489d96c9f64ae628d305bfda89 Mon Sep 17 00:00:00 2001 From: TumeniNodes Date: Mon, 29 Oct 2018 18:08:25 -0400 Subject: [PATCH 175/195] Beds: Use mod textures instead of default_wood.png No longer use default_wood.png for one side of the bed head and one side of the bed bottom node. Add a new texture for the underside of both beds. --- mods/beds/README.txt | 4 ++++ mods/beds/beds.lua | 12 ++++++------ mods/beds/license.txt | 1 + mods/beds/textures/beds_bed_under.png | Bin 0 -> 304 bytes 4 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 mods/beds/textures/beds_bed_under.png diff --git a/mods/beds/README.txt b/mods/beds/README.txt index cda6ebd9..b4cf0c44 100644 --- a/mods/beds/README.txt +++ b/mods/beds/README.txt @@ -10,6 +10,10 @@ Various Minetest developers and contributors (MIT) Authors of media (textures) --------------------------- BlockMen (CC BY-SA 3.0) + All textures unless otherwise noted + +TumeniNodes (CC BY-SA 3.0) + beds_bed_under.png This mod adds a bed to Minetest which allows to skip the night. To sleep, rightclick the bed. If playing in singleplayer mode the night gets skipped diff --git a/mods/beds/beds.lua b/mods/beds/beds.lua index bb2fd5d3..a971b89e 100644 --- a/mods/beds/beds.lua +++ b/mods/beds/beds.lua @@ -7,19 +7,19 @@ beds.register_bed("beds:fancy_bed", { tiles = { bottom = { "beds_bed_top1.png", - "default_wood.png", + "beds_bed_under.png", "beds_bed_side1.png", "beds_bed_side1.png^[transformFX", - "default_wood.png", + "beds_bed_foot.png", "beds_bed_foot.png", }, top = { "beds_bed_top2.png", - "default_wood.png", + "beds_bed_under.png", "beds_bed_side2.png", "beds_bed_side2.png^[transformFX", "beds_bed_head.png", - "default_wood.png", + "beds_bed_head.png", } }, nodebox = { @@ -58,7 +58,7 @@ beds.register_bed("beds:bed", { tiles = { bottom = { "beds_bed_top_bottom.png^[transformR90", - "default_wood.png", + "beds_bed_under.png", "beds_bed_side_bottom_r.png", "beds_bed_side_bottom_r.png^[transformfx", "beds_transparent.png", @@ -66,7 +66,7 @@ beds.register_bed("beds:bed", { }, top = { "beds_bed_top_top.png^[transformR90", - "default_wood.png", + "beds_bed_under.png", "beds_bed_side_top_r.png", "beds_bed_side_top_r.png^[transformfx", "beds_bed_side_top.png", diff --git a/mods/beds/license.txt b/mods/beds/license.txt index 0494b36b..f3c517f9 100644 --- a/mods/beds/license.txt +++ b/mods/beds/license.txt @@ -30,6 +30,7 @@ Licenses of media (textures) Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) Copyright (C) 2014-2016 BlockMen +Copyright (C) 2018 TumeniNodes You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/beds/textures/beds_bed_under.png b/mods/beds/textures/beds_bed_under.png new file mode 100644 index 0000000000000000000000000000000000000000..a9301156432af19eaa9732249be96dcdbfd4ded1 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Wq?nJYmmKixU*`qw^m((L0y7j zW0Fy0G7uTJWLURk*tBK>k!^dnZD+Ra+)CH^weAb+JQme^ENk>SJI|L5Xb5AHx4R2N z2dk_Hki%Kv5n0T@z%2~Ij105pNB{-dOFVsD*&lJqh{-D*-&P$0*#XNF%vT;RnfI<> zE<*@o{0VzCdjZdyiFqB9xAMkHF$UC2EnM<4MymYzgOx9j-1@jO{_?eLXV~|>=3T)x pOUCcoHX9E%Pr2&y?!%UU7_NnKmj9X Date: Fri, 2 Nov 2018 18:22:54 +0100 Subject: [PATCH 176/195] New glass, glass stair/slab, and glass door textures --- mods/default/README.txt | 5 ++++- mods/default/textures/default_glass.png | Bin 158 -> 270 bytes mods/default/textures/default_glass_detail.png | Bin 135 -> 125 bytes mods/doors/README.txt | 5 +++-- mods/doors/textures/doors_door_glass.png | Bin 491 -> 625 bytes mods/doors/textures/doors_item_glass.png | Bin 186 -> 169 bytes mods/stairs/README.txt | 17 ++++++++++------- .../textures/stairs_glass_outer_stairside.png | Bin 169 -> 255 bytes mods/stairs/textures/stairs_glass_split.png | Bin 162 -> 249 bytes .../stairs/textures/stairs_glass_stairside.png | Bin 167 -> 249 bytes mods/xpanes/README.txt | 3 +++ mods/xpanes/textures/xpanes_edge.png | Bin 84 -> 269 bytes 12 files changed, 20 insertions(+), 10 deletions(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index 3d33e31c..486379be 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -48,7 +48,6 @@ Calinou (CC BY-SA 3.0): default_brick.png default_papyrus.png default_mineral_copper.png - default_glass_detail.png PilzAdam (CC BY-SA 3.0): default_jungleleaves.png @@ -236,6 +235,10 @@ random-geek (CC BY-SA 3.0): default_blueberry_bush_sapling.png default_dirt.png -- Derived from a texture by Neuromancer (CC BY-SA 3.0) +Krock (CC0 1.0): + default_glass.png + default_glass_detail.png + Sounds ------ diff --git a/mods/default/textures/default_glass.png b/mods/default/textures/default_glass.png index da2540287cfe24c451c14b424792ac431db80bda..74d6a025320dc4dea4de520d3c88f08597c3649b 100644 GIT binary patch delta 254 zcmbQo*vB+MqMn19fq_9omp>Rtxd!-zxB}^$H*em(d-wkR`wt&JeDvti^XJcBfWfO* zuim_Q^Zxz&j~_pN`t<3`moMMGef$3X`;Q+#e*XOV>({S8fByXY_wWDz|1T$&EdmT>+n@J- z7cek5Gcfe~rJB7K%~Y5+bLpHLYgRDNUuC4C#c-FIp(LImAtF=6HPd46mefNc!k7AA z>S*L}PheyfxjfR|Rr~r>mdKI;Vst0K@%) Ap#T5? delta 142 zcmeBUn#VXnqMn7Bfq~)e-A6${ia)?7#1%*%IPm!X{SRl(yf|{?vA0ab37`;TNswPK zgTu2MX+Vyxr;B3<$Ms|Z5s?%T7A7`EHiHD0Bm+iGRs}JJPQ#|9GaQ|I9GI4|@iz-D r5!HFbaQPgI*r7$TPgocg*ci5~W@=;Q_!tQ^h{2QH)z4*}Q$iB}52q}E diff --git a/mods/default/textures/default_glass_detail.png b/mods/default/textures/default_glass_detail.png index d38dbb7b66419156dd305a20c762af15f13545e2..811a4db83d021603e687e646cb91f73f205a0c5a 100644 GIT binary patch delta 107 zcmV-x0F?iS0ez4dWe5fU001BJ|6u?C07OYdK~y-)V_+Cw;L)Q;IOXo%z5AaiLmobS zh*RPH`}c`63ZxGlczpl8W4$S;_| z;n|HeAVAxUuyE1B1~`hTV^5 S&e{jm!QkoY=d#Wzp$P!yb}I4! diff --git a/mods/doors/README.txt b/mods/doors/README.txt index 9ad7093d..ba8bd829 100644 --- a/mods/doors/README.txt +++ b/mods/doors/README.txt @@ -46,8 +46,9 @@ Following textures created by sofar (CC-BY-SA-3.0): Obsidian door textures by red-001 based on textures by Pilzadam and BlockMen (CC BY-SA 3.0): door_obsidian_glass.png -Glass door textures by red-001 based on textures by celeron55 (CC BY-SA 3.0): - door_glass.png +Glass door textures by Krock based on textures by VanessaE (CC BY-SA 3.0): + doors_door_glass.png + doors_item_glass.png All other textures (created by PilzAdam) (CC BY-SA 3.0): diff --git a/mods/doors/textures/doors_door_glass.png b/mods/doors/textures/doors_door_glass.png index 26c427b9fef32a34b2fd8daa7bff4117933d1924..3c205dd7655fcdc96f543c1602b2748212a9438a 100644 GIT binary patch delta 611 zcmV-p0-XKp1Mviq8Gi!+002q4`hfrd0EbXaR7C&)0Bme*ZEbCCZfQbaZrg zcXxe#eS?F8h=_-YiHVDgi;IqskdTm*larN|m6@5Do12@So}RqCywcLr)YR1F<>lw+ z=jiC@>gww2>+9|9?e6aG@9*#N@$vHV^7Hfa^z`)h_V)Mp_kZ~K`1$$y`uh6&`}_R- z{Qdp?{{H^||NjH_k7xh@00DGTPE!Ct=GbNc0004EOGiWihy@);00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-*w0TL%RQt1}I0004FNkl z3MG)INg((C-+yNaX{UEZGZTi}S?;+9Q`&RYNY!%VG#BYz)NP|$$))BYSjdMNhK{z_ zKGQgcUBEVvFibR&eO%!CEvAhSvp1REOW>b$H)~7_h1OmWm>#<)Ofw}njbT}1+b50( z%M^w?QfUVedvLT;C9vIlAh{Ko^fAmOxO0v3i6rRMw0}for^!XBDqZo%6pojEW|uWi zVtWLz9wK|*Wz0qy{Uo-;mT3gTPJVzW^NTC-SV(VpB&jV>4!`s zvUFth?Od`qqnCqrSZ{Y5B1;%EEnvN^)^ueCBJ%9=0Dy!50Qvv`0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000JJOGiWi z{{a60|De66labCBe*r>CL_t(o!|j+oj>0eyg`ZbB042q`NRwQE5{Z$xOAeL0AQ_30 z3%E)V3QBHZij@&jY_ER>?B z|Kssu1^s9X3b2t zVYsQfUNHdZ`$JC7iJ}hebH+rRDHXSo&cmNtp4{bqfR$ME|A4v5QmSNLU__jqPGzpB zBrpKjZhu;W4_xe3=HtJ#i%?Yn&@|0#@xDJic9V!hh;inu?@1};uYuaOHN|j)Jwupa zOi-bcQqE$yT1r`I2$O8jwQ>O4^cf8{bRH|&E|TW4l5g~^lzJYsW$4<~oLU-es6OMZ yd?)?Qc`Wt2(i;p2o5xbM%wsv_Rhn1)lDY$^?)H`=V9#s-0000{b1%jpb)??tATMr1NQ-OC&mhW7S;q-s|Ilc z#u~8=%oZGP80whR8h8&e6exHws83)xcV>4ucLl@s<3hU1OA<_tL5}cr^>bP0l+XkK Decv#c delta 170 zcmZ33p^r=85p>QL70(Y)*K0-AbW|YuPgflWmdKI;Vst0R4?J4gdfE diff --git a/mods/stairs/README.txt b/mods/stairs/README.txt index 8a3d8ea2..26317f7f 100644 --- a/mods/stairs/README.txt +++ b/mods/stairs/README.txt @@ -13,12 +13,15 @@ Authors of media (textures) Textures -------- -Copyright (c) 2018 Shara RedCat (CC BY-SA 3.0) - stairs_obsidian_glass_outer_stairside.png -- Derived from a texture by PilzAdam (CC BY-SA 3.0) - stairs_obsidian_glass_stairside.png -- Derived from a texture by PilzAdam (CC BY-SA 3.0) +Copyright (c) 2018 Shara RedCat (CC BY-SA 3.0): + Derived from a texture by PilzAdam (CC BY-SA 3.0): + stairs_obsidian_glass_outer_stairside.png + stairs_obsidian_glass_stairside.png Copyright (c) 2018 TumeniNodes (CC BY-SA 3.0): - stairs_glass_outer_stairside.png -- Derived from a texture by celeron55 (CC BY-SA 3.0) - stairs_glass_stairside.png -- Derived from a texture by celeron55 (CC BY-SA 3.0) - default_glass_split -- Derived from a texture by celeron55 (CC BY-SA 3.0) - default_obsidian_glass_split -- Derived from a texture by PilzAdam (CC BY-SA 3.0) + Derived from a texture by celeron55 (CC BY-SA 3.0) and + converted to bright white by Krock (CC BY-SA 3.0): + stairs_glass_stairside.png + stairs_glass_split.png + Derived from a texture by PilzAdam (CC BY-SA 3.0): + stairs_obsidian_glass_split.png diff --git a/mods/stairs/textures/stairs_glass_outer_stairside.png b/mods/stairs/textures/stairs_glass_outer_stairside.png index f0b94423063941a7abc3644b959671c28c786aed..9b298c8bfccd6308589556672b13d982d9a76d5b 100644 GIT binary patch delta 239 zcmZ3<_@8ltL_G&H0|SGGE`KnPvJCJEaRt&pfByXQ=g$h*;zJLD?RP*cCuiw9a16BU}_YbIe&cx1zK+P;AL4F{^7&cE%n+2o_ zJzX3_BqUi6b}}|AFtBWhh!U-Axm|xl&1mzcpwAg^?8;^{r7-z6NIobOd=etIXp!+D z^*eGFOBP;W*&(O!Os05WrtQhw(Z#V_*Ub(5Ja>QHJ}ZU|rhE??GL|%m{9(~dka1yX nh-PS5_x9fPeUoEmK7LalR>OLKO2MupAXj+0`njxgN@xNA$sKva delta 153 zcmV;K0A~OH0jU9y7=Hu<0002(-QrRJ000kAOjJc>bS=QZUg z00DGTPE!Ct=GbNc002lyL_t&t*G-Ip4FE9+0-?VEZqQM>|5PvZo4$z&3J0o+y#)dE zMj&GJXSNhXG1k+WY5NNsmGOTMHqM}?mT!xZ*BRdM>3IPb01^Yay{bip00000NkvXX Hu0mjfk$*l( diff --git a/mods/stairs/textures/stairs_glass_split.png b/mods/stairs/textures/stairs_glass_split.png index 13ddff3f08a4b553425e425840a8ee6cc523f107..62879597850e75ff1e5258d14897c0902a4c67b7 100644 GIT binary patch delta 233 zcmZ3)_>*yhL_G&H0|SGGE`KnPvJCJEaRt(!KY#xA?c1L}fBygf|MuXzopr0KZ2tqW}N^ diff --git a/mods/stairs/textures/stairs_glass_stairside.png b/mods/stairs/textures/stairs_glass_stairside.png index 49e3034f8dc549d73995cf8b16c76ef57b2bec9e..c4242943aa2fbb86d0a81f01d94938d816e85b03 100644 GIT binary patch delta 233 zcmZ3^_>*yhL_G&H0|SGGE`KnPG7IntaRt&pfByXQ=g;52fB*ga_y7O@4<9~!`t<4Z z=g(iheEIh6+xPF^feL>8`h~2Ax;7oGy%-*-Gc-&T{(NNi)YXso{g!`a V$f^=QD?Sb608dvxmvv4FO#oHWa+m-B delta 151 zcmV;I0BHaD0jB|w7=Hu<0002(-QrRJ000kAOjJc>bS=QZUg z00DGTPE!Ct=GbNc002fwL_t&t*G)``2>>w+(%u4QgN}0hPj%5Fv;o2Rp{m#@2%r&y zkk!g=Du`mNr!(9371q>e2Y;QZI`jHBS&`;=!mfJf1N`CxV-QRFMb`iT002ovPDHLk FV1m5&L5BbU diff --git a/mods/xpanes/README.txt b/mods/xpanes/README.txt index bcbc1294..47161da5 100644 --- a/mods/xpanes/README.txt +++ b/mods/xpanes/README.txt @@ -19,3 +19,6 @@ Gambit (CC BY-SA 3.0): paramat (CC BY-SA 3.0): xpanes_bar_top.png + +Krock (CC0 1.0): + xpanes_edge.png diff --git a/mods/xpanes/textures/xpanes_edge.png b/mods/xpanes/textures/xpanes_edge.png index 92f78a1994fc3fb12c069af3e1aee3b2f9fd00ec..5768d66325e223045786219ecb00b985d1199bd4 100644 GIT binary patch delta 252 zcmV{r>*`|NsBI=ja;%005gwL_t&t9RZL4Z~p+RY*d*Xo94Ozc2|{|*M+vWdjOced!Byo zt>^&WcSYw-neK=H=iBUS=LUwJ0AA~7bdIX&=m2Tg&TT1jZB_slsZ*Zrsp`G}tghpQ zb>zA00P60pK78e<-T>x|UWu)`q<~6|p0000 Date: Fri, 9 Nov 2018 13:53:23 -0500 Subject: [PATCH 177/195] Fix sRGB profiles for obsidian glass stair textures --- .../stairs_obsidian_glass_outer_stairside.png | Bin 3626 -> 194 bytes .../stairs_obsidian_glass_stairside.png | Bin 3629 -> 195 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/stairs/textures/stairs_obsidian_glass_outer_stairside.png b/mods/stairs/textures/stairs_obsidian_glass_outer_stairside.png index 979f11e0c0d9626c854a0e5a1f602776b7533999..63db4a2df79147a5fab895c0df2b5234b1d9c78e 100644 GIT binary patch delta 158 zcmZ1_bBJ+*gas2b0|P_ST=7ppiZj3`#Fc>|T|huUUd^yt-L4KO$XF8O7tG-B>_!@h zljQC0!qCAg>oHMLJeq;M#M9T6{Sh}Ovw(5dmBnj-DvUf`978y+Cv)`9k~;O^z>5PM zsxxF}NJvRYOHAb0AY^dyzyXGkLkAA9BpEhF^mwp%a59+N@cf>5I7tkso59o7&t;uc GLK6VT@-2%1 delta 3618 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 HN@xNAxUMc< delta 3621 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 From 21f5eaade052684d2694f6584496f8b5dc48d4ea Mon Sep 17 00:00:00 2001 From: Ezhh Date: Thu, 15 Nov 2018 00:49:16 +0000 Subject: [PATCH 178/195] Add plantlike_rooted coral --- mods/default/README.txt | 5 + mods/default/mapgen.lua | 21 ++- mods/default/nodes.lua | 153 ++++++++++++++++++ mods/default/schematics/corals.mts | Bin 171 -> 0 bytes mods/default/textures/default_coral_cyan.png | Bin 0 -> 202 bytes mods/default/textures/default_coral_green.png | Bin 0 -> 287 bytes mods/default/textures/default_coral_pink.png | Bin 0 -> 242 bytes schematic_tables.txt | 38 ----- 8 files changed, 171 insertions(+), 46 deletions(-) delete mode 100644 mods/default/schematics/corals.mts create mode 100644 mods/default/textures/default_coral_cyan.png create mode 100644 mods/default/textures/default_coral_green.png create mode 100644 mods/default/textures/default_coral_pink.png diff --git a/mods/default/README.txt b/mods/default/README.txt index 486379be..a5346976 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -239,6 +239,11 @@ Krock (CC0 1.0): default_glass.png default_glass_detail.png +Topywo (CC BY-SA 3.0) + default_coral_cyan.png + default_coral_green.png + default_coral_pink.png + Sounds ------ diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index d53467d3..b92e12ef 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -2167,15 +2167,17 @@ function default.register_decorations() minetest.register_decoration({ name = "default:corals", - deco_type = "schematic", + deco_type = "simple", place_on = {"default:sand"}, + place_offset_y = -1, + sidelen = 4, noise_params = { - offset = -0.15, - scale = 0.1, - spread = {x = 100, y = 100, z = 100}, + offset = -4, + scale = 4, + spread = {x = 50, y = 50, z = 50}, seed = 7013, octaves = 3, - persist = 1, + persist = 0.7, }, biomes = { "desert_ocean", @@ -2184,9 +2186,12 @@ function default.register_decorations() }, y_max = -2, y_min = -8, - schematic = minetest.get_modpath("default") .. "/schematics/corals.mts", - flags = "place_center_x, place_center_z", - rotation = "random", + flags = "force_placement", + decoration = { + "default:coral_green", "default:coral_pink", + "default:coral_cyan", "default:coral_brown", + "default:coral_orange", "default:coral_skeleton", + }, }) -- Kelp diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 4f186e1c..3c2836d9 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1910,6 +1910,159 @@ minetest.register_node("default:sand_with_kelp", { -- Corals -- +minetest.register_node("default:coral_green", { + description = "Green Coral", + drawtype = "plantlike_rooted", + waving = 1, + paramtype = "light", + tiles = {"default_coral_skeleton.png"}, + special_tiles = {{name = "default_coral_green.png", tileable_vertical = true}}, + inventory_image = "default_coral_green.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "default:coral_skeleton", + node_placement_prediction = "", + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" or not placer then + return itemstack + end + + local player_name = placer:get_player_name() + local pos_under = pointed_thing.under + local pos_above = pointed_thing.above + + if minetest.get_node(pos_under).name ~= "default:coral_skeleton" or + minetest.get_node(pos_above).name ~= "default:water_source" then + return itemstack + end + + if minetest.is_protected(pos_under, player_name) or + minetest.is_protected(pos_above, player_name) then + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos_under, player_name) + return itemstack + end + + minetest.set_node(pos_under, {name = "default:coral_green"}) + if not (creative and creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + + return itemstack + end, + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:coral_skeleton"}) + end, +}) + +minetest.register_node("default:coral_pink", { + description = "Pink Coral", + drawtype = "plantlike_rooted", + waving = 1, + paramtype = "light", + tiles = {"default_coral_skeleton.png"}, + special_tiles = {{name = "default_coral_pink.png", tileable_vertical = true}}, + inventory_image = "default_coral_pink.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "default:coral_skeleton", + node_placement_prediction = "", + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" or not placer then + return itemstack + end + + local player_name = placer:get_player_name() + local pos_under = pointed_thing.under + local pos_above = pointed_thing.above + + if minetest.get_node(pos_under).name ~= "default:coral_skeleton" or + minetest.get_node(pos_above).name ~= "default:water_source" then + return itemstack + end + + if minetest.is_protected(pos_under, player_name) or + minetest.is_protected(pos_above, player_name) then + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos_under, player_name) + return itemstack + end + + minetest.set_node(pos_under, {name = "default:coral_pink"}) + if not (creative and creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + + return itemstack + end, + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:coral_skeleton"}) + end, +}) + +minetest.register_node("default:coral_cyan", { + description = "Cyan Coral", + drawtype = "plantlike_rooted", + waving = 1, + paramtype = "light", + tiles = {"default_coral_skeleton.png"}, + special_tiles = {{name = "default_coral_cyan.png", tileable_vertical = true}}, + inventory_image = "default_coral_cyan.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "default:coral_skeleton", + node_placement_prediction = "", + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" or not placer then + return itemstack + end + + local player_name = placer:get_player_name() + local pos_under = pointed_thing.under + local pos_above = pointed_thing.above + + if minetest.get_node(pos_under).name ~= "default:coral_skeleton" or + minetest.get_node(pos_above).name ~= "default:water_source" then + return itemstack + end + + if minetest.is_protected(pos_under, player_name) or + minetest.is_protected(pos_above, player_name) then + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos_under, player_name) + return itemstack + end + + minetest.set_node(pos_under, {name = "default:coral_cyan"}) + if not (creative and creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + + return itemstack + end, + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:coral_skeleton"}) + end, +}) + minetest.register_node("default:coral_brown", { description = "Brown Coral", tiles = {"default_coral_brown.png"}, diff --git a/mods/default/schematics/corals.mts b/mods/default/schematics/corals.mts deleted file mode 100644 index e1bd7ded6c202e4ca9f308164806f53117606728..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmeYb3HD`RVPIuoW?-$aw+Awr6Elk#L{d`I5=(PRtdjGK5_95#L|%F-gD|RSQc-?+ z9)lRFU~zV8PHIVhUd5cXJr{Wy6gix^-`F!RE)@~k)9~+pchcpcMz;l}!mV5L=PU0m z+!C7hHEZ`~B|(0{3=Yq3qyag}o-U3d9M`9w+Q{3WAmV!Qdviqn)ClfEh6x4? z9&0>1xFsI{Q}%esbnlfI`~Fw+^YsoNnIWn5amC4u3kSYCRx;)!FJVZM(qUQ5xVLx7 v#Km5#jRep6-p$+WE^swmP-ltGrUys3_a}4Z?d!Ht0y)al)z4*}Q$iB}a$824 literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_coral_green.png b/mods/default/textures/default_coral_green.png new file mode 100644 index 0000000000000000000000000000000000000000..847c57216ae5b2a4236309db7459619db1bef2a0 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Yk*IPE0AWm&A^b$5Ob1&p@Bj7 z5<}q;1_m<*ztap1lNcDR7%VO@FgP%zA7$v=&meT2LFW>K{W%8bvkYm+7#KPk7z`K~ zbQzLA{hACkhp{BcFPOpM*^M+Hr^D05F+}3Btskclvmy`I$FjR`@BX*nnvgbY1vAgV z8Igv~=k^QftK2b{OJdsayzN{x@1{AAqIW7Sz1*>uL*VYW94$-ra|TO~$A^FV%o Date: Fri, 16 Nov 2018 13:50:10 -0500 Subject: [PATCH 179/195] Remove double inner/outer in stairs descriptions --- mods/stairs/init.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 3e01a28e..e2ae0f51 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -863,7 +863,7 @@ stairs.register_stair_inner( {"stairs_glass_stairside.png^[transformR270", "default_glass.png", "stairs_glass_stairside.png^[transformFX", "default_glass.png", "default_glass.png", "stairs_glass_stairside.png"}, - "Glass Inner Stair", + "Glass Stair", default.node_sound_glass_defaults(), false ) @@ -875,7 +875,7 @@ stairs.register_stair_outer( {"stairs_glass_stairside.png^[transformR90", "default_glass.png", "stairs_glass_outer_stairside.png", "stairs_glass_stairside.png", "stairs_glass_stairside.png^[transformR90","stairs_glass_outer_stairside.png"}, - "Glass Outer Stair", + "Glass Stair", default.node_sound_glass_defaults(), false ) @@ -909,7 +909,7 @@ stairs.register_stair_inner( {"stairs_obsidian_glass_stairside.png^[transformR270", "default_obsidian_glass.png", "stairs_obsidian_glass_stairside.png^[transformFX", "default_obsidian_glass.png", "default_obsidian_glass.png", "stairs_obsidian_glass_stairside.png"}, - "Obsidian Glass Inner Stair", + "Obsidian Glass Stair", default.node_sound_glass_defaults(), false ) @@ -921,7 +921,7 @@ stairs.register_stair_outer( {"stairs_obsidian_glass_stairside.png^[transformR90", "default_obsidian_glass.png", "stairs_obsidian_glass_outer_stairside.png", "stairs_obsidian_glass_stairside.png", "stairs_obsidian_glass_stairside.png^[transformR90","stairs_obsidian_glass_outer_stairside.png"}, - "Obsidian Glass Outer Stair", + "Obsidian Glass Stair", default.node_sound_glass_defaults(), false ) From 1fa8180e7fbc1f1470187b997ff9ecea188df0be Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Wed, 28 Nov 2018 14:14:33 +0000 Subject: [PATCH 180/195] Add sfinv.get_page() --- game_api.txt | 1 + mods/sfinv/api.lua | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/game_api.txt b/game_api.txt index 47df8e7f..4500cac8 100644 --- a/game_api.txt +++ b/game_api.txt @@ -569,6 +569,7 @@ sfinv API by its author: https://rubenwardy.com/minetest_modding_book/en/chapter **Pages** * sfinv.set_page(player, pagename) - changes the page +* sfinv.get_page(player) - get the current page name. Will never return nil * sfinv.get_homepage_name(player) - get the page name of the first page to show to a player * sfinv.register_page(name, def) - register a page, see section below * sfinv.override_page(name, def) - overrides fields of an page registered with register_page. diff --git a/mods/sfinv/api.lua b/mods/sfinv/api.lua index b9ddb39b..cd5b5e8a 100644 --- a/mods/sfinv/api.lua +++ b/mods/sfinv/api.lua @@ -135,6 +135,11 @@ function sfinv.set_page(player, pagename) sfinv.set_player_inventory_formspec(player, context) end +function sfinv.get_page(player) + local context = sfinv.contexts[player:get_player_name()] + return context and context.page or sfinv.get_homepage_name(player) +end + minetest.register_on_joinplayer(function(player) if sfinv.enabled then sfinv.set_player_inventory_formspec(player) From 667e130c52af62494e12721384279181b3738ff6 Mon Sep 17 00:00:00 2001 From: sofar Date: Thu, 6 Dec 2018 15:29:43 -0800 Subject: [PATCH 181/195] Prevent crash if some mod inadvertently allowed doors to rotate --- mods/doors/init.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 2685357a..789bbb0c 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -162,6 +162,14 @@ function _doors.door_toggle(pos, node, clicker) end local dir = node.param2 + + -- It's possible param2 is messed up, so, validate before using + -- the input data. This indicates something may have rotated + -- the door, even though that is not supported. + if not transform[state + 1] or not transform[state + 1][dir + 1] then + return false + end + if state % 2 == 0 then minetest.sound_play(def.door.sounds[1], {pos = pos, gain = 0.3, max_hear_distance = 10}) From ec248d3cb0059e0fc4fe7b15e66f4e3b9065e3bf Mon Sep 17 00:00:00 2001 From: Paramat Date: Sat, 8 Dec 2018 04:00:38 +0000 Subject: [PATCH 182/195] Remove now-unused 'puts out fire' group --- mods/default/nodes.lua | 20 ++++++++++---------- mods/stairs/init.lua | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 3c2836d9..5ce0ce19 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -590,7 +590,7 @@ minetest.register_node("default:snow", { {-0.5, -0.5, -0.5, 0.5, -7 / 16, 0.5}, }, }, - groups = {crumbly = 3, falling_node = 1, puts_out_fire = 1, snowy = 1}, + groups = {crumbly = 3, falling_node = 1, snowy = 1}, sounds = default.node_sound_snow_defaults(), on_construct = function(pos) @@ -604,7 +604,7 @@ minetest.register_node("default:snow", { minetest.register_node("default:snowblock", { description = "Snow Block", tiles = {"default_snow.png"}, - groups = {crumbly = 3, puts_out_fire = 1, cools_lava = 1, snowy = 1}, + groups = {crumbly = 3, cools_lava = 1, snowy = 1}, sounds = default.node_sound_snow_defaults(), on_construct = function(pos) @@ -621,7 +621,7 @@ minetest.register_node("default:ice", { tiles = {"default_ice.png"}, is_ground_content = false, paramtype = "light", - groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 3}, + groups = {cracky = 3, cools_lava = 1, slippery = 3}, sounds = default.node_sound_glass_defaults(), }) @@ -630,7 +630,7 @@ minetest.register_node("default:cave_ice", { description = "Cave Ice", tiles = {"default_ice.png"}, paramtype = "light", - groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 3, + groups = {cracky = 3, cools_lava = 1, slippery = 3, not_in_creative_inventory = 1}, drop = "default:ice", sounds = default.node_sound_glass_defaults(), @@ -2130,7 +2130,7 @@ minetest.register_node("default:water_source", { liquid_alternative_source = "default:water_source", liquid_viscosity = 1, post_effect_color = {a = 103, r = 30, g = 60, b = 90}, - groups = {water = 3, liquid = 3, puts_out_fire = 1, cools_lava = 1}, + groups = {water = 3, liquid = 3, cools_lava = 1}, sounds = default.node_sound_water_defaults(), }) @@ -2175,8 +2175,8 @@ minetest.register_node("default:water_flowing", { liquid_alternative_source = "default:water_source", liquid_viscosity = 1, post_effect_color = {a = 103, r = 30, g = 60, b = 90}, - groups = {water = 3, liquid = 3, puts_out_fire = 1, - not_in_creative_inventory = 1, cools_lava = 1}, + groups = {water = 3, liquid = 3, not_in_creative_inventory = 1, + cools_lava = 1}, sounds = default.node_sound_water_defaults(), }) @@ -2226,7 +2226,7 @@ minetest.register_node("default:river_water_source", { liquid_renewable = false, liquid_range = 2, post_effect_color = {a = 103, r = 30, g = 76, b = 90}, - groups = {water = 3, liquid = 3, puts_out_fire = 1, cools_lava = 1}, + groups = {water = 3, liquid = 3, cools_lava = 1}, sounds = default.node_sound_water_defaults(), }) @@ -2273,8 +2273,8 @@ minetest.register_node("default:river_water_flowing", { liquid_renewable = false, liquid_range = 2, post_effect_color = {a = 103, r = 30, g = 76, b = 90}, - groups = {water = 3, liquid = 3, puts_out_fire = 1, - not_in_creative_inventory = 1, cools_lava = 1}, + groups = {water = 3, liquid = 3, not_in_creative_inventory = 1, + cools_lava = 1}, sounds = default.node_sound_water_defaults(), }) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index e2ae0f51..4a1fadbf 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -813,7 +813,7 @@ stairs.register_stair_and_slab( stairs.register_stair_and_slab( "ice", "default:ice", - {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 3}, + {cracky = 3, cools_lava = 1, slippery = 3}, {"default_ice.png"}, "Ice Stair", "Ice Slab", @@ -824,7 +824,7 @@ stairs.register_stair_and_slab( stairs.register_stair_and_slab( "snowblock", "default:snowblock", - {crumbly = 3, puts_out_fire = 1, cools_lava = 1, snowy = 1}, + {crumbly = 3, cools_lava = 1, snowy = 1}, {"default_snow.png"}, "Snow Block Stair", "Snow Block Slab", From bae58b38067ffec52eb3c3c67d5a2f71190c22e8 Mon Sep 17 00:00:00 2001 From: Ryan Nolan Date: Thu, 20 Dec 2018 22:45:24 +0000 Subject: [PATCH 183/195] Doors: Allow on_rightclick to be overidden Allow mods such as protection mods to over ride on_rightclick. Usecase is creating shared doors without the need for keys. --- game_api.txt | 21 +++++++++++++++++++++ mods/doors/init.lua | 45 ++++++++++++++++++++++----------------------- 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/game_api.txt b/game_api.txt index 4500cac8..b3bb3096 100644 --- a/game_api.txt +++ b/game_api.txt @@ -160,6 +160,12 @@ Doors API The doors mod allows modders to register custom doors and trapdoors. +`doors.registered_doors[name] = Door definition` + * Table of registered doors, indexed by door name + +`doors.registered_trapdoors[name] = Trapdoor definition` + * Table of registered trap doors, indexed by trap door name + `doors.register_door(name, def)` * Registers new door @@ -195,6 +201,13 @@ The doors mod allows modders to register custom doors and trapdoors. has the permissions needed to open this door. If omitted then no permission checks are performed. +`doors.door_toggle(pos, node, clicker)` + + * Toggle door open or shut + * `pos` Position of the door + * `node` Node definition + * `clicker` Player definition for the player that clicked on the door + ### Door definition description = "Door description", @@ -206,6 +219,8 @@ The doors mod allows modders to register custom doors and trapdoors. sound_open = sound play for open door, -- optional sound_close = sound play for close door, -- optional protected = false, -- If true, only placer can open the door (locked for others) + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + -- optional function containing the on_rightclick callback, defaults to a doors.door_toggle-wrapper ### Trapdoor definition @@ -218,6 +233,10 @@ The doors mod allows modders to register custom doors and trapdoors. sound_open = sound play for open door, -- optional sound_close = sound play for close door, -- optional protected = false, -- If true, only placer can open the door (locked for others) + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + -- function containing the on_rightclick callback + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + -- function containing the on_rightclick callback ### Fence gate definition @@ -227,6 +246,8 @@ The doors mod allows modders to register custom doors and trapdoors. material = "default:wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults(), -- optional + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + -- function containing the on_rightclick callback Dungeon Loot API diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 789bbb0c..0205ec7a 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -1,10 +1,8 @@ -- our API object doors = {} --- private data -local _doors = {} -_doors.registered_doors = {} -_doors.registered_trapdoors = {} +doors.registered_doors = {} +doors.registered_trapdoors = {} local function replace_old_owner_information(pos) local meta = minetest.get_meta(pos) @@ -18,7 +16,7 @@ end -- returns an object to a door object or nil function doors.get(pos) local node_name = minetest.get_node(pos).name - if _doors.registered_doors[node_name] then + if doors.registered_doors[node_name] then -- A normal upright door return { pos = pos, @@ -26,23 +24,23 @@ function doors.get(pos) if self:state() then return false end - return _doors.door_toggle(self.pos, nil, player) + return doors.door_toggle(self.pos, nil, player) end, close = function(self, player) if not self:state() then return false end - return _doors.door_toggle(self.pos, nil, player) + return doors.door_toggle(self.pos, nil, player) end, toggle = function(self, player) - return _doors.door_toggle(self.pos, nil, player) + return doors.door_toggle(self.pos, nil, player) end, state = function(self) local state = minetest.get_meta(self.pos):get_int("state") return state %2 == 1 end } - elseif _doors.registered_trapdoors[node_name] then + elseif doors.registered_trapdoors[node_name] then -- A trapdoor return { pos = pos, @@ -50,16 +48,16 @@ function doors.get(pos) if self:state() then return false end - return _doors.trapdoor_toggle(self.pos, nil, player) + return doors.trapdoor_toggle(self.pos, nil, player) end, close = function(self, player) if not self:state() then return false end - return _doors.trapdoor_toggle(self.pos, nil, player) + return doors.trapdoor_toggle(self.pos, nil, player) end, toggle = function(self, player) - return _doors.trapdoor_toggle(self.pos, nil, player) + return doors.trapdoor_toggle(self.pos, nil, player) end, state = function(self) return minetest.get_node(self.pos).name:sub(-5) == "_open" @@ -130,7 +128,7 @@ local transform = { }, } -function _doors.door_toggle(pos, node, clicker) +function doors.door_toggle(pos, node, clicker) local meta = minetest.get_meta(pos) node = node or minetest.get_node(pos) local def = minetest.registered_nodes[node.name] @@ -373,10 +371,11 @@ function doors.register(name, def) name = name, sounds = { def.sound_close, def.sound_open }, } - - def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - _doors.door_toggle(pos, node, clicker) - return itemstack + if not def.on_rightclick then + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + doors.door_toggle(pos, node, clicker) + return itemstack + end end def.after_dig_node = function(pos, node, meta, digger) minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z}) @@ -444,8 +443,8 @@ function doors.register(name, def) def.mesh = "door_b.obj" minetest.register_node(":" .. name .. "_b", def) - _doors.registered_doors[name .. "_a"] = true - _doors.registered_doors[name .. "_b"] = true + doors.registered_doors[name .. "_a"] = true + doors.registered_doors[name .. "_b"] = true end doors.register("door_wood", { @@ -532,7 +531,7 @@ end ----trapdoor---- -function _doors.trapdoor_toggle(pos, node, clicker) +function doors.trapdoor_toggle(pos, node, clicker) node = node or minetest.get_node(pos) replace_old_owner_information(pos) @@ -565,7 +564,7 @@ function doors.register_trapdoor(name, def) local name_opened = name.."_open" def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - _doors.trapdoor_toggle(pos, node, clicker) + doors.trapdoor_toggle(pos, node, clicker) return itemstack end @@ -668,8 +667,8 @@ function doors.register_trapdoor(name, def) minetest.register_node(name_opened, def_opened) minetest.register_node(name_closed, def_closed) - _doors.registered_trapdoors[name_opened] = true - _doors.registered_trapdoors[name_closed] = true + doors.registered_trapdoors[name_opened] = true + doors.registered_trapdoors[name_closed] = true end doors.register_trapdoor("doors:trapdoor", { From da10af919eddc8f7e73c14f802290a5ea8f7b5f0 Mon Sep 17 00:00:00 2001 From: Paramat Date: Sat, 22 Dec 2018 00:33:37 +0000 Subject: [PATCH 184/195] Doors: New handle and hinges for glass door --- mods/doors/README.txt | 2 +- mods/doors/textures/doors_door_glass.png | Bin 625 -> 499 bytes mods/doors/textures/doors_item_glass.png | Bin 169 -> 232 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/doors/README.txt b/mods/doors/README.txt index ba8bd829..9c114b0c 100644 --- a/mods/doors/README.txt +++ b/mods/doors/README.txt @@ -46,7 +46,7 @@ Following textures created by sofar (CC-BY-SA-3.0): Obsidian door textures by red-001 based on textures by Pilzadam and BlockMen (CC BY-SA 3.0): door_obsidian_glass.png -Glass door textures by Krock based on textures by VanessaE (CC BY-SA 3.0): +Glass door textures by Krock and paramat based on textures by VanessaE (CC BY-SA 3.0): doors_door_glass.png doors_item_glass.png diff --git a/mods/doors/textures/doors_door_glass.png b/mods/doors/textures/doors_door_glass.png index 3c205dd7655fcdc96f543c1602b2748212a9438a..c296a0ff34e16e887163cb6fc16ca152230d66f3 100644 GIT binary patch delta 410 zcmV;L0cHO21oH!sBot9lOjJbx0AQq~q^zv0y1Kf?#>SCuLVv(d^FROq00DGTPE!Ct z=GbNc00B@*L_t(I%XL%%l7k=&q_w971Of#r`Ts)?DE3VBm~qBr)=k206b_Pdi*-`@ z2+GuVGt0$Et1PIT1NI}lAO`}CcbKB-m}#sEz8lPRj&FLJC~U*h*=&6ugF{G7sywo9u( z@oW@hs`{9JRQQ{$Q_idji5LE5_8_gBCy3!m><$>aU)U_o8E*hIAFwY)}J(O7kkY8rZjVJouFVo5Ou$4d-j_@ zJH*Cou~xP+tT&t99mZ@K!%5RCHV@ZDHT4@`8NjW>GW8o@z=UsR^4AqxJQh9l##Y7+ z7)uA>DzsDg)PVOW!|cKe+SMOd1moNjYzZ60s%f**FF%hR-m=rMp8x;=07*qoM6N<$ Ef(Nv~^Z)<= delta 537 zcmV+!0_Oem1MviqBua-+OjJbx003-kY;A3AZfL;#2d9Y_EG010qNS#tmY3ljhU3ljkVnw%H_000McNliru;tK&1 zCpJ>)7QX-h0b@x-K~y-)eN>B5gD?0Q)qqgu(O<{?S!3HLjt9#WhC5Pe2M~L3v{EIo-FqOp6`1rf z%q6&Ujq`~l=+v}CWT(kRsVZIZ#}tm2erA_7PGWlmupT0Rd*0)(@vy2Yf_Ek|%wpd? zwm(vGA&zW^;hNCihk5kX{|c$XT*51c8`9oG8T}iMYOqWn_i^_2wL*H6nD+3QS&{0E zcSOCZf(YTtQPx{0Z}nzw6(Zg8ut=XA*)-{gOe3;%Wc2N_H=~z>c35wB8zM^>Gc91f zt=4p91|srA?DFM6a=i|El^dCYNj|4d0q6mc8Gi!+001a04^sdD05(ueR7C&)0J^%m)6>({)z#VA+1uOO+}zyV z-QC~c-{9cj;o;%q=;-U~>+J08`UMfz00001bW%=J06^y0W&i*H zU`a$lR2b7uk68kMAP7V;EDdb&{+CUJ!1)k;GB^SZG56e%9#Hu8YC#7TfJSK!aGr&m z?CN%~$wG^T(i{??q*=0qt{`%-g5u!R907LC5tc)rt*b?P*uiD91K9s%{{avr0tA$Z RSt9@d002ovPDHLkV1mtKX&L|k delta 152 zcmaFCxRP;#WIY2ASj||l7f3Oc1o;IsFqBO`YXRgXdAc};NJz3CJjmN@Ai!YYe_G`4 zMi=|Jt4=9vY0P=YGVzqa4TaC|t|l@4VCFrb5Wq02fpI|t_W^My#tMBF)&y3o25|$% z8nF$`794LF>X_6Tcn>iYD0ncaPhdEAW_LJu1;h2@x`N6}5=@Ojj_`E#b6Mw<&;$UI Ct}wm; From 6688ddf6d4668dc7668e1b7d2c4ebf67e4b47857 Mon Sep 17 00:00:00 2001 From: Paramat Date: Wed, 2 Jan 2019 02:18:50 +0000 Subject: [PATCH 185/195] Add large cactus seedling Alter 'large cactus' schematic to place another force-placed cactus node, to replace the cactus seedling on growth. Make schematic 5x7x5 to solve rotation, placement and protection check issues. Add a y-slice probability for height variation. Growth time is tuned to not make this a faster way to obtain cactus nodes compared to normal cactus farming. Seedling texture by Extex101. Use sapling/seedling description in protection intersection message in 'sapling_on_place' function. --- mods/default/README.txt | 3 + mods/default/crafting.lua | 15 ++++ mods/default/license.txt | 1 + mods/default/mapgen.lua | 2 +- mods/default/nodes.lua | 73 ++++++++++++++++++ mods/default/schematics/large_cactus.mts | Bin 94 -> 98 bytes .../default_large_cactus_seedling.png | Bin 0 -> 256 bytes mods/default/trees.lua | 14 +++- schematic_tables.txt | 39 +++++++++- 9 files changed, 143 insertions(+), 4 deletions(-) create mode 100644 mods/default/textures/default_large_cactus_seedling.png diff --git a/mods/default/README.txt b/mods/default/README.txt index a5346976..f40ac540 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -244,6 +244,9 @@ Topywo (CC BY-SA 3.0) default_coral_green.png default_coral_pink.png +Extex101 (CC BY-SA 3.0) + default_large_cactus_seedling.png + Sounds ------ diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index b8651c0c..b49dc487 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -779,6 +779,15 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "default:large_cactus_seedling", + recipe = { + {"", "default:cactus", ""}, + {"default:cactus", "default:cactus", "default:cactus"}, + {"", "default:cactus", ""}, + } +}) + -- -- Crafting (tool repair) @@ -1095,6 +1104,12 @@ minetest.register_craft({ burntime = 15, }) +minetest.register_craft({ + type = "fuel", + recipe = "default:large_cactus_seedling", + burntime = 5, +}) + minetest.register_craft({ type = "fuel", recipe = "default:papyrus", diff --git a/mods/default/license.txt b/mods/default/license.txt index a5ea24b5..fecb1eb8 100644 --- a/mods/default/license.txt +++ b/mods/default/license.txt @@ -50,6 +50,7 @@ Copyright (C) 2010-2018: TumeniNodes Mossmanikin random-geek + Extex101 You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index b92e12ef..9c63d1ed 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1893,7 +1893,7 @@ function default.register_decorations() y_max = 31000, y_min = 4, schematic = minetest.get_modpath("default") .. "/schematics/large_cactus.mts", - flags = "place_center_x", + flags = "place_center_x, place_center_z", rotation = "random", }) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 5ce0ce19..a2f1a3e5 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -132,6 +132,8 @@ Plantlife --------- default:cactus +default:large_cactus_seedling + default:papyrus default:dry_shrub default:junglegrass @@ -1276,6 +1278,77 @@ minetest.register_node("default:cactus", { on_place = minetest.rotate_node, }) +minetest.register_node("default:large_cactus_seedling", { + description = "Large Cactus Seedling", + drawtype = "plantlike", + tiles = {"default_large_cactus_seedling.png"}, + inventory_image = "default_large_cactus_seedling.png", + wield_image = "default_large_cactus_seedling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = { + -5 / 16, -0.5, -5 / 16, + 5 / 16, 0.5, 5 / 16 + } + }, + groups = {choppy = 3, dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_wood_defaults(), + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:large_cactus_seedling", + {x = -2, y = -1, z = -2}, + {x = 2, y = 5, z = 2}, + 4) + + return itemstack + end, + + on_construct = function(pos) + -- Normal cactus farming adds 1 cactus node by ABM, + -- interval 12s, chance 83. + -- Consider starting with 5 cactus nodes. We make sure that growing a + -- large cactus is not a faster way to produce new cactus nodes. + -- Confirmed by experiment, when farming 5 cacti, on average 1 new + -- cactus node is added on average every + -- 83 / 5 = 16.6 intervals = 16.6 * 12 = 199.2s. + -- Large cactus contains on average 14 cactus nodes. + -- 14 * 199.2 = 2788.8s. + -- Set random range to average to 2789s. + minetest.get_node_timer(pos):start(math.random(1859, 3719)) + end, + + on_timer = function(pos) + local node_under = minetest.get_node_or_nil( + {x = pos.x, y = pos.y - 1, z = pos.z}) + if not node_under then + -- Node under not yet loaded, try later + minetest.get_node_timer(pos):start(300) + return + end + + if minetest.get_item_group(node_under.name, "sand") == 0 then + -- Seedling dies + minetest.remove_node(pos) + return + end + + local light_level = minetest.get_node_light(pos) + if not light_level or light_level < 13 then + -- Too dark for growth, try later in case it's night + minetest.get_node_timer(pos):start(300) + return + end + + minetest.log("action", "A large cactus seedling grows into a large" .. + "cactus at ".. minetest.pos_to_string(pos)) + default.grow_large_cactus(pos) + end, +}) + minetest.register_node("default:papyrus", { description = "Papyrus", drawtype = "plantlike", diff --git a/mods/default/schematics/large_cactus.mts b/mods/default/schematics/large_cactus.mts index b71077b3c5a0f397aade8d76cbe2f0a081d80b9f..e453573fb20ff33be7ca6f706c1e3370f2718f25 100644 GIT binary patch delta 74 zcmV-Q0JZ;KVh>GJQ%wK_00jUC00n=4Kamd~G#F%n5hsfg2{J%2f`zJMn1TOrq8^CA g0LZGh2NL#RvB3pIkO>hm0J0ziRDv1+0I|3UEf`l92mk;8 delta 70 zcmYd_}# diff --git a/mods/default/textures/default_large_cactus_seedling.png b/mods/default/textures/default_large_cactus_seedling.png new file mode 100644 index 0000000000000000000000000000000000000000..378351adb81d8f8ba61e504ccb901dbe10652c94 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!S%6Q7E0E@MU=VO)5cOja31Scp zXON0ukc(wdNMcaVU{K3pP%mWAEN0LyWzeZ$(5Yn5t6@04XPr*;^ou~9j3q&S!3+-1 zZlnP@6`n4RArhBE`xv>78gMwze*bFD>bdv+Z+d;}W1*vpjgyC__tt6st6sN Date: Wed, 2 Jan 2019 06:40:32 -0500 Subject: [PATCH 186/195] Remove extra empty strings in craft recipes (#2281) --- mods/farming/api.lua | 6 +++--- mods/fireflies/init.lua | 11 +++++------ mods/stairs/init.lua | 7 +++---- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/mods/farming/api.lua b/mods/farming/api.lua index 1c613a6f..4a7b93df 100644 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -106,9 +106,9 @@ farming.register_hoe = function(name, def) minetest.register_craft({ output = name:sub(2), recipe = { - {def.material, def.material, ""}, - {"", "group:stick", ""}, - {"", "group:stick", ""} + {def.material, def.material}, + {"", "group:stick"}, + {"", "group:stick"} } }) end diff --git a/mods/fireflies/init.lua b/mods/fireflies/init.lua index b9263c1a..44d4a31d 100644 --- a/mods/fireflies/init.lua +++ b/mods/fireflies/init.lua @@ -111,9 +111,9 @@ minetest.register_tool("fireflies:bug_net", { minetest.register_craft( { output = "fireflies:bug_net", recipe = { - {"farming:string", "farming:string", ""}, - {"farming:string", "farming:string", ""}, - {"default:stick", "", ""} + {"farming:string", "farming:string"}, + {"farming:string", "farming:string"}, + {"default:stick", ""} } }) @@ -171,9 +171,8 @@ minetest.register_node("fireflies:firefly_bottle", { minetest.register_craft( { output = "fireflies:firefly_bottle", recipe = { - {"", "", ""}, - {"", "fireflies:firefly", ""}, - {"", "vessels:glass_bottle", ""} + {"fireflies:firefly"}, + {"vessels:glass_bottle"} } }) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 4a1fadbf..e9f6dc16 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -337,8 +337,8 @@ function stairs.register_stair_inner(subname, recipeitem, groups, images, minetest.register_craft({ output = 'stairs:stair_inner_' .. subname .. ' 7', recipe = { - { "", recipeitem, ""}, - { recipeitem, "", recipeitem}, + {"", recipeitem, ""}, + {recipeitem, "", recipeitem}, {recipeitem, recipeitem, recipeitem}, }, }) @@ -417,8 +417,7 @@ function stairs.register_stair_outer(subname, recipeitem, groups, images, minetest.register_craft({ output = 'stairs:stair_outer_' .. subname .. ' 6', recipe = { - { "", "", ""}, - { "", recipeitem, ""}, + {"", recipeitem, ""}, {recipeitem, recipeitem, recipeitem}, }, }) From 8af8dc49a0656062f6e03d9a4d5f0f7dffbea8eb Mon Sep 17 00:00:00 2001 From: Paramat Date: Thu, 3 Jan 2019 01:57:13 +0000 Subject: [PATCH 187/195] Remove uses of default.gui_bg/bg_img/slots Keep their definitions, to not break mods, but move them to legacy.lua. --- mods/bones/init.lua | 3 --- mods/creative/inventory.lua | 4 +--- mods/default/chests.lua | 3 --- mods/default/craftitems.lua | 6 ++---- mods/default/furnace.lua | 6 ------ mods/default/init.lua | 7 ------- mods/default/legacy.lua | 3 +++ mods/default/nodes.lua | 3 --- mods/vessels/init.lua | 3 --- 9 files changed, 6 insertions(+), 32 deletions(-) diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 0043118d..5fcae411 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -13,9 +13,6 @@ end local bones_formspec = "size[8,9]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. "list[current_name;main;0,0.3;8,4;]" .. "list[current_player;main;0,4.85;8,1;]" .. "list[current_player;main;0,6.08;8,3;8]" .. diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua index 79a85293..6f485d52 100644 --- a/mods/creative/inventory.lua +++ b/mods/creative/inventory.lua @@ -126,9 +126,7 @@ function creative.register_tab(name, title, items) "field[0.3,3.5;2.2,1;creative_filter;;" .. minetest.formspec_escape(inv.filter) .. "]" .. "listring[detached:creative_" .. player_name .. ";main]" .. "list[detached:creative_" .. player_name .. ";main;0,0;8,3;" .. tostring(start_i) .. "]" .. - default.get_hotbar_bg(0,4.7) .. - default.gui_bg .. default.gui_bg_img .. default.gui_slots - .. creative.formspec_add, false) + default.get_hotbar_bg(0,4.7) .. creative.formspec_add, false) end, on_enter = function(self, player, context) local player_name = player:get_player_name() diff --git a/mods/default/chests.lua b/mods/default/chests.lua index 33389056..b70e5ad2 100644 --- a/mods/default/chests.lua +++ b/mods/default/chests.lua @@ -4,9 +4,6 @@ function default.chest.get_chest_formspec(pos) local spos = pos.x .. "," .. pos.y .. "," .. pos.z local formspec = "size[8,9]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" .. "list[current_player;main;0,4.85;8,1;]" .. "list[current_player;main;0,6.08;8,3;8]" .. diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index 3e3852ce..6a1b5706 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -50,16 +50,14 @@ local function book_on_use(itemstack, user) local formspec if owner == player_name then - formspec = "size[8,8]" .. default.gui_bg .. - default.gui_bg_img .. + formspec = "size[8,8]" .. "field[0.5,1;7.5,0;title;Title:;" .. minetest.formspec_escape(title) .. "]" .. "textarea[0.5,1.5;7.5,7;text;Contents:;" .. minetest.formspec_escape(text) .. "]" .. "button_exit[2.5,7.5;3,1;save;Save]" else - formspec = "size[8,8]" .. default.gui_bg .. - default.gui_bg_img .. + formspec = "size[8,8]" .. "label[0.5,0.5;by " .. owner .. "]" .. "tablecolumns[color;text]" .. "tableoptions[background=#00000000;highlight=#00000000;border=false]" .. diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua index 09966a6b..a06f3b23 100644 --- a/mods/default/furnace.lua +++ b/mods/default/furnace.lua @@ -5,9 +5,6 @@ function default.get_furnace_active_formspec(fuel_percent, item_percent) return "size[8,8.5]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. "list[context;src;2.75,0.5;1,1;]".. "list[context;fuel;2.75,2.5;1,1;]".. "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. @@ -28,9 +25,6 @@ end function default.get_furnace_inactive_formspec() return "size[8,8.5]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. "list[context;src;2.75,0.5;1,1;]".. "list[context;fuel;2.75,2.5;1,1;]".. "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. diff --git a/mods/default/init.lua b/mods/default/init.lua index b0609ffa..b89fd0eb 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -9,10 +9,6 @@ default = {} default.LIGHT_MAX = 14 -- GUI related stuff -default.gui_bg = "" -default.gui_bg_img = "" -default.gui_slots = "" - minetest.register_on_joinplayer(function(player) player:set_formspec_prepend([[ bgcolor[#080808BB;true] @@ -29,9 +25,6 @@ function default.get_hotbar_bg(x,y) end default.gui_survival_form = "size[8,8.5]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. "list[current_player;main;0,4.25;8,1;]".. "list[current_player;main;0,5.5;8,3;8]".. "list[current_player;craft;1.75,0.5;3,3;]".. diff --git a/mods/default/legacy.lua b/mods/default/legacy.lua index 123fcd5e..935d857a 100644 --- a/mods/default/legacy.lua +++ b/mods/default/legacy.lua @@ -23,6 +23,9 @@ LIGHT_MAX = default.LIGHT_MAX -- Formspecs default.gui_suvival_form = default.gui_survival_form +default.gui_bg = "" +default.gui_bg_img = "" +default.gui_slots = "" -- Players if minetest.get_modpath("player_api") then diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index a2f1a3e5..4d363516 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -2449,9 +2449,6 @@ minetest.register_node("default:lava_flowing", { local bookshelf_formspec = "size[8,7;]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. "list[context;books;0,0.3;8,2;]" .. "list[current_player;main;0,2.85;8,1;]" .. "list[current_player;main;0,4.08;8,3;8]" .. diff --git a/mods/vessels/init.lua b/mods/vessels/init.lua index 43d80922..e5c68a74 100644 --- a/mods/vessels/init.lua +++ b/mods/vessels/init.lua @@ -3,9 +3,6 @@ local vessels_shelf_formspec = "size[8,7;]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. "list[context;vessels;0,0.3;8,2;]" .. "list[current_player;main;0,2.85;8,1;]" .. "list[current_player;main;0,4.08;8,3;8]" .. From 7fa03c7a9bf57288375b6f11fba31f2273eb0c7a Mon Sep 17 00:00:00 2001 From: Paramat Date: Fri, 4 Jan 2019 04:12:07 +0000 Subject: [PATCH 188/195] Fix small pine leafdecay: New schematics, new leafdecay radius Fix small pine leafdecay: New schematics, new leafdecay radius --- mods/default/nodes.lua | 18 ++++++------------ mods/default/schematics/small_pine_tree.mts | Bin 173 -> 174 bytes .../small_pine_tree_from_sapling.mts | Bin 171 -> 172 bytes .../snowy_small_pine_tree_from_sapling.mts | Bin 202 -> 202 bytes 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 4d363516..cfc48be6 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -2858,12 +2858,6 @@ if minetest.get_mapgen_setting("mg_name") == "v6" then leaves = {"default:jungleleaves"}, radius = 3, }) - - default.register_leafdecay({ - trunks = {"default:pine_tree"}, - leaves = {"default:pine_needles"}, - radius = 3, - }) else default.register_leafdecay({ trunks = {"default:tree"}, @@ -2876,14 +2870,14 @@ else leaves = {"default:jungleleaves"}, radius = 2, }) - - default.register_leafdecay({ - trunks = {"default:pine_tree"}, - leaves = {"default:pine_needles"}, - radius = 2, - }) end +default.register_leafdecay({ + trunks = {"default:pine_tree"}, + leaves = {"default:pine_needles"}, + radius = 3, +}) + default.register_leafdecay({ trunks = {"default:acacia_tree"}, leaves = {"default:acacia_leaves"}, diff --git a/mods/default/schematics/small_pine_tree.mts b/mods/default/schematics/small_pine_tree.mts index 1b27a84f88287b093a8d9b99ab7d4287b2d224e1..b2832266cad8afee0d4c78db03183a0acbb45e1f 100644 GIT binary patch delta 95 zcmV-l0HFV^0j>d%R#*(D3u6nK=xNn7JxE(3KpJ?SOYeeZc1G7FZuQ-d5(=v_e`*b= z3x61H~`$qB#JeW BFPZ=V delta 94 zcmV-k0HOb`0j&X$R#%M8El4Jsxznm?dXTn6fHZJFr~V3-c`>>!ajWNklu&pm^QYQ? zYA(If#bd?3`Q)|#%goAiqjni?WLC~k8sb9by{Lictn^*RbHm~3eSgH*0RB%T2@xJM Aa{vGU diff --git a/mods/default/schematics/small_pine_tree_from_sapling.mts b/mods/default/schematics/small_pine_tree_from_sapling.mts index dc438a9d11e28503f53f2f17c120f422af4d46a2..a1b1170303c4f058fe2bd6dac737bd27eee77082 100644 GIT binary patch delta 103 zcmV-t0GR))0jvR#OkmLpz#s@zfBZguV_GfD4GY@S&X9}n?j)i#SgZ1{V4inpmnBa1 zo=*~t3p0Ib38eW(Y(9&}j(zjad;b@})z?PtfVyTFYo&! J#tFONAd2&=GI;<1 delta 102 zcmV-s0Ga=+0jmL!OkeE|fFKA2Ui==t7MMAthA#Wn;TX={2a_lb);i~}V4hcJmnBa1 zoKF%Hm&x>{CXnhYuVnF9v2Wga?f(Ke`W)2`sA(qU^z^z>^9oWXdVzbDao>It6riHqys6?_`8W(I< z>yFwREk>%G554}HlqWK@taV~%VP|1y;Vo3X-krfb!&m=6L~H|DtFP5n!7BK5rg}Ue Yyb8EO<}$WgBuE{e&EVHfokck-C>B9D9RL6T delta 118 zcmV-+0Ez#~0m=c8TW`@0fFKA(K|Y*MuTaLAVI!@cx^99xE@w=Dw6HEwIbzYg^YzxENfJ~-km|7;j4eZ%(?;3)l0R=SvkMXv>rEb YuMFl8xs0tQ2||ap8T`7b9X-P Date: Sun, 6 Jan 2019 23:48:57 +0000 Subject: [PATCH 189/195] Update small pines in schematic_tables.txt Update was missing from 7fa03c7a9bf57288375b6f11fba31f2273eb0c7a --- schematic_tables.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/schematic_tables.txt b/schematic_tables.txt index 26f31d2a..89e8a855 100644 --- a/schematic_tables.txt +++ b/schematic_tables.txt @@ -1756,7 +1756,7 @@ mts_save("small_pine_tree", { L, L, T, L, L, _, L, T, L, _, _, L, T, L, _, - _, L, L, L, _, + _, L, T, L, _, _, L, L, L, _, _, _, L, _, _, _, _, L, _, _, @@ -1834,7 +1834,7 @@ mts_save("small_pine_tree_from_sapling", { L, L, B, L, L, _, L, B, L, _, _, L, B, L, _, - _, L, L, L, _, + _, L, B, L, _, _, L, L, L, _, _, _, L, _, _, _, _, L, _, _, @@ -1914,7 +1914,7 @@ mts_save("snowy_small_pine_tree_from_sapling", { L, L, B, L, L, S, L, B, L, S, _, L, B, L, _, - _, L, L, L, _, + _, L, B, L, _, _, L, L, L, _, _, S, L, S, _, _, _, L, _, _, From 2ff9058a6203e58038f30c7dbe134cc4731b779e Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sat, 26 Jan 2019 13:55:39 +0100 Subject: [PATCH 190/195] Beds: Fix formspec size, no prepend --- mods/beds/functions.lua | 6 +++--- mods/beds/init.lua | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/mods/beds/functions.lua b/mods/beds/functions.lua index 18d96e77..bf7bf90e 100644 --- a/mods/beds/functions.lua +++ b/mods/beds/functions.lua @@ -109,12 +109,12 @@ local function update_formspecs(finished) local is_majority = (ges / 2) < player_in_bed if finished then - form_n = beds.formspec .. "label[2.7,11; Good morning.]" + form_n = beds.formspec .. "label[2.7,9; Good morning.]" else - form_n = beds.formspec .. "label[2.2,11;" .. tostring(player_in_bed) .. + form_n = beds.formspec .. "label[2.2,9;" .. tostring(player_in_bed) .. " of " .. tostring(ges) .. " players are in bed]" if is_majority and is_night_skip_enabled() then - form_n = form_n .. "button_exit[2,8;4,0.75;force;Force night skip]" + form_n = form_n .. "button_exit[2,6;4,0.75;force;Force night skip]" end end diff --git a/mods/beds/init.lua b/mods/beds/init.lua index 6c4e0819..5a3959cb 100644 --- a/mods/beds/init.lua +++ b/mods/beds/init.lua @@ -4,9 +4,10 @@ beds.bed_position = {} beds.pos = {} beds.spawn = {} -beds.formspec = "size[8,15;true]" .. - "bgcolor[#080808BB; true]" .. - "button_exit[2,12;4,0.75;leave;Leave Bed]" +beds.formspec = "size[8,11;true]" .. + "no_prepend[]" .. + "bgcolor[#080808BB;true]" .. + "button_exit[2,10;4,0.75;leave;Leave Bed]" local modpath = minetest.get_modpath("beds") From 64a923f7fb92b18a2fb2e727a45c69df744559b8 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sun, 3 Feb 2019 11:45:45 +0000 Subject: [PATCH 191/195] Fix sfinv not updating on creative grant/revoke --- mods/creative/init.lua | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/mods/creative/init.lua b/mods/creative/init.lua index ef190b8d..0f8d4dba 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -1,9 +1,24 @@ creative = {} +local function update_sfinv(name) + minetest.after(0, function() + local player = minetest.get_player_by_name(name) + if player then + if sfinv.get_page(player):sub(1, 9) == "creative:" then + sfinv.set_page(player, sfinv.get_homepage_name(player)) + else + sfinv.set_player_inventory_formspec(player) + end + end + end) +end + minetest.register_privilege("creative", { description = "Allow player to use creative inventory", give_to_singleplayer = false, - give_to_admin = false + give_to_admin = false, + on_grant = update_sfinv, + on_revoke = update_sfinv, }) local creative_mode_cache = minetest.settings:get_bool("creative_mode") From 6e0e2b8be9dfebd20ccee075f9b5a08aa7cc631d Mon Sep 17 00:00:00 2001 From: random-geek <35757396+random-geek@users.noreply.github.com> Date: Sun, 3 Feb 2019 11:14:13 -0800 Subject: [PATCH 192/195] Textures: Update permafrost to new dirt, improve stones, add stones side --- mods/default/README.txt | 1 + mods/default/nodes.lua | 3 ++- mods/default/textures/default_permafrost.png | Bin 283 -> 266 bytes mods/default/textures/default_stones.png | Bin 411 -> 405 bytes mods/default/textures/default_stones_side.png | Bin 0 -> 204 bytes 5 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 mods/default/textures/default_stones_side.png diff --git a/mods/default/README.txt b/mods/default/README.txt index f40ac540..96a501b0 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -116,6 +116,7 @@ paramat (CC BY-SA 3.0): default_emergent_jungle_sapling.png default_permafrost.png -- Derived from a texture by Neuromancer (CC BY-SA 3.0) default_stones.png -- Derived from a texture by sofar (CC0 1.0) + default_stones_side.png -- Derived from a texture by sofar (CC0 1.0) default_moss.png default_moss_side.png default_fence_rail_acacia_wood diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index cfc48be6..94353cfa 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -508,7 +508,8 @@ minetest.register_node("default:permafrost", { minetest.register_node("default:permafrost_with_stones", { description = "Permafrost with Stones", tiles = {"default_permafrost.png^default_stones.png", - "default_permafrost.png"}, + "default_permafrost.png", + "default_permafrost.png^default_stones_side.png"}, groups = {cracky = 3}, drop = "default:permafrost", sounds = default.node_sound_gravel_defaults(), diff --git a/mods/default/textures/default_permafrost.png b/mods/default/textures/default_permafrost.png index f1edbab44e66a521cfe54feee3af6e95254f60fc..d7a19a2f599bf7144db376182c03b8cf03fbdf06 100644 GIT binary patch delta 250 zcmbQu)WtMGqMn7Bfq~)e-A6${N-Mx8#FdwwMS_<@lAlW&hy;11MFr)>1QjGi)ulx> z6r}W&qzzRS&9zm$tqoZi*6ai7n(gW07{YO#aRNjBe}+?Gdtw^1kF911?${byeYiY_ z!FRfK@!sSDbp{tvx3a3`bCMVmGud~R9iCmz(0aV5c%^xGIuAqD4D+(%)}mPqfokSV zrBiIm8KxRl9y_YkyPY9R)^dBH>ZEjr*6@nb@@iLchEye~w({_{T84zu87ZD;E6eS!NC?6RrA{;FxA228)F)1TEGc9mEC)5A{0HaAnK~xyi4Ua(*1R)3m zSs5e&6#xI)<-(!Ul@!wDcrRWkE>TC^B8muJgjqrMPMWHnXMg@%+Xkp_5Udo{p9mBw zJUJ+Ut>S)ObfwXUNeh#0B%1cAqr|mgl#lLvEvKYsF&m$M-*32}v@H)uns`ydLm1OY z-m5ys)ZGej*xV;zo->0s5f846Ix8Kfv(H+Rnij9MbMxF>^5V>wjN>a}1Akt^2wDyg SD^UOd002ovP6b4+LSTZ*PF)B9 diff --git a/mods/default/textures/default_stones.png b/mods/default/textures/default_stones.png index 09c5ee1481b2f9a4ec709f7c82f1005576b6c2ed..4d3b6cfac0cee5303608e5dbd752973209237dac 100644 GIT binary patch delta 172 zcmV;d08{^)1C;}i@qdp=L_t&-(_>&@P}1jQKmpPs>>$cQiv?9&gpZ5CL;+dE%2-W= z2S^*JNI?XQG-biGFq;}gfM1ZC0R!kMf+<~~lo?oq5Gz=KPXwqzo`peO2goruHH2%> zmID%&s{C*PNoF9yDaHi0Qv}U;UKu!3MHI#|)6nMtQW7i-RwbG$${?3XaWF!p#05my aV9EgKKnX!`pex(}00007J@JgMn4r19N>rx2aby3!inqs-^-L*tKW~_ z^d>ny1vuS0*)W+UuEc$9eZ+uD66BR}nfwgmb&jaYJcvMvQ#{JpvLhw@Mnz(ZzwA-u zbH}YzEi^Oj5if)mmRr7Dk7j-|#tjSKh<*VNbn@y=QqI-Q+AHuoC)&D7SBb;u=|8~_ goSdqjv6yT71`wMGLYH98(f|Me07*qoM6N<$g0y>7Y5)KL diff --git a/mods/default/textures/default_stones_side.png b/mods/default/textures/default_stones_side.png new file mode 100644 index 0000000000000000000000000000000000000000..7ae823a7962ddaf2e8fe4a9038ea34bc3d06a8ba GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}NPtg>E0B(jjZKJ)Pe@2eN=iye zN(O?Il$6xe)J!1C%*@Kl$_0UoEDB&Fu#oph#PzQsjtDnm{r-UW|g&stF literal 0 HcmV?d00001 From bfde214c525a61be105ebd255522bf8999ff6175 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Tue, 5 Feb 2019 00:07:06 +0000 Subject: [PATCH 193/195] Add screenshot.png, and more info to game.conf --- game.conf | 2 ++ screenshot.png | Bin 0 -> 104422 bytes 2 files changed, 2 insertions(+) create mode 100644 screenshot.png diff --git a/game.conf b/game.conf index 4dea9498..255451fc 100644 --- a/game.conf +++ b/game.conf @@ -1 +1,3 @@ name = Minetest Game +author = minetest +description = Bundled by default with Minetest, and aims to be lightweight, moddable, and fairly playable without mods. diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..5498b60144b7732fa279c9e7c467751cb0a8dfdf GIT binary patch literal 104422 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 z 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�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

Lf#}ql-#o?^ys|T+8cr)8Curl(Yr|2TY^mN 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 Hu0mjfVUfT5 literal 0 HcmV?d00001 From 2033b2cc652440c64a00676feb7f58176332d8e1 Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 5 Feb 2019 00:24:04 +0000 Subject: [PATCH 194/195] 'permafrost_with_stones/moss' drops itself instead of permafrost Previously they were not collectable or creatable. A simple temporary solution for MTG 5.0.0. --- mods/default/nodes.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 94353cfa..ecd8f776 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -511,7 +511,6 @@ minetest.register_node("default:permafrost_with_stones", { "default_permafrost.png", "default_permafrost.png^default_stones_side.png"}, groups = {cracky = 3}, - drop = "default:permafrost", sounds = default.node_sound_gravel_defaults(), }) @@ -521,7 +520,6 @@ minetest.register_node("default:permafrost_with_moss", { {name = "default_permafrost.png^default_moss_side.png", tileable_vertical = false}}, groups = {cracky = 3}, - drop = "default:permafrost", sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_grass_footstep", gain = 0.25}, }), From ad6c2cf0352e6e27e09a72334a97044454ea486a Mon Sep 17 00:00:00 2001 From: Paul Ouellette Date: Wed, 6 Feb 2019 14:07:48 -0500 Subject: [PATCH 195/195] Dye: Remove type="shapeless" from single-item recipes --- mods/dye/init.lua | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/mods/dye/init.lua b/mods/dye/init.lua index c2598111..42f59cf9 100644 --- a/mods/dye/init.lua +++ b/mods/dye/init.lua @@ -35,26 +35,29 @@ for _, row in ipairs(dye.dyes) do }) minetest.register_craft({ - type = "shapeless", output = "dye:" .. name .. " 4", - recipe = {"group:flower,color_" .. name}, + recipe = { + {"group:flower,color_" .. name} + }, }) end -- Manually add coal -> black dye minetest.register_craft({ - type = "shapeless", output = "dye:black 4", - recipe = {"group:coal"}, + recipe = { + {"group:coal"} + }, }) -- Manually add blueberries->violet dye minetest.register_craft({ - type = "shapeless", output = "dye:violet 2", - recipe = {"default:blueberries"}, + recipe = { + {"default:blueberries"} + }, }) -- Mix recipes