From 6e1a3297636bc0e20d623f0a3214144158fddb66 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Wed, 17 Jun 2015 18:07:55 +0100 Subject: [PATCH 01/48] default: Strengthen obsidian glass Remove group 'oddly_breakable_by_hand' --- 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 86a26ed4..1550e141 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1757,7 +1757,7 @@ minetest.register_node("default:obsidian_glass", { is_ground_content = false, sunlight_propagates = true, sounds = default.node_sound_glass_defaults(), - groups = {cracky = 3, oddly_breakable_by_hand = 3}, + groups = {cracky = 3}, }) From 7be008936eab8e17bdc4de1811411071821eb294 Mon Sep 17 00:00:00 2001 From: kilbith Date: Fri, 8 Apr 2016 14:29:48 +0200 Subject: [PATCH 02/48] Flowers: Fix itemstack when waterlily is placed --- mods/flowers/init.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index f5e6d2cf..d5581d0c 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -229,12 +229,16 @@ minetest.register_node("flowers:waterlily", { fixed = {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5} }, - on_place = function(_, _, pointed_thing) + on_place = function(itemstack, _, pointed_thing) local pos = pointed_thing.above local node = minetest.get_node(pointed_thing.under).name local def = minetest.registered_nodes[node] if def and def.liquidtype == "source" and minetest.get_item_group(node, "water") > 0 then minetest.set_node(pos, {name = "flowers:waterlily", param2 = math.random(0, 3)}) + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + return itemstack + end end end }) From 082b36d3e7abda59f1c0bd1160552271174841b2 Mon Sep 17 00:00:00 2001 From: kilbith Date: Sun, 10 Apr 2016 21:29:02 +0200 Subject: [PATCH 03/48] Books: Split text per page relatively to number of lines --- mods/default/craftitems.lua | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index 8b8a6d35..2fe59784 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -11,21 +11,30 @@ minetest.register_craftitem("default:paper", { inventory_image = "default_paper.png", }) +local lpp = 14 -- Lines per book's page local function book_on_use(itemstack, user) local player_name = user:get_player_name() local data = minetest.deserialize(itemstack:get_metadata()) local formspec, title, text, owner = "", "", "", player_name - local page, page_max, cpp = 1, 1, 650 + local page, page_max, lines, string = 1, 1, {}, "" if data then title = data.title text = data.text owner = data.owner + for str in (text .. "\n"):gmatch("([^\n]*)[\n]") do + lines[#lines+1] = str + end + if data.page then page = data.page page_max = data.page_max - cpp = data.chars_per_page + + for i = ((lpp * page) - lpp) + 1, lpp * page do + if not lines[i] then break end + string = string .. lines[i] .. "\n" + end end end @@ -44,8 +53,8 @@ local function book_on_use(itemstack, user) "tablecolumns[color;text]" .. "tableoptions[background=#00000000;highlight=#00000000;border=false]" .. "table[0.4,0;7,0.5;title;#FFFF00," .. minetest.formspec_escape(title) .. "]" .. - "textarea[0.5,1.5;7.5,7;;" .. minetest.formspec_escape(text:sub( - (cpp * page) - cpp, cpp * page)) .. ";]" .. + "textarea[0.5,1.5;7.5,7;;" .. + minetest.formspec_escape(string ~= "" and string or text) .. ";]" .. "button[2.4,7.6;0.8,0.8;book_prev;<]" .. "label[3.2,7.7;Page " .. page .. " of " .. page_max .. "]" .. "button[4.9,7.6;0.8,0.8;book_next;>]" @@ -76,10 +85,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if not data then data = {} end data.title = fields.title data.text = fields.text - data.text_len = fields.text:len() + data.text_len = #data.text data.page = 1 - data.chars_per_page = 650 - data.page_max = math.ceil(data.text_len / data.chars_per_page) + data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp) data.owner = player:get_player_name() local data_str = minetest.serialize(data) @@ -94,8 +102,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) stack:set_metadata(data_str) end - player:set_wielded_item(stack) - elseif fields.book_next or fields.book_prev then local data = minetest.deserialize(stack:get_metadata()) if not data.page then return end @@ -116,6 +122,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) stack:set_metadata(data_str) book_on_use(stack, player) end + + player:set_wielded_item(stack) end) minetest.register_craftitem("default:book", { From 3ecafbcfb41e988ee63f31fd011d450541fc4c2a Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Tue, 12 Apr 2016 17:28:30 -0700 Subject: [PATCH 04/48] Remove composed shelf side. Don't compose the shelf side texture. The texture isn't transparent, and unlikely to be in any case. --- mods/vessels/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/vessels/init.lua b/mods/vessels/init.lua index bbd677a3..d5378919 100644 --- a/mods/vessels/init.lua +++ b/mods/vessels/init.lua @@ -15,7 +15,7 @@ local vessels_shelf_formspec = minetest.register_node("vessels:shelf", { description = "Vessels shelf", - tiles = {"default_wood.png", "default_wood.png", "default_wood.png^vessels_shelf.png"}, + tiles = {"default_wood.png", "default_wood.png", "vessels_shelf.png"}, is_ground_content = false, groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3}, sounds = default.node_sound_wood_defaults(), From 12d5ca2f48694c990658d401e5f68d281f260aee Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 25 Jan 2016 22:27:15 -0800 Subject: [PATCH 05/48] Allow the on_blast API to pass an itemstack. If the node is special and has an on_blast() handler, we need to call it instead of getting node drops manually. However, we do want to know if drops should be added for the special nodes, so we modify the on_blast() handler code to allow the nodedef handlers to pass back itemstacks. This could be used by e.g. the doors mod to drop door items after a blast. Since this API is documented in lua_api.txt, a separate PR will be incoming to update the on_blast() documentation. --- mods/tnt/init.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 981cc9ee..6b16ab7e 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -93,7 +93,12 @@ local function destroy(drops, pos, cid) end local def = cid_data[cid] if def and def.on_blast then - def.on_blast(vector.new(pos), 1) + local node_drops = def.on_blast(vector.new(pos), 1) + if node_drops then + for _, item in ipairs(node_drops) do + add_drop(drops, item) + end + end return end if def and def.flammable then From 8cd049c224c496b8d47c6d4112c62c656696e717 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sun, 24 Jan 2016 23:27:50 -0800 Subject: [PATCH 06/48] Make TNT a bit more fun. But not too much. TNT is a bit underwhelming at the moment. We can make it a bit more interesting by ejecting not just one or two itemstacks, but a bunch of them. This code splits up the drops into separate itemstacks that are 2-5 items together, which results in generally roughly 10 itemstacks being ejected. Since now we have multiple ejecta, it makes sense to tune the ejecta velocities a bit better to get the appearance of an actual explosion better. The items will not all start with the same vertical velocity, since that would look like fireworks. Instead we give them all a different vertical speed. --- mods/tnt/init.lua | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 6b16ab7e..576d3a8a 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -49,23 +49,20 @@ local function eject_drops(drops, pos, radius) local drop_pos = vector.new(pos) for _, item in pairs(drops) do local count = item:get_count() - local max = item:get_stack_max() - if count > max then - item:set_count(max) - end while count > 0 do - if count < max then - item:set_count(count) - end + local take = math.min(math.random(2,5), + item:get_count(), + item:get_stack_max()) rand_pos(pos, drop_pos, radius) - local obj = minetest.add_item(drop_pos, item) + local obj = minetest.add_item(drop_pos, item:get_name() .. " " .. take) if obj then obj:get_luaentity().collect = true obj:setacceleration({x=0, y=-10, z=0}) - obj:setvelocity({x=math.random(-3, 3), y=10, + obj:setvelocity({x=math.random(-3, 3), + y=math.random(0, 10), z=math.random(-3, 3)}) end - count = count - max + count = count - take end end end From 8556dd30e2a97474bf7fd33fddccef93878ad50d Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sun, 24 Jan 2016 23:48:38 -0800 Subject: [PATCH 07/48] TNT: add some depth to the explosion effect We add a dirt-like particle (drawn from scratch, uses some colors from default_dirt's palette) to spawn many particles that have collision enabled around the center of the blast. This has the effect of obscuring the center of the blast, as that is a painfully visible empty area when the explosion happens, as there's only a little spark. The dirt particles bounce around the walls and floor a bit, and disappear rapidly, well before the smoke particles disappear. This is a nice visual distraction that obscures the sudden appearance of the gaping hole, and makes it a whole lot more believable. --- mods/tnt/init.lua | 31 +++++++++++++++++++++++++++++++ mods/tnt/textures/tnt_blast.png | Bin 0 -> 855 bytes 2 files changed, 31 insertions(+) create mode 100644 mods/tnt/textures/tnt_blast.png diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 576d3a8a..528aee02 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -162,6 +162,37 @@ local function add_effects(pos, radius) maxsize = 16, texture = "tnt_smoke.png", }) + + -- we just dropped some items. Look at the items entities and pick + -- one of them to use as texture + local texture = "tnt_blast.png" --fallback texture + local objs = minetest.get_objects_inside_radius(pos, 2) + for _, obj in pairs(objs) do + if obj and obj:get_luaentity() then + local def = ItemStack(obj:get_luaentity().itemstring):get_definition() + if def.tiles then + texture = def.tiles[1] + break + end + end + end + + minetest.add_particlespawner({ + amount = 64, + time = 0.1, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x=-3, y=0, z=-3}, + maxvel = {x=3, y=5, z=3}, + minacc = {x=0, y=-10, z=0}, + maxacc = {x=0, y=-10, z=0}, + minexptime = 0.8, + maxexptime = 2.0, + minsize = 2, + maxsize = 6, + texture = texture, + collisiondetection = true, + }) end local function burn(pos) diff --git a/mods/tnt/textures/tnt_blast.png b/mods/tnt/textures/tnt_blast.png new file mode 100644 index 0000000000000000000000000000000000000000..bbb1096f5d81f68b0247f1bd386357f1c14c2579 GIT binary patch literal 855 zcmV-d1E~CoP)o&74tn0wNWtEkm#^jZ>SJP!74EEBU-F0SihuX3Ls`c>`{pYM;V{Pz0=Ql$KI zE%7{$!T1g-raXT7f}f5uUcEjC;P5cS7b}D@hO3*5uwod^oqJMMX4tk(Q4}cSVbTe2 zFC(OsoSuYet(im{?9=a>+^$^SfB1kD|FYXYA_x|I)2i`#D(IiI$wiI9a7ef5a2Z9s zxlp`(9x{z3Vl)HWEbd8mF~@aXF0Z%qt#hB&QdCxkQ_ zlOzdOHyQojmR`0J9yJVFYwR>l8IBX;IA$-%c>MGQCY>-C4*6^hLI~;%u`HK&S1a;l z%AN7JU2e}O@;oO}4pO9i8Y?>WjM+-iZ8``ca9x+BaNR;#h&s;xo4 z7w}FsING;)_4*tsC6`e|w;k}H?vt1*A3x5xT}(Oq@foAJ!|45=DB~fzO^3ff#Rwr7 z{TBi7?4XR4lIy#SNwh(0&FM*ql#;iX5hk6Wj7L!v*roDATCIdM8nRRYhle4PwdUpX z5XBC09McFk{PEWplu|tTHsI3;}TUTrW0;A2k5r9 heHdfdt!UP{&;J-adc&TrL81Tv002ovPDHLkV1k_ Date: Fri, 1 Jan 2016 22:49:32 +0000 Subject: [PATCH 08/48] Add TNT API. --- game_api.txt | 36 +++++++++++ mods/tnt/init.lua | 158 +++++++++++++++++++++++++++------------------- 2 files changed, 130 insertions(+), 64 deletions(-) diff --git a/game_api.txt b/game_api.txt index d3330e5f..b575b400 100644 --- a/game_api.txt +++ b/game_api.txt @@ -209,6 +209,42 @@ Fire API * Called when fire attempts to remove a burning node. * `pos` Position of the burning node. + +#TNT API +---------- + +tnt.register_tnt(definition) + +^ Register a new type of tnt. + + * `name` The name of the node. If no prefix is given `tnt` is used. + * `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`. + * `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. + * `tiles` Textures for node + * `side` Side tiles. By default the name of the tnt with a suffix of `_side.png`. + * `top` Top tile. By default the name of the tnt with a suffix of `_top.png`. + * `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, radius, damage_radius, disable_drops) ` + +^ Create an explosion. + +* `position` The center of explosion. +* `radius` The radius within which nodes can be destroyed. +* `damage_radius` The distance from the center that players and mobs can get damaged in. +* `disable_drops` Disable drops. +* `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. + +`tnt.burn(pos)` + +^ Ignite TNT at position + Screwdriver API --------------- diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 528aee02..9295ed70 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -1,4 +1,4 @@ - +tnt = {} -- Default to enabled in singleplayer and disabled in multiplayer local singleplayer = minetest.is_singleplayer() local setting = minetest.setting_getbool("enable_tnt") @@ -84,12 +84,12 @@ end local fire_node = {name="fire:basic_flame"} -local function destroy(drops, pos, cid) - if minetest.is_protected(pos, "") then +local function destroy(drops, pos, cid, ignore_protection, ignore_on_blast) + if not ignore_protection and minetest.is_protected(pos, "") then return end local def = cid_data[cid] - if def and def.on_blast then + if not ignore_on_blast and def and def.on_blast then local node_drops = def.on_blast(vector.new(pos), 1) if node_drops then for _, item in ipairs(node_drops) do @@ -128,8 +128,6 @@ local function calc_velocity(pos1, pos2, old_vel, power) end local function entity_physics(pos, radius) - -- Make the damage radius larger than the destruction radius - radius = radius * 2 local objs = minetest.get_objects_inside_radius(pos, radius) for _, obj in pairs(objs) do local obj_pos = obj:getpos() @@ -195,11 +193,12 @@ local function add_effects(pos, radius) }) end -local function burn(pos) +function tnt.burn(pos) local name = minetest.get_node(pos).name - if name == "tnt:tnt" then + local group = minetest.get_item_group(name, "tnt") + if group > 0 then minetest.sound_play("tnt_ignite", {pos=pos}) - minetest.set_node(pos, {name="tnt:tnt_burning"}) + minetest.set_node(pos, {name=name.."_burning"}) minetest.get_node_timer(pos):start(1) elseif name == "tnt:gunpowder" then minetest.sound_play("tnt_gunpowder_burning", {pos=pos, gain=2}) @@ -208,7 +207,7 @@ local function burn(pos) end end -local function explode(pos, radius) +local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) local pos = vector.round(pos) local vm = VoxelManip() local pr = PseudoRandom(os.time()) @@ -234,7 +233,7 @@ local function explode(pos, radius) p.y = pos.y + y p.z = pos.z + z if cid ~= c_air then - destroy(drops, p, cid) + destroy(drops, p, cid, ignore_protection, ignore_on_blast) end end vi = vi + 1 @@ -245,59 +244,19 @@ local function explode(pos, radius) return drops end - -local function boom(pos) +function tnt.boom(pos, def) minetest.sound_play("tnt_explode", {pos=pos, gain=1.5, max_hear_distance=2*64}) minetest.set_node(pos, {name="tnt:boom"}) minetest.get_node_timer(pos):start(0.5) - - local drops = explode(pos, radius) - entity_physics(pos, radius) - eject_drops(drops, pos, radius) - add_effects(pos, radius) + local drops = tnt_explode(pos, def.radius, def.ignore_protection, + def.ignore_on_blast) + entity_physics(pos, def.damage_radius) + if not def.disable_drops then + eject_drops(drops, pos, def.radius) + end + add_effects(pos, def.radius) end -minetest.register_node("tnt:tnt", { - description = "TNT", - tiles = {"tnt_top.png", "tnt_bottom.png", "tnt_side.png"}, - is_ground_content = false, - groups = {dig_immediate=2, mesecon=2}, - sounds = default.node_sound_wood_defaults(), - on_punch = function(pos, node, puncher) - if puncher:get_wielded_item():get_name() == "default:torch" then - minetest.sound_play("tnt_ignite", {pos=pos}) - minetest.set_node(pos, {name="tnt:tnt_burning"}) - end - end, - on_blast = function(pos, intensity) - burn(pos) - end, - mesecons = {effector = {action_on = boom}}, -}) - -minetest.register_node("tnt:tnt_burning", { - tiles = { - { - name = "tnt_top_burning_animated.png", - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 1, - } - }, - "tnt_bottom.png", "tnt_side.png"}, - light_source = 5, - drop = "", - sounds = default.node_sound_wood_defaults(), - on_construct = function(pos) - minetest.get_node_timer(pos):start(4) - end, - on_timer = boom, - -- unaffected by explosions - on_blast = function() end, -}) - minetest.register_node("tnt:boom", { drawtype = "plantlike", tiles = {"tnt_boom.png"}, @@ -331,11 +290,11 @@ minetest.register_node("tnt:gunpowder", { on_punch = function(pos, node, puncher) if puncher:get_wielded_item():get_name() == "default:torch" then - burn(pos) + tnt.burn(pos) end end, on_blast = function(pos, intensity) - burn(pos) + tnt.burn(pos) end, }) @@ -393,7 +352,7 @@ minetest.register_node("tnt:gunpowder_burning", { for dz = -1, 1 do for dy = -1, 1 do if not (dx == 0 and dz == 0) then - burn({ + tnt.burn({ x = pos.x + dx, y = pos.y + dy, z = pos.z + dz, @@ -409,11 +368,11 @@ minetest.register_node("tnt:gunpowder_burning", { }) minetest.register_abm({ - nodenames = {"tnt:tnt", "tnt:gunpowder"}, + nodenames = {"group:tnt", "tnt:gunpowder"}, neighbors = {"fire:basic_flame", "default:lava_source", "default:lava_flowing"}, interval = 4, chance = 1, - action = burn, + action = tnt.burn, }) minetest.register_craft({ @@ -430,3 +389,74 @@ minetest.register_craft({ {"", "group:wood", ""} } }) + +function tnt.register_tnt(def) + local name = "" + if not def.name:find(':') then + name = "tnt:"..def.name + else + name = def.name + def.name = def.name:match(":([%w_]+)") + end + if not def.tiles then def.tiles = {} end + local tnt_top = def.tiles.top or def.name.."_top.png" + local tnt_bottom = def.tiles.bottom or def.name.."_bottom.png" + local tnt_side = def.tiles.side or def.name.."_side.png" + local tnt_burning = def.tiles.burning or def.name.."_top_burning_animated.png" + if not def.damage_radius then def.damage_radius = def.radius * 2 end + + minetest.register_node(":"..name, { + description = def.description, + tiles = {tnt_top, tnt_bottom, tnt_side}, + is_ground_content = false, + groups = {dig_immediate=2, mesecon=2, tnt=1}, + sounds = default.node_sound_wood_defaults(), + on_punch = function(pos, node, puncher) + if puncher:get_wielded_item():get_name() == "default:torch" then + minetest.sound_play("tnt_ignite", {pos=pos}) + minetest.set_node(pos, {name=name.."_burning"}) + minetest.get_node_timer(pos):start(4) + end + end, + on_blast = function(pos, intensity) + tnt.burn(pos) + end, + mesecons = {effector = + {action_on = + function(pos) + tnt.boom(pos, def) + end + } + }, + }) + + minetest.register_node(":"..name.."_burning", { + tiles = { + { + name = tnt_burning, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + tnt_bottom, tnt_side + }, + light_source = 5, + drop = "", + sounds = default.node_sound_wood_defaults(), + on_timer = function(pos, elapsed) + tnt.boom(pos, def) + end, + -- unaffected by explosions + on_blast = function() end, + }) +end + +tnt.register_tnt({ + name = "tnt:tnt", + description = "TNT", + radius = radius, +}) + From 9f4dc1412b3acb852537f895ed1d56ae32e4c962 Mon Sep 17 00:00:00 2001 From: red-001 Date: Wed, 27 Jan 2016 16:33:32 +0000 Subject: [PATCH 09/48] Fix TNT mod calculate blast intensity. Currently the TNT mod uses a dummy vaule of 1 for this. --- mods/tnt/init.lua | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 9295ed70..366a34a1 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -84,13 +84,15 @@ end local fire_node = {name="fire:basic_flame"} -local function destroy(drops, pos, cid, ignore_protection, ignore_on_blast) - if not ignore_protection and minetest.is_protected(pos, "") then - return +local function destroy(drops, npos, cid, c_air, c_fire, on_blast_queue, ignore_protection, ignore_on_blast) + if not ignore_protection and minetest.is_protected(npos, "") then + return cid end local def = cid_data[cid] if not ignore_on_blast and def and def.on_blast then - local node_drops = def.on_blast(vector.new(pos), 1) + local dist = vector.distance(bpos, npos) + local intensity = 1 / (dist * dist) + local node_drops = def.on_blast(vector.new(npos), intensity) if node_drops then for _, item in ipairs(node_drops) do add_drop(drops, item) @@ -99,9 +101,9 @@ local function destroy(drops, pos, cid, ignore_protection, ignore_on_blast) return end if def and def.flammable then - minetest.set_node(pos, fire_node) + minetest.set_node(npos, fire_node) else - minetest.remove_node(pos) + minetest.remove_node(npos) if def then local node_drops = minetest.get_node_drops(def.name, "") for _, item in ipairs(node_drops) do @@ -233,7 +235,7 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) p.y = pos.y + y p.z = pos.z + z if cid ~= c_air then - destroy(drops, p, cid, ignore_protection, ignore_on_blast) + destroy(drops, p, cid, pos, ignore_protection, ignore_on_blast) end end vi = vi + 1 From b25889e74277c16c64fa52b5b80cca6c29258efc Mon Sep 17 00:00:00 2001 From: red-001 Date: Sun, 31 Jan 2016 19:42:07 +0000 Subject: [PATCH 10/48] Make TNT faster by using `VoxelManip()` for removing nodes. --- mods/tnt/init.lua | 55 ++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 366a34a1..7cdfe25c 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -82,7 +82,6 @@ local function add_drop(drops, item) end end -local fire_node = {name="fire:basic_flame"} local function destroy(drops, npos, cid, c_air, c_fire, on_blast_queue, ignore_protection, ignore_on_blast) if not ignore_protection and minetest.is_protected(npos, "") then @@ -90,26 +89,19 @@ local function destroy(drops, npos, cid, c_air, c_fire, on_blast_queue, ignore_p end local def = cid_data[cid] if not ignore_on_blast and def and def.on_blast then - local dist = vector.distance(bpos, npos) - local intensity = 1 / (dist * dist) - local node_drops = def.on_blast(vector.new(npos), intensity) - if node_drops then - for _, item in ipairs(node_drops) do - add_drop(drops, item) - end - end - return + on_blast_queue[#on_blast_queue + 1] = {pos=vector.new(npos), on_blast=def.on_blast} + return cid end - if def and def.flammable then - minetest.set_node(npos, fire_node) + if not def then + return c_air + elseif def.flammable then + return c_fire else - minetest.remove_node(npos) - if def then - local node_drops = minetest.get_node_drops(def.name, "") - for _, item in ipairs(node_drops) do - add_drop(drops, item) - end + local node_drops = minetest.get_node_drops(def.name, "") + for _, item in ipairs(node_drops) do + add_drop(drops, item) end + return c_air end end @@ -220,10 +212,10 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) local data = vm:get_data() local drops = {} - local p = {} + local on_blast_queue = {} local c_air = minetest.get_content_id("air") - + local c_fire = minetest.get_content_id("fire:basic_flame") for z = -radius, radius do for y = -radius, radius do local vi = a:index(pos.x + (-radius), pos.y + y, pos.z + z) @@ -231,18 +223,33 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) if (x * x) + (y * y) + (z * z) <= (radius * radius) + pr:next(-radius, radius) then local cid = data[vi] - p.x = pos.x + x - p.y = pos.y + y - p.z = pos.z + z + local p = {x = pos.x + x, y = pos.y + y, z = pos.z + z} if cid ~= c_air then - destroy(drops, p, cid, pos, ignore_protection, ignore_on_blast) + data[vi] = destroy(drops, p, cid, c_air, c_fire, on_blast_queue, ignore_protection, ignore_on_blast) end + end vi = vi + 1 end end end + vm:set_data(data) + vm:write_to_map() + vm:update_map() + vm:update_liquids() + + for _, data in ipairs(on_blast_queue) do + local dist = math.max(1, vector.distance(data.pos, pos)) + local intensity = 1 / (dist * dist) + local node_drops = data.on_blast(data.pos, intensity) + if node_drops then + for _, item in ipairs(node_drops) do + add_drop(drops, item) + end + end + end + return drops end From 3623398b78f30e4a29b6af5eefda2cb5be0ce37a Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 12 Mar 2016 22:48:52 -0800 Subject: [PATCH 11/48] TNT: Spacing / codestyle fixes - Fix spacing errors around = and .. - Indentation fixes - Break up long lines --- mods/tnt/init.lua | 64 ++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 7cdfe25c..f34ad13b 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -57,10 +57,10 @@ local function eject_drops(drops, pos, radius) local obj = minetest.add_item(drop_pos, item:get_name() .. " " .. take) if obj then obj:get_luaentity().collect = true - obj:setacceleration({x=0, y=-10, z=0}) - obj:setvelocity({x=math.random(-3, 3), - y=math.random(0, 10), - z=math.random(-3, 3)}) + obj:setacceleration({x = 0, y = -10, z = 0}) + obj:setvelocity({x = math.random(-3, 3), + y = math.random(0, 10), + z = math.random(-3, 3)}) end count = count - take end @@ -89,7 +89,7 @@ local function destroy(drops, npos, cid, c_air, c_fire, on_blast_queue, ignore_p end local def = cid_data[cid] if not ignore_on_blast and def and def.on_blast then - on_blast_queue[#on_blast_queue + 1] = {pos=vector.new(npos), on_blast=def.on_blast} + on_blast_queue[#on_blast_queue + 1] = {pos = vector.new(npos), on_blast = def.on_blast} return cid end if not def then @@ -144,8 +144,8 @@ local function add_effects(pos, radius) time = 1, minpos = vector.subtract(pos, radius / 2), maxpos = vector.add(pos, radius / 2), - minvel = {x=-20, y=-20, z=-20}, - maxvel = {x=20, y=20, z=20}, + minvel = {x = -20, y = -20, z = -20}, + maxvel = {x = 20, y = 20, z = 20}, minacc = vector.new(), maxacc = vector.new(), minexptime = 1, @@ -174,10 +174,10 @@ local function add_effects(pos, radius) time = 0.1, minpos = vector.subtract(pos, radius / 2), maxpos = vector.add(pos, radius / 2), - minvel = {x=-3, y=0, z=-3}, - maxvel = {x=3, y=5, z=3}, - minacc = {x=0, y=-10, z=0}, - maxacc = {x=0, y=-10, z=0}, + minvel = {x = -3, y = 0, z = -3}, + maxvel = {x = 3, y = 5, z = 3}, + minacc = {x = 0, y = -10, z = 0}, + maxacc = {x = 0, y = -10, z = 0}, minexptime = 0.8, maxexptime = 2.0, minsize = 2, @@ -191,12 +191,12 @@ function tnt.burn(pos) local name = minetest.get_node(pos).name local group = minetest.get_item_group(name, "tnt") if group > 0 then - minetest.sound_play("tnt_ignite", {pos=pos}) - minetest.set_node(pos, {name=name.."_burning"}) + minetest.sound_play("tnt_ignite", {pos = pos}) + minetest.set_node(pos, {name = name .. "_burning"}) minetest.get_node_timer(pos):start(1) elseif name == "tnt:gunpowder" then - minetest.sound_play("tnt_gunpowder_burning", {pos=pos, gain=2}) - minetest.set_node(pos, {name="tnt:gunpowder_burning"}) + minetest.sound_play("tnt_gunpowder_burning", {pos = pos, gain = 2}) + minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) minetest.get_node_timer(pos):start(1) end end @@ -225,7 +225,9 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) local cid = data[vi] local p = {x = pos.x + x, y = pos.y + y, z = pos.z + z} if cid ~= c_air then - data[vi] = destroy(drops, p, cid, c_air, c_fire, on_blast_queue, ignore_protection, ignore_on_blast) + data[vi] = destroy(drops, p, cid, c_air, c_fire, + on_blast_queue, ignore_protection, + ignore_on_blast) end end @@ -254,8 +256,8 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) end function tnt.boom(pos, def) - minetest.sound_play("tnt_explode", {pos=pos, gain=1.5, max_hear_distance=2*64}) - minetest.set_node(pos, {name="tnt:boom"}) + minetest.sound_play("tnt_explode", {pos = pos, gain = 1.5, max_hear_distance = 2*64}) + minetest.set_node(pos, {name = "tnt:boom"}) minetest.get_node_timer(pos):start(0.5) local drops = tnt_explode(pos, def.radius, def.ignore_protection, def.ignore_on_blast) @@ -272,7 +274,7 @@ minetest.register_node("tnt:boom", { light_source = default.LIGHT_MAX, walkable = false, drop = "", - groups = {dig_immediate=3}, + groups = {dig_immediate = 3}, on_timer = function(pos, elapsed) minetest.remove_node(pos) end, @@ -294,7 +296,7 @@ minetest.register_node("tnt:gunpowder", { type = "fixed", fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, }, - groups = {dig_immediate=2,attached_node=1,connect_to_raillike=minetest.raillike_group("gunpowder")}, + groups = {dig_immediate = 2, attached_node = 1, connect_to_raillike = minetest.raillike_group("gunpowder")}, sounds = default.node_sound_leaves_defaults(), on_punch = function(pos, node, puncher) @@ -354,7 +356,7 @@ minetest.register_node("tnt:gunpowder_burning", { fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, }, drop = "", - groups = {dig_immediate=2,attached_node=1,connect_to_raillike=minetest.raillike_group("gunpowder")}, + groups = {dig_immediate = 2, attached_node = 1, connect_to_raillike = minetest.raillike_group("gunpowder")}, sounds = default.node_sound_leaves_defaults(), on_timer = function(pos, elapsed) for dx = -1, 1 do @@ -402,28 +404,28 @@ minetest.register_craft({ function tnt.register_tnt(def) local name = "" if not def.name:find(':') then - name = "tnt:"..def.name + name = "tnt:" .. def.name else name = def.name def.name = def.name:match(":([%w_]+)") end if not def.tiles then def.tiles = {} end - local tnt_top = def.tiles.top or def.name.."_top.png" - local tnt_bottom = def.tiles.bottom or def.name.."_bottom.png" - local tnt_side = def.tiles.side or def.name.."_side.png" - local tnt_burning = def.tiles.burning or def.name.."_top_burning_animated.png" + local tnt_top = def.tiles.top or def.name .. "_top.png" + local tnt_bottom = def.tiles.bottom or def.name .. "_bottom.png" + local tnt_side = def.tiles.side or def.name .. "_side.png" + local tnt_burning = def.tiles.burning or def.name .. "_top_burning_animated.png" if not def.damage_radius then def.damage_radius = def.radius * 2 end - minetest.register_node(":"..name, { + minetest.register_node(":" .. name, { description = def.description, tiles = {tnt_top, tnt_bottom, tnt_side}, is_ground_content = false, - groups = {dig_immediate=2, mesecon=2, tnt=1}, + groups = {dig_immediate = 2, mesecon = 2, tnt = 1}, sounds = default.node_sound_wood_defaults(), on_punch = function(pos, node, puncher) if puncher:get_wielded_item():get_name() == "default:torch" then - minetest.sound_play("tnt_ignite", {pos=pos}) - minetest.set_node(pos, {name=name.."_burning"}) + minetest.sound_play("tnt_ignite", {pos = pos}) + minetest.set_node(pos, {name = name .. "_burning"}) minetest.get_node_timer(pos):start(4) end end, @@ -439,7 +441,7 @@ function tnt.register_tnt(def) }, }) - minetest.register_node(":"..name.."_burning", { + minetest.register_node(":" .. name .. "_burning", { tiles = { { name = tnt_burning, From eafd1ebc438e3a6e8e9bf60785168410a78ab50e Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 18 Mar 2016 23:07:15 -0700 Subject: [PATCH 12/48] TNT particles: use drops list smartly The drops list already has quantities, so let's just select the one with the highest quantity from it, and use that as tile. Fallback tile will therefore only be used if explosion happens in air. Oh well. --- mods/tnt/init.lua | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index f34ad13b..289797ce 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -138,7 +138,7 @@ local function entity_physics(pos, radius) end end -local function add_effects(pos, radius) +local function add_effects(pos, radius, drops) minetest.add_particlespawner({ amount = 128, time = 1, @@ -158,14 +158,12 @@ local function add_effects(pos, radius) -- we just dropped some items. Look at the items entities and pick -- one of them to use as texture local texture = "tnt_blast.png" --fallback texture - local objs = minetest.get_objects_inside_radius(pos, 2) - for _, obj in pairs(objs) do - if obj and obj:get_luaentity() then - local def = ItemStack(obj:get_luaentity().itemstring):get_definition() - if def.tiles then - texture = def.tiles[1] - break - end + local most = 0 + for name, stack in pairs(drops) do + local count = stack:get_count() + if count > most then + most = count + texture = minetest.registered_nodes[name].tiles[1] end end @@ -265,7 +263,7 @@ function tnt.boom(pos, def) if not def.disable_drops then eject_drops(drops, pos, def.radius) end - add_effects(pos, def.radius) + add_effects(pos, def.radius, drops) end minetest.register_node("tnt:boom", { From 3ddff2fbea63aeaa535d7e59254554dc65adb314 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 18 Mar 2016 23:31:10 -0700 Subject: [PATCH 13/48] TNT: Chain reaction With the new high res timer, we can make TNT much better create chain reactions. This does exactly that. --- mods/tnt/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 289797ce..4010f987 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -428,7 +428,9 @@ function tnt.register_tnt(def) end end, on_blast = function(pos, intensity) - tnt.burn(pos) + minetest.after(0.1, function() + tnt.boom(pos, def) + end) end, mesecons = {effector = {action_on = From 8c801529df08fcf01752e4906a517019f5b581af Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Tue, 22 Mar 2016 21:25:44 -0700 Subject: [PATCH 14/48] TNT: Limit amount of stacks ejected. We apply a log scale to the size of the stacks ejected, so that in larger explosions we are getting larger stacks. For normal r=3 explosions, this gives stack sizes ~6-7 or so, but for r=10 explosions it could end up giving stacks of 25+.V --- mods/tnt/init.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 4010f987..1f28ee50 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -49,8 +49,9 @@ local function eject_drops(drops, pos, radius) local drop_pos = vector.new(pos) for _, item in pairs(drops) do local count = item:get_count() + local take_est = math.log(count * count) + math.random(0,4) - 2 while count > 0 do - local take = math.min(math.random(2,5), + local take = math.min(take_est, item:get_count(), item:get_stack_max()) rand_pos(pos, drop_pos, radius) From ccee025ce3e3f56596aeda69f8dc32940bba7b57 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Tue, 22 Mar 2016 22:05:34 -0700 Subject: [PATCH 15/48] Calculate blast intensity at all locations. We define the blast intensity as the square of the tnt_radius, divided by the square of the distance to the explosion center, where distance is limited to 1 at the lower end. When destroying nodes, we calculate the intensity for each node, and only destroy the nodes when the intensity is 1.0 or larger. To avoid perfectly spherical explosions, we make sure to retain a randomness factor of 20%. This will make explosion edges jagged and not smooth, but not too much. We pass the calculated intensity to on_blast() functions as well, except we take the jitter here out and make sure it's always 1.0 or larger. --- mods/tnt/init.lua | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 1f28ee50..83630d93 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -219,8 +219,8 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) for y = -radius, radius do local vi = a:index(pos.x + (-radius), pos.y + y, pos.z + z) for x = -radius, radius do - if (x * x) + (y * y) + (z * z) <= - (radius * radius) + pr:next(-radius, radius) then + local r = vector.length(vector.new(x, y, z)) + if (radius * radius) / (r * r) >= (pr:next(80, 125) / 100) then local cid = data[vi] local p = {x = pos.x + x, y = pos.y + y, z = pos.z + z} if cid ~= c_air then @@ -228,7 +228,6 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) on_blast_queue, ignore_protection, ignore_on_blast) end - end vi = vi + 1 end @@ -242,7 +241,7 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) for _, data in ipairs(on_blast_queue) do local dist = math.max(1, vector.distance(data.pos, pos)) - local intensity = 1 / (dist * dist) + local intensity = (radius * radius) / (dist * dist) local node_drops = data.on_blast(data.pos, intensity) if node_drops then for _, item in ipairs(node_drops) do From a84e2669c7ee1482678941aec5b5ce3263f6b569 Mon Sep 17 00:00:00 2001 From: red-001 Date: Wed, 23 Mar 2016 11:01:59 +0000 Subject: [PATCH 16/48] Restructure code to only check `def` once. --- mods/tnt/init.lua | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 83630d93..a3c2bf99 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -88,13 +88,14 @@ local function destroy(drops, npos, cid, c_air, c_fire, on_blast_queue, ignore_p if not ignore_protection and minetest.is_protected(npos, "") then return cid end + local def = cid_data[cid] - if not ignore_on_blast and def and def.on_blast then - on_blast_queue[#on_blast_queue + 1] = {pos = vector.new(npos), on_blast = def.on_blast} - return cid - end + if not def then return c_air + elseif not ignore_on_blast and def.on_blast then + on_blast_queue[#on_blast_queue + 1] = {pos = vector.new(npos), on_blast = def.on_blast} + return cid elseif def.flammable then return c_fire else From da5f4a939ea670ee595ec8bebb9501db7b3cb21f Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sun, 27 Mar 2016 10:51:55 -0700 Subject: [PATCH 17/48] Fix API docs after various changes. --- game_api.txt | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/game_api.txt b/game_api.txt index b575b400..bdb2450b 100644 --- a/game_api.txt +++ b/game_api.txt @@ -230,18 +230,14 @@ tnt.register_tnt(definition) * `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, radius, damage_radius, disable_drops) ` +`tnt.boom(position, definition)` ^ Create an explosion. * `position` The center of explosion. -* `radius` The radius within which nodes can be destroyed. -* `damage_radius` The distance from the center that players and mobs can get damaged in. -* `disable_drops` Disable drops. -* `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. +* `definition` The TNT definion as passed to `tnt.register` -`tnt.burn(pos)` +`tnt.burn(position)` ^ Ignite TNT at position From 0736d30e33b9d04b43e01f129154374c72ba51a6 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 28 Mar 2016 18:20:14 -0700 Subject: [PATCH 18/48] TNT: Fix up nil derefs I spotted two places where under stress (many explosions) luajit would end up passing nil to these functions. I'm not entirely sure how, but it seems good form to guard against it, which does make it more robust. After this patch, I'm not able to crash the server. With many explosions, it may still lag significantly, but always returns in the end. --- mods/tnt/init.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index a3c2bf99..c447c715 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -51,9 +51,9 @@ local function eject_drops(drops, pos, radius) local count = item:get_count() local take_est = math.log(count * count) + math.random(0,4) - 2 while count > 0 do - local take = math.min(take_est, + local take = math.max(1,math.min(take_est, item:get_count(), - item:get_stack_max()) + item:get_stack_max())) rand_pos(pos, drop_pos, radius) local obj = minetest.add_item(drop_pos, item:get_name() .. " " .. take) if obj then @@ -165,7 +165,10 @@ local function add_effects(pos, radius, drops) local count = stack:get_count() if count > most then most = count - texture = minetest.registered_nodes[name].tiles[1] + local def = minetest.registered_nodes[name] + if def and def.tiles and def.tiles[1] then + texture = def.tiles[1] + end end end From e6cef57661071a956d1c514f7a8acc97347b6b9f Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Tue, 29 Mar 2016 07:39:46 -0700 Subject: [PATCH 19/48] TNT: Move timer start to on_create() for burning nodes. We add on_create() handlers for both burning TNT and burning gunpowder. Because gunpowder will explode TNT in 1 second, and not 4, we need to modify the 4 second timer after we make the TNT burning. Other mods can now place burning TNT that will by default explode after 4 seconds. --- mods/tnt/init.lua | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index c447c715..bb1f144b 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -198,9 +198,7 @@ function tnt.burn(pos) minetest.set_node(pos, {name = name .. "_burning"}) minetest.get_node_timer(pos):start(1) elseif name == "tnt:gunpowder" then - minetest.sound_play("tnt_gunpowder_burning", {pos = pos, gain = 2}) minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) - minetest.get_node_timer(pos):start(1) end end @@ -378,6 +376,10 @@ minetest.register_node("tnt:gunpowder_burning", { end, -- unaffected by explosions on_blast = function() end, + on_construct = function(pos) + minetest.sound_play("tnt_gunpowder_burning", {pos = pos, gain = 2}) + minetest.get_node_timer(pos):start(1) + end, }) minetest.register_abm({ @@ -426,9 +428,7 @@ function tnt.register_tnt(def) sounds = default.node_sound_wood_defaults(), on_punch = function(pos, node, puncher) if puncher:get_wielded_item():get_name() == "default:torch" then - minetest.sound_play("tnt_ignite", {pos = pos}) minetest.set_node(pos, {name = name .. "_burning"}) - minetest.get_node_timer(pos):start(4) end end, on_blast = function(pos, intensity) @@ -466,6 +466,10 @@ function tnt.register_tnt(def) end, -- unaffected by explosions on_blast = function() end, + on_construct = function(pos) + minetest.sound_play("tnt_ignite", {pos = pos}) + minetest.get_node_timer(pos):start(4) + end, }) end From 8114c3dbabfeb769d4f4f101df4974e8ffae75e2 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Tue, 29 Mar 2016 23:09:47 -0700 Subject: [PATCH 20/48] Limit entity speed to 250m/s. Let's just call it "terminal" velocity. --- mods/tnt/init.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index bb1f144b..f4656201 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -120,6 +120,12 @@ local function calc_velocity(pos1, pos2, old_vel, power) -- Add old velocity vel = vector.add(vel, old_vel) + + -- Limit to terminal velocity + dist = vector.length(vel) + if dist > 250 then + vel = vector.divide(vel, dist / 250) + end return vel end From a2d4e577164162102220c831b93a7eb9a974b026 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Thu, 31 Mar 2016 16:07:15 -0700 Subject: [PATCH 21/48] Call nodeupdate on the entire blast zone This will make sand and gravel blocks on top of TNT actually fly in the air. https://youtu.be/4omndVZijLc --- mods/tnt/init.lua | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index f4656201..a8deeb0c 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -247,6 +247,19 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) vm:update_map() vm:update_liquids() + -- call nodeupdate for everything within 1.5x blast radius + for z = -radius * 1.5, radius * 1.5 do + for x = -radius * 1.5, radius * 1.5 do + for y = -radius * 1.5, radius * 1.5 do + local s = vector.add(pos, {x = x, y = y, z = z}) + local r = vector.distance(pos, s) + if r / radius < 1.4 then + nodeupdate(s) + end + end + end + end + for _, data in ipairs(on_blast_queue) do local dist = math.max(1, vector.distance(data.pos, pos)) local intensity = (radius * radius) / (dist * dist) From 64fe69f3823a3785c809e2e0a86d2e4e53134627 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sun, 3 Apr 2016 19:52:27 -0700 Subject: [PATCH 22/48] Remove "grass under snow" from default:dirt_with_snow in darkness. This is technically "dirt with grass" that's just under a snow cover, so in darkness the grass on these nodes will also die, turning it into dirt. This doesn't convert dirt_with_snow under snow. --- mods/default/functions.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index dc46726a..bd55d32f 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -384,7 +384,11 @@ minetest.register_abm({ -- minetest.register_abm({ - nodenames = {"default:dirt_with_grass", "default:dirt_with_dry_grass"}, + nodenames = { + "default:dirt_with_grass", + "default:dirt_with_dry_grass", + "default:dirt_with_snow", + }, interval = 8, chance = 50, catch_up = false, From 7d93272caa4503979abb9b98a05a9b801870a72b Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Thu, 31 Mar 2016 21:58:59 -0700 Subject: [PATCH 23/48] Change how dirt turns to dirt_with_(something) This changes how dirt blocks turn to dirt_with -grass, -dry_grass or -snow. Previously, dirt that was sunlit would turn to dirt_with_grass no matter what, but this happened without any context, so you could get green patches of dirt_with_grass in the middle of a savannah or even desert. Dirt no longer turns to covered dirt unless it's within 1 node from another dirt_with_grass or dirt_with_dry_grass or dirt_with_snow. This makes dirt_with_grass "growback" a lot slower, since it now only happens on the edges, but it retains the context nicely now. If there is any dirt with a grass or dry grass plant, or snow on top, and enough light, we'll convert it sporadically to dirt_with_grass or dirt_with_dry_grass or dirt_with_snow. This allows us to plant grass of our choice in a large dirt patch, or in a region where otherwise that type of grass is not present. This used to be done by 2 abms, but I've combined them in to a single ABM that is ordered to run with maximum efficiency, solving for the most common outcome first before attempting more complex checks. --- mods/default/functions.lua | 61 ++++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 12 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index bd55d32f..775803bc 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -353,32 +353,69 @@ minetest.register_abm({ -- --- Grass growing on well-lit dirt +-- Convert dirt to something that fits the environment -- minetest.register_abm({ nodenames = {"default:dirt"}, - neighbors = {"air"}, + neighbors = { + "default:dirt_with_grass", + "default:dirt_with_dry_grass", + "default:dirt_with_snow", + "default:grass_1", + "default:grass_2", + "default:grass_3", + "default:grass_4", + "default:grass_5", + "default:dry_grass_1", + "default:dry_grass_2", + "default:dry_grass_3", + "default:dry_grass_4", + "default:dry_grass_5", + "default:snow", + }, interval = 6, chance = 67, catch_up = false, action = function(pos, node) + -- Most likely case, half the time it's too dark for this. local above = {x = pos.x, y = pos.y + 1, z = pos.z} - local name = minetest.get_node(above).name - local nodedef = minetest.registered_nodes[name] - if nodedef and (nodedef.sunlight_propagates or nodedef.paramtype == "light") and - nodedef.liquidtype == "none" and - (minetest.get_node_light(above) or 0) >= 13 then - if name == "default:snow" or name == "default:snowblock" then - minetest.set_node(pos, {name = "default:dirt_with_snow"}) - else - minetest.set_node(pos, {name = "default:dirt_with_grass"}) + if (minetest.get_node_light(above) or 0) < 13 then + return + end + + -- Look for likely neighbors. + local p2 = minetest.find_node_near(pos, 1, {"default:dirt_with_grass", + "default:dirt_with_dry_grass", "default:dirt_with_snow"}) + if p2 then + -- But the node needs to be under air in this case. + local n2 = minetest.get_node(above) + if n2 and n2.name == "air" then + local n3 = minetest.get_node(p2) + minetest.set_node(pos, {name = n3.name}) + return end end + + -- Anything on top? + local n2 = minetest.get_node(above) + if not n2 then + return + end + + local name = n2.name + -- Snow check is cheapest, so comes first. + if name == "default:snow" then + minetest.set_node(pos, {name = "default:dirt_with_snow"}) + -- Most likely case first. + elseif name:sub(1, 13) == "default:grass" then + minetest.set_node(pos, {name = "default:dirt_with_grass"}) + elseif name:sub(1, 17) == "default:dry_grass" then + minetest.set_node(pos, {name = "default:dirt_with_dry_grass"}) + end end }) - -- -- Grass and dry grass removed in darkness -- From 9ece86cc7ada071f6eb64ff9f13e40f34a3c5ac0 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Sun, 3 Apr 2016 16:31:19 +0100 Subject: [PATCH 24/48] Flowers: Tweak flower and mushroom spreading Tidy up position numbers and code Check for flora group aswell Improve node light check for mushroom growth Shrooms grow in 3 and below light --- mods/flowers/init.lua | 43 +++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index d5581d0c..73a66bfa 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -83,6 +83,7 @@ minetest.register_abm({ pos.y = pos.y + 1 if under.name == "default:desert_sand" then minetest.set_node(pos, {name = "default:dry_shrub"}) + return elseif under.name ~= "default:dirt_with_grass" then return end @@ -92,18 +93,14 @@ minetest.register_abm({ return end - local pos0 = {x = pos.x - 4, y = pos.y - 4, z = pos.z - 4} - local pos1 = {x = pos.x + 4, y = pos.y + 4, z = pos.z + 4} - if #minetest.find_nodes_in_area(pos0, pos1, "group:flora_block") > 0 then + local pos0 = vector.subtract(pos, 4) + local pos1 = vector.add(pos, 4) + if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 3 or + #minetest.find_nodes_in_area(pos0, pos1, "group:flora_block") > 0 then return end - local flowers = minetest.find_nodes_in_area(pos0, pos1, "group:flora") - if #flowers > 3 then - return - end - - local seedling = minetest.find_nodes_in_area(pos0, pos1, "default:dirt_with_grass") + local seedling = minetest.find_nodes_in_area_under_air(pos0, pos1, "default:dirt_with_grass") if #seedling > 0 then seedling = seedling[math.random(#seedling)] seedling.y = seedling.y + 1 @@ -111,9 +108,7 @@ minetest.register_abm({ if not light or light < 13 then return end - if minetest.get_node(seedling).name == "air" then - minetest.set_node(seedling, {name = node.name}) - end + minetest.set_node(seedling, {name = node.name}) end end, }) @@ -169,17 +164,15 @@ minetest.register_abm({ action = function(pos, node) if minetest.get_node_light(pos, nil) == 15 then minetest.remove_node(pos) - 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 then return end - if random_node.name ~= "air" then + 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, @@ -187,9 +180,11 @@ minetest.register_abm({ if not node_under then return end - if minetest.get_item_group(node_under.name, "soil") ~= 0 and - minetest.get_node_light(pos, nil) <= 9 and - minetest.get_node_light(random, nil) <= 9 then + + 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 From f8e273da1577ba8640dc015b1907aeea5ed8eba8 Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 15 Apr 2016 10:43:10 +0100 Subject: [PATCH 25/48] Boats: Increase maximum velocity to 5n/s --- mods/boats/init.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/boats/init.lua b/mods/boats/init.lua index a85f6e1e..f8d0ccb4 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -159,8 +159,8 @@ function boat.on_step(self, dtime) self.v = 0 return end - if math.abs(self.v) > 4.5 then - self.v = 4.5 * get_sign(self.v) + if math.abs(self.v) > 5 then + self.v = 5 * get_sign(self.v) end local p = self.object:getpos() @@ -182,8 +182,8 @@ function boat.on_step(self, dtime) p.y = p.y + 1 if is_water(p) then local y = self.object:getvelocity().y - if y >= 4.5 then - y = 4.5 + if y >= 5 then + y = 5 elseif y < 0 then new_acce = {x = 0, y = 20, z = 0} else From 33aa5e77dcf51911dff658982818cbf579f9d784 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 16 Apr 2016 13:42:48 -0700 Subject: [PATCH 26/48] Character: Fix boat leg wobble. There was a small leg wobble in the sitting animation (visible when sitting on the boat). This removes it. --- mods/default/models/character.b3d | Bin 86830 -> 86830 bytes mods/default/models/character.blend | Bin 724412 -> 697616 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/models/character.b3d b/mods/default/models/character.b3d index 0a0ca6292abb67cb2ad794f3e91c948024739c47..2699d65b46a8b9a01c060e440efc981617e64882 100644 GIT binary patch delta 1411 zcmb7^e@GKy9LBxyw%Z17uBl}@(uGiMy6xTkF_+(!WN2kS#I$U=6f!Fip$N&C8i;9x zu;QYUaOxlsr+ZQR@yA6F`j13}l%b@lAy$8c5vZBnZMVeHsvW#=y!Y_%e4p=!>v54i zF0!{F7Y|*^RS(W35jkpnZ>dHR9TrvxE30$bc)w@>^qAm-M^!FlN^1P0#zy#5Zx3$ zS5MK>NFvJaFK|qi0`375jKzs?? zlZa;6gwY$=6?1L}tr`$o&2ZNy#@kf%d?cZaC`{CV*QHJHZQN2wzKWA#A0EVm&h*K%rb+i2_=-oOi+xJ zghQo*_ouvsmoxmhPaYY))?h5g)dLb&{I#vxdI_I7RI`XEqVM*|2HVr<8iE!mt zp*2TGNG<*-KDKsLCqiP~Zpbr>aK#}JI?frrs_{CzIs!)XtZs&_1KtEUC)7aeun3>F zi_i&9+mx~ytD~vqG5w?Z^`A=<;C8(RA`yu@B1m+S)7s+V@z_r?W?9UKc=stDHY{mC z)^M0}G-RBK$iV%u+$B zSqESi<4m;}o#C|KY8}qJF99t-phT{Ms5?5CXcpu0Y^%vYC?d}|4u1{P%2seUxZ-FI9$@beCS{*DOAh_G>saZ34U>DpYk_q6$GsS diff --git a/mods/default/models/character.blend b/mods/default/models/character.blend index 6493f813d70fb4dd2107ec7d5fbf584bf083c275..b5c7fc3aff1410f5db3c1a610a086906631068b0 100644 GIT binary patch delta 110978 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 z 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 literal 724412 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

n0l+(Y6z=uH18iw-25-@z5~{ln6oeZ@>kVz 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ðz~ zW+Wr-NFI#y@#T^SPgU|@LR{r}DY}a&Q67wVyJ&eZ$bY#!_|6~?205`P*&*b?ez!AP zz7Rn$Hj!oWE(FeMKb$1FmcOL3mW zzfU3_mhDm=biQ|?->ZxB@#T^S&sOqaLRs6*QALy}4@SIQv^*H(zg!-CcaR5zoLH3X z(BWgpo5T8`{i1u@^%J8Dk_vYv56=B;B@Y&|i~7KLKzNto=#KFUdaCq;1ulf00;j2e zglC0YqUxu@K!t${1LwiOlsvd4?xm0il}GryqViyzk1v-zIQK-CKVst^-|sjdmEQ$c zqC6P!cG2=+kpFUd@Sz|N205`P*&)e;lkQ-A+pxY?4%?yos>06ToGC=-+1a0~UOK!t(xV&L-2gNf2{TY2z-wO56? z!Ydrl7fUyoK4E^@(SC89k7vn)#U8f!sQ$LT&uc$e$%Br%9Di|6O5a74C=VVDc)MtM zFvx$oJovF74+c50DA^(8!IgIX%6*^Y)VnUfJeZ8F(A;U<|MoQ>U)T&GPV*_9$GD0R z;mdXZU@RlPx2s1Q?sclYkU6u#S z_syKDpM*$=+^ z^2>weHkNT;$%9)l6n*ww^@MCE@^p5)r}+HJ(@`c=T_QZ|JuBSnU;S1Xs4!4r;M^EU z^@Ceuo=YAi_LNR4=#{@eA3)^CJ!DB^YJWsu&9%Gs{XdV%kp6PeDT>z z9(2^@_!ADxPZ1@`gAs4r$%8vSUmWDWTpoNR$b&&nEJ}6=d9YVM(cXKs-#>9d)`QvZ z?wgr=PbCi)^q@XS$5Lt9 zUVeFSYkeZ#_0F zc$Pd^+L68T7 zoLH3X5c1%pF&@^N<8sK3-Mf+pPyNE>mj}1jJmTHyxRM9AVkr7l@?gY7^{y~bVW7f* zFmU1DCn;p7b7OK(u{nE1<-s@~Uk-Wj#)m)pvQw2jm~?z9hoo>3CCY;lZx<~O2Kg_S z2mdU{gF#L#N_Ob*vHRNV7jd|lTy}N7_~RPx{!lvExS z1}Y3Zt}!sBADky}b9f-wAuU<24(FzM`64oTr6N|XoB2E1)25AN80Fvx$oJeYmzSAX;^SvD8s z#G+(}kO!A1D~$^@9ke`lr5~L8z~z?*%WVwfBiE@{^59ksMW0F@jF_n26$UB{R2UEj z3j0Bqf2Of=Zu`MZ^4)p=Oatk$b}J8Foc&;!k7vn)h05~6<-xfpSN4NN=ch7Y3Kub= zJQ(qI(ehxB|Drq?OPULEVsyth^59x$G`?c;;Ms>Nd9aXA)eGrZE5p$p;}tYiohK=9 z;k2B(%kWnGd7A3C!a#+A3IpfEKp_tjGg0Mvx^v5e;zj5Gds-3Yipqm=KE7P?;L%DR zEP8e~_JaX$7b*|l_NrU=f9Cj}?Ckfv=cCdG>Q97woPbx|diU*LgUWlp*IplI^Mhe~ zHJfkM$MtM}u`@&%obT58UC%bMliB)8r^innm!J(n^Mih;H*OEJrD1zus_s$v0Gotdi9m|{WstEhHO+{ZMQNjq|0fQaerLz3ZM>aofai_8X@w{Z^$O2 ztkdlGY6J}GtploJf6yL|J8c4p+-Wts{pJZ(x7)Tnt(^Tg9H1om4eI0N``tM|s1Msc zHM8D4(QYX;Tf6_j8?t5nsFHd&m+QTycB?k-th7ht`pQ6_^TT#?Y{1fBG6q+ZVOvh> zbpJusvR!Mn7u&-jEt~H*GOLuez1|u&`>nROX#as*$g45nX`dWtAaICvCK%9bwLY{I zI9F+5)*19OO5zhS8LmcWyiy;X$VS~xt6dZR14Jh@Cqp5AzBTNS(wuGmW~1f)+KKi? zwnCki9o5YS{gK}LvtheiACo}kx4Z3?Yyv`8tslLgRMIdnX=vSDZ-KvIdr`S6(P%up z{~(AkxO1}YEvH{7ZGLgsUs3Lg+!Q`l#FDzY+v&9l?~^G_^WKL(tP@6APr;+if9Gik zZ5y?_UA3v10X4JvNw3wfH71Lh0cw;1mQ}OAG7vdrD^}=8^%}L?C$hzUb26&6Smo4v zO-dV$`vZB_yEPInaktW_-5d3XS#PpZYjo=^YO&l|TCTl$Qtx)g8`&b(v;;T%-9GJp zLl(2D2|4vKr>`d9v`^Lw&mSVNoMUogM^5 zO$aJhGxb~%Ee$%W{c+YBuhWsE5hOlj2o09&S+m<2&^CLwd##K{jk5l5yxgyiXkl zbYXAkZ^~U<9JPsqHzToK>#R_*jb=CFx`LHS7t-sr*J|wz+CwYctJdkY+UuD@vTl6? zVxF(}IxE?Hv)){WVv5n1$shaM z5Ok_8qgohT=AehHrw+EFcY+qf8$7MqhanBd;kVabvVqyMYQodr1P9FKiI+`Qb6yTN zeiKy4?}q)JR2Bp3mNkZx(K5qg;MH>{oV5${G8(47@QwcBNaIK}srQg>8`c@xD>aLo zQJ$g4TCarNY~Z!@m#Wzl8yOgCvbE(-bGg=^jA7Fmvr^W`PGqp=8r)SVWB`lN>P0fW zpz(p;YxSYMi8LCtoAO%e3@wVG+2eANAOSH#d!;j$d$~Sr={>A7GkO~Mc5h_G)mIt{ zBi|Su5Eg2IfEH6RT8vh`8LDs+D>+6JA5)NXDa)=qS+V-I;570$(dnIt@8HFhytFJo zSWd`$X;@!{k;${$S+qQbd%2kktV)d4uC->gTyOQ)6m$~4W`zLY)svsNwnbx*&}%S! zqm=NjEl-$&M6yM9?}uL^TG)IsFKz&9Zy*!E3z-J)zwr(H&-x8>9DIY3g=J|ZZ0xJo zAHx-x1{(045eUTK&e9(x}fYqdDpx4sjPH(Y05qF3B6s=Jo zbwa5J)nNA(dLc1{5a-%?BN9KWDe_RW-;l5t+AK++4Ms-&uClW^W)LvJj2K5hVuje+ zXr+%FJWINMkMY2)GpZBdbE%DlC8Ih0Ah$6(EbYot?P$hNx89ue z>O;-Yxcbd8A|^8mpwB@-OLash&1bdxN`HbB*c*vWID%JuwYB}3eh=91LHoT?zbox^ z#9DYWNmm4D#7d~O79@RJczUN=xPb>m-_FGlUQLQ_0+s!&9#elxIHy^2wX zl;<3{lWXLV}kZ z2;-wbDppTGy*%V=<4)B3TE+I=x@b>XLNc< z@l+u36&XsFj(($1VGUGZQX!hNSPG4YaZHerR=j$OV2s!qEd6++t+7@>&Hek4<_54N zUuj$sC$3L7jYKu<{p4+aw#3M86_>^a+_qVOi5ltvMOP zMUcTZR_Mnef-)T??1mnq`&@)nM+Q%N#b*xV#1mf;gk;%@Rv_fayXXfTp)Xyg^ML^t z+ckQfRjaeYd6&Il$`X?qzwKd%#f#GlQVYY6UxpvQ4U=E=v!tI!h9EN3k3ma`svRn;Y3`znd-D(v7zE+Fh2WS^?y6t&_Wy ze+&Uuh%>tJI<%>p0K{>x!4u~92r<{zC2DCc$NE*j2eKtb&d3UNNO3f-YehifRA@Rz zE#Z`h#prcL{UigMHmqIr@VIY@ytj>|hy~WVnO+C{7Z)KA0mM>g$*Pqs(jhb|S#P;3t$A0ok`x;sE;U$U+t?EeVhnc0Q&*Vv#X#X-_7)9`E3)!30*SB*oi1v%ng1nx zvM$un9kO0))rTi6a30Tr#vRKyK_Wn?kA=HUu@TI@Z9rIjMRHdjNZI{0v513~j$xC> z6m0S4T|>1v>^O&5l;mjqB3oRx*>ruw0<+cz>l->V8$nqvFN%f86}X8&ls!T`kjoH) zI>Co%#sKjGqY*?M!ZfFN;>!jYCgr1<4YA3VHj(GW8Kd9pZaD5mM^*>0Y4Bi3kz$9d z6dAg4pxLy>)Pg|o3t{(ZcKf8Zl`-?R0j3GMQH|5W&Z1d3%k0Qo6hik5&|<(iqG9M zRQ_Jgkdw#8;D_k%Y|#;2Xc&i`)_R5%*UQ$jWwcGh2AD!k=6sz|HIO1j{*Ee#8tqlq z;q(Z>Lx-3h`#qQXmEIIQMpR?%<@?&pL49zI$@uxheg4rD9got0ch-XPtO595&H zald{Jg!W615^!K36(Xzf_8L?;J{F*Io8r zTSu+5!J|~hxI|!LoeUQ`+cjCWH6c!_41PpEiyBUg^_5O{!)-3?x> zDDBMqjt@>#})R1L9t$sv;ht`L=!(1{jJ|JV3%89_k2|Ps$~{;KN!*LOBc# zmXqzZ?rN8|EVcE9TJ&-TCP-TZ){Tl`SS443z1>kWq4v?LCh8oCc=JBZFt$4AWrX1% z55qMFXk|?+H(51ZX)RaFMUOG_HVGp2dNUiG;ms&< z?Kpi>UzfrHrit3du@9Q1Id`?4ShWN*?Sj?HS zbUgxAqzbo{HUhb)0yTAr#JXRW&p%!$Wbc$r<* zN8spC5Vl$uImy z*i~(|yvhb+dlN(ID`R-3$68{3MM^iFM&eO7?MC4NHK;m;N0Ut^6Flab2^sQCbt85v zvUvvLIwPFleizyfgTCf|xvL0((=)SV#?5Q=G%T>=Z;;6@fY2CHH&&NjYeSmWO4dYX z7Hv4g(O##o{N#on3}aD;sAhU~wI`A57D0#HK2n0C3CT6-Akqs|ZWOoCQx*oKsqy#X zLj)@WSm+5@4KAOoRT?8lOrKu1!ku5o!YO#4c`r_SP2;}Ot{QXp2~TX==RAW%#oDOs z*vi>COD%V!?QF8?74|AMUdIfXOk8$kUr-iAKIYNUJ{;o|)h}|BNRut4$@+Z``gUhA zu1~bvgWC|CP*)%joG@1D;5`HQzsBobwo(;zt5{)}3j-&eM;c#(FW3Opgc8`5#$o~1 zR+plyX=^K=0+0{UlV!nyaNwBl(BpPJJx7jS8%q)hs&k%mlzqm}x(v2o) z2`2`}hzbB(v?|aRzJcqZb7C7hI@sTe%5s;=nX;KA#LTpzuvllj*MhV$-_#^)la&-7 zL9ZtcFl?hXGd-kS+L)(}Jz54{%vGK+%##6JGdTbg15_o5OiGx{=I1fL^`8M)TkuLi_t!n_pM zszGI}m3`wF@v+@ybHpf82@|I!q+JKZ0wt2vSRU!MYSUhOXyT;{Y_$z$Oaoivgp;dxgo8%}TU38u$}Nn%;|S{W~P3B5O`Mo=G~SKxe|zpZ;LM zPM3e z1~;;zLcWkb!v-AdO^v$^`bkDu!QpI=#z`N}4khTovdRD%Qec{}N|`I-z1nsoV=0b~ zIByzdz6~KVViOBi5LO_XWH6f6`)1%nNL2C=oR z1#GYDn{+TAbMs#9j0{8(?SM9!UxkExchCp4CIgVGUljVh=vKWnvB9gQ?vz4v34J}o zrGxrga?X4B@``AK{Y4}tcWqk=HWcO5>V0Tw>I*KG(;CV6h&wJVF`#8y*SgJks>ZiD@96X}yHoME!Pf2;da*AX_g9R|8M^5$tbsZ` zL<|Q}t(wR;XkydI_@iFk4)~{v5*=GsJD&|wpQ6FqOqNt<^NDZ$cKg26B)hN{!N+x4 z(jkC)nfbBA3fdFvRkKW@a;QMHn+`FdHSV-zL?uH>Lt$j+^qgt8Y?)^EA==MFjbOrw zBn4TY*pJUaCy@&?wg;l(U=iC0Eh&++SY#3)J;5R({TebZlrM%T%C~p$uUQC8UIBUy zsD|fbkPRUBqy;Muxdz|E6Bw(7rtdq{p|;_`c%sD`Asteq0f!??}wMORn=fh4YoO0 zdy2%h5Rx9xZ76Wr!WV+U(>jT+)*F2g$Wcu311zalJO$)796LyT0wAraP4^;NHfJFX zqhHLUu=ZqF`4+oo40a?|i-nQ2qc-m(qPkD{s0fuK>k?$*FkCeCA!a!;fF&!T+dV$k zz9*c_0k#e&NFLZDg+(r7H-Sl)`?DI!;S~@@0s6U>pPWaEDZz3kD-eVx z?xbF8m`#b-(^YKc3c}J?*3sf{?y)k$Rz>E@0$d{{y9}EuB+9p5^NJd5WMr5YIe^qw zr|yJ2JmG4e0U|@Esr_Pc`=x#zdo?RgphsoE$f1#CZw8LNCA7JW5KB7_nJdUjT%4Rd zxna9=7y)>m^t;%unJ=q$$IZL;N{g@kJ=q7f&HR{#QKTzQ98L4ulCWjI;X(ToBeW0* zYo0k+h3>Ka;m1ay0EQ|=GHNtk`m3|kAvLL(fN6ZyCx=jgD6 z4(PYrhif2Jp+af0^P!yx&%M(dV4Wygh}uV*HM0wZ-Ke@?higRxvCEXn+dx~GM2Ciu zk0vH*18cV%Taj^T|arS3WIGI_MxI z@82!f>Z;n*2eAZQ4vVnYm{K!$TJ+p?JEj*sE!0Iws-7%nkJ}nR(CsiOEyCSLkbJB? z_qf&6l30k)eXPBR0Hay#HSO+tcyEOFNtV{brMqokLK_l?52F(q+D^p1g<)8uVdbbA zfN+075-jfUg}13wUxk{WiTSIH3g8TPGHc!^WwoZG@|n_S<(+y9?=K~Kze#c6WmzSTDNa@b#dk~NddY#++PpnVxnUO z^qXRM%nQfBK;S^P_mEqW0XiCB)J5ZR3C^TxNKv#{0mNS}1CcYW&QO-U!@Q487yC9) zn=7a3Fktle{IXBZugMDnqKqKe5(|Kj`0R?#6L-doDNiq=+e_B@EMO2a{H3?v8#^oKOduwWVJEpaYR9_(HIrxKHM35+2+cZ*zPJS8RHfS(MpjqB2uf(X_pRM zC1zQ2L99s_8|6|kLNcnHQ;k7EMYeQxuB(VhMV~~ByCYKA4Z-z0-Tq+xM-F2)yJga!Vszw#6lL<5)QT1 ziE*|_p!+y2mGC0K zgeqg+Ehc8{L(yjC234q|jb>pcH)rc31i=mcVC^IY=7zsynxI`d?X@y*g}x40ww$H6 zm+0goy}EWi`WVOGeD*>Qdt}DPu|bO2JmbI1pnA=Cl-j5TOX;3XrY0 z^`rnKL#bP}&xY|@jKf5L)no^JoOMj3-jeNB5rE0RghM;)qkfBP9d*P| zirRepvDI!&mY7{+D=A?g>K3olFu6rKE)xuN#55wQhPH=Ap5t9pmUK}qYU#K&9|=`v zpJ@%DG;4&8cv&MD4_bfZ+x-H9A{Bns5G_wt?S$C9Xq1CI%12T16Xts>eJ&LY&$|4 zQfL&S%LN5)1$ERd_gZaRGgv&^JrWrpn#;SGi6JbVb1nIzq_hgcLepK4CITf>2hv}c z*$vr1dU#aPz7LBx+({0d(@h;roMvq%!x}B{kyQdm$@dCX9Qp{@d^i~-DzH4X8j+Q# zpWzy{*+WK7M!ynRnhy=1m!zm;LraTT$kHnm>Z5a(y=DjT#;k4C4RTu5D9YI@3upDc z6h*_flp+9ZFAK7bP#XpY>71}k^ufLnh3{y2r;(RMl!o5tL2Y_RW!${!C8L3u=u|uW z9AQw4owi(*3%H>%Y|X}HN>~p@(an_4Y;D6qM5Qsk#-a2JSXO%vMYZ*+cZ*nSHoulQ zpg77`6(&8FO0tULTuK;4*qtlHHAHnb`h$n5Du?h8VLNvO!z^<%!=ecaI!sm;qEb*| zp7myPVvR2Oo9!6<*$<|o;&D=+cG{$j(8{7(hw&u(N@VS_0f_{lT|>jZ_b0@XmuU)j z3yZ1Yrp6*U?F~A~#H6zr3c;dWpo=)0Hu9SVI_p@U1=OfyGZAO1v34?LyXrl}mZ&U4 zf+D?arowsQObdYh!k#M6(qPGz^tlV3QUr;iCj6bC#5ENbhnKQHV06XI&S`TkDI~Nw z?ED$yIr&1Bg7BMnB8l|Df&SI7{TXa>!rpPKKWVt$(?_CpLY*@?W*ivINufjxKoJs} zE=EsQ^LH|2LX5EAraU^BZD9S?6X#xH*G@y#c|>$+rye2Jc|@FnY|D#=!rV2gL>695 zunA$=HHIL=c71dhuQPi&=A#<(7bdkn5q20oo%=GKE!yRs@%c3rH^>#ZhTnn0}bt&}f*(1{iG`I$-nCNd{Vn8Isvv zu$*l!YdW2FhVh9MZi$lIW#hrg;}DRyak|2}x3)oJ9;|W2kSI)BHlDHOslv}pfdglU zdkLZo*ntcN)1zLrhcHOn1}=P=6N0z2=I}{X@x6nl$kiMkSsS-G6+7={b&`783Vg~( zv%PH&B}o^3X13K4gNtJgzQ~c(EaGSD3*}N*!^Aqp2b1@?#QR{#Cy5SQBYZG#LgY7F zh#V@`zJ=Ggk0Cuy-DCpm3#TkCArvApAz!I_cEJ~Ul}*gR&}W9sn4V_F^Mg|{zjB$( zDQM$0y@Or7Z0FaVFbw%P>HwrF7>Z;1@5(BqQl}tR(_DuD<*(PVVDsy-i$HjD#DZwAsca_*+-1gsyJlT zZ-lHv^4zUvVg9G60;LJjo}t_O%7?RI^X91|=e}cwO564agzE7!$j9_SHn6VSnIFlp zJ6hVIw!s>_)EaaLW~4=3IW47M4BsIcSL*OK3&H zpcTkME=0txhn2XD#`1iNu&{8kQKgD;nq9-p+RmXCHUQZS(^8QW95r3VWg%MSF$`pX z?ni?J8cxSvar%-O3dEVGehzY+@n-5 z5lv1qt&&6q^0hpL-nck{qL8PK%#6?ABq% z>!OgfI>CoiX&DypqAN|A7TdebQwWA%C?^h3!?d-!_>E8E{kVWuNZGCwvgau_?#OBjsWt?#j0ik&eh-C-=g&I^WOMzmg?CiG_F%>gaW z&4Sw(fi_-aDkFX)SY#ldiC=>CG%IZMmM`HD5Mi>Y1_3&2#ECURsS{*bc5B}CaM!-- zT)G=_2e)I;#&__c2g2;7%q*iZkdz7Z{qh#~-vL=!u1bruWod!_Trnh;GH*+~pA0%LCN+SoJOm295jFMA|vXnJ)zHfKl>j?MEn2hkl92q3C&n|>lme5426 ziKTYi81-p<2T!rbxRAparRNxZgaT{JenpB#@tRD#@I?eP$rr&xl7=;mdn&j%$T&Dq zgZWV>o9$dHmOkAHVvp{g!On>>5{5Qo2_ZJRT?ZjSaI(T_A=fF_S_2L#i`TeGQWzGl z!2*Bt1GmRDfOV}@Z+JB(W6pp($PqrIMr1P#t3axP-MFwNBQA|~6G=2`AxGbHx2rPU zgY~@ES4LArz;X>WDrarP@nBD5iNl8cWYJ(tQOnBg(#3q(38pwPYo}FVP%iU=nDW^2 zG`gl|&0bxqd^FoSu>%sBQDy2X&7?Z$1h~Pfu7j7|ZOF_8?F0%7oXFZO!s|1BkPfh7 z_9n4!yEH*Quq_F3KBs3vqGTs{*T*<)92Jw6<_Von4{w{*)Tp>J!(X&bW{GV&i-T#8 zptlI>DKW^XZOoP|Ccu8bx4mw7a@kj>xVYeUvh_TvHxEw&>Gu1vr(rywFA5fs)G0Z5( zugu_%78sEzNtf06UMq?|?#=Ri5#T$PkCkGsn2Y;BI=!B=X4Cz%wJz_D|elS`YI!cIXkvtM9?Cjfzp1 zw4-NHBp61(u8xIkDQ_`QhptiWrH5CTEg+A9sVIfWZVv%6(5r$jWLayzq^Oh%BA&~nFm!Fmp{Ly8miN^l2aOPtJXiXeI01+D1fK!B+YqC1j+VkXq> zV?mJ|D$0!RP-fx`WeSl>Xb8=#>aLI|cZ4K{SYrZOvN_cuVrzWtS5^kuxwU0ZB8;u= zTF)s=6Rnx$Ace`Tt6AdPCPvG^4q6G4g3Ekd@gmR;jtKBIm!JYi#);%*K#I(${ZXJ+ zR@?}dLmFyKFo_2ufUaNGYRsxFZK{Gzt6IbkPQQ-G9omq{V?tl-l^UzDP*fEdQ7Bj; z@tqVeZ!X2Ps(^hiwX$@ucgwTzF-%7>B{Rq;;jPB z#cX4h%^eA15kXMp5YvF9DLQ!04c&y891GW*_E;Kd^3VNp<0@~l1ahSL;|JcY?Ic-X|K3|*VT-e=qL4^Ax!lTd7no!Oeg&{w@l zuxYC8IJT2e$V3H~@|9O9Z>!#P{uWDzrIRvZ%34wmCl`aco+9Exqmp=la|uXOxQ~9K zxVHCM^lCsqC&a{+S@e99?I5Qf@?l+h(Z~=zUJ*=Tup7rX;ng& zuL_J4IB4^TgHn=)2!>|&wTomNG?l7@HYgo5nLxraosY3g(eA=82%cnL_=#+}Y<$X3 zlNLIeX-{M0rHC%ZPsc-gWoc(MFG}%6wj!?d;rTgWieLG%2$QE7^a(J9p#U>672pR( z1)1v3?rxBaeHmkES_Ej9BVk5ij1~NS$|E6`lE1c+R5P8e45zwl2MyI?IIPl=xz>HG zrZAeqrLkDJ&~_v)3HymNYG@;qHTl1xvw(&ubDHu}rT8?*P7{~n;#@}4qXh!&GjMXF z#N4Skxg%+D(1Mr*rZ~~f3YkT*Bq1+bDg#-Dy0>PZ8L?IJ3~x^)gYX%F6HWxHsBMCa zIb8d3w&qYKIJm+Em5&_K8XFRPG_vC+LD$yU3LbH4j=e0OJtdMSlwr=EB)MFkVl7hR z9;iC0mXthq+Y!p#M}k96dlo165qe|1NR^5qI1RInrWi5oI)w!Ydq<&@e3p=2BKNSX z9F)#{b1qf5rXygE)(dU1D8W4)Ng;Wb7EOac_c80aX;+@!wTFdoq-0~9ay^id^W zVL(dUhG90kVoC66moCO=s>jHr>}jqZ9aG`0oLV&+8j3}q+~GZ z1g*JDpQbHy-PMsFShuk^fbd5RJ}ceu{kb-?;OiMxHzHjiYiJ$DT@xH(t{Mndzn zHIutK`)?_Nj4_);&Sc>lIU7UL;j$dv;$!AS>}s+#U`GIKFGqY;jgVD0ECti~*mNvK z8uLCRzT<@ZdeeY@EJm?qJWwxnOZ5C<4 z%do39*p3$%6ztj!4uTQ2K~*L?5|>8Z=2H$!UmZj3O>&Ew{nJivm=qatYli7s^tM(? zxx(jcAW>CPvX(h8%9ACxWWDx!yJ3*zEM`LuLzaLNiVU-BE7CJE&~-7j)M`1(z}SlEAKlhRV^eBa6Bljc zL*@rz3)DS1{wXU~l*9dow7XysbHfZl$|}J-T<-2FeCd|yg0S@~Vn8dr#1|3JO6U?` z33HavmaK3tU3cz^IXF#C*KpB6p|$2@V>$5PXar)z+9h05FD7o%hPEW0;aIA4h%%4G zOdx`5b*kigFHCWO8CCH{f}kZgla>89b3DgbFM^rTQBBoa>F6SpOt*1SMVpyq%<3K- z)ziHIWp5~?#Xa9#5vNqvz5OMG6@4=$+T8hYS0BbEFLh1l=ggCSM`@(5q99c_>bY@N zY8w;xsz9@hHloEF_+?WFo+0hDc&W{~!Lm&{#~#L>oH)~tkZp4@JlOTT{}y<)DKJeO znsfro(Z)D8Sz$V=vF+Vh@@;DmH*=S8WF()w8uwh~gnkI%ZTy&%hoTbRc7IV_zo2YPK!ZRb-xyA!*(0uwIRVIXITO7!Mvms64s8(5CE zp%0Pk2!|0<)Zj(yWxKLCIcPQM*ayqR-ldlhFC>$3dx^;`)Q#Da?Ju^F1cWAUi7V?L ztBBK*x09JN`dhOkLuvM;*9vh;8w^3R5|{+&Ruei?N5UNB=&bFVYt*3AwCgh#L2#$5 zd%RYdMNCLRugrjQZ&?l8uU%T*OcWFV1_ptz(Pw*Ng*)2y6%y_v=4hCHIPqh*aoB+x zW0Q;?y>lsS%vOvQEc!OW;0Tj>jD5Q&I=!;dN(IS6r!;g3jZIK4j@53V0K1deukf8` zkC9DsTTV*~($Lfwb+{%$X0wF&*(ZhzRV4?#Rwp)Nh-u4=vATc= zi_y2y=nqakuxZIqwW)@MY`m*PlS-g@qA`;Ei(k= z@`G!)iYS^>wPR@mt!8(5nwPP6j~ofW{DbY5=84zp!hT&4rMul2;{)FqUA&vooh=?Q z)6vDl_IZHTZH&UK_3Cg2wehO{5oX!!xGYB3?;u-=R;O-GE1ER>*h&og$L2$c3)-UrP^Ap>7f zQ8u_R_0lYZF&bV9QPafn6kl(KX*cMs%%3bJD$;PpR6Q_;(7Gbyats7`7%EYGdt-zj{6l5zcCx}kz(P-fWj59Y z*emJ7l)SlMKYLR@+{UkRA#6JvX>~A?!Qz6&ot{PM=EBW`)Z>1?#9)Psbk-Pci~_R& zXK~{t1ONFf;YJ~{41NzDRCR9(XD zf_pel0W2#A%e%{>)iy=NY*CTDrr2ewAN7DQ!+ zZ!(GyvpmSfJoX}7h*zFFemSH=D4|>EQFsJ=Lu^90 z<2<@wr3(q7qFSo$7n?Qc0K>G;O$Y8Jo@Iy$FwjN=2%icaqnN76dE7e|xsGGf-t z-JyUYdnp~mx8>#`dmoJ2w}f(yP$Ej0$2jjAG0TDiqYRyNbW{ENU^9G6tiEao68biL z?6{a_%zQ~?CNIUhRZd&H*UZ}0!43H?VQTL}tbN~?nK^!WcRsRh=3#g|$Y&5}mSf#Y zG9SOD+SP=rt~G{f(u0{^Nwk!=jwI@ByPfb4U^&qrayg<$5gellRxG!nm&6%LV#4KEy0qkwlia|DEX`NkoamAuXh8-!uU+7ikYUnFG z<7HUBUwI|2p<~#_Z#3Hl$a1K~toRa{=UF4Y2a$sVR)Y{-Q7Xmwpe>*A>~eDm~;g^*3_1}(nl9o0rGq&2g%QFya@ zK>U&%ZSNY2r}o5;fnOmY#m3_{LP7Y^>fH-5r$z_Ot47!irsT6 zzAC0FMQE<4bwnRwY2U=xO|_>h>3eW2>a`POhQpd(=2`LAWV^jtP+NiPzrMkjrA6 zOL$^p++%79!rjbX#~=9)ITf~P3Z({ZF!}=-wzcKNh`h}TgNc!M&YP`O@-aIQtxMr4 zfgTV~3~9kLA&-QkdHT1~iPUbHWNBkKYk z(ELYDeJG75aA4E?8ZpC<%^#y}?(8&>lMrs$t~+q3Fyfs_9c(VW4n5lHx9aEhTzmaG zo^R!Oy$ZNXT3wAyO3Gmt3&Z*yCz-Uk20AihGyC)p5UUEhwhWPoZvlq^=CBVi`wW{O zJL7|F?ib@qL#+&A{OI;HsmppPi3>H@A)Tqzxlc$xk&b<)#9M)0+^*saF*tr0SB)nvf zUr2_2icGrzE;pumE2bY1(rFBRoK7OE0OAW0%P?*~f+Dz(L6QjqG3Oxku`ftp$Bv~c zL|GsMOFpUt@8erF-k`YLHRecnYir*1h_++Mw2$p|pAQM@*pA&xZ)*chP;50hzjxS5 zW=IE5I>ST#!){i%iSK;b)$3#Xj9R^NYR1}vzf?X5QC$gWR&^P4Bk|K?9iRIBB!e`U z`g}R3lC&{RC`v=s)tm?lC))6NQ`I5$aMvF?EwkPSd%C)T>x~p6#1r)! z3J@**Eg#1dXJt&@GAtk?2F1LhN#`YusLA5k0n2o`HCP&CMYGy(!C!9V5X7uJfWeu=FjVGAJ8LJDqH2{1?|?~%TN#n8N6U5>u`Gq0 z%B-?EGj39fiVP z$206a!>F^wb4! zbCV4h*^CeJwK&8jn_0Nae6Vba25C&{U9{2MP{sEJkdM$*XY2d3^#j?){%nJV7GHYA zZ7+A>FBf4nAYVB(P8jX7DCGo}I+YLK!(r{9A*j`@T3N$aI>@4k#%M6@_=J67Sy_qc z>UK!`%81S0rt_m(nKVdZ`iLuVTiqd~sl@KN762Di)!8Tp#VC7m+w6e~MsDe2^k(-QzZCl54oj#yG8S2IP8hn3k{>)fUki)#PT9%N{ZW z6F2!%uj12TrsfXUXi4Mkw`;XJx-+6sk}UGU8C|!TYfYj@{9u;d%Ldc7OYZd9B9wQU z`HS1MHMD#R$2>#VW=#jL@L4Q&HmB})oAO&mX9?$NaLJ~bYG@+x={9<4e*zr&1f!R;et_ z;jk_s49OCYkQyK9urv@*uO~Y-tOOUr3k07|b2c zu42#z+$RqT%ob%Zmp5b3>rr!O2&Mx-JCqb)J!0e|){Yg!mj3HMqO&WbW z`NnZb>vFSnfXMtp1*a72!knA1L&9#ztKw9259EPK2i{}g|xg( z#de{#9lqeIG+h}Nj~ZzAMcOK-8H*v!mX`U!Mj+g=71lnSO*focA)*ysdL+gwk`H#q zy2YQ*SH`d`>Lv&wWNBw~#OqkYSmVvZCf>wtEwm7s7=?O<3i{ClY##L4qu>{r1t0z* zW0?YkE6%tKmisfJpLUkii%wxy$g~$d!7g^(6b|taV^FZ<8a`)U(_GUSk~PyBT*TGK zvEcqTF1daqg3KbiQ3(zx`axJSXMRVgJgs&yBt)F@n~H5SOs?KA7oTXgi`1P;pn5+Q zKqTtql2Z^!hQ2hC$mygU{8gMZkC?oGLzXvUls8g0Z41a(%+LXRTm~QL<{6|_Uqk5l zr|moo0a|-XR#~-~-xennyvDu}OCp6!a*Ye;IM-Q4g%9n+Fxi-#CmjQ`q4x0yWDPpw1Z~k%Xal75GHe;7-81*|>%d)g<1pq)wyK0H7>D7D zyOMJnoDtJ85CJlk_PbE=WL+sg^9VXTxiJFZ@*NESpqSiIaABojQ6*XdMEB;p=>VHf z%f-v1IGInY=h*?NuL^7bVh5EvaRRGF$ z>sR?ON6>Ud)!r{27A`<&V+clY%HNvL1g>k_e*^8++R-F2D59SkOQfg^L7ugBhMB^knH!->L7I6qAR>Ze3QpD{)A=mD`2FQ z0+ybU>M%{&gy4e=9fHxQDf8hXY@{2g2po3@AiE|DFezCxHbQ6XvaQ4x2Y? zM!uip?P-vUsu7T2>v|U+U<@KfSA5$ypY)Mo28Uh)Bpj_iVG*XF65B)>0L|Sbija{A zswrzDC?G4~@v@)ApP#pmbVu$j>t*j@3os|G;42`;i?!tDldcXU{F=iDj#UT}fR)NN zQcGtyCDVR|^SUg288*1Ad`wf=6=E8iaEFHW=>aXk0Nrq6p-Ejsaq)YrhHtxB*_VN! zX0qxE^EbGtXt-k&8=c7i&)8W2R$2Z3|2+5J?T!^V(wHEi0sgPZHa2#5HwJcKV|RD|U+>R(p1Y0k{}W$(PSwd#^--Zv!(W!uhwE^aEV%>_-Z!vELG~LoKQgCiM4mTI;Itp^L?^mm{PO7w{AnBJzqUO|Ir!WubAA)Xudc(}GOdh4H4_@H0I~N- z6<3j_b@r>al33N~;#n=6B(BhM3|W+|%5=nxLw;I+>a3rm8=5^ANdP--lw*`l=^`8b z@+xa@+gFL!#Dt8Y_hjFz`k(5qr;O4^KpJbc{7@rI-!*FTN1MWs1*BO15_!({(+QGt z8@jd2>bEdCi?2;c{iV+G!O2WN2$DDZ>6=h1E5%}#Hko4LuBT+t{@{jgisq0c1Ufk*jUu~>m?=QX5PlTS3}W&sf2UnQT2=|hhHV5@iR^x;M7&%mPIb9VmP<^ zCp4R9SBB%ooHW|b3Y8?-K78PdM1M&P zt08V0%{i*So0uyMB6x@t#8xnZ?ab&Z`crNd-?Z|58A0xg@*5aF`P{!q3}sr=Un%w?(O z-XL6$_!0^=NW0O~<r?@F zGydY#(9}jDzf(t+`9WR@VQBy;IUrO29!uH?yZlxIO=WI)*~DP|lvirWuR~(AT;0A{ z?+U7k-S=d3TxDb3p7tYs$K=aXr;5@0?<*ykRR6$n77CWxl9ZMUS`!OLno1Ort;@Xx z*-|7w^)exC-4Ue)e8ERYryIR$6^fPzpgOwjZNosWq`Sd3=D)x}mpq?xSWzSB2sY=5b1Ne6*!$mW_} zI%5v1rp(tjsQes&ZBVIRYB|lMm>G!XXQtD}a049+kF*V4t*P0lsr8pgtEm$;^OAZ$ zSYKVMj#gy8;YU(V8wDawH2C;QZxm8wYppzt zg$#v1FK83bLQQ)lxtAS$al zd$>8>-JBi-=I=Hpb=?j_NjT@x)WsTt#s)7oKt2_j z(HfZ7u=9gBK?-d2uxb*k-P0H8i$Er$+DSBx?dPNy zOVjwq(GTT54(aP=2euCPS2n3DOaJx@0vXP4HSpNLC=~kmfSE1p1{jXYN}&l{dNLf2 z@P4~8)YzekNJL~BAB-urO83<;w2}DDwthpwl}%H_j=)a7)jy`gh^0@n(wVQP?{15V zPBlyr!%;Xr!9eeOc5{-Rqqrs07g}uTK|0)ZP3!%{nGR50mIfie_Vjv&C>E#^nwd(Y zp1Mo+b0s?Dcc8W8;wXd99P$WB4lL7lgO-T`@ohh%%SP`azN6FX+{>{wOorQfp;FBr zKW1z@jF%UUklf!2pX4GkF2)t18% zmt1ljqPnU(dk_9fpn46~hFl%&oV=8|3TF>>&PoS3&16vx3#ED{oPpWIjefSGp_}EK zxmn)8jZ)h%E^ksl9GNtX%bRTKreR!i6U7zEx9he|^);Z{K6O6YRZZ`g))_62T!sC~ zxX5L2W+Om!OXl!C*(LS-Ob6?*yU3KbeDWj0?C((rG z;Mx4IML10X1-08><*3Fgfel+ioFKGQT;510f2n4=u?Fd-dTF(MwhipAAcWgfmg!;- zl~sDyL$T;rk?DHuoXE5}T!kGhr^0yXvV6kt#?` z?mx8U$K;q;==+1{v;h}2MM?xnY*Z?l>>@@55bFGK(8w+d#LsV3bu`c6jHulxHF;6^ zM9`}nrZD&4G5Co?Iy*W8;+K_mM)u7FYi0kr2%|D%n7X#~=?E2Fm^qa}sAS5bBDLLP z?|d4k-}VT-&YV&cDP`Qf&Nx!axJR8aN|q*eueCa7ZQg4_X`=!&2KAF1fmZ|;v=0;| zhovkal$`LkgO$`Z+gD`F)T!0$Z)oh?N3S)@ZpTV zMcPS6u-RR|KR>nm4E^oFNK4DppBZjQsvJ=_qtG(*Q>Vp-5ZLVHexnj*Y-U|fEt@_~ zT37BDqeC<;bEV~@E5jMrkece02@Bmw8=D*k#dd~OUsj|g zrW9@2Dd?Qx;uuk!9O_6wyxIp!ti-5E>7eSH$T$E4P&2o^)20*x7#K z80{yT*O60M=_n{J2$(j#k}Vnq9JvdVDq=*@v8^OtBS4`y|qU+)abfK&VA)Ymx z(!sPTpB*!_fXj3RPFaPG4X&)5jR>bg@`~YHEa%Gfck~$lBwwzqMAFoi+Sk2nhGsC zXQnMjGHtAoXxCDb*7;PY7^Mh2jK$Jjr}jAr^$j#W3!%+$+jT4(Wxwj`N)h2; zwgv_RwXxE`q-?f+ytjdoQeL6ap@C_Uvfsd@LbA=xO;X&UFnfNwI-4urJqIf3tr`YOGo>bmAGNE|79-cE zGpU{B8*l^H$aHqn4D(^q6T;y^{xDndG?I3=1p5C&7S=2-u7?#*Um)Y~SXqYbR z3OjM3^ZpIo@j4jowvdYo9nE0eYv@|{Z?ZMf(2zOmk_IN$-*0Z>%-p}-v7GU3;KKK5 zV@j?6tKV)Ti?Z2Ex9EXp;FszRY*V^AYxY#%2h|U*zD4nr`HQF2ri-Y)RgsR7r)@^* zuEvH{THRTL7^!qjj`d5`4d2=DDQdjfZK)Ybw90g6@$@ZNjvljFA*se$`89|+9m5u0 z<5>bEJy{rqnT36+x^26@%>S@0BudrMFDv%gz z=~Ok)FQKZ+`G(z9m6lJ_#IH(InlZDNr^~jg%sw(HXLHyUaXs1eh3Zs_=v1tI5Rukm zE^TN%yRSr}_=J*SecG~-RW7YAChCz@>Zx3c9~YS&&h$o&D0PGE7N_b3zDm`)@=6P5 zkPbRVnlh#fkvX|`6-64InY$>SaFU3s!j`+(R!n80jwIb$p?5kak^_ykAF;G)?!d*f zi)qbMtuxzCKanXp$kvR~g;P>eRx^EOowI?9_%_eNut}ny-VL|2;pxGY0^rb%pGA5H zb<;*ax3d7~chj>$IY`G@-@*?)%hGm5+?8OyeZcjUG(*WwohECHab8iv3RSBqKPxcT zX0M7+N&d_HzKyj~XHAZG?tg6Erm}vf7tO7s?$R7uV3CRHXF83(7P`@kL&X>$ysz)n zZzey8*!;S1wEqFthVfVd*ksAN_zK*P;b34TBSSipDw)6*ARG-K$(Qd~2<~V$h0^1jbz18! zD){6N{7;rv_@BMg)XfK}>AOubwea(Eb83Zt`pxWZIjBEcaFXkhEGO+$yqWnQbStSS z<2c_SwrN=9={MO%k7j+DR+&#ZPt9Injz+Q5X+2zh!!iDs&iryTbl5<{tK(;sZ;vPRCRwKigQ!|jf1 zdIlt`6a~vmGY$>BM%9Uh^Ni3+^)Fr3!qhIBZ3`j)s4yYdqS?`td*e8WZ;eM6GkUFR zIo%vxjm*k*t7BSMDtQ-8F*K;ujmV>iID1<1yi!A$IdN5H#So$cgsw_uq5I~hP@gL_ zGZ}7oCXVHr?Gfp#VV$zYAmXYhN?qK@!`53oZ4qK=qT3;5mD&edG@JgEtq5;aO!9T} zB>6xNfSsz5e?+b^VdkLRd8vb9PYK_p7?~9# z{_wWx-pgyPJXpxu7KVA!G>D2IU+LCDp0)6$7h5>RXJ9P1`B77A9WgI4MLJ;9SutAR zUaM0jR1#f@>b*@_#Na+ zbyjI_(V{G}Vm_$N*+?5b!#BqHQCBsznq>&njmVB=1%r&bFS#PycCouxM@hC8=I2fI zjBGZS)?3YD$njMyZCs_HcvG)7-qksYN~+FeQx6E=>MXs`te!r-n^b3J6VW=YFTgr| zSWa~YnuXNq7~N-UmwDl`I9p*L4Gj9~;>!|bVbj;Rf{O*mv&eKWe4sdFm1 z8Z?U1RgKc`h%*q)q0QHs4(H6x=B5=KQrgsI1@F&G3G4f}zHC#cWvtVtEUoX%7fF2+ zBA#QZtZ$e?6uFsU2@SV;i643D5>B_PTeUXHW3)OMD$#QNknIlDhK`H%b=Jrk^<7zR zbQYn$VYxOp>Kl;s;o4KIZ${~EX68$A6Nk)Dx8O1@DX1T&&-iBL5lXa8FjL>Tuha}D zi>EKBZ|=)J>fxhm>4z&-lxA4!ty z=XPcs4brAj_itg601ohs8Zpp^R^M+JJ}w98vK;g0Q!_>vi6V5}%*^Dno0)QDt|UvF znU7(4tI?${n-=h>(xNam^DNO~^x+1%xV!@QT4NMu@D>zV-4oXv> zI-Lo%wqoS7Zf=WbA)=dNO8Vw;<7*?OmA2QFhFe)?PjPU)9u zm8Mdz>GbKTqz~44c$p4o&{z8~jTK-t-;%8v*kvDPpR#-pT7Zq|(?!SrfUW=K2XzI% zDI6;6iXQV~{U#{Gb!f+=huLPRVY_Aag6jEpje2Ml&731ABXs&T(u}Fbb@l8>TNd7d z66rPdiPU9N^wT#A6mcKtMhCK|t1Cpk18=74neK|}xh2&N_I}VSpppKvE-9HIQCTT$ zrrqfp;tkVU>rfC7)i;=5DdZ!uN$VHQFXF=S+Vt*~m-0k=Sza!I{F&j|#w>i8^h)0SNBS#r#kMhUkZ6?WM7?K=&V+r#Qx9c98)#k?g=P-_m1P398AZY}tl_1!+qb z&G!?rI^*K9$+TodgEhWto43fsnXcG>fMjYvFZbp)nAdu>Z|dfR*(Ilgra8Z*9o7J^ zVM(UlP0bO*4et_PGfRB!)nb#}Q=b>u#x`o5GeQ{Shhh}g;@q%`$tH53gw>WAj^%YE zqq=?4Gi2JpX$vcn_^8ENl^vz;X;g=#D6O6{ccAV5M<%AD(fHL*+M%Ca4CfRhsi<>n zr$;O7(}u{f#Mb!I+3eeu3`bZqnT5#M%F&~WMh_n}qIeK1Z~IKCPJZE6$7ykfmou5x zvZ*n(fi4tGHZb!AVn)a_ZQ9D5f%P%tF!JLDZntD+{n(ZQuIu0$29j=t4T2`y^-jb# zu&S3V3E&&pg{zDPW-3AUeRW(QDh5gC?9gnqEZB-|c!;;cp8?)V7_R<~O1Kf{`^r#b zO;KYdort<@Dg6qh+p4P5)@?FN(4{Jy7LA*MiLKH`v{ou=*n6by z(~UcAVjX>CJb9o_z0g$j`AXW!KpnREZzq+}`J4ZC)-W>7LL}(X9%Wduwi4%mx!gSJ z|8l+c6oeJ&|B!-BUH*3pHg(-F1?sl!teTqoR^r~Wo6Te0vb%=y`EGVA5p80*c?_F4 zXc%;{_5wKBqZ55wiC~LPHjieD&KgEm8BT__647SXn@6&llZFwbkKk-2hRy9ak79E- z(L_GoOjz(svM{r*#5Qxn*)2W-_TyVRF`K!nm_2`y=JkwNQ;|2*>HLS=8pIn@=5F#f zHw&_yTdro$H&=VqtDOJkj=hzwM_a^HSH~skUnEsvMBKXD%Got+POCTm4@WwoG*e%9 zM&D6vJ-kvb&7hd&p!PpPWO+ATJD~qndfiha{moEYkF7fs#qch;|A@@aDAav=oepmE zid4+euGzMow#;#ck;y>d0vF?7BK()-^v}5_t`#Iu=kjdg+PD>NsauUz6E^_+Rc=j2 zjce})yEX1Ex6#dV9o!4}X=DDrldfqi+?6L=k|^<)tgoz7G8?w;~vj zD0g=St6Z;mR%{$$w{kbd*SJ*)+0JsmxpDYW?8M7y%as{EJ^Gt)&0IIaY-TCM1M$BQ zWMPgvXoElHU;uw}`I|tk{3KkBTSw|2;@^t!?^1lOa)V=cDfK~zU>!MHM@rYZSwRhX zbLa=S4jCx$q5oFf-xb7>g_~7wRcs|TO9}C_#0&VXaT^G+iTUUj%p%XTf|cZ_1{ZSm zknDri<~A#Mft0lh#!+StzZ)pgZlroC&kccd2jboZim{yZ-NdsA=)YXoCf0$pttNGY zvAfIl!jB8qpdXj_$vtm|1n=yZCrV-LUnFjBQ6Oi zXDj1gufJ;o3mczJf^MXWG*C955yM7GsvG*Xt}?3zmusPwnamI@jsZDR|d0CuXL>vZ3w9i|C;b`Rs6G96Iau7oNE>Dh1qAFzTVU6u`YJY-(NpKb2aThJ@<5!fM7}<-G$TKQx13d$m=i=ZXa5`2(lr^HRW#-vm|Co%#xTjGn-uE$U~J6 zja_r>niGF>;#WO&gdQVAXCbJxo8ztpwB&C#p*RRox58vwblaKxgxelBJ3t{mcEm1; zo7T_D z7RBTsAg1ob)Pq#-347IZ-xKxT&sr6~krxrDJ197jo zi=Y@%$1h9Q&{FPu=E8;ZMOFq~3oY-Q8ll@ZPe>_+0Y z98$cM{fK`Q_7&(WEiC_D3h_G{voVxjCOFVL8w=ww*EKW-0z z$>CI-k9vFp#~0y1(?@D z%HHIzZXs?K5zk`a(>im%6nD$W({eZjQc%bnZ((UxdHB2@ig^KU4}<@~;jjXZfFt23 zI2w+DW8pX}vqDa5-E7SHe}W7Q3tA8jC02T}wN3&+t1El*wTFM~&JOmHJBk(A1=`mW*3kdBXuSwC=OBjKxeO{tCL|#Xe~p5D=vP&SJzRFs&*k7R z7xHkg{wyDLRL>g+jN6!R0|lt{K2;x@qHh-L%bQodjJf9cX#p)USG{S4+ihXHK=IHY zW4;3v203m=+_i=_=y!s)&<@&TwlnMkyF!Pcuj?4}cbyn7RS$O~yw14m0*bRM&)uOL z?15c(i!14Rpx%?b?nM|qQSS|BP!cM|$0(0p=zBwoI@CYi)_LE!?+g1tKiC)g!vGiv zMWFXk%rgappae=`FbsjAFbsx68H^xpBcUAjgHcccl`tBVkEqPY;C?KOgYl$q0!+ls zB-kI6-_yv2`qsL>Bk2yn{bVSibsrcMxhaAAY`t5R-#)G?P`ljMO{E;C1q0o5%4P;E zVFbw|KQr+=3!W!jjb#nnljd#oyVxHDb137klw2d~*j)5=WhK8!HxIMRPd z+zhwCt@ynSZihSIPR#CtyWt+VHz=i~^-dD*KHkOsP-3$H)eGkyK>r}5m=zpf?;Slv zSbC53-^;^<_Xs=+kHO>c1Uw1r;3;?-o`Gj!Jv;}`!wc{tyaX@9E9CK2()Jqa*I@&^ z0dK-v@HV_d8s3HXU?XXLA3nhRL-+`@kKq&4pTcMGIedZHm+%#Ns)4WJ8~7Hp@8Em* z0e-~oPw+GR0>8p<@H_kgf5KnzH*x;M^Ivc=`rKH;#h5(B;Y{ojJZBJI28Mc%ndpf(*{e)O+LQcAg z=zSRU<-|Q2eM{nFHA#xg6(Z%}%V3h(t34&${*?Ct=+|R6ndgBp1*%{wOe37>FoSsf z+9Bp9jFlzM~hhlyh{13Az zkB6gPf&CG1q@{(ijPxIcx&%K*p7LJ3Ja6Fsezwqn%ER~ZLG>&7n|y?k4F%c340ki!0=L3#a69SQn|$2C^G>)6?uL8dUeZ-pe-l>LDsz?Veb^V0-}^~#isu77 zAB2bCVJrWc?h(?G<#ODkg!35gAIDDhy&dQ^Oi@$aO$T$#mZ4KhYc3z{uX{+*oteMg`+X82`fvr z)yHC64r^U(Hf@w~Cw36egnKhK2fxm}#hW1n_in9GQHj~zz?>?iReM)$r!x!)+d<9>_H}EYKuxeJFyOr|&4*mDBg@mvCEixI6 z;(yn|U2J9f1L^{1fjH$U8OPFk>SfIFB#U2WVQBuXarH;@ueGMuvCjPzTh2RM=6;U# zcE8Y%{7PWI;pTVvBX)>|@iXc96F!5#KyUnSo}H<$|HN|Kzp+CpGlk*j=S?YF5=@_a z*e2#N7hoQX|1XS_cMzvWGbk4jW=1^WGUJD*{UmWaG)#8^EB3rFj;wg0YXsSlga2H} zvv3%r38OJI0m&=2i60S$M;sPU(ly0jv-puDQE5)P=H~XOFnq=_^eu6#e754bEo=wd zLy9mpPVYc`g`{uC_|airj&ZHy$GSFgqzBlwRT_{WzU%mf5;wOgX zk#yb7-rMzvpG5x?y+hggad9SfWXI5d6Qmx^x0;_qw`aZZ6#rg?(G&ItjV--+_J%&t z7xsaEP{L|Rk{s2ueTl0-`7Y$&W0(%GFi)igMQL+xAZDuX&FPS}73UNeRKjQ&17qXox^cK44-@b+5hlgYbNk275A)>x9T303O^#oPIWjYt62FKy z8|5kCsxV8L^aeQ^VT_Ee;f;Cu(zN&`jBt@#|30RN?_@oGX5e=werEAh|1&$j#vK&D z*v&yd7v{k^Fw(DPatvf{+&Av{r^CH-r+n~z(n5VdL&Z5J+5^}*gLs8 z-4>3dy&i?TqY3XA!af%DaiIB!c9M>V6JR}(tSFr)qL+Kg6i-53LtQB_H`h8}AFd1E ztICr#BkoS-d5YAae68Yn8k|m9D8FYA_nGnQ>HGb=I1BT$;T-6KyVamJr+75KD?o}? zXl`$G=f-bx=i%;rxBzz-g4)4FP{25JG0!z{30w-7f%=fk;R?dL60U-^a5bp@UqgDX zh3jyWiTjzP`FhkTq;-ug-YxYzh3*E*^G0hcKJN~{H-%yPHgyYqm-6WA+Relv`Oq!+ zxfQp!!R>Gde(of`yW+jw-Gq4$>U%M}kLUgIThn1YfZ2n%e+V8%{Rlh?kNtncxGf#V zj)eI*JV889{-;0IwAepoX^y$4ydPNbJYvxQH1$2q>z64evEZ8;k^na_=)<@9`XCqW6W!~ ze;xZ*NM{dF*c%A@4GZ7Dmp5_q7W%j2_lJGFbMK&k7u4^)M_Ft{{XWkRczy^+!*8(% z2+zMig{ys-k1+ojK7mi+Gx(e^szzXEn@745oR{zC~U}sd}y3#?V2Q_b%)jwnzuaawn;orJ&~0A zarzuD-`D$C!a7@fZUv-E^(RFSi9`mQCvaEjnqoc?lV*gi`9||ZVLcholdc8n(;B@c z?pndNupMdK9(V2WzXQ)g*b!P=y0m6o=h`IJxt$VExwZ-IBR%cfC7yBZ6VJMx6Zviz z*cCcJN5a!wp;N-I)ptX$HDYJdqcu(!o?Ss}_1$@P1FhNj;3@e)cb+|9PuL53!rq{9 zx);w}-1a8SKIB8?-k0Y-&=2;7{xARrlBXglh7{aGSq#Eo36#QM!WsfYVHgaDG8h3P zp&a&uQBVPuFdD`X_E;DP;|X^HOhkPsZ(tJY{c&>uOr|Ujgeg!3Q!$%{y9cRj(@{T8 znam&^GZX9GEd0#|$<+_SZVv9}!aSG{)rsej-#+hZ5<}g=xLW|VgjG#>-4|Qy7A9VB zixL;O#jqri?Uuqa!d?!C;QvrK4E~pR(H)+6$*mxcBNCn6k(eEoc)}f>kZkE?=1DJ; ziKkon5FA7Nsz=8XR!RI7`j}Vn`-=JPieLFV4!aGs5%nP} zN%Qff=Y+&%?nLsVJyyNHlL+Tz=u101h3BcT3QmL5@qY%K31`9Ca1N}7bKyKVA1;6k z;Uc&g*1#ojDO?7Z!xeBPTm@_4YPbfjh3nw@g!YtPbvK~Ck#uI#FW!`Rjd_V=Z^< zzlAg@&9`EoV&^CW9B7@Tap5*=8yo0fv^w2j=C|Ya4p4tpKq=jco4Y9YyAx-z1AP|m z&N6pu%lF{!UbqkLhX>$6cnH*%6^`o9!=$4RKDFof2<7@HJO+;w?h}bO+>^wyF7YPe zN@lg*?TBB=5}qOtPs1~W^DL}~=iqtFUVsTBM+bB<_q*+^85DYdhE;_dD<`gdI`0=Gg{zLfsbHL3{k|47(6#Kz21ct&e7!GCdByC^&0@@!Kfqo>E!+tOdDxi`w7!4YG z$M75r<6t~YfQh)71pC7QFc}VnDNqGdVH!+_888z+vtTwH1amN(3-e$;RAW{H2g3rW z#cUxgg2k`|mclYvj{PBUC>#d=gTq1PxB~kltlaDG<7j@OK2-90$;&q~@7YK#-)L>S z4|VZKdk^eK5zf&WTA#kpd@jcwlab?&#qKy*3CF_;a3Y)pC&MXlDx?T;RmKPOJ2~z& z{GE>38KC*bnHe84KT5c>(4P(Gz-l-b&V%#e0=N(^f{S4dX}JV0MSU4u4khj*3rGE# z!ngvigsWgJTn*Py2G{bu4kTl^p63m4BisZxXXrG{$Mk~|cY|LFb7! zWPHt868U@Iy}>(ullS*l#z*dL(yleW@6+gG(Z37t!A5vLEWcKS`vH6iAHm1)33i{t zXYe_E0R^aXD&I2N;+r1e|W-(mMX{DAsL_zCsT@C)iE;BojBo`l~>`|t1v z_J4xrd4FO4H>ltHhv&bb4Y2@X5YJ@R02!GDE;BRVB{9o_Mw!fqAqR3Hj|p==&&JRM zwt)iNHHBu-99lq2XocOjupR2{VF%QOuw$lktqG?MW;;O(lF}CQcF-QXonaT)6*}Oq zBW^muZqOOJ;I1p|4&Bi20o_se;JGL4g`b{0_l9238~R}17Yf}jZXfLXq28D9`)7XT z2B05^nz>34}!^Q;n3eQOc>o^?F^FYZP{IqV0cpaLpkG>n0HwU+?F7>g%UrANBXsQO|&e z{XTUQvsw6^4F|y-n2XswD5OuBPkN6Geq?U;BRT!i`qw{Ehg1JGzIqegy8fu{j>=$N2A*y$|n5%#VVjaeoZyI26CfLLbs`9O18o z7DLhYwRd5=laC>^@pX6U|bz-P4ADS;FXrE_f zPIYHmynjx)P$Mhgwb}mmHg*y!qmRK_DIh`y&8M^_brPH^NPDGiJBI zt*CE<+u;tlGcyRvIT3XidAyslX_5HT-GlkPa39=H`91*0;rBs!2p)zbe+Hh#ZaqAQ`gzP>fEVE`2zE+-&5G({*Ou_wLHlHm z+ZlF&U7-VXOlAe0cL6m%xMF3^;ecE$bfN%dtvxNgaKut!qzi$u^pnH}^CXbhA@5ZIY2ow1UiykKwAAMH`A?es$5oA`8IQ~k&#)bUt6 zKj?&AAMEfNc7!FHl zpJhBpz({zG@XL8u`@twUhj=S^Rzhd&Mw6y7Fc!Dtc#ek&s3*cC*dGo^HVq~xb)rua z+~(vJ*#+-p3U*bvpUN|edm7SPOd4drxg za=W0(e}P;|cPRrIf6_ZDUNI_eGheIvPR zu+3)q;tT-szLo3{yiFOr1Mem~2Jg|YY=rldoq`YW{~>$?AHyff-Ke9xQLc_U!gz(* zXYe_!=M=8a=6^xlU&2?(F6cW4U!(p8Qk+!H26mEpC!9^7PH3I_9sTS~X1r~Yv42mP zKfsU4-Kp=p<7{`_$_?W)etsg2KNHq3@N2SLP{1i)&be>mrfcvU_P@g)`1_N1{z~>^ z-gznvxExh;OTgY7Zj0SaM9%v(bn*a_N_hIUy6u08CG{VuR8emX!$>^s43 zs3&mtqBCy0WcB2IY240nU9)oB?$8bPfbRI!e7Ohi_k_K&_Qvg&+Go$8C*k^ZN`{c* z_Ri|XNY#sy=*4@}c-}kcMR+ONX>Y>nlhr3^y~VJiHrT@T&C<6gzK_v*Xdlum*;q90 zs?2k;@?F0ygCY%=EdY{K03vRUj8%$b9Ci}qy%t=ONX>Kx*I;uX^_pj=wDzL8v?Njc~8b$A5H2N{b zKbG=&f;pqsRWM6`FcBtY6$koyO#1!d0MZ&`Z8{nC zfiMNCU@Dx=dzwak)3Z{v)kmLO;XV0sb5gE8qw?5{@EH&D~O*ha5 z{2U9%*?Swz43hl|%#TNZ0u*xEzmWJ(%o-G&1Si8Oa4M{V)8KSC1I~oA;A}VtR>Qe) z9-I#skhTl6N`s3C|6UJoOK1h#!gjDd>;Q$ZBeaG#uoJX} zcF-PnhFxG+=l~s|6YK_^p$l|{-Ju)o0o|bo>MJN*E1eU@VM-@h|}!DKiPra%=;g=sJyX249C1+(EGm;-ZR9?XYo;;U(t za0f$*FL&sbiKEQoSkS1st8Fxb^l&Kw@W(AAU49Nd5_7*UR-gJf>zGB2wC7eH=zG`2 zsF%P}SO&}CkVZZ)o%teYIerf%&ci_S+W+x9oUm8G5pX0N1xLd%a4Z}LE8%$Do72+*l1*M6VIFB7Pu8|gWKT_xD)Oo{=4BG%H>}4 z_krZc_w#%J9)ySBVR!@{g~y2dad-lrgmw6T3ja@I_Y6D>>)|qeufx0+++yKgAJZ{a&Q5c$YSoTdF9cR#?7xcv#1GvNHp^B4FP zeuLlP5BL-Q0*$qQ;`e2hI2*jaG^Mm>?s2ENcS#HwIXy?Jg@D84+Yd4&>rD5Bxbbz8OT_7@AP4@n*srJWwf6OZapSOx&C-T@fdsNUayMV7-9kLAi zP5eY_^qo=vLiwp**@gI2?kT>e%gE*|3mnKAqyx{6*^`;4PA2@xgs-(>f$Kz=yVVP; zGwLqT6||N;j=5(JYL(N^#IZZiKX`WIxd)_JO(>r3&;#~_y`U#3&b_k>f?lMlH|5wT zdkXU``epp>1N~rM>|*gzLI3P7ZUAL85Q?(1T`}e<7?)K=*;kR~D$=ZPg{Pv|I*xr^ z+?HfdqmT3Ji&FGjOAOAQ&PtN+#L*AUod6BKTH9?8m4q`I#$-FXKc_8VY0#z`TbWMZln9qQj z*|UOK+1fkzGWXfpnm22`uJ56lgW_jS_UvFT%!B#7lj`h)f*R6tFm~FvT)?vy7Gk!D zFc-rTSc=&)o~uZ+=4#r9)PCUuoPMsQ&38=9p={@nzd7VD-z_KnLvVj+b|&u`S(e3x zJPY%~DWer|1RRN*qu^*b29C{c>W<5vOKy>25vTTrjwg>NWY41?V10nuNpLcpg8Nfp zRrY)vmrld%bT|XfgtM^gOnIKo^PKEz>Vfu?G$*dHdaxQd=VGU|U;=mNWgl#A&d2;=T<+=bX*guc?oYR8;k?WvY&Q!RO|wK||ZWsRG9mlxwc#XDY;y>oC$_Co4sZSZq! zMsO)%T$a6v@TKqXF3(){6INBP`H-YUtX z&eh(8+0AeZ+zPkB?V$6!lgYy!sP6>LAMWCLH{3(o?uGl{es};Lgoof^cmzu6V;<$1 z;`tc$<8gQbzq!Go!IRlKvve4;yu(QMVOvP|*3Z|kBMha@pReD6_wUQ>DdJLJ`E<6{ z<^SV7&}YCi+4{2kaB^}uaUD)vdcRRQb54df{8w@X;mF*}ub-uS*4z6(f_D?S^?S&Y zojgZgp3l}UhWre1FOVk5y;FS6EB7ywmX|=Xu$OWB3cQ+qG;u`dbLEfq1?I13A7g1% z-P1VUl-+M6L2d*7-w5-R;;UfQVflFzv$voR?Md=UZgNPceRs;GoW4%wP!KKd51K;OWyTeb&L2(gu#9hW*g!C?2}m^pG*myoPK8? zglYVc=ST1{Xs=y+yiF-vW_`gY+5TPiq4Vh}TzBP*+Q!`A@C$Bym{D8uY5x`T-{5!9Js5xR{1epA z{sn($pJjd8KdAo&ZCnKqgE%B0Bj;?!BA@@v9LcA&hNqXq&iCc&+X*Mfr$KX2eLLPL z=N#lZ31pU0+LYe0jxOKca}NG3@Ql*RTr z7tzm0Y2Z8%@A(Gmv-*L~Fc5a2YzlKOrj7XavLj)&hBkz;6SO6q=d#yW8)`?s+N0k{ z8SIQd|Gv~dF0uBnG^ssD@$7=zU2`s_ZmOAf99JJdP?S%7_m zo#T4tZ0maGXf6}hWuBUwMD3v&by4GXioW7J=#%63O#9|sO*vgnyjK&i!p?E~P}Y)_ z#^OUcE8y2F{c^Mq%9@dI_szK`*uhu!E3(HbxzI~ffy;_JLooQc0*)E19u#`M6!(V&+ET;?(fkSh22EWi9hWY;}yP1@) z&ek7}TIcC|&{yn5IO9QWcLnB0fX>n%$@3^U8jgWu;W$_c$5XB+b}q+=Ckr@`s?I|I(l(f0wIZqB)p{K@<#`V~Dn<4e6hoAAy- zy&BF%eV&ESekuA3;6k`4M>k&FOc~uw82RpE!dJUpWA$xVa7oTOM038LUP>BHgv+2E z?_KUL$Nd$c{lYBVHRXKti8({vmH593^R;1kSDTw#=zlktvsbYf;P(Xe4aAPYHTcyW z#qULO4l?If!oC%gTS?>1!FARa^-YA*p!bx6s{&+kv#F+bPF8tSo(4cjnwl z8LID7d-dgV7iDxe{gd}|7vrzgF?Ubs?_QqwS$Ku+ex45y--Dob`w-8EvG?PH+VkD? zU-Hjd3-d?dQBYlZ4711K33w9L<=jJ`Be%$G;A!xElhS@KeY3aIyL-yw*X<>nn&~!^ zP0b##K3x6HGYOrLm%YM#C`=pkRN~itTS`{}Ym{e6qaPbN-)U|i4&C~^{muK+8dGz6 zKTgW8<|zvIk#rg~)<0+dA8lZ!x#qz5V_|+3x4sc%Z12r zycT5UsxLt{h+s-{lPui$xfXL~)Y-YO2RYa^Bi`Ix_QZ2@Tt4QFGS2B)hz0;C#ThXQ!{!_$R z!&vb>a+Fqt*PedAFMHWpsJG3{ciWL3pCw5O##tq^k|---+(l|?+upkJxS|cluJ+8TV+I8DOconPS1nh4a?-cpjWOxi_n|B<=*74 z5AHQL?#pwZ&~F>!=?9X(X`gpr)cs)q_5(?O5&nF6Z48P@dkXWEdp{UNK1-k!{a~I$ zU?>cO;ZO!6azCII@h+hS{aZ8INb{TzLo=;$qdKPBo7nTBO?7r3r|m~luD*Z$guJtM z&i&NZhYC-9=zh7M;m^0%QMsSfw*38Pt9U*|UtB?1R+5(#w?IkmwJ+^RyY-_9cMOcR zynKn>7s0sPFM{zf0VZNM3HHzZig)7o#ScI~84iRgxnEm&vQxOd*(3IM5hz{X{D+-x zo#LB(;+>lN9sPElEVvf+G}1a9N>T4aot;5kx-VfS&smrsOD&j9o<`&UAefW;J>xv* zpRu0@&6u}I4ly6~1I$fyXG1maQ`~Tsz+DaI2NO;g`q~sXUg=xW1(-<|n$PW5OvzkZ zr|%A;Zw!7WFG%QeKX(g>Pvxp_sTQG5*)3U|y(7FO=u2?-SVHcYi^3(bUoCCR2!A;o z0=mcNP@adu|L}J>tjPV1`pp?>)JMWma5VPEz_D-~tjztLa*OUW`U5rcEI2;*PwIu* z{$I==`BtAlC&K0Q$0rev%JgLX>t4`Pc%BOC^Yp$}<^D}Ld@DmeJw5jy=6CEFA)C>< zTji$j?G@Hc^!o1i4E&x6`lkCVo@c|V+<$G1d6Dwd7_NHt26;S(r|y7RO}P+WOfsc& zNzZw3KBQa_Q@yzWce-QbLY{T<^cZ&Rv*GSy%-6sra4B5IAgR3fC2dPw0yX<{wA%~# zK#i{l+~v6`cSUYyEW>5Qnlt8HiJz-rEnLlk-7GWLc_qHnA#K-UejQKAcCY7|;)b%o z+%!suaRcTz;!gRyiA@VmMiF-XFmht?Fut2DjNCAcytMf(W}ctc-)j2CY5i@cZ<5wa zPM>ny5RTq$0de|%>vr7TVQ!novMo;b3avc3D}Xe%#NYYUZOw7dreAHv8|FrqFr4Q0 zygRo=ESJ38gZq2oKEk`7=L7H{JcRyXcmy7W$KdhYmR9a}Qy-qlZACh%E2v9(#^T%Z zzL4jmUk94IKgCmZ=IPw+D91=nrf+~a1A*PMx!V&4a!$h5oet0C?qKio4#wc;atke; z&*koj8S6FD^g?cH${?!$zQ21hw+;CqudLlPx79avFX8rOcm-a?&uj2HY(W18yqVjd z8t=!9fjr+L{*dXg!kbC_%L@*+6D4>`t6UdL>lJ?+_)o9;N7#@ReNf;|7-LW*xbdfOPe zQ!L2q?_SI8>6X%1hxTvAE9q0>>CO6O>t9-n`S(lLkq%h39VpT*bX<_!wyggD#IOd z*BaWuPMGQYi?*oSL3{K&!!EEZbbyY~33khCM@;SLCfZStd|F!YtqZZ*9&=~>cYzc) z0LEM!*A+jzlV@+=J|=laH|+Pw+nF}z+nrw3{tMz>^(@(Y~pCd_y?kdw7W1qYZv=_-&m>ckZ z`;oSNp>4b)=7p|*UZ+@d?DOcq2VmZZn+i3C4J7;`D9-DQPx6L(5R~Ai6b8c(bKiwN zunT3=h4gA3?eCxU^Jkx)H?q4DMpxW)4c+M59pC1(dhEkZh)rFG*z!b&*iiB^j5I%) z-7z+t`1C!o@}#?m%FrtvBkIMkZvjTioOsKrTZ(tTyl$~=FmFkH8HL+{Pyv-N8pgm_ z7zg8F0!)NSgrhdGKjBC|(wUnXPf5=KyT=Y7+{t){5t5pIH; z;TE_RZiCz54#K(xGo~pBYPcNZ<8D4=`NrPmfukm~x zHqa-&!ShXc3*OG#EA~!a^u0Z2)bnhs5;}bPvv;ZTE_u zM>=#zz{i+<0_ry=q1XHU6us`2{EX-4@CAGcU%}V#4d`xxZ+U(P-@{Mn({~TZUS{w! z`~ttiZ}2<(LE6;L|Kuq-)?YmTCNKZMzrdxhE`S)sApsfrYOiPVePFLxW`5EoAq#Y` ztM+>uq0WY!e1*vw68z+$PT4&a>@lHloZs8}*Jy1*DD>~@msIwB=>PfUpj`=yRb$&nM%y(^wYbR(6e!MRT+U4&{pD(}t zW9{?%$9B#~ev19B`0W54(RYH~2%|I4F3=Trhi>@;VtYV$=z)IE{DNRF($f?6CakuE z$tgzi!d^-KsGv9W!LBdi?gRZGI;*oU>i%#n{bea@vjM0FLJ<^`9-Yxjp&pb!FjkUZ z6f4ayjt$OF#fD%v6owK1aM%rWj;D<02pE~K^B;p^1;EKk(jwW2|HX)M!rKqjZ)=Zq z6zU47gwZetRE}eLw&s~~C9!e&nrW00Rw-c(ijB`76q}Ggm=pbjF&k{}Z6fhbBA?CZ ztM|w60bw|kN#}vQk13QFBP{L*gz4e55PmL0Mm!Za1>7Evq==+;wDp%y?~qsqo1fG0 zKRsXR=og!TpPBg`gIW1HGv?FU*$pKvLkW8*VQc27{=(-`^H}Ytt>XD7_1(*+hS{88 zHt`+=bHMLA54U=*dwAzk&*s5=>?GePaAoGl%MMic{hhoOu@RV;F;e+EE~@e4-Dq~l zxJ5Y}3=5z(zZ`eFxSl2(-;a4lQ@4=teZ3rIachjw9cPOO=T!Xbd-}!s6&CjrGvj;_ z`SJTgmH3goiS;pMzl=DRgTgx`U$+J8cHz-h-c7k}_)zQ)1IcsuwOfZd_k+K~Dc==@ zy|0y3l;5#74>}^9zH!Vc#u45)!qdLP7*5Mbwx{1785=ticXr2z(hOZ$HyuUTOEFK< zZ`Tm^(Zq2~{&>oOv!&P_mp_3rnt*l!VXi|an(tQTPmFDgq>z)jnB}|U^Cfqj5IceQ zej;>4prElp@AM?X+f)|WPzK3bo&25xnu9cMaY|3q0 zIlvh|?0osI!rvi;a~fzprhFZR`gAxW{{Yra2jKny3+qhs*39;!*^fefHg3-`f028w z@h0<5C*x-_exmRsziQ9-;r{-s)s&C&eQy4w*m;!8`KT{|3&T8Ue7lHnFQy#U$Hx&9sM0}C)@>h!#!{>+z0o=|Lf~Kpra_l06f_o1URyD^b!IAK@>p&3qi8OA;+yYxc#xM;iziqg0haIpJcHy@ha(Sli!M>O4eIRqb{n!t{L6GPE zA$#%tDxjAqvdi z8q@#86^nM(b#sVI{!dv%x2LYk9?;Mp(xRlNm@XC(I{#hPDn0y{nz{vEbeiwR$llWq zjQwQoyQ5WHdsQ_0Z1Ny|t?Un#clBD!e$vLg-=t5F{s#XNA_Jv#C#$r6RF#3U=q*Rw z<)H$8Ih?Fk$Nlt+;4y*zP;!d<0 z;r9rLY&}eg*Zdcfxi8msb$6@06PEXx#Pb+&JdW8In!pp_ho;aBzXd#>pX558w(%6< zn?noiPlNoYFPZ1lGq^pAY)g2K>#|l7{l3ZH^Vna&{Y9N#*So0WijJ7n8K2i?<(i|TE4)P1b_oHV2$f)=qpvM;T< zh3cebZsE?MIJZ)paaVWNPi1`BnKX2PuFws-LlSzW535Q3dT^Z#q4YC<*YTLn@>}I%Gg5WI;9zfPpZG@Um|)kCcCc&cTqQrA04NL$vg7wi-&B zhJm{;V7UH{ueQ1V(*HGAjV+Vr5$G)VtrF>*N8&aLM#C80NR5SY=o=3UDTfJ|(q<>( zKM5wo6kUV&81A#0`$IaX!ZdK-hnO*8Kj(gahPy8?4w+6KW}xG9n5jQ@+SM$s+mlAl z9j89VsoBWOJaG>GU+8{T)96&{Rw|{C%KbCrm$~SfhunPKpE;Yz^tZm$X~dU?TpDt+ zi;U+lGIG|9jCqn(I(<<({^|J3y|&d?)R(VysKzScrb}PQipt@OT;D zOMQ{O!m(tTF0t20exoC{D2G|I> zun9K97T5~gU_0!9ov;gb!yecR`(QsDfP-*|^dHt4lwk&Cm=P#LQ@4(gj-w!Z508=e z<8T5_LaZ|v&$LeIEbea>VY3J;^9cU`Lzvp?6tiqwokmvXF=sI4OxCl+c@EBVk1l9= zQ|ney52!`oAa%cC)BxIawsnw#L zMqa`)mVnE8aG1Pt7x^5iz5`>z$h|2XIhN3pC!;TqIIin)VS0?aq-XqprqTGjX`E2teoqYOcgst3ObXL) z@+N+h1M-p{Q$OBd4`18s~8G6xK99iizzX=bOu-`x73WneS From 0ca43e42bc39396b15de06c9cde176dde40a8c9c Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 16 Apr 2016 21:53:03 +0100 Subject: [PATCH 27/48] Default: Create 'grass', 'dry_grass' groups, use in dirt conversion ABM --- mods/default/functions.lua | 16 ++++------------ mods/default/nodes.lua | 13 +++++++------ 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 775803bc..c0ea1f5b 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -362,16 +362,8 @@ minetest.register_abm({ "default:dirt_with_grass", "default:dirt_with_dry_grass", "default:dirt_with_snow", - "default:grass_1", - "default:grass_2", - "default:grass_3", - "default:grass_4", - "default:grass_5", - "default:dry_grass_1", - "default:dry_grass_2", - "default:dry_grass_3", - "default:dry_grass_4", - "default:dry_grass_5", + "group:grass", + "group:dry_grass", "default:snow", }, interval = 6, @@ -408,9 +400,9 @@ minetest.register_abm({ if name == "default:snow" then minetest.set_node(pos, {name = "default:dirt_with_snow"}) -- Most likely case first. - elseif name:sub(1, 13) == "default:grass" then + elseif minetest.get_item_group(name, "grass") ~= 0 then minetest.set_node(pos, {name = "default:dirt_with_grass"}) - elseif name:sub(1, 17) == "default:dry_grass" then + elseif minetest.get_item_group(name, "dry_grass") ~= 0 then minetest.set_node(pos, {name = "default:dirt_with_dry_grass"}) end end diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 1550e141..36ae5861 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -947,7 +947,7 @@ minetest.register_node("default:junglegrass", { sunlight_propagates = true, walkable = false, buildable_to = true, - groups = {snappy = 3, flora = 1, attached_node = 1}, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", @@ -968,7 +968,7 @@ minetest.register_node("default:grass_1", { sunlight_propagates = true, walkable = false, buildable_to = true, - groups = {snappy = 3, flora = 1, attached_node = 1}, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", @@ -998,7 +998,7 @@ for i = 2, 5 do buildable_to = true, drop = "default:grass_1", groups = {snappy = 3, flora = 1, attached_node = 1, - not_in_creative_inventory = 1}, + not_in_creative_inventory = 1, grass = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", @@ -1019,7 +1019,8 @@ minetest.register_node("default:dry_grass_1", { sunlight_propagates = true, walkable = false, buildable_to = true, - groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1}, + groups = {snappy = 3, flammable = 3, flora = 1, + attached_node = 1, dry_grass = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", @@ -1047,8 +1048,8 @@ for i = 2, 5 do sunlight_propagates = true, walkable = false, buildable_to = true, - groups = {snappy = 3, flammable = 3, flora = 1, - attached_node = 1, not_in_creative_inventory=1}, + groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, + not_in_creative_inventory=1, dry_grass = 1}, drop = "default:dry_grass_1", sounds = default.node_sound_leaves_defaults(), selection_box = { From 80664f9f8af5ec3fee09c5c41ad3f1ca77bdf1bb Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 15 Apr 2016 20:55:56 -0700 Subject: [PATCH 28/48] Doors: Use LBM instead of ABM to convert doors. This works much more efficiently to replace old style doors. --- mods/doors/init.lua | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 9e099939..90ddcc3d 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -203,11 +203,10 @@ function doors.register(name, def) end -- replace old doors of this type automatically - minetest.register_abm({ + minetest.register_lbm({ + name = ":doors:replace_" .. name:gsub(":", "_"), nodenames = {name.."_b_1", name.."_b_2"}, - interval = 7.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) + action = function(pos, node) local l = tonumber(node.name:sub(-1)) local meta = minetest.get_meta(pos) local h = meta:get_int("right") + 1 From ab7b7c7504eb67ab36055b0138b7f3c44bc31c2f Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 16 Apr 2016 22:33:08 +0100 Subject: [PATCH 29/48] Flowers: Make flower spread a public function to enable override Remove search for 'group:flora_block' Enable flora spread on 'dirt with dry grass' --- mods/flowers/init.lua | 81 ++++++++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 35 deletions(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index 73a66bfa..d12982a2 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -71,45 +71,52 @@ end -- Flower spread +-- Public function to enable override by mods -minetest.register_abm({ - nodenames = {"group:flora"}, - neighbors = {"default:dirt_with_grass", "default:desert_sand"}, - interval = 13, - chance = 96, - action = function(pos, node) - pos.y = pos.y - 1 - local under = minetest.get_node(pos) - pos.y = pos.y + 1 - if under.name == "default:desert_sand" then - minetest.set_node(pos, {name = "default:dry_shrub"}) - return - elseif under.name ~= "default:dirt_with_grass" then - return - end +function flowers.flower_spread(pos, node) + pos.y = pos.y - 1 + local under = minetest.get_node(pos) + pos.y = pos.y + 1 + if under.name == "default:desert_sand" then + minetest.set_node(pos, {name = "default:dry_shrub"}) + return + elseif under.name ~= "default:dirt_with_grass" and + under.name ~= "default:dirt_with_dry_grass" then + return + end - local light = minetest.get_node_light(pos) + local light = minetest.get_node_light(pos) + if not light or light < 13 then + return + end + + local pos0 = vector.subtract(pos, 4) + local pos1 = vector.add(pos, 4) + if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 3 then + return + end + + local seedling = minetest.find_nodes_in_area_under_air(pos0, pos1, + {"default:dirt_with_grass", "default:dirt_with_dry_grass"}) + if #seedling > 0 then + seedling = seedling[math.random(#seedling)] + seedling.y = seedling.y + 1 + light = minetest.get_node_light(seedling) if not light or light < 13 then return end + minetest.set_node(seedling, {name = node.name}) + end +end - local pos0 = vector.subtract(pos, 4) - local pos1 = vector.add(pos, 4) - if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 3 or - #minetest.find_nodes_in_area(pos0, pos1, "group:flora_block") > 0 then - return - end - - local seedling = minetest.find_nodes_in_area_under_air(pos0, pos1, "default:dirt_with_grass") - if #seedling > 0 then - seedling = seedling[math.random(#seedling)] - seedling.y = seedling.y + 1 - light = minetest.get_node_light(seedling) - if not light or light < 13 then - return - end - minetest.set_node(seedling, {name = node.name}) - end +minetest.register_abm({ + nodenames = {"group:flora"}, + neighbors = {"default:dirt_with_grass", "default:dirt_with_dry_grass", + "default:desert_sand"}, + interval = 13, + chance = 96, + action = function(...) + flowers.flower_spread(...) end, }) @@ -156,7 +163,9 @@ minetest.register_node("flowers:mushroom_brown", { } }) --- mushroom spread and death + +-- Mushroom spread and death + minetest.register_abm({ nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"}, interval = 11, @@ -190,7 +199,9 @@ minetest.register_abm({ end }) --- these old mushroom related nodes can be simplified now + +-- These old mushroom related nodes can be simplified now + minetest.register_alias("flowers:mushroom_spores_brown", "flowers:mushroom_brown") minetest.register_alias("flowers:mushroom_spores_red", "flowers:mushroom_red") minetest.register_alias("flowers:mushroom_fertile_brown", "flowers:mushroom_brown") From e426f64993e4d7e19c7e752b25faba3dd9d2bc91 Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 6 Apr 2016 19:43:54 +0100 Subject: [PATCH 30/48] Fire: Higher chance of removing flammable nodes Flammable nodes burn away quicker --- mods/fire/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/fire/init.lua b/mods/fire/init.lua index 15f71560..457f6b5e 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -263,7 +263,7 @@ else minetest.remove_node(p0) return end - if math.random(1, 4) == 1 then + if math.random(1, 3) == 1 then -- remove flammable nodes around flame local node = minetest.get_node(p) local def = minetest.registered_nodes[node.name] From fa43bd8a5668f8ae38bc3f61ce628874014f9b5d Mon Sep 17 00:00:00 2001 From: KevDoy Date: Mon, 11 Apr 2016 23:52:56 -0700 Subject: [PATCH 31/48] Default: New heart texture Similar to before, add symmetry and slightly more rounded off --- mods/default/README.txt | 4 +++- mods/default/textures/heart.png | Bin 293 -> 14830 bytes 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index 975f58a1..15a7f5af 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -144,7 +144,6 @@ BlockMen (CC BY-SA 3.0): default_mineral_mese.png default_meselamp.png bubble.png - heart.png gui_*.png sofar (CC BY-SA 3.0): @@ -222,3 +221,6 @@ Mito551 (sounds) (CC BY-SA): default_dirt_footstep.1.ogg default_dirt_footstep.2.ogg default_glass_footstep.ogg + +KevDoy (CC BY-SA 3.0) + heart.png diff --git a/mods/default/textures/heart.png b/mods/default/textures/heart.png index fb8dcc7ed6249ca05ebbd019b8d41c9059baab43..6d4e228930dd00bcff09f16a30e2873ce1c7feb3 100644 GIT binary patch literal 14830 zcmeI3TWl0n7{^ar0a-$AF%fG5OsB2X%kEsdTiS7#UUmz+%FxoTp^b{2&Yta#?9Plc zvvgZA78(*suqZqTL?cFHObkR+u3BkGkl+(R6Q%JI69n~zMq-rufM;gg-Ij}TLP&f# zo9u1QZ@%-L-~8vi&DOTnE9bi&Z~*}3N5Y|Y^j%`V@1Bi5mt4Lop|81mxXT1!-o5s_ z0PK0=egNvKm1w8cDXtP^E#;A7S`YMOQaYjm@Hb?1NnQ^vst5KeYJk4<>2aD;VgY)s zPh>?s2op+pzyR?P~#M7Blp@tC6bF`?%lz9I&bWN14N08v-ucc8CW0ED^3Lle&xMrjzq*zHwy^zt>UT50eH57tc zQZrBosMDIMjzm$2sHP>UGK_=*G+L2IQDQ=!%*FY-9^PHUOOo5md%bQc4taNvkFBk( zW8*b4FHb8G(&V%qu&EL;{1UB(f^J_ad0VCI7zn5mYDKc|sQ}G6T{_1*?O-L-+2hN2 z7QGnG{>&p?|Bd8{CshT>=AE~{`jw~Y??eD+`VZ&Gpg3yN~?F+q~EYn1Iw!s+Jv8Zs%&} zs`MowlKby@&%ve^xB4UlHua+Ga%*=NGr3sC-V~=+>u0X>;dg*(yC^y@dkpQ)Xq#tp z`~0LY)YP4POCg~!&unb_qBwa)omH{l7q>JdnGJpk>bP-)x2C!g~ zE}{#|02WNrMRZ{qz=BD-h%PJxSTIQ!(S>CI3nu9zy08pj!6aQo7nT7mn52v7!ZLsb zlXMYXSO&0Qk}jeP%K#Sqe@K@r|M(wN(KCMrdbkh%kop=u7)Z(Cb`gMqDgXwD0Jw4$ zeg6tTng!suZUBT`04&sYJbQ8l00oVaP*XHB_Sw#n$BWjKY&l+9es1tw_cm9-$rE23 zK5(#PRmGa|s*RhXV=wRBa&Sz6TJLLL(%gdJ*~-$F^rBPrvL`lNmP^M+N8yo+-yJpM zs}_9RJzT~uX?=Rv>A_mPvTXFgZllrlZTe`*juX|J3WH6>Bl|1UhmO75ai-|~d9KE) zGwi9^fg|3pibvy%`L6JLiO)w~{pFAG4@7<6MB)Cy7uQDqnpJQfG|ao=3;+En6MuW% z(DnyEnfTMcutH4UQ@qY~wyg6<&`>m&sccREG^hIT;HB2grRIZ$-xqtID{U@IY%|LX zqJ#TREq#4_;{3&d(B8tzrAI%UbF5(2a@Tzm&ny{!s;&G&bEt7a%b7**oPVK>Te0{N zYU@x_Rgl?UvGM{nym|MbH%Go1?cZ3qC^^P2+7lT)eb?`A6<+=5mE%R=v7J9tYZDKj Qw4ca~w5$&8Z|>gw51Z)1CIA2c delta 277 zcmaD?yp(BzWIZzj1A~Sxe=v|r4)6(a1=9Z+7}hf|%x7T80J7ub{|5#Ax3~Y##nsQi zkifw3&)odKhQ=cqng3E!(^y!(1J#(D{}UB`&%m&sfnht4TVKD~-2A1A$}B0V!vX^L z85qtpFmy05G%zp}Ffar#FsupN4>XE_u_VYZxSqk`*^M+HufWsAF+}2WZ@0Txi-HJC zy_0~-47KII=NARIY`?bdRq0{PsApmigm32kGdXzwvB{$^(af{gUB5otQ6`ylVSdPC zCZ(dC6>IgpX4@V({M2>&->-TPU(b!R5zM(@kkFRHYou?-{f1+y%T0crtF^8y=RUF5 YS2I6+wT;hV6VP%7Pgg&ebxsLQ0Gz;PumAu6 From 16fe1efcd82a8274989962bf19f7d6f7befd3cfe Mon Sep 17 00:00:00 2001 From: kilbith Date: Thu, 21 Apr 2016 12:38:44 +0200 Subject: [PATCH 32/48] Flowers: Fix waterlily node's duplication with stack of 1 --- mods/flowers/init.lua | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index d12982a2..2d8c93e4 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -226,6 +226,7 @@ minetest.register_node("flowers:waterlily", { sunlight_propagates = true, groups = {snappy = 3, flower = 1}, sounds = default.node_sound_leaves_defaults(), + node_placement_prediction = "", node_box = { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -0.46875, 0.5} @@ -235,12 +236,18 @@ minetest.register_node("flowers:waterlily", { fixed = {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5} }, - on_place = function(itemstack, _, pointed_thing) + 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 player_name = placer:get_player_name() + if def and def.liquidtype == "source" and minetest.get_item_group(node, "water") > 0 then - minetest.set_node(pos, {name = "flowers:waterlily", param2 = math.random(0, 3)}) + if not minetest.is_protected(pos, player_name) then + minetest.set_node(pos, {name = "flowers:waterlily", param2 = math.random(0, 3)}) + else + minetest.chat_send_player(player_name, "This area is protected") + end if not minetest.setting_getbool("creative_mode") then itemstack:take_item() return itemstack From f32a3ff57c00fcba0ec5bbfb85888fca67d614c1 Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 22 Apr 2016 16:20:47 +0100 Subject: [PATCH 33/48] Farming: Add quiet sounds to seeds --- mods/farming/api.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/farming/api.lua b/mods/farming/api.lua index a0c1992f..68f7be75 100644 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -220,9 +220,14 @@ farming.register_plant = function(name, def) fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, }, fertility = def.fertility, + sounds = default.node_sound_dirt_defaults({ + dug = {name = "default_grass_footstep", gain = 0.2}, + place = {name = "default_place_node", gain = 0.25}, + }), + on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, mname .. ":seed_" .. pname) - end + end, }) -- Register harvest From 54b87e955de6f6e5f692d9131fcf72e4baaf7986 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 15 Apr 2016 19:21:45 -0700 Subject: [PATCH 34/48] TNT: Add on_blast to all nodes with an inventory Adds a minor helper function that allows efficient retrieval of several inventories from a node inventory. We use this helper to quickly retrieve the items in chests, vessel shelves, book shelves and furnaces, and return these with the nodes itself to the TNT caller. The TNT caller then performs the entity physics, and we don't need to do anything else. We disable TNT doing anything with bones. We expose a bug in the code that drops the items - metadata was lost entirely. This patch corrects that by properly copying the metadata and creating the drops list inclusive metadata. --- game_api.txt | 17 +++++++++++++++++ mods/bones/init.lua | 2 ++ mods/default/functions.lua | 15 +++++++++++++++ mods/default/furnace.lua | 9 +++++++++ mods/default/nodes.lua | 14 ++++++++++++++ mods/tnt/init.lua | 4 +++- mods/vessels/init.lua | 7 +++++++ 7 files changed, 67 insertions(+), 1 deletion(-) diff --git a/game_api.txt b/game_api.txt index bdb2450b..02ee58e0 100644 --- a/game_api.txt +++ b/game_api.txt @@ -241,6 +241,23 @@ tnt.register_tnt(definition) ^ Ignite TNT at position + +To make dropping items from node inventories easier, you can use the +following helper function from 'default': + +default.get_inventory_drops(pos, inventory, drops) + +^ Return drops from node inventory "inventory" in drops. + +* `pos` - the node position +* `inventory` - the name of the inventory (string) +* `drops` - an initialized list + +The function returns no values. The drops are returned in the `drops` +parameter, and drops is not reinitialized so you can call it several +times in a row to add more inventory items to it. + + Screwdriver API --------------- diff --git a/mods/bones/init.lua b/mods/bones/init.lua index afa56eca..661bbab8 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -123,6 +123,8 @@ minetest.register_node("bones:bones", { return true end end, + on_blast = function(pos) + end, }) local function may_replace(pos, player) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index c0ea1f5b..d0164cd6 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -110,6 +110,21 @@ minetest.register_abm({ }) +-- +-- optimized helper to put all items in an inventory into a drops list +-- +function default.get_inventory_drops(pos, inventory, drops) + local inv = minetest.get_meta(pos):get_inventory() + local n = #drops + for i = 1, inv:get_size(inventory) do + local stack = inv:get_stack(inventory, i) + if stack:get_count() > 0 then + drops[n+1] = stack:to_table() + n = n + 1 + end + end +end + -- -- Papyrus and cactus growing -- diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua index 4fb2071a..3047dc41 100644 --- a/mods/default/furnace.lua +++ b/mods/default/furnace.lua @@ -260,6 +260,15 @@ minetest.register_node("default:furnace", { local timer = minetest.get_node_timer(pos) timer:start(1.0) end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "src", drops) + default.get_inventory_drops(pos, "fuel", drops) + default.get_inventory_drops(pos, "dst", drops) + drops[#drops+1] = "default:furnace" + minetest.remove_node(pos) + return drops + end, allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_move = allow_metadata_inventory_move, diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 36ae5861..506dd0ad 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1474,6 +1474,13 @@ minetest.register_node("default:chest", { " takes " .. stack:get_name() .. " from chest at " .. minetest.pos_to_string(pos)) end, + 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, }) minetest.register_node("default:chest_locked", { @@ -1597,6 +1604,13 @@ minetest.register_node("default:bookshelf", { minetest.log("action", player:get_player_name() .. " takes stuff from bookshelf at " .. minetest.pos_to_string(pos)) end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "books", drops) + drops[#drops+1] = "default:bookshelf" + minetest.remove_node(pos) + return drops + end, }) local function register_sign(material, desc, def) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index a8deeb0c..66b01f1a 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -55,7 +55,9 @@ local function eject_drops(drops, pos, radius) item:get_count(), item:get_stack_max())) rand_pos(pos, drop_pos, radius) - local obj = minetest.add_item(drop_pos, item:get_name() .. " " .. take) + local dropitem = ItemStack(item) + dropitem:set_count(take) + local obj = minetest.add_item(drop_pos, dropitem) if obj then obj:get_luaentity().collect = true obj:setacceleration({x = 0, y = -10, z = 0}) diff --git a/mods/vessels/init.lua b/mods/vessels/init.lua index d5378919..165efbd5 100644 --- a/mods/vessels/init.lua +++ b/mods/vessels/init.lua @@ -48,6 +48,13 @@ minetest.register_node("vessels:shelf", { minetest.log("action", player:get_player_name() .. " takes stuff from vessels shelf at ".. minetest.pos_to_string(pos)) end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "vessels", drops) + drops[#drops+1] = "vessels:shelf" + minetest.remove_node(pos) + return drops + end, }) minetest.register_craft({ From 386dcdef06652fc0d9c5223936b1046c9629a86a Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 16 Apr 2016 10:22:37 -0700 Subject: [PATCH 35/48] TNT: Whitespace cleanup --- mods/tnt/init.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 66b01f1a..f8b59ab2 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -90,7 +90,7 @@ local function destroy(drops, npos, cid, c_air, c_fire, on_blast_queue, ignore_p if not ignore_protection and minetest.is_protected(npos, "") then return cid end - + local def = cid_data[cid] if not def then @@ -319,7 +319,7 @@ minetest.register_node("tnt:gunpowder", { }, groups = {dig_immediate = 2, attached_node = 1, connect_to_raillike = minetest.raillike_group("gunpowder")}, sounds = default.node_sound_leaves_defaults(), - + on_punch = function(pos, node, puncher) if puncher:get_wielded_item():get_name() == "default:torch" then tnt.burn(pos) @@ -440,7 +440,7 @@ function tnt.register_tnt(def) local tnt_side = def.tiles.side or def.name .. "_side.png" local tnt_burning = def.tiles.burning or def.name .. "_top_burning_animated.png" if not def.damage_radius then def.damage_radius = def.radius * 2 end - + minetest.register_node(":" .. name, { description = def.description, tiles = {tnt_top, tnt_bottom, tnt_side}, @@ -457,15 +457,15 @@ function tnt.register_tnt(def) tnt.boom(pos, def) end) end, - mesecons = {effector = - {action_on = + mesecons = {effector = + {action_on = function(pos) tnt.boom(pos, def) end } }, }) - + minetest.register_node(":" .. name .. "_burning", { tiles = { { From d6c33da3554051b3e326d3b78ef3012f3746fb3a Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 16 Apr 2016 12:00:17 -0700 Subject: [PATCH 36/48] TNT: Damage mobs, knock back players We apply punch damage to mobs caught in the blast radius, as this code previously only hurt players. We "move" players back 1 node if they're caught in the blast, and slightly up. We can't "eject" players due to missing API code to support that, unfortunately. --- mods/tnt/init.lua | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index f8b59ab2..b48a56b9 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -135,16 +135,29 @@ local function entity_physics(pos, radius) local objs = minetest.get_objects_inside_radius(pos, radius) for _, obj in pairs(objs) do local obj_pos = obj:getpos() - local obj_vel = obj:getvelocity() local dist = math.max(1, vector.distance(pos, obj_pos)) - if obj_vel ~= nil then + local damage = (4 / dist) * radius + if obj:is_player() then + -- currently the engine has no method to set + -- player velocity. See #2960 + -- instead, we knock the player back 1.0 node, and slightly upwards + local dir = vector.normalize(vector.subtract(obj_pos, pos)) + local moveoff = vector.multiply(dir, dist + 1.0) + local newpos = vector.add(pos, moveoff) + local newpos = vector.add(newpos, {x = 0, y = 0.2, z = 0}) + obj:setpos(newpos) + + obj:set_hp(obj:get_hp() - damage) + else + local obj_vel = obj:getvelocity() obj:setvelocity(calc_velocity(pos, obj_pos, obj_vel, radius * 10)) + obj:punch(obj, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage}, + }, nil) end - - local damage = (4 / dist) * radius - obj:set_hp(obj:get_hp() - damage) end end From 8b384fb257f144212a17692bd91cf77b94d5c963 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 16 Apr 2016 12:13:13 -0700 Subject: [PATCH 37/48] TNT: randomly vary ejecting velocity We add a +/- 0.5 random value to the velocity vector of ejecting nodes. I've spotted a lot of nodes going exactly straight up if blowing up sand above TNT. The extra variation looks less artificial. --- mods/tnt/init.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index b48a56b9..1c92c5e4 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -123,6 +123,13 @@ local function calc_velocity(pos1, pos2, old_vel, power) -- Add old velocity vel = vector.add(vel, old_vel) + -- randomize it a bit + vel = vector.add(vel, { + x = math.random() - 0.5, + y = math.random() - 0.5, + z = math.random() - 0.5, + }) + -- Limit to terminal velocity dist = vector.length(vel) if dist > 250 then From 682d79b82a7e23bc021d02c46970291fed9b42cd Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sun, 17 Apr 2016 20:52:45 -0700 Subject: [PATCH 38/48] TNT: make tnt:burning a falling node. This allows TNT to be used for e.g. traps (drop it from the ceiling) or weird tnt effects with other explosions. --- mods/tnt/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 1c92c5e4..6e51feb6 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -502,6 +502,7 @@ function tnt.register_tnt(def) light_source = 5, drop = "", sounds = default.node_sound_wood_defaults(), + groups = {falling_node = 1}, on_timer = function(pos, elapsed) tnt.boom(pos, def) end, @@ -510,6 +511,7 @@ function tnt.register_tnt(def) on_construct = function(pos) minetest.sound_play("tnt_ignite", {pos = pos}) minetest.get_node_timer(pos):start(4) + nodeupdate(pos) end, }) end From 7a892c70e653057418390de4c9c670a499f8ba19 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sun, 17 Apr 2016 21:04:50 -0700 Subject: [PATCH 39/48] TNT: self-start boom removal timer. --- mods/tnt/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 6e51feb6..5bf14a16 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -299,7 +299,6 @@ end function tnt.boom(pos, def) minetest.sound_play("tnt_explode", {pos = pos, gain = 1.5, max_hear_distance = 2*64}) minetest.set_node(pos, {name = "tnt:boom"}) - minetest.get_node_timer(pos):start(0.5) local drops = tnt_explode(pos, def.radius, def.ignore_protection, def.ignore_on_blast) entity_physics(pos, def.damage_radius) @@ -316,6 +315,9 @@ minetest.register_node("tnt:boom", { walkable = false, drop = "", groups = {dig_immediate = 3}, + on_construct = function(pos) + minetest.get_node_timer(pos):start(0.5) + end, on_timer = function(pos, elapsed) minetest.remove_node(pos) end, From f62afa02b7770d90d0e93518795e85cfa8934941 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 22 Apr 2016 22:24:19 -0700 Subject: [PATCH 40/48] TNT: lower smoke particle count and speed. The effect is similar, and the reduction in particles is a small boost in responsiveness. To compensate, I've lowered the spawner time and expiration length as well. --- mods/tnt/init.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 5bf14a16..3ef8a844 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -170,16 +170,16 @@ end local function add_effects(pos, radius, drops) minetest.add_particlespawner({ - amount = 128, - time = 1, + amount = 64, + time = 0.5, minpos = vector.subtract(pos, radius / 2), maxpos = vector.add(pos, radius / 2), - minvel = {x = -20, y = -20, z = -20}, - maxvel = {x = 20, y = 20, z = 20}, + minvel = {x = -10, y = -10, z = -10}, + maxvel = {x = 10, y = 10, z = 10}, minacc = vector.new(), maxacc = vector.new(), minexptime = 1, - maxexptime = 3, + maxexptime = 2.5, minsize = 8, maxsize = 16, texture = "tnt_smoke.png", From 5cd4b5a23192e3a4e16b87ecea4a732cea36115d Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 25 Apr 2016 17:51:38 -0700 Subject: [PATCH 41/48] TNT: make tnt:boom visual a particle, and larger We reuse the tnt:boom texture for a particle that is added by the on_construct() of tnt:boom, and has a short expiry time (0.2sec). It is 3 nodes larged, centered on the explosion. We then make tnt:boom airlike so it doesn't have a texture, and it's the thing that emits lots of light (we could even make it exist a bit longer). The nice thing about particles is that the client is less susceptible to lag and will always remove them as fast as possible, so this makes the visual more constant and responsive. --- mods/tnt/init.lua | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 3ef8a844..4330c4fc 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -309,14 +309,24 @@ function tnt.boom(pos, def) end minetest.register_node("tnt:boom", { - drawtype = "plantlike", - tiles = {"tnt_boom.png"}, + drawtype = "airlike", light_source = default.LIGHT_MAX, walkable = false, drop = "", groups = {dig_immediate = 3}, on_construct = function(pos) - minetest.get_node_timer(pos):start(0.5) + minetest.add_particle({ + pos = pos, + velocity = vector.new(), + acceleration = vector.new(), + expirationtime = 0.4, + size = 30, + collisiondetection = false, + vertical = false, + texture = "tnt_boom.png", + playername = nil, + }) + minetest.get_node_timer(pos):start(0.4) end, on_timer = function(pos, elapsed) minetest.remove_node(pos) From dc7cbdd5ab9efa83327f057a4e4376ffacab6c0e Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Mon, 28 Mar 2016 20:14:35 +0100 Subject: [PATCH 42/48] Beds: Quicker saves with tidy output Tweaked the beds.save_spawns() function to compile list then output to file with shortened co-ordinates containing 1 decimal place --- mods/beds/spawns.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/beds/spawns.lua b/mods/beds/spawns.lua index f3980a7a..48b8a669 100644 --- a/mods/beds/spawns.lua +++ b/mods/beds/spawns.lua @@ -41,10 +41,12 @@ function beds.save_spawns() if not beds.spawn then return end + local data = {} local output = io.open(org_file, "w") - for i, v in pairs(beds.spawn) do - output:write(v.x .. " " .. v.y .. " " .. v.z .. " " .. i .. "\n") + for k, v in pairs(beds.spawn) do + table.insert(data, string.format("%.1f %.1f %.1f %s\n", v.x, v.y, v.z, k)) end + output:write(table.concat(data)) io.close(output) end From fafbe2c26850b78e129767f7d81704af19e766a2 Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 11 Apr 2016 02:11:17 +0100 Subject: [PATCH 43/48] Default: New grass and grass_side textures Derived from Casimir's Voxelgarden texture --- mods/default/textures/default_grass.png | Bin 777 -> 377 bytes mods/default/textures/default_grass_side.png | Bin 490 -> 771 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/textures/default_grass.png b/mods/default/textures/default_grass.png index 7c5a8b82fbfb27460f92b482a1841e5dcb0a398b..0181fabda9fbaba45d8f763107bf0ad88e2f81c5 100644 GIT binary patch delta 334 zcmV-U0kQsx2KfSz8EXRo001a04^sdD09Q~iDO8#`khJY^g` zW*t3f9X@IuKWiR9Z5}~xA3|^+LvbKPb09@^AV+v1NO>Yjdm>7FBT9ZFOMfIxfh0|X zBu<1SPlhE?i6&BtC(MAOft87gofOL>u_KYLI^Yw zOz6OLy4~&FRW9>mIKtBtKm7Q9(Mlk!B-t943C=G)=_VqM1%IDEb>wS6;pL;lf)Zj-jTB35z;j0+A{Whg~?$|sS zqDl~%DSuK;zPG4;=JLx88w=$AF{7&;=YJ=pkw_;fHwsq`NtM+zDt>Jfqa*6z4Q!M zN4nL-rJ!#-vdB|>6Buj9+zVDKL*F{?zE3$kWd!d@zcB#Zf7mdLj`kMtPEeK!a#kaF zDBmU2^?yj)OeC9#)2|)lIWW!+=@!fihHKC2kdXj16HzIU#mW)@tpr9(kdojQbfIWY z6Un4eiK6>w=IwQ$tvc${#O^~u-#hgAwPX93Go3s(7R*R=q?q)K4S`t+E-yXl-mpDH zjGaf9it04s!-AArbNO@NR!!W_6V+>n>m4>zG<9c>BH-OjeHwWE`NljhL=w8Uk@eOh zhk8V7uth{%L};t&+L^cC8}6S9u8qfT4LVXNBT3epq4AhpQXfZTxy!JHKoQEY59Di$A2pAQiQ^|jtx?`^0s&VK500005^~{;#Bt$-#4QpCap1%&fP^?CP9zRIL%^62B?@-pc)dG2J>6X# z+BWpHyGmWZ?<=`|Z%?nkKS4zJ=gEq8$5Blz!+9i)imilUnSXHJ(Ct>79QIgmXtx}3 zP+YTVIX@1>L8&(^0ArsBtBkRNW)P99;%ZXf0E9ka){BI(LR@FWKv-q^v&i}^;%dQn zmW{VOVVSOqeQQ{}42*rk0KEQtO|xnF<*PsEDQ423wA&Q`{b}Ug0X^c4b{Z*;QrA(4N6#L09-9tZ}|25XLHTqhGhbH_~8E0 zK0v);=}#j+e|b3n@Z(!^;Nj!%p6*}H-JeAseRH@EAO-}O%|3bOplS@hv;6eM?=${) zZr|HG5C?T<@vY;>&!5cheEROedXaei?bDgu{p>w_XMYLHg!P8Si-0)L4DFU9jY>|+ zwdzUPXLY{C88K?kX0e zUIkfqmNaTHuM%8sXt%4fD<6Eci}OP0bNT9dLUZvUhD-{IpBS7sv^&Mlah=IgS-l>y z+j|XAIM>%4m!ZZ%*}m0~#$ure7$@YYq@bixF*jB))|Kwf)bZ-5C#S+)3@l!j9k>kI kR>JaRL{)L#uz9oQUm;;s_zs+^$^ZZW07*qoM6N<$f{f2%OaK4? delta 419 zcmV;U0bKrr2I>QlQGeeE3>Og#h1gh0EEBYtk-)#zQl*+ z01Bz8sge8ueg^uKd4trv0I8{HEFmEzDkO-YKr{#}B!m*+93YV#+xfB2-rL)wIU0C{ ze9~w%qiIIm-`TE|5J&^zh6Z5#eMy`ul#xub1#w5y)QXjLxPMiJ_h5`9pB6|dp|xeO zc}2PK6f;M=t69!V7Sn<-)?AG(E9;O_;yoxKP|+HjcVlGdPQY}OvvI4*S|}+c6wYJk z1vannq9W-UqK?7lCGm|0L86FK%_LhQk3V0agy8bS70>s+?oyL(hs3EOYBliQbN=p< zgGbqJlxn>7oPT`0plKwsfAn8J{oMnO`E*9o(G*9PAl1Bhc-VJ`1zoKGmg6@w zTBDM;kAL>fw;UPg1;7dL9vI2ZHo?&G^2unY{iOmJ9z6Ti8w|1szFkDX( z1aJ>Ht#uo?S-)_=44423unsf;1)SAd0R(kP?SHf6e;m|5`)jTN;195&k3>BVs4V~h N002ovPDHLkV1iJw!zKU# From 1a6298958e14782eca4feb51ef623479ddaaf9c6 Mon Sep 17 00:00:00 2001 From: Foz Date: Sun, 24 Apr 2016 18:10:46 -0400 Subject: [PATCH 44/48] Default: Add function 'node_sound_gravel_defaults()' --- mods/default/functions.lua | 12 ++++++++++++ mods/default/nodes.lua | 5 +---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index d0164cd6..7e594b31 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -49,6 +49,18 @@ function default.node_sound_sand_defaults(table) return table end +function default.node_sound_gravel_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_gravel_footstep", gain = 0.5} + table.dug = table.dug or + {name = "default_gravel_footstep", gain = 1.0} + table.place = table.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(table) + return table +end + function default.node_sound_wood_defaults(table) table = table or {} table.footstep = table.footstep or diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 506dd0ad..9af3131e 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -353,10 +353,7 @@ minetest.register_node("default:gravel", { description = "Gravel", tiles = {"default_gravel.png"}, groups = {crumbly = 2, falling_node = 1}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name = "default_gravel_footstep", gain = 0.5}, - dug = {name = "default_gravel_footstep", gain = 1.0}, - }), + sounds = default.node_sound_gravel_defaults(), drop = { max_items = 1, items = { From f14b41115705647a33dbb874c5b0fcab73cd5376 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Tue, 26 Apr 2016 23:08:00 -0700 Subject: [PATCH 45/48] TNT: Fix multiple explosions erasing drops Any second explosion near a first TNT explosion will punch all entities found nearby, including item drops. This causes the item pickup code to think the item was picked up, but by a `nil` player, thus removing the item. We query for the immortal entity group, and if the item is in the immortal group, do not punch the item. --- mods/tnt/init.lua | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 4330c4fc..d61cbf13 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -160,10 +160,12 @@ local function entity_physics(pos, radius) local obj_vel = obj:getvelocity() obj:setvelocity(calc_velocity(pos, obj_pos, obj_vel, radius * 10)) - obj:punch(obj, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = damage}, - }, nil) + if not obj:get_armor_groups().immortal then + obj:punch(obj, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage}, + }, nil) + end end end end From 098ea0d10a181ea1bcc98d72766969b5c94cd945 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Wed, 27 Apr 2016 20:15:52 -0700 Subject: [PATCH 46/48] TNT: Allow mods to override entity physics. Introduces an `on_blast(luaobj, damage)` callback that mods can attach to an entity def. The function will get called with the damage that TNT would make. The function should return three values: bool do_damage, bool do_knockback, table drops do_damage allows the mod to tell the TNT code to perform damage on the entity for the mod. The mod code should not do anything with the entity HP. The entity should not be immortal. If false, then the entity will not be damaged by the TNT mod. do_knockback allows the mod to tell the TNT mod to perform an entity knockback effect. If false, no knockback effect is applied to the entity. the drops table is a list of items to drop. It may be nil. E.g. { "wool:red" }. I've documented both on_blast() API methods in game_api.txt. It is a better place than lua_api.txt. --- game_api.txt | 22 ++++++++++++++++++++++ mods/tnt/init.lua | 39 +++++++++++++++++++++++++++++---------- 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/game_api.txt b/game_api.txt index 02ee58e0..8e621c87 100644 --- a/game_api.txt +++ b/game_api.txt @@ -258,6 +258,28 @@ parameter, and drops is not reinitialized so you can call it several times in a row to add more inventory items to it. +`on_blast` callbacks: + +Both nodedefs and entitydefs can provide an `on_blast()` callback + +`nodedef.on_blast(pos, intensity)` +^ Allow drop and node removal overriding +* `pos` - node position +* `intensity` - TNT explosion measure. larger or equal to 1.0 +^ Should return a list of drops (e.g. {"default:stone"}) +^ Should perform node removal itself. If callback exists in the nodedef +^ then the TNT code will not destroy this node. + +`entitydef.on_blast(luaobj, damage)` +^ Allow TNT effects on entities to be overridden +* `luaobj` - LuaEntityRef of the entity +* `damage` - suggested HP damage value +^ Should return a list of (bool do_damage, bool do_knockback, table drops) +* `do_damage` - if true then TNT mod wil damage the entity +* `do_knockback` - if true then TNT mod will knock the entity away +* `drops` - a list of drops, e.g. {"wool:red"} + + Screwdriver API --------------- diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index d61cbf13..d3efd7b8 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -138,7 +138,7 @@ local function calc_velocity(pos1, pos2, old_vel, power) return vel end -local function entity_physics(pos, radius) +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() @@ -157,14 +157,31 @@ local function entity_physics(pos, radius) obj:set_hp(obj:get_hp() - damage) else - local obj_vel = obj:getvelocity() - obj:setvelocity(calc_velocity(pos, obj_pos, - obj_vel, radius * 10)) - if not obj:get_armor_groups().immortal then - obj:punch(obj, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = damage}, - }, nil) + local do_damage = true + local do_knockback = true + local entity_drops = {} + local luaobj = obj:get_luaentity() + local objdef = minetest.registered_entities[luaobj.name] + + if objdef and objdef.on_blast then + do_damage, do_knockback, entity_drops = objdef.on_blast(luaobj, damage) + end + + if do_knockback then + local obj_vel = obj:getvelocity() + obj:setvelocity(calc_velocity(pos, obj_pos, + obj_vel, radius * 10)) + end + if do_damage then + if not obj:get_armor_groups().immortal then + obj:punch(obj, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage}, + }, nil) + end + end + for _, item in ipairs(entity_drops) do + add_drop(drops, item) end end end @@ -303,7 +320,9 @@ function tnt.boom(pos, def) minetest.set_node(pos, {name = "tnt:boom"}) local drops = tnt_explode(pos, def.radius, def.ignore_protection, def.ignore_on_blast) - entity_physics(pos, def.damage_radius) + -- append entity drops + entity_physics(pos, def.damage_radius, drops) + if not def.disable_drops then eject_drops(drops, pos, def.radius) end From 12c763a6c76dee4b11307f366527866349a01b6b Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Wed, 27 Apr 2016 00:26:18 -0700 Subject: [PATCH 47/48] TNT: Combine adjacent TNT into the explosion This uses a vmanip to count adjacent tnt nodes and explodes them all at once, using an inverse square law to recalculate the radius. The maximum explosion becomes 125 nodes of tnt yielding a radius of 15 nodes, which does not break my machine and makes it return in under a second. This makes both bigger explosions and less stability issues. The drop code has been simplified and now drops at all times a reasonable amount of drops, never blanketing the area with drops, even at the larges explosion level. Particles are scaled up according to explosion size as well - a bigger explosion will show bigger particles. To scale the tnt:boom particle, we move it to the _effects() function. --- mods/tnt/init.lua | 79 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 24 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index d3efd7b8..f939d612 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -49,9 +49,8 @@ local function eject_drops(drops, pos, radius) local drop_pos = vector.new(pos) for _, item in pairs(drops) do local count = item:get_count() - local take_est = math.log(count * count) + math.random(0,4) - 2 while count > 0 do - local take = math.max(1,math.min(take_est, + local take = math.max(1,math.min(radius * radius, item:get_count(), item:get_stack_max())) rand_pos(pos, drop_pos, radius) @@ -188,6 +187,16 @@ local function entity_physics(pos, radius, drops) end local function add_effects(pos, radius, drops) + minetest.add_particle({ + pos = pos, + velocity = vector.new(), + acceleration = vector.new(), + expirationtime = 0.4, + size = radius * 10, + collisiondetection = false, + vertical = false, + texture = "tnt_boom.png", + }) minetest.add_particlespawner({ amount = 64, time = 0.5, @@ -199,8 +208,8 @@ local function add_effects(pos, radius, drops) maxacc = vector.new(), minexptime = 1, maxexptime = 2.5, - minsize = 8, - maxsize = 16, + minsize = radius * 3, + maxsize = radius * 5, texture = "tnt_smoke.png", }) @@ -230,8 +239,8 @@ local function add_effects(pos, radius, drops) maxacc = {x = 0, y = -10, z = 0}, minexptime = 0.8, maxexptime = 2.0, - minsize = 2, - maxsize = 6, + minsize = radius * 0.66, + maxsize = radius * 2, texture = texture, collisiondetection = true, }) @@ -251,6 +260,40 @@ end local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) local pos = vector.round(pos) + -- scan for adjacent TNT nodes first, and enlarge the explosion + local vm1 = VoxelManip() + local p1 = vector.subtract(pos, 2) + local p2 = vector.add(pos, 2) + local minp, maxp = vm1:read_from_map(p1, p2) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm1:get_data() + local count = 0 + local c_tnt = minetest.get_content_id("tnt:tnt") + 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") + + for z = pos.z - 2, pos.z + 2 do + for y = pos.y - 2, pos.y + 2 do + local vi = a:index(pos.x - 2, y, z) + for x = pos.x - 2, pos.x + 2 do + local cid = data[vi] + if cid == c_tnt or cid == c_tnt_boom or cid == c_tnt_burning then + count = count + 1 + data[vi] = c_air + end + vi = vi + 1 + end + end + end + + vm1:set_data(data) + vm1:write_to_map() + + -- recalculate new radius + radius = math.floor(radius * math.pow(count, 1/3)) + + -- perform the explosion local vm = VoxelManip() local pr = PseudoRandom(os.time()) local p1 = vector.subtract(pos, radius) @@ -262,7 +305,6 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) local drops = {} local on_blast_queue = {} - local c_air = minetest.get_content_id("air") local c_fire = minetest.get_content_id("fire:basic_flame") for z = -radius, radius do for y = -radius, radius do @@ -312,21 +354,21 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) end end - return drops + return drops, radius end function tnt.boom(pos, def) minetest.sound_play("tnt_explode", {pos = pos, gain = 1.5, max_hear_distance = 2*64}) minetest.set_node(pos, {name = "tnt:boom"}) - local drops = tnt_explode(pos, def.radius, def.ignore_protection, + local drops, radius = tnt_explode(pos, def.radius, def.ignore_protection, def.ignore_on_blast) -- append entity drops - entity_physics(pos, def.damage_radius, drops) - + local damage_radius = (radius / def.radius) * def.damage_radius + entity_physics(pos, damage_radius, drops) if not def.disable_drops then - eject_drops(drops, pos, def.radius) + eject_drops(drops, pos, radius) end - add_effects(pos, def.radius, drops) + add_effects(pos, radius, drops) end minetest.register_node("tnt:boom", { @@ -336,17 +378,6 @@ minetest.register_node("tnt:boom", { drop = "", groups = {dig_immediate = 3}, on_construct = function(pos) - minetest.add_particle({ - pos = pos, - velocity = vector.new(), - acceleration = vector.new(), - expirationtime = 0.4, - size = 30, - collisiondetection = false, - vertical = false, - texture = "tnt_boom.png", - playername = nil, - }) minetest.get_node_timer(pos):start(0.4) end, on_timer = function(pos, elapsed) From acafe5ca86532aeefad44370b3f63bde5e805290 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sat, 2 Jan 2016 12:28:07 +0000 Subject: [PATCH 48/48] Add give_initial_items API --- game_api.txt | 77 +++++++++++++++++++++++--------- minetest.conf.example | 3 +- mods/give_initial_stuff/init.lua | 54 +++++++++++++++++----- 3 files changed, 101 insertions(+), 33 deletions(-) diff --git a/game_api.txt b/game_api.txt index 8e621c87..634b7f29 100644 --- a/game_api.txt +++ b/game_api.txt @@ -39,8 +39,8 @@ Beds API * `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 - -###Bed definition + +### Bed definition { description = "Simple Bed", @@ -85,12 +85,12 @@ The doors mod allows modders to register custom doors and trapdoors. * `def` See [#Fence gate definition] `doors.get(pos)` - + * `pos` A position as a table, e.g `{x = 1, y = 1, z = 1}` - * Returns an ObjecRef to a door, or nil if the position does not contain a door - - ###Methods - + * Returns an ObjectRef to a door, or nil if the position does not contain a door + + ### Methods + :open(player) -- Open the door object, returns if door was opened :close(player) -- Close the door object, returns if door was closed :toggle(player) -- Toggle the door state, returns if state was toggled @@ -101,7 +101,7 @@ 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. -###Door definition +### Door definition description = "Door description", inventory_image = "mod_door_inv.png", @@ -113,7 +113,7 @@ The doors mod allows modders to register custom doors and trapdoors. sound_close = sound play for close door, -- optional protected = false, -- If true, only placer can open the door (locked for others) -###Trapdoor definition +### Trapdoor definition description = "Trapdoor description", inventory_image = "mod_trapdoor_inv.png", @@ -125,7 +125,7 @@ The doors mod allows modders to register custom doors and trapdoors. sound_close = sound play for close door, -- optional protected = false, -- If true, only placer can open the door (locked for others) -###Fence gate definition +### Fence gate definition description = "Wooden Fence Gate", texture = "default_wood.png", @@ -135,6 +135,7 @@ The doors mod allows modders to register custom doors and trapdoors. Fence API --------- + Allows creation of new fences with "fencelike" drawtype. `default.register_fence(name, item definition)` @@ -144,7 +145,7 @@ Allows creation of new fences with "fencelike" drawtype. nodedef fields here except drawtype. The fence group will always be added for this node. -###fence definition +### fence definition name = "default:fence_wood", description = "Wooden Fence", @@ -153,8 +154,9 @@ 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 +Walls API --------- + The walls API allows easy addition of stone auto-connecting wall nodes. walls.register(name, desc, texture, mat, sounds) @@ -175,7 +177,7 @@ The farming API allows you to easily register plants and hoes. `farming.register_plant(name, Plant definition)` * Register a new growing plant, see [#Plant definition] -###Hoe Definition +### Hoe Definition { @@ -190,7 +192,7 @@ The farming API allows you to easily register plants and hoes. } } -###Plant definition +### Plant definition { description = "", -- Description of seed item @@ -204,16 +206,49 @@ The farming API allows you to easily register plants and hoes. Fire API -------- +New node def property: + `on_burn(pos)` * Called when fire attempts to remove a burning node. * `pos` Position of the burning node. +Give Initial Stuff API +---------------------- -#TNT API +`give_initial_stuff.give(player)` + +^ Give initial stuff to "player" + +`give_initial_stuff.add(stack)` + +^ Add item to the initial stuff +^ Stack can be an ItemStack or a item name eg: "default:dirt 99" +^ Can be called after the game has loaded + +`give_initial_stuff.clear()` + +^ Removes all items from the initial stuff +^ Can be called after the game has loaded + +`give_initial_stuff.get_list()` + +^ returns list of item stacks + +`give_initial_stuff.set_list(list)` + +^ List of initial items with numeric indices. + +`give_initial_stuff.add_from_csv(str)` + +^ str is a comma separated list of initial stuff +^ Adds items to the list of items to be given + + +TNT API ---------- -tnt.register_tnt(definition) +`tnt.register_tnt(definition)` ^ Register a new type of tnt. @@ -341,7 +376,7 @@ Creates panes that automatically connect to each other * `subname`: used for nodename. Result: "xpanes:subname" and "xpanes:subname_{2..15}" * `def`: See [#Pane definition] -###Pane definition +### Pane definition { textures = {"texture_Bottom_top", "texture_left_right", "texture_front_back"}, -- More tiles aren't supported @@ -427,7 +462,7 @@ default.player_get_animation(player) * Any of the fields of the returned table may be nil. * player: PlayerRef -###Model Definition +### Model Definition { animation_speed = 30, -- Default animation speed, in FPS. @@ -466,7 +501,7 @@ 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. -###Color groups +### Color groups Base color groups: @@ -521,7 +556,7 @@ Example of one shapeless recipe using a color group: recipe = {':item_no_color', 'group:basecolor_yellow'}, }) -###Color lists +### Color lists * `dye.basecolors` are an array containing the names of available base colors @@ -536,7 +571,7 @@ Trees * `default.grow_jungle_tree(pos)` * Grows a mgv6 jungletree at pos - * `default.grow_pine_tree(pos)` + * `default.grow_pine_tree(pos)` * Grows a mgv6 pinetree at pos * `default.grow_new_apple_tree(pos)` diff --git a/minetest.conf.example b/minetest.conf.example index ac5b8f68..813f1957 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -18,8 +18,9 @@ # 'permanent flame' nodes will remain with either setting #disable_fire = false -# Whether steel tools, torches and cobblestone 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 # Whether the TNT mod should be enabled #enable_tnt = diff --git a/mods/give_initial_stuff/init.lua b/mods/give_initial_stuff/init.lua index c65ddeae..022b7438 100644 --- a/mods/give_initial_stuff/init.lua +++ b/mods/give_initial_stuff/init.lua @@ -1,12 +1,44 @@ -minetest.register_on_newplayer(function(player) - --print("on_newplayer") - if minetest.setting_getbool("give_initial_stuff") then - minetest.log("action", "Giving initial stuff to player "..player:get_player_name()) - player:get_inventory():add_item('main', 'default:pick_steel') - player:get_inventory():add_item('main', 'default:torch 99') - player:get_inventory():add_item('main', 'default:axe_steel') - player:get_inventory():add_item('main', 'default:shovel_steel') - player:get_inventory():add_item('main', 'default:cobble 99') - end -end) +local stuff_string = minetest.setting_get("initial_stuff") or + "default:pick_steel,default:axe_steel,default:shovel_steel," .. + "default:torch 99,default:cobble 99" +give_initial_stuff = { + items = {} +} + +function give_initial_stuff.give(player) + minetest.log("action", + "Giving initial stuff to player " .. player:get_player_name()) + local inv = player:get_inventory() + for _, stack in ipairs(give_initial_stuff.items) do + inv:add_item("main", stack) + end +end + +function give_initial_stuff.add(stack) + give_initial_stuff.items[#give_initial_stuff.items + 1] = ItemStack(stack) +end + +function give_initial_stuff.clear() + give_initial_stuff.items = {} +end + +function give_initial_stuff.add_from_csv(str) + local items = str:split(",") + for _, itemname in ipairs(items) do + give_initial_stuff.add(itemname) + end +end + +function give_initial_stuff.set_list(list) + give_initial_stuff.items = list +end + +function give_initial_stuff.get_list() + return give_initial_stuff.items +end + +give_initial_stuff.add_from_csv(stuff_string) +if minetest.setting_getbool("give_initial_stuff") then + minetest.register_on_newplayer(give_initial_stuff.give) +end