From ca7f6bb97a832f948d209aa061bf5b09462af15b Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Sun, 6 Jul 2014 21:49:47 -0400 Subject: [PATCH 0001/2261] Convert spaces to tabs and add unknown node checks to xpanes --- mods/xpanes/init.lua | 289 ++++++++++++++++++++++--------------------- 1 file changed, 150 insertions(+), 139 deletions(-) diff --git a/mods/xpanes/init.lua b/mods/xpanes/init.lua index 60ec68c1..a3f7828b 100644 --- a/mods/xpanes/init.lua +++ b/mods/xpanes/init.lua @@ -1,175 +1,186 @@ xpanes = {} local function rshift(x, by) - return math.floor(x / 2 ^ by) + return math.floor(x / 2 ^ by) end local directions = { - {x = 1, y = 0, z = 0}, - {x = 0, y = 0, z = 1}, - {x = -1, y = 0, z = 0}, - {x = 0, y = 0, z = -1}, + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, } -local function update_pane(pos,name) - if minetest.get_node(pos).name:find("xpanes:"..name) == nil then - return - end - local sum = 0 - for i = 1, 4 do - local node = minetest.get_node({x = pos.x + directions[i].x, y = pos.y + directions[i].y, z = pos.z + directions[i].z}) - local pane_num = minetest.registered_nodes[node.name].groups.pane or 0 - if (minetest.registered_nodes[node.name].walkable ~= false and minetest.registered_nodes[node.name].drawtype ~= "nodebox") or pane_num > 0 then - sum = sum + 2 ^ (i - 1) - end - end - if sum == 0 then - sum = 15 - end - minetest.set_node(pos, {name = "xpanes:"..name.."_"..sum}) +local function update_pane(pos, name) + if not minetest.get_node(pos).name:find("^xpanes:"..name) then + return + end + local sum = 0 + for i, dir in pairs(directions) do + local node = minetest.get_node({ + x = pos.x + dir.x, + y = pos.y + dir.y, + z = pos.z + dir.z + }) + local def = minetest.registered_nodes[node.name] + local pane_num = def and def.groups.pane or 0 + if pane_num > 0 or not def or (def.walkable ~= false and + def.drawtype ~= "nodebox") then + sum = sum + 2 ^ (i - 1) + end + end + if sum == 0 then + sum = 15 + end + minetest.set_node(pos, {name = "xpanes:"..name.."_"..sum}) end -local function update_nearby(pos,n) - if n == nil then n = minetest.get_node(pos) end - if not n or not n.name then return end - local name = string.sub(n.name,8,10) - if name ~= "bar" then name = "pane" end - for i = 1,4 do - update_pane({x = pos.x + directions[i].x, y = pos.y + directions[i].y, z = pos.z + directions[i].z}, name) - end +local function update_nearby(pos, node) + node = node or minetest.get_node(pos) + if node.name:sub(1, 7) ~= "xpanes:" then return end + local underscore_pos = node.name:find("_") or 0 + local name = node.name:sub(8, underscore_pos - 1) + for i, dir in pairs(directions) do + update_pane({ + x = pos.x + dir.x, + y = pos.y + dir.y, + z = pos.z + dir.z + }, name) + end end -local half_blocks = { - {0, -0.5, -1/32, 0.5, 0.5, 1/32}, - {-1/32, -0.5, 0, 1/32, 0.5, 0.5}, - {-0.5, -0.5, -1/32, 0, 0.5, 1/32}, - {-1/32, -0.5, -0.5, 1/32, 0.5, 0} +local half_boxes = { + {0, -0.5, -1/32, 0.5, 0.5, 1/32}, + {-1/32, -0.5, 0, 1/32, 0.5, 0.5}, + {-0.5, -0.5, -1/32, 0, 0.5, 1/32}, + {-1/32, -0.5, -0.5, 1/32, 0.5, 0} } -local full_blocks = { - {-0.5, -0.5, -1/32, 0.5, 0.5, 1/32}, - {-1/32, -0.5, -0.5, 1/32, 0.5, 0.5} +local full_boxes = { + {-0.5, -0.5, -1/32, 0.5, 0.5, 1/32}, + {-1/32, -0.5, -0.5, 1/32, 0.5, 0.5} } -local sb_half_blocks = { - {0, -0.5, -0.06, 0.5, 0.5, 0.06}, - {-0.06, -0.5, 0, 0.06, 0.5, 0.5}, - {-0.5, -0.5, -0.06, 0, 0.5, 0.06}, - {-0.06, -0.5, -0.5, 0.06, 0.5, 0} +local sb_half_boxes = { + {0, -0.5, -0.06, 0.5, 0.5, 0.06}, + {-0.06, -0.5, 0, 0.06, 0.5, 0.5}, + {-0.5, -0.5, -0.06, 0, 0.5, 0.06}, + {-0.06, -0.5, -0.5, 0.06, 0.5, 0} } -local sb_full_blocks = { - {-0.5, -0.5, -0.06, 0.5, 0.5, 0.06}, - {-0.06, -0.5, -0.5, 0.06, 0.5, 0.5} +local sb_full_boxes = { + {-0.5, -0.5, -0.06, 0.5, 0.5, 0.06}, + {-0.06, -0.5, -0.5, 0.06, 0.5, 0.5} } ---register panes and bars + function xpanes.register_pane(name, def) -for i = 1, 15 do - local need = {} - local cnt = 0 - for j = 1, 4 do - if rshift(i, j - 1) % 2 == 1 then - need[j] = true - cnt = cnt + 1 - end - end - local take = {} - local take2 = {} - if need[1] == true and need[3] == true then - need[1] = nil - need[3] = nil - table.insert(take, full_blocks[1]) - table.insert(take2, sb_full_blocks[1]) - end - if need[2] == true and need[4] == true then - need[2] = nil - need[4] = nil - table.insert(take, full_blocks[2]) - table.insert(take2, sb_full_blocks[2]) - end - for k in pairs(need) do - table.insert(take, half_blocks[k]) - table.insert(take2, sb_half_blocks[k]) - end - local texture = def.textures[1] - if cnt == 1 then - texture = def.textures[1].."^"..def.textures[2] - end - minetest.register_node("xpanes:"..name.."_"..i, { - drawtype = "nodebox", - tiles = {def.textures[3], def.textures[3], texture}, - paramtype = "light", - groups = def.groups, - drop = "xpanes:"..name, - sounds = def.sounds, - node_box = { - type = "fixed", - fixed = take - }, - selection_box = { - type = "fixed", - fixed = take2 - } - }) -end + for i = 1, 15 do + local need = {} + local cnt = 0 + for j = 1, 4 do + if rshift(i, j - 1) % 2 == 1 then + need[j] = true + cnt = cnt + 1 + end + end + local take = {} + local take2 = {} + if need[1] == true and need[3] == true then + need[1] = nil + need[3] = nil + table.insert(take, full_boxes[1]) + table.insert(take2, sb_full_boxes[1]) + end + if need[2] == true and need[4] == true then + need[2] = nil + need[4] = nil + table.insert(take, full_boxes[2]) + table.insert(take2, sb_full_boxes[2]) + end + for k in pairs(need) do + table.insert(take, half_boxes[k]) + table.insert(take2, sb_half_boxes[k]) + end + local texture = def.textures[1] + if cnt == 1 then + texture = def.textures[1].."^"..def.textures[2] + end + minetest.register_node("xpanes:"..name.."_"..i, { + drawtype = "nodebox", + tiles = {def.textures[3], def.textures[3], texture}, + paramtype = "light", + groups = def.groups, + drop = "xpanes:"..name, + sounds = def.sounds, + node_box = { + type = "fixed", + fixed = take + }, + selection_box = { + type = "fixed", + fixed = take2 + } + }) + end -minetest.register_node("xpanes:"..name, def) + minetest.register_node("xpanes:"..name, def) -minetest.register_craft({ - output = "xpanes:"..name.." 16", - recipe = def.recipe -}) + minetest.register_craft({ + output = "xpanes:"..name.." 16", + recipe = def.recipe + }) end minetest.register_on_placenode(update_nearby) minetest.register_on_dignode(update_nearby) xpanes.register_pane("pane", { - description = "Glass Pane", - tiles = {"xpanes_space.png"}, - drawtype = "airlike", - paramtype = "light", - sunlight_propagates = true, - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - air_equivalent = true, - textures = {"default_glass.png","xpanes_pane_half.png","xpanes_white.png"}, - inventory_image = "default_glass.png", - wield_image = "default_glass.png", - sounds = default.node_sound_glass_defaults(), - groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,pane=1}, - on_construct = function(pos) - update_pane(pos, "pane") - end, - recipe = { + description = "Glass Pane", + tiles = {"xpanes_space.png"}, + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + air_equivalent = true, + textures = {"default_glass.png","xpanes_pane_half.png","xpanes_white.png"}, + inventory_image = "default_glass.png", + wield_image = "default_glass.png", + sounds = default.node_sound_glass_defaults(), + groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3, pane=1}, + on_construct = function(pos) + update_pane(pos, "pane") + end, + recipe = { {'default:glass', 'default:glass', 'default:glass'}, - {'default:glass', 'default:glass', 'default:glass'} + {'default:glass', 'default:glass', 'default:glass'} } }) xpanes.register_pane("bar", { - description = "Iron bar", - tiles = {"xpanes_space.png"}, - drawtype = "airlike", - paramtype = "light", - sunlight_propagates = true, - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - air_equivalent = true, - textures = {"xpanes_bar.png","xpanes_bar.png","xpanes_space.png"}, - inventory_image = "xpanes_bar.png", - wield_image = "xpanes_bar.png", - groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,pane=1}, - sounds = default.node_sound_stone_defaults(), - on_construct = function(pos) - update_pane(pos, "bar") - end, - recipe = { + description = "Iron bar", + tiles = {"xpanes_space.png"}, + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + air_equivalent = true, + textures = {"xpanes_bar.png","xpanes_bar.png","xpanes_space.png"}, + inventory_image = "xpanes_bar.png", + wield_image = "xpanes_bar.png", + groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3, pane=1}, + sounds = default.node_sound_stone_defaults(), + on_construct = function(pos) + update_pane(pos, "bar") + end, + recipe = { {'default:steel_ingot', 'default:glass', 'default:glass'}, - {'default:glass', 'default:glass', 'default:glass'} + {'default:glass', 'default:glass', 'default:glass'} } }) + From 814c17631d5880b0031629ddba10e6703ca4b747 Mon Sep 17 00:00:00 2001 From: BlockMen Date: Tue, 8 Jul 2014 16:50:06 +0200 Subject: [PATCH 0002/2261] Fix jump-stacking --- minetest.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/minetest.conf b/minetest.conf index 58c905d2..3fb76797 100644 --- a/minetest.conf +++ b/minetest.conf @@ -1,6 +1,5 @@ mgv6_spflags = biomeblend, jungles movement_liquid_sink = 25 -movement_speed_jump = 6.2 movement_liquid_fluidity = 0.8 movement_liquid_fluidity_smooth = 2 From 955f3cf310ae6d5c45df85ca4c9bad69117542b2 Mon Sep 17 00:00:00 2001 From: BlockMen Date: Tue, 8 Jul 2014 19:10:55 +0200 Subject: [PATCH 0003/2261] Fix crafting recipe for iron bars --- mods/xpanes/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/xpanes/init.lua b/mods/xpanes/init.lua index a3f7828b..506b83cb 100644 --- a/mods/xpanes/init.lua +++ b/mods/xpanes/init.lua @@ -179,8 +179,8 @@ xpanes.register_pane("bar", { update_pane(pos, "bar") end, recipe = { - {'default:steel_ingot', 'default:glass', 'default:glass'}, - {'default:glass', 'default:glass', 'default:glass'} + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'} } }) From c993e14084553f01b4f5538a72f2bb2388be9b11 Mon Sep 17 00:00:00 2001 From: Novatux Date: Wed, 9 Jul 2014 09:47:51 +0200 Subject: [PATCH 0004/2261] Add spaces around operators in boat mod code, fix a problem with boat staticdata, fix a crash that can occur with boat going over unknown nodes. --- mods/boats/init.lua | 73 +++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/mods/boats/init.lua b/mods/boats/init.lua index e668ed2d..683325de 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -12,18 +12,18 @@ local function get_sign(i) if i == 0 then return 0 else - return i/math.abs(i) + return i / math.abs(i) end end local function get_velocity(v, yaw, y) - local x = -math.sin(yaw)*v - local z = math.cos(yaw)*v - return {x=x, y=y, z=z} + local x = -math.sin(yaw) * v + local z = math.cos(yaw) * v + return {x = x, y = y, z = z} end local function get_v(v) - return math.sqrt(v.x^2+v.z^2) + return math.sqrt(v.x ^ 2 + v.z ^ 2) end -- @@ -32,7 +32,7 @@ end local boat = { physical = true, - collisionbox = {-0.6,-0.4,-0.6, 0.6,0.3,0.6}, + collisionbox = {-0.6, -0.4, -0.6, 0.6, 0.3, 0.6}, visual = "mesh", mesh = "boat.x", textures = {"default_wood.png"}, @@ -55,25 +55,25 @@ function boat.on_rightclick(self, clicker) default.player_set_animation(clicker, "stand" , 30) elseif not self.driver then self.driver = clicker - clicker:set_attach(self.object, "", {x=0,y=11,z=-3}, {x=0,y=0,z=0}) + clicker:set_attach(self.object, "", {x = 0, y = 11, z = -3}, {x = 0, y = 0, z = 0}) default.player_attached[name] = true minetest.after(0.2, function() default.player_set_animation(clicker, "sit" , 30) end) - self.object:setyaw(clicker:get_look_yaw()-math.pi/2) + self.object:setyaw(clicker:get_look_yaw() - math.pi / 2) end end function boat.on_activate(self, staticdata, dtime_s) - self.object:set_armor_groups({immortal=1}) + self.object:set_armor_groups({immortal = 1}) if staticdata then self.v = tonumber(staticdata) end self.last_v = self.v end -function boat.get_staticdata() - return tostring(v) +function boat.get_staticdata(self) + return tostring(self.v) end function boat.on_punch(self, puncher, time_from_last_punch, tool_capabilities, direction) @@ -85,7 +85,7 @@ function boat.on_punch(self, puncher, time_from_last_punch, tool_capabilities, d self.removed = true -- delay remove to ensure player is detached - minetest.after(0.1,function() + minetest.after(0.1, function() self.object:remove() end) if not minetest.setting_getbool("creative_mode") then @@ -94,28 +94,28 @@ function boat.on_punch(self, puncher, time_from_last_punch, tool_capabilities, d end function boat.on_step(self, dtime) - self.v = get_v(self.object:getvelocity())*get_sign(self.v) + self.v = get_v(self.object:getvelocity()) * get_sign(self.v) if self.driver then local ctrl = self.driver:get_player_control() local yaw = self.object:getyaw() if ctrl.up then - self.v = self.v+0.1 + self.v = self.v + 0.1 end if ctrl.down then - self.v = self.v-0.08 + self.v = self.v - 0.08 end if ctrl.left then if ctrl.down then - self.object:setyaw(yaw-math.pi/120-dtime*math.pi/120) + self.object:setyaw(yaw - math.pi / 120 - dtime * math.pi / 120) else - self.object:setyaw(yaw+math.pi/120+dtime*math.pi/120) + self.object:setyaw(yaw + math.pi / 120 + dtime * math.pi / 120) end end if ctrl.right then if ctrl.down then - self.object:setyaw(yaw+math.pi/120+dtime*math.pi/120) + self.object:setyaw(yaw + math.pi / 120 + dtime * math.pi / 120) else - self.object:setyaw(yaw-math.pi/120-dtime*math.pi/120) + self.object:setyaw(yaw - math.pi / 120 - dtime*math.pi/120) end end end @@ -124,43 +124,44 @@ function boat.on_step(self, dtime) return end local s = get_sign(self.v) - self.v = self.v - 0.02*s + self.v = self.v - 0.02 * s if s ~= get_sign(self.v) then - self.object:setvelocity({x=0, y=0, z=0}) + self.object:setvelocity({x = 0, y = 0, z = 0}) self.v = 0 return end if math.abs(self.v) > 4.5 then - self.v = 4.5*get_sign(self.v) + self.v = 4.5 * get_sign(self.v) end local p = self.object:getpos() - p.y = p.y-0.5 - local new_velo = {x=0,y=0,z=0} - local new_acce = {x=0,y=0,z=0} + p.y = p.y - 0.5 + local new_velo = {x = 0, y = 0, z = 0} + local new_acce = {x = 0, y = 0, z = 0} if not is_water(p) then - if minetest.registered_nodes[minetest.env:get_node(p).name].walkable then + local nodedef = minetest.registered_nodes[minetest.get_node(p).name] + if (not nodedef) or nodedef.walkable then self.v = 0 end - new_acce = {x=0, y=-10, z=0} + new_acce = {x = 0, y = -10, z = 0} new_velo = get_velocity(self.v, self.object:getyaw(), self.object:getvelocity().y) else - p.y = p.y+1 + p.y = p.y + 1 if is_water(p) then - new_acce = {x=0, y=3, z=0} + new_acce = {x = 0, y = 3, z = 0} local y = self.object:getvelocity().y if y > 2 then y = 2 end if y < 0 then - self.object:setacceleration({x=0, y=10, z=0}) + self.object:setacceleration({x = 0, y = 10, z = 0}) end new_velo = get_velocity(self.v, self.object:getyaw(), y) else - new_acce = {x=0, y=0, z=0} + new_acce = {x = 0, y = 0, z = 0} if math.abs(self.object:getvelocity().y) < 1 then local pos = self.object:getpos() - pos.y = math.floor(pos.y)+0.5 + pos.y = math.floor(pos.y) + 0.5 self.object:setpos(pos) new_velo = get_velocity(self.v, self.object:getyaw(), 0) else @@ -179,7 +180,7 @@ minetest.register_craftitem("boats:boat", { description = "Boat", inventory_image = "boat_inventory.png", wield_image = "boat_wield.png", - wield_scale = {x=2, y=2, z=1}, + wield_scale = {x = 2, y = 2, z = 1}, liquids_pointable = true, on_place = function(itemstack, placer, pointed_thing) @@ -189,7 +190,7 @@ minetest.register_craftitem("boats:boat", { if not is_water(pointed_thing.under) then return end - pointed_thing.under.y = pointed_thing.under.y+0.5 + pointed_thing.under.y = pointed_thing.under.y + 0.5 minetest.add_entity(pointed_thing.under, "boats:boat") if not minetest.setting_getbool("creative_mode") then itemstack:take_item() @@ -201,8 +202,8 @@ minetest.register_craftitem("boats:boat", { minetest.register_craft({ output = "boats:boat", recipe = { - {"", "", ""}, - {"group:wood", "", "group:wood"}, + {"", "", "" }, + {"group:wood", "", "group:wood"}, {"group:wood", "group:wood", "group:wood"}, }, }) From 3180bdfe6ce40a6f155329078884e797c310b8f1 Mon Sep 17 00:00:00 2001 From: BlockMen Date: Sun, 13 Jul 2014 19:20:20 +0200 Subject: [PATCH 0005/2261] Add protection to TNT (by @tenplus1) --- mods/tnt/init.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 4da0713d..2f2dbbe3 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -37,7 +37,11 @@ local add_drop = function(drops, pos, item) end end -local destroy = function(drops, pos, last, fast) +local function destroy(drops, pos, last, fast) + if minetest.is_protected(pos, "") then + return + end + local nodename = minetest.get_node(pos).name if nodename ~= "air" then minetest.remove_node(pos, (fast and 1 or 0)) From c521cb06bfb0a3b5d8929d9ba0b44cb25e417bef Mon Sep 17 00:00:00 2001 From: Novatux Date: Wed, 9 Jul 2014 18:51:31 +0200 Subject: [PATCH 0006/2261] Better ingot textures --- mods/default/textures/default_bronze_ingot.png | Bin 224 -> 358 bytes mods/default/textures/default_copper_ingot.png | Bin 224 -> 356 bytes mods/default/textures/default_gold_ingot.png | Bin 259 -> 313 bytes mods/default/textures/default_steel_ingot.png | Bin 270 -> 283 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/textures/default_bronze_ingot.png b/mods/default/textures/default_bronze_ingot.png index e3c0b6f61168f6b1d0fa5c2cd1494a0878b0f5ad..527641b2381a92b6d239b674e6225584b55833db 100644 GIT binary patch delta 342 zcmV-c0jd7r0pHK~y-)-H|a%0&y6|e`n^&!HF5+4IKn+ zet>Fl2#Fxtq9K~Ht)MZwk8t0@r9B9AFfj+02pszYMqH5@o}ArL{u}I0(o^Sp)|cP& zyzleEpOBf;gqhPs*ep5=1US1m2S7;{g!BH2QMIJ020nOte1E{)l1^k{8R4`!+S@{W z*g#PL7*$J(hJh!CyGU^rDXs$0Z$AQ1xvAlHTIAQ$6z-k@kVZjYJ`8YseFebAY7zk3 zcCl=adea%6kl#sDDwa{^BW!LDR;`sQV_?_)r0eyEL1s=9`ZmQU@WsWH@)OlB>?W$6WdQJx3}UofhcMEv0YyIb1cZsq5&OQ`k8XL!aUGegE9VA&NhjpDquLT;z# zwF~}|SZct_vifh2_Fw&m$lh)C?-+E9Sa$_2;QSX?&G>Hxb5@$*igKV$44$rjF6*2U FngFg^OzQvu diff --git a/mods/default/textures/default_copper_ingot.png b/mods/default/textures/default_copper_ingot.png index 73e4b6ff42f95958734aaf05f2311b67da34b478..5f2cf033f1dcb9a661a0d0afa3ea5330882957cb 100644 GIT binary patch delta 340 zcmV-a0jvJt0ptRZ8Gi-<001BJ|6u?C0V_#FK~y-)-I2db0$~`(Kks=#Qn>^Y4cgof zha_qViExiVZVsA?Q=0B?a4m?Mf(R;%ipHF(slX*#8k>?p1gSI9yQjswEH9nwyFEPb z=leYG_klklE0Yu}la!#I-U|fS$e92Pgm>hv-XLEnDesNy27l(V>u5?tg+ho3uG2(B z*xcF%AYUjcJqXO2Ybd4Alm>t}4gi;DN7S1QR+iK3off~o&+jU;4}XZVGD$HOriesi^bZXJaCdVJ!1%;u zAb55E^gV-erAXir%^BXpXd|lM2nYiEtYct0000FR00-jvF2uOwSI6obC~o0 zW|-kmC<>%eARU*Rn*~A;or3wrtF-gk62@}fKe_4PA-1rICVw8$7Kc?3#&UDx!4mRV z{>eOp%H^G}PD^l1d_B;?FxXYT7bWEzP~6MjuPy2glG?xwf-`O}s+JZgo|Mp*l&d3P z`-8XlewkbpNRReeS?_oJP|5DX&Ui4X8JY%k0RR6-|Nm6~|6~9EcK`o^|NocMJ}s^Q z0007XQchC<0CtnjH~;_uYe_^wRCwBj&Or`?FbqUdI)MhVGd007NNL_t(| zoW+x|3W87+hVSF}D!$2Cgj%X4l6nL|L=b#|rXXku3>+LF4yeyDsDUvt>5up*(qJq6yW4E=n;Qe+*5=S2a5h2e~JRcmjs8EXvVc;VS zd@b0FKtxR-MR*CUmJ2P|*@6t(A}P3>PfAd^#=b}gj=F;(*s#nW{KDS_ZwPmGsh9n} Ru>b%707*qoLMGkj*gR)lbD#8rlzK-sHm>4uCTDMy1Kf(y}iW5#L&>t)z#J9+}z#W z-RkP<|Ns9bCCS$m>EmtrUn$(5h4nV9sP714ACIKH~ zKk)5LWCX1Dv2hE{`U;G-zM}E*55VS<3cNEFUi*g~m3Ia`lv2L^00000NkvXXu0mjf D08(`G From 5175897cdc7bfe1ce0caa6f4a7c01909cb2c8767 Mon Sep 17 00:00:00 2001 From: cupofinsane Date: Thu, 10 Jul 2014 00:40:18 +0600 Subject: [PATCH 0007/2261] Alias string to cotton Cotton plants used to drop strings, now they drop farming:cotton. Some mods (namely, throwing) still use farming:string, therefore we need farming:string to be equal farming:cotton. --- mods/farming/init.lua | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/mods/farming/init.lua b/mods/farming/init.lua index 4f65d5dd..9245470f 100644 --- a/mods/farming/init.lua +++ b/mods/farming/init.lua @@ -50,10 +50,7 @@ farming.register_plant("farming:cotton", { fertility = {"grassland", "desert"} }) -minetest.register_craftitem("farming:string", { - description = "String", - inventory_image = "farming_cotton.png", -}) +minetest.register_alias("farming:string", "farming:cotton") minetest.register_craft({ output = "wool:white", From c8845e8d446071080d7f79e292e176f893b27340 Mon Sep 17 00:00:00 2001 From: Amaz Date: Tue, 22 Jul 2014 11:31:47 +0100 Subject: [PATCH 0008/2261] Fix desert_sand_soil dropping itself, and changed the descriptions --- mods/farming/nodes.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/farming/nodes.lua b/mods/farming/nodes.lua index 4593e10e..d8c1d2d2 100644 --- a/mods/farming/nodes.lua +++ b/mods/farming/nodes.lua @@ -53,7 +53,8 @@ minetest.override_item("default:desert_sand", { } }) minetest.register_node("farming:desert_sand_soil", { - description = "Desert Sand", + description = "Desert Sand Soil", + drop = "default:desert_sand", tiles = {"farming_desert_sand_soil.png", "default_desert_sand.png"}, is_ground_content = true, groups = {crumbly=3, not_in_creative_inventory = 1, falling_node=1, sand=1, soil = 2, desert = 1}, @@ -66,7 +67,7 @@ minetest.register_node("farming:desert_sand_soil", { }) minetest.register_node("farming:desert_sand_soil_wet", { - description = "Desert Sand", + description = "Wet Desert Sand Soil", drop = "default:desert_sand", tiles = {"farming_desert_sand_soil_wet.png", "farming_desert_sand_soil_wet_side.png"}, is_ground_content = true, From d4c24a30e99ce1c5b1c3047ea67beef43b9b9690 Mon Sep 17 00:00:00 2001 From: Zefram Date: Sun, 20 Jul 2014 17:22:54 +0100 Subject: [PATCH 0009/2261] Retain sign text when editing is aborted by --- 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 93d6981c..354096e0 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -723,7 +723,7 @@ minetest.register_node("default:sign_wall", { return end local meta = minetest.get_meta(pos) - fields.text = fields.text or "" + if not fields.text then return end minetest.log("action", (sender:get_player_name() or "").." wrote \""..fields.text.. "\" to sign at "..minetest.pos_to_string(pos)) meta:set_string("text", fields.text) From a8ad9bfc9df46b3951a401af0666c9eb6794ab32 Mon Sep 17 00:00:00 2001 From: Zefram Date: Sun, 20 Jul 2014 17:42:30 +0100 Subject: [PATCH 0010/2261] Consistently use group:stick in tool recipes The left-handed recipes for axes were using default:stick instead of the group:stick used by all other tool recipes. --- mods/default/crafting.lua | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index 113e1d50..eb150044 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -212,8 +212,8 @@ minetest.register_craft({ output = 'default:axe_wood', recipe = { {'group:wood', 'group:wood'}, - {'default:stick', 'group:wood'}, - {'default:stick',''}, + {'group:stick', 'group:wood'}, + {'group:stick',''}, } }) @@ -221,8 +221,8 @@ minetest.register_craft({ output = 'default:axe_stone', recipe = { {'group:stone', 'group:stone'}, - {'default:stick', 'group:stone'}, - {'default:stick', ''}, + {'group:stick', 'group:stone'}, + {'group:stick', ''}, } }) @@ -230,8 +230,8 @@ minetest.register_craft({ output = 'default:axe_steel', recipe = { {'default:steel_ingot', 'default:steel_ingot'}, - {'default:stick', 'default:steel_ingot'}, - {'default:stick', ''}, + {'group:stick', 'default:steel_ingot'}, + {'group:stick', ''}, } }) @@ -239,8 +239,8 @@ minetest.register_craft({ output = 'default:axe_bronze', recipe = { {'default:bronze_ingot', 'default:bronze_ingot'}, - {'default:stick', 'default:bronze_ingot'}, - {'default:stick', ''}, + {'group:stick', 'default:bronze_ingot'}, + {'group:stick', ''}, } }) @@ -248,8 +248,8 @@ minetest.register_craft({ output = 'default:axe_mese', recipe = { {'default:mese_crystal', 'default:mese_crystal'}, - {'default:stick', 'default:mese_crystal'}, - {'default:stick', ''}, + {'group:stick', 'default:mese_crystal'}, + {'group:stick', ''}, } }) @@ -257,8 +257,8 @@ minetest.register_craft({ output = 'default:axe_diamond', recipe = { {'default:diamond', 'default:diamond'}, - {'default:stick', 'default:diamond'}, - {'default:stick', ''}, + {'group:stick', 'default:diamond'}, + {'group:stick', ''}, } }) From c39b9b29debabdd25c57fa2901346acce16be3e0 Mon Sep 17 00:00:00 2001 From: Zefram Date: Sun, 20 Jul 2014 18:22:52 +0100 Subject: [PATCH 0011/2261] Improve message about screwdriver control The message to "hold shift" makes an unwarranted assumption about the user's keybindings. Messages from the server should refer to a key's game function, rather than its extragame identity. --- mods/screwdriver/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index c257235f..6e560388 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -20,7 +20,7 @@ local function screwdriver_setmode(user,itemstack) local item = itemstack:to_table() local mode = tonumber(itemstack:get_metadata()) if not mode then - minetest.chat_send_player(player_name, "Hold shift and use to change screwdriwer modes.") + minetest.chat_send_player(player_name, "Use while sneaking to change screwdriwer modes.") mode = 0 end mode = mode + 1 From 820e48badc4c5ba8e20d5543988711c7ba43623d Mon Sep 17 00:00:00 2001 From: Zefram Date: Sun, 20 Jul 2014 19:03:16 +0100 Subject: [PATCH 0012/2261] Make open trapdoor climbable When a trapdoor is mounted upside down, to make its top surface flush with the floor above when closed, it is necessary to have some way to climb through the trapdoor node when it's open. Making it climbable like a ladder satisfies this need. It is somewhat realistic, as a real trapdoor can have a ladder segment mounted on one face. When the trapdoor is mounted in its default orientation, making the bottom surface flush with the ceiling below when closed, the climbability when open is not strictly necessary, but is still a convenience. --- mods/doors/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 87b15b61..75c6620c 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -429,6 +429,7 @@ minetest.register_node("doors:trapdoor_open", { pointable = true, stack_max = 0, groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1}, + climbable = true, sounds = default.node_sound_wood_defaults(), drop = "doors:trapdoor", node_box = { From ea3fcdd077265d4ae3e9b4d17eacf338324f4608 Mon Sep 17 00:00:00 2001 From: Zefram Date: Sun, 20 Jul 2014 20:19:05 +0100 Subject: [PATCH 0013/2261] Pair door with door of any type Mirror the setup of a door placed next to any door, not just next to a door of the same type. This is particularly useful where there are multiple door types that have the same appearance, but one wants the doors of a pair to have different behaviour in some other respect. --- mods/doors/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 75c6620c..bb327b85 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -90,7 +90,7 @@ function doors.register_door(name, def) elseif p2 == 3 then pt3.z = pt3.z-1 end - if not string.find(minetest.get_node(pt3).name, name.."_b_") then + if minetest.get_item_group(minetest.get_node(pt3).name, "door") == 0 then minetest.set_node(pt, {name=name.."_b_1", param2=p2}) minetest.set_node(pt2, {name=name.."_t_1", param2=p2}) else From 0ca4520cc22fdea26e1d94800d112b957975e28d Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Sun, 13 Jul 2014 18:08:03 -0400 Subject: [PATCH 0014/2261] Rewrite TNT --- mods/tnt/README.txt | 19 +- mods/tnt/depends.txt | 1 + mods/tnt/init.lua | 468 ++++++++++++++++---------------- mods/tnt/textures/tnt_smoke.png | Bin 184 -> 202 bytes 4 files changed, 241 insertions(+), 247 deletions(-) diff --git a/mods/tnt/README.txt b/mods/tnt/README.txt index 46d3fca1..90a34677 100644 --- a/mods/tnt/README.txt +++ b/mods/tnt/README.txt @@ -1,27 +1,18 @@ -=== TNT-MOD for MINETEST-C55 === -by PilzAdam +=== TNT mod for Minetest === +by PilzAdam and ShadowNinja Introduction: This mod adds TNT to Minetest. TNT is a tool to help the player in mining. -How to install: -Unzip the archive an place it in minetest-base-directory/mods/minetest/ -if you have a windows client or a linux run-in-place client. If you have -a linux system-wide instalation place it in ~/.minetest/mods/minetest/. -If you want to install this mod only in one world create the folder -worldmods/ in your worlddirectory. -For further information or help see: -http://wiki.minetest.com/wiki/Installing_Mods - How to use the mod: Craft gunpowder by placing coal and gravel in the crafting area. The gunpowder can be used to craft TNT or as fuze for TNT. To craft TNT surround gunpowder with 4 wood in a + shape. There are different ways to blow up TNT: -1. Hit it with a torch. -2. Hit a gunpowder fuze that leads to a TNT block with a torch. -3. Activate it with mesecons (fastest way) + 1. Hit it with a torch. + 2. Hit a gunpowder fuze that leads to a TNT block with a torch. + 3. Activate it with mesecons (fastest way) Be aware of the damage radius of 7 blocks! License: diff --git a/mods/tnt/depends.txt b/mods/tnt/depends.txt index 70715c7b..5ff216f7 100644 --- a/mods/tnt/depends.txt +++ b/mods/tnt/depends.txt @@ -1,2 +1,3 @@ default fire + diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 2f2dbbe3..1182acae 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -1,197 +1,222 @@ + +-- Default to enabled in singleplayer and disabled in multiplayer +local singleplayer = minetest.is_singleplayer() +local setting = minetest.setting_getbool("enable_tnt") +if (not singleplayer and setting ~= false) or + (singleplayer and setting ~= true) then + return +end + -- loss probabilities array (one in X will be lost) local loss_prob = {} loss_prob["default:cobble"] = 3 loss_prob["default:dirt"] = 4 -local radius_max = tonumber(minetest.setting_get("tnt_radius_max") or 25) +local radius = tonumber(minetest.setting_get("tnt_radius") or 3) -local eject_drops = function(pos, stack) - local obj = minetest.add_item(pos, stack) - - if obj == nil then - return +-- Fill a list with data for content IDs, after all nodes are registered +local cid_data = {} +minetest.after(0, function() + for name, def in pairs(minetest.registered_nodes) do + cid_data[minetest.get_content_id(name)] = { + name = name, + drops = def.drops, + flammable = def.groups.flammable, + } end - obj:get_luaentity().collect = true - obj:setacceleration({x=0, y=-10, z=0}) - obj:setvelocity({x=math.random(0,6)-3, y=10, z=math.random(0,6)-3}) +end) + +local function rand_pos(center, pos, radius) + pos.x = center.x + math.random(-radius, radius) + pos.z = center.z + math.random(-radius, radius) end -local add_drop = function(drops, pos, item) - if loss_prob[item] ~= nil then - if math.random(1,loss_prob[item]) == 1 then - return +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 + rand_pos(pos, drop_pos, radius) + local obj = minetest.add_item(drop_pos, item) + 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, + z=math.random(-3, 3)}) + end + count = count - max end end +end - if drops[item] == nil then - drops[item] = ItemStack(item) - else - drops[item]:add_item(item) +local function add_drop(drops, item) + item = ItemStack(item) + local name = item:get_name() + if loss_prob[name] ~= nil and math.random(1, loss_prob[name]) == 1 then + return end - if drops[item]:get_free_space() == 0 then - stack = drops[item] - eject_drops(pos, stack) - drops[item] = nil + local drop = drops[name] + if drop == nil then + drops[name] = item + else + drop:set_count(drop:get_count() + item:get_count()) end end -local function destroy(drops, pos, last, fast) +local fire_node = {name="fire:basic_flame"} + +local function destroy(drops, pos, cid) if minetest.is_protected(pos, "") then return end - - local nodename = minetest.get_node(pos).name - if nodename ~= "air" then - minetest.remove_node(pos, (fast and 1 or 0)) - if last then - nodeupdate(pos) - end - if minetest.registered_nodes[nodename].groups.flammable ~= nil then - minetest.set_node(pos, {name="fire:basic_flame"}, (fast and 2 or 0)) - return - end - local drop = minetest.get_node_drops(nodename, "") - for _,item in ipairs(drop) do - if type(item) == "string" then - add_drop(drops, pos, item) - else - for i=1,item:get_count() do - add_drop(drops, pos, item:get_name()) - end + local def = cid_data[cid] + if def and def.flammable then + minetest.set_node(pos, fire_node) + else + minetest.remove_node(pos) + if def then + local node_drops = minetest.get_node_drops(def.name, "") + for _, item in ipairs(node_drops) do + add_drop(drops, item) end end end end -boom = function(pos, time) - minetest.after(time, function(pos) - if minetest.get_node(pos).name ~= "tnt:tnt_burning" then - return - end - minetest.sound_play("tnt_explode", {pos=pos, gain=1.5, max_hear_distance=2*64}) - minetest.set_node(pos, {name="tnt:boom"}) - minetest.after(0.5, function(pos) - minetest.remove_node(pos) - end, {x=pos.x, y=pos.y, z=pos.z}) - - local radius = 2 - local drops = {} - local list = {} - local dr = 0 - local tnts = 1 - local destroyed = 0 - while dr 7) - destroyed = destroyed + 1 - else - if math.random(1,5) <= 4 then - destroy(drops, np, dr == radius, radius > 7) - destroyed = destroyed + 1 - end - end - end - end end + vi = vi + 1 + end + end + end - local objects = minetest.get_objects_inside_radius(pos, radius*2) - for _,obj in ipairs(objects) do - --if obj:is_player() or (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item") then - local p = obj:getpos() - local v = obj:getvelocity() - local vec = {x=p.x-pos.x, y=p.y-pos.y, z=p.z-pos.z} - local dist = (vec.x^2+vec.y^2+vec.z^2)^0.5 - local damage = ((radius*20)/dist) - --print("DMG dist="..dist.." damage="..damage) - if obj:is_player() or (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item") then - obj:punch(obj, 1.0, { - full_punch_interval=1.0, - damage_groups={fleshy=damage}, - }, vec) - end - if v ~= nil then - --obj:setvelocity({x=(p.x - pos.x) + (radius / 4) + v.x, y=(p.y - pos.y) + (radius / 2) + v.y, z=(p.z - pos.z) + (radius / 4) + v.z}) - obj:setvelocity({x=(p.x - pos.x) + (radius / 2) + v.x, y=(p.y - pos.y) + radius + v.y, z=(p.z - pos.z) + (radius / 2) + v.z}) - end - --end - end + return drops +end - print("TNT exploded=" .. tnts .. " radius=" .. radius .. " destroyed="..destroyed) +local function boom(pos) + 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) - for _,stack in pairs(drops) do - eject_drops(pos, stack) - end - local radiusp = radius+1 - minetest.add_particlespawner( - 100, --amount - 0.1, --time - {x=pos.x-radiusp, y=pos.y-radiusp, z=pos.z-radiusp}, --minpos - {x=pos.x+radiusp, y=pos.y+radiusp, z=pos.z+radiusp}, --maxpos - {x=-0, y=-0, z=-0}, --minvel - {x=0, y=0, z=0}, --maxvel - {x=-0.5,y=5,z=-0.5}, --minacc - {x=0.5,y=5,z=0.5}, --maxacc - 0.1, --minexptime - 1, --maxexptime - 8, --minsize - 15, --maxsize - false, --collisiondetection - "tnt_smoke.png" --texture - ) - end, pos) + local drops = explode(pos, radius) + entity_physics(pos, radius) + eject_drops(drops, pos, radius) + add_effects(pos, radius) end minetest.register_node("tnt:tnt", { @@ -199,30 +224,32 @@ minetest.register_node("tnt:tnt", { tiles = {"tnt_top.png", "tnt_bottom.png", "tnt_side.png"}, 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"}) - boom(pos, 4) + minetest.get_node_timer(pos):start(4) end end, - - mesecons = { - effector = { - action_on = function(pos, node) - minetest.set_node(pos, {name="tnt:tnt_burning"}) - boom(pos, 0) - 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"}, + 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_timer = boom, }) minetest.register_node("tnt:boom", { @@ -232,54 +259,11 @@ minetest.register_node("tnt:boom", { walkable = false, drop = "", groups = {dig_immediate=3}, + on_timer = function(pos, elapsed) + minetest.remove_node(pos) + end, }) -burn = function(pos) - if minetest.get_node(pos).name == "tnt:tnt" then - minetest.sound_play("tnt_ignite", {pos=pos}) - minetest.set_node(pos, {name="tnt:tnt_burning"}) - boom(pos, 1) - return - end - if minetest.get_node(pos).name ~= "tnt:gunpowder" then - return - end - minetest.sound_play("tnt_gunpowder_burning", {pos=pos, gain=2}) - minetest.set_node(pos, {name="tnt:gunpowder_burning"}) - - minetest.after(1, function(pos) - if minetest.get_node(pos).name ~= "tnt:gunpowder_burning" then - return - end - minetest.after(0.5, function(pos) - minetest.remove_node(pos) - end, {x=pos.x, y=pos.y, z=pos.z}) - for dx=-1,1 do - for dz=-1,1 do - for dy=-1,1 do - pos.x = pos.x+dx - pos.y = pos.y+dy - pos.z = pos.z+dz - - if not (math.abs(dx) == 1 and math.abs(dz) == 1) then - if dy == 0 then - burn({x=pos.x, y=pos.y, z=pos.z}) - else - if math.abs(dx) == 1 or math.abs(dz) == 1 then - burn({x=pos.x, y=pos.y, z=pos.z}) - end - end - end - - pos.x = pos.x-dx - pos.y = pos.y-dy - pos.z = pos.z-dz - end - end - end - end, pos) -end - minetest.register_node("tnt:gunpowder", { description = "Gun Powder", drawtype = "raillike", @@ -309,7 +293,15 @@ minetest.register_node("tnt:gunpowder_burning", { sunlight_propagates = true, walkable = false, light_source = 5, - tiles = {{name="tnt_gunpowder_burning_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1}}}, + tiles = {{ + name = "tnt_gunpowder_burning_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }}, selection_box = { type = "fixed", fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, @@ -317,21 +309,30 @@ minetest.register_node("tnt:gunpowder_burning", { drop = "", groups = {dig_immediate=2,attached_node=1}, sounds = default.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + for dx = -1, 1 do + for dz = -1, 1 do + for dy = -1, 1 do + if not (dx == 0 and dz == 0) then + burn({ + x = pos.x + dx, + y = pos.y + dy, + z = pos.z + dz, + }) + end + end + end + end + minetest.remove_node(pos) + end }) minetest.register_abm({ nodenames = {"tnt:tnt", "tnt:gunpowder"}, neighbors = {"fire:basic_flame", "default:lava_source", "default:lava_flowing"}, - interval = 2, - chance = 10, - action = function(pos, node) - if node.name == "tnt:tnt" then - minetest.set_node(pos, {name="tnt:tnt_burning"}) - boom({x=pos.x, y=pos.y, z=pos.z}, 0) - else - burn(pos) - end - end + interval = 1, + chance = 1, + action = burn, }) minetest.register_craft({ @@ -343,12 +344,13 @@ minetest.register_craft({ minetest.register_craft({ output = "tnt:tnt", recipe = { - {"", "group:wood", ""}, + {"", "group:wood", ""}, {"group:wood", "tnt:gunpowder", "group:wood"}, - {"", "group:wood", ""} + {"", "group:wood", ""} } }) if minetest.setting_get("log_mods") then - minetest.log("action", "tnt loaded") + minetest.debug("[TNT] Loaded!") end + diff --git a/mods/tnt/textures/tnt_smoke.png b/mods/tnt/textures/tnt_smoke.png index c3790476e7fa5650aca030806347ef963eb3f40f..488b50fe958d33fa4cd50fa383a4685db045def5 100644 GIT binary patch delta 186 zcmdnNc#3g?L_G%^0|SHn=l_X7iY>|8-G$*l2rk&Wd@@jkv%n*=n1O*?7=#%aX3dcR z3TAn_IEGl9PEJ^$YEk*=Nqx#J4THo(E&p$r96lnh6VY&cLt7i0h%YNE>;I3PiyL^Q z%@VfGoM6G#V97sy^TneZ*(4Ox7k3*^c$~9lqp|ZEppfK=LbF{z3OZOzoIAeq-P_}E g!rFy#&B9(b1|BWWe7`0JL7=q^p00i_>zopr0L%D9X8-^I delta 168 zcmX@bxPx(mL_G^L0|Ud`yN`l^lxToYh%1n8YHFG}bLO&T%dTC!cK!PGFJHb$8RZE9 zB^XPB{DK)Ap4~_TasoYF978x{Sr0l29yZ`%Ft9BC^)8u#CsE+eZbpNa5AK1Tr&&}o z{T4^e>dY@>W{WL8r8JShSZVux$EWONj;3k57T$e#K(TnCz_t0gH;?mWcz@yEEY7JD T^KNbt&~ye*S3j3^P6)=4w From 263b6f2fdf40fa1e2397cb4ae68a12bd76f4c48c Mon Sep 17 00:00:00 2001 From: Zefram Date: Sun, 20 Jul 2014 17:27:58 +0100 Subject: [PATCH 0015/2261] Show filled buckets in creative inventory --- mods/bucket/init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/bucket/init.lua b/mods/bucket/init.lua index eeff992c..999b344b 100644 --- a/mods/bucket/init.lua +++ b/mods/bucket/init.lua @@ -51,7 +51,6 @@ function bucket.register_liquid(source, flowing, itemname, inventory_image, name inventory_image = inventory_image, stack_max = 1, liquids_pointable = true, - groups = {not_in_creative_inventory=1}, on_place = function(itemstack, user, pointed_thing) -- Must be pointing to node if pointed_thing.type ~= "node" then From 6967232619cfc6f5751d30390473181941b46c9b Mon Sep 17 00:00:00 2001 From: Gabriel Huber Date: Fri, 25 Jul 2014 19:12:01 +0200 Subject: [PATCH 0016/2261] Fix TNT init for undefined enable_tnt setting --- mods/tnt/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 1182acae..a2e5adaa 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -2,8 +2,8 @@ -- Default to enabled in singleplayer and disabled in multiplayer local singleplayer = minetest.is_singleplayer() local setting = minetest.setting_getbool("enable_tnt") -if (not singleplayer and setting ~= false) or - (singleplayer and setting ~= true) then +if (not singleplayer and setting ~= true) or + (singleplayer and setting == false) then return end From 5b5aa493b5c9e30949585e29db4be249462ab756 Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 7 Aug 2014 12:14:27 +0200 Subject: [PATCH 0017/2261] Fix boat flying up and some tweaks --- mods/boats/init.lua | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mods/boats/init.lua b/mods/boats/init.lua index 683325de..12126988 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -106,21 +106,21 @@ function boat.on_step(self, dtime) end if ctrl.left then if ctrl.down then - self.object:setyaw(yaw - math.pi / 120 - dtime * math.pi / 120) + self.object:setyaw(yaw - (1 + dtime) * 0.03) else - self.object:setyaw(yaw + math.pi / 120 + dtime * math.pi / 120) + self.object:setyaw(yaw + (1 + dtime) * 0.03) end end if ctrl.right then if ctrl.down then - self.object:setyaw(yaw + math.pi / 120 + dtime * math.pi / 120) + self.object:setyaw(yaw + (1 + dtime) * 0.03) else - self.object:setyaw(yaw - math.pi / 120 - dtime*math.pi/120) + self.object:setyaw(yaw - (1 + dtime) * 0.03) end end end local velo = self.object:getvelocity() - if self.v == 0 and velo.x == 0 and velo.z == 0 then + if self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then return end local s = get_sign(self.v) @@ -142,8 +142,10 @@ function boat.on_step(self, dtime) local nodedef = minetest.registered_nodes[minetest.get_node(p).name] if (not nodedef) or nodedef.walkable then self.v = 0 + new_acce = {x = 0, y = 1, z = 0} + else + new_acce = {x = 0, y = -9.8, z = 0} -- freefall in air -9.81 end - new_acce = {x = 0, y = -10, z = 0} new_velo = get_velocity(self.v, self.object:getyaw(), self.object:getvelocity().y) else p.y = p.y + 1 @@ -159,7 +161,7 @@ function boat.on_step(self, dtime) new_velo = get_velocity(self.v, self.object:getyaw(), y) else new_acce = {x = 0, y = 0, z = 0} - if math.abs(self.object:getvelocity().y) < 1 then + if math.abs(self.object:getvelocity().y) <= 2 then local pos = self.object:getpos() pos.y = math.floor(pos.y) + 0.5 self.object:setpos(pos) From 5dbc738dbda2e552b800a295c14b0a0949de19d9 Mon Sep 17 00:00:00 2001 From: Jat Date: Mon, 4 Aug 2014 18:28:09 +0200 Subject: [PATCH 0018/2261] Add API doors : Sound for door open and close. --- game_api.txt | 2 ++ mods/doors/init.lua | 20 ++++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/game_api.txt b/game_api.txt index 3d9d7a59..4eb2d782 100644 --- a/game_api.txt +++ b/game_api.txt @@ -46,6 +46,8 @@ The doors mod allows modders to register custom doors. node_box_top = regular nodebox, see [Node boxes], OPTIONAL, selection_box_bottom = regular nodebox, see [Node boxes], OPTIONAL, selection_box_top = regular nodebox, see [Node boxes], OPTIONAL, + sound_open_door = sound play for open door, OPTIONAL, + sound_close_door = sound play for close door, OPTIONAL, only_placer_can_open = true/false, ^ If true, only placer can open the door (locked for others) } diff --git a/mods/doors/init.lua b/mods/doors/init.lua index bb327b85..69416538 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -46,6 +46,14 @@ function doors.register_door(name, def) def.selection_box_top = box end + if not def.sound_close_door then + def.sound_close_door = "door_close" + end + if not def.sound_open_door then + def.sound_open_door = "door_open" + end + + minetest.register_craftitem(name, { description = def.description, inventory_image = def.inventory_image, @@ -138,17 +146,17 @@ function doors.register_door(name, def) pos.y = pos.y-dir minetest.swap_node(pos, {name=replace, param2=p2}) - local snd_1 = "_close" - local snd_2 = "_open" + local snd_1 = def.sound_close_door + local snd_2 = def.sound_open_door if params[1] == 3 then - snd_1 = "_open" - snd_2 = "_close" + snd_1 = def.sound_open_door + snd_2 = def.sound_close_door end if is_right(pos) then - minetest.sound_play("door"..snd_1, {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.sound_play(snd_1, {pos = pos, gain = 0.3, max_hear_distance = 10}) else - minetest.sound_play("door"..snd_2, {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.sound_play(snd_2, {pos = pos, gain = 0.3, max_hear_distance = 10}) end end From a1aee9a68f198441725b7c8076e282d6be97780f Mon Sep 17 00:00:00 2001 From: Zefram Date: Thu, 7 Aug 2014 13:46:21 +0200 Subject: [PATCH 0019/2261] Fix door hardness detection for open/close sounds --- mods/doors/init.lua | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 69416538..808f5f7d 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -16,17 +16,6 @@ doors = {} -- only_placer_can_open: if true only the player who placed the door can -- open it -local function is_right(pos) - local r1 = minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z}) - local r2 = minetest.get_node({x=pos.x, y=pos.y, z=pos.z-1}) - if string.find(r1.name, "door_") or string.find(r2.name, "door_") then - if string.find(r1.name, "_1") or string.find(r2.name, "_1") then - return true - else - return false - end - end -end function doors.register_door(name, def) def.groups.not_in_creative_inventory = 1 @@ -104,6 +93,8 @@ function doors.register_door(name, def) else minetest.set_node(pt, {name=name.."_b_2", param2=p2}) minetest.set_node(pt2, {name=name.."_t_2", param2=p2}) + minetest.get_meta(pt):set_int("right", 1) + minetest.get_meta(pt2):set_int("right", 1) end if def.only_placer_can_open then @@ -153,7 +144,7 @@ function doors.register_door(name, def) snd_2 = def.sound_close_door end - if is_right(pos) then + if minetest.get_meta(pos):get_int("right") ~= 0 then minetest.sound_play(snd_1, {pos = pos, gain = 0.3, max_hear_distance = 10}) else minetest.sound_play(snd_2, {pos = pos, gain = 0.3, max_hear_distance = 10}) From ef1f66a64e0fb72fcb2fee40e783722faa5c1257 Mon Sep 17 00:00:00 2001 From: BlockMen Date: Thu, 21 Aug 2014 12:45:14 +0200 Subject: [PATCH 0020/2261] Fix some farming stuff --- mods/farming/api.lua | 89 ++++++++++++++++++++---------------------- mods/farming/nodes.lua | 53 ++++++++++++++----------- 2 files changed, 74 insertions(+), 68 deletions(-) diff --git a/mods/farming/api.lua b/mods/farming/api.lua index f1767d17..e6d57f80 100644 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -44,7 +44,10 @@ farming.hoe_on_use = function(itemstack, user, pointed_thing, uses) pos = pt.under, gain = 0.5, }) - itemstack:add_wear(65535/(uses-1)) + + if not minetest.setting_getbool("creative_mode") then + itemstack:add_wear(65535/(uses-1)) + end return itemstack end @@ -135,25 +138,27 @@ end farming.register_plant = function(name, def) local mname = name:split(":")[1] local pname = name:split(":")[2] + -- Check def table - if def.description == nil then + if not def.description then def.description = "Seed" end - if def.inventory_image == nil then + if not def.inventory_image then def.inventory_image = "unknown_item.png" end - if def.steps == nil then + if not def.steps then return nil end - if def.minlight == nil then + if not def.minlight then def.minlight = 1 end - if def.maxlight == nil then + if not def.maxlight then def.maxlight = 14 end if not def.fertility then def.fertility = {} end + -- Register seed local g = {seed = 1, snappy = 3, attached_node = 1} for k, v in pairs(def.fertility) do @@ -179,40 +184,13 @@ farming.register_plant = function(name, def) return farming.place_seed(itemstack, placer, pointed_thing, mname .. ":seed_" .. pname) end }) - -- Seed -> plant - minetest.register_abm({ - nodenames = {"group:seed"}, - neighbors = {"group:soil"}, - interval = 90, - chance = 2, - action = function(pos, node) - local seedferts = minetest.registered_nodes[node.name].fertility - local soilferts = {} - -- Collect fertilities of soil - for k, v in pairs(minetest.registered_nodes[minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z}).name].groups) do - if k == "grassland" or k == "desert" then - soilferts[k] = k - end - end - -- Cannot grow if no fertility match found - local fertmatch = false - for k, v in pairs(seedferts) do - if soilferts[v] ~= nil then - fertmatch = true - break - end - end - - if fertmatch == true and minetest.get_item_group(minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z}).name, "wet") ~= 0 then - minetest.set_node(pos, {name = node.name:gsub("seed_", "") .. "_1"}) - end - end - }) + -- Register harvest minetest.register_craftitem(":" .. mname .. ":" .. pname, { description = pname:gsub("^%l", string.upper), inventory_image = mname .. "_" .. pname .. ".png", }) + -- Register growing steps for i=1,def.steps do local drop = { @@ -242,18 +220,38 @@ farming.register_plant = function(name, def) sounds = default.node_sound_leaves_defaults(), }) end + -- Growing ABM minetest.register_abm({ - nodenames = {"group:" .. pname}, + nodenames = {"group:" .. pname, "group:seed"}, neighbors = {"group:soil"}, interval = 90, chance = 2, action = function(pos, node) + local plant_height = minetest.get_item_group(node.name, pname) + -- return if already full grown - if minetest.get_item_group(node.name, pname) == def.steps then + if plant_height == def.steps then return end - + + local node_def = minetest.registered_items[node.name] or nil + + -- grow seed + if minetest.get_item_group(node.name, "seed") and node_def.fertility then + local can_grow = false + local soil_node = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z}) + for _, v in pairs(node_def.fertility) do + if minetest.get_item_group(soil_node.name, v) ~= 0 then + can_grow = true + end + end + if can_grow then + minetest.set_node(pos, {name = node.name:gsub("seed_", "") .. "_1"}) + end + return + end + -- check if on wet soil pos.y = pos.y - 1 local n = minetest.get_node(pos) @@ -261,20 +259,19 @@ farming.register_plant = function(name, def) return end pos.y = pos.y + 1 - + -- check light - if not minetest.get_node_light(pos) then + local ll = minetest.get_node_light(pos) + + if not ll or ll < def.minlight or ll > def.maxlight then return end - if minetest.get_node_light(pos) < def.minlight or minetest.get_node_light(pos) > def.maxlight then - return - end - + -- grow - local height = minetest.get_item_group(node.name, pname) + 1 - minetest.set_node(pos, {name = mname .. ":" .. pname .. "_" .. height}) + minetest.set_node(pos, {name = mname .. ":" .. pname .. "_" .. plant_height + 1}) end }) + -- Return local r = { seed = mname .. ":seed_" .. pname, diff --git a/mods/farming/nodes.lua b/mods/farming/nodes.lua index d8c1d2d2..ba7aed47 100644 --- a/mods/farming/nodes.lua +++ b/mods/farming/nodes.lua @@ -21,7 +21,7 @@ minetest.register_node("farming:soil", { tiles = {"farming_soil.png", "default_dirt.png"}, drop = "default:dirt", is_ground_content = true, - groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1}, + groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1, field = 1}, sounds = default.node_sound_dirt_defaults(), soil = { base = "default:dirt", @@ -35,7 +35,7 @@ minetest.register_node("farming:soil_wet", { tiles = {"farming_soil_wet.png", "farming_soil_wet_side.png"}, drop = "default:dirt", is_ground_content = true, - groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1, grassland = 1}, + groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1, grassland = 1, field = 1}, sounds = default.node_sound_dirt_defaults(), soil = { base = "default:dirt", @@ -57,7 +57,7 @@ minetest.register_node("farming:desert_sand_soil", { drop = "default:desert_sand", tiles = {"farming_desert_sand_soil.png", "default_desert_sand.png"}, is_ground_content = true, - groups = {crumbly=3, not_in_creative_inventory = 1, falling_node=1, sand=1, soil = 2, desert = 1}, + groups = {crumbly=3, not_in_creative_inventory = 1, falling_node=1, sand=1, soil = 2, desert = 1, field = 1}, sounds = default.node_sound_sand_defaults(), soil = { base = "default:desert_sand", @@ -71,7 +71,7 @@ minetest.register_node("farming:desert_sand_soil_wet", { drop = "default:desert_sand", tiles = {"farming_desert_sand_soil_wet.png", "farming_desert_sand_soil_wet_side.png"}, is_ground_content = true, - groups = {crumbly=3, falling_node=1, sand=1, not_in_creative_inventory=1, soil=3, wet = 1, desert = 1}, + groups = {crumbly=3, falling_node=1, sand=1, not_in_creative_inventory=1, soil=3, wet = 1, desert = 1, field = 1}, sounds = default.node_sound_sand_defaults(), soil = { base = "default:desert_sand", @@ -81,39 +81,48 @@ minetest.register_node("farming:desert_sand_soil_wet", { }) minetest.register_abm({ - nodenames = {"group:soil", "group:wet"}, - interval = 5, - chance = 10, + nodenames = {"group:field"}, + interval = 15, + chance = 4, action = function(pos, node) - pos.y = pos.y+1 - local nn = minetest.get_node(pos).name - node = minetest.registered_nodes[node.name] - pos.y = pos.y-1 - - if node.soil == nil or node.soil.wet == nil or node.soil.base == nil or node.soil.dry == nil then + local n_def = minetest.registered_nodes[node.name] or nil + local wet = n_def.soil.wet or nil + local base = n_def.soil.base or nil + local dry = n_def.soil.dry or nil + if not n_def or not n_def.soil or not wet or not base or not dry then return end + + pos.y = pos.y + 1 + local nn = minetest.get_node_or_nil(pos) + if not nn or not nn.name then + return + end + local nn_def = minetest.registered_nodes[nn.name] or nil + pos.y = pos.y - 1 - if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].walkable and minetest.get_item_group(nn, "plant") == 0 and node.name ~= node.soil.base then - minetest.set_node(pos, {name = node.soil.base}) + if nn_def and nn_def.walkable and minetest.get_item_group(nn.name, "plant") == 0 then + minetest.set_node(pos, {name = base}) + return end -- check if there is water nearby if minetest.find_node_near(pos, 3, {"group:water"}) then + local wet_lvl = minetest.get_item_group(node.name, "wet") -- if it is dry soil and not base node, turn it into wet soil - if node.name ~= node.soil.base and minetest.get_item_group(node.name, "wet") == 0 then - minetest.set_node(pos, {name = node.soil.wet}) + if wet_lvl == 0 then + minetest.set_node(pos, {name = wet}) end else -- turn it back into base if it is already dry - if minetest.get_item_group(node.name, "wet") == 0 then + if wet_lvl == 0 then -- only turn it back if there is no plant/seed on top of it - if minetest.get_item_group(nn, "plant") == 0 and minetest.get_item_group(nn, "seed") == 0 then - minetest.set_node(pos, {name = node.soil.base}) + if minetest.get_item_group(nn.name, "plant") == 0 and minetest.get_item_group(nn.name, "seed") == 0 then + minetest.set_node(pos, {name = base}) end -- if its wet turn it back into dry soil - elseif minetest.get_item_group(node.name, "wet") == 1 then - minetest.set_node(pos, {name = node.soil.dry}) + elseif wet_lvl == 1 then + minetest.set_node(pos, {name = dry}) end end end, From 11c04e984dd94c9fec45e4c659fe802dbe48ff79 Mon Sep 17 00:00:00 2001 From: BlockMen Date: Thu, 21 Aug 2014 15:22:35 +0200 Subject: [PATCH 0021/2261] Localize player_attached --- mods/default/player.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/default/player.lua b/mods/default/player.lua index 0498b19f..22cf27ef 100644 --- a/mods/default/player.lua +++ b/mods/default/player.lua @@ -162,6 +162,7 @@ end) -- Localize for better performance. local player_set_animation = default.player_set_animation +local player_attached = default.player_attached -- Check each player and apply animations minetest.register_globalstep(function(dtime) @@ -169,7 +170,7 @@ minetest.register_globalstep(function(dtime) local name = player:get_player_name() local model_name = player_model[name] local model = model_name and models[model_name] - if model and not default.player_attached[name] then + if model and not player_attached[name] then local controls = player:get_player_control() local walking = false local animation_speed_mod = model.animation_speed or 30 From 49a8ddc8226230050f53943c688530f747b16194 Mon Sep 17 00:00:00 2001 From: Calinou Date: Fri, 22 Aug 2014 11:52:51 +0200 Subject: [PATCH 0022/2261] Make sand and some leaves sounds quieter --- mods/default/functions.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 6840c5d2..80e8c80d 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -40,9 +40,9 @@ end function default.node_sound_sand_defaults(table) table = table or {} table.footstep = table.footstep or - {name="default_sand_footstep", gain=0.5} + {name="default_sand_footstep", gain=0.2} table.dug = table.dug or - {name="default_sand_footstep", gain=1.0} + {name="default_sand_footstep", gain=0.4} table.place = table.place or {name="default_place_node", gain=1.0} default.node_sound_defaults(table) @@ -64,7 +64,7 @@ function default.node_sound_leaves_defaults(table) table.footstep = table.footstep or {name="default_grass_footstep", gain=0.35} table.dug = table.dug or - {name="default_grass_footstep", gain=0.85} + {name="default_grass_footstep", gain=0.7} table.dig = table.dig or {name="default_dig_crumbly", gain=0.4} table.place = table.place or From 44dc61108886efd0eac5fcd29e1c73234d3b161c Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Sat, 6 Sep 2014 20:34:52 -0400 Subject: [PATCH 0023/2261] Fix farming unloaded node crash --- mods/farming/api.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/farming/api.lua b/mods/farming/api.lua index e6d57f80..6ce996d8 100644 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -241,6 +241,9 @@ farming.register_plant = function(name, def) if minetest.get_item_group(node.name, "seed") and node_def.fertility then local can_grow = false local soil_node = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z}) + if not soil_node then + return + end for _, v in pairs(node_def.fertility) do if minetest.get_item_group(soil_node.name, v) ~= 0 then can_grow = true From cc2573acdf7dce56bb8547e2e6943c364a51ce88 Mon Sep 17 00:00:00 2001 From: CraigyDavi Date: Thu, 4 Sep 2014 23:10:33 +0100 Subject: [PATCH 0024/2261] Remove API from player.lua It's now in game_api.txt --- mods/default/player.lua | 49 ----------------------------------------- 1 file changed, 49 deletions(-) diff --git a/mods/default/player.lua b/mods/default/player.lua index 22cf27ef..688ef62f 100644 --- a/mods/default/player.lua +++ b/mods/default/player.lua @@ -1,55 +1,6 @@ -- Minetest 0.4 mod: player -- See README.txt for licensing and other information. ---[[ - -API ---- - -default.player_register_model(name, def) -^ Register a new model to be used by players. -^ is the model filename such as "character.x", "foo.b3d", etc. -^ See Model Definition below for format of . - -default.registered_player_models[name] -^ See Model Definition below for format. - -default.player_set_model(player, model_name) -^ is a PlayerRef. -^ is a model registered with player_register_model. - -default.player_set_animation(player, anim_name [, speed]) -^ is a PlayerRef. -^ is the name of the animation. -^ is in frames per second. If nil, default from the model is used - -default.player_set_textures(player, textures) -^ is a PlayerRef. -^ is an array of textures -^ If is nil, the default textures from the model def are used - -default.player_get_animation(player) -^ is a PlayerRef. -^ Returns a table containing fields "model", "textures" and "animation". -^ Any of the fields of the returned table may be nil. - -Model Definition ----------------- - -model_def = { - animation_speed = 30, -- Default animation speed, in FPS. - textures = {"character.png", }, -- Default array of textures. - visual_size = {x=1, y=1,}, -- Used to scale the model. - animations = { - -- = { x=, y=, }, - foo = { x= 0, y=19, }, - bar = { x=20, y=39, }, - -- ... - }, -} - -]] - -- Player animation blending -- Note: This is currently broken due to a bug in Irrlicht, leave at 0 local animation_blend = 0 From c95cd8414b8917a80fe125da18c4c0858d74b1c9 Mon Sep 17 00:00:00 2001 From: BlockMen Date: Tue, 16 Sep 2014 17:11:54 +0200 Subject: [PATCH 0025/2261] Fix xpanes API --- game_api.txt | 6 +----- mods/xpanes/init.lua | 29 ++++++++++++++++++----------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/game_api.txt b/game_api.txt index 4eb2d782..1ad618dc 100644 --- a/game_api.txt +++ b/game_api.txt @@ -120,7 +120,7 @@ Xpanes API Creates panes that automatically connect to each other xpanes.register_pane(subname, def) - -> subname: used for nodename. Result: "xpanes:subname_{1..16}" + -> subname: used for nodename. Result: "xpanes:subname" and "xpanes:subname_{2..15}" -> def: See [#Pane definition] #Pane definition @@ -134,10 +134,6 @@ xpanes.register_pane(subname, def) ^ See [#Default sounds] recipe = {{"","","","","","","","",""}}, ^ Recipe field only - on_construct = function(pos) - update_pane(pos, "pane") - end, - ^ Required to handle rotation correctly } Default sounds diff --git a/mods/xpanes/init.lua b/mods/xpanes/init.lua index 506b83cb..b9c578eb 100644 --- a/mods/xpanes/init.lua +++ b/mods/xpanes/init.lua @@ -37,9 +37,18 @@ end local function update_nearby(pos, node) node = node or minetest.get_node(pos) - if node.name:sub(1, 7) ~= "xpanes:" then return end - local underscore_pos = node.name:find("_") or 0 - local name = node.name:sub(8, underscore_pos - 1) + local name = node.name + if not name or node.name:sub(1, 7) ~= "xpanes:" then + return + end + local underscore_pos = string.find(name, "_[^_]*$") or 0 + local len = name:len() + local num = tonumber(name:sub(underscore_pos+1, len)) + if not num or num < 1 or num > 15 then + name = name:sub(8) + else + name = name:sub(8, underscore_pos - 1) + end for i, dir in pairs(directions) do update_pane({ x = pos.x + dir.x, @@ -105,7 +114,7 @@ function xpanes.register_pane(name, def) if cnt == 1 then texture = def.textures[1].."^"..def.textures[2] end - minetest.register_node("xpanes:"..name.."_"..i, { + minetest.register_node(":xpanes:"..name.."_"..i, { drawtype = "nodebox", tiles = {def.textures[3], def.textures[3], texture}, paramtype = "light", @@ -123,7 +132,11 @@ function xpanes.register_pane(name, def) }) end - minetest.register_node("xpanes:"..name, def) + def.on_construct = function(pos) + update_pane(pos, name) + end + + minetest.register_node(":xpanes:"..name, def) minetest.register_craft({ output = "xpanes:"..name.." 16", @@ -150,9 +163,6 @@ xpanes.register_pane("pane", { wield_image = "default_glass.png", sounds = default.node_sound_glass_defaults(), groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3, pane=1}, - on_construct = function(pos) - update_pane(pos, "pane") - end, recipe = { {'default:glass', 'default:glass', 'default:glass'}, {'default:glass', 'default:glass', 'default:glass'} @@ -175,9 +185,6 @@ xpanes.register_pane("bar", { wield_image = "xpanes_bar.png", groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3, pane=1}, sounds = default.node_sound_stone_defaults(), - on_construct = function(pos) - update_pane(pos, "bar") - end, recipe = { {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'} From c32957f9428d200c1dad93f2afa8c12749fd3848 Mon Sep 17 00:00:00 2001 From: Amaz Date: Tue, 29 Jul 2014 18:25:33 +0100 Subject: [PATCH 0026/2261] Enable dungeons by default --- minetest.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/minetest.conf b/minetest.conf index 3fb76797..cda1589f 100644 --- a/minetest.conf +++ b/minetest.conf @@ -1,3 +1,4 @@ +mg_flags = dungeons mgv6_spflags = biomeblend, jungles movement_liquid_sink = 25 From 9670c27161c4ad86468faece4f964676eafec78e Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Fri, 13 Jun 2014 14:03:14 -0400 Subject: [PATCH 0027/2261] Clean up treegen code --- mods/default/functions.lua | 50 ------ mods/default/trees.lua | 315 ++++++++++++++++++++----------------- 2 files changed, 174 insertions(+), 191 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 80e8c80d..fe553c51 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -127,56 +127,6 @@ end minetest.register_on_punchnode(on_punchnode) --- --- Grow trees --- - -minetest.register_abm({ - nodenames = {"default:sapling"}, - interval = 10, - chance = 50, - action = function(pos, node) - local nu = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name - local is_soil = minetest.get_item_group(nu, "soil") - if is_soil == 0 then - return - end - - minetest.log("action", "A sapling grows into a tree at "..minetest.pos_to_string(pos)) - local vm = minetest.get_voxel_manip() - local minp, maxp = vm:read_from_map({x=pos.x-16, y=pos.y, z=pos.z-16}, {x=pos.x+16, y=pos.y+16, z=pos.z+16}) - local a = VoxelArea:new{MinEdge=minp, MaxEdge=maxp} - local data = vm:get_data() - default.grow_tree(data, a, pos, math.random(1, 4) == 1, math.random(1,100000)) - vm:set_data(data) - vm:write_to_map(data) - vm:update_map() - end -}) - -minetest.register_abm({ - nodenames = {"default:junglesapling"}, - interval = 10, - chance = 50, - action = function(pos, node) - local nu = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name - local is_soil = minetest.get_item_group(nu, "soil") - if is_soil == 0 then - return - end - - minetest.log("action", "A jungle sapling grows into a tree at "..minetest.pos_to_string(pos)) - local vm = minetest.get_voxel_manip() - local minp, maxp = vm:read_from_map({x=pos.x-16, y=pos.y-1, z=pos.z-16}, {x=pos.x+16, y=pos.y+16, z=pos.z+16}) - local a = VoxelArea:new{MinEdge=minp, MaxEdge=maxp} - local data = vm:get_data() - default.grow_jungletree(data, a, pos, math.random(1,100000)) - vm:set_data(data) - vm:write_to_map(data) - vm:update_map() - end -}) - -- -- Lavacooling -- diff --git a/mods/default/trees.lua b/mods/default/trees.lua index e68c0554..5752fe0d 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -1,150 +1,183 @@ +-- +-- Grow trees +-- + +local random = math.random + +local function can_grow(pos) + local node_under = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z}) + if not node_under then + return false + end + local name_under = node_under.name + local is_soil = minetest.get_item_group(name_under, "soil") + if is_soil == 0 then + return false + end + return true +end + +minetest.register_abm({ + nodenames = {"default:sapling"}, + interval = 10, + chance = 50, + action = function(pos, node) + if not can_grow(pos) then + return + end + + minetest.log("action", "A sapling grows into a tree at "..minetest.pos_to_string(pos)) + default.grow_tree(pos, random(1, 4) == 1) + end +}) + +minetest.register_abm({ + nodenames = {"default:junglesapling"}, + interval = 10, + chance = 50, + action = function(pos, node) + if not can_grow(pos) then + return + end + + minetest.log("action", "A jungle sapling grows into a tree at ".. + minetest.pos_to_string(pos)) + default.grow_jungletree(pos) + end +}) + + local c_air = minetest.get_content_id("air") -local c_ignore = minetest.get_content_id("ignore") -local c_tree = minetest.get_content_id("default:tree") -local c_leaves = minetest.get_content_id("default:leaves") local c_apple = minetest.get_content_id("default:apple") -function default.grow_tree(data, a, pos, is_apple_tree, seed) - --[[ - NOTE: Tree-placing code is currently duplicated in the engine - and in games that have saplings; both are deprecated but not - replaced yet - ]]-- - local pr = PseudoRandom(seed) - local th = pr:next(4, 5) - local x, y, z = pos.x, pos.y, pos.z - for yy = y, y+th-1 do - local vi = a:index(x, yy, z) - if a:contains(x, yy, z) and (data[vi] == c_air or yy == y) then - data[vi] = c_tree - end - end - y = y+th-1 -- (x, y, z) is now last piece of trunk - local leaves_a = VoxelArea:new{MinEdge={x=-2, y=-1, z=-2}, MaxEdge={x=2, y=2, z=2}} - local leaves_buffer = {} - - -- Force leaves near the trunk - local d = 1 - for xi = -d, d do - for yi = -d, d do - for zi = -d, d do - leaves_buffer[leaves_a:index(xi, yi, zi)] = true - end - end - end - - -- Add leaves randomly - for iii = 1, 8 do - local d = 1 - local xx = pr:next(leaves_a.MinEdge.x, leaves_a.MaxEdge.x - d) - local yy = pr:next(leaves_a.MinEdge.y, leaves_a.MaxEdge.y - d) - local zz = pr:next(leaves_a.MinEdge.z, leaves_a.MaxEdge.z - d) - - for xi = 0, d do - for yi = 0, d do - for zi = 0, d do - leaves_buffer[leaves_a:index(xx+xi, yy+yi, zz+zi)] = true - end - end - end - end - - -- Add the leaves - for xi = leaves_a.MinEdge.x, leaves_a.MaxEdge.x do - for yi = leaves_a.MinEdge.y, leaves_a.MaxEdge.y do - for zi = leaves_a.MinEdge.z, leaves_a.MaxEdge.z do - if a:contains(x+xi, y+yi, z+zi) then - local vi = a:index(x+xi, y+yi, z+zi) - if data[vi] == c_air or data[vi] == c_ignore then - if leaves_buffer[leaves_a:index(xi, yi, zi)] then - if is_apple_tree and pr:next(1, 100) <= 10 then - data[vi] = c_apple - else - data[vi] = c_leaves - end - end - end - end - end - end - end +local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid, + height, size, iters, is_apple_tree) + local x, y, z = pos.x, pos.y, pos.z + + -- Trunk + for y_dist = 0, height - 1 do + local vi = a:index(x, y + y_dist, z) + if y_dist == 0 or data[vi] == c_air or data[vi] == leaves_cid then + data[vi] = tree_cid + end + end + + -- Force leaves near the trunk + for z_dist = -1, 1 do + for y_dist = -size, 1 do + local vi = a:index(x - 1, y + height + y_dist, z + z_dist) + for x_dist = -1, 1 do + if data[vi] == c_air then + if is_apple_tree and random(1, 8) == 1 then + data[vi] = c_apple + else + data[vi] = leaves_cid + end + end + vi = vi + 1 + end + end + end + + -- Randomly add leaves in 2x2x2 clusters. + for i = 1, iters do + local clust_x = x + random(-size, size - 1) + local clust_y = y + height + random(-size, 0) + local clust_z = z + random(-size, size - 1) + + for xi = 0, 1 do + for yi = 0, 1 do + for zi = 0, 1 do + local vi = a:index(clust_x + xi, clust_y + yi, clust_z + zi) + if data[vi] == c_air then + if is_apple_tree and random(1, 8) == 1 then + data[vi] = c_apple + else + data[vi] = leaves_cid + end + end + end + end + end + end +end + + +local c_tree = minetest.get_content_id("default:tree") +local c_leaves = minetest.get_content_id("default:leaves") + +function default.grow_tree(pos, is_apple_tree, bad) + --[[ + NOTE: Tree-placing code is currently duplicated in the engine + and in games that have saplings; both are deprecated but not + replaced yet + --]] + if bad then + error("Deprecated use of default.grow_tree") + end + + local x, y, z = pos.x, pos.y, pos.z + local height = random(4, 5) + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = pos.x - 2, y = pos.y, z = pos.z - 2}, + {x = pos.x + 2, y = pos.y + height + 1, z = pos.z + 2} + ) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + add_trunk_and_leaves(data, a, pos, c_tree, c_leaves, height, 2, 8, is_apple_tree) + + vm:set_data(data) + vm:write_to_map() + vm:update_map() end local c_jungletree = minetest.get_content_id("default:jungletree") local c_jungleleaves = minetest.get_content_id("default:jungleleaves") -function default.grow_jungletree(data, a, pos, seed) - --[[ - NOTE: Tree-placing code is currently duplicated in the engine - and in games that have saplings; both are deprecated but not - replaced yet - ]]-- - local pr = PseudoRandom(seed) - local x, y, z = pos.x, pos.y, pos.z - for xi = -1, 1 do - for zi = -1, 1 do - if pr:next(1, 3) >= 2 then - local vi1 = a:index(x+xi, y, z+zi) - local vi2 = a:index(x+xi, y-1, z+zi) - if a:contains(x+xi, y-1, z+zi) and data[vi2] == c_air then - data[vi2] = c_jungletree - elseif a:contains(x+xi, y, z+zi) and data[vi1] == c_air then - data[vi1] = c_jungletree - end - end - end - end - - local th = pr:next(8, 12) - for yy = y, y+th-1 do - local vi = a:index(x, yy, z) - if a:contains(x, yy, z) and (data[vi] == c_air or yy == y) then - data[vi] = c_jungletree - end - end - y = y+th-1 -- (x, y, z) is now last piece of trunk - local leaves_a = VoxelArea:new{MinEdge={x=-3, y=-2, z=-3}, MaxEdge={x=3, y=2, z=3}} - local leaves_buffer = {} - - -- Force leaves near the trunk - local d = 1 - for xi = -d, d do - for yi = -d, d do - for zi = -d, d do - leaves_buffer[leaves_a:index(xi, yi, zi)] = true - end - end - end - - -- Add leaves randomly - for iii = 1, 30 do - local d = 1 - local xx = pr:next(leaves_a.MinEdge.x, leaves_a.MaxEdge.x - d) - local yy = pr:next(leaves_a.MinEdge.y, leaves_a.MaxEdge.y - d) - local zz = pr:next(leaves_a.MinEdge.z, leaves_a.MaxEdge.z - d) - - for xi = 0, d do - for yi = 0, d do - for zi = 0, d do - leaves_buffer[leaves_a:index(xx+xi, yy+yi, zz+zi)] = true - end - end - end - end - - -- Add the leaves - for xi = leaves_a.MinEdge.x, leaves_a.MaxEdge.x do - for yi = leaves_a.MinEdge.y, leaves_a.MaxEdge.y do - for zi = leaves_a.MinEdge.z, leaves_a.MaxEdge.z do - if a:contains(x+xi, y+yi, z+zi) then - local vi = a:index(x+xi, y+yi, z+zi) - if data[vi] == c_air or data[vi] == c_ignore then - if leaves_buffer[leaves_a:index(xi, yi, zi)] then - data[vi] = c_jungleleaves - end - end - end - end - end - end +function default.grow_jungletree(pos, bad) + --[[ + NOTE: Tree-placing code is currently duplicated in the engine + and in games that have saplings; both are deprecated but not + replaced yet + --]] + if bad then + error("Deprecated use of default.grow_jungletree") + end + + local x, y, z = pos.x, pos.y, pos.z + local height = random(8, 12) + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = pos.x - 3, y = pos.y - 1, z = pos.z - 3}, + {x = pos.x + 3, y = pos.y + height + 1, z = pos.z + 3}) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + add_trunk_and_leaves(data, a, pos, c_jungletree, c_jungleleaves, height, 3, 30, false) + + -- Roots + for z_dist = -1, 1 do + local vi_1 = a:index(x - 1, y - 1, z + z_dist) + local vi_2 = a:index(x - 1, y, z + z_dist) + for x_dist = -1, 1 do + if random(1, 3) >= 2 then + if data[vi_1] == c_air then + data[vi_1] = c_jungletree + elseif data[vi_2] == c_air then + data[vi_2] = c_jungletree + end + end + vi_1 = vi_1 + 1 + vi_2 = vi_2 + 1 + end + end + + vm:set_data(data) + vm:write_to_map() + vm:update_map() end + From c4969665e75e80e378d696b48d451a245e54d81f Mon Sep 17 00:00:00 2001 From: BlockMen Date: Tue, 16 Sep 2014 19:12:31 +0200 Subject: [PATCH 0028/2261] Fix dye stuff, fixes #243 --- mods/default/craftitems.lua | 1 + mods/dye/init.lua | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index 026a31c0..3d2cb113 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -19,6 +19,7 @@ minetest.register_craftitem("default:book", { minetest.register_craftitem("default:coal_lump", { description = "Coal Lump", inventory_image = "default_coal_lump.png", + groups = {coal = 1} }) minetest.register_craftitem("default:iron_lump", { diff --git a/mods/dye/init.lua b/mods/dye/init.lua index ebdc9380..810502d2 100644 --- a/mods/dye/init.lua +++ b/mods/dye/init.lua @@ -73,7 +73,7 @@ dyelocal.dyes = { {"dark_green", "Dark green dye",{dye=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}}, {"green", "Green dye", {dye=1, basecolor_green=1, excolor_green=1, unicolor_green=1}}, {"yellow", "Yellow dye", {dye=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}}, - {"brown", "Brown dye", {dye=1, basecolor_yellow=1, excolor_orange=1, unicolor_dark_orange=1}}, + {"brown", "Brown dye", {dye=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1}}, {"orange", "Orange dye", {dye=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}}, {"red", "Red dye", {dye=1, basecolor_red=1, excolor_red=1, unicolor_red=1}}, {"magenta", "Magenta dye", {dye=1, basecolor_magenta=1, excolor_red_violet=1,unicolor_red_violet=1}}, @@ -98,6 +98,12 @@ for _, row in ipairs(dyelocal.dyes) do recipe = {"group:flower,color_"..name}, }) end +-- manually add coal->black dye +minetest.register_craft({ + type = "shapeless", + output = "dye:black 4", + recipe = {"group:coal"}, +}) -- Mix recipes -- Just mix everything to everything somehow sanely From 8fe62ea7f6b96fe41995d50f4c682b17adb2c227 Mon Sep 17 00:00:00 2001 From: BlockMen Date: Sun, 21 Sep 2014 22:25:00 +0200 Subject: [PATCH 0029/2261] Use new firelike drawtype --- 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 9acda876..4ce9f6a7 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -2,7 +2,7 @@ minetest.register_node("fire:basic_flame", { description = "Fire", - drawtype = "plantlike", + drawtype = "firelike", tiles = {{ name="fire_basic_flame_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1}, From 9dfaab7f20bf3ef2b4d649cde5125622ef84d0fe Mon Sep 17 00:00:00 2001 From: Neuromancer56 Date: Mon, 22 Sep 2014 21:04:07 -0500 Subject: [PATCH 0030/2261] Some new textures (natural beauty texturepack) --- mods/default/textures/default_cobble.png | Bin 323 -> 511 bytes mods/default/textures/default_dirt.png | Bin 835 -> 710 bytes .../default/textures/default_furnace_front.png | Bin 553 -> 572 bytes .../textures/default_furnace_front_active.png | Bin 4278 -> 720 bytes mods/default/textures/default_furnace_side.png | Bin 602 -> 626 bytes mods/default/textures/default_furnace_top.png | Bin 602 -> 511 bytes mods/default/textures/default_grass.png | Bin 657 -> 801 bytes .../textures/default_grass_footsteps.png | Bin 771 -> 827 bytes mods/default/textures/default_grass_side.png | Bin 470 -> 699 bytes mods/default/textures/default_mossycobble.png | Bin 689 -> 501 bytes 10 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/textures/default_cobble.png b/mods/default/textures/default_cobble.png index e0fe5ddcacf1575750eee5916447ab8fb45b1ed9..147b8f946493630b94f7e1e85978885f7ffdc7f6 100644 GIT binary patch delta 496 zcmV3~gydTO?PH%~ zH|6o?ZW!w3dfs*C8T`1ve0lDMZ_TgMzNzQOhmY|b>P@o%F85!n!?A*s(sR3>dA9v3 zaX2%!KCl|w6{Jc}HnqkwtUAtDb7_ZY}=9WB;hXyfI zOCBUtF#sO=OJ5ao?M|@__17$ zsj;~AP&2cGaHL8r&XvB1MyuS(J^|Nl5E-NPz}SS{Bu__C47!J?=FAXCX<7 zr%d=Bye2Zu{0o4LL)#LnXlvj)`%W$gV*qqWVOskpvEC$Grhf&EE~{fEK?oe*`yRAT zBP9TFoSQSOf-neV9&ZpS6@&mFy_;tMIE>)D)cY1b-86N6C@3%ToYm;0Il10h3zYz@ zl-A1TFYylK@dp5Fy#|=1yDi+u2>|=$u2Pg$L;c|gXinDTlBPgp+K$)bewU{IYr0}W hWPH;LN@>a0xwBKK~y+TJyPq7 z(?Af(8(+SDzi7Ss{Ox!={y2Mj_VUH^pTF*ZKRi4;KW{V| z%096@Q(Z-N6`0#(ocna{lESB@NA`1f&W4poVoME1y=5}V*Z_d>O~%)WlTQh<-0XOI zJEGmKa6Yc$$m-0T{zSW&>g|8n?gzA^fC(S!66Y$k2V!bS5jMQ$`X(7y@yPDJ_Nf|B zm1&n$Z7O%^1eT<9?BEX7+Zn4uT5x^Nt}?DKLWxgZ64@Fzdr|@CwP2q%5$poLN}Mtr z!A$NM!Wra1x+L=`=y0oKz6EZ;a6nP!Q;48B91(<8H>4e38Xh8vz7>D`U#GpK56ov=JEZ767E& z_}?N{yG!haZ-4^TaGZZI9V~LPu3Q%;sR)dW8)ax=wL2l72JpCp8E7KL2c4~82zHqV z1rvY;m)k&5JzqFPjK*L%^(ZpPZxe@;w(J4#VjWqiKpjNu-OHlTdT;kYw-M|nb*s=s z-^yJXmw~mzvw38#H-LCA?D<5)_zT}G11d({oM~|N4DW`K~yLeB~ocq+E5gIKct;579n8^dk9+yAt8Ve z1c|Z+5>^or5glxm+IETvm1?z4wac`f&h%gQGX3!K-b~Kiv)qG9VQa>NqrHDMSAWfk zb_Cmp8i$gWC%w26&8pm@#|N z?zg2dDo}VgYClXkN-z~p#;N((if!0eP(5N-8Pj{2s|1ZVJJHKVWLvPpRCH10D?aUb z(?1j)KL+UvW4zxJuiG*7&`*C!wr3A}sgf5TB&ew2(S;(Y41v@D4%baHl67i!j^I~*x|dlm0_J~G08cxff9|X` zSrfQ{vCAKSjyG=G;7d?LM2jQljhJYA0pDeGMUQryx17u2d0mhknho2^Y1V_9ECJ@P z8j&_{g&~SxH?1&jjzE)gDCfaSw6RPZcjK;(UB^ugQusB@LgWC2x&ugZtwM{p+}eU$2OD41`Te*Pf&%xG bGW!n?sra*PQr-;{00000NkvXXu0mjfF*s^Y diff --git a/mods/default/textures/default_furnace_front.png b/mods/default/textures/default_furnace_front.png index cbc21c6e41b260ac4ba858d7da5a2520c50cc1f3..d0a4c477881fa26b773eeee5745d920c07d21334 100644 GIT binary patch delta 558 zcmV+}0@3}c1iS>08Gix*005AYXf^-<00d`2O+f$vv5yPsKoDIiPk!>de;~3Nkvud_Y8)WM-f$YiiDhK%Q?EbGU$d0iiCW6e*S4XMS>DdP&EZ zXr7zOZ3?^29*HVT^V_TW&E-GK{0&e?8F`5oB0!K20Do%bs(D0t;SsD6_=@Su2l4~> zzMRE!Rhp!X9hT}9r=!tmKmR`fb#z6(?bvG@wcLWCGIe+T>icfR6S|2XaU$YiDdN40 z+d3d!VZYVE+t%t*W3ygvxm9evw(+y|GG1$Gyr{U>aj$Ruy72SdB%yN$UCphW+g0Xu w`BUFpZ6|B=naL78aw!C%Czs6NjIu=k4F~zFJ~s`Jf&c&j07*qoM6N<$f=*fex&QzG delta 539 zcmV+$0_6R?1gQj&8Gi-<001BJ|6u?C0q{vgK~#9!m6Kaf8c`I54~hLbeQMH|HnEL0 z1`8w1onh|G4Tc%PON^pLZAC4$h-lTsQtBUF-8rwl$-_!c_U!rg%HCNljU(KR2Kae@ ziOoF2RyRj8^f5ZwL)>urJ8MRmUY{fOTm-g-EQxV-)<+tJV1FJJk}$wzc!zF(d837Q~k_+XY%gYTHg(-^aF=g@>A)YT>2eC%NH z<#Q~*egR!r#zj9zjbM{OkM}0@bBo+FQ&ZuXHJWaq-7qoxybZ?KA2t2jLnrZQvdg8* z5|~^SpjJz;6@LN3yH|L&u<$nkSKcrnmR3+H6`_c0VB@m`OvlG~9PROjr)bz~V?5Z! z^_L^CosA6p-2_r;@u>jbo3%o|3zo+|+JQMYAol8rJQGY4-=ikc=GT_y0tB`K-%`Qu zFZS^;+MU}$x8Q0n_RJhFbm&P$(4s z2}l~WM86JpJ37YQ4--E}Otdt#u->%sFh0P}x=Opzu$ijp zG!?S@fu>q$g*>5@R1X2AlWB@fBm-3nkyt50CVihA!qUqywGy0q1tebMCs!*_B>|#P dhDurZ1r(wUyOe$VJ9_{C002ovPDHLkV1ns$|8f8T diff --git a/mods/default/textures/default_furnace_front_active.png b/mods/default/textures/default_furnace_front_active.png index caf495fc5c8653c0e100bff3ba5ce407302f4a07..1418c9a7f6e90ef273bea55607615a5707fa6160 100644 GIT binary patch delta 709 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 YPq;ozY3N_a+yDRo07*qoM6N<$f?};;EC2ui diff --git a/mods/default/textures/default_furnace_side.png b/mods/default/textures/default_furnace_side.png index e8191f7b3bd985cb05125f91c37704d534fe6fa9..1417c8dccbf55808ecbe605367d81ef35b57a36b 100644 GIT binary patch delta 612 zcmV-q0-OEX1o8xs8Gix*005AYXf^-<00d`2O+f$vv5yP$cln0S5$OK@b#qIJ^}E)Ed9F{eSsA>?GSwlQTE>-Z|&K zNOCY3qpCcy?Pu=9zSy@m+p5RHQt2cMW<$uRrapp9d{0O-0X(FjS_egGXTlyLA>WE%G2i=ijML(Ip;ABug{Gt4=Du^23rSPXRuKMn#2 z-~;&Meb59`0U*GFy>DjY$e8Dw`5E_fbUAO+%qR*a@^!usxn0<~4R0L-Sp3#E-e=s}bQjR337gaI z-bHQglU=T|ueE~sX2}c|tA7EVW$Qt;@LWIu0000QlO=^3(DX!e(;YT&vS;%@Zp^#CnslllDPHlXL(xP$dBc<{9ND4ug#sT zrWdBg)khn*v#+wfyR`M}a?ISczWF4s8-)_KThcp;q~DF@v=gi7OWi(x_HUu^OvENrL>5gsrAb&qp>^)TgNd>y0?Z|4n%t#6$EJ}%{O zKOw1ueW?Y3lz+6krM?Q5b*&DDGa#lZ}Y<>!0(P9;T9_@~D)GT&b_r0z{p*jSfJF zXGu1KQ9+|zkes%2p!aR9WiygXrYqr%^L|9ERePy!3~gydTO?PH%~ zH|6o?ZW!w3dfs*C8T`1ve0lDMZ_TgMzNzQOhmY|b>P@o%F85!n!?A*s(sR3>dA9v3 zaX2%!KCl|w6{Jc}HnqkwtUAtDb7_ZY}=9WB;hXyfI zOCBUtF#sO=OJ5ao?M|@__17$ zsj;~AP&2cGaHL8r&XQlO=^3(DX!e(;YT&vS;%@Zp^#CnslllDPHlXL(xP$dBc<{9ND4ug#sT zrWdBg)khn*v#+wfyR`M}a?ISczWF4s8-)_KThcp;q~DF@v=gi7OWi(x_HUu^OvENrL>5gsrAb&qp>^)TgNd>y0?Z|4n%t#6$EJ}%{O zKOw1ueW?Y3lz+6krM?Q5b*&DDGa#lZ}Y<>!0(P9;T9_@~D)GT&b_r0z{p*jSfJF zXGu1KQ9+|zkes%2p!aR9WiygXrYqr%^L|9ERePy!sV?0@6UJ-_7Kb1o)(ooFY` zqb?{ow-S|rdU7u9Oq4w$eCxqlvPyQ9Nk+=JIRmR62J4<2G-@gT9QqZ38piD?u!Cw| zamlfU&n!Z=nT5~G0by4RW*}~n(_YPkoRUL)Vs=2ujFb*2#Acj1^hj;{YtGtmR>tc| z7t=!`|9k7C+EJf?+Rcgy}%zTC+t zLEZBU9__AG$m$`DDlYmIorKrC?h?|$hSvfLOOIl>6-IU|s->}cCPx$~DAgm2&!HKz zdP>FnYg9&#`u`V#MX6A@-3+V-PHivJ?ai}M>yMGaa!(f$*W3!D)0hWBU>uVud zeh#o^*TkZS%)NRxwlDMdTf0fH0k&d#xCSxhXT0grPQt-AF?sJ}Mne0${uErPLD$;w z5A)MSNKLGE6Vd)-_^5u>Q8zg-3LumS*P9#E6{$Idvcz9j_}pe1-IH~NUWZ2f-xw^! zCk20!&wq`Q8-q)@7O+R9Gt=>3le0UyrTXM=aBjt9_VHbYL{tiXE?CVI#B`iVj>Aoj z4)$zZsw*Nn4rZ`@C!datmXQ!3X19QG1i{n7?2o+Hejj<&)MHIFy1b=JG%aBapujestXT-~r03{a{Y;qJD z#!hHsO@{j$Go`#*!W4(~i@p{xX2iIaBtv|aNcM(S5TPJab6Fi-83}9WyoShS$YKk~ zm;pVt3B}`Pknn4^DNcb`RwXrsI0ZjN^dc2hzl-+0c|iUH=Ood7?_cZv00000NkvXX It^-0~g6NxPegFUf delta 632 zcmV-;0*C#f29X7jB!3BTNLh0L01FZT01FZU(%pXi0006*NklzqzBWPnYp5AI{t(oFI@#o*4I)jCXi6ml;^!nSLD&KFh z5FMWF*V9dCF*pqXX4L92=a*j(De>vcSu`HET?$1TY^^Pq(0?28`tyN^l*U*}51raP z8DsEvi7_w&kFTTdl$2t#vCl_OL_dD4Oidf~&dyVjWv=rjJk~gP+#HPe_I8PB1T!uf5XL_h!pPtMKfCT=hbvC5+DUgRF}sJq7Q4Sk@PdVtqP&a2p?WHjX1=D$3F~e7>v zlPQ;+OK~C2nE*ga{B~NjK`zA1KYbi`M_+*Kh*C?tLG|)!8&hq}Vaf!}dfmJ3`W|X- zerHE-bIK0;>6&US!V1|9h^FaI2_d$7J6#{Z0swPtsc;oMt?~LkO9X0=AN)Uuhj;#y S3T4ay00000Dy!50Qvv`0D$NK z0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01mH;LN@>a0*gsRK~y+TWq**_Q&IsOg?}vK6+~7u z2~xzBL|HUZ+4Q1FvV*{l{b~vWO2Tjz1(zUjNE@9g$7p)Wmz@5L{;+OigUWT80Ch>0NARJ_Tw8N-6|rEc$w zA#*53Bh+wxK%#{6pY!n(Uhg#6vz*hr>C}}1D-OX{MG-jWt>84d0n)jb?}+|T1X}aa zT3@uv^&RwJC6V6GS6Jv^C)!_Qu#$ioGsM%h;~Gc10DtP0|MTiKdiFv(^OjQoHR%k| zh#LhAIlvS}2IpbU2Jw75Ij=H;Ek)nEo*?HZgJ8+Bt=nxx)i7WHb%+AiOlR?WOl5}! z7pND3JqX?nhS^JT95X|wEG#c{?X$@%Z&^%sHY?L$Oi-7z?diHIROacd;E8l-0`TeD z7dw?rVSlh)5g*)6XfcLR1yfFN6VG7M3YIOznG=R~x^1yeEH7CMcPMq>#F0#c`}$(XR151%Bv*1V;7XJrYOr^X?5^+iu8+s|j-WskCtm1d9XsSueE6!e_m^6@LwiBeUz&r_x$5@R-aLVFgQFayKMC z_C1z1W``CGsL+Ry{yaRQL;P7b8t%HhTfLXYQ-UtQi5*Ds3YUZd&kp-O*iwS@xvcO_ zw%HIb`T4$r2+wMwWfcja4uI4E`gLZ!E`lldLm)dQFT;`Qj1uy#YLC(Zuk4IcQ?7Ei i1sx8%@zRKCgZ39Hc+bh#mLw|x0000uO!Mv6P25S0?8c&PTY^CFi;Z4@djRk zz>zlH${DRs`6bt%(SOrvZp_V(?}zt&_dG!D!P(<1|31gD!+$kIsg5{z%8kqalm-t3 z+h?Qk>gZyU=GtPEYYVZ17jr&5@D`Yc6{^4V^5{xAJ&!rNmMld&^lRkJ@}SX6x5foC zQNo9B!^^ugJxtU>JdmkL-lkf#K~CXZwf$9-+UM&-gkYslAZO+8qGvMSqF!kY$32V$IWJ=GA+oHxRw@w;wU;e1l7JOyeFNc4 zu_sdo5KR&f%M9h*Be@CO&dZlc=`-QfJACE$xII8bt|VZeSg3YXJ?(Otk4m!S3|NVIH9!guC&aLes_+I9!5{4V5cUW@l*Kv|Fw;(2)P(T zhwn=pH8%Tq`{0vqP$vtXbZ-?EdYCf3Lbxxj4g>Cz=|VJrzC-N9#y<7jl{R9<)M0>3 z-&_yLFM~rWiZ@Ny2RqJhmTsl7qzx(`BeExii)2g`2Dmoqx51L&Bu_=T@1nITf5FT4 zN2bZe?^JG%heMGmPe!Pyhe|IY~r8R5(vPQd@5lQ4l_R zE3_CwR|JfuYGZuxp&I*AYny1IRT50gMPLQmBHI?Kq*PijNq^sb@MnL1Glym1?3}rM z-^}cqx2+X?=mw~cL)6c5Xpf4BzTZc65TbV(V*2kXDuXO)<5jc=CDh{rdXoZgP0k7V>Xg z{^FYlc+fJyNHS>IV=(u;*rEM5>J$%+3u_ezjR`OUVYz%5DzpQxQ{1}M)SN{*s6|;Mz8o47QXR2AkIS?!WBvnPGmMHJIpeGV0000< KMNUMnLSTZB*)|{m delta 445 zcmV;u0Yd(}1=a(QBYy#%NkledvaMrvJ{F|hH%;e z?br_Ax)s4S3*1vCv@MJ9tXkop7ZEv-5Wkc$ly;*3T1La9fPdkeTCm1mBia{5s3{A& z4(#aJvLUf2BYY^MXH$W1*@o)AG9=Cw#Lub_*tbz`N5_hU`UwH7E@nha(uCNB3z0(y zVpj@A(k`gMVtB&>79KrlN}3Tk5#gh0)Q%$f7bLW50-_sEu=Z31JX#5jR)f%y9piV^ z=p=ibUTT{xKYtBQnO_ID9f+({g6A{u3k=y$i7PrYE5SWu0qb3okdev87-NgmY58sF zNP_6jf8dL9*7Pit644wifp^plzAz_A*+6JV!2n5IQR6M^rq7U7!!tE@OKo|BRbIm! z$1y9_0+CI4r?;I@<3gjguE0-qeUtXW0^=rd9CyrUjW+65f+I3M_N*_I6S+G2#ZNvm nUN3&+Q}AsMz;E~${0+f79vC*q$eLSf00000NkvXXu0mjfX~NF^ diff --git a/mods/default/textures/default_mossycobble.png b/mods/default/textures/default_mossycobble.png index 7908a1bf11407b6d866a5aad77f9353363f8a27a..d5e849ca1f2c2e848298c10a8fda81e90e4470c9 100644 GIT binary patch delta 486 zcmVDAAJ)_Nx3;^jU$;x)=KdsyzZl@OzOJ4&m4cL>!~UMISxo{b z1h{E3Cj11dRd8MpqO(~JIZRKKB)$A*I!<`MKAyinJF!VQyBu=b%j4BzlqEgQDJif- zv0?XjN4t}XqkpvBoZBZB!PK%kF;y403@R?e$%};w&F#s?0 z)v8M5+MQwor0Q7@6oOoBru@^HjEQ+(JPZRXR214fL;~kO&I097adm`@V-Q+|IoW1; ze>=ol$|RXOKkEl)ET-g2Ff#e9`r_))4uvpoRcMuhxnDl(CqI4WDR9(SzI8Wau|}zK z@~07pkFzKkfp%AC*;6&|Kyl2IQqV?#55&dz(N_N4{IwEChBt$j!;5-Q)e}6-iDV4T cj{g4M59Jofdw4Fdz5oCK07*qoM6N<$f(Opk6#xJL delta 676 zcmey$ypeT+WIZzj1A~Sxe=q|BV|jp2h^u*`uz9M0MY4cZth`mapjDQrO`MW#rkGu} zgk6!WeTI^Ku7rJ|ghP&$L$0(#k(6VajAOC16A_Q$b8>QWYHDg)T3SX%MrLMaR#sLX5cCJ+S0@(~6qJ;dl$MrORaMp0)YR72*45QD zHa51jw6wLgwYRr-baZrfc6N7n_w@Ai_V)Jm_4W7nPnZQ6_(Gv>^h zGk5OXdGqGYpI<+J!GZ;g7A;!2a^FixkqRDZ$p)6**$G^2LP z)a|~zw0U<@x;K5vrboM+ zWlir&v~GT^qr!44C(d_n_U?DL6C|FzJ{%m*s_mTBEU4l6FJ;#GSwE`|zC2?m-EL$v z B4Wj@6 From 5047540db23febd6abd5f4f564541a7ecadbe50e Mon Sep 17 00:00:00 2001 From: BlockMen Date: Sat, 27 Sep 2014 20:33:17 +0200 Subject: [PATCH 0031/2261] Make new textures fit existing style --- mods/default/README.txt | 14 +++++++++----- mods/default/textures/default_cobble.png | Bin 511 -> 739 bytes mods/default/textures/default_dirt.png | Bin 710 -> 730 bytes .../textures/default_furnace_bottom.png | Bin 602 -> 578 bytes .../default/textures/default_furnace_front.png | Bin 572 -> 656 bytes .../textures/default_furnace_front_active.png | Bin 720 -> 1694 bytes mods/default/textures/default_furnace_side.png | Bin 626 -> 689 bytes mods/default/textures/default_furnace_top.png | Bin 511 -> 578 bytes mods/default/textures/default_grass.png | Bin 801 -> 720 bytes mods/default/textures/default_mossycobble.png | Bin 501 -> 819 bytes 10 files changed, 9 insertions(+), 5 deletions(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index 703f3dc9..189c5dae 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -27,9 +27,6 @@ Cisoun's WTFPL texture pack: default_chest_lock.png default_chest_side.png default_chest_top.png - default_dirt.png - default_grass.png - default_grass_side.png default_jungletree.png default_jungletree_top.png default_lava.png @@ -86,7 +83,6 @@ PilzAdam (WTFPL): default_junglewood.png default_obsidian_glass.png default_obsidian_shard.png - default_mossycobble.png default_gold_lump.png default_mineral_gold.png default_snowball.png @@ -118,7 +114,6 @@ brunob.santos (CC BY-SA 4.0): BlockMen (CC BY-SA 3.0): default_stone_brick.png default_wood.png - default_cobble.png default_clay_brick.png default_tool_steelsword.png default_bronze_ingot.png @@ -136,6 +131,15 @@ BlockMen (CC BY-SA 3.0): heart.png gui_*.png +Neuromancer (CC BY-SA 2.0): + default_cobble.png, based on texture by Brane praefect + default_mossycobble.png, based on texture by Brane praefect +Neuromancer (CC BY-SA 3.0): + default_dirt.png + default_grass.png + default_grass_side.png + default_furnace_*.png + Glass breaking sounds (CC BY 3.0): 1: http://www.freesound.org/people/cmusounddesign/sounds/71947/ 2: http://www.freesound.org/people/Tomlija/sounds/97669/ diff --git a/mods/default/textures/default_cobble.png b/mods/default/textures/default_cobble.png index 147b8f946493630b94f7e1e85978885f7ffdc7f6..bfb8632599a3e23cbc132ed2156418117800ee09 100644 GIT binary patch delta 679 zcmV;Y0$Bb31LFmdB!3BTNLh0L01FZT01FZU(%pXi0007SNklGmY_~5uo!M;GKRG$-b~)$ItAFRwc!E5Rks<*2o|ka0 zw6<;QaXv>x%d#k=bydw53#6!|;&DvR&L&x!YORZX5d=Y=Wwj8;M_o#3p6{|W6H-Vi zvMg(KQrEUdN^1a!FpaIs;a7Bbb$s)yDD8WjWMJtw5r%H5O=%V_W1i8Lxkj7 z{_SI*V>jjT=WZD4=6c?B=NbICzkGS_hHuTU)4r+a$A^#c9O_N80511mtHZH^lhSj$ zo_V(YDseynckPI&=i+kn=}NY#XMA?HfBU6?=>d{Y6StQa1@GVAPyhZ5*Xy}S7&HjF z&ma2Tc}P0kQZm5`#fCk6Kht1*SRG!cK_Xn_4!PEN?2&Cemmn8YawQnaIIF(5tIr$?VcsffwJ9ZY zH2ASxj;XP@^-wdjgK(ruE6$gP&mGdxzSlYJxz#`-#W_z(fiMDmATFjk+onG^zE3Z6}wsQ{q^7(@?Mz@-C zzS(ROA%5)l+s)>1IGis>RaDFQLbt6WS63Ax=dV_&Zf|8-3V$xh)A@Yyp89?WF|O`b z<1~5i`(Arbd9HM;h4&m8z^Yj3F|H$j_JOH?Q7`BuUaN z9flzhqU&xk#t7iZt=GG&)|RZXCdQbi+3J34tU*Wa`Pb8|u8-#v0K^#g`+p`gUbVL5 zk~HUuwBGeY8$%e!iGO_k5P>nqvMgncODQ+&opr7sdw(I4(TwCh5t*qMJjv1w`(dcc z@_782%5)f7hRhKqBB_h|^y>!#i=-jSJ%wMNQx zz5YGM&@^)ZX!RUoU<~>D-{t@?ZyG7{sw^2Y??Z?Y5g7oHBl6BU&bi8qhuscCjDm~4 zACyu)gnx0Ith0$ohN0ab{$+?nj>y$jP2{xJ$Pod6Jl*u|`S}R|?iNeN7yy(-T@;1j zV$saUVW_L>@$qlW@?7hSOrvADER#!<#0Hhp8RdKnomv} zU%r07XubOU?RY%?ID2~b^2PI?zwUoOJUlx;Z!{XpKCwMhT}5^knA>E3ocna{lESB@ zNA`1f&W4poVoME1y=5}V*Z_d>O~%)WlTQh<-0XOIJEGmKa6Yc$$m-0T{zSW&>h0L> z2ehMr2_Nbb=PI-ZVrobcHoWHgCK*@p$nL)OsTxp~X_r)ODtGAwmZWs-;11Q>8LL8C zaDC3MGOjN|iBDY;*%~*0dr|@CwP2q%5$poLN}Mtr!A$NM!Wra1x+L=`=y0oKz6EZ; za6nP!Q;48B91(<8H>4e38Xh8vz7_mn3D?j80M@}I=^tS;mxyuSBX2l)E7&meOxXiU z%XqxRpgdz0S-07=1`AgYtzJY`KD-=tn;6lxZ^|Aj!Dov=JEZ767E&_}?N{yG!haZ-4^TaGWq5EON50 zTo)#(2#kyyWoTiwJ0YJ2@VJ8+Xd=c3ovmO9c9{nS6MzMm+dxr0UpPdJ#$Y)0C^E=z z6Ni(w>;dm$9a*SJKpjNu-OHlTdT;kYw-M|nb*s=s-^yJXmw~mzvw38#H-LCA?D<5) k_zT}G11d({oM~|N4i_@% diff --git a/mods/default/textures/default_furnace_bottom.png b/mods/default/textures/default_furnace_bottom.png index e8191f7b3bd985cb05125f91c37704d534fe6fa9..1e482da6c715dabdd96c87e0d63550f016c5f146 100644 GIT binary patch delta 564 zcmV-40?Yl{1i}Q68Gix*005AYXf^-<010qNS#tmY3labT3lag+-G2N400GWPL_t(| zoQ;x8Zxk^QgsUGO+vCj(g-al3^1l!gKRZDr2eJv9u-O^A$2Nxv5jUt~Kh&k_kG_8S zJWUe-0IjvbIqy9)#~AQOwYH@$y?3)k0eri;QKzjo0M5BmN`D7}_v+SVqec_kJA57y>h|W{Q>GIsor|TdEIUMOB1@_c6sZj`!Q`JWVmi zS}On%$)(h~ynjDGKTK2bUW64ut8J4~2R54xfpRIrd^j9>@8dY09G{TLCZ#o%*Xz68 zQwKz(wI;$uGz~ zvZ$)6dheIT0L(d0)2yvE0s!PN2bPDNB8b~7$DE-^7j^FlWO0000QlO=^3(DX!e(;YT&vS;%@Zp^#CnslllDPHlXL(xP$dBc<{9ND4ug#sT zrWdBg)khn*v#+wfyR`M}a?ISczWF4s8-)_KThcp;q~DF@v=gi7OWi(x_HUu^OvENrL>5gsrAb&qp>^)TgNd>y0?Z|4n%t#6$EJ}%{O zKOw1ueW?Y3lz+6krM?Q5b*&DDGa#lZ}Y<>!0(P9;T9_@~D)GT&b_r0z{p*jSfJF zXGu1KQ9+|zkes%2p!aR9WiygXrYqr%^L|9ERePy!OzXqGF;xfYA`zCZxql3&mj%bKJ8JUQA*%;D5RD z{r}2`4&T16t1613cBj+z{V0lpFbsp>a<%eYcRHPJZf$L>uYYsS7t6))-U#zJ#smXE z*Y~eES6a7P_StNPF}7`+P$H^oHlJgHl~g>A=}nd;H;FL@6WsOvEKTRL`C_reg!IAy z0NU*~COC>B0Jx5?>1a6Y^?H`YCX?x}IDY@(BmA5F{TJ(NYdfQz1|xfq9_B^M8(XCdJ{3_{0o9LJ$bDJ5l9*Z-pdKqzgD(Z(QzXv?yVWv$t^+i|M0 zy0c)n>>vmlD;oBKx~_|&e0gvH0G{hoN-i!gjWGxz0H}lj0G=eBPDcnqZ_<=eW?7al zOQ~d@=RTNH*LBk@RZ4>~zULu~7-e~p3sIB%qY=Ug0F*HVV}y`pF=Gq>$ht1eGRv|e hFAzpjN?FU_pY0%2-`Z^Ckwz#A002ovPDHLkV1g@897q5F delta 511 zcmVkTy@uL#W&|$)@3!>?w!~uM#jq~&!K*6GXG3#1l?#&dha}QOgrSxve~S$_ z``p=e-k)fmo62npyUreoDogX*tNG34Kg;|LP)8Ygi54P2kPiTA<*Io^dEpVP5%`Mf z$_MfT_`aOQa#fn7j2)Kh6{n-oXg~iy0CjXlzU|m+8@1emp)z%M{p$N}#S^-TA8{h$ zU@79gi`zONU17h~!Q0mAQe(4TQEs_aY`wPev-L7wYiYcwxYu#7Z~VIO^V}q%a|d0` zt(@Cc=5_f~-&<{K^qI*LJ#r}op(mHj;Eb|F{|yKEt3Edkkb(dJ002ovPDHLkV1kP9 B@oE47 diff --git a/mods/default/textures/default_furnace_front_active.png b/mods/default/textures/default_furnace_front_active.png index 1418c9a7f6e90ef273bea55607615a5707fa6160..1720a9beabebe563a73e08cc2ff75cce89671809 100644 GIT binary patch delta 1691 zcmV;M24wlr1)dF%7k_{V1^@s60+s0^00009a7bBm000XT000XT0n*)m`~Uz3DoI2^ zRCt{2*jsFq=N-p!<0eih&dGM-Am`XE0RbUvLbQ+sH}PS8L(*U;G4&y@U*q#)JHcE3DF{!6d3}WKp_~=4K!^F;*HbC~TVA?EvfGf|oB2*l2W2J2l$8{tQROXa)Tr{3&ws5Q?YQhVY@HTl-PUb5Y+ZC& zI%pHj$xperD*F?A5ljZ!1T(E>BgSX8B#(m0fGiyFA@w+uB|7c+B$3{rpJ+J9P`vNI zs=qHvUnESdH$*t#LuP8xW6(EYXsDvLM9%en=^S!p@@7~G$MfKC<@|I=O=sPcG*l?4 z)TYr;Q-6s;-$cunMr0n*g-3MpY<)S;R;9C3$b|7M?!2vrkIUi9pTLG=^sKe{-ArcBKETeOKH_f$Wa3~X|m0Ws51=E}0^EliP;q+S0en$<5v*5x?8aL|j zh%TbxAhLi*!tZg@+O!t_k_lh_9NtsGRWp441Aq9(M)+bFexZV2X2BPuG}o3T=R`KV zYk;A6AJK4-aKJ}6;A2<+PKI|4;P<%kNg{ra8^6bm=(H#6#eq2SSOi(DH$;D5l>WXb zy+J=gpND8TNME#O-JQv%aL}JzzJZ-F;;{&k zP=5fgy9ej?ZtUHiIBZ=6eV&DZ-95-s9;7_@pLoz%lflT29JbZ2e7FbJ`eH2A3I>Es z?vCB}VEX(XUUKM&=oM^Tmw}-|K}+=#9{B5vnAxplZZeyx(fc0E&p4PnQo%t>E`u!@ z^jj4)RcID_(5runnYWb8O(mE=d*6fk4}Yqdn+kE|RSlmcayfdy#yVYg%7c^#DGwgz z!CI{h`_n6y^gzBs_Gk~<)~8XbmM`gne1(k0^7My$@Xwc5Vchftug8>&Jc#R8v0f{G zvB5_*F+C<0dVKTMF=R$UI!+ZXG zE+z80cB+IMe;wh*L>>S7o{GI&a(~(1sK!&bga?UdbiD6XbMc3H{OL6nH{XAnTi2u9 zy5iv0$u*oARC6_v!|!AH{HS?}{euI>VlIy=nLRhe>=8Ay@6+KCoF{=G=HW%NO_R*;468My(*2vyGsc@znZ(h)-VyvVJwtGqDPBo ztCluH^@BZVEKf(iLdG7cgiGgN;qKqR#_cne+&*4OpS_H|?qVFxWe@gXy;e?Kzbfg$ zozG(2o;LF5Bb#`A_ZmL^aVe4J(xp8Z4mM$2lg5W5>ZAvEKHJCbkAK>k`mK@6XB>Qb ztdL&)Qz;Kp9;7^YoP6+RSjiz*CfE0+KVCk#^R}A1V_6IcnOLe7SnG?Imk*fU#MG#Y zxyfv1b}RAM7cD;@%%4>;HQ+acAWo>gTAQVY%V=l=ZK6U^A002ovPDHLkV1jC`He>(* delta 709 zcmV;$0y_Pk4bTOU7k>~40ssI2kdbIM00004XF*Lt006O%3;baP00009a7bBm000XS z000XS0e@s)kpKVy8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^7j^FlWO00K-& zL_t(IPi2rhZ_`i|$FG1ws2T;50Vzm`45W={O+_0L?9>Tv;(z#&IIWY|II-hA9g_-` z4nV~RU}CMrQ{wdj7#SE48zU@5LPBEefY>Uv13DbX5ez*#zB-Se&prQ38Xev+ST0M+ za?%fUm2n-}Sm(Mekz*;dcHK)2c9mO1n5Y%HY0}7H3IDmVGLNZHO8Xo_2&@TXhNUnj zxk3i39P4r34Sy_!abkA%aw35NrdY(*n4ttFMeyGHo9*p;hIa#>J$}SQK8LM;7{QHk zK&`rr^Crjqhf_Pvz#Df4-kpW-u_t#UYI2&sbTWSK1bsD*SSEFa+^px( zi|JT#Vd{<$fS18P?<4Rd28WN~V+Nj{(Noh*{1ii-x9YszRtT=4R@mIqMc4_z?##DW zVc1=U{eLa^ZNZ1RPumfA7KAUS@ds05x*d^pw35-}#LOIg4Zz_G_#B440_;D6pA;NC zfY)Jo8-#=BIMLTbZjX#xPTjF36x3;!M{ad%RJC=!r4{i+*VKaVn?ud%sbtueH+t&E zKpHlMR--VmrS?E^`W3TL&>Fd>mhali&{o`jr9RiLSe8g?r4{6Qwq)6I*Hnhqn(IoA rBe?b+Kb200000NkvXXu0mjfs%b|M diff --git a/mods/default/textures/default_furnace_side.png b/mods/default/textures/default_furnace_side.png index 1417c8dccbf55808ecbe605367d81ef35b57a36b..75f46ecaad9c35c458506ad404368b19f5642f50 100644 GIT binary patch delta 628 zcmV-)0*n3f1hEB>B!3BTNLh0L01FZT01FZU(%pXi0006#NklCtpr*Y)F{$Hm2x)qlGk;|u^M<8f8jfoL#D z@5_=gmZm8e-1dF>@W40=KGeG%zr0*F`#lkLx+{u8HH~#{b~NRjE7dmp#(C$xYnmof z>`gD0i$zfsNg}^}|FPRufd~M0yDG*=L;x_K&$*Bs@kJB+rm@a;T?YWIQk*f}b%+>< z7~Gt_qFvg7OPl}VOs?N^N7#9HW^80yvYpqjC<$0bY^1dvyK`N9| zlkxbzECFD+6r@x{Q&Wb=&PW##q<2_a1M)e9~G2000nCB4wJUjDN8#8^9|ekPkk_=$sdKcfTkQ z7n}kCfRxf&8vzDs`eHNAOyBpWPo#`7iu3cu%Nr3#!y)|7WHMH5t6Lo*5>b|AB7_jU z&$7%q*C+)5qdXrCv+Om_N29*C#u!9IL@`Lxm?X#$9DKOCdb`&~Q=qD@5E&7jo)iEe zj*FRdj$bhj0PFR7GMT(>q?B5l+0oH3%NXO~v?X z_ue_@zDRN~7^A8@vF&H>#JZ_~^u3MKM&z7M%w*trdF9RpbW);Hc~+}d;( z(54BS)9&6yZS9k;vahv&J*~RbEE4@xuBwyUHeQzKQKF>L@>sfE=|WsrUY=VdaOU9E zU}nh-7OQ^&on`AmweVa(000002uVdwM6N<$ Eg6QG_^8f$< diff --git a/mods/default/textures/default_furnace_top.png b/mods/default/textures/default_furnace_top.png index 147b8f946493630b94f7e1e85978885f7ffdc7f6..1e482da6c715dabdd96c87e0d63550f016c5f146 100644 GIT binary patch delta 532 zcmV+v0_*+%1HuH5B!3BTNLh0L01FZT01FZU(%pXi0005bNkl+%2@yA_V?WfT>W{vD`8-V%006DE!8z|e zGshV4N42)4F1>fNMFD)fxlyOBHUQ4KQc4Gc_v-S%?L18}##$=?5y_?0y1YL> zKTK2bUW64utAA~iQU^Ah4S{kg!hAR!dhg>no*bW$$R?#VmDlUL-BSldq_rl(L^KQo zfKrMrR+qZlJ-vp8zcjc301*)pGZWEU@l8BU^PDq)JkPy%07T5p%d)7ds(SC2#Q@AX zPt&ZeH39(SVosfiwBCs*rPO*?5i^_SOaK9`HO@J&c7K08Kc|$u_hXDHrIeD2^xj3} zWxoe73`5RYipaIs;a7Bbb$s)yDD8WjWMJtw5r%H5O=%V_W1i8Lxkj7 z{_SI*V>jjT=WZD4=6c?B=NbICzkGS_hHuTU)4r+a$A^#c9O_N80511mtHZH^lhSj$ zo_V(YDseynckPI&=i+kn=}NY#XMA?HfBU6?=>d{Y6StQa1@GVAPyhZ5*Xy}S7&HjF z&ma2Tc}P0kQZm5`#fCk6Kht1*SRG!cK_Xn_4!PEN?2&Cemmn8YawQnaIIF(5tIr$?VcsffwJ9ZY zH2ASxj;XP@^-wdjgK(ruE6$gP&mGdxzSlYJxz#`-#W_z(fiMDmATFjk+onG^zEcr3002-~ zlC^rfzFUBh1cu>(X=nP<59o*V*E^IUB!nCLdXcPMoKyVs@A0_r#(80kA%vDyTWfbs zyDEJ=wJ{_YLXn_Po{Kb$@x8v~rZ-0wPl46zy;%EGq$ZMk(g0xjl;Q!hkkz@mT_DWf!(2gdYby3 z2*z;A<&IjzLvR%pMmbh-m_c5a_5a6brS+-rO8_74&MCu~3t9rmatzs+Fpe6Pc%BSC z?i**Ll>GMQ_<#M!v#4s3Lr(F{yTi-#RaxIkSrW`BoEEofjqd&sO1r*oE|>Ac`&%LC zs;%HO7ci$hjEfW$fD8(xw(b7@3^B$jdc7H?xBng=5rid#0D$C!6tr(;3`s3UYt!ze z^AUact7_V2zAjbG>$>{-^*g0xnw3xS&{p5R{VWjZ4}W4Dv`t1XB*W)N*+ z71i3leRm2zxDea68h)+U*QGtT%dEPp!g{qOMvGPjM*XfIt=G4d3?HMej z$S9ZMb(qk@pNuf_@bPU(ei&v15#z);-^(TzNeVJ8)|(K0b}=4qcCbIS&ricVF9I`0 z2rZG`tbbtK1hZ}$fFh*?3A)V6g!p=0(5Juq{khS~9ZzjYNeW_A#0-`Yh>8u@g_dQ3 zz|HvpajYwWZa;IuXb907#|2-NX=DXpT9nn=WnaYXAuLmh&iEJ-EK6wg=B%?WP4n8d w+-0xSCMwA(5e*Fh0SL9y?XHd~{sxGwdS};&5&=t*MkWdX07*qoM6N<$f=4evZ2$lO delta 744 zcmVY z(*J(!&xg>E)hi}Pos3)|$ z5rV^Dm5XDujYf3Nw5L7VtTj+G395x>CsNY z!8b8^?_)+n`@8-WT&Y3V+VBtaf73-sO{{hk(f(ujsD9N^H#sm0Ae0E#n;X;>sX2tQ z#9vnU+-4fxlXZn&herJ07%apm1%HyyjglLKOSl%WN2N2<@n4g(JGrI$YtX%aQ;k7Zq%B6dJ}(Xk$%=`x`T*yjsE(hxLoT7BFVSxRoSBe3eM{hE@=v zAX0N#9bFj-Yv;U%$Ysc4It$2{0X?+|#p7m>@N2dyPJvfeB{hXO1wTdfA{A7>i}t;F aK>h>gB+-8FU+et<00009hI+j=~ApVS;VB0Ry~}LQK5@!|AKUOb{dU_X&O&|dbU~x_TE{VW?Jiw=#xxG zX8Tp6Y4F!xQ4|nDrWt~82OL2N4gaoRdq%?tOW!95 zp*cFHHB+Xtp5J$OiEkVO06y4!^yc(b2pPw*<2cUxaO_VuEQ*`M_oiv+*+I5+_10-T zvu_ytixFb>i|9Qq3Q!b)Ff%kd#67kuHO)*pOXQA$DtNl_Ht zUeA}K&-T81{`_arI;ptslCd<-T$~p`yZ!T;{9?MaZ@I2J5kKO=mxAN5n|^+cjz8Qz z8qHs2=ld?+$7xGQnapfj56x^liWtV|{7;T=9oU9{ckR5u7){?P$BR{1OVTt~N=dm{ p+sqbK?w(+NGurr7_|^Xa98iDK9XK(5kwz#A002ovPDHLkV1nYIZ|wj8 delta 440 zcmV;p0Z0C`2K57wBq9W7K}|sb0I`n?{9y$E000SaNLh0L01FTR01FTSts}j4lK}%L ze*tkxL_t(IPhHaAN&-<32JrI;b<;ZpA|jc#lHnGzwnk+^Y>8AC(Oq}dM_qVpYtzWlG;pYA%hrbx$w7#yMHkE>up2Pm0 zuvtw4Cj_`@GA8^4s#S1a52CYK4mnIuf0QJ>{AM~%c)vcLzdt*%NjbY5a@xz|)nb$- zJnR!~!5S!^*rxbE;}FuTG1Zo8mYEJMfuWu+2|< zR51WA^wp|LP;qsHe~e=g zT7)^-W_f=*#9GQEnL0n~2WKp%d+2_Fm6?7m4dlG>nA^b<|%O0SiW^P zW3fi5a`LAUhmW%;7=d Date: Thu, 2 Oct 2014 11:51:47 +0200 Subject: [PATCH 0032/2261] Use new optional framed glasslike drawtype --- mods/default/README.txt | 1 + mods/default/nodes.lua | 4 ++-- mods/default/textures/default_glass_detail.png | Bin 0 -> 183 bytes 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 mods/default/textures/default_glass_detail.png diff --git a/mods/default/README.txt b/mods/default/README.txt index 189c5dae..eee2b0ae 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -70,6 +70,7 @@ Calinou (CC BY-SA): default_papyrus.png default_copper_lump.png default_mineral_copper.png + default_glass_detail.png MirceaKitsune (WTFPL): character.x diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 354096e0..34f29171 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -446,8 +446,8 @@ minetest.register_node("default:bookshelf", { minetest.register_node("default:glass", { description = "Glass", - drawtype = "glasslike", - tiles = {"default_glass.png"}, + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png", "default_glass_detail.png"}, inventory_image = minetest.inventorycube("default_glass.png"), paramtype = "light", sunlight_propagates = true, diff --git a/mods/default/textures/default_glass_detail.png b/mods/default/textures/default_glass_detail.png new file mode 100644 index 0000000000000000000000000000000000000000..b459665aca294da5e118bee8833220d9d17c17bd GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!eSlAh>#`*$mn}KBa@olh%g(G? zadz?ID~lFgU9$Mf+O@Z~ZoRu>$Gu& Date: Fri, 3 Oct 2014 03:20:31 +0200 Subject: [PATCH 0033/2261] Allow only boat driver to be detached from boat (fixes #276) --- mods/boats/init.lua | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/mods/boats/init.lua b/mods/boats/init.lua index 12126988..0c657207 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -80,16 +80,20 @@ function boat.on_punch(self, puncher, time_from_last_punch, tool_capabilities, d if not puncher or not puncher:is_player() or self.removed then return end - puncher:set_detach() - default.player_attached[puncher:get_player_name()] = false - - self.removed = true - -- delay remove to ensure player is detached - minetest.after(0.1, function() - self.object:remove() - end) - if not minetest.setting_getbool("creative_mode") then - puncher:get_inventory():add_item("main", "boats:boat") + if self.driver and puncher == self.driver then + self.driver = nil + puncher:set_detach() + default.player_attached[puncher:get_player_name()] = false + end + if not self.driver then + self.removed = true + -- delay remove to ensure player is detached + minetest.after(0.1, function() + self.object:remove() + end) + if not minetest.setting_getbool("creative_mode") then + puncher:get_inventory():add_item("main", "boats:boat") + end end end From 6532978a582124103807d9fc70a6583f653679d1 Mon Sep 17 00:00:00 2001 From: BlockMen Date: Fri, 3 Oct 2014 11:21:12 +0200 Subject: [PATCH 0034/2261] Add improved grass textures by @Philipbenr (slightly modified), fixes #323 --- mods/default/textures/default_grass.png | Bin 720 -> 859 bytes mods/default/textures/default_grass_side.png | Bin 699 -> 473 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 efdcfac8b8f67c7911f2d61f7c9c3f88b21dc0ac..8cd9e1fe5080500127311e2de4d2a2b56cdace48 100644 GIT binary patch delta 847 zcmV-V1F-zi1=|LY8Gi-<001BJ|6u?C010qNS#tmY3labT3lag+-G2N400Rw4L_t(| zoHdhKQ{o5|M$^?G0s<+PK%fM5ruzlEa6x2E2%AWd9fE`qKoIR2|NrBe2c{oy-KtaP zyLCSy(>oPhLnJ>wqq+$5(03t} z4Uz807576AH9JOiDN(m&3R6ENL!>wh@T==2JNBVj62+;XiXqb4CV2V0Lg@Yei@TwR z&f$XgK83oBP_-n|x`UhkDMdr1x{A{IxT0tTXl)ZTH*xy^{7uCW5z@MYk|9!G%Vc^k zv{e*s6{Yodj(=)N)a)1)GtA?}N6n5g{Q8Nul*o^~)GP_1^>$8LcW~EtksF_(ni0C6 zSCn3ZJRdHpm|+UD0Odu9@;pd&89{jsaocs!Sjz}^12>ILoJ`L}bDN;OPjTIKQd`Tk zc1aX7Ld}lx$F#Lg(0)r&ocbxv0tkhvpG@zR+rFDj&woXJ;^T4RBi(V3pZZZPiPkQ8 zG%!TUhRA*IgwElT;nz=uU;1|{ix7$#Ci8NF^1pIpn>d089uzae!_Y%>6Q{A3DNg<5 zh91;K2q8c9(cC5|zXo~QB`F#KDrT5W@04`MLG$gL$MG4O9iuSyQ=A28tYs84Om65w z&{omoFn{t=U&}N$ak3*X`sWqx_Y|5PqqR#?vttatevs|EDH;JvMgVOo9RVdnq`6HT z7jqHSlE@C+D9Z?{CDB;N=^QS2+9j#mGRkX++|WaNmqh3sE-B4}wD&10i_q~N%Lt`; zkh|Uqsu|(={etp5$nC(*{lLw&?xg#1N!^YiRDb3ogMWX}+{CHdF=}><#x_B96{R=} zP+dwCrhb~6IM4eObvuS;NvLL+@?1nv%`nO$L~-ipapdLh#YuG;p}kL$)*Wb;#KXW% zVdCRjccLu9G}bcry%V1IDTF`GtF5A_W|;i=jKajn?TeG=eTv8N8P#QkvLSNYbVGd00Le~L_t(| zoCU$za@95f08m+ywR*e0TY!)RhT(x}XZq3)=!f*zJCq?Lgd6*Mk*r;uQ~dMq@wo5C zd0~tpgqBrXYj;h%Dt$b)F(em4k)ThWK!|XO`@XweXDMaZ@qcxmyGo29s7>{Kb$OYz za+Kf#B2wZNS}6fs=Z!Lg5g3PgUj5IPQ8r?otP7yP1>i|Ho&g^{MYm03YtoDZ`ixS^~&& z4B414jvAGCo_`EJ?i**Ll>GMQ`2EMTsA`czPVvpV!^`tkS>H-o63i%^7Po1Q?*0%; zyS{BMm+`~82lFsD3>ixd=q3<{*S?f(7@F~%u+y&0vq{~jL^ge8OkfaHS| zv~Oh$Ni9Ze)9$465q+Fzy88O{JEdfrm48q1&{p5R{VWjZ4`Lj&3*IP) z?!IuVEr>a05N%==)!M#&cM3kZ5ZksIey!Knr9HRHth%bgdbK4+i&h0j{jOG8_jOGP zdG)^L)W_8A87!p8D3{`On9#$Yj4<->@oh+c7-j?!t=WX-MDaZ zH}~9o2r{E+=%_Vy)xGw0aOLa6iBW6jsdMS6c2rU`chvsuDSyfx?T(B-o*E?+t9svv zaBS4Osj88=O3ya5_sOa=-%yY_3ddGqX7%oHO;PSBnK|0Y9EC$y?aPXezx!hF!&f77 z)w`~!`^8st>M5C7z3-J&9~cEASMgaz{hLh%W23_htMtOt;Ad6g$ckEbUE$DGkgN(g zkLOm&tfKVFSAR0~v_JRM%w6q7M!FF-qebyV+6#&Yhb_e_Nh+3Z7NKS z`d_O8f<{zQ8ae_dLAFTenAfFt1apydjv z0j8fk6UBKASOUtxHt-7A0xa;P=$`{G3g#94V}M7%;yCTy3Wa1DcnCZI7J!A@yA=w) pSnQYX8Tar{gQUO8f5E>X_zeqg0!KY~d0qej002ovPDHLkV1h;S*~|a{ delta 675 zcmV;U0$lys1G@!~B!2{FK}|sb0I`n?{9y$E000SaNLh0L01m+b01m+cxRGn^0000O zbVXQnQ*UN;cVTj60B~VxZgehgWpp4kE-)@LjOLe60006xNklV|?(T8v9afn`oj{5=_fQU11$3rv8kbd@JGQ)(Tq8Y0~#)!s3%GUhNr7e{P^ZDZ(6I7tlD( zVdu4hag5nL2(aJFpgziRv@Bk1-of_vGU8ul7)o?m#?|dZ?7R=~k>i`{=QMm4@^4)J z;+qF})6C%cJA=JLA1?i;vo)OjD8lEx7H4q%rv#6I&VM;~P-!m{*gY7>wypNBZ}9Ln5qJWFPUPBjEW zXx+g2DM_6KJsPf{OP+|kh>9mUED{#tk;F0*Pn4k9?yLyEbYg+zxYGZkhGG#UeMAklI3$wYTXZ`@^NW0os#EC0bTqg?8R5ll2{f^0|ZNn zwqko>xqKKZv;(eF+`84&oJBdPMOh@i92yc*u^c{+%d{?I{sUe!jEWvP Date: Fri, 3 Oct 2014 11:25:22 +0200 Subject: [PATCH 0035/2261] Tweak some textures, new chest texture --- mods/default/README.txt | 12 +++++++----- mods/default/textures/default_apple.png | Bin 301 -> 320 bytes mods/default/textures/default_chest_front.png | Bin 682 -> 630 bytes mods/default/textures/default_chest_lock.png | Bin 780 -> 670 bytes mods/default/textures/default_chest_side.png | Bin 638 -> 576 bytes mods/default/textures/default_chest_top.png | Bin 627 -> 607 bytes .../textures/default_desert_stone_brick.png | Bin 405 -> 516 bytes mods/default/textures/default_dirt.png | Bin 730 -> 730 bytes mods/default/textures/default_snowball.png | Bin 127 -> 268 bytes mods/default/textures/heart.png | Bin 321 -> 368 bytes 10 files changed, 7 insertions(+), 5 deletions(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index eee2b0ae..4cdd4269 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -23,10 +23,6 @@ Everything not listed in here: Copyright (C) 2010-2012 celeron55, Perttu Ahola Cisoun's WTFPL texture pack: - default_chest_front.png - default_chest_lock.png - default_chest_side.png - default_chest_top.png default_jungletree.png default_jungletree_top.png default_lava.png @@ -128,6 +124,10 @@ BlockMen (CC BY-SA 3.0): default_book.png default_paper.png default_stick.png + default_chest_front.png + default_chest_lock.png + default_chest_side.png + default_chest_top.png bubble.png heart.png gui_*.png @@ -137,9 +137,11 @@ Neuromancer (CC BY-SA 2.0): default_mossycobble.png, based on texture by Brane praefect Neuromancer (CC BY-SA 3.0): default_dirt.png + default_furnace_*.png + +Philipbenr (CC BY-SA 3.0): default_grass.png default_grass_side.png - default_furnace_*.png Glass breaking sounds (CC BY 3.0): 1: http://www.freesound.org/people/cmusounddesign/sounds/71947/ diff --git a/mods/default/textures/default_apple.png b/mods/default/textures/default_apple.png index 01942c1bbeb478d8488b8411719b4ba0cd387cec..962cf7f70ac2a537bfba76611012b75f06a48e0b 100644 GIT binary patch delta 304 zcmV-00nh%e0>A>08Gi-<001BJ|6u?C010qNS#tmY4#NNd4#NS*Z>VGd008nyL_t(| zoXycaN&`_8#ql%F(^L&wp7X;5VcZuzn^w#UCyh z8!jkPg}wnaTEevFNxO`4}8ZNaTkkj z2r!Jql|15%>M8Q60)au^*15!q{K?s@*j3;go8}99>vOH~ZY^^F0000LIasU8!0sw>q0E+_vk^=yg1OS>96QBeDrvw111OTf9 z0Ix_!z6Aim1^~hr6T~|>&^$Qb2LRwbIN=!+<0>TNEhy$oMt|p6Q|M1iyg`@E00002 zbW%=J004HA%{Tx60A)!;K~#7Foygr5K_L(Z(2pa>&k02nqKxAGAJL69({gEFZp?oC z8vup{0FCeTF(1%J4Avf2`J!A-`MY>!k5$uP4)1;!wD9p;2O=n3=qhn0ATC juQjk)jZ0%7(H8pvNR|cXE1$4%00000NkvXXu0mjfbX;Q~ diff --git a/mods/default/textures/default_chest_front.png b/mods/default/textures/default_chest_front.png index 5bf33d4bd0e2ef0feef76ac5df39c83f4c1dddf5..baa8b2af0275c2f712ef8e1ee87479651de67852 100644 GIT binary patch delta 606 zcmV-k0-^n?1@;7xBYyx1a7bBm000XT000XT0n*)m`~Uy~0!c(cRCt`7k;`gRQ51&P z+Iy{iPEO7xX(Kj8+G43f9T-765Uh{j12}dh_yj(RVCh3xs5t1zP!KAp#X;-D3Ke57 zNzP?o9W*|G{pTP54WHa!f&UQ!z+kg41c0Ps4cH}3U(@Xk8t zy%YifCS|FZiGQfwPR6B96Ge!|`{Ack0)VAkiyP~G?}IV=?eO^dt2e{#7g?IBwWl9< zw>BRv`w#@;&W9rakShzFm>b`Wr&R?A7o}0{`QdjgRyPL^9~~XMySsdIuITi7J?G`Y z;SU0Uc9IlDjsnZFzI`M5{C?~4=Cdq|cVE98tj=lOSbyuvrarrz%sMc0J57wS(`jjp z>Cf@ky={Tw&QiD0+BpZPz4x`QXMlA+iDS#I-HHJb5f>K(B9bIYL{eNWktO8}_%j+E zese{UTVo|jL<9h1jB}18rD=j7T=1vA&;CVHjEIx*Q+acAWo>gTAW3dxF3BA}b^rhX07*qoM6N<$f(S_w?*IS* delta 659 zcmV;E0&M;E1gZs)BYy&MNkl$FX zyUH*Sfv>A7`VgbLfOwhCwqH)D}O61-ENmojr1-iel6XdKY4(5=D@}#FTmpLV}DEGBXb=5Q0rcg}HVv6rAEI%~XF}0+bTL)@sm2hF5wf zjUyCcr+*@%SO~~+qbw!h=@oi*b-%r$K#p1QeY|& z5~u&9^PPitu1~=KgaJTzs#y+co@GJ^05Hxu=Kw%ZN*QMa34iC#Q_k4Z@;U>6a>y<> zgMz4(%MuZlGDaIw;9)V~Oi;!U!CAMu@f`pN0A#}fb%yVE-b$6G@?9LNs@m1atZ+W zr}V<>6=O`2B!6)n-@iNk7wMU6H4ole>%6CgY;JD0TCHBMC#9V2#{E=9MNU0vYggCz z830Ul+Bc_~&UvlXVsE?MZujON*QFHIdoqgVraR7ig1EG@1pss+9t(Kx^8R2r1cZ}R zi>TiFjFri`?#%4g+S{w0My)b7K0a<8UEBD|03Zs(N`Iw{1k*ITc&70F-HY3Ek4mNB z&GRSS$(mBRF*eP!qtj&Mz&Vd(sI?gkQmu8f#y>326C_tIRCA@QwSdYwm#J(780*3y zFx*DP01y%JTucy=QAQbKlu$wdpcJMf;PBvJQ+acAWo>gT YAW3dxF3BA}b^rhX07*qoM6N<$f=Qtvq5uE@ delta 749 zcmV`f*_a_4k98p@#d9y zBE}H@01Q_T#uyXypo#IU2T43BiAPO{7o#!6DB1FJEOc`{rfl zec!k52iknIL~WZnei8-PG)-z@lOm*f97ojy=6HT_NJN3)v4}&vt%Hapnx9*;3DVkt z1tyW&WwPPIohi| z|FFKjU9DDvTgxwwD#2hrHBxYgI_=?{B{@gY{zo2Gh~-HUW5PC8R|YQM7D5C;kk9Ae zJzcnTW!BJA^2ll{C@IL+`)7wcJ6v10~TpJ%B z_kDkMa)0FP$u_7DL^rr1*w6~BX+l|nUTGt3o5VzugZ};N^J#|1dOc_yG=ULJTct;Y zGQ!+6M8mRx!DxxpV|hC7P!qv!%2xkj2%wb!R!U$IH{eQ0&7}e|@Q<4a&1wO-g1a!0 z;F}m}l@K^#W`F|*B;s0G23UB8p@13y9v&f$)@FtvtqFVpC}dgKl)%@Krl1BhvR_Nu zJs4Y~)(~)$amkPU7!eEodV6DQeWSgn$Wp0#WjBfw8O5j0P3>)d32RZVr#q@wn~g@Q f&4*mt`}+R@t1?(o_k7z$00000NkvXXu0mjf6OmW2 diff --git a/mods/default/textures/default_chest_side.png b/mods/default/textures/default_chest_side.png index dd9d923bb936cc80bc3964fa1359d555544cb564..2653b9d2d18bc379b066be254b6cc35b7a6bd1f9 100644 GIT binary patch delta 552 zcmV+@0@wZi1i%E4BYyx1a7bBm000XT000XT0n*)m`~Uy}%t=H+RCt`7k-KgbK@df& zs;j!^J!{#?B7{gtOaLNq%4a(!0+BgDh5$<-8EKIhKX%^TT}|NO1Mtm{PSw5m{>@AH zpD+NtJ>52inWxEG3jje?RRO>nV_2AwL^K&;KL7BA0iY@P)qgf~wr!dU5tk(dAFPui z&xEaEMg)!e`SRCln8pz?KR!Nk)>#n%h^lo}iHJ3Z339_%yWhh!ufS&09&MWa{&t#X z>ujE9%d!9fBnUC4l)U%DFkWBZ0RTSb>9f}-nly$ORSgjUbi-gpn7J&A!?09^Wkj#~ z>0-wK@Z$NivwzdAYVv*==eh63ah~d`5;2IFQqq(N@%-cW)o}IWXQp>$RW^0$oNL^c2)7f<#4usHhS_0lC;l#^<*8y39?I+z{eDd zdQ~s#YHsfH?nWeb4^HEw^=NEaUcwlg?}jq0w7Gn)C;Tmvg1QFVYr!a z2*L!w97lbSK!IpGD}cac?zveKj!aA>F>zWP0RYem0~jLbX6D$=8Utl@0Pg4`o4Z-# zHXi^q^{SSe0bl|Vih2x`t2M*EXbcpX+=@`(X6}w^K2^64Q}q~Vmu;>Fz}(eb&D9<5 z0{3RVK3`4ythw6xQEcjJxZ0GnWhBDp(3<*cA%9)XBpv^7Z@If9^Nao%^3o+uM9N496#cpMCblMdB4o{9e_hRmzVC6}o}6r)byfrbH0P$SMZ^-Zfd%om z%fDS8X7Kvu(^bX${q-=6*4f3vPtybdP#~$6QeupKAAbC~o5AktIt>zrpqlM8jpKN8 zeQ@4dD_QfsL4QPRWd>Pu(o_nRQj%&4+J{g|&N**3YgIMIFwwq8fGY-o)5p)=Jm2J8 zVw}P_cE`}RO;gt*gove-T#7+7+rwPg{{9(mFRHp~o60%YuIfj;Mnq#65Sfg(&Mka` z>eJ_Q27tD0R*gf0eLr+v5Eko%nV8uiX6BT%ABWw||9?V=P}R#AQ`hw|#w41uk})i7 zg;f=B$~k+Vg(V8cgMrsk&F?M`^f=dn&PqRymw90cxPwO4Z7VA<2c>i9*K+y zlQ0{Dh)PgOR4qp8YI5EI06z4+{{aG|{OCRPFP{Ja02*{fSad;kbZBpK099;dVPqgv fd2@7SZF4LjNp52<$sIm+00000NkvXXu0mjfyp|96 delta 613 zcmV-r0-F8b1oH%t8Gi-<001BJ|6u?C0y;@VK~y+TO_EEF6hRC`pPiXi)ipmffDoD$ z3$`2yiMz1p0-S*pa1kT~VhQ5kJzZ7#u~}r#h}_w7L^{GDAK$!e}C?51{XJ2&T% zr5e9h<7!mizI#K|n8?j}_Gm%{L_kG2=Ejti(wrd(ht0ToFtAl)+E;!aGBJ(B`N3nN zau03>(;#?KKmcbR0=YS*Ik`E_9CKI?ztEUQR0Q`94hlhqT~cy0hS0Z2LD;Hc1`b3O zS}CZ6ND!DuC4VZ6QHenqlQINhh{94j(Nc`17%DI*XiR9$E4ewj-Z=pv^PmKQT~eY7DV%;)A%ChcMWvZ@J}SpzL>1hOs38zf z!{%@?^*V^KU)z6DoUIx|RFVooAf^Ew&MxlF8)Fy0OWIH7uwPq0Ve2Nl!<3ZfU{=w( z9s#J$Db4=V-Gi0yGEj_aaGN_}QgF*e2}(VgR?Jz7V+3|^ z$>x0gdR}CyJ+4=yQoVcfdo%tX3j*90r#bxC7g7);j>w-+@BGJ?56st32x(;d`<+rU zmNyr$!~KjB0@K4+h`}9Ox4sYmAJT2 z(}ReY;&LBV=iE9s`}pA<{$c&Cdw3yI+G)GpAM!>DF$b%an193K42#}sWwm0_Z$!qT zrwVle6tA8>+8<8~Fc>#lU*s9#`6+T%08rKg*biD+@21EWK=QJc_o&YYOX<8U0N8_y zo5>Bv#d!g+s;lRh4WW{)>WYG8S(FQ`sW^|~98y_Ngsl{kmp=zJ7zcnRWB|VRH;M6r zmjI5+-1-0@#D5t;S>y?hefqk+2k*k)`noCJJ$Uo-MN%Dr@xjN~_ov63byc#ohq~h0 z`bG+7wW5+FU*hOIfG2HjwX!-Sp^7{^&>yH|d;lPMNz>D(Q!p4uo^{$@t=rTajB6$T za_Ac=K5u`YE4%AP0BluPq*{{l$4LPgjk{X6)H)|*L~cZfsy0jjM(d5b0dW0nL(Jsa zw_m5KWGv6=-mV)jYY8ANbk~iYwrStl`?s%Iez%wZ+8>=&@CVGkha~_202*{fSad;k rbZBpK099;dVPqgvd2@7SZF4LjNp52<$sIm+00000NkvXXu0mjfrY7T~ delta 389 zcmV;00eb#~1eF7j8Gi!+001a04^sdD00VPENmK|32;1RL-~a#sicm~cMM5YaOfDl$ zFCD_uD(Upg#cJ1t>5E@M0{XFo7#Krw1SF>66Gb4E6HNH=#$ zIC)Aqg;73+Qa^}OK#WyEjaEXAS3{6kLy=iTlv+iWTt}E)M}L`KNSt3uonT6zVM?H4 zOQT~!+4V=?0002DNklcRIQ-rDOo_qd>`yh`8maik0&(perftD77RM0RzcF8 z1if;+`UVv(gF@auOAVKA=+LmYom;%bE5$)B)IH8BfdZ2m0{=ZRcdVG2MaXr#+(!nJ juIYU#SRS!VL$&_{al~O!`B~++00000NkvXXu0mjf!+e^S diff --git a/mods/default/textures/default_dirt.png b/mods/default/textures/default_dirt.png index 397647c1e0c4fb0d5b53d03523146288586e50eb..4636d9fda012d805a1fc4390fad0d3f546651bd0 100644 GIT binary patch delta 650 zcmV;50(Je`1=(+wJy(^DoEaez!ZFPJMqaD)q2h>tXQdTcs#v?1#sE z817YFbH+o!%e4;yr^&>WHk-$JSwaZYq(i`>DDQ*jAt2+NQh(~4)59$wrj!`tuU>7d zx_E_h>x6yrQE?ALd1A`n7Io@azGDdlc^u-=<_ zVq7eC4k38NWtjvMS(eku7**Go^Vdvf#teiKL=;@8s(-n>e4zkEQ9eFA0f2Qj#K46V z!#K9x!(V^@x!=7F9_?bCvr=Z;?RP1~u3G`Xs8^68A(VZ1vj%`w*GXBZx~7zb5MxS| zQUZYJ5rg-hGFBAT>%)P@lsMzlWU8`^F`9XC-U%*@8IGs_2&IS~(YLBW^jd4mCZnZ-37KuvtG4LI6NjO;uH#@pZQ{#9sm%rQOY??F|pr1{+NJdQWDC>@qW3SV}iUW8Dqn!mw7D9I)u>Qt^gpi{C`t# ka}gB%2HXGu02*{fSaefwW^{L9a%BKeVQFr3E|b3k8yx6A*8l(j delta 650 zcmV;50(Je`1=3Z6}wsQ{q^7(@?Mz@-CzS(ROA%5)l+s)>1IGis>RaDFQLbt6WS63Ax=dV_& zZf|8-3NFag`F!!7`hEy8uI^UjG+C#K>}0&g$7>K6lpDRb{LJfMIBr zs;o7PAu@)@&wrQaH?Q7`BuUaN9flzhqU&xk#t7iZt=GG&)|RZXCdQbi+3J34tU*Wa z`Pb8|u8-#v0K^#g`+p`gUbVL5k~HUuwBGeY8$%e!iGO_k5P>nqvMgncODQ+&opr7s zdm)n1jO0BLnW+~%$I~lbQoHO%n>Cbseg<5^y>!#i=-jSJ%wMNQxz5YGM&@^)ZX!RUoU<~>D-{t@?ZyG7{sw^2Y??Z?Y z5g7oHBl6BU&bi8qhuscCjDm~4ACyu)gmIj#vx!KCq1_+;Wr#$M$kkO%@$qlW@?7hSOrVGd006#8L_t(|oW+vK4Z=VSMQMR9 zD2E!7ZoI6{^~oPZyK<4FLfeTxFp45AqP0Bjdb>jPj4aoRVG!1KX!V7HeDQ9NT1 pg6n~0!`A%bj7pEB{K|g;oB@-j^r|poC8_`b002ovPDHLkV1gIBXrcfB delta 97 zcmeBSs-K_|?dIv?7*fHQe1O;OV7=a~ B9@_u_ diff --git a/mods/default/textures/heart.png b/mods/default/textures/heart.png index 941e9731bd6a78a1043e76638ef45d90c887ed9b..af8399aec722427e0406fbc7df9d7005238d651c 100644 GIT binary patch delta 342 zcmV-c0jd7M0`LNmBYyx1a7bBm000id000id0mpBsWB>pGB1uF+RCt`llQC|>KoCVg zEpD)cgft-0xbg*Du8$D;0;UUPZa~U(ZX!iW!x2DAK}nGVSd^(0e>oqPYI$3Z^mvq<<*Sm zC}Jz|ErG;V;!ffWuncCB1hNdA<1NehN)mh&)lVgULYm6}v)Wt~P?q?jz-JlW>J{1BYy!1NkldVd{gHi1?P-#ibjO}PtB zWD*r{BGlaN0>dGUr?EEWE)WU1`w06=1)8j8Os7`~Ys=-*1$r@?LIDhbC=~jE6^pP^>36cTAe}TpkI|AK#IwFP#|2K`S3Nt6 tpgCRObR-eM+8~b$oL(?FCV2h7@dC4-RK{YPVZi_Z002ovPDHLkV1hsqhsyu} From ba8cbbcdbdead4fdd166d9f3b96b56518c78d871 Mon Sep 17 00:00:00 2001 From: kilbith Date: Tue, 30 Sep 2014 10:35:26 +0200 Subject: [PATCH 0036/2261] Add new ore blocks textures --- mods/default/textures/default_bronze_block.png | Bin 368 -> 568 bytes mods/default/textures/default_copper_block.png | Bin 453 -> 608 bytes mods/default/textures/default_gold_block.png | Bin 693 -> 648 bytes mods/default/textures/default_steel_block.png | Bin 350 -> 604 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/textures/default_bronze_block.png b/mods/default/textures/default_bronze_block.png index 710c49a4c76612ce7774b894369d0e0e959f5843..9c789119e6464abe997a4b885ef8d4d56141c249 100644 GIT binary patch delta 554 zcmV+_0@eNS0=NW_8Gix*005AYXf^-<010qNS#tmY3labT3lag+-G2N4000McNliru z-UI}+jO{q_I=0oO@HK~yNu1;IgX)Ibmg(EqF2ZF?9JPy)&h4!}*g0ypDWNbC`d zAfkXKWa4pmSAE{&*DuH4PYIwFw1JPee%f^2^VMvpEsMbjH-ARz?%DyA$@%%y+yN7b zw8}o2!~8E2=vvBgu@C*ocHMDyVq{FN9zFq8t5I_ zLqpM0L)rzh?SE-zIpow!lRa$-*GObo6DUU#zzC^Al~M4V2^v5W delta 352 zcmV-m0iXW31n>fo8Gi!+001a04^sdD0B=xCR7Ge&7-~TnYeE@sLm6;H8gWG%b4D9= zM;muY8+b_^c}g97OC5bo9e+(7l35~@S|XKOBbQtwm|Y~9T_c)aB%EI)o?s-OVI`nq zCZb~|q+}+hWhSU*Ca7m9s%R*zX(+C0D6eZNuxlu>Y$>vBDu264OJ)E70K7>=K~xwS z1;Gh|f-n#Sz=?~5jUuib21kzW>HoiRt1O!(E7#OmN|#iM{c6RelRIa*duQeu2SmlO zKe9J=TNMl3oj^oQW-h8?(g!*R?<^1CUKInlV`5|J2q82{+gBW0EACv~-^29hp|P_D zJ`y2Jh>v@+=2=xSS8r_&wH3>SftnF2dBtYMz0GETP~=u%$y>0d8{ zgWS7BX%~IQpvu++V6r*)Ij=#aTe$h-!>L$s0MH;Xqs*pkqd5)E5NJ>ec4*<}OE)7_ z=IP53Ajd$1Od#eML5ITEBc(r|ZVrIk&gyQkr8yP_YJcmJst?%|EDwt~Fy_Pkl2wXz z(I9JJ5+1HBZ9>6|frFi9zfJb=0+4s7289A{CWBZqR(SMT4iLLt9fbhP+p#5QnKRMY zN7apzTwx#v<}@s@!3=Cvum4*&q{qncY=vj)%Cad#R|&)e~sr$atH gZ;ubBS1;H90f*vV>4+5%dH?_b07*qoM6N<$f?>H6Hvj+t delta 438 zcmV;n0ZIPg1jPf88Gi!+001a04^sdD0I^U^R7GP=He^jVWKK6_Pd8>yIA%~dXHYq5 zQaWlbyJvjQ-7FtRGD{Fns-#1cvYKu zRh)TNoqATDdsm-(SD$=XpnO=Oep#b`TBLtkrGQ$cfLo`6Tc?6tsDoUogI%hGU8{v& zhp7?F0002bNkl$qh#(#ze{U53+P zGH6eumz?ir$BC_tTk@-r2ddSoT?9*GlgkF4O=SUSY%k~eEHexiX*L)DAQQjdyv`q2 g#r<36*0W{)50YyqX7rA^=>Px#07*qoM6N<$g7dSy-T(jq diff --git a/mods/default/textures/default_gold_block.png b/mods/default/textures/default_gold_block.png index d36b0a56a51f3a41c653ec936b5786c0d353db59..2337f004e4fe77185ab6e4d1c0d210c65ffd54c0 100644 GIT binary patch delta 604 zcmV-i0;B!41&9TZBo78+OGiWi{{a60|De66laV18e*gz`Nliru-UI}97=z?A?1 z0u@O_K~yNuCBeIHT}2dt;eV}}J+sd_!6p$XMWS#?L*oV>fG0_pH_LmZrU4|sl0ipS*s>K0O5voyWF zA^vcI2)ftVj8wR9o`~eYGUsr%-gir4mQw58?GgR?4dm#>sqS~xJ77MLRn?p+Ds@}@xwoubO!E7ZDY~c-G_J7 zr@59PCqL;ljVgIXpMS-y9WCOkJ6`78ikZzZRZ&x_fyFh;vK)5At1Dc)j}&8Ij~#29 zElk%%Y>HVmBk%Tduy%9${T&L7zKwQkE?QzZWG@3m40D^CB~7w2k7iqa@|f5saZOY; ze=52}U($Z(I_A*HB%%+J-Fa=FoCd_lUl3U5B5noq;ShDS8HSm4MEYGdo5IjDJwGSb z%FHkab+Oq;E$&8dElkEKj9uG_cMl=XPqh@{(b(06b9h; zobPgi&>IQU^Qn}5(?4+gY#gW+KOZThd80UPRf3V&$4x;feJ4uGu`x&7_e zv-<0KdX#BmSp{?>_NHkX@~is7C8M2NL`s4B^7psLe7*4X1-<{6MQ#)JKqK(bhrJ{% zY@TKhvgoquDZP7#=)kfshogkV{QRPAS|c|vOp$9tFgvF+QU|DX?9r3vaO*>Z#qx|l zpL~K9&W9R%rhi++ZBA((t1f)s-x{$H%dk{lA{nFCY4O3qz4_cKWq?H_HA+IJExToE z_bh;B8v)HMP@%tfpVyU+9~$xiDcNZ9pix7mX%8B>X+qdIHX)l}{TVllPjY`!gtCct z%SFyf)Lo#&BgN)wlXW&>xijsZIwb+65MzY7Wu$g>8Gkoc4qKG6mB^;X{&#=5lwl)X zt*2l@s|z)E<@Dt5@-(FTvvh)H+6D=YJaogDWykgE13C%98g>E}sJj+PC!I&Lu&(|0 zE3#=QZQMCdYBm88`4F)|>j6lh9su#t-98JdYj6@wQo*kfDrj&eBtbSpZ~#F)>T`_l zjQPu#Gk>wjx-c!c704j0;Y-*)f&&o{pbfMJEUL2Rei52A-v5Je3ylaBOdI|dV5q`7 z*dEsZ;jcfDjKPNFVpg%mv*+Lh*^e+5!6D5NcVG(;k~W4<@ykzO!D8*{%^xp`Yhz?p zZZ9uB-Wfe!F0a9MTXQeFoi33ke%S4-nwH=!h8E8MHB2z+TQ(c`00000NkvXXu0mjf DVB$Sh diff --git a/mods/default/textures/default_steel_block.png b/mods/default/textures/default_steel_block.png index b756e44fb5ad383b69820ac3c6d43e6a0a970198..0f7918ee5909e6c6aa7a00247b3f258bac41bba0 100644 GIT binary patch delta 570 zcmV-A0>%B_0^9_U83+OZ005AYXf}}{7=H(JNliru-UJ1iiH;9UR!0sBcrK~yNu zJ(9_8+&~OOx%47wtYBbc?9=>=f7ah*_&BG57bIF*OLwz!P!JxAg(CP+{PyvH=`@a`h=_=))>>a)UWmwf?_XbE0RT{{5N~EFB>*BJMkOL50)N2F zA0Hobzuy5A0L-M}ScedpS;PQi7G@R^5T}&ndc6YhBDQY;%#4WI)-_GzoMWPtXCfk! zbxHF)%k6d(5i90GJlp_sCJ|v~14W5umZs6nE|-gYe0&5zLerl`TMfc2db~tL460=n z->hY;l~PJF41<}OS?nAaGZ6j{7k`Oiue6rUiHpIjsyshGn^`reC>W&_t9-=Q4RzlE zDO(L8FiWlr0MFEPP02feHUy1qW}ly*LPYz%4}V6l%FNEGRpgv^ z!#t;IaLzgBsEC=J&u3R_4IuzxW(V&W$)BcrSE%UYJVCJpziAd zfSCY<5DBtd%{dd1h_r3%a?Zk%m)dnc)w(SU5t*5R)_rPypO(QpcZj7FcRrs1kh9;@ z2%rj;Whe6jW}vo2s%^W@cswR#jC!HSNDsr8092F~)em-(BDL z@9*zN=eBM0-iHuMDbqAPJSRMSe}A`a+jZT~&(Gy@d3t*K3udc!VGsp2?*IS*07*qo IM6N<$g0{c{d;kCd delta 314 zcmV-A0mc5@1l|IW83+IX0026epuLeH7=P+XL_t&-83n055 z&-67IYfTa>18bff5tDn)Js0WD2k84id0ybn#zEu<;dz)Oa4TCXq~nHP1rcNLQ86E# zSkpGC!U*m^`(t;~haW>^Oc{WWgFEQ~haE|m;SH!voICXPh546O9Kl&@o%`zxk$-wG zoKIkiD7zXrS@HaBY#u{Im@^sCD>7e*0YuA+)}?T5Qpr1`;6m5?_TybMVIyo5#PYQ+acAWo>gTAW3dxF3BA}b^rhX M07*qoM6N<$f>RZW0ssI2 From d57cb0a110b4479d2d7cc9e6d5b0249907eb87a7 Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 4 Oct 2014 04:44:23 +0100 Subject: [PATCH 0037/2261] Boats mod improve y motion. Smaller collision box. Reverse turn with negative velocity only. Smooth turning. Enable underwater higher acceleration --- mods/boats/init.lua | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/mods/boats/init.lua b/mods/boats/init.lua index 0c657207..da013ab5 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -32,7 +32,7 @@ end local boat = { physical = true, - collisionbox = {-0.6, -0.4, -0.6, 0.6, 0.3, 0.6}, + collisionbox = {-0.5, -0.4, -0.5, 0.5, 0.3, 0.5}, visual = "mesh", mesh = "boat.x", textures = {"default_wood.png"}, @@ -104,19 +104,17 @@ function boat.on_step(self, dtime) local yaw = self.object:getyaw() if ctrl.up then self.v = self.v + 0.1 - end - if ctrl.down then - self.v = self.v - 0.08 + elseif ctrl.down then + self.v = self.v - 0.1 end if ctrl.left then - if ctrl.down then + if self.v < 0 then self.object:setyaw(yaw - (1 + dtime) * 0.03) else self.object:setyaw(yaw + (1 + dtime) * 0.03) end - end - if ctrl.right then - if ctrl.down then + elseif ctrl.right then + if self.v < 0 then self.object:setyaw(yaw + (1 + dtime) * 0.03) else self.object:setyaw(yaw - (1 + dtime) * 0.03) @@ -125,6 +123,7 @@ function boat.on_step(self, dtime) end local velo = self.object:getvelocity() if self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then + self.object:setpos(self.object:getpos()) return end local s = get_sign(self.v) @@ -148,30 +147,33 @@ function boat.on_step(self, dtime) self.v = 0 new_acce = {x = 0, y = 1, z = 0} else - new_acce = {x = 0, y = -9.8, z = 0} -- freefall in air -9.81 + new_acce = {x = 0, y = -9.8, z = 0} end new_velo = get_velocity(self.v, self.object:getyaw(), self.object:getvelocity().y) + self.object:setpos(self.object:getpos()) else p.y = p.y + 1 if is_water(p) then - new_acce = {x = 0, y = 3, z = 0} local y = self.object:getvelocity().y - if y > 2 then - y = 2 - end - if y < 0 then - self.object:setacceleration({x = 0, y = 10, z = 0}) + if y >= 4.5 then + y = 4.5 + elseif y < 0 then + new_acce = {x = 0, y = 20, z = 0} + else + new_acce = {x = 0, y = 5, z = 0} end new_velo = get_velocity(self.v, self.object:getyaw(), y) + self.object:setpos(self.object:getpos()) else new_acce = {x = 0, y = 0, z = 0} - if math.abs(self.object:getvelocity().y) <= 2 then + if math.abs(self.object:getvelocity().y) < 1 then local pos = self.object:getpos() pos.y = math.floor(pos.y) + 0.5 self.object:setpos(pos) new_velo = get_velocity(self.v, self.object:getyaw(), 0) else new_velo = get_velocity(self.v, self.object:getyaw(), self.object:getvelocity().y) + self.object:setpos(self.object:getpos()) end end end @@ -181,7 +183,6 @@ end minetest.register_entity("boats:boat", boat) - minetest.register_craftitem("boats:boat", { description = "Boat", inventory_image = "boat_inventory.png", @@ -213,3 +214,4 @@ minetest.register_craft({ {"group:wood", "group:wood", "group:wood"}, }, }) + From dcce6e97959647fd625c1ce219721c0b800f4938 Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Tue, 4 Nov 2014 16:17:56 -0500 Subject: [PATCH 0038/2261] Fix fire blocking sunlight --- mods/fire/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/fire/init.lua b/mods/fire/init.lua index 4ce9f6a7..61626d2f 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -14,6 +14,7 @@ minetest.register_node("fire:basic_flame", { walkable = false, buildable_to = true, damage_per_second = 4, + sunlight_propagates = true, after_place_node = function(pos, placer) fire.on_flame_add_at(pos) From f06d4b85478db2ab517aff8b14ff8b21d38062b2 Mon Sep 17 00:00:00 2001 From: kilbith Date: Fri, 10 Oct 2014 10:30:05 +0200 Subject: [PATCH 0039/2261] Vessels: new textures --- .../vessels/textures/vessels_drinking_glass.png | Bin 190 -> 508 bytes .../textures/vessels_drinking_glass_inv.png | Bin 219 -> 508 bytes mods/vessels/textures/vessels_glass_bottle.png | Bin 166 -> 341 bytes .../textures/vessels_glass_bottle_inv.png | Bin 283 -> 341 bytes .../textures/vessels_glass_fragments.png | Bin 180 -> 741 bytes mods/vessels/textures/vessels_steel_bottle.png | Bin 251 -> 425 bytes .../textures/vessels_steel_bottle_inv.png | Bin 245 -> 425 bytes 7 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/vessels/textures/vessels_drinking_glass.png b/mods/vessels/textures/vessels_drinking_glass.png index 68c12d32247568ec2a1c6a54c9fa121445ff0651..e41ad310362e92a585b714899229b2149d8c59bc 100644 GIT binary patch delta 482 zcmV<80UiFn0sI4yB!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^RZ3JM1}3Nz?zS^xk6iAh93R5;7UQ_D`mKomU%hEfVtgn2y|nLY$^gJ9pm<*6$*DKRXg;rH2^@d_<&lYPhZE@&PVO`6Le!j zYmGircR80xL_$#Hv9Omr2}Cgnp12Vdd8n$k%6rxfI&4DV`FQ7aV?uf2#=>60IlaV% z`|=}~IF)HGr++|IHRN*28o-H6Cb838N9HCWBO#NKaU2P3JQzSXCX8OwoWYvg002qy zvl2!l6W-8QvR?1P#e1n74RP#rGQ!^^ra5B)oTyYZ2vUHilSf-JHc5uV77O5PLAf~j z)dSOb+~nCu3mC4M=H>VUiY;-3$OJ z>s@59i-D8=1L)=%w;XmH@ZNvD13Gq6N=dsrfZ2_la|$6S=NpXq7TKrn3x{$Fsxz`Q QLjV8(07*qoM6N<$fgn2y|nLY$^gJ9pm<*6$*DKRXg;rH2^@d_<&lYPhZE@&PVO`6Le!j zYmGircR80xL_$#Hv9Omr2}Cgnp12Vdd8n$k%6rxfI&4DV`FQ7aV?uf2#=>60IlaV% z`|=}~IF)HGr++|IHRN*28o-H6Cb838N9HCWBO#NKaU2P3JQzSXCX8OwoWYvg002qy zvl2!l6W-8QvR?1P#e1n74RP#rGQ!^^ra5B)oTyYZ2vUHilSf-JHc5uV77O5PLAf~j z)dSOro+C^)Kh)7EGC;g8WFwcp2UaBka z#~p^8bLKPZUiQ9{Qj+(cwASC03pN_f(8$nEr4@QIcI9E z(I}ju!8-!jp{@W}{~9oc9|OkF=pWeq9Sqo$R~Uh5ljAE`YdERa3dj_K1`ipwTQkPE t{0`tDbNm;KG31=1loA@}uEAsft`AmB2ca`b&3ga<002ovPDHLkV1lZIR-ym^ diff --git a/mods/vessels/textures/vessels_glass_bottle.png b/mods/vessels/textures/vessels_glass_bottle.png index 336d8b7dc230780a9f03152997aaf64b6e3fc9e6..e06ecfce63301159d001c40d2f8edf561fc5ef28 100644 GIT binary patch delta 314 zcmV-A0mc5N0o4MKB!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^RZ3JV7$Dk7R5;6HV88=b_m%(e%8&n#PYn}3$#G5q}X z8=n#eMr?w6k6ixG$-&CN$-&0J%*@R2`_Es7pFe*wSea-r5`Sd?0|NuYu`@URU*0;E z;p4kc4DLyd4Ep*Cj0~iJty|B){eJP{ga2fO0StWj@P#DH8TKBzjA7%!gIE5O?E(e{ z1_oAc7UC3c*>e`frdzk3{>SGsye_zP>*;?rHEH5QfA!WA|FPMO>cTVsak_wu0pU+% zn^6s8#O;M|3^RX-@Wy{i!+?=cES&jIO8Q{Lm5h0KI2ibZxd>(^0BuTU(|kTgJpcdz M07*qoM6N<$g0Ov#egFUf delta 138 zcmV;50CoS>0;U0wB!6v5L_t(|+Rf9U4!|G`1knBemw_%CkG?aVxg{88fWWe4r$F$a zB|ZL`oU=+PA}Mzl!Ma~U?gvQJ^)`T~00AxcpaXsYBug5?vskiyAjY8S1!fumQ9C6z sAiVp6)}v8u@(YW@1o`O#&>f}=>y(2wmTh}600000NkvXXt^-0~g2e|rIsgCw diff --git a/mods/vessels/textures/vessels_glass_bottle_inv.png b/mods/vessels/textures/vessels_glass_bottle_inv.png index c10036fb40d6ddb11e704cedf6431c562ac5b963..74cb631eedad7130f59cd3a67a8c368ded8c4c90 100644 GIT binary patch delta 314 zcmV-A0mc5C0@VVLB!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^RZ3JV7$HQPmdUjP6A;z>k7R5;6HV88=b_m%(e%8&n#PYn}3$#G5q}X z8=n#eMr?w6k6ixG$-&CN$-&0J%*@R2`_Es7pFe*wSea-r5`Sd?0|NuYu`@URU*0;E z;p4kc4DLyd4Ep*Cj0~iJty|B){eJP{ga2fO0StWj@P#DH8TKBzjA7%!gIE5O?E(e{ z1_oAc7UC3c*>e`frdzk3{>SGsye_zP>*;?rHEH5QfA!WA|FPMO>cTVsak_wu0pU+% zn^6s8#O;M|3^RX-@Wy{i!+?=cES&jIO8Q{Lm5h0KI2ibZxd>(^0BuTU(|kTgJpcdz M07*qoM6N<$g1Uo`ivR!s delta 255 zcmV?5yiqUun`2UV{LD}+vJ)# zbH}|<<5}D`VPR%6Ga;A1P17`J+ZJ8d-Op3xX__$4Gng4tN-(k7e;4sQPZ3@Ym6`=A!51NlqTf4kT^CAVE7IcZSY#9Zcr1s6{y#d^`@utrSyIcSO002ovPDHLk FV1jQ|ab5rb diff --git a/mods/vessels/textures/vessels_glass_fragments.png b/mods/vessels/textures/vessels_glass_fragments.png index 0bdec23a0e513f1e6da3d817c25cfac87543f327..ab7760d23ab3c646c154c9a79b0a3560aec26007 100644 GIT binary patch delta 728 zcmV;}0w?{n0p$gd8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-vr3I{bUBTT1!0007VNkl8aN*lIxn0A1H}_4Rdqxg0e!2C^&)5h3bwDe(EcmZphQk;q~n00?2c-$noc zrBW%EN`1c-4ktXaEDbP*Ud9m1WPb5v^5bGC6n+L^LVs1|hK&Tw4)H-YoBi3{-8)q* z>dsUunO|GW_XUGTGK%8xL?W@!)f>HceTs4!02pIzlL8{Ryk76Vrl#8H%E~+9T)ydc zyIk@3+qppC&_GYmwMXmAwv8W~LSzij0pLK#B{&>PrDc`I+uP5-0)UyBS=QFpx(c8H zKsA80s(;GLpbd=fe*FqSxL{v#cF0!#>tJar^2tpVb92``H zFuoFzUkIZ_MBJW}5XN#j#8@GJ+4El4TV_7|TK!IU+hvL^VX@CL&1)Ls8iCc=-yZW#L3)BlcF+um3y=U{zJ+ zivTzPS<}oZ09;k&N&xc!^suj+K2k%RsB20=z%gUR(#>wYTgnEjNx&HBc&bxxaE*Si`0v$7t~x*U-? zNu==EhMyV>qHo{!D7wxW%37K0+3?NeWa63&-)gdMub(L6yCT6k=ywG(pIYXMch+n3 PLGJN%^>bP0l+XkK-=IRM diff --git a/mods/vessels/textures/vessels_steel_bottle.png b/mods/vessels/textures/vessels_steel_bottle.png index 3bad963d09649031c4af3c06dc41c5628eeabfcd..dfb760ede28bd8999b523632f6674e428e7dc82c 100644 GIT binary patch delta 399 zcmV;A0dW5N0jUF!B!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^RZ3JM4V8X2+FI{*LyHc3Q5R5;7sld(?1P#A^3+t8*8fu$^l4VFGh--LmQ z)uqosV#2`WL%4Kx(M{vtjhKeUXz%65O9@;DDbb`goju$C-+z-YCx6ZrH0a^>+CIIc zY(5lkn|E&R9z~tcX#yno&s=&Q0H3C8vQbM-lH?W0fevtSTKiEHU9|$7AhzG{10ba& ziXzb}!E(7|JRaM@U_h_e17N$|QWOPgnu^(M)_j9FjtRri20`%s=r}lzgAjrs2nfT_ z#&P@$(D^w`CVvwP;QKz^ZWq^e&!EHMfRwWGh}r~FO0q0NDFuM*x@U+|iY&{JQZ^^3 zR1^ir9p4S1%h&Uv`V1!eED%PDHLkV1kNewQ&Fd delta 223 zcmV<503iRV1N#AxB!9w5L_t(|0qu=F3WHz}M86w(4zJ(|tOT{NP%Lb%Y^?kN3qi54 z@P3oLg_If-NSB2N!|d#=``Hvl;e6i*^j8IX9vkS73pn&V&p_WkY}?jN)8yhfRuBXR z8js!Olx0bXu!dpKx~|4Jj^?o=b5&rWWm&XsoA!MNG~TN~r&t9^lBlXG`_9pE9Dv5N z9htWUP1C6BI?eM8XuN;Hoq{k7mFM|s0Xs78YN9Aonx?AjT7BOG+B|md?qpeJ9|3)q ZdjRG3GjCR3u($vK002ovPDHLkV1h`&Y5M>G diff --git a/mods/vessels/textures/vessels_steel_bottle_inv.png b/mods/vessels/textures/vessels_steel_bottle_inv.png index 8a317b56cdb14263ef137c089084972596d8e1d2..dfb760ede28bd8999b523632f6674e428e7dc82c 100644 GIT binary patch delta 399 zcmV;A0dW5H0jUF!B!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^RZ3JM4V8X2+FI{*LyHc3Q5R5;7sld(?1P#A^3+t8*8fu$^l4VFGh--LmQ z)uqosV#2`WL%4Kx(M{vtjhKeUXz%65O9@;DDbb`goju$C-+z-YCx6ZrH0a^>+CIIc zY(5lkn|E&R9z~tcX#yno&s=&Q0H3C8vQbM-lH?W0fevtSTKiEHU9|$7AhzG{10ba& ziXzb}!E(7|JRaM@U_h_e17N$|QWOPgnu^(M)_j9FjtRri20`%s=r}lzgAjrs2nfT_ z#&P@$(D^w`CVvwP;QKz^ZWq^e&!EHMfRwWGh}r~FO0q0NDFuM*x@U+|iY&{JQZ^^3 zR1^ir9p4S1%h&Uv`V1!eED%PDHLkV1j`QwQB$X delta 217 zcmV;~04D#b1N8xrB!9d~L_t(|+U1#sem#&R3F0^w)Q=DQzQ;68@ZMux zS22#GJZ6{2bzQ5pEDN@6!@lo?nw~OtP6vvjK+`n*T}Q`p5K?M-%GkLbaL!>E2F&wJ zsOkL&o(yDJc00h%=|GyMD9chsYc0C2Bh>Viu@hXqJkM3EstRq}5^8zOf^WYMxJ6(O THpj2C00000NkvXXu0mjf=4oVL From c41762d211418fc378cd2e2204745c81ac592717 Mon Sep 17 00:00:00 2001 From: kilbith Date: Sat, 11 Oct 2014 10:27:22 +0200 Subject: [PATCH 0040/2261] New grass(plant) and leaves textures --- mods/default/textures/default_grass_1.png | Bin 166 -> 226 bytes mods/default/textures/default_grass_2.png | Bin 203 -> 257 bytes mods/default/textures/default_grass_3.png | Bin 229 -> 319 bytes mods/default/textures/default_grass_4.png | Bin 252 -> 443 bytes mods/default/textures/default_grass_5.png | Bin 273 -> 550 bytes mods/default/textures/default_leaves.png | Bin 193 -> 744 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/textures/default_grass_1.png b/mods/default/textures/default_grass_1.png index 3f6f1379e067ff8f88737ad05bf1e2b179d0eea7..f79307d9166d8feb508493fd164b5742476274de 100644 GIT binary patch delta 210 zcmZ3+_=s_WL_G%^0|SHn=l_X7iY>|8-G$*l2rk&Wd@@jkv%n*=n1O*?7=#%aX3dcR z3bL1Y`ns~;vf&}a01d#y#lv1nz$B(Ib=2pyOo%48l z?zj1kjg5-S&ONkeW@c{AS93YH`UID=@nnDRbwBIb*x1_a1EAdup00i_>zopr0J1Sn AqW}N^ delta 150 zcmaFFxQuavL_G^L0|Ud`yN`l^luCe4h%1n`Pmpm)lyyv&b<0w4&r$HmRrD%U^eIvD zEmig_SN5+^nNhj@KTsWGNswPKgTu2MX+VyFr;B37|M$o2;tI)qdiAH~Zx;XWx#xV|{;Kz1 z+IksQ-e&shXX&uV_dtnQ^T#6ovgOCsyHC1R2XN2)`i?I;F_Dq|3Wz%DZJLxaTN% zwDx0)g7@*a^5nW_H9VoRNN`*%K_r4;*Eg)c9^Z-a{R k47=vk?vvA({qz3Ekk-z4T6pFX51^3@p00i_>zopr09p7v>i_@% diff --git a/mods/default/textures/default_grass_3.png b/mods/default/textures/default_grass_3.png index 89e6ac8951622b88730cbf80a846a65291c1bc15..3e96869ca417a23596404603161c8177825a7066 100644 GIT binary patch delta 303 zcmV+~0nq;C0lxx}8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-vr3=IV^x9}%i0002YNkl)s+ z=ddc>g|f(MFpv*mFj$qr=KCpwk|Y_V+^g#)9K&(A3Zuz?d4EpN|Lr;O#~;5$dsx;V z$yTrUAe;S?{$>up8-q~jJCPOG(6GUl3M=;fJ@rmO11#n~0O|N$eLVpXIqe^XD&+tm z!l%ye##F|Tp8qtswcN|smJ`ne*fxL|5fd~r~GPW}A@? zQVFVES4(9MQz!{Dvl6zu3(oNjK&746$#|5kgc}S6PR_c0QYrud002ovPDHLkV1hG= BeE0wW delta 212 zcmV;_04x8$0_6da8Gi!+001a04^sdD05ecbR7F4l06$%whmk0 zdf3}G+TG4@mb8?kr(k)8ipQibd40)Mmhh<<^ZOGkTMhYH^F${ZC-MvI%mZEZxYOML O0000uwyZ@LB-fw zc&oYR%zXFc4*b_2tZKcW7yIM$9sQH{D`eS&ubNn92K^b!QdH{&eQ|VU0qh=bX#g=d z%O~5BN%#hU92Mi+qOiqYH64g(cN z{ZJ}Wo(+KAZp#QD0~6gzif=y?E=Xz|()t)81}bE;oYMet%c4}v>wyX>R&u)656u)e zjhhgt5s{zCdIk^*6V-EUoTQ-fD9L0!WH7@`2=)#(^d+<>5w=5YVt^B^8A?T|me=pR WbeZ>^C{OwT0000142Z87#zRU3|V=i|NKP z?v0pV%_?O#N4?c>j$@Q}>CwHDk~RCODNeR~{8rp+vaX%)^^t33U*WZ4%-<_^jy2@j lv!jxXj)?R~Qqprj`2)vu1r0AH3W5Lt002ovPDHLkV1mN1vnOtNNO zw{B>2?ycYejphSpTZcRzEx+8SOOh7zsb<18{PDp40e# zPuE_0hqC20)PKR}9|pkpFGt4O-l7u1ECcZ9fn??VQw0!pGXO5z5ddj785?+$~p0000yid-)Tcif5(cVIwPw)(0000n)4t1MHcVWwkx;8JUIYlgb2ni`slEM-*v+~Ix zH6JV=5-QNb#IOf5Y+)3MQ3x6ZD!z=KB+TjvpYQj__xtwadn*(yOHD?TAqYw>5BRFJ zn{lM1IL)Q(^co1#^@J*G{gD2c5zjPf0HaxhFu@w638pm6hz6|zqZ$m1F$l`S7>nQ> zY8H%uLvbDjJO%^|mdu2JA+m`OaYTkm5jQI)STP}riI8wo!f^#AWkAUUWd0b#>P8&279vH+(F38s)BivU$b&_x7OL{fHw zwG*@hkWRojD8@mvPKt9jFQqHYn^QxHKAZrb>IbqUzO0kBR{19UcQ~6;_ zK{acy;q0}ny_PSm=N$E1alKUBAUGRjN26HUC_0-&*J)Xe$gYUwiCA3Ck~fm=ZL!>R zzv|M)&~;V^YasXb*KWfTihRLjV&H_Z(-fruQx^) zOLpa^smU3})80`RN0c7WruOLJP*?k}*$qDWIcw*Qb8m(% wRi9MD)UrO|Y|GtJcz?aX*4`Xl9h+|6Nl&Vz2d}?$sM^a=xj*Q8=56i!4P761SM delta 177 zcmaFCdXRB~L_G^L0|Ud`yN`l^6n}tEh%1oRjnI%*mQ*y8(+O4o+ihhF6k;j~@(X78 z9rNee8Xzy;)5S4_Ll$TPFN+}u!$DqG4owb)4@?z7|7Yd3T@HH5{eKGI`Qx{DR_U&g zvQF)*cAC-rdTu<2veYxy{>x?Fnm3uMpY(A)o1v~{ZBa2#j)f(Y`AK7Nz-q-^o>SQ_ a{bbxK$zMC`TjxxmT@0SCelF{r5}E*+B|WDA From 929559fe8554473f0d7571fedc15251b5c4afda7 Mon Sep 17 00:00:00 2001 From: BlockMen Date: Sat, 8 Nov 2014 23:25:40 +0100 Subject: [PATCH 0041/2261] Revert "Fix fire blocking sunlight" This reverts commit dcce6e97959647fd625c1ce219721c0b800f4938. --- mods/fire/init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/fire/init.lua b/mods/fire/init.lua index 61626d2f..4ce9f6a7 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -14,7 +14,6 @@ minetest.register_node("fire:basic_flame", { walkable = false, buildable_to = true, damage_per_second = 4, - sunlight_propagates = true, after_place_node = function(pos, placer) fire.on_flame_add_at(pos) From a90338d40d763c373749ecb5868c69d08afe4be7 Mon Sep 17 00:00:00 2001 From: RHRhino Date: Sat, 4 Oct 2014 13:35:22 +0200 Subject: [PATCH 0042/2261] New flower textures --- mods/flowers/init.lua | 6 +++--- .../textures/flowers_dandelion_white.png | Bin 117 -> 2954 bytes .../textures/flowers_dandelion_yellow.png | Bin 116 -> 3013 bytes mods/flowers/textures/flowers_geranium.png | Bin 271 -> 3030 bytes mods/flowers/textures/flowers_rose.png | Bin 122 -> 264 bytes mods/flowers/textures/flowers_tulip.png | Bin 123 -> 3002 bytes mods/flowers/textures/flowers_viola.png | Bin 111 -> 291 bytes 7 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index b4096475..59546d73 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -26,7 +26,7 @@ minetest.register_node("flowers:dandelion_white", { sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", - fixed = { -0.15, -0.5, -0.15, 0.15, 0.2, 0.15 }, + fixed = { -0.5, -0.5, -0.5, 0.5, -0.2, 0.5 }, }, }) @@ -80,7 +80,7 @@ minetest.register_node("flowers:rose", { sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", - fixed = { -0.15, -0.5, -0.15, 0.15, 0.2, 0.15 }, + fixed = { -0.15, -0.5, -0.15, 0.15, 0.3, 0.15 }, }, }) @@ -116,7 +116,7 @@ minetest.register_node("flowers:viola", { sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", - fixed = { -0.15, -0.5, -0.15, 0.15, 0.2, 0.15 }, + fixed = { -0.5, -0.5, -0.5, 0.5, -0.2, 0.5 }, }, }) diff --git a/mods/flowers/textures/flowers_dandelion_white.png b/mods/flowers/textures/flowers_dandelion_white.png index dee0fc5381599016b53b6eb4e2fbe684e2e2c7a7..8c0e9fe8a14b7d49cf3d94465cbe3d2c61a7bdf3 100644 GIT binary patch delta 2947 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 delta 88 zcmeAYFP)$q#9-s;;uuoFn7qJHf_3`(`TzM3i)6SZY~s1GwOl%tE#Rzl3i}dIsnhjc sNr&>qZYvltw4A)g!Nr^<(G+aVuxLiYvLsm{YX%_jboFyt=akR{0DK-Eb^rhX diff --git a/mods/flowers/textures/flowers_dandelion_yellow.png b/mods/flowers/textures/flowers_dandelion_yellow.png index 99becb520c2cc2b7039a9f6e4101edf2e2fc1f47..ae14554e331f7dae03121f2b744d333a1adf58b8 100644 GIT binary patch delta 3007 zcmV;w3qbUA#TSqxe+oHiLqkwdXm50Hb7*gHAW1_*AaHVTW@&6?002nGotAf0RM!@V z&%Jkgq0KM?Qik5UzyQ*FlU_w(m>FOw0}eAZu_2-Y5k*9rB1llgfYDGSRz$H76jZPW zBnT)m7)4YpZ${ROuB^QG^78xRtZ(hJ_qqG*z0X<~0FtLKf0vgAO97C|6YzsPoaqsf zQFQD8fB_z0fGGe>Rz|vCuzLs)$;-`!o*{AqUjza0dRV*yaMRE;fKCVhpQKsoe1Yhg z01=zBIT!&C1$=TK@rP|Ibo3vKKm@PqnO#LJhq6%Ij6Hz z*<$V$@wQAMe@DcKuZRmXxtuH!-x9G#iZGQc;y2>hR1Px(02E1V7jRgKA~q2*i60W= zBI4x$;7AEyaokrd;A9KLmvTu<&*5_u5(RV}mM-1Y+L}T4f`(o2L0Dz>ZZyndax(`h}FNp#{x{a}MR#uh~m%}m=7xWMP zPlvyuufAs_KJJh5&|Nw4Oks+EF0LCZEhSCJr)Q)ySsc3IpNIG#2mW;)20@&74xhsl zMTCi_e~imZ5Vf1f<_frJJUW;6pPKj&!~UejxfY4i_z_TJjDXa2DnNei2Pg^=Akq89 zUH_wRzW6X8etF?4lZ$iz?>GHt!KLCQgPZU<&Lt>>&Jyx77x%=^5}*MANCGO52g*Pl z=m0}t2CRTBa0G6^8~B3|5D8WT7DxoCfDf`je;(Kb3PCa03HE?$PzM@8GiU|JK_@r` z&Vx(f8n^*&gZp3{0Al>=1SW`vynEso>0T?zku%50{Utz#YMz!42Ui zaSM1Uye8fT?~iBWbMU43MtnE^I(`DbK#(SA6YK~fge1ZyLM5S}%DW=qVsT!%1 zQX^7x(iCY^X@BWd=@RK9(pRLXe`K&SS~6}jY?%U?gEALn#wiFzo#H}aQ8rT=DHkad zR18&{>P1bW7E`~Y4p3)hWn`DhhRJ5j*2tcg9i<^OEt(fCg;q*CP8+7ZTcWhYX$fb^ z_9d-LhL+6BEtPYWL~^(u2np!*snOJq^#tjl&(~zbU|rGnWpThoTOZ?d`5X%g`#4w z!c{3(Iji!NE=zZ!r_d|uz4TdCMO9B#p=!PAfa-#pwpyrKzFM2wLv?~WLp@%-T)jtq zRzpR@Pa{vGMdO|(UX!7jf2g@vvrltgOIs^kYpYhL)|9rKwwHFUc8m4{9kPyt&KjKt zom;vXU50M5?mpccda#~_UZP%&-gSLg-%_8ezfXVA0BvAxz%ytt7%?OnIvHjfwiu2X z(TseJ@{Kx;o*QczM;Y%j?lb;qVqubE(r9wuRL0cXG~cw_^mj8oe>0X@joB@8vbnqY z2J~-RzqPTn5!f8J`OVhQHre)w?bLGZ<(%b>%g621?3i}-cBA%m`&jz}_M;A}4orsz zhsTcUj%>#!$4Mt$f2Sm;qfXDAO`Q48?auQqHZJR2&bcD49Ip>EY~kKEPV z6Wm+eXFV)D)_R=tM0@&p?(!V*Qu1PXHG9o^TY0bZ?)4%01p8F`JoeS|<@D$*}0K=CJv2*YL9N(Fo&+brIJh6(YHjT~XMmu&Ab}xs`4!_pF?Vwuml_ z9$uxrDtpzH)e5UqR-cZMjA6!{h(*VS#~z7&&-7UTb~$^R zW5+4uOvc;Af0xBiCDH6t~>7#3G*6dj`%lF|oWk4CLGP(p*(a%)BP)E2$IF@OjS(EuD zD=h0owsbZxyFW)SXM4_Mu6ypcYf)=iYkTrk^ETy;f30&`SHB)wAGf||gZhSo4HFwZ zHXhzY*p$5Kr+kzAviw(@!#8&qC>3lh7~kTtrKM1!kY6~m)pl#$Hq#oSi8M;ejj_^(0<4L zt#wLu#dYrva1Y$6_o(k^&}yhSh&h;f@JVA>W8b%oZ=0JGnu?n~9O4}sJsfnnx7n(> z`H13?(iXTy*fM=I`sj`CT)*pTHEgYKqqP+ue*?#a$DV#4`~C27pW{6z7$;hP(EOpc zozh;^0d?eb%yuSrj&?s>djZ*&hXA3QVUFm(Q=>&;8Iyl!2)z2f%ZaOm)zk?4`pJM24C zcT?`ZxR-fv;r_-4=m$j)r5;v1Qhe0#v+mDrqn4wm$6Uwy9|u3aKh7F|_DjYu?P%v;syW3r{7Cn z%D+7HYT2uvxq!JxuTx(y%on|pe{=XP<89x&@OP67S?{s$D?jLd=>F*Q@xiCmPoMq; z1DNyty2R+y00006VoOIv05||m05CR*W(NQO010qNS#tmY3ljhU3ljkVnw%H_e*gdn zbV*G`2i^(`6fPI)s?Qhz009k2L_t(I%cWB>PQySDoJFp9LL~Ua(!>-L6p_;B3+v}V zL*Z*vrl+NXG|VdyMT!&@6woY%?X%B0TS6JhlF#0q+1cF_cgHy>CjU_SclCb~P!NK~ zqnS*ST;NQ|WDh7lupsjm#(pUdf2KN9Bn3F~N13mABv#}TRiO0bJdEiCDQypOssz^i z(w~=af_5O?WX#xEO$mkpn{DaeU%=J!M{4a85~#OhY)dj@&pyERZAV1*(dQ%`-%KcPWRDPXIt|@6&goW6lN5;SWdwb#Mut4uk*z002ovPDHLkV1nYS Bvo8Pu delta 87 zcmX>qUNS*Bkipv1#WAFUF?oTZ1Z)0!gFo$wTqeo}k!&)N4htDWKC|6q%$#)W)BHs< rKFmI9#=*moxXHBXP=i$4gDX4?Lb-vpiW8Vr8Gyjk)z4*}Q$iB}RgoUW diff --git a/mods/flowers/textures/flowers_geranium.png b/mods/flowers/textures/flowers_geranium.png index 22b7da19efa3e25d00fb11fdc3d1d4412f0ef943..ed499507d2b16c7b9ae37ee683f3190f968c3c68 100644 GIT binary patch delta 3025 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 diff --git a/mods/flowers/textures/flowers_tulip.png b/mods/flowers/textures/flowers_tulip.png index f03e3aa457ef551543659094a8a450d364650752..293b041a3ee0e84b951b72b23683610909290c6d 100644 GIT binary patch delta 2996 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 A0{{R3 diff --git a/mods/flowers/textures/flowers_viola.png b/mods/flowers/textures/flowers_viola.png index 93a525d7aa07c77166bfbe4b6748a888ec79f1b7..e1767659f2a4057528a4a43f37bbaac074883831 100644 GIT binary patch delta 263 zcmc~_%rrrzo-N7S-G#w|!I#0ntTTEak-aXL9cf^~5NM}Sm7Z}>dH`EFB>>;9LNkdSzH;+lbxfq_9u zeunD3XETre|1WJk<-d8F#((?EKmOOR+TrlD@bv%sFPnRMSaRDoI)9S=H+#v(1v@yF zXQxU1KOXR8=7SISm5+X~H#;2IVCZZa!@No9JWKoky3IEv64o6^lMrTRW^Rr+Efb4@XYx<~K!smt llYaY8OcPjkLbSz%nZbIq=80ANwytFW0#8>zmvv4FO#m|AAgTZW From e71b71c1a9037d83bde74457ebf69c8cc6cd6c43 Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 5 Nov 2014 20:22:55 +0000 Subject: [PATCH 0043/2261] Default and flowers: only run on-generated functions in mgv6. Remove indev ore definitions --- mods/default/mapgen.lua | 226 ++++++++++++++++------------------------ mods/flowers/init.lua | 3 + mods/flowers/mapgen.lua | 12 ++- 3 files changed, 105 insertions(+), 136 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 4907cf7b..624206f3 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -207,69 +207,6 @@ minetest.register_ore({ flags = "absheight", }) -if minetest.setting_get("mg_name") == "indev" then - -- Floatlands and high mountains springs - minetest.register_ore({ - ore_type = "scatter", - ore = "default:water_source", - ore_param2 = 128, - wherein = "default:stone", - clust_scarcity = 40*40*40, - clust_num_ores = 8, - clust_size = 3, - height_min = 100, - height_max = 31000, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:lava_source", - ore_param2 = 128, - wherein = "default:stone", - clust_scarcity = 50*50*50, - clust_num_ores = 5, - clust_size = 2, - height_min = 10000, - height_max = 31000, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:sand", - wherein = "default:stone", - clust_scarcity = 20*20*20, - clust_num_ores = 5*5*3, - clust_size = 5, - height_min = 500, - height_max = 31000, - }) - - -- Underground springs - minetest.register_ore({ - ore_type = "scatter", - ore = "default:water_source", - ore_param2 = 128, - wherein = "default:stone", - clust_scarcity = 25*25*25, - clust_num_ores = 8, - clust_size = 3, - height_min = -10000, - height_max = -10, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:lava_source", - ore_param2 = 128, - wherein = "default:stone", - clust_scarcity = 35*35*35, - clust_num_ores = 5, - clust_size = 2, - height_min = -31000, - height_max = -100, - }) -end - minetest.register_ore({ ore_type = "scatter", ore = "default:clay", @@ -323,81 +260,38 @@ function default.generate_ore(name, wherein, minp, maxp, seed, chunks_per_volume --print("generate_ore done") end -function default.make_papyrus(pos, size) - for y=0,size-1 do - local p = {x=pos.x, y=pos.y+y, z=pos.z} - local nn = minetest.get_node(p).name - if minetest.registered_nodes[nn] and - minetest.registered_nodes[nn].buildable_to then - minetest.set_node(p, {name="default:papyrus"}) - else - return +-- +-- Mgv6 papyrus, cactus, long grasses +-- + +function default.mgv6_ongen(minp, maxp, seed) + + function default.make_papyrus(pos, size) + for y=0,size-1 do + local p = {x=pos.x, y=pos.y+y, z=pos.z} + local nn = minetest.get_node(p).name + if minetest.registered_nodes[nn] and + minetest.registered_nodes[nn].buildable_to then + minetest.set_node(p, {name="default:papyrus"}) + else + return + end end end -end - -function default.make_cactus(pos, size) - for y=0,size-1 do - local p = {x=pos.x, y=pos.y+y, z=pos.z} - local nn = minetest.get_node(p).name - if minetest.registered_nodes[nn] and - minetest.registered_nodes[nn].buildable_to then - minetest.set_node(p, {name="default:cactus"}) - else - return + + function default.make_cactus(pos, size) + for y=0,size-1 do + local p = {x=pos.x, y=pos.y+y, z=pos.z} + local nn = minetest.get_node(p).name + if minetest.registered_nodes[nn] and + minetest.registered_nodes[nn].buildable_to then + minetest.set_node(p, {name="default:cactus"}) + else + return + end end end -end --- facedir: 0/1/2/3 (head node facedir value) --- length: length of rainbow tail -function default.make_nyancat(pos, facedir, length) - local tailvec = {x=0, y=0, z=0} - if facedir == 0 then - tailvec.z = 1 - elseif facedir == 1 then - tailvec.x = 1 - elseif facedir == 2 then - tailvec.z = -1 - elseif facedir == 3 then - tailvec.x = -1 - else - --print("default.make_nyancat(): Invalid facedir: "+dump(facedir)) - facedir = 0 - tailvec.z = 1 - end - local p = {x=pos.x, y=pos.y, z=pos.z} - minetest.set_node(p, {name="default:nyancat", param2=facedir}) - for i=1,length do - p.x = p.x + tailvec.x - p.z = p.z + tailvec.z - minetest.set_node(p, {name="default:nyancat_rainbow", param2=facedir}) - end -end - -function generate_nyancats(seed, minp, maxp) - local height_min = -31000 - local height_max = -32 - if maxp.y < height_min or minp.y > height_max then - return - end - local y_min = math.max(minp.y, height_min) - local y_max = math.min(maxp.y, height_max) - local volume = (maxp.x-minp.x+1)*(y_max-y_min+1)*(maxp.z-minp.z+1) - local pr = PseudoRandom(seed + 9324342) - local max_num_nyancats = math.floor(volume / (16*16*16)) - for i=1,max_num_nyancats do - if pr:next(0, 1000) == 0 then - local x0 = pr:next(minp.x, maxp.x) - local y0 = pr:next(minp.y, maxp.y) - local z0 = pr:next(minp.z, maxp.z) - local p0 = {x=x0, y=y0, z=z0} - default.make_nyancat(p0, pr:next(0,3), pr:next(3,15)) - end - end -end - -minetest.register_on_generated(function(minp, maxp, seed) if maxp.y >= 2 and minp.y <= 0 then -- Generate papyrus local perlin1 = minetest.get_perlin(354, 3, 0.7, 100) @@ -506,8 +400,70 @@ minetest.register_on_generated(function(minp, maxp, seed) end end end +end - -- Generate nyan cats - generate_nyancats(seed, minp, maxp) +-- +-- Detect mapgen and register suitable on-generated function +-- + +minetest.register_on_mapgen_init(function(MapgenParams) + mgname = MapgenParams.mgname + if mgname == "v6" then + minetest.register_on_generated(default.mgv6_ongen) + end end) +-- +-- Generate nyan cats in all mapgens +-- + +-- facedir: 0/1/2/3 (head node facedir value) +-- length: length of rainbow tail +function default.make_nyancat(pos, facedir, length) + local tailvec = {x=0, y=0, z=0} + if facedir == 0 then + tailvec.z = 1 + elseif facedir == 1 then + tailvec.x = 1 + elseif facedir == 2 then + tailvec.z = -1 + elseif facedir == 3 then + tailvec.x = -1 + else + --print("default.make_nyancat(): Invalid facedir: "+dump(facedir)) + facedir = 0 + tailvec.z = 1 + end + local p = {x=pos.x, y=pos.y, z=pos.z} + minetest.set_node(p, {name="default:nyancat", param2=facedir}) + for i=1,length do + p.x = p.x + tailvec.x + p.z = p.z + tailvec.z + minetest.set_node(p, {name="default:nyancat_rainbow", param2=facedir}) + end +end + +function default.generate_nyancats(minp, maxp, seed) + local height_min = -31000 + local height_max = -32 + if maxp.y < height_min or minp.y > height_max then + return + end + local y_min = math.max(minp.y, height_min) + local y_max = math.min(maxp.y, height_max) + local volume = (maxp.x-minp.x+1)*(y_max-y_min+1)*(maxp.z-minp.z+1) + local pr = PseudoRandom(seed + 9324342) + local max_num_nyancats = math.floor(volume / (16*16*16)) + for i=1,max_num_nyancats do + if pr:next(0, 1000) == 0 then + local x0 = pr:next(minp.x, maxp.x) + local y0 = pr:next(minp.y, maxp.y) + local z0 = pr:next(minp.z, maxp.z) + local p0 = {x=x0, y=y0, z=z0} + default.make_nyancat(p0, pr:next(0,3), pr:next(3,15)) + end + end +end + +minetest.register_on_generated(default.generate_nyancats) + diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index 59546d73..6baae4c8 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -1,6 +1,9 @@ -- Minetest 0.4 mod: default -- See README.txt for licensing and other information. +-- Namespace for functions +flowers = {} + -- Map Generation dofile(minetest.get_modpath("flowers").."/mapgen.lua") diff --git a/mods/flowers/mapgen.lua b/mods/flowers/mapgen.lua index 7148f6e5..11599ed0 100644 --- a/mods/flowers/mapgen.lua +++ b/mods/flowers/mapgen.lua @@ -1,4 +1,4 @@ -minetest.register_on_generated(function(minp, maxp, seed) +function flowers.mgv6ongen(minp, maxp, seed) if maxp.y >= 2 and minp.y <= 0 then -- Generate flowers local perlin1 = minetest.get_perlin(436, 3, 0.6, 100) @@ -59,4 +59,14 @@ minetest.register_on_generated(function(minp, maxp, seed) end end end +end + +-- Enable in mapgen v6 only + +minetest.register_on_mapgen_init(function(MapgenParams) + mgname = MapgenParams.mgname + if mgname == "v6" then + minetest.register_on_generated(flowers.mgv6ongen) + end end) + From 3bf3249d7103efecabac72d75a1b075d6c551d42 Mon Sep 17 00:00:00 2001 From: PenguinDad Date: Thu, 20 Nov 2014 17:02:07 +0100 Subject: [PATCH 0044/2261] Fix leaking globals in flowers and default mapgen.lua Signed-off-by: Craig Robbins --- mods/default/mapgen.lua | 14 ++++++-------- mods/flowers/mapgen.lua | 10 ++++------ 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 624206f3..386ba417 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -278,7 +278,7 @@ function default.mgv6_ongen(minp, maxp, seed) end end end - + function default.make_cactus(pos, size) for y=0,size-1 do local p = {x=pos.x, y=pos.y+y, z=pos.z} @@ -377,7 +377,7 @@ function default.mgv6_ongen(minp, maxp, seed) break end end - + if ground_y then local p = {x=x,y=ground_y+1,z=z} local nn = minetest.get_node(p).name @@ -388,14 +388,14 @@ function default.mgv6_ongen(minp, maxp, seed) -- If desert sand, add dry shrub if nn == "default:desert_sand" then minetest.set_node(p,{name="default:dry_shrub"}) - + -- If dirt with grass, add grass elseif nn == "default:dirt_with_grass" then minetest.set_node(p,{name="default:grass_"..pr:next(1, 5)}) end end end - + end end end @@ -406,9 +406,8 @@ end -- Detect mapgen and register suitable on-generated function -- -minetest.register_on_mapgen_init(function(MapgenParams) - mgname = MapgenParams.mgname - if mgname == "v6" then +minetest.register_on_mapgen_init(function(mg_params) + if mg_params.mgname == "v6" then minetest.register_on_generated(default.mgv6_ongen) end end) @@ -466,4 +465,3 @@ function default.generate_nyancats(minp, maxp, seed) end minetest.register_on_generated(default.generate_nyancats) - diff --git a/mods/flowers/mapgen.lua b/mods/flowers/mapgen.lua index 11599ed0..55e0edcc 100644 --- a/mods/flowers/mapgen.lua +++ b/mods/flowers/mapgen.lua @@ -26,7 +26,7 @@ function flowers.mgv6ongen(minp, maxp, seed) break end end - + if ground_y then local p = {x=x,y=ground_y+1,z=z} local nn = minetest.get_node(p).name @@ -54,7 +54,7 @@ function flowers.mgv6ongen(minp, maxp, seed) end end end - + end end end @@ -63,10 +63,8 @@ end -- Enable in mapgen v6 only -minetest.register_on_mapgen_init(function(MapgenParams) - mgname = MapgenParams.mgname - if mgname == "v6" then +minetest.register_on_mapgen_init(function(mg_params) + if mg_params.mgname == "v6" then minetest.register_on_generated(flowers.mgv6ongen) end end) - From 6680a5198811761da507c8a0fb53a2120a8fa067 Mon Sep 17 00:00:00 2001 From: kilbith Date: Thu, 16 Oct 2014 11:57:37 +0200 Subject: [PATCH 0045/2261] New ladder texture --- mods/default/textures/default_ladder.png | Bin 343 -> 703 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/textures/default_ladder.png b/mods/default/textures/default_ladder.png index 7abfcc6dbdb14b1576e3c216c8d564d409cbaeed..d04c6039c8d2c07f1a192ea8e8d94f41dacee6f0 100644 GIT binary patch delta 680 zcmV;Z0$2Ul0>1^2BYyw}VoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_ z000McNliru-U=599|_pWEzJM`0!&FnK~y-)g_6%plW`o!U(fbzd!EhBO-W^Fr4n5{ zq$o;eb;tsdh;9W@7d4G85@|ulItX66RMesWp&*1h7e$mZDu1<{O=a$fo12^SdGkBI9h{Q{eLa(h^e^!xU662Q}YLt=4ZkxVv8LyHI5 z<)Zy?Cq`L94b-CDK*w~z}Mte3jEGEu1*q(6rN}U)T@b2dve-KNu-{(lwe{AxAY?2Rrlb|z%&V0OG)j1K;%2NDiE_BCKLo}pN@svSI>JS|otAINJa zb&a*Cs+$^LD+hu>TwcH_vy&=P)Kg@(qht~m9i2VgoOxYwkWFpjPz5dvcJfYe2uyyG zEyabYvP$-#iQ+97Y>gInj@#HC)(e(o2pdHs?kk}t0S O0000N delta 317 zcmV-D0mA;j1=j+QBYy!NNkl6SMXI&nYqf zzof$S|Dtl!|0`>NGx3yaX#SDOH z!RY^lEPcXW$oH28`#%fl=UiWz|BcZ~|I0#v=>ZrH1wcFm!eD))<^Ls>X8-2`(|>om z?*G+w7XO!5n>K^<$kbc|f?fdowJKZz9QV~gx-v`w6#wA-km4>){V)IkHOvR%e7kT4 P00000NkvXXu0mjf-lwB* From e707ba3cf161dc7dd53e6349b5859041e79a5adc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20Mart=C3=ADnez?= Date: Sat, 29 Nov 2014 00:44:14 -0300 Subject: [PATCH 0046/2261] Fix leaked globals. --- mods/bucket/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/bucket/init.lua b/mods/bucket/init.lua index 999b344b..1ad3ef07 100644 --- a/mods/bucket/init.lua +++ b/mods/bucket/init.lua @@ -135,8 +135,8 @@ minetest.register_craftitem("bucket:bucket_empty", { return end -- Check if pointing to a liquid source - node = minetest.get_node(pointed_thing.under) - liquiddef = bucket.liquids[node.name] + local node = minetest.get_node(pointed_thing.under) + local liquiddef = bucket.liquids[node.name] if liquiddef ~= nil and liquiddef.itemname ~= nil and (node.name == liquiddef.source or (node.name == liquiddef.flowing and From 8007c142dec9feacdb322f1b886eef798cc5fe35 Mon Sep 17 00:00:00 2001 From: Amaz Date: Sat, 4 Oct 2014 20:49:22 +0100 Subject: [PATCH 0047/2261] Added the new door textures --- mods/doors/textures/door_brown.png | Bin 82 -> 127 bytes mods/doors/textures/door_grey.png | Bin 107 -> 115 bytes mods/doors/textures/door_steel_a.png | Bin 139 -> 449 bytes mods/doors/textures/door_steel_b.png | Bin 121 -> 461 bytes mods/doors/textures/door_wood_a.png | Bin 139 -> 555 bytes mods/doors/textures/door_wood_b.png | Bin 121 -> 539 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/doors/textures/door_brown.png b/mods/doors/textures/door_brown.png index 74785ec89e78ebb34aabec83bbc434f44d86d772..77f748d8543c5f0da92f09e277d449a6507f2bb9 100644 GIT binary patch delta 109 zcmV-z0FwVwe~=ew5C{eU007sY6}JEY07gkfK~xBtP07IxfFKY>!OvU37;CT*d$9jH zObAiKE?%AM=sfnx)o!sAL@h-?60JWXTM}j_+(URwv90yL!>6bj@s7|3L4X#eoEI^= P00000NkvXXu0mjft|lsO delta 64 zcmb;qnjmh?$id9Oz@Ty3WH*pv4)6(a4R??`^1r+j$mQ~MaSW+oOilo@nHU(0OBp4A OECx?kKbLh*2~7as#}2Rn diff --git a/mods/doors/textures/door_grey.png b/mods/doors/textures/door_grey.png index ca16af0c11a4b00938dca589ba33e41d00a3ab13..13665d2060dd8f1e5a7bc37e8ee47689412898d0 100644 GIT binary patch delta 97 zcmc~Uo**70z`@4Az;J!O=yo7w<>}%W!ZB0#h@sE{1rCOTk0omNzYmqTl+yiljj(P_3W#EZ#+-!MORoZA|t@#x;^6=RO@P5d)gS;OXk;vd$@?2>_0w BBy9iy delta 89 zcmXTUo**8=$iV;vR&}#OffQ$fM`SSr1Gg{;GcwGYBLNg-FY)wsWxvDCC%|F2n@w^G kP>9RZ#W93KHaUWYfnf>5Vyz$b7l5J+p00i_>zopr01ICeW&i*H diff --git a/mods/doors/textures/door_steel_a.png b/mods/doors/textures/door_steel_a.png index 59603c17b4f3ef308e885551428487d3ae7f9a90..515dafc08be5cfad9f8720852cb253d7723d4712 100644 GIT binary patch delta 435 zcmV;k0Zjgj0l@>17=H)`0000V^Z#K000D?eL_t(IjeV0rZX!VpMW0m{#b=jUpcU6YKjHT{{%l7~Fw`ILvM=1pW8Gbqcz}<0o zLUQfi5l$>bvH?d>%_KYuZuPA~lX{cBh$EEWsY%z8u*zFP!W$bGC4 z5u8pZR8@(%PW~!#{pJxAbC$~`>h68N{JY34OM@b927Pb)sE8uc(5t_G2&gI|(yLGd zkH=%99RwC@9U|2855RYieeiEd0g z`hi^y(W9|eRYg=U*0kCU1zU?1xMv{3EfMNH{LgZ|frwzc-8L269W$d?VYAspjr*Gc zK<>H@B6xiKiPfDLZlILH-T1CuUM(Ublu{_A3=Bkgek^&x%s8LVtX8YmW0g)sn}i~Q dsxqI?`2!(j{Z;)3{`vp_002ovPDHLkV1kj-zT^M^ delta 122 zcmX@e+|4*aqL_u5fq~)e-A6${ia)?7#1%*bL04DTqD7029zCiUxAp^&&sY-V7tG-B z>_!@pqvh%17{U>qT+qnGmY!^2kW>)H#H`@l*vQ)P!8jx)rlBJzw!oXU^&k&JmaWi@ Tq65{BL1uco`njxgN@xNA3TP(j diff --git a/mods/doors/textures/door_steel_b.png b/mods/doors/textures/door_steel_b.png index bafacd86a5e206a3d16635dbe13eeffa17340d44..c1b75a494ae944c3a1013c3d990bf13630444d41 100644 GIT binary patch delta 445 zcmV;u0Yd(H%>$4be+B>m03Y-JVE_ODlu1NER5*=Ylg)J;F${x0QtH5G?~BXXgFA8= zt|#tb3-HVKkZf}D3;`b`jn~mdzXU;mip%BVhldBApP%{o_@JtId;5uGwr#_Ph@|&q zjfkMCIG@kN0%)y`OAL|N3&2Dqtu-PJ4EBBJ{r#O@RoLd&fAtDL&R4dvjU*z1xQ_-N zPbVbNSLTf1>FEcV4cn6{NS=Emo6O|z?H{%8NFu9hWRwZ=2p$ahmOTh8V-41=HG1Y( z(7qMXATx#<^L!wJB?yqsUcxphjfFAM1{3Kn5CekD5hwxBakyR}~$gs)k*YMP`mO3nGwpfM+Bym}Dl&k#+g( zqa4YUM3pdN3I1g*!-dEk%Fjz8W(P9ou`lT;1>oi7Wt5N+;Nf#wXm+P0%$Qqt%>Jz# zZ@1fEuo~z0?azU}#Fa(MM&`!<~tVOzU40c6Q8`G>MT-_4J$f{HXYFf{w5N+>NCjhZLRwNn zLP8U>+X4m=1r~{k3@!|c=WR}~&Jbi+{ahlDk%4g^2|Ne~zY9T?pgkfo?*IaGF`w_3Zwy#UN=z{#Igq2WxwSv7p5figRo~km^Xbd( zCH}+uW3OjN9CHh8W;ilezldgzwME_lcjx5fgjmfHXFlphxP!Yb@TF8r*K==lN*pa^ z%p*C+g~FVK6n}Mr7nwQ{gAm<}7?c>4kFTD1YfiI&T?Kf*zB>2N0k>(~Ap~Nn4Jnnr zHnxB4P}?+b02M(5zHjgRKLdAe4rtAYU1`u&y3+Xk?Q#ll)>eEx-eYrXe2IViV#Ukp zAO#6>mxVvL!sKBK3lu|kCdSXgSY|8!R z5z_x6s3NMkJ5=ND?ICnW1OYwIQ6MKJMUT!2YDE>Y=v$V S9jJZ`GSk!5&t;ucLK6VS#Un)k diff --git a/mods/doors/textures/door_wood_b.png b/mods/doors/textures/door_wood_b.png index 6842057a045f7812ce5def6f2eb9c5155690c45d..f016933c436d9e55d1bf7315e30018bdad9ad88a 100644 GIT binary patch delta 524 zcmV+n0`vWOn*@*m03Y-JVE_OD;z>k7R5*=olS__NF$_hI9Vb;qPY^8?2*Cz= z11x|gum+aOj5ROuVS2UdH?Z1t(7qbuWu3n z1VjWe4+IdgJ_Wq{kg%WU#yBtBTvt>DOUii(Wcm{kmp~pdfA4@ta4aXR7%T!`zAq$I zl7fg3TN-2&b4ee-)5kk@S+Q(}lteM*`SpR66ct&sfvBLOh-{%i_fP1jZmEq3N);l&i3=!qhY;Ka5pWMAb?VaiaaypeeZj*h z#W?Kp3TZ|Ce}`=a#Ci-Y2^#KLQYFik}BDZloD3^Kx(J;L2XX! zgVx7{r4!!YW;y8YjN#Z)2P~bX4(@BmBPK}QJpU76wc&x4tb|YbCC>>I5me>kDl$7W z)d=hi>zS)V!AedjnUV+lV(?qPBeweITnaK7C50q>e_oE5ptSDP=G@o*FZ&h3a3?$_ zXgYQ2+}+(_r~ArS8nrcsJwxOHoX6TWWbT4HAt1F;Yv;w)3CmeYU3qzYgw)%Wyg~#% zoIV^?K^4-rj>2SSiXC=^Phb0G`-ZRE$DFzmfkdDRIVS|U{5|Y5zW}tk6I6%lLR$a; O002ov22Mn-LSTYk*6FPP delta 102 zcmbQuQaM2~fti7UK|_~67)bF1_=LCuX$w`(a0j{4K&e6x=EERqPZ!6K3dZDww4{WD zgeGRU1q>nzED{qLTo@G3+nivXA;_@$xkMl%1LHo%*B{p|k_PHw@O1TaS?83{1OS}U B8Y=(* From 6fb072e5ffac7bd026da204a0dd017e8942c35ca Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 21 Oct 2014 18:53:04 +0100 Subject: [PATCH 0048/2261] Pine tree, pine needles, pine sapling and pinewood nodes, including textures by Splizard and Cisoun --- mods/default/README.txt | 7 +++ mods/default/crafting.lua | 14 +++++ mods/default/nodes.lua | 57 ++++++++++++++++++ .../default/textures/default_pine_needles.png | Bin 0 -> 512 bytes .../default/textures/default_pine_sapling.png | Bin 0 -> 406 bytes mods/default/textures/default_pinetree.png | Bin 0 -> 693 bytes .../default/textures/default_pinetree_top.png | Bin 0 -> 802 bytes mods/default/textures/default_pinewood.png | Bin 0 -> 455 bytes mods/stairs/init.lua | 8 +++ 9 files changed, 86 insertions(+) create mode 100644 mods/default/textures/default_pine_needles.png create mode 100644 mods/default/textures/default_pine_sapling.png create mode 100644 mods/default/textures/default_pinetree.png create mode 100644 mods/default/textures/default_pinetree_top.png create mode 100644 mods/default/textures/default_pinewood.png diff --git a/mods/default/README.txt b/mods/default/README.txt index 4cdd4269..695d3b1f 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -34,6 +34,9 @@ Cisoun's WTFPL texture pack: default_tree_top.png default_water.png +Cisoun's conifers mod (WTFPL): + default_pine_needles.png + Originating from G4JC's Almost MC Texture Pack: default_torch.png default_torch_on_ceiling.png @@ -94,6 +97,7 @@ Splizard (CC BY-SA 3.0): default_snow.png default_snow_side.png default_ice.png + default_pine_sapling.png Zeg9 (CC BY-SA 3.0): default_coal_block.png @@ -104,6 +108,9 @@ Zeg9 (CC BY-SA 3.0): paramat (CC BY-SA 3.0): wieldhand.png, based on character.png by Jordach (CC BY-SA 3.0) + default_pinetree.png + default_pinetree_top.png + default_pinewood.png brunob.santos (CC BY-SA 4.0): default_desert_cobble.png diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index eb150044..448e3e93 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -14,6 +14,13 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = 'default:pinewood 4', + recipe = { + {'default:pinetree'}, + } +}) + minetest.register_craft({ output = 'default:stick 4', recipe = { @@ -800,3 +807,10 @@ minetest.register_craft({ recipe = "default:grass_1", burntime = 2, }) + +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_sapling", + burntime = 10, +}) + diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 34f29171..3466191d 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1478,3 +1478,60 @@ minetest.register_node("default:snowblock", { dug = {name="default_snow_footstep", gain=0.75}, }), }) + +minetest.register_node("default:pine_needles",{ + description = "Pine Needles", + drawtype = "allfaces_optional", + visual_scale = 1.3, + tiles = {"default_pine_needles.png"}, + waving = 1, + paramtype = "light", + groups = {snappy=3,leafdecay=3,leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {"default:pine_sapling"}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {"default:pine_needles"}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("default:pine_sapling", { + description = "Pine Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_pine_sapling.png"}, + inventory_image = "default_pine_sapling.png", + wield_image = "default_pine_sapling.png", + paramtype = "light", + walkable = false, + groups = {snappy=2,dig_immediate=3}, + sounds = default.node_sound_defaults(), +}) + +minetest.register_node("default:pinetree", { + description = "Pine Tree", + tiles = {"default_pinetree_top.png", "default_pinetree_top.png", "default_pinetree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node +}) + +minetest.register_node("default:pinewood", { + description = "Pinewood Planks", + tiles = {"default_pinewood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + diff --git a/mods/default/textures/default_pine_needles.png b/mods/default/textures/default_pine_needles.png new file mode 100644 index 0000000000000000000000000000000000000000..2b007be759433464dbc2de2652ff6c56571c6e21 GIT binary patch literal 512 zcmV+b0{{JqP)HdX?x zAvB>vqK1n1e*mg|f>fc|NT%@0AyIa2fhIE1-fEPI=kJ>{l<(F&4I=?Sd2}2aPfM#a z!_zR%HuWoURM(ng8(>`iW~*yG2Z>GnqI*M(83XP}H_p~`}5!(QPEbY|v?o6{E4Fw*l8 zF%2WB^5|G+hWjo;6&j)OR9$QKU*9N?j(>lqw+_TV`u+vctSkhWyX?_-5h*+Y`xi`i z*@Hw#k|c%qm%x@Vl|7UIFvHTBVG)UOIm`UjwdT-x`uMbnZJ4e-vd2O3fm9*zeI zmMTymd-}3FyF0V<0skI{YoG6$$ylE0hXe(-eFp&0_8p>}=g*l01)^fmcS>`cITtT{RREdB3zwEp~pWNQY**w$C$-K`jV-xOn?P_ z`J-{iBrcvrx+7k_2sCWsjnISwoQ@ltHgWPG7JZ^AnxVH&cm}a&F`bRacLMu15ePx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^n@ z11b`4D+M(G00K2hL_t(I%RQ4zjx1FS1;f7I%&h8uunnecfc>uoBqZpr%({OwNMLN~ zC>+O@-+ukY)JL{`BX~zjiJT&RPGZXZ`N!{k{`?c?>m=n3C&GE27{>WJ(FKGU=&jS| zWUWPQ9TCGj<^298$B1_x=NyRA$HY0o=0sH>B!@ahL@1@uduPtcvc)u`l*WGS*qU7B z0-*N^0&3!L?hXjfv4Ckt?~?_@5dRNtwXtjgV9Qtrsx0Q5Y&p^AWcH48j#3)ER`%xy z*LmTcQfgt@!aJqb4uF~&wM`IZj>$qvG0^J8XpLjvK$KD%qc)DbQEJ211p9Y|1s|bP$sM-Rj)Kan8S#zMyvmXx(!$dGM<}y-F04y6U zTP(P1Oet`lZ{oJoS_2kN9Wh2;*F`Ih7$e7i<3FFDEE_1Gf?;BuuWugvjyfzMtK)h73Tvn`nv@M zuCtJigRj58cz!%N&o@4JFeM!a0HwBDE=GA@Y}%0gdkaMQBL96X{U>Iu*+PkpUqSwlt6I3xXQV56$wN_G0j4_yfGR^K41jENn zX@j(FU`oyz?;@(oyHt+jKvkJ$_bljt4d4;IHJTBEC#Q%4$FX5z1aY*{Q0H$lz^lK1 b!YTg%;Xz=CmniwT00000NkvXXu0mjfhT1f1 literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_pinetree_top.png b/mods/default/textures/default_pinetree_top.png new file mode 100644 index 0000000000000000000000000000000000000000..9e2f8647645e47ea52f0014e6d638b7751cc6f8f GIT binary patch literal 802 zcmV+-1Ks?IP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^n@ z11bUQl|<_R00N>(L_t(I%WacSYb#Y8hMzO%%uFW9}?gu4*D{=o}UTkMr2ZSKiTCUa)a9~VI@>brawKc3$MulV$n4u z7*p}@{MBn+{@p2nkKUg1)7tP(p%|Q8;?o>GKc%fZ5Dxpwu)Mw|goMp-#Lc#0Tqy4P z3}sA3x7U39!Mhwiy~4E}-tG`8Mdmrd2b5Bz@_j^>lTOaKd;W~iKl=h>DwNhGqiWCb zTUWH(n%#OuR!*SX(=OKtC6Refo1{pUlJ^PoH?BCJYo0IL1A%;fK|rzlW5xL5f^=9y zfOzat#gs&5BvKJ$r2hS91QX6K&e1o`!NGRdfOkX@iN2@0`;GDZ0#|SGoh1<&-dl>J zGlUQadu{vpf=?yUd-`g}epu1BJ!2HZ#hV}!Y<-X0Y;d-QBmo>@-vW>rQ!&yduC2*W zG{e~pr4-J#tbh5A=HU+4Y;m?l2tjZy-g!nRbF?l=0A$}|o1V?GqHAhoCb88$!8;yq zex=*jL}vl;y(RjH&r*!34hQZZ3~45rPKTsfjx`mDfP7LiT`Z6?1(6Y4OZ1)?Ji;AZ zD6LCOd%*KukN2L?HTXWqS6jMWhpl$Zo?H?`Pv2Mu8oWOcDPt;Ldr}g-BY20md&cJr zVi2gokhFA+&t^!au$5sjn?i8-c8}KOf#B<9%X^(=cs#}JTdLca$WcK$C=f~_Lc}!< z#gV2sJw=X2*!$JNfiV@kR`Bf0ZwO68=sHI8V+yTNnLp!9^GhD2*gd_(U%QA)baD}G!(AYJmf#%((0_PXMQ78tYo g-#Pzx%7+7g0#Pt$?Q?}=djJ3c07*qoM6N<$f-zxgssI20 literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_pinewood.png b/mods/default/textures/default_pinewood.png new file mode 100644 index 0000000000000000000000000000000000000000..4225296140912185e1d3f163fad29247a1449315 GIT binary patch literal 455 zcmV;&0XY7NP)?sSrf}moD0IUR# zNG_qVX{~htz!a}$qn&3@P-`Vnkb-gvU9cl!Y-++oO1lcS66Dhi-X;K#$zKl`=37lk z;yw=sGYuFl*U;{qVi`)!?dZ_yHwm^Ivmp>wZngPz)a%xF xIxJFcV5Y$jJB}&rBulHe)u>%$_vJzshfl1yssKp(`Y!+g002ovPDHLkV1kzYxs3n- literal 0 HcmV?d00001 diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index afd89bda..c7df28c5 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -288,3 +288,11 @@ stairs.register_stair_and_slab("stonebrick", "default:stonebrick", "Stone Brick Stair", "Stone Brick Slab", default.node_sound_stone_defaults()) + +stairs.register_stair_and_slab("pinewood", "default:pinewood", + {snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + {"default_pinewood.png"}, + "Pinewood Stair", + "Pinewood Slab", + default.node_sound_wood_defaults()) + From 128f0adb24b604edd7a793c48563a2b1a5de2f13 Mon Sep 17 00:00:00 2001 From: Craig Davison Date: Tue, 25 Nov 2014 20:34:40 +0000 Subject: [PATCH 0049/2261] Fix some undeclared global variables --- mods/default/functions.lua | 2 +- mods/default/nodes.lua | 8 ++++---- mods/doors/init.lua | 23 +++++++++++------------ mods/farming/nodes.lua | 2 +- mods/sethome/init.lua | 4 ++-- 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index fe553c51..be1a4cf8 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -309,7 +309,7 @@ minetest.register_abm({ end if not do_preserve then -- Drop stuff other than the node itself - itemstacks = minetest.get_node_drops(n0.name) + local itemstacks = minetest.get_node_drops(n0.name) for _, itemname in ipairs(itemstacks) do if minetest.get_item_group(n0.name, "leafdecay_drop") ~= 0 or itemname ~= n0.name then diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 3466191d..68a3989b 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -393,19 +393,19 @@ minetest.register_node("default:bookshelf", { groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3}, sounds = default.node_sound_wood_defaults(), on_construct = function(pos) - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) meta:set_string("formspec", default.bookshelf_formspec) local inv = meta:get_inventory() inv:set_size("books", 8*2) end, can_dig = function(pos,player) - local meta = minetest.env:get_meta(pos); + local meta = minetest.get_meta(pos); local inv = meta:get_inventory() return inv:is_empty("books") end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) local inv = meta:get_inventory() if listname == "books" then if stack:get_name() == "default:book" then @@ -417,7 +417,7 @@ minetest.register_node("default:bookshelf", { end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local stack = inv:get_stack(from_list, from_index) local to_stack = inv:get_stack(to_list, to_index) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 808f5f7d..c82de236 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -380,18 +380,17 @@ local function punch(pos) local me = minetest.get_node(pos) local tmp_node local tmp_node2 - oben = {x=pos.x, y=pos.y+1, z=pos.z} - if state == 1 then - state = 0 - minetest.sound_play("door_close", {pos = pos, gain = 0.3, max_hear_distance = 10}) - tmp_node = {name="doors:trapdoor", param1=me.param1, param2=me.param2} - else - state = 1 - minetest.sound_play("door_open", {pos = pos, gain = 0.3, max_hear_distance = 10}) - tmp_node = {name="doors:trapdoor_open", param1=me.param1, param2=me.param2} - end - update_door(pos, tmp_node) - meta:set_int("state", state) + if state == 1 then + state = 0 + minetest.sound_play("door_close", {pos = pos, gain = 0.3, max_hear_distance = 10}) + tmp_node = {name="doors:trapdoor", param1=me.param1, param2=me.param2} + else + state = 1 + minetest.sound_play("door_open", {pos = pos, gain = 0.3, max_hear_distance = 10}) + tmp_node = {name="doors:trapdoor_open", param1=me.param1, param2=me.param2} + end + update_door(pos, tmp_node) + meta:set_int("state", state) end minetest.register_node("doors:trapdoor", { diff --git a/mods/farming/nodes.lua b/mods/farming/nodes.lua index ba7aed47..a36e43e4 100644 --- a/mods/farming/nodes.lua +++ b/mods/farming/nodes.lua @@ -106,8 +106,8 @@ minetest.register_abm({ return end -- check if there is water nearby + local wet_lvl = minetest.get_item_group(node.name, "wet") if minetest.find_node_near(pos, 3, {"group:water"}) then - local wet_lvl = minetest.get_item_group(node.name, "wet") -- if it is dry soil and not base node, turn it into wet soil if wet_lvl == 0 then minetest.set_node(pos, {name = wet}) diff --git a/mods/sethome/init.lua b/mods/sethome/init.lua index 20f77c01..590086b4 100644 --- a/mods/sethome/init.lua +++ b/mods/sethome/init.lua @@ -30,7 +30,7 @@ minetest.register_chatcommand("home", { description = "Teleport you to your home point", privs = {home=true}, func = function(name) - local player = minetest.env:get_player_by_name(name) + local player = minetest.get_player_by_name(name) if player == nil then -- just a check to prevent the server crashing return false @@ -48,7 +48,7 @@ minetest.register_chatcommand("sethome", { description = "Set your home point", privs = {home=true}, func = function(name) - local player = minetest.env:get_player_by_name(name) + local player = minetest.get_player_by_name(name) local pos = player:getpos() homepos[player:get_player_name()] = pos minetest.chat_send_player(name, "Home set!") From 5b7db483728cfdd735e3bb8819d1320671836762 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Wed, 3 Dec 2014 16:59:36 +0100 Subject: [PATCH 0050/2261] Fix various fire sound bugs --- mods/fire/init.lua | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/mods/fire/init.lua b/mods/fire/init.lua index 4ce9f6a7..b56cb1ae 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -1,5 +1,7 @@ -- minetest/fire/init.lua +fire = {} + minetest.register_node("fire:basic_flame", { description = "Fire", drawtype = "firelike", @@ -14,17 +16,16 @@ minetest.register_node("fire:basic_flame", { walkable = false, buildable_to = true, damage_per_second = 4, - - after_place_node = function(pos, placer) - fire.on_flame_add_at(pos) + + on_construct = function(pos) + minetest.after(0, fire.on_flame_add_at, pos) end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - fire.on_flame_remove_at(pos) + + on_destruct = function(pos) + minetest.after(0, fire.on_flame_remove_at, pos) end, }) -fire = {} fire.D = 6 -- key: position hash of low corner of area -- value: {handle=sound handle, name=sound name} @@ -81,12 +82,10 @@ function fire.update_sounds_around(pos) end function fire.on_flame_add_at(pos) - --print("flame added at "..minetest.pos_to_string(pos)) fire.update_sounds_around(pos) end function fire.on_flame_remove_at(pos) - --print("flame removed at "..minetest.pos_to_string(pos)) fire.update_sounds_around(pos) end @@ -117,7 +116,6 @@ minetest.register_abm({ local p = fire.find_pos_for_flame_around(p0) if p then minetest.set_node(p, {name="fire:basic_flame"}) - fire.on_flame_add_at(p) end end, }) @@ -143,7 +141,6 @@ minetest.register_abm({ local p2 = fire.find_pos_for_flame_around(p) if p2 then minetest.set_node(p2, {name="fire:basic_flame"}) - fire.on_flame_add_at(p2) end end end, @@ -158,7 +155,6 @@ minetest.register_abm({ -- If there is water or stuff like that around flame, remove flame if fire.flame_should_extinguish(p0) then minetest.remove_node(p0) - fire.on_flame_remove_at(p0) return end -- Make the following things rarer @@ -168,7 +164,6 @@ minetest.register_abm({ -- If there are no flammable nodes around flame, remove flame if not minetest.find_node_near(p0, 1, {"group:flammable"}) then minetest.remove_node(p0) - fire.on_flame_remove_at(p0) return end if math.random(1,4) == 1 then @@ -185,7 +180,6 @@ minetest.register_abm({ else -- remove flame minetest.remove_node(p0) - fire.on_flame_remove_at(p0) end end, }) From 19bdcb26f61ed763998734dd12e9a2a2aa0fb0f5 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Wed, 3 Dec 2014 17:12:20 +0100 Subject: [PATCH 0051/2261] Add missing groups to pine sapling --- 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 68a3989b..ca09b5bd 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1514,7 +1514,7 @@ minetest.register_node("default:pine_sapling", { wield_image = "default_pine_sapling.png", paramtype = "light", walkable = false, - groups = {snappy=2,dig_immediate=3}, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1}, sounds = default.node_sound_defaults(), }) From 31edc5a9ff99fe5925e8381e6dff31dcada40725 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Wed, 3 Dec 2014 17:12:57 +0100 Subject: [PATCH 0052/2261] Add all saplings to group sapling --- mods/default/nodes.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index ca09b5bd..84f5f947 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -292,7 +292,7 @@ minetest.register_node("default:junglesapling", { type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} }, - groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1}, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, sounds = default.node_sound_leaves_defaults(), }) @@ -1330,7 +1330,7 @@ minetest.register_node("default:sapling", { type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} }, - groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1}, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, sounds = default.node_sound_leaves_defaults(), }) @@ -1514,7 +1514,7 @@ minetest.register_node("default:pine_sapling", { wield_image = "default_pine_sapling.png", paramtype = "light", walkable = false, - groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1}, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, sounds = default.node_sound_defaults(), }) From fd34872de8ae7ecc449896a0dad5e77aad4a664e Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sat, 6 Dec 2014 11:43:07 +0100 Subject: [PATCH 0053/2261] Fix possible stacking of books in bookshelf Original author: @MT-Modder --- mods/default/nodes.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 84f5f947..3fe0fe80 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -407,8 +407,9 @@ minetest.register_node("default:bookshelf", { allow_metadata_inventory_put = function(pos, listname, index, stack, player) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() + local to_stack = inv:get_stack(listname, index) if listname == "books" then - if stack:get_name() == "default:book" then + if stack:get_name() == "default:book" and to_stack:is_empty() then return 1 else return 0 From 20f938e44a731c620d2333d8e126974d0213a1c5 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sat, 6 Dec 2014 11:46:04 +0100 Subject: [PATCH 0054/2261] Allow the group book to be placed into bookshelfs --- mods/default/craftitems.lua | 1 + mods/default/nodes.lua | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index 3d2cb113..539f6b43 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -14,6 +14,7 @@ minetest.register_craftitem("default:paper", { minetest.register_craftitem("default:book", { description = "Book", inventory_image = "default_book.png", + groups = {book=1}, }) minetest.register_craftitem("default:coal_lump", { diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 3fe0fe80..7e7977c6 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -409,7 +409,8 @@ minetest.register_node("default:bookshelf", { local inv = meta:get_inventory() local to_stack = inv:get_stack(listname, index) if listname == "books" then - if stack:get_name() == "default:book" and to_stack:is_empty() then + if minetest.get_item_group(stack:get_name(), "book") ~= 0 + and to_stack:is_empty() then return 1 else return 0 From 22dd46dcc600360648ecbbabb9f23bb1f3ee8ac7 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Wed, 3 Dec 2014 18:46:02 +0100 Subject: [PATCH 0055/2261] Dont dry out soil if unloaded blocks are nearby --- mods/farming/nodes.lua | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/mods/farming/nodes.lua b/mods/farming/nodes.lua index a36e43e4..10c4afe9 100644 --- a/mods/farming/nodes.lua +++ b/mods/farming/nodes.lua @@ -113,16 +113,20 @@ minetest.register_abm({ minetest.set_node(pos, {name = wet}) end else - -- turn it back into base if it is already dry - if wet_lvl == 0 then - -- only turn it back if there is no plant/seed on top of it - if minetest.get_item_group(nn.name, "plant") == 0 and minetest.get_item_group(nn.name, "seed") == 0 then - minetest.set_node(pos, {name = base}) + -- only turn back if there are no unloaded blocks (and therefore + -- possible water sources) nearby + if not minetest.find_node_near(pos, 3, {"ignore"}) then + -- turn it back into base if it is already dry + if wet_lvl == 0 then + -- only turn it back if there is no plant/seed on top of it + if minetest.get_item_group(nn.name, "plant") == 0 and minetest.get_item_group(nn.name, "seed") == 0 then + minetest.set_node(pos, {name = base}) + end + + -- if its wet turn it back into dry soil + elseif wet_lvl == 1 then + minetest.set_node(pos, {name = dry}) end - - -- if its wet turn it back into dry soil - elseif wet_lvl == 1 then - minetest.set_node(pos, {name = dry}) end end end, From 2c2edfad044fdc4b747931cade5a400d6c1b08f1 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sat, 6 Dec 2014 11:01:18 +0100 Subject: [PATCH 0056/2261] Move leafdecay doc to game_api.txt --- game_api.txt | 13 +++++++++++++ mods/default/functions.lua | 11 ----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/game_api.txt b/game_api.txt index 1ad618dc..9052e2ae 100644 --- a/game_api.txt +++ b/game_api.txt @@ -195,3 +195,16 @@ Model Definition -- ... }, } + +Leafdecay +--------- +To enable leaf decay for a node, add it to the "leafdecay" group. + +The rating of the group determines how far from a node in the group "tree" +the node can be without decaying. + +If param2 of the node is ~= 0, the node will always be preserved. Thus, if +the player places a node of that kind, you will want to set param2=1 or so. + +If the node is in the leafdecay_drop group then it will always be dropped as an +item. diff --git a/mods/default/functions.lua b/mods/default/functions.lua index be1a4cf8..630cdbdb 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -233,17 +233,6 @@ end -- Leafdecay -- --- To enable leaf decay for a node, add it to the "leafdecay" group. --- --- The rating of the group determines how far from a node in the group "tree" --- the node can be without decaying. --- --- If param2 of the node is ~= 0, the node will always be preserved. Thus, if --- the player places a node of that kind, you will want to set param2=1 or so. --- --- If the node is in the leafdecay_drop group then the it will always be dropped --- as an item - default.leafdecay_trunk_cache = {} default.leafdecay_enable_cache = true -- Spread the load of finding trunks From 9ec33f34f1fc76a70eb9e8aeddcace4042f00979 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sat, 6 Dec 2014 11:08:41 +0100 Subject: [PATCH 0057/2261] Set param2 to 1 if player places leaves --- game_api.txt | 4 ++++ mods/default/functions.lua | 6 ++++++ mods/default/nodes.lua | 3 +++ 3 files changed, 13 insertions(+) diff --git a/game_api.txt b/game_api.txt index 9052e2ae..4424b20b 100644 --- a/game_api.txt +++ b/game_api.txt @@ -206,5 +206,9 @@ the node can be without decaying. If param2 of the node is ~= 0, the node will always be preserved. Thus, if the player places a node of that kind, you will want to set param2=1 or so. +The function default.after_place_leaves can be set as after_place_node of a node +to set param2 to 1 if the player places the node (should not be used for nodes +that use param2 otherwise (e.g. facedir)). + If the node is in the leafdecay_drop group then it will always be dropped as an item. diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 630cdbdb..ecb7f612 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -244,6 +244,12 @@ minetest.register_globalstep(function(dtime) math.floor(dtime * finds_per_second) end) +default.after_place_leaves = function(pos, placer, itemstack, pointed_thing) + local node = minetest.get_node(pos) + node.param2 = 1 + minetest.set_node(pos, node) +end + minetest.register_abm({ nodenames = {"group:leafdecay"}, neighbors = {"air", "group:liquid"}, diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 7e7977c6..a4fe2c37 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -277,6 +277,7 @@ minetest.register_node("default:jungleleaves", { } }, sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves, }) minetest.register_node("default:junglesapling", { @@ -341,6 +342,7 @@ minetest.register_node("default:leaves", { } }, sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves, }) minetest.register_node("default:cactus", { @@ -1505,6 +1507,7 @@ minetest.register_node("default:pine_needles",{ } }, sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves, }) minetest.register_node("default:pine_sapling", { From 11a7b884345c5b0ab2278255674e70c458ca9c77 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sat, 6 Dec 2014 12:00:58 +0100 Subject: [PATCH 0058/2261] Fix visibility of global/local dye tables --- mods/dye/init.lua | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/mods/dye/init.lua b/mods/dye/init.lua index 810502d2..3e827446 100644 --- a/mods/dye/init.lua +++ b/mods/dye/init.lua @@ -14,7 +14,7 @@ -- }) -- Other mods can use these for looping through available colors -local dye = {} +dye = {} dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"} dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"} @@ -138,8 +138,3 @@ for one,results in pairs(dyelocal.mixes) do }) end end - --- Hide dyelocal -dyelocal = nil - --- EOF From ef0eb4d435e81361269047b4640d2722b24be475 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sat, 6 Dec 2014 12:11:07 +0100 Subject: [PATCH 0059/2261] Move doc for dyes to game_api.txt --- game_api.txt | 63 +++++++++++++++++++++++++++++++++++++++++++++++ mods/dye/init.lua | 53 --------------------------------------- 2 files changed, 63 insertions(+), 53 deletions(-) diff --git a/game_api.txt b/game_api.txt index 4424b20b..8123c010 100644 --- a/game_api.txt +++ b/game_api.txt @@ -212,3 +212,66 @@ that use param2 otherwise (e.g. facedir)). If the node is in the leafdecay_drop group then it will always be dropped as an item. + +Dyes +---- +To make recipes that will work with any dye ever made by anybody, define +them based on groups. You can select any group of groups, based on your need for +amount of colors. + +#Color groups +------------- +Base color groups: +- basecolor_white +- basecolor_grey +- basecolor_black +- basecolor_red +- basecolor_yellow +- basecolor_green +- basecolor_cyan +- basecolor_blue +- basecolor_magenta + +Extended color groups (* = equal to a base color): +* excolor_white +- excolor_lightgrey +* excolor_grey +- excolor_darkgrey +* excolor_black +* excolor_red +- excolor_orange +* excolor_yellow +- excolor_lime +* excolor_green +- excolor_aqua +* excolor_cyan +- excolor_sky_blue +* excolor_blue +- excolor_violet +* excolor_magenta +- excolor_red_violet + +The whole unifieddyes palette as groups: +- unicolor_ +For the following, no white/grey/black is allowed: +- unicolor_medium_ +- unicolor_dark_ +- unicolor_light_ +- unicolor__s50 +- unicolor_medium__s50 +- unicolor_dark__s50 + +Example of one shapeless recipe using a color group: +minetest.register_craft({ + type = "shapeless", + output = ':item_yellow', + recipe = {':item_no_color', 'group:basecolor_yellow'}, +}) + +#Color lists +------------ +dye.basecolors +^ Array containing the names of available base colors + +dye.excolors +^ Array containing the names of the available extended colors diff --git a/mods/dye/init.lua b/mods/dye/init.lua index 3e827446..d7d18f7a 100644 --- a/mods/dye/init.lua +++ b/mods/dye/init.lua @@ -1,63 +1,10 @@ -- minetest/dye/init.lua --- 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. --- basecolor: 9, excolor: 17, unicolor: 89 --- --- Example of one shapeless recipe using a color group: --- Note: As this uses basecolor_*, you'd need 9 of these. --- minetest.register_craft({ --- type = "shapeless", --- output = ':item_yellow', --- recipe = {':item_no_color', 'group:basecolor_yellow'}, --- }) - -- Other mods can use these for looping through available colors dye = {} dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"} dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"} --- Base color groups: --- - basecolor_white --- - basecolor_grey --- - basecolor_black --- - basecolor_red --- - basecolor_yellow --- - basecolor_green --- - basecolor_cyan --- - basecolor_blue --- - basecolor_magenta - --- Extended color groups (* = equal to a base color): --- * excolor_white --- - excolor_lightgrey --- * excolor_grey --- - excolor_darkgrey --- * excolor_black --- * excolor_red --- - excolor_orange --- * excolor_yellow --- - excolor_lime --- * excolor_green --- - excolor_aqua --- * excolor_cyan --- - excolor_sky_blue --- * excolor_blue --- - excolor_violet --- * excolor_magenta --- - excolor_red_violet - --- The whole unifieddyes palette as groups: --- - unicolor_ --- For the following, no white/grey/black is allowed: --- - unicolor_medium_ --- - unicolor_dark_ --- - unicolor_light_ --- - unicolor__s50 --- - unicolor_medium__s50 --- - unicolor_dark__s50 - -- Local stuff local dyelocal = {} From 954d64afdccb42be7c6c50d0803aeff9bb09b701 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sat, 6 Dec 2014 12:41:19 +0100 Subject: [PATCH 0060/2261] Add a minetest.conf.example with all available settings --- minetest.conf.example | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 minetest.conf.example diff --git a/minetest.conf.example b/minetest.conf.example new file mode 100644 index 00000000..b908ad24 --- /dev/null +++ b/minetest.conf.example @@ -0,0 +1,24 @@ +# This file contains settings of minetest_game that can be changed in +# minetest.conf +# +# By default, all the settings are commented and not functional. +# Uncomment settings by removing the preceding #. + +# Whether creative mode (fast digging of all blocks, unlimited resources) should be enabled +#creative_mode = false + +# The time in seconds after which the bones of a dead player can be looted by everyone +# 0 to disable +#share_bones_time = 1200 + +# Whether fire should be disabled (all fire nodes will instantly disappear) +#disable_fire = false + +# Whether steel tools, torches and cobblestone should be given to new players +#give_initial_stuff = false + +# Whether the TNT mod should be enabled +#enable_tnt = + +# The radius of a TNT explosion +#tnt_radius = 3 From 4ec4672f016880713b9c4062032be14f6f3c98b1 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sat, 6 Dec 2014 12:50:05 +0100 Subject: [PATCH 0061/2261] Remove remains of weather --- mods/default/nodes.lua | 22 ++++++++-------------- mods/fire/init.lua | 2 +- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index a4fe2c37..47626e8a 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -560,9 +560,8 @@ minetest.register_node("default:water_flowing", { liquid_alternative_flowing = "default:water_flowing", liquid_alternative_source = "default:water_source", liquid_viscosity = WATER_VISC, - freezemelt = "default:snow", post_effect_color = {a=64, r=100, g=100, b=200}, - groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1, freezes=1, melt_around=1}, + groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1}, }) minetest.register_node("default:water_source", { @@ -592,9 +591,8 @@ minetest.register_node("default:water_source", { liquid_alternative_flowing = "default:water_flowing", liquid_alternative_source = "default:water_source", liquid_viscosity = WATER_VISC, - freezemelt = "default:ice", post_effect_color = {a=64, r=100, g=100, b=200}, - groups = {water=3, liquid=3, puts_out_fire=1, freezes=1}, + groups = {water=3, liquid=3, puts_out_fire=1}, }) minetest.register_node("default:lava_flowing", { @@ -689,7 +687,7 @@ minetest.register_node("default:torch", { wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1}, wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1}, }, - groups = {choppy=2,dig_immediate=3,flammable=1,attached_node=1,hot=2}, + groups = {choppy=2,dig_immediate=3,flammable=1,attached_node=1}, legacy_wallmounted = true, sounds = default.node_sound_defaults(), }) @@ -1022,7 +1020,7 @@ minetest.register_node("default:furnace_active", { paramtype2 = "facedir", light_source = 8, drop = "default:furnace", - groups = {cracky=2, not_in_creative_inventory=1,hot=1}, + groups = {cracky=2, not_in_creative_inventory=1}, legacy_facedir_simple = true, is_ground_content = false, sounds = default.node_sound_stone_defaults(), @@ -1435,8 +1433,7 @@ minetest.register_node("default:ice", { tiles = {"default_ice.png"}, is_ground_content = true, paramtype = "light", - freezemelt = "default:water_source", - groups = {cracky=3, melts=1}, + groups = {cracky=3}, sounds = default.node_sound_glass_defaults(), }) @@ -1448,16 +1445,14 @@ minetest.register_node("default:snow", { is_ground_content = true, paramtype = "light", buildable_to = true, - leveled = 7, drawtype = "nodebox", - freezemelt = "default:water_flowing", node_box = { - type = "leveled", + type = "fixed", fixed = { {-0.5, -0.5, -0.5, 0.5, -0.5+2/16, 0.5}, }, }, - groups = {crumbly=3,falling_node=1, melts=1, float=1}, + groups = {crumbly=3,falling_node=1}, sounds = default.node_sound_dirt_defaults({ footstep = {name="default_snow_footstep", gain=0.25}, dug = {name="default_snow_footstep", gain=0.75}, @@ -1475,8 +1470,7 @@ minetest.register_node("default:snowblock", { description = "Snow Block", tiles = {"default_snow.png"}, is_ground_content = true, - freezemelt = "default:water_source", - groups = {crumbly=3, melts=1}, + groups = {crumbly=3}, sounds = default.node_sound_dirt_defaults({ footstep = {name="default_snow_footstep", gain=0.25}, dug = {name="default_snow_footstep", gain=0.75}, diff --git a/mods/fire/init.lua b/mods/fire/init.lua index b56cb1ae..f932b0c5 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -11,7 +11,7 @@ minetest.register_node("fire:basic_flame", { }}, inventory_image = "fire_basic_flame.png", light_source = 14, - groups = {igniter=2,dig_immediate=3,hot=3}, + groups = {igniter=2,dig_immediate=3}, drop = '', walkable = false, buildable_to = true, From 957f94534bbba4cc74251470b0a475903e876231 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sat, 6 Dec 2014 12:56:58 +0100 Subject: [PATCH 0062/2261] Remove remains of finite liquids from bucket mod This reverts commit 79856c914d5b9d3eb43bec78840ee811880b30ff. --- mods/bucket/init.lua | 40 ++++++---------------------------------- 1 file changed, 6 insertions(+), 34 deletions(-) diff --git a/mods/bucket/init.lua b/mods/bucket/init.lua index 1ad3ef07..6715ebbf 100644 --- a/mods/bucket/init.lua +++ b/mods/bucket/init.lua @@ -1,8 +1,6 @@ -- Minetest 0.4 mod: bucket -- See README.txt for licensing and other information. -local LIQUID_MAX = 8 --The number of water levels when liquid_finite is enabled - minetest.register_alias("bucket", "bucket:bucket_empty") minetest.register_alias("bucket_water", "bucket:bucket_water") minetest.register_alias("bucket_lava", "bucket:bucket_lava") @@ -71,40 +69,20 @@ function bucket.register_liquid(source, flowing, itemname, inventory_image, name itemstack) or itemstack end - local place_liquid = function(pos, node, source, flowing, fullness) + local place_liquid = function(pos, node, source, flowing) if check_protection(pos, user and user:get_player_name() or "", "place "..source) then return end - if math.floor(fullness/128) == 1 or - not minetest.setting_getbool("liquid_finite") then - minetest.add_node(pos, {name=source, - param2=fullness}) - return - elseif node.name == flowing then - fullness = fullness + node.param2 - elseif node.name == source then - fullness = LIQUID_MAX - end - - if fullness >= LIQUID_MAX then - minetest.add_node(pos, {name=source, - param2=LIQUID_MAX}) - else - minetest.add_node(pos, {name=flowing, - param2=fullness}) - end + minetest.add_node(pos, {name=source}) end -- Check if pointing to a buildable node - local fullness = tonumber(itemstack:get_metadata()) - if not fullness then fullness = LIQUID_MAX end - if ndef and ndef.buildable_to then -- buildable; replace the node place_liquid(pointed_thing.under, node, - source, flowing, fullness) + source, flowing) else -- not buildable to; place the liquid above -- check if the node above can be replaced @@ -112,7 +90,7 @@ function bucket.register_liquid(source, flowing, itemname, inventory_image, name if node and minetest.registered_nodes[node.name].buildable_to then place_liquid(pointed_thing.above, node, source, - flowing, fullness) + flowing) else -- do not remove the bucket with the liquid return @@ -138,9 +116,7 @@ minetest.register_craftitem("bucket:bucket_empty", { local node = minetest.get_node(pointed_thing.under) local liquiddef = bucket.liquids[node.name] if liquiddef ~= nil and liquiddef.itemname ~= nil and - (node.name == liquiddef.source or - (node.name == liquiddef.flowing and - minetest.setting_getbool("liquid_finite"))) then + node.name == liquiddef.source then if check_protection(pointed_thing.under, user:get_player_name(), "take ".. node.name) then @@ -149,11 +125,7 @@ minetest.register_craftitem("bucket:bucket_empty", { minetest.add_node(pointed_thing.under, {name="air"}) - if node.name == liquiddef.source then - node.param2 = LIQUID_MAX - end - return ItemStack({name = liquiddef.itemname, - metadata = tostring(node.param2)}) + return ItemStack(liquiddef.itemname) end end, }) From 5a06de184c37e58ed8b69bc312f647f7bb6abf48 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sat, 6 Dec 2014 18:47:46 +0100 Subject: [PATCH 0063/2261] Rewrite furnace * Move furnace related code into furnace.lua * Move duplicated code into functions * Rewrite ABM: * Easier to follow strcuture (no returns in the middle) * No unnecessary calls to get_craft_result * Split logic and "visual feedback" (a bit) * Fewer calls to meta:set and meta:get * Better feedback on the current state of the furnace --- mods/default/furnace.lua | 283 +++++++++++++++++++++++++++++++++ mods/default/init.lua | 1 + mods/default/nodes.lua | 329 --------------------------------------- 3 files changed, 284 insertions(+), 329 deletions(-) create mode 100644 mods/default/furnace.lua diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua new file mode 100644 index 00000000..d49d8efe --- /dev/null +++ b/mods/default/furnace.lua @@ -0,0 +1,283 @@ + +-- +-- Formspecs +-- + +local function active_formspec(fuel_percent, item_percent) + local formspec = + "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;src;2.75,0.5;1,1;]".. + "list[current_name;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. + (100-fuel_percent)..":default_furnace_fire_fg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[lowpart:".. + (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. + "list[current_name;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + default.get_hotbar_bg(0, 4.25) + return formspec +end + +local inactive_formspec = + "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;src;2.75,0.5;1,1;]".. + "list[current_name;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "list[current_name;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + default.get_hotbar_bg(0, 4.25) + +-- +-- Node callback functions that are the same for active and inactive furnace +-- + +local function can_dig(pos, player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("fuel") and inv:is_empty("dst") and inv:is_empty("src") +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if listname == "fuel" then + if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then + if inv:is_empty("src") then + meta:set_string("infotext", "Furnace is empty") + end + return stack:get_count() + else + return 0 + end + elseif listname == "src" then + return stack:get_count() + elseif listname == "dst" then + return 0 + end +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + +-- +-- Node definitions +-- + +minetest.register_node("default:furnace", { + description = "Furnace", + tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_front.png" + }, + paramtype2 = "facedir", + groups = {cracky=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + + can_dig = can_dig, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, +}) + +minetest.register_node("default:furnace_active", { + description = "Furnace", + tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", + { + image = "default_furnace_front_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + } + }, + paramtype2 = "facedir", + light_source = 8, + drop = "default:furnace", + groups = {cracky=2, not_in_creative_inventory=1}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + + can_dig = can_dig, + + aallow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, +}) + +-- +-- ABM +-- + +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end + +minetest.register_abm({ + nodenames = {"default:furnace", "default:furnace_active"}, + interval = 1.0, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + -- + -- Inizialize metadata + -- + local meta = minetest.get_meta(pos) + local fuel_time = meta:get_float("fuel_time") or 0 + local src_time = meta:get_float("src_time") or 0 + local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 + + -- + -- Inizialize inventory + -- + local inv = meta:get_inventory() + for listname, size in pairs({ + src = 1, + fuel = 1, + dst = 4, + }) do + if inv:get_size(listname) ~= size then + inv:set_size(listname, size) + end + end + local srclist = inv:get_list("src") + local fuellist = inv:get_list("fuel") + local dstlist = inv:get_list("dst") + + -- + -- Cooking + -- + + -- Check if we have cookable content + local cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + local cookable = true + + if cooked.time == 0 then + cookable = false + end + + -- Check if we have enough fuel to burn + if fuel_time < fuel_totaltime then + -- The furnace is currently active and has enough fuel + fuel_time = fuel_time + 1 + + -- If there is a cookable item then check if it is ready yet + if cookable then + src_time = src_time + 1 + if src_time >= cooked.time then + -- Place result in dst list if possible + if inv:room_for_item("dst", cooked.item) then + inv:add_item("dst", cooked.item) + inv:set_stack("src", 1, aftercooked.items[1]) + src_time = 0 + end + end + end + else + -- Furnace ran out of fuel + if cookable then + -- We need to get new fuel + local fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + + if fuel.time == 0 then + -- No valid fuel in fuel list + fuel_totaltime = 0 + fuel_time = 0 + src_time = 0 + else + -- Take fuel from fuel list + inv:set_stack("fuel", 1, afterfuel.items[1]) + + fuel_totaltime = fuel.time + fuel_time = 0 + + end + else + -- We don't need to get new fuel since there is no cookable item + fuel_totaltime = 0 + fuel_time = 0 + src_time = 0 + end + end + + -- + -- Update formspec, infotext and node + -- + local formspec = inactive_formspec + local item_state = "" + local item_percent = 0 + if cookable then + item_percent = math.floor(src_time / cooked.time * 100) + item_state = item_percent .. "%" + else + if srclist[1]:is_empty() then + item_state = "Empty" + else + item_state = "Not cookable" + end + end + + local fuel_state = "Empty" + local active = "inactive " + if fuel_time <= fuel_totaltime and fuel_totaltime ~= 0 then + active = "active " + local fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) + fuel_state = fuel_percent .. "%" + formspec = active_formspec(fuel_percent, item_percent) + swap_node(pos, "default:furnace_active") + else + if not fuellist[1]:is_empty() then + fuel_state = "0%" + end + swap_node(pos, "default:furnace") + end + + local infotext = "Furnace " .. active .. "(Item: " .. item_state .. "; Fuel: " .. fuel_state .. ")" + + -- + -- Set meta values + -- + meta:set_float("fuel_totaltime", fuel_totaltime) + meta:set_float("fuel_time", fuel_time) + meta:set_float("src_time", src_time) + meta:set_string("formspec", formspec) + meta:set_string("infotext", infotext) + end, +}) diff --git a/mods/default/init.lua b/mods/default/init.lua index 7c3d077d..276af543 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -38,6 +38,7 @@ default.gui_suvival_form = "size[8,8.5]".. -- Load files dofile(minetest.get_modpath("default").."/functions.lua") dofile(minetest.get_modpath("default").."/nodes.lua") +dofile(minetest.get_modpath("default").."/furnace.lua") dofile(minetest.get_modpath("default").."/tools.lua") dofile(minetest.get_modpath("default").."/craftitems.lua") dofile(minetest.get_modpath("default").."/crafting.lua") diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 47626e8a..3c7d4f13 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -868,335 +868,6 @@ minetest.register_node("default:chest_locked", { end, }) -function default.furnace_active(pos, percent, item_percent) - local formspec = - "size[8,8.5]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[current_name;src;2.75,0.5;1,1;]".. - "list[current_name;fuel;2.75,2.5;1,1;]".. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. - (100-percent)..":default_furnace_fire_fg.png]".. - "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[lowpart:".. - (item_percent*100)..":gui_furnace_arrow_fg.png^[transformR270]".. - "list[current_name;dst;4.75,0.96;2,2;]".. - "list[current_player;main;0,4.25;8,1;]".. - "list[current_player;main;0,5.5;8,3;8]".. - default.get_hotbar_bg(0,4.25) - return formspec - end - -function default.get_furnace_active_formspec(pos, percent) - local meta = minetest.get_meta(pos)local inv = meta:get_inventory() - local srclist = inv:get_list("src") - local cooked = nil - local aftercooked = nil - if srclist then - cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) - end - local item_percent = 0 - if cooked then - item_percent = meta:get_float("src_time")/cooked.time - end - - return default.furnace_active(pos, percent, item_percent) -end - -default.furnace_inactive_formspec = - "size[8,8.5]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[current_name;src;2.75,0.5;1,1;]".. - "list[current_name;fuel;2.75,2.5;1,1;]".. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. - "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. - "list[current_name;dst;4.75,0.96;2,2;]".. - "list[current_player;main;0,4.25;8,1;]".. - "list[current_player;main;0,5.5;8,3;8]".. - default.get_hotbar_bg(0,4.25) - -minetest.register_node("default:furnace", { - description = "Furnace", - tiles = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png", - "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"}, - paramtype2 = "facedir", - groups = {cracky=2}, - legacy_facedir_simple = true, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", default.furnace_inactive_formspec) - meta:set_string("infotext", "Furnace") - local inv = meta:get_inventory() - inv:set_size("fuel", 1) - inv:set_size("src", 1) - inv:set_size("dst", 4) - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - if not inv:is_empty("fuel") then - return false - elseif not inv:is_empty("dst") then - return false - elseif not inv:is_empty("src") then - return false - end - return true - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if listname == "fuel" then - if minetest.get_craft_result({method="fuel",width=1,items={stack}}).time ~= 0 then - if inv:is_empty("src") then - meta:set_string("infotext","Furnace is empty") - end - return stack:get_count() - else - return 0 - end - elseif listname == "src" then - return stack:get_count() - elseif listname == "dst" then - return 0 - end - end, - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local stack = inv:get_stack(from_list, from_index) - if to_list == "fuel" then - if minetest.get_craft_result({method="fuel",width=1,items={stack}}).time ~= 0 then - if inv:is_empty("src") then - meta:set_string("infotext","Furnace is empty") - end - return count - else - return 0 - end - elseif to_list == "src" then - return count - elseif to_list == "dst" then - return 0 - end - end, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - return stack:get_count() - end, -}) - -minetest.register_node("default:furnace_active", { - description = "Furnace", - tiles = { - "default_furnace_top.png", - "default_furnace_bottom.png", - "default_furnace_side.png", - "default_furnace_side.png", - "default_furnace_side.png", - { - image = "default_furnace_front_active.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 1.5 - }, - } - }, - paramtype2 = "facedir", - light_source = 8, - drop = "default:furnace", - groups = {cracky=2, not_in_creative_inventory=1}, - legacy_facedir_simple = true, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", default.furnace_inactive_formspec) - meta:set_string("infotext", "Furnace"); - local inv = meta:get_inventory() - inv:set_size("fuel", 1) - inv:set_size("src", 1) - inv:set_size("dst", 4) - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - if not inv:is_empty("fuel") then - return false - elseif not inv:is_empty("dst") then - return false - elseif not inv:is_empty("src") then - return false - end - return true - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if listname == "fuel" then - if minetest.get_craft_result({method="fuel",width=1,items={stack}}).time ~= 0 then - if inv:is_empty("src") then - meta:set_string("infotext","Furnace is empty") - end - return stack:get_count() - else - return 0 - end - elseif listname == "src" then - return stack:get_count() - elseif listname == "dst" then - return 0 - end - end, - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local stack = inv:get_stack(from_list, from_index) - if to_list == "fuel" then - if minetest.get_craft_result({method="fuel",width=1,items={stack}}).time ~= 0 then - if inv:is_empty("src") then - meta:set_string("infotext","Furnace is empty") - end - return count - else - return 0 - end - elseif to_list == "src" then - return count - elseif to_list == "dst" then - return 0 - end - end, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - return stack:get_count() - end, -}) - -local function swap_node(pos,name) - local node = minetest.get_node(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos,node) -end - -minetest.register_abm({ - nodenames = {"default:furnace","default:furnace_active"}, - interval = 1.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local meta = minetest.get_meta(pos) - for i, name in ipairs({ - "fuel_totaltime", - "fuel_time", - "src_totaltime", - "src_time" - }) do - if meta:get_string(name) == "" then - meta:set_float(name, 0.0) - end - end - - local inv = meta:get_inventory() - - local srclist = inv:get_list("src") - local cooked = nil - local aftercooked - - if srclist then - cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) - end - - local was_active = false - - if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then - was_active = true - meta:set_float("fuel_time", meta:get_float("fuel_time") + 1) - meta:set_float("src_time", meta:get_float("src_time") + 1) - if cooked and cooked.item and meta:get_float("src_time") >= cooked.time then - -- check if there's room for output in "dst" list - if inv:room_for_item("dst",cooked.item) then - -- Put result in "dst" list - inv:add_item("dst", cooked.item) - -- take stuff from "src" list - inv:set_stack("src", 1, aftercooked.items[1]) - else - --print("Could not insert '"..cooked.item:to_string().."'") - end - meta:set_string("src_time", 0) - end - end - - if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then - local percent = math.floor(meta:get_float("fuel_time") / - meta:get_float("fuel_totaltime") * 100) - meta:set_string("infotext","Furnace active: "..percent.."%") - swap_node(pos,"default:furnace_active") - meta:set_string("formspec",default.get_furnace_active_formspec(pos, percent)) - return - end - - local fuel = nil - local afterfuel - local cooked = nil - local fuellist = inv:get_list("fuel") - local srclist = inv:get_list("src") - - if srclist then - cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) - end - if fuellist then - fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) - end - - if not fuel or fuel.time <= 0 then - meta:set_string("infotext","Furnace out of fuel") - swap_node(pos,"default:furnace") - meta:set_string("formspec", default.furnace_inactive_formspec) - return - end - - if cooked.item:is_empty() then - if was_active then - meta:set_string("infotext","Furnace is empty") - swap_node(pos,"default:furnace") - meta:set_string("formspec", default.furnace_inactive_formspec) - end - return - end - - meta:set_string("fuel_totaltime", fuel.time) - meta:set_string("fuel_time", 0) - - inv:set_stack("fuel", 1, afterfuel.items[1]) - end, -}) - minetest.register_node("default:cobble", { description = "Cobblestone", tiles = {"default_cobble.png"}, From 2ebd6b38399616ad23711ac2ae594289633d1506 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sun, 7 Dec 2014 01:00:33 +0100 Subject: [PATCH 0064/2261] Correct node definitons for pine saplings and pine needles --- mods/default/nodes.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 3c7d4f13..b0f7287b 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1155,7 +1155,8 @@ minetest.register_node("default:pine_needles",{ tiles = {"default_pine_needles.png"}, waving = 1, paramtype = "light", - groups = {snappy=3,leafdecay=3,leaves=1}, + is_ground_content = false, + groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, drop = { max_items = 1, items = { @@ -1184,8 +1185,13 @@ minetest.register_node("default:pine_sapling", { wield_image = "default_pine_sapling.png", paramtype = "light", walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, - sounds = default.node_sound_defaults(), + sounds = default.node_sound_leaves_defaults(), }) minetest.register_node("default:pinetree", { From b0fb180e4db2c311b2626face0e5635bb2a1d820 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sat, 6 Dec 2014 11:28:24 +0100 Subject: [PATCH 0065/2261] Use an overlay over default_dirt.png for soil --- mods/farming/nodes.lua | 4 ++-- mods/farming/textures/farming_soil.png | Bin 713 -> 835 bytes mods/farming/textures/farming_soil_wet.png | Bin 659 -> 831 bytes mods/farming/textures/farming_soil_wet_side.png | Bin 721 -> 109 bytes 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/farming/nodes.lua b/mods/farming/nodes.lua index 10c4afe9..a99f5051 100644 --- a/mods/farming/nodes.lua +++ b/mods/farming/nodes.lua @@ -18,7 +18,7 @@ minetest.override_item("default:dirt_with_grass", { minetest.register_node("farming:soil", { description = "Soil", - tiles = {"farming_soil.png", "default_dirt.png"}, + tiles = {"default_dirt.png^farming_soil.png", "default_dirt.png"}, drop = "default:dirt", is_ground_content = true, groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1, field = 1}, @@ -32,7 +32,7 @@ minetest.register_node("farming:soil", { minetest.register_node("farming:soil_wet", { description = "Wet Soil", - tiles = {"farming_soil_wet.png", "farming_soil_wet_side.png"}, + tiles = {"default_dirt.png^farming_soil_wet.png", "default_dirt.png^farming_soil_wet_side.png"}, drop = "default:dirt", is_ground_content = true, groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1, grassland = 1, field = 1}, diff --git a/mods/farming/textures/farming_soil.png b/mods/farming/textures/farming_soil.png index 0be94e3c9ef086f529907a178160f139f619fdba..6a59fca5bfc840496873bc9e5d3f54f4c420265b 100644 GIT binary patch delta 813 zcmV+|1JeA-1;YlABYyw{b3#c}2nYxWd$^fuN5`W^8$>E&C|C->}W2B;$ zZG7GsdDGNIEF~m2;~9jLrdD%`Yub9rXg;^KQs{L1vs$Cqo+YxZ^Nf@l zZ;;l0A0*$M*?;ig=?+KLup5Gb;V#%nHGLL_QBym+xt!L6K0L>SnKe^kWwZo3{y1o* z`CNALXKfU?uJ9YJiO6Jtqem9eVW7NYqvGdNQ`0bw#!=m_EbEA4b2yWWckZ@O_A>in zKLVfR(Ru&W=F+4;7>iDK;2XN$cZ=ex6CVnRmpD)PwYr$WMOLoErl=!D zgJ%VwQh%VMicZnkNN=Bh`ax$fDD3S8?X5Mhf{Zzy%6R;+)*aeeOZugS&QHG{e66yb zTKCUbrqQ}}r~U<#y!QIpXScPDB_YeMNKBaqh7iupz2K&$ zbGBuo(T**)=}rWE_38^N?~O*$ac#rPM9lKT&wuxVtCa%Yl`*ECo9q2j3%@;@#VbqY z(&j?ZE-@%}Zyz+)szv>`TEEAROje&PLR+$MBb?$RZZtgymmZFAoeEA14lZcAabh@5 zYPl@dbln*C2FXsr#v5{mc00z$)L~yKxlUBcQnE~1N+jA5!rlXKJg&vJoL>v@?c;Cw6dT$+-s0&;7MKtNW7G1y>jp6ey!)04RkADTwO!**mlmK>_AMffJ zw32S@s}bxMLL5{luuk@4SjNW=Lo?>YRXfL<^a$6<62VGv9;J{2iZqL)(}FGwp&WH0 zw>Zn=up-l002+bVq76B!%XqBNaV!2g2p;Pc+~x^LmPxSCJmo3=>@iQmZJ9vUYvb>6 zBCiv<8gamJ?|%+N!ic5`2sZ`eh-9ak2lnpoSetx~*8G+5!=&baUaRz|d(d zVPxI}@626_X=HqMEICXNx-5vI--c3f4z-jAjg*AOvV>+@LdIprX+uGa&hmacm}JAz zRsw0a1%qN3k4SXk`C1g8v;z8y7dr_zUR4t~uO%@ohJWz=a0B1=SMmEz16SPw+C=)H z&7hI`XPYwKlKsNb>Jqe!4^3Ibc1pzKvKt6HJb6;B#jT=Yv=C5sek2GzI=52$c6=0e`9|AHL}r-j?iaU`hGMy|Ti8M5v+ z8$>tSIDfv#(B#%mPGBhJAB=-zB%pk2D!Y&sty~9c*?x^OO{^m z6?xucv`qglcJSx4hO15<-Lx0S>oga=0_w7puPZPS@hu$CoO~Uq7?owb*oZ;5|8hsc Ye<~lj&|Ie+Bme*a07*qoM6N<$f&qR`-v9sr diff --git a/mods/farming/textures/farming_soil_wet.png b/mods/farming/textures/farming_soil_wet.png index d5e335ef30558faafda5da5df2541be28abb7bff..7e24c70458e5b3d14080b945cf0f68cd0bbc57ec 100644 GIT binary patch delta 809 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 From 608e51f16d7c7df02a96c9d899f60bbaa98d75d8 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Sat, 8 Jun 2013 18:08:48 +0200 Subject: [PATCH 0066/2261] Add obsidianbrick use Zeg9`s texture --- mods/default/crafting.lua | 8 ++++++++ mods/default/nodes.lua | 11 +++++++++-- mods/default/textures/default_obsidian_brick.png | Bin 0 -> 418 bytes 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 mods/default/textures/default_obsidian_brick.png diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index 448e3e93..ce97337b 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -580,6 +580,14 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = 'default:obsidianbrick', + recipe = { + {'default:obsidian', 'default:obsidian'}, + {'default:obsidian', 'default:obsidian'} + } +}) + minetest.register_craft({ output = 'default:stonebrick 4', recipe = { diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index b0f7287b..5bbe79d2 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -64,7 +64,7 @@ minetest.register_node("default:stone_with_gold", { drop = "default:gold_lump", sounds = default.node_sound_stone_defaults(), }) - + minetest.register_node("default:stone_with_diamond", { description = "Diamond Ore", tiles = {"default_stone.png^default_mineral_diamond.png"}, @@ -733,7 +733,7 @@ minetest.register_node("default:sign_wall", { end, }) -default.chest_formspec = +default.chest_formspec = "size[8,9]".. default.gui_bg.. default.gui_bg_img.. @@ -968,6 +968,13 @@ minetest.register_node("default:obsidian", { groups = {cracky=1,level=2}, }) +minetest.register_node("default:obsidianbrick", { + description = "Obsidian Brick", + tiles = {"default_obsidian_brick.png"}, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=1,level=2}, +}) + minetest.register_node("default:nyancat", { description = "Nyan Cat", tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png", diff --git a/mods/default/textures/default_obsidian_brick.png b/mods/default/textures/default_obsidian_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..2d938afa0bfc5d6f8aecdb98e50a2387b882a4aa GIT binary patch literal 418 zcmV;T0bTxyP)b3v?0WV2J zK~y-)rIJre!$1(lf7@(K1^b5xK}|_0J*1x@(9i9~o8ZBNcoL-tG1P-%gs~pPCai~& zHLW%+`e0#rGy7(C=czc34S?1ffTAea6E(pFGbgoGy#f0nbN75D`kJV^787 z`QZ6DZW|THu@RBRPQ73VfIQ!?@FIfVWz_YHb+op1-3Hy%wG!$016uAr@-(&6^nxKG z*Qn8GWb!=cFAx!w>m3+lO3KBDO*n4*d&Ir2jf>AW8&~!Efdi~s-t literal 0 HcmV?d00001 From c332081e81a676706c381844f9906c1d88697944 Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Tue, 4 Nov 2014 16:19:27 -0500 Subject: [PATCH 0067/2261] Add white to the crack texture This makes the crack stand out better on dark textures, like obsidian and black wool. --- mods/default/textures/crack_anylength.png | Bin 252 -> 583 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/textures/crack_anylength.png b/mods/default/textures/crack_anylength.png index 2788dc1da00d0859f7cb5bb4e35bc438d759ce9e..d07d65ee7bf76c8e950ca8138261c49b81ae82bd 100644 GIT binary patch delta 569 zcmV-90>=IP0mlT88Gi-<000oH^$h?300v@9M??Ss00000`9r&Z00009a7bBm000XU z000XU0RWnu7ytkP=Sf6CR9M69moaX`FbqY-Ab>~u81C3R2*~WQIYMrr0O`O2IYNM5 zAVYeXjOj6=6R?X_u(D)HR?;QW7CWRUivN*T>bd@JF>_aH(0?N$Gjs2Zo2J=k86zS~ zC#%)!GkfQzY4*(Ai3qycXPxCB7E!g6XB|GQ@+jxOi@QbO6e*u+tq+6Hx>6qW!YL(> z=XN*7oDh+PVRDg^u#3PLb1FLft$9E-PRJSFB$8?>J=cu8FO~JE8nxDkVq;%WId{J( zrBpT#oRp0*Cx6KUC+(0En&N>^sF4%7gQHM_2NV>{kbRlRzGjG;&4WLNQ%<7Sc)ea< z0N^_nWmX+nYXJb(0I+@luu!T?`_C5M%VTXX_~k*UABMX2=o;nSGxJ#*1Hjr^3)yu5 z0IyODh`5XKfJ%5U%8^H#KE?xYX9|urPQo&R2t+6bQGc2=hhE2nU?qmmwApOF5OKHNZr?m7<5pk7120GAJn-s(f;^C)JTV?fHU|5^aPBk@ zLX_27A2Q?_iyBQRK{A0;Q`%&yM#x;Qci&0zr?0j4L;n5&G?`qN^$zdD00000NkvXX Hu0mjf$8!In delta 235 zcmX@k@`rJPWIZzj1A}@gt38n73GfMV1=4U}`qF$Fki%ROFaQ7m From 75dfcdb1e7f841258fb9c785459856a17d8f7065 Mon Sep 17 00:00:00 2001 From: Calinou Date: Sun, 30 Nov 2014 09:05:10 +0100 Subject: [PATCH 0068/2261] Add 3D signs --- mods/default/nodes.lua | 12 ++++++------ mods/default/textures/default_sign.png | Bin 0 -> 699 bytes 2 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 mods/default/textures/default_sign.png diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 5bbe79d2..31d8aa6e 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -694,8 +694,8 @@ minetest.register_node("default:torch", { minetest.register_node("default:sign_wall", { description = "Sign", - drawtype = "signlike", - tiles = {"default_sign_wall.png"}, + drawtype = "nodebox", + tiles = {"default_sign.png"}, inventory_image = "default_sign_wall.png", wield_image = "default_sign_wall.png", paramtype = "light", @@ -703,11 +703,11 @@ minetest.register_node("default:sign_wall", { sunlight_propagates = true, is_ground_content = false, walkable = false, - selection_box = { + node_box = { type = "wallmounted", - --wall_top = - --wall_bottom = - --wall_side = + wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, + wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, + wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, }, groups = {choppy=2,dig_immediate=2,attached_node=1}, legacy_wallmounted = true, diff --git a/mods/default/textures/default_sign.png b/mods/default/textures/default_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..be5e916a0b41bc7dc68aa2b31a649322d567ced9 GIT binary patch literal 699 zcmV;s0!00ZP)1Jko@aZ0eLMIg2qe(=+dI^RE0cAU#8b`*;kV!3&G)&gDDkGOi zI5RPUR5kFc4Rj9t&=qWAqij>DXxO$) zdwYObr^ISnW1}Wf6JE}qZYI5AGW+TU05X74O46o++9q-J(KKG4%K3AHOg@-my&|}H zbBtTlqdc6w!&*MX=WHVYN^k(_+uLiRBOGOB`U&2Ej3~=wH*Eavtu(n7Z5?$2Ev=DJ0pSmoLL^Q{Cuu`$%>by5XE_P2*@UBOXQx>^iE{u(`p6^_UJ^hS>25f-k{ ziAMYwr6d3zqm;zgInK{wouU3PODk2XPMy+PjRwa;$(S@ZYPgokZ(ZiQCU7O4d)q8{ z03=M_eR#PG&5paG#xY7s6g9pJ5kN3 Date: Thu, 4 Dec 2014 03:47:46 +0000 Subject: [PATCH 0069/2261] Pinetree (by sfan5, from mg mapgen) lua generation and sapling ABM. Add checks for ignore to other trees --- mods/default/nodes.lua | 2 +- mods/default/trees.lua | 201 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 182 insertions(+), 21 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 31d8aa6e..90b6dbd7 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -114,7 +114,7 @@ minetest.register_node("default:dirt_with_snow", { description = "Dirt with Snow", tiles = {"default_snow.png", "default_dirt.png", "default_dirt.png^default_snow_side.png"}, is_ground_content = true, - groups = {crumbly=3}, + groups = {crumbly=3,soil=1}, drop = 'default:dirt', sounds = default.node_sound_dirt_defaults({ footstep = {name="default_snow_footstep", gain=0.25}, diff --git a/mods/default/trees.lua b/mods/default/trees.lua index 5752fe0d..f2baaf85 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -17,6 +17,8 @@ local function can_grow(pos) return true end +-- Sapling ABMs + minetest.register_abm({ nodenames = {"default:sapling"}, interval = 10, @@ -26,14 +28,15 @@ minetest.register_abm({ return end - minetest.log("action", "A sapling grows into a tree at "..minetest.pos_to_string(pos)) + minetest.log("action", "A sapling grows into a tree at ".. + minetest.pos_to_string(pos)) default.grow_tree(pos, random(1, 4) == 1) end }) minetest.register_abm({ nodenames = {"default:junglesapling"}, - interval = 10, + interval = 11, chance = 50, action = function(pos, node) if not can_grow(pos) then @@ -46,18 +49,36 @@ minetest.register_abm({ end }) +minetest.register_abm({ + nodenames = {"default:pine_sapling"}, + interval = 12, + chance = 50, + action = function(pos, node) + if not can_grow(pos) then + return + end -local c_air = minetest.get_content_id("air") -local c_apple = minetest.get_content_id("default:apple") + minetest.log("action", "A pine sapling grows into a tree at ".. + minetest.pos_to_string(pos)) + default.grow_pinetree(pos) + end +}) + +-- Appletree, jungletree function local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid, height, size, iters, is_apple_tree) local x, y, z = pos.x, pos.y, pos.z + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + local c_apple = minetest.get_content_id("default:apple") -- Trunk for y_dist = 0, height - 1 do local vi = a:index(x, y + y_dist, z) - if y_dist == 0 or data[vi] == c_air or data[vi] == leaves_cid then + local node_id = data[vi] + if y_dist == 0 or node_id == c_air or node_id == c_ignore + or node_id == leaves_cid then data[vi] = tree_cid end end @@ -67,7 +88,7 @@ local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid, for y_dist = -size, 1 do local vi = a:index(x - 1, y + height + y_dist, z + z_dist) for x_dist = -1, 1 do - if data[vi] == c_air then + if data[vi] == c_air or data[vi] == c_ignore then if is_apple_tree and random(1, 8) == 1 then data[vi] = c_apple else @@ -89,7 +110,7 @@ local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid, for yi = 0, 1 do for zi = 0, 1 do local vi = a:index(clust_x + xi, clust_y + yi, clust_z + zi) - if data[vi] == c_air then + if data[vi] == c_air or data[vi] == c_ignore then if is_apple_tree and random(1, 8) == 1 then data[vi] = c_apple else @@ -102,9 +123,7 @@ local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid, end end - -local c_tree = minetest.get_content_id("default:tree") -local c_leaves = minetest.get_content_id("default:leaves") +-- Appletree function default.grow_tree(pos, is_apple_tree, bad) --[[ @@ -118,11 +137,13 @@ function default.grow_tree(pos, is_apple_tree, bad) local x, y, z = pos.x, pos.y, pos.z local height = random(4, 5) + local c_tree = minetest.get_content_id("default:tree") + local c_leaves = minetest.get_content_id("default:leaves") local vm = minetest.get_voxel_manip() local minp, maxp = vm:read_from_map( - {x = pos.x - 2, y = pos.y, z = pos.z - 2}, - {x = pos.x + 2, y = pos.y + height + 1, z = pos.z + 2} + {x = pos.x - 2, y = pos.y, z = pos.z - 2}, + {x = pos.x + 2, y = pos.y + height + 1, z = pos.z + 2} ) local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) local data = vm:get_data() @@ -134,12 +155,11 @@ function default.grow_tree(pos, is_apple_tree, bad) vm:update_map() end -local c_jungletree = minetest.get_content_id("default:jungletree") -local c_jungleleaves = minetest.get_content_id("default:jungleleaves") +-- Jungletree function default.grow_jungletree(pos, bad) --[[ - NOTE: Tree-placing code is currently duplicated in the engine + NOTE: Jungletree-placing code is currently duplicated in the engine and in games that have saplings; both are deprecated but not replaced yet --]] @@ -149,11 +169,16 @@ function default.grow_jungletree(pos, bad) local x, y, z = pos.x, pos.y, pos.z local height = random(8, 12) + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + local c_jungletree = minetest.get_content_id("default:jungletree") + local c_jungleleaves = minetest.get_content_id("default:jungleleaves") local vm = minetest.get_voxel_manip() local minp, maxp = vm:read_from_map( - {x = pos.x - 3, y = pos.y - 1, z = pos.z - 3}, - {x = pos.x + 3, y = pos.y + height + 1, z = pos.z + 3}) + {x = pos.x - 3, y = pos.y - 1, z = pos.z - 3}, + {x = pos.x + 3, y = pos.y + height + 1, z = pos.z + 3} + ) local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) local data = vm:get_data() @@ -162,12 +187,12 @@ function default.grow_jungletree(pos, bad) -- Roots for z_dist = -1, 1 do local vi_1 = a:index(x - 1, y - 1, z + z_dist) - local vi_2 = a:index(x - 1, y, z + z_dist) + local vi_2 = a:index(x - 1, y, z + z_dist) for x_dist = -1, 1 do if random(1, 3) >= 2 then - if data[vi_1] == c_air then + if data[vi_1] == c_air or data[vi_1] == c_ignore then data[vi_1] = c_jungletree - elseif data[vi_2] == c_air then + elseif data[vi_2] == c_air or data[vi_2] == c_ignore then data[vi_2] = c_jungletree end end @@ -181,3 +206,139 @@ function default.grow_jungletree(pos, bad) vm:update_map() end +-- Pinetree from mg mapgen mod, design by sfan5, pointy top added by paramat + +local function add_pine_needles(data, vi, c_air, c_ignore, c_snow, c_pine_needles) + if data[vi] == c_air or data[vi] == c_ignore or data[vi] == c_snow then + data[vi] = c_pine_needles + end +end + +local function add_snow(data, vi, c_air, c_ignore, c_snow) + if data[vi] == c_air or data[vi] == c_ignore then + data[vi] = c_snow + end +end + +function default.grow_pinetree(pos) + local x, y, z = pos.x, pos.y, pos.z + local maxy = y + random(9, 13) -- Trunk top + + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + local c_pinetree = minetest.get_content_id("default:pinetree") + local c_pine_needles = minetest.get_content_id("default:pine_needles") + local c_snow = minetest.get_content_id("default:snow") + local c_snowblock = minetest.get_content_id("default:snowblock") + local c_dirtsnow = minetest.get_content_id("default:dirt_with_snow") + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - 3, y = y - 1, z = z - 3}, + {x = x + 3, y = maxy + 3, z = z + 3} + ) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + -- Scan for snow nodes near sapling + local snow = false + for yy = y - 1, y + 1 do + for zz = z - 1, z + 1 do + local vi = a:index(x - 1, yy, zz) + for xx = x - 1, x + 1 do + local nodid = data[vi] + if nodid == c_snow + or nodid == c_snowblock + or nodid == c_dirtsnow then + snow = true + end + vi = vi + 1 + end + end + end + + -- Upper branches layer + local dev = 3 + for yy = maxy - 1, maxy + 1 do + for zz = z - dev, z + dev do + local vi = a:index(x - dev, yy, zz) + local via = a:index(x - dev, yy + 1, zz) + for xx = x - dev, x + dev do + if random() < 0.95 - dev * 0.05 then + add_pine_needles(data, vi, c_air, c_ignore, c_snow, + c_pine_needles) + if snow then + add_snow(data, via, c_air, c_ignore, c_snow) + end + end + vi = vi + 1 + via = via + 1 + end + end + dev = dev - 1 + end + + -- Centre top nodes + add_pine_needles(data, a:index(x, maxy + 1, z), c_air, c_ignore, c_snow, + c_pine_needles) + add_pine_needles(data, a:index(x, maxy + 2, z), c_air, c_ignore, c_snow, + c_pine_needles) -- Paramat added a pointy top node + if snow then + add_snow(data, a:index(x, maxy + 3, z), c_air, c_ignore, c_snow) + end + + -- Lower branches layer + local my = 0 + for i = 1, 20 do -- Random 2x2 squares of needles + local xi = x + random(-3, 2) + local yy = maxy + random(-6, -5) + local zi = z + random(-3, 2) + if yy > my then + my = yy + end + for zz = zi, zi+1 do + local vi = a:index(xi, yy, zz) + local via = a:index(xi, yy + 1, zz) + for xx = xi, xi + 1 do + add_pine_needles(data, vi, c_air, c_ignore, c_snow, + c_pine_needles) + if snow then + add_snow(data, via, c_air, c_ignore, c_snow) + end + vi = vi + 1 + via = via + 1 + end + end + end + + local dev = 2 + for yy = my + 1, my + 2 do + for zz = z - dev, z + dev do + local vi = a:index(x - dev, yy, zz) + local via = a:index(x - dev, yy + 1, zz) + for xx = x - dev, x + dev do + if random() < 0.95 - dev * 0.05 then + add_pine_needles(data, vi, c_air, c_ignore, c_snow, + c_pine_needles) + if snow then + add_snow(data, via, c_air, c_ignore, c_snow) + end + end + vi = vi + 1 + via = via + 1 + end + end + dev = dev - 1 + end + + -- Trunk + for yy = y, maxy do + local vi = a:index(x, yy, z) + data[vi] = c_pinetree + end + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + From bd24c15db4a3c7cdec24f1980ad3079c8d29b5be Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Sat, 6 Sep 2014 21:07:57 +0100 Subject: [PATCH 0070/2261] Screwdriver rewrite --- mods/screwdriver/init.lua | 135 +++++----------------- mods/screwdriver/textures/screwdriver.png | Bin 769 -> 286 bytes mods/screwdriver/textures/tool_mode1.png | Bin 211 -> 0 bytes mods/screwdriver/textures/tool_mode2.png | Bin 360 -> 0 bytes mods/screwdriver/textures/tool_mode3.png | Bin 367 -> 0 bytes mods/screwdriver/textures/tool_mode4.png | Bin 268 -> 0 bytes 6 files changed, 29 insertions(+), 106 deletions(-) delete mode 100644 mods/screwdriver/textures/tool_mode1.png delete mode 100644 mods/screwdriver/textures/tool_mode2.png delete mode 100644 mods/screwdriver/textures/tool_mode3.png delete mode 100644 mods/screwdriver/textures/tool_mode4.png diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 6e560388..59c00443 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -1,52 +1,3 @@ - -local mode_text = { - {"Change rotation, Don't change axisdir."}, - {"Keep choosen face in front then rotate it."}, - {"Change axis dir, Reset rotation."}, - {"Bring top in front then rotate it."}, -} - -local opposite_faces = { - [0] = 5, - [1] = 2, - [2] = 1, - [3] = 4, - [4] = 3, - [5] = 0, -} - -local function screwdriver_setmode(user,itemstack) - local player_name = user:get_player_name() - local item = itemstack:to_table() - local mode = tonumber(itemstack:get_metadata()) - if not mode then - minetest.chat_send_player(player_name, "Use while sneaking to change screwdriwer modes.") - mode = 0 - end - mode = mode + 1 - if mode == 5 then - mode = 1 - end - minetest.chat_send_player(player_name, "Screwdriver mode : "..mode.." - "..mode_text[mode][1] ) - itemstack:set_name("screwdriver:screwdriver"..mode) - itemstack:set_metadata(mode) - return itemstack -end - -local function get_node_face(pointed_thing) - local ax, ay, az = pointed_thing.above.x, pointed_thing.above.y, pointed_thing.above.z - local ux, uy, uz = pointed_thing.under.x, pointed_thing.under.y, pointed_thing.under.z - if ay > uy then return 0 -- Top - elseif az > uz then return 1 -- Z+ side - elseif az < uz then return 2 -- Z- side - elseif ax > ux then return 3 -- X+ side - elseif ax < ux then return 4 -- X- side - elseif ay < uy then return 5 -- Bottom - else - error("pointed_thing.above and under are the same!") - end -end - local function nextrange(x, max) x = x + 1 if x > max then @@ -55,21 +6,21 @@ local function nextrange(x, max) return x end -local function screwdriver_handler(itemstack, user, pointed_thing) +-- Handles rotation +local function screwdriver_handler(itemstack, user, pointed_thing, mode) if pointed_thing.type ~= "node" then return end + local pos = pointed_thing.under local keys = user:get_player_control() local player_name = user:get_player_name() - local mode = tonumber(itemstack:get_metadata()) - if not mode or keys["sneak"] == true then - return screwdriver_setmode(user, itemstack) - end + if minetest.is_protected(pos, user:get_player_name()) then minetest.record_protection_violation(pos, user:get_player_name()) return end + local node = minetest.get_node(pos) local ndef = minetest.registered_nodes[node.name] if not ndef or not ndef.paramtype2 == "facedir" or @@ -78,47 +29,22 @@ local function screwdriver_handler(itemstack, user, pointed_thing) node.param2 == nil then return end - -- Get ready to set the param2 + + -- Set param2 local n = node.param2 local axisdir = math.floor(n / 4) local rotation = n - axisdir * 4 if mode == 1 then n = axisdir * 4 + nextrange(rotation, 3) - elseif mode == 2 then - -- If you are pointing at the axisdir face or the - -- opposite one then you can just rotate the node. - -- Otherwise change the axisdir, avoiding the facing - -- and opposite axes. - local face = get_node_face(pointed_thing) - if axisdir == face or axisdir == opposite_faces[face] then - n = axisdir * 4 + nextrange(rotation, 3) - else - axisdir = nextrange(axisdir, 5) - -- This is repeated because switching from the face - -- can move to to the opposite and vice-versa - if axisdir == face or axisdir == opposite_faces[face] then - axisdir = nextrange(axisdir, 5) - end - if axisdir == face or axisdir == opposite_faces[face] then - axisdir = nextrange(axisdir, 5) - end - n = axisdir * 4 - end elseif mode == 3 then n = nextrange(axisdir, 5) * 4 - elseif mode == 4 then - local face = get_node_face(pointed_thing) - if axisdir == face then - n = axisdir * 4 + nextrange(rotation, 3) - else - n = face * 4 - end end - --print (dump(axisdir..", "..rotation)) + node.param2 = n minetest.swap_node(pos, node) + local item_wear = tonumber(itemstack:get_wear()) - item_wear = item_wear + 327 + item_wear = item_wear + 300 -- was 327 if item_wear > 65535 then itemstack:clear() return itemstack @@ -127,6 +53,21 @@ local function screwdriver_handler(itemstack, user, pointed_thing) return itemstack end +-- Screwdriver +minetest.register_tool("screwdriver:screwdriver", { + description = "Screwdriver (left-click rotates face, right-click rotates axis)", + inventory_image = "screwdriver.png", + on_use = function(itemstack, user, pointed_thing) + screwdriver_handler(itemstack, user, pointed_thing, 1) + return itemstack + end, + on_place = function(itemstack, user, pointed_thing) + screwdriver_handler(itemstack, user, pointed_thing, 3) + return itemstack + end, +}) + + minetest.register_craft({ output = "screwdriver:screwdriver", recipe = { @@ -135,25 +76,7 @@ minetest.register_craft({ } }) -minetest.register_tool("screwdriver:screwdriver", { - description = "Screwdriver", - inventory_image = "screwdriver.png", - on_use = function(itemstack, user, pointed_thing) - screwdriver_handler(itemstack, user, pointed_thing) - return itemstack - end, -}) - -for i = 1, 4 do - minetest.register_tool("screwdriver:screwdriver"..i, { - description = "Screwdriver in Mode "..i, - inventory_image = "screwdriver.png^tool_mode"..i..".png", - wield_image = "screwdriver.png", - groups = {not_in_creative_inventory=1}, - on_use = function(itemstack, user, pointed_thing) - screwdriver_handler(itemstack, user, pointed_thing) - return itemstack - end, - }) -end - +minetest.register_alias("screwdriver:screwdriver1", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver2", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver3", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver4", "screwdriver:screwdriver") diff --git a/mods/screwdriver/textures/screwdriver.png b/mods/screwdriver/textures/screwdriver.png index 672692a160136e295ba0d97be42734eeedba7fd8..f471756d4239d51092fb9bbe957a78fe6275b639 100644 GIT binary patch delta 270 zcmV+p0rCEU2A%?t8Gi!+002a!ipBr{05ecbR7E%d04^U5J0}uEEfi2S7+5(RT|F6a zOCy6g@ad`<4}qOaK4?0d!JMQvg8b*k%9#0GUZd zK~y-)z0XS$!ypU;P{-g;6Ks0_)0U>wrA1fOR&RtM+9$5WeSc&OL`G)Lj6@4L=e$ag z;|2p9v00#u)z7%lKgT(qKx9NbpdgyL6ZBuvHi8+7VDrOkak4F7^&QPjtRLJfz^Il<3B&V2z21fE0zeP}CR%6$(YICb|-$Z9^?ZBgLqZ z*`@FEyh}`X?%oXxPjYkfy7_+Zob$S7)zpY}6zv^1;dZ;hJ%8L{8G>c_Ioy*Tym)ED z?d~2-xLo`oo#rl#jlYN8;l$LZ&zPN?#|OIuLzZEyRJda!sJS=Z@5N2KX}VW#{MY9L!y}_>AIle?Q)hjbqX?C3S!S<`))m@zP~J z0BP2J{R8;+{eK7M<`-D_;?gpn(s){0TKOObo(!O^y#t+QGfp=(v$05Jp-RDt3&1$98c zd0NPlbPkAg8b@PcGz&MTD^R8rP)v8JPJw14A+&->`yn49H!&DAZ?PgHjP^i5M_>q} zgdkMYz8LC+LZorYxf8*(3xv>zp-d}vLZCNi2yNDxlLgT*@<33l#qyQ6Cx8!8LZB1* zYKF*)l@Xzp{saDjXe?ACIm({_WJRz~^KY>4W@E~T31k4S2)fxb{q76rfiO^LrCwk+ m3+G*#nn0wg0>Ik7+UgHs7&bQZFYFco0000ym)PKLmBfxtsY+6ZC%l!T)|9_W1Yu5Gk3~I4HaKWLW zZsCKsnjh^gJbvxpCB?sr`2}yoG`=2YH(7&M4T0X{Z`inyK|)%p!Ej2yB-7#qk)EbN11`6N8WOCF85oY--BLLF>zZdkS2B3I L`njxgN@xNA4d+$c diff --git a/mods/screwdriver/textures/tool_mode2.png b/mods/screwdriver/textures/tool_mode2.png deleted file mode 100644 index 2043d8f61ba03c0b3d5db84c3f9a109ef79e2a58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 360 zcmV-u0hj)XP)t zc~VdtQ&JmPRvlbg9%Eo3WMUy{W+QEDByVgbac?Dgb|`>;D}#Y6nwK-6oHeGRH>ssK ztEV}+wLQeZPtD0_&dY7m&w195bbds)eUkf@sEj7eb5|BOUw@?ey@`FPX*A+=A-> znq9aVLbEfo0GgX~KY%tq^3Z6Sc@TR1nn3W|_U55h`?n`)h6<)59LB@|00000mPps9(VxtWlK zxsa8mu(g%2t&NDit%!rYsH20Zi?f)Ui@3X+xVNW-pO0ila(1S2VZLf7j zQZ8Spxqh|t#cdaHRIl$x%cnPe{gT{gZoP!K3MVS!AirTAO)b~7)yfuf*Bm1 z-ADs+T0C7GLnI{M9`qDzG7w=o5XNMoblxISBw!B1#S7o<=ZK#;e@Zp9z-norfFA#Z z8IMvkZ~ta$`ucm})s0VsohRfKE2PRFQeQaNL8QNoH^16LXwtTj39gU#Bu_nLDZ zYkotBKnC-Rrn@qEyLKMg{OYt;^X#41Y;)&kd-yDBDo8bu_;Z(k&Q5M!Z%GMI$T4`j L`njxgN@xNAOWBI( diff --git a/mods/screwdriver/textures/tool_mode4.png b/mods/screwdriver/textures/tool_mode4.png deleted file mode 100644 index c925314686682ce106d468632459b9c9213cae30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyQ2{<7u0UE$lwDGSLsf-GU5!Uy zkKfQhz}Qg0+)T*AT*%5&*xE|i-A&xjN7CO{D!^YVu&y#9Og1uHHa=E9B}sAfdh4wl zZMJW+J$f+c*rCuH*Lv>Wn(^TNl1C3#W|?JG15IZv3GxeOaCmkj4aiCGba4!+xb^mo zrBH){fXl@~#*#Z;g{;5+T{pQnp^xWp=KidcPjCB0d}h>O4rbE1X&NJ~*ZaXHFx z!9y7y#=7p_2&P>o*S9fnon_qfRdV4uTYeR0iA2o>hgwhFzyJNNsTP~Rx$nkopj`}} Lu6{1-oD!M Date: Sun, 7 Dec 2014 12:23:43 +0100 Subject: [PATCH 0071/2261] Cleanup * Remove unused variables * Fix wearing out of screwdriver * Move magic numbers into constants * Scale down texture --- mods/screwdriver/init.lua | 23 +++++++++++----------- mods/screwdriver/textures/screwdriver.png | Bin 286 -> 261 bytes 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 59c00443..4aadaa0a 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -6,6 +6,10 @@ local function nextrange(x, max) return x end +local ROTATE_FACE = 1 +local ROTATE_AXIS = 2 +local USES = 10 + -- Handles rotation local function screwdriver_handler(itemstack, user, pointed_thing, mode) if pointed_thing.type ~= "node" then @@ -13,8 +17,6 @@ local function screwdriver_handler(itemstack, user, pointed_thing, mode) end local pos = pointed_thing.under - local keys = user:get_player_control() - local player_name = user:get_player_name() if minetest.is_protected(pos, user:get_player_name()) then minetest.record_protection_violation(pos, user:get_player_name()) @@ -34,22 +36,19 @@ local function screwdriver_handler(itemstack, user, pointed_thing, mode) local n = node.param2 local axisdir = math.floor(n / 4) local rotation = n - axisdir * 4 - if mode == 1 then + if mode == ROTATE_FACE then n = axisdir * 4 + nextrange(rotation, 3) - elseif mode == 3 then + elseif mode == ROTATE_AXIS then n = nextrange(axisdir, 5) * 4 end node.param2 = n minetest.swap_node(pos, node) - local item_wear = tonumber(itemstack:get_wear()) - item_wear = item_wear + 300 -- was 327 - if item_wear > 65535 then - itemstack:clear() - return itemstack + if not minetest.setting_getbool("creative_mode") then + itemstack:add_wear(65535 / (USES - 1)) end - itemstack:set_wear(item_wear) + return itemstack end @@ -58,11 +57,11 @@ minetest.register_tool("screwdriver:screwdriver", { description = "Screwdriver (left-click rotates face, right-click rotates axis)", inventory_image = "screwdriver.png", on_use = function(itemstack, user, pointed_thing) - screwdriver_handler(itemstack, user, pointed_thing, 1) + screwdriver_handler(itemstack, user, pointed_thing, ROTATE_FACE) return itemstack end, on_place = function(itemstack, user, pointed_thing) - screwdriver_handler(itemstack, user, pointed_thing, 3) + screwdriver_handler(itemstack, user, pointed_thing, ROTATE_AXIS) return itemstack end, }) diff --git a/mods/screwdriver/textures/screwdriver.png b/mods/screwdriver/textures/screwdriver.png index f471756d4239d51092fb9bbe957a78fe6275b639..33cb83f71a4fa6a4398a84cfe13e0ac49de28137 100644 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF~bp9zYIffk$L90|U1(2s1Lwnj--eWH0gbb!ETD!_F-x ztg%IMJy6Ke)5S4_<9c#J1LM5S2FLcYX7IF4-M@fmU)>A=cApML#gZ6?Q(C1>Mn0FA v6nK_h30N^9TOy=G)r3Rs2}7!ZAp=7%J6}X<&AshF!x%hW{an^LB{Ts5DT_`# delta 272 zcmZo=n#bhQ8Q|y6%O%Cdz`(%k>ERLtq!mDzgBeJ=Ea^H1q>KZ6LR>8v81&?Mt<{BG zbVUM8B_b?kVr?Z0yp@~7H75E=)K3%b@c}AjED7=pW^j0RBMr!z>FMGaVsU!!d2gY^ z3OvjK#~=6$=T!Z_JZ;(KrLN&u!}41cZ>g_4Qk%l#;+A%<$A#PS`5vzckJ*@IHbyS! zxq5!b1^eTc^BhuKY!)cY+9~`c{-RlvWLLuH!`X$KbQ8YHp7mKHe@FYkx Date: Sun, 7 Dec 2014 21:29:54 +0100 Subject: [PATCH 0072/2261] Only allow rotating nodes that could be dug --- mods/screwdriver/init.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 4aadaa0a..49ea6156 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -32,6 +32,10 @@ local function screwdriver_handler(itemstack, user, pointed_thing, mode) return end + if ndef.can_dig and not ndef.can_dig(pos, user) then + return + end + -- Set param2 local n = node.param2 local axisdir = math.floor(n / 4) From 99cfe73bbf3a47636126f5c981f7d0bac24357bd Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Fri, 12 Dec 2014 17:15:48 +0100 Subject: [PATCH 0073/2261] Give 4 obsidianbrick for 4 obsidian --- mods/default/crafting.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index ce97337b..c8839ec4 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -581,7 +581,7 @@ minetest.register_craft({ }) minetest.register_craft({ - output = 'default:obsidianbrick', + output = 'default:obsidianbrick 4', recipe = { {'default:obsidian', 'default:obsidian'}, {'default:obsidian', 'default:obsidian'} From 854415fd3331d11c7cda3d64d19e67ab53f57706 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sat, 13 Dec 2014 12:52:47 +0100 Subject: [PATCH 0074/2261] Fix typo in furnace.lua --- mods/default/furnace.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua index d49d8efe..2163f6ae 100644 --- a/mods/default/furnace.lua +++ b/mods/default/furnace.lua @@ -133,7 +133,7 @@ minetest.register_node("default:furnace_active", { can_dig = can_dig, - aallow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_move = allow_metadata_inventory_move, allow_metadata_inventory_take = allow_metadata_inventory_take, }) From 1237bc3a4b3c6f435059d669345446fa44768f32 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Mon, 15 Dec 2014 22:12:21 +0100 Subject: [PATCH 0075/2261] Don't override param2 bits that are not used for rotation in screwdriver --- mods/screwdriver/init.lua | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 49ea6156..6e3fe816 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -37,16 +37,18 @@ local function screwdriver_handler(itemstack, user, pointed_thing, mode) end -- Set param2 - local n = node.param2 - local axisdir = math.floor(n / 4) - local rotation = n - axisdir * 4 + local rotationPart = node.param2 % 32 -- get first 4 bits + local preservePart = node.param2 - rotationPart + + local axisdir = math.floor(rotationPart / 4) + local rotation = rotationPart - axisdir * 4 if mode == ROTATE_FACE then - n = axisdir * 4 + nextrange(rotation, 3) + rotationPart = axisdir * 4 + nextrange(rotation, 3) elseif mode == ROTATE_AXIS then - n = nextrange(axisdir, 5) * 4 + rotationPart = nextrange(axisdir, 5) * 4 end - node.param2 = n + node.param2 = preservePart + rotationPart minetest.swap_node(pos, node) if not minetest.setting_getbool("creative_mode") then From a9ac480dcdc52dd1d7c1e869c4ba4ae380cf5df4 Mon Sep 17 00:00:00 2001 From: Craig Davison Date: Sun, 21 Dec 2014 18:27:15 +0000 Subject: [PATCH 0076/2261] Set number of screwdriver uses to 200 --- mods/screwdriver/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 6e3fe816..65e7f004 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -8,7 +8,7 @@ end local ROTATE_FACE = 1 local ROTATE_AXIS = 2 -local USES = 10 +local USES = 200 -- Handles rotation local function screwdriver_handler(itemstack, user, pointed_thing, mode) From 554d15fadb507335a035933f0db55b3e84277fbb Mon Sep 17 00:00:00 2001 From: Lean Rada Date: Sat, 10 Jan 2015 05:13:12 +0800 Subject: [PATCH 0077/2261] Change furnace fire icons --- .../textures/default_furnace_fire_bg.png | Bin 204 -> 289 bytes .../textures/default_furnace_fire_fg.png | Bin 719 -> 660 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/textures/default_furnace_fire_bg.png b/mods/default/textures/default_furnace_fire_bg.png index 091679baa62c4b4ce8bf228bf0c8ddc926be75a5..0912518e2145ea71a5fddc3fa91c144ca659eb33 100644 GIT binary patch delta 261 zcmV+g0s8*T0ignrB!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra0SOcW98%0z0RR91u1Q2eR5;7sQ@ahqKn#7pDh-s>NMRI8Ch#hB*@6Y! zAx2;n%FK|;G&sEYqDUbfPrAat=V#v?FauSc*w@3p@&yVPQGSv$(d&Ex06f~JA`(h; zGYi`zMuc*D-qH2LNMdHA0#DNA$_(iiq%rcaggotwS^For{QI?56g00000 LNkvXXu0mjfCFE*r delta 176 zcmV;h08js+0?YxBB!81hL_t(|0b?KrREzO}F&6M2k02&kugrl}{y!!kA!Z}U0T-*2 zWCyeBrMba0J_8UK4a`*FWmuuYi($ZjT$;CP^P#BOpe)F6%9w+opZ}xdD^C0jN6dK` zUWXbne2SBUtHJ4HbT&?x;t<3tjz=w~LJABZj45ydCMFbEgeeU`X5iOM*Z^|F15=P9 e1Ms^D6952cf~c3|WZ;ni0000%^F6LKZSI+@vu=NS?r;fD!J*IG^r}kq<>W$X)ONDf{rv~9nA+<4F zZ0ihANeBX4eVfi zCpI(IV$*d(<8_+H37Z%^r2K*AZbF^rD@@#^JVxt%!VAQg2nB=N^b=v~4F*@q283U! zpI|s5enq)Rd5C;H4}K$FBR0?>Y$nSI%|B`ULEh%kFO)U<+i;k8m&_;P3R#`_Cgm3l z17RECRds6fg;ca?9joZ^7Wuo?bMm(stkAegS&&Wf=muGr@EsGMsfFD=wdHZ*Jh4yf zEO8_5RDF<-G1$RyiExGHi0nN5FaKpG`X5R6K3?nj^k7{-tEA@4a-Q#LPYHf)ku4Vky{(u%x= zp>(lSEXe4h5q(fJC`|~VK9o=ylo^TE@Q!FZUlfh6WvY zIPZDh^Zw5B;fViPCEo6mmhf3*rZ@@y1!@X*w8*}H$jjBvsDEE8c&=Hs;Kj%sEkY}E zqRe->m=|Z{E@EERI~6_-c7RIRGTLM16a_f5Pv)^G&DB6R(Xd96wb!BcAm7VMJK*C% zZKx-l454SE72K?Hw}{s}0;Ti)V43LN=x8GjrFbrSWhz_A$ZiF15?1gc(v_c?8!WY$ zuf=>V^auPcVt=AQiQrr~;{`!XAM|4=-3HU=ty`%3;@p_b4nmjVBYEZ`B_Fgap(qqF zx52m_fI3EVx zk$l?a#zekcYR*>2LAi!+IbImr)>{GBm5e@7GI=4y27egIazkGe4mY=8Y~RFisRAA) zL(MkKNBuBYg~R&<=+e@kDZr4-Sfh^(Fnw5#F)x6*wmAA~T=>(PBsF=f#c(a0?+;Y) zGznuzB7EM9c_4?0W;J5$h=K)3Q82V7FjQtE>skV#HHw+$Xa*|-nR={-xnm4=M5FIb zMCeZiz<=2YY2ZixN=$cD3&T_?ne9;1Q|(OWPJ!v62EL}zRVb(r5nxHl%NY2qwfhUh z<-SbbP(lB8et$`%uhEG|*#a8kn5>I}ksMmm-O(M|ir}4w-YfplodqAYP@!U`GYQ7` z!>uTIrG?&HMlXkAx}?E$H=f2w2TFWhIqvO@xG^0s;8_~RN)_BoMOPb)xoM|eqGGuh er@b8!ORT@#Op{CpicYft0000 Date: Thu, 25 Dec 2014 16:40:51 +0000 Subject: [PATCH 0078/2261] Add Obsidian / Obsidian Brick stairs & slabs --- mods/stairs/init.lua | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index c7df28c5..bb55d06b 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -296,3 +296,16 @@ stairs.register_stair_and_slab("pinewood", "default:pinewood", "Pinewood Slab", default.node_sound_wood_defaults()) +stairs.register_stair_and_slab("obsidian", "default:obsidian", + {cracky=1,level=2}, + {"default_obsidian.png"}, + "Obsidian Stair", + "Obsidian Slab", + default.node_sound_stone_defaults()) + +stairs.register_stair_and_slab("obsidianbrick", "default:obsidianbrick", + {cracky=1,level=2}, + {"default_obsidian_brick.png"}, + "Obsidian Brick Stair", + "Obsidian Brick Slab", + default.node_sound_stone_defaults()) From 047bfb9ad1bab6869bcf6ceba704f602433b817a Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 24 Nov 2014 04:14:48 +0000 Subject: [PATCH 0079/2261] Simple biomes for mgv5/mgv7. Uses get_mapgen_params --- mods/default/mapgen.lua | 264 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 254 insertions(+), 10 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 386ba417..25eb8f8e 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -400,18 +400,9 @@ function default.mgv6_ongen(minp, maxp, seed) end end end + end --- --- Detect mapgen and register suitable on-generated function --- - -minetest.register_on_mapgen_init(function(mg_params) - if mg_params.mgname == "v6" then - minetest.register_on_generated(default.mgv6_ongen) - end -end) - -- -- Generate nyan cats in all mapgens -- @@ -465,3 +456,256 @@ function default.generate_nyancats(minp, maxp, seed) end minetest.register_on_generated(default.generate_nyancats) + +-- +-- Register biomes +-- + +function default.register_biomes() + + minetest.clear_registered_biomes() + + -- Temperate biomes + + minetest.register_biome({ + name = "grassland", + node_top = "default:dirt_with_grass", + node_shore_top = "default:sand", + depth_top = 1, + node_filler = "default:dirt", + node_shore_filler = "default:sand", + depth_filler = 2, + height_shore = 3, + node_underwater = "default:sand", + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_dust = "", + y_min = -32000, + y_max = 32000, + heat_point = 50, + humidity_point = 50, + }) + + -- + -- Register decorations + -- + + -- Grassland + + -- Flowers + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.015, + scale = 0.03, + spread = {x=100, y=100, z=100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland"}, + y_min = -32000, + y_max = 32000, + decoration = "flowers:rose", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.015, + scale = 0.03, + spread = {x=100, y=100, z=100}, + seed = 19822, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland"}, + y_min = -32000, + y_max = 32000, + decoration = "flowers:tulip", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.015, + scale = 0.03, + spread = {x=100, y=100, z=100}, + seed = 1220999, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland"}, + y_min = -32000, + y_max = 32000, + decoration = "flowers:dandelion_yellow", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.015, + scale = 0.03, + spread = {x=100, y=100, z=100}, + seed = 36662, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland"}, + y_min = -32000, + y_max = 32000, + decoration = "flowers:geranium", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.015, + scale = 0.03, + spread = {x=100, y=100, z=100}, + seed = 1133, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland"}, + y_min = -32000, + y_max = 32000, + decoration = "flowers:viola", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.015, + scale = 0.03, + spread = {x=100, y=100, z=100}, + seed = 73133, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland"}, + y_min = -32000, + y_max = 32000, + decoration = "flowers:dandelion_white", + }) + + -- Grasses + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.04, + scale = 0.08, + spread = {x=100, y=100, z=100}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland"}, + y_min = -32000, + y_max = 32000, + decoration = "default:grass_1", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.02, + scale = 0.08, + spread = {x=100, y=100, z=100}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland"}, + y_min = -32000, + y_max = 32000, + decoration = "default:grass_2", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.08, + spread = {x=100, y=100, z=100}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland"}, + y_min = -32000, + y_max = 32000, + decoration = "default:grass_3", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.08, + spread = {x=100, y=100, z=100}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland"}, + y_min = -32000, + y_max = 32000, + decoration = "default:grass_4", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.08, + spread = {x=100, y=100, z=100}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland"}, + y_min = -32000, + y_max = 32000, + decoration = "default:grass_5", + }) + +end + +-- +-- Detect mapgen and select suitable biome code +-- + +local mg_params = minetest.get_mapgen_params() +if mg_params.mgname == "v6" then + minetest.register_on_generated(default.mgv6_ongen) +else + default.register_biomes() +end + From 64bf6c1b890cf633b1309e4b995e92ab414c7479 Mon Sep 17 00:00:00 2001 From: Craig Davison Date: Thu, 1 Jan 2015 16:14:31 +0000 Subject: [PATCH 0080/2261] Add crafting grid result arrow to creative inventory --- mods/creative/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/creative/init.lua b/mods/creative/init.lua index 41282b18..809c2aa3 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -82,6 +82,7 @@ creative_inventory.set_creative_formspec = function(player, start_i, pagenum) "list[current_player;main;5,4.75;8,3;8]".. "list[current_player;craft;8,0;3,3;]".. "list[current_player;craftpreview;12,1;1,1;]".. + "image[11,1;1,1;gui_furnace_arrow_bg.png^[transformR270]".. "list[detached:creative;main;0.3,0.5;4,6;"..tostring(start_i).."]".. "label[2.0,6.55;"..tostring(pagenum).."/"..tostring(pagemax).."]".. "button[0.3,6.5;1.6,1;creative_prev;<<]".. From 2c0f716a139140f643d35fbf75bdca96f9b359b4 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sun, 7 Dec 2014 14:58:18 +0100 Subject: [PATCH 0081/2261] Remove useless, empty callbacks --- mods/default/functions.lua | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index ecb7f612..586dfc45 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -102,31 +102,6 @@ function default.register_falling_node(nodename, texture) end end --- --- Global callbacks --- - --- Global environment step function -function on_step(dtime) - -- print("on_step") -end -minetest.register_globalstep(on_step) - -function on_placenode(p, node) - --print("on_placenode") -end -minetest.register_on_placenode(on_placenode) - -function on_dignode(p, node) - --print("on_dignode") -end -minetest.register_on_dignode(on_dignode) - -function on_punchnode(p, node) -end -minetest.register_on_punchnode(on_punchnode) - - -- -- Lavacooling -- From c654c9fd1197b91bab0c91432f5149223987eaad Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sun, 7 Dec 2014 15:17:09 +0100 Subject: [PATCH 0082/2261] Remove weird constants in default --- game_api.txt | 7 ++++++- mods/default/init.lua | 15 +++++++++------ mods/default/nodes.lua | 18 +++++++++--------- mods/farming/API.txt | 2 +- mods/farming/init.lua | 4 ++-- mods/tnt/init.lua | 2 +- 6 files changed, 28 insertions(+), 20 deletions(-) diff --git a/game_api.txt b/game_api.txt index 8123c010..6ce69f09 100644 --- a/game_api.txt +++ b/game_api.txt @@ -83,7 +83,7 @@ farming.register_plant(name, Plant definition) steps = 8, -- How many steps the plant has to grow, until it can be harvested ^ Always provide a plant texture for ech step, format: modname_plantname_i.png (i = stepnumber) minlight = 13, -- Minimum light to grow - maxlight = LIGHT_MAX -- Maximum light to grow + maxlight = default.LIGHT_MAX -- Maximum light to grow } Stairs API @@ -148,6 +148,11 @@ default.node_sound_wood_defaults() default.node_sound_leaves_defaults() default.node_sound_glass_defaults() +Default constants +----------------- +default.LIGHT_MAX +^ The maximum light level (see [Node definition] light_source) + Player API ---------- The player API can register player models and update the player's appearence diff --git a/mods/default/init.lua b/mods/default/init.lua index 276af543..663a3ae1 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -1,16 +1,13 @@ -- Minetest 0.4 mod: default -- See README.txt for licensing and other information. --- The API documentation in here was moved into doc/lua_api.txt - -WATER_ALPHA = 160 -WATER_VISC = 1 -LAVA_VISC = 7 -LIGHT_MAX = 14 +-- The API documentation in here was moved into game_api.txt -- Definitions made by this mod that other mods can use too default = {} +default.LIGHT_MAX = 14 + -- GUI related stuff default.gui_bg = "bgcolor[#080808BB;true]" default.gui_bg_img = "background[5,5;1,1;gui_formbg.png;true]" @@ -46,3 +43,9 @@ dofile(minetest.get_modpath("default").."/mapgen.lua") dofile(minetest.get_modpath("default").."/player.lua") dofile(minetest.get_modpath("default").."/trees.lua") dofile(minetest.get_modpath("default").."/aliases.lua") + +-- Legacy: +WATER_ALPHA = minetest.registered_nodes["default:water_source"].alpha +WATER_VISC = minetest.registered_nodes["default:water_source"].liquid_viscosity +LAVA_VISC = minetest.registered_nodes["default:lava_source"].liquid_viscosity +LIGHT_MAX = default.LIGHT_MAX diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 90b6dbd7..fcc34bbf 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -547,7 +547,7 @@ minetest.register_node("default:water_flowing", { animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8} }, }, - alpha = WATER_ALPHA, + alpha = 160, paramtype = "light", paramtype2 = "flowingliquid", walkable = false, @@ -559,7 +559,7 @@ minetest.register_node("default:water_flowing", { liquidtype = "flowing", liquid_alternative_flowing = "default:water_flowing", liquid_alternative_source = "default:water_source", - liquid_viscosity = WATER_VISC, + liquid_viscosity = 1, post_effect_color = {a=64, r=100, g=100, b=200}, groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1}, }) @@ -579,7 +579,7 @@ minetest.register_node("default:water_source", { backface_culling = false, } }, - alpha = WATER_ALPHA, + alpha = 160, paramtype = "light", walkable = false, pointable = false, @@ -590,7 +590,7 @@ minetest.register_node("default:water_source", { liquidtype = "source", liquid_alternative_flowing = "default:water_flowing", liquid_alternative_source = "default:water_source", - liquid_viscosity = WATER_VISC, + liquid_viscosity = 1, post_effect_color = {a=64, r=100, g=100, b=200}, groups = {water=3, liquid=3, puts_out_fire=1}, }) @@ -614,7 +614,7 @@ minetest.register_node("default:lava_flowing", { }, paramtype = "light", paramtype2 = "flowingliquid", - light_source = LIGHT_MAX - 1, + light_source = default.LIGHT_MAX - 1, walkable = false, pointable = false, diggable = false, @@ -624,7 +624,7 @@ minetest.register_node("default:lava_flowing", { liquidtype = "flowing", liquid_alternative_flowing = "default:lava_flowing", liquid_alternative_source = "default:lava_source", - liquid_viscosity = LAVA_VISC, + liquid_viscosity = 7, liquid_renewable = false, damage_per_second = 4*2, post_effect_color = {a=192, r=255, g=64, b=0}, @@ -647,7 +647,7 @@ minetest.register_node("default:lava_source", { } }, paramtype = "light", - light_source = LIGHT_MAX - 1, + light_source = default.LIGHT_MAX - 1, walkable = false, pointable = false, diggable = false, @@ -657,7 +657,7 @@ minetest.register_node("default:lava_source", { liquidtype = "source", liquid_alternative_flowing = "default:lava_flowing", liquid_alternative_source = "default:lava_source", - liquid_viscosity = LAVA_VISC, + liquid_viscosity = 7, liquid_renewable = false, damage_per_second = 4*2, post_effect_color = {a=192, r=255, g=64, b=0}, @@ -680,7 +680,7 @@ minetest.register_node("default:torch", { sunlight_propagates = true, is_ground_content = false, walkable = false, - light_source = LIGHT_MAX-1, + light_source = default.LIGHT_MAX - 1, selection_box = { type = "wallmounted", wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1}, diff --git a/mods/farming/API.txt b/mods/farming/API.txt index a2f3d9d6..9234bc44 100644 --- a/mods/farming/API.txt +++ b/mods/farming/API.txt @@ -23,5 +23,5 @@ Plant definition steps = 8, -- How many steps the plant has to grow, until it can be harvested ^ Always provide a plant texture for ech step, format: modname_plantname_i.png (i = stepnumber) minlight = 13, -- Minimum light to grow - maxlight = LIGHT_MAX -- Maximum light to grow + maxlight = default.LIGHT_MAX -- Maximum light to grow } \ No newline at end of file diff --git a/mods/farming/init.lua b/mods/farming/init.lua index 9245470f..d3157a07 100644 --- a/mods/farming/init.lua +++ b/mods/farming/init.lua @@ -13,7 +13,7 @@ farming.register_plant("farming:wheat", { inventory_image = "farming_wheat_seed.png", steps = 8, minlight = 13, - maxlight = LIGHT_MAX, + maxlight = default.LIGHT_MAX, fertility = {"grassland"} }) minetest.register_craftitem("farming:flour", { @@ -46,7 +46,7 @@ farming.register_plant("farming:cotton", { inventory_image = "farming_cotton_seed.png", steps = 8, minlight = 13, - maxlight = LIGHT_MAX, + maxlight = default.LIGHT_MAX, fertility = {"grassland", "desert"} }) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index a2e5adaa..fda4ec39 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -255,7 +255,7 @@ minetest.register_node("tnt:tnt_burning", { minetest.register_node("tnt:boom", { drawtype = "plantlike", tiles = {"tnt_boom.png"}, - light_source = LIGHT_MAX, + light_source = default.LIGHT_MAX, walkable = false, drop = "", groups = {dig_immediate=3}, From d1e715ebac09f5a14bdd491be0f069c915479a27 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sun, 7 Dec 2014 15:25:39 +0100 Subject: [PATCH 0083/2261] Add tree growing functions to game_api.txt --- game_api.txt | 23 +++++++++++++++++------ mods/default/trees.lua | 10 +++++----- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/game_api.txt b/game_api.txt index 6ce69f09..0f53dbc1 100644 --- a/game_api.txt +++ b/game_api.txt @@ -23,7 +23,7 @@ The bucket API allows registering new types of buckets for non-default liquids. "bucket_lava.png", -- Bucket texture (for wielditem and inventory_image) "Lava Bucket" -- Bucket description ) - + Doors API --------- The doors mod allows modders to register custom doors. @@ -31,7 +31,7 @@ The doors mod allows modders to register custom doors. doors.register_door(name, def) ^ name: "Door name" ^ def: See [#Door definition] - + #Door definition ---------------- { @@ -58,7 +58,7 @@ The farming API allows you to easily register plants and hoes. farming.register_hoe(name, hoe definition) -> Register a new hoe, see [#hoe definition] - + farming.register_plant(name, Plant definition) -> Register a new growing plant, see [#Plant definition] @@ -99,7 +99,7 @@ stairs.register_stair(subname, recipeitem, groups, images, description, sounds) -> images: see [Tile definition] -> description: used for the description field in the stair's definition -> sounds: see [#Default sounds] - + stairs.register_slab(subname, recipeitem, groups, images, description, sounds) -> Registers a slabs -> subname: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_subname" @@ -108,13 +108,13 @@ stairs.register_slab(subname, recipeitem, groups, images, description, sounds) -> images: see [Tile definition] -> description: used for the description field in the stair's definition -> sounds: see [#Default sounds] - + stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds) -> A wrapper for stairs.register_stair and stairs.register_slab -> Uses almost the same arguments as stairs.register_stair -> desc_stair: Description for stair node -> desc_slab: Description for slab node - + Xpanes API ---------- Creates panes that automatically connect to each other @@ -280,3 +280,14 @@ dye.basecolors dye.excolors ^ Array containing the names of the available extended colors + +Trees +----- +default.grow_tree(pos, is_apple_tree) +^ Grows a tree or apple tree at pos + +default.grow_jungle_tree(pos) +^ Grows a jungletree at pos + +default.grow_pine_tree(pos) +^ Grows a pinetree at pos diff --git a/mods/default/trees.lua b/mods/default/trees.lua index f2baaf85..eaf85f96 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -45,7 +45,7 @@ minetest.register_abm({ minetest.log("action", "A jungle sapling grows into a tree at ".. minetest.pos_to_string(pos)) - default.grow_jungletree(pos) + default.grow_jungle_tree(pos) end }) @@ -60,7 +60,7 @@ minetest.register_abm({ minetest.log("action", "A pine sapling grows into a tree at ".. minetest.pos_to_string(pos)) - default.grow_pinetree(pos) + default.grow_pine_tree(pos) end }) @@ -157,14 +157,14 @@ end -- Jungletree -function default.grow_jungletree(pos, bad) +function default.grow_jungle_tree(pos, bad) --[[ NOTE: Jungletree-placing code is currently duplicated in the engine and in games that have saplings; both are deprecated but not replaced yet --]] if bad then - error("Deprecated use of default.grow_jungletree") + error("Deprecated use of default.grow_jungle_tree") end local x, y, z = pos.x, pos.y, pos.z @@ -220,7 +220,7 @@ local function add_snow(data, vi, c_air, c_ignore, c_snow) end end -function default.grow_pinetree(pos) +function default.grow_pine_tree(pos) local x, y, z = pos.x, pos.y, pos.z local maxy = y + random(9, 13) -- Trunk top From 2edfb55c2904c22d6a2a4df6c1e950dee6ebbb0a Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Sun, 7 Dec 2014 16:29:36 +0100 Subject: [PATCH 0084/2261] Restructure default/nodes.lua --- mods/default/functions.lua | 39 + mods/default/nodes.lua | 1737 +++++++++++++++++++++--------------- 2 files changed, 1038 insertions(+), 738 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 586dfc45..c5623205 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -298,3 +298,42 @@ minetest.register_abm({ end }) +-- +-- Grass growing +-- + +minetest.register_abm({ + nodenames = {"default:dirt"}, + interval = 2, + chance = 200, + action = function(pos, node) + 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"}) + end + end + end +}) + +minetest.register_abm({ + nodenames = {"default:dirt_with_grass"}, + interval = 2, + chance = 20, + action = function(pos, node) + 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 name ~= "ignore" and nodedef + and not ((nodedef.sunlight_propagates or nodedef.paramtype == "light") + and nodedef.liquidtype == "none") then + minetest.set_node(pos, {name = "default:dirt"}) + end + end +}) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index fcc34bbf..3d328399 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1,5 +1,144 @@ -- mods/default/nodes.lua +--[[ Index: + +Stone +----- +(1. Material 2. Cobble variant 3. Brick variant [4. Modified forms]) + +default:stone +default:cobble +default:stonebrick +default:mossycobble + +default:desert_stone +default:desert_cobble +default:desert_stonebrick + +default:sandstone +default:sandstonebrick + +default:obsidian +default:obsidianbrick + +Soft / Non-Stone +---------------- +(1. Material [2. Modified forms]) + +default:dirt +default:dirt_with_grass +default:dirt_with_grass_footsteps +default:dirt_with_snow + +default:sand +default:desert_sand + +default:gravel + +default:clay + +default:snow +default:snowblock + +default:ice + +Trees +----- +(1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling [5. Fruits]) + +default:tree +default:wood +default:leaves +default:sapling +default:apple + +default:jungletree +default:junglewood +default:jungleleaves +default:junglesapling + +default:pinetree +default:pinewood +default:pine_needles +default:pine_sapling + +Ores +---- +(1. In stone 2. Block) + +default:stone_with_coal +default:coalblock + +default:stone_with_iron +default:steelblock + +default:stone_with_copper +default:copperblock +default:bronzeblock + +default:stone_with_gold +default:goldblock + +default:stone_with_mese +default:mese + +default:stone_with_diamond +default:diamondblock + +Plantlife (non-cubic) +--------------------- +default:cactus +default:papyrus +default:dry_shrub +default:junglegrass +default:grass_1 +default:grass_2 +default:grass_3 +default:grass_4 +default:grass_5 + +Liquids +------- +(1. Source 2. Flowing) + +default:water_source +default:water_flowing + +default:lava_source +default:lava_flowing + +Tools / "Advanced" crafting / Non-"natural" +------------------------------------------- +default:torch + +default:chest +default:chest_locked + +default:bookshelf + +default:sign_wall +default:ladder +default:fence_wood + +default:glass +default:obsidian_glass + +default:rail + +default:brick + +Misc +---- +default:cloud +default:nyancat +default:nyancat_rainbow + +--]] + +-- +-- Stone +-- + minetest.register_node("default:stone", { description = "Stone", tiles = {"default_stone.png"}, @@ -10,67 +149,11 @@ minetest.register_node("default:stone", { sounds = default.node_sound_stone_defaults(), }) -minetest.register_node("default:desert_stone", { - description = "Desert Stone", - tiles = {"default_desert_stone.png"}, +minetest.register_node("default:cobble", { + description = "Cobblestone", + tiles = {"default_cobble.png"}, is_ground_content = true, - groups = {cracky=3, stone=1}, - drop = 'default:desert_cobble', - legacy_mineral = true, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:stone_with_coal", { - description = "Coal Ore", - tiles = {"default_stone.png^default_mineral_coal.png"}, - is_ground_content = true, - groups = {cracky=3}, - drop = 'default:coal_lump', - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:stone_with_iron", { - description = "Iron Ore", - tiles = {"default_stone.png^default_mineral_iron.png"}, - is_ground_content = true, - groups = {cracky=2}, - drop = 'default:iron_lump', - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:stone_with_copper", { - description = "Copper Ore", - tiles = {"default_stone.png^default_mineral_copper.png"}, - is_ground_content = true, - groups = {cracky=2}, - drop = 'default:copper_lump', - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:stone_with_mese", { - description = "Mese Ore", - tiles = {"default_stone.png^default_mineral_mese.png"}, - is_ground_content = true, - groups = {cracky=1}, - drop = "default:mese_crystal", - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:stone_with_gold", { - description = "Gold Ore", - tiles = {"default_stone.png^default_mineral_gold.png"}, - is_ground_content = true, - groups = {cracky=2}, - drop = "default:gold_lump", - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:stone_with_diamond", { - description = "Diamond Ore", - tiles = {"default_stone.png^default_mineral_diamond.png"}, - is_ground_content = true, - groups = {cracky=1}, - drop = "default:diamond", + groups = {cracky=3, stone=2}, sounds = default.node_sound_stone_defaults(), }) @@ -81,6 +164,34 @@ minetest.register_node("default:stonebrick", { sounds = default.node_sound_stone_defaults(), }) +minetest.register_node("default:mossycobble", { + description = "Mossy Cobblestone", + tiles = {"default_mossycobble.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:desert_stone", { + description = "Desert Stone", + tiles = {"default_desert_stone.png"}, + is_ground_content = true, + groups = {cracky=3, stone=1}, + drop = 'default:desert_cobble', + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_cobble", { + description = "Desert Cobblestone", + tiles = {"default_desert_cobble.png"}, + is_ground_content = true, + groups = {cracky=3, stone=2}, + sounds = default.node_sound_stone_defaults(), +}) + minetest.register_node("default:desert_stonebrick", { description = "Desert Stone Brick", tiles = {"default_desert_stone_brick.png"}, @@ -88,6 +199,53 @@ minetest.register_node("default:desert_stonebrick", { sounds = default.node_sound_stone_defaults(), }) + + +minetest.register_node("default:sandstone", { + description = "Sandstone", + tiles = {"default_sandstone.png"}, + is_ground_content = true, + groups = {crumbly=2,cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:sandstonebrick", { + description = "Sandstone Brick", + tiles = {"default_sandstone_brick.png"}, + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:obsidian", { + description = "Obsidian", + tiles = {"default_obsidian.png"}, + is_ground_content = true, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=1,level=2}, +}) + +minetest.register_node("default:obsidianbrick", { + description = "Obsidian Brick", + tiles = {"default_obsidian_brick.png"}, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=1,level=2}, +}) + +-- +-- Soft / Non-Stone +-- + +minetest.register_node("default:dirt", { + description = "Dirt", + tiles = {"default_dirt.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1}, + sounds = default.node_sound_dirt_defaults(), +}) + minetest.register_node("default:dirt_with_grass", { description = "Dirt with Grass", tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, @@ -121,49 +279,7 @@ minetest.register_node("default:dirt_with_snow", { }), }) -minetest.register_node("default:dirt", { - description = "Dirt", - tiles = {"default_dirt.png"}, - is_ground_content = true, - groups = {crumbly=3,soil=1}, - sounds = default.node_sound_dirt_defaults(), -}) -minetest.register_abm({ - nodenames = {"default:dirt"}, - interval = 2, - chance = 200, - action = function(pos, node) - 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"}) - end - end - end -}) - -minetest.register_abm({ - nodenames = {"default:dirt_with_grass"}, - interval = 2, - chance = 20, - action = function(pos, node) - 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 name ~= "ignore" and nodedef - and not ((nodedef.sunlight_propagates or nodedef.paramtype == "light") - and nodedef.liquidtype == "none") then - minetest.set_node(pos, {name = "default:dirt"}) - end - end -}) minetest.register_node("default:sand", { description = "Sand", @@ -181,6 +297,8 @@ minetest.register_node("default:desert_sand", { sounds = default.node_sound_sand_defaults(), }) + + minetest.register_node("default:gravel", { description = "Gravel", tiles = {"default_gravel.png"}, @@ -192,21 +310,7 @@ minetest.register_node("default:gravel", { }), }) -minetest.register_node("default:sandstone", { - description = "Sandstone", - tiles = {"default_sandstone.png"}, - is_ground_content = true, - groups = {crumbly=2,cracky=3}, - sounds = default.node_sound_stone_defaults(), -}) -minetest.register_node("default:sandstonebrick", { - description = "Sandstone Brick", - tiles = {"default_sandstone_brick.png"}, - is_ground_content = true, - groups = {cracky=2}, - sounds = default.node_sound_stone_defaults(), -}) minetest.register_node("default:clay", { description = "Clay", @@ -217,13 +321,63 @@ minetest.register_node("default:clay", { sounds = default.node_sound_dirt_defaults(), }) -minetest.register_node("default:brick", { - description = "Brick Block", - tiles = {"default_brick.png"}, - is_ground_content = false, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), + + +minetest.register_node("default:snow", { + description = "Snow", + tiles = {"default_snow.png"}, + inventory_image = "default_snowball.png", + wield_image = "default_snowball.png", + is_ground_content = true, + paramtype = "light", + buildable_to = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.5+2/16, 0.5}, + }, + }, + groups = {crumbly=3,falling_node=1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + dug = {name="default_snow_footstep", gain=0.75}, + }), + + on_construct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node(pos).name == "default:dirt_with_grass" then + minetest.set_node(pos, {name="default:dirt_with_snow"}) + end + end, }) +minetest.register_alias("snow", "default:snow") + +minetest.register_node("default:snowblock", { + description = "Snow Block", + tiles = {"default_snow.png"}, + is_ground_content = true, + groups = {crumbly=3}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + dug = {name="default_snow_footstep", gain=0.75}, + }), +}) + + + +minetest.register_node("default:ice", { + description = "Ice", + tiles = {"default_ice.png"}, + is_ground_content = true, + paramtype = "light", + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), +}) + +-- +-- Trees +-- minetest.register_node("default:tree", { description = "Tree", @@ -232,9 +386,91 @@ minetest.register_node("default:tree", { is_ground_content = false, groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node }) +minetest.register_node("default:wood", { + description = "Wooden Planks", + tiles = {"default_wood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:sapling", { + description = "Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_sapling.png"}, + inventory_image = "default_sapling.png", + wield_image = "default_sapling.png", + paramtype = "light", + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("default:leaves", { + description = "Leaves", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.3, + tiles = {"default_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {'default:sapling'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'default:leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:apple", { + description = "Apple", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_apple.png"}, + inventory_image = "default_apple.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} + }, + groups = {fleshy=3,dig_immediate=3,flammable=2,leafdecay=3,leafdecay_drop=1}, + on_use = minetest.item_eat(1), + sounds = default.node_sound_leaves_defaults(), + + after_place_node = function(pos, placer, itemstack) + if placer:is_player() then + minetest.set_node(pos, {name="default:apple", param2=1}) + end + end, +}) + + + minetest.register_node("default:jungletree", { description = "Jungle Tree", tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"}, @@ -242,6 +478,7 @@ minetest.register_node("default:jungletree", { is_ground_content = false, groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node }) @@ -277,6 +514,7 @@ minetest.register_node("default:jungleleaves", { } }, sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves, }) @@ -297,6 +535,257 @@ minetest.register_node("default:junglesapling", { sounds = default.node_sound_leaves_defaults(), }) + + +minetest.register_node("default:pinetree", { + description = "Pine Tree", + tiles = {"default_pinetree_top.png", "default_pinetree_top.png", "default_pinetree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:pinewood", { + description = "Pinewood Planks", + tiles = {"default_pinewood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:pine_needles",{ + description = "Pine Needles", + drawtype = "allfaces_optional", + visual_scale = 1.3, + tiles = {"default_pine_needles.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {"default:pine_sapling"}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {"default:pine_needles"}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:pine_sapling", { + description = "Pine Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_pine_sapling.png"}, + inventory_image = "default_pine_sapling.png", + wield_image = "default_pine_sapling.png", + paramtype = "light", + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + +-- +-- Ores +-- + +minetest.register_node("default:stone_with_coal", { + description = "Coal Ore", + tiles = {"default_stone.png^default_mineral_coal.png"}, + is_ground_content = true, + groups = {cracky=3}, + drop = 'default:coal_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:coalblock", { + description = "Coal Block", + tiles = {"default_coal_block.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_iron", { + description = "Iron Ore", + tiles = {"default_stone.png^default_mineral_iron.png"}, + is_ground_content = true, + groups = {cracky=2}, + drop = 'default:iron_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:steelblock", { + description = "Steel Block", + tiles = {"default_steel_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_copper", { + description = "Copper Ore", + tiles = {"default_stone.png^default_mineral_copper.png"}, + is_ground_content = true, + groups = {cracky=2}, + drop = 'default:copper_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:copperblock", { + description = "Copper Block", + tiles = {"default_copper_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:bronzeblock", { + description = "Bronze Block", + tiles = {"default_bronze_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_mese", { + description = "Mese Ore", + tiles = {"default_stone.png^default_mineral_mese.png"}, + is_ground_content = true, + groups = {cracky=1}, + drop = "default:mese_crystal", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:mese", { + description = "Mese Block", + tiles = {"default_mese_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) +minetest.register_alias("default:mese_block", "default:mese") + + + +minetest.register_node("default:stone_with_gold", { + description = "Gold Ore", + tiles = {"default_stone.png^default_mineral_gold.png"}, + is_ground_content = true, + groups = {cracky=2}, + drop = "default:gold_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:goldblock", { + description = "Gold Block", + tiles = {"default_gold_block.png"}, + is_ground_content = true, + groups = {cracky=1}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_diamond", { + description = "Diamond Ore", + tiles = {"default_stone.png^default_mineral_diamond.png"}, + is_ground_content = true, + groups = {cracky=1}, + drop = "default:diamond", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:diamondblock", { + description = "Diamond Block", + tiles = {"default_diamond_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=3}, + sounds = default.node_sound_stone_defaults(), +}) + +-- +-- Plantlife (non-cubic) +-- + +minetest.register_node("default:cactus", { + description = "Cactus", + tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"}, + paramtype2 = "facedir", + is_ground_content = true, + groups = {snappy=1,choppy=3,flammable=2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("default:papyrus", { + description = "Papyrus", + drawtype = "plantlike", + tiles = {"default_papyrus.png"}, + inventory_image = "default_papyrus.png", + wield_image = "default_papyrus.png", + paramtype = "light", + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + groups = {snappy=3,flammable=2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("default:dry_shrub", { + description = "Dry Shrub", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"default_dry_shrub.png"}, + inventory_image = "default_dry_shrub.png", + wield_image = "default_dry_shrub.png", + paramtype = "light", + walkable = false, + is_ground_content = true, + buildable_to = true, + groups = {snappy=3,flammable=3,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + minetest.register_node("default:junglegrass", { description = "Jungle Grass", drawtype = "plantlike", @@ -317,217 +806,101 @@ minetest.register_node("default:junglegrass", { }, }) -minetest.register_node("default:leaves", { - description = "Leaves", - drawtype = "allfaces_optional", - waving = 1, - visual_scale = 1.3, - tiles = {"default_leaves.png"}, - paramtype = "light", - is_ground_content = false, - groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, - drop = { - max_items = 1, - items = { - { - -- player will get sapling with 1/20 chance - items = {'default:sapling'}, - rarity = 20, - }, - { - -- player will get leaves only if he get no saplings, - -- this is because max_items is 1 - items = {'default:leaves'}, - } - } - }, - sounds = default.node_sound_leaves_defaults(), - after_place_node = default.after_place_leaves, -}) - -minetest.register_node("default:cactus", { - description = "Cactus", - tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"}, - paramtype2 = "facedir", - is_ground_content = true, - groups = {snappy=1,choppy=3,flammable=2}, - sounds = default.node_sound_wood_defaults(), - on_place = minetest.rotate_node, - after_dig_node = function(pos, node, metadata, digger) - default.dig_up(pos, node, digger) - end, -}) - -minetest.register_node("default:papyrus", { - description = "Papyrus", +minetest.register_node("default:grass_1", { + description = "Grass", drawtype = "plantlike", - tiles = {"default_papyrus.png"}, - inventory_image = "default_papyrus.png", - wield_image = "default_papyrus.png", + waving = 1, + tiles = {"default_grass_1.png"}, + -- use a bigger inventory image + inventory_image = "default_grass_3.png", + wield_image = "default_grass_3.png", paramtype = "light", walkable = false, is_ground_content = true, - selection_box = { - type = "fixed", - fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} - }, - groups = {snappy=3,flammable=2}, + buildable_to = true, + groups = {snappy=3,flammable=3,flora=1,attached_node=1}, sounds = default.node_sound_leaves_defaults(), - after_dig_node = function(pos, node, metadata, digger) - default.dig_up(pos, node, digger) - end, -}) - -default.bookshelf_formspec = - "size[8,7;]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;books;0,0.3;8,2;]".. - "list[current_player;main;0,2.85;8,1;]".. - "list[current_player;main;0,4.08;8,3;8]".. - default.get_hotbar_bg(0,2.85) - -minetest.register_node("default:bookshelf", { - description = "Bookshelf", - tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"}, - is_ground_content = false, - groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3}, - sounds = default.node_sound_wood_defaults(), - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", default.bookshelf_formspec) - local inv = meta:get_inventory() - inv:set_size("books", 8*2) - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("books") - end, - - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local to_stack = inv:get_stack(listname, index) - if listname == "books" then - if minetest.get_item_group(stack:get_name(), "book") ~= 0 - and to_stack:is_empty() then - return 1 - else - return 0 - end - end - end, - - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local stack = inv:get_stack(from_list, from_index) - local to_stack = inv:get_stack(to_list, to_index) - if to_list == "books" then - if stack:get_name() == "default:book" and to_stack:is_empty() then - return 1 - else - return 0 - end - end - end, - - on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - minetest.log("action", player:get_player_name().. - " moves stuff in bookshelf at "..minetest.pos_to_string(pos)) - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " moves stuff to bookshelf at "..minetest.pos_to_string(pos)) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " takes stuff from bookshelf at "..minetest.pos_to_string(pos)) - end, -}) - -minetest.register_node("default:glass", { - description = "Glass", - drawtype = "glasslike_framed_optional", - tiles = {"default_glass.png", "default_glass_detail.png"}, - inventory_image = minetest.inventorycube("default_glass.png"), - paramtype = "light", - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky=3,oddly_breakable_by_hand=3}, - sounds = default.node_sound_glass_defaults(), -}) - -local fence_texture = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126" -minetest.register_node("default:fence_wood", { - description = "Wooden Fence", - drawtype = "fencelike", - tiles = {"default_wood.png"}, - inventory_image = fence_texture, - wield_image = fence_texture, - paramtype = "light", - is_ground_content = false, selection_box = { type = "fixed", - fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, }, - groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2}, - sounds = default.node_sound_wood_defaults(), + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("default:grass_"..math.random(1,5)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:grass_1 "..itemstack:get_count()-(1-ret:get_count())) + end, }) -minetest.register_node("default:rail", { - description = "Rail", - drawtype = "raillike", - tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"}, - inventory_image = "default_rail.png", - wield_image = "default_rail.png", +for i=2,5 do + minetest.register_node("default:grass_"..i, { + description = "Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_"..i..".png"}, + inventory_image = "default_grass_"..i..".png", + wield_image = "default_grass_"..i..".png", + paramtype = "light", + walkable = false, + buildable_to = true, + is_ground_content = true, + drop = "default:grass_1", + groups = {snappy=3,flammable=3,flora=1,attached_node=1,not_in_creative_inventory=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + }) +end + +-- +-- Liquids +-- + +minetest.register_node("default:water_source", { + description = "Water Source", + inventory_image = minetest.inventorycube("default_water.png"), + drawtype = "liquid", + tiles = { + { + name = "default_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0 + }, + }, + }, + special_tiles = { + -- New-style water source material (mostly unused) + { + name = "default_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0 + }, + backface_culling = false, + }, + }, + alpha = 160, paramtype = "light", walkable = false, - is_ground_content = false, - selection_box = { - type = "fixed", - -- but how to specify the dimensions for curved and sideways rails? - fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, - }, - groups = {bendy=2,dig_immediate=2,attached_node=1}, -}) - -minetest.register_node("default:ladder", { - description = "Ladder", - drawtype = "signlike", - tiles = {"default_ladder.png"}, - inventory_image = "default_ladder.png", - wield_image = "default_ladder.png", - paramtype = "light", - paramtype2 = "wallmounted", - walkable = false, - climbable = true, - is_ground_content = false, - selection_box = { - type = "wallmounted", - --wall_top = = - --wall_bottom = = - --wall_side = = - }, - groups = {choppy=2,oddly_breakable_by_hand=3,flammable=2}, - legacy_wallmounted = true, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("default:wood", { - description = "Wooden Planks", - tiles = {"default_wood.png"}, - groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("default:cloud", { - description = "Cloud", - tiles = {"default_cloud.png"}, - sounds = default.node_sound_defaults(), - groups = {not_in_creative_inventory=1}, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a=64, r=100, g=100, b=200}, + groups = {water=3, liquid=3, puts_out_fire=1}, }) minetest.register_node("default:water_flowing", { @@ -537,14 +910,24 @@ minetest.register_node("default:water_flowing", { tiles = {"default_water.png"}, special_tiles = { { - image="default_water_flowing_animated.png", - backface_culling=false, - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8} + image = "default_water_flowing_animated.png", + backface_culling = false, + animation = { + type =" vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8 + }, }, { - image="default_water_flowing_animated.png", - backface_culling=true, - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8} + image = "default_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8 + }, }, }, alpha = 160, @@ -564,23 +947,38 @@ minetest.register_node("default:water_flowing", { groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1}, }) -minetest.register_node("default:water_source", { - description = "Water Source", - inventory_image = minetest.inventorycube("default_water.png"), + + +minetest.register_node("default:lava_source", { + description = "Lava Source", + inventory_image = minetest.inventorycube("default_lava.png"), drawtype = "liquid", tiles = { - {name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}} + { + name = "default_lava_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, }, special_tiles = { - -- New-style water source material (mostly unused) + -- New-style lava source material (mostly unused) { - name="default_water_source_animated.png", - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}, + name = "default_lava_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, backface_culling = false, - } + }, }, - alpha = 160, paramtype = "light", + light_source = default.LIGHT_MAX - 1, walkable = false, pointable = false, diggable = false, @@ -588,11 +986,13 @@ minetest.register_node("default:water_source", { drop = "", drowning = 1, liquidtype = "source", - liquid_alternative_flowing = "default:water_flowing", - liquid_alternative_source = "default:water_source", - liquid_viscosity = 1, - post_effect_color = {a=64, r=100, g=100, b=200}, - groups = {water=3, liquid=3, puts_out_fire=1}, + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a=192, r=255, g=64, b=0}, + groups = {lava=3, liquid=2, hot=3, igniter=1}, }) minetest.register_node("default:lava_flowing", { @@ -602,14 +1002,24 @@ minetest.register_node("default:lava_flowing", { tiles = {"default_lava.png"}, special_tiles = { { - image="default_lava_flowing_animated.png", - backface_culling=false, - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3} + image = "default_lava_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3 + }, }, { - image="default_lava_flowing_animated.png", - backface_culling=true, - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3} + image = "default_lava_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3 + }, }, }, paramtype = "light", @@ -626,52 +1036,46 @@ minetest.register_node("default:lava_flowing", { liquid_alternative_source = "default:lava_source", liquid_viscosity = 7, liquid_renewable = false, - damage_per_second = 4*2, + damage_per_second = 4 * 2, post_effect_color = {a=192, r=255, g=64, b=0}, groups = {lava=3, liquid=2, hot=3, igniter=1, not_in_creative_inventory=1}, }) -minetest.register_node("default:lava_source", { - description = "Lava Source", - inventory_image = minetest.inventorycube("default_lava.png"), - drawtype = "liquid", - tiles = { - {name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}} - }, - special_tiles = { - -- New-style lava source material (mostly unused) - { - name="default_lava_source_animated.png", - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}, - backface_culling = false, - } - }, - paramtype = "light", - light_source = default.LIGHT_MAX - 1, - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - drop = "", - drowning = 1, - liquidtype = "source", - liquid_alternative_flowing = "default:lava_flowing", - liquid_alternative_source = "default:lava_source", - liquid_viscosity = 7, - liquid_renewable = false, - damage_per_second = 4*2, - post_effect_color = {a=192, r=255, g=64, b=0}, - groups = {lava=3, liquid=2, hot=3, igniter=1}, -}) +-- +-- Tools / "Advanced" crafting / Non-"natural" +-- minetest.register_node("default:torch", { description = "Torch", drawtype = "torchlike", - --tiles = {"default_torch_on_floor.png", "default_torch_on_ceiling.png", "default_torch.png"}, tiles = { - {name="default_torch_on_floor_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}, - {name="default_torch_on_ceiling_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}, - {name="default_torch_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}} + { + name = "default_torch_on_floor_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + { + name="default_torch_on_ceiling_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + { + name="default_torch_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, }, inventory_image = "default_torch_on_floor.png", wield_image = "default_torch_on_floor.png", @@ -692,48 +1096,9 @@ minetest.register_node("default:torch", { sounds = default.node_sound_defaults(), }) -minetest.register_node("default:sign_wall", { - description = "Sign", - drawtype = "nodebox", - tiles = {"default_sign.png"}, - inventory_image = "default_sign_wall.png", - wield_image = "default_sign_wall.png", - paramtype = "light", - paramtype2 = "wallmounted", - sunlight_propagates = true, - is_ground_content = false, - walkable = false, - node_box = { - type = "wallmounted", - wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, - wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, - wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, - }, - groups = {choppy=2,dig_immediate=2,attached_node=1}, - legacy_wallmounted = true, - sounds = default.node_sound_defaults(), - on_construct = function(pos) - --local n = minetest.get_node(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", "field[text;;${text}]") - meta:set_string("infotext", "\"\"") - end, - on_receive_fields = function(pos, formname, fields, sender) - --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields)) - if minetest.is_protected(pos, sender:get_player_name()) then - minetest.record_protection_violation(pos, sender:get_player_name()) - return - end - local meta = minetest.get_meta(pos) - if not fields.text then return end - minetest.log("action", (sender:get_player_name() or "").." wrote \""..fields.text.. - "\" to sign at "..minetest.pos_to_string(pos)) - meta:set_string("text", fields.text) - meta:set_string("infotext", '"'..fields.text..'"') - end, -}) -default.chest_formspec = + +local chest_formspec = "size[8,9]".. default.gui_bg.. default.gui_bg_img.. @@ -743,7 +1108,7 @@ default.chest_formspec = "list[current_player;main;0,6.08;8,3;8]".. default.get_hotbar_bg(0,4.85) -function default.get_locked_chest_formspec(pos) +local function get_locked_chest_formspec(pos) local spos = pos.x .. "," .. pos.y .. "," ..pos.z local formspec = "size[8,9]".. @@ -757,6 +1122,12 @@ function default.get_locked_chest_formspec(pos) return formspec end +local function has_locked_chest_privilege(meta, player) + if player:get_player_name() ~= meta:get_string("owner") then + return false + end + return true +end minetest.register_node("default:chest", { description = "Chest", @@ -767,9 +1138,10 @@ minetest.register_node("default:chest", { legacy_facedir_simple = true, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) local meta = minetest.get_meta(pos) - meta:set_string("formspec",default.chest_formspec) + meta:set_string("formspec", chest_formspec) meta:set_string("infotext", "Chest") local inv = meta:get_inventory() inv:set_size("main", 8*4) @@ -793,12 +1165,7 @@ minetest.register_node("default:chest", { end, }) -local function has_locked_chest_privilege(meta, player) - if player:get_player_name() ~= meta:get_string("owner") then - return false - end - return true -end + minetest.register_node("default:chest_locked", { description = "Locked Chest", @@ -809,6 +1176,7 @@ minetest.register_node("default:chest_locked", { legacy_facedir_simple = true, is_ground_content = false, sounds = default.node_sound_wood_defaults(), + after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) meta:set_string("owner", placer:get_player_name() or "") @@ -862,91 +1230,180 @@ minetest.register_node("default:chest_locked", { minetest.show_formspec( clicker:get_player_name(), "default:chest_locked", - default.get_locked_chest_formspec(pos) + get_locked_chest_formspec(pos) ) end end, }) -minetest.register_node("default:cobble", { - description = "Cobblestone", - tiles = {"default_cobble.png"}, - is_ground_content = true, - groups = {cracky=3, stone=2}, - sounds = default.node_sound_stone_defaults(), + + +local bookshelf_formspec = + "size[8,7;]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;books;0,0.3;8,2;]".. + "list[current_player;main;0,2.85;8,1;]".. + "list[current_player;main;0,4.08;8,3;8]".. + default.get_hotbar_bg(0,2.85) + +minetest.register_node("default:bookshelf", { + description = "Bookshelf", + tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"}, + is_ground_content = false, + groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3}, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", bookshelf_formspec) + local inv = meta:get_inventory() + inv:set_size("books", 8*2) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("books") + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local to_stack = inv:get_stack(listname, index) + if listname == "books" then + if minetest.get_item_group(stack:get_name(), "book") ~= 0 + and to_stack:is_empty() then + return 1 + else + return 0 + end + end + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + local to_stack = inv:get_stack(to_list, to_index) + if to_list == "books" then + if stack:get_name() == "default:book" and to_stack:is_empty() then + return 1 + else + return 0 + end + end + end, + + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in bookshelf at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to bookshelf at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from bookshelf at "..minetest.pos_to_string(pos)) + end, }) -minetest.register_node("default:desert_cobble", { - description = "Desert Cobblestone", - tiles = {"default_desert_cobble.png"}, - is_ground_content = true, - groups = {cracky=3, stone=2}, - sounds = default.node_sound_stone_defaults(), + + +minetest.register_node("default:sign_wall", { + description = "Sign", + drawtype = "nodebox", + tiles = {"default_sign.png"}, + inventory_image = "default_sign_wall.png", + wield_image = "default_sign_wall.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + node_box = { + type = "wallmounted", + wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, + wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, + wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, + }, + groups = {choppy=2,dig_immediate=2,attached_node=1}, + legacy_wallmounted = true, + sounds = default.node_sound_defaults(), + + on_construct = function(pos) + --local n = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "field[text;;${text}]") + meta:set_string("infotext", "\"\"") + end, + on_receive_fields = function(pos, formname, fields, sender) + --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields)) + if minetest.is_protected(pos, sender:get_player_name()) then + minetest.record_protection_violation(pos, sender:get_player_name()) + return + end + local meta = minetest.get_meta(pos) + if not fields.text then return end + minetest.log("action", (sender:get_player_name() or "").." wrote \""..fields.text.. + "\" to sign at "..minetest.pos_to_string(pos)) + meta:set_string("text", fields.text) + meta:set_string("infotext", '"'..fields.text..'"') + end, }) -minetest.register_node("default:mossycobble", { - description = "Mossy Cobblestone", - tiles = {"default_mossycobble.png"}, - is_ground_content = true, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), +minetest.register_node("default:ladder", { + description = "Ladder", + drawtype = "signlike", + tiles = {"default_ladder.png"}, + inventory_image = "default_ladder.png", + wield_image = "default_ladder.png", + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {choppy=2,oddly_breakable_by_hand=3,flammable=2}, + legacy_wallmounted = true, + sounds = default.node_sound_wood_defaults(), }) -minetest.register_node("default:coalblock", { - description = "Coal Block", - tiles = {"default_coal_block.png"}, - is_ground_content = true, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), +local fence_texture = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126" +minetest.register_node("default:fence_wood", { + description = "Wooden Fence", + drawtype = "fencelike", + tiles = {"default_wood.png"}, + inventory_image = fence_texture, + wield_image = fence_texture, + paramtype = "light", + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2}, + sounds = default.node_sound_wood_defaults(), }) -minetest.register_node("default:steelblock", { - description = "Steel Block", - tiles = {"default_steel_block.png"}, - is_ground_content = true, - groups = {cracky=1,level=2}, - sounds = default.node_sound_stone_defaults(), -}) -minetest.register_node("default:copperblock", { - description = "Copper Block", - tiles = {"default_copper_block.png"}, - is_ground_content = true, - groups = {cracky=1,level=2}, - sounds = default.node_sound_stone_defaults(), -}) -minetest.register_node("default:bronzeblock", { - description = "Bronze Block", - tiles = {"default_bronze_block.png"}, - is_ground_content = true, - groups = {cracky=1,level=2}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:mese", { - description = "Mese Block", - tiles = {"default_mese_block.png"}, - is_ground_content = true, - groups = {cracky=1,level=2}, - sounds = default.node_sound_stone_defaults(), -}) -minetest.register_alias("default:mese_block", "default:mese") - -minetest.register_node("default:goldblock", { - description = "Gold Block", - tiles = {"default_gold_block.png"}, - is_ground_content = true, - groups = {cracky=1}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:diamondblock", { - description = "Diamond Block", - tiles = {"default_diamond_block.png"}, - is_ground_content = true, - groups = {cracky=1,level=3}, - sounds = default.node_sound_stone_defaults(), +minetest.register_node("default:glass", { + description = "Glass", + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png", "default_glass_detail.png"}, + inventory_image = minetest.inventorycube("default_glass.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), }) minetest.register_node("default:obsidian_glass", { @@ -960,19 +1417,44 @@ minetest.register_node("default:obsidian_glass", { groups = {cracky=3,oddly_breakable_by_hand=3}, }) -minetest.register_node("default:obsidian", { - description = "Obsidian", - tiles = {"default_obsidian.png"}, - is_ground_content = true, - sounds = default.node_sound_stone_defaults(), - groups = {cracky=1,level=2}, + + +minetest.register_node("default:rail", { + description = "Rail", + drawtype = "raillike", + tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"}, + inventory_image = "default_rail.png", + wield_image = "default_rail.png", + paramtype = "light", + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + -- but how to specify the dimensions for curved and sideways rails? + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {bendy=2,dig_immediate=2,attached_node=1}, }) -minetest.register_node("default:obsidianbrick", { - description = "Obsidian Brick", - tiles = {"default_obsidian_brick.png"}, + + +minetest.register_node("default:brick", { + description = "Brick Block", + tiles = {"default_brick.png"}, + is_ground_content = false, + groups = {cracky=3}, sounds = default.node_sound_stone_defaults(), - groups = {cracky=1,level=2}, +}) + +-- +-- Misc +-- + +minetest.register_node("default:cloud", { + description = "Cloud", + tiles = {"default_cloud.png"}, + sounds = default.node_sound_defaults(), + groups = {not_in_creative_inventory=1}, }) minetest.register_node("default:nyancat", { @@ -988,233 +1470,12 @@ minetest.register_node("default:nyancat", { minetest.register_node("default:nyancat_rainbow", { description = "Nyan Cat Rainbow", - tiles = {"default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90", - "default_nc_rb.png", "default_nc_rb.png"}, + tiles = { + "default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90", + "default_nc_rb.png", "default_nc_rb.png" + }, paramtype2 = "facedir", groups = {cracky=2}, is_ground_content = false, sounds = default.node_sound_defaults(), }) - -minetest.register_node("default:sapling", { - description = "Sapling", - drawtype = "plantlike", - visual_scale = 1.0, - tiles = {"default_sapling.png"}, - inventory_image = "default_sapling.png", - wield_image = "default_sapling.png", - paramtype = "light", - walkable = false, - is_ground_content = true, - selection_box = { - type = "fixed", - fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} - }, - groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, - sounds = default.node_sound_leaves_defaults(), -}) - -minetest.register_node("default:apple", { - description = "Apple", - drawtype = "plantlike", - visual_scale = 1.0, - tiles = {"default_apple.png"}, - inventory_image = "default_apple.png", - paramtype = "light", - sunlight_propagates = true, - walkable = false, - is_ground_content = true, - selection_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} - }, - groups = {fleshy=3,dig_immediate=3,flammable=2,leafdecay=3,leafdecay_drop=1}, - on_use = minetest.item_eat(1), - sounds = default.node_sound_leaves_defaults(), - after_place_node = function(pos, placer, itemstack) - if placer:is_player() then - minetest.set_node(pos, {name="default:apple", param2=1}) - end - end, -}) - -minetest.register_node("default:dry_shrub", { - description = "Dry Shrub", - drawtype = "plantlike", - waving = 1, - visual_scale = 1.0, - tiles = {"default_dry_shrub.png"}, - inventory_image = "default_dry_shrub.png", - wield_image = "default_dry_shrub.png", - paramtype = "light", - walkable = false, - is_ground_content = true, - buildable_to = true, - groups = {snappy=3,flammable=3,attached_node=1}, - sounds = default.node_sound_leaves_defaults(), - selection_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, - }, -}) - -minetest.register_node("default:grass_1", { - description = "Grass", - drawtype = "plantlike", - waving = 1, - tiles = {"default_grass_1.png"}, - -- use a bigger inventory image - inventory_image = "default_grass_3.png", - wield_image = "default_grass_3.png", - paramtype = "light", - walkable = false, - is_ground_content = true, - buildable_to = true, - groups = {snappy=3,flammable=3,flora=1,attached_node=1}, - sounds = default.node_sound_leaves_defaults(), - selection_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, - }, - on_place = function(itemstack, placer, pointed_thing) - -- place a random grass node - local stack = ItemStack("default:grass_"..math.random(1,5)) - local ret = minetest.item_place(stack, placer, pointed_thing) - return ItemStack("default:grass_1 "..itemstack:get_count()-(1-ret:get_count())) - end, -}) - -for i=2,5 do - minetest.register_node("default:grass_"..i, { - description = "Grass", - drawtype = "plantlike", - waving = 1, - tiles = {"default_grass_"..i..".png"}, - inventory_image = "default_grass_"..i..".png", - wield_image = "default_grass_"..i..".png", - paramtype = "light", - walkable = false, - buildable_to = true, - is_ground_content = true, - drop = "default:grass_1", - groups = {snappy=3,flammable=3,flora=1,attached_node=1,not_in_creative_inventory=1}, - sounds = default.node_sound_leaves_defaults(), - selection_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, - }, - }) -end - -minetest.register_node("default:ice", { - description = "Ice", - tiles = {"default_ice.png"}, - is_ground_content = true, - paramtype = "light", - groups = {cracky=3}, - sounds = default.node_sound_glass_defaults(), -}) - -minetest.register_node("default:snow", { - description = "Snow", - tiles = {"default_snow.png"}, - inventory_image = "default_snowball.png", - wield_image = "default_snowball.png", - is_ground_content = true, - paramtype = "light", - buildable_to = true, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, -0.5+2/16, 0.5}, - }, - }, - groups = {crumbly=3,falling_node=1}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_snow_footstep", gain=0.25}, - dug = {name="default_snow_footstep", gain=0.75}, - }), - on_construct = function(pos) - pos.y = pos.y - 1 - if minetest.get_node(pos).name == "default:dirt_with_grass" then - minetest.set_node(pos, {name="default:dirt_with_snow"}) - end - end, -}) -minetest.register_alias("snow", "default:snow") - -minetest.register_node("default:snowblock", { - description = "Snow Block", - tiles = {"default_snow.png"}, - is_ground_content = true, - groups = {crumbly=3}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_snow_footstep", gain=0.25}, - dug = {name="default_snow_footstep", gain=0.75}, - }), -}) - -minetest.register_node("default:pine_needles",{ - description = "Pine Needles", - drawtype = "allfaces_optional", - visual_scale = 1.3, - tiles = {"default_pine_needles.png"}, - waving = 1, - paramtype = "light", - is_ground_content = false, - groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, - drop = { - max_items = 1, - items = { - { - -- player will get sapling with 1/20 chance - items = {"default:pine_sapling"}, - rarity = 20, - }, - { - -- player will get leaves only if he get no saplings, - -- this is because max_items is 1 - items = {"default:pine_needles"}, - } - } - }, - sounds = default.node_sound_leaves_defaults(), - after_place_node = default.after_place_leaves, -}) - -minetest.register_node("default:pine_sapling", { - description = "Pine Sapling", - drawtype = "plantlike", - visual_scale = 1.0, - tiles = {"default_pine_sapling.png"}, - inventory_image = "default_pine_sapling.png", - wield_image = "default_pine_sapling.png", - paramtype = "light", - walkable = false, - is_ground_content = true, - selection_box = { - type = "fixed", - fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} - }, - groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, - sounds = default.node_sound_leaves_defaults(), -}) - -minetest.register_node("default:pinetree", { - description = "Pine Tree", - tiles = {"default_pinetree_top.png", "default_pinetree_top.png", "default_pinetree.png"}, - paramtype2 = "facedir", - is_ground_content = false, - groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, - sounds = default.node_sound_wood_defaults(), - on_place = minetest.rotate_node -}) - -minetest.register_node("default:pinewood", { - description = "Pinewood Planks", - tiles = {"default_pinewood.png"}, - groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, - sounds = default.node_sound_wood_defaults(), -}) - From 4ce47528e1f729e65f314b8b1ea68cc88ab3f326 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Fri, 12 Dec 2014 17:47:31 +0100 Subject: [PATCH 0085/2261] Clarify comment in default:grass_1 --- 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 3d328399..cccf06e0 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -811,7 +811,7 @@ minetest.register_node("default:grass_1", { drawtype = "plantlike", waving = 1, tiles = {"default_grass_1.png"}, - -- use a bigger inventory image + -- Use texture of a taller grass stage in inventory inventory_image = "default_grass_3.png", wield_image = "default_grass_3.png", paramtype = "light", From 3689bdad75a62e1aaf10444778fe691c34a76ea2 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Mon, 15 Dec 2014 13:27:20 +0100 Subject: [PATCH 0086/2261] Fix typo in water_flowing tile animation Also add missing commas and use non-deprecated field-names --- mods/default/nodes.lua | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index cccf06e0..ddf92332 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -870,7 +870,7 @@ minetest.register_node("default:water_source", { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 2.0 + length = 2.0, }, }, }, @@ -882,7 +882,7 @@ minetest.register_node("default:water_source", { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 2.0 + length = 2.0, }, backface_culling = false, }, @@ -910,23 +910,23 @@ minetest.register_node("default:water_flowing", { tiles = {"default_water.png"}, special_tiles = { { - image = "default_water_flowing_animated.png", + name = "default_water_flowing_animated.png", backface_culling = false, animation = { - type =" vertical_frames", + type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 0.8 + length = 0.8, }, }, { - image = "default_water_flowing_animated.png", + name = "default_water_flowing_animated.png", backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 0.8 + length = 0.8, }, }, }, @@ -960,7 +960,7 @@ minetest.register_node("default:lava_source", { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 3.0 + length = 3.0, }, }, }, @@ -972,7 +972,7 @@ minetest.register_node("default:lava_source", { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 3.0 + length = 3.0, }, backface_culling = false, }, @@ -1002,23 +1002,23 @@ minetest.register_node("default:lava_flowing", { tiles = {"default_lava.png"}, special_tiles = { { - image = "default_lava_flowing_animated.png", + name = "default_lava_flowing_animated.png", backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 3.3 + length = 3.3, }, }, { - image = "default_lava_flowing_animated.png", + name = "default_lava_flowing_animated.png", backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 3.3 + length = 3.3, }, }, }, From d546a5a1fa846945b409c9b74bd84732a4c3b11e Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 11 Jan 2015 10:13:30 +0000 Subject: [PATCH 0087/2261] Return to original water sink speed for player --- minetest.conf | 3 --- 1 file changed, 3 deletions(-) diff --git a/minetest.conf b/minetest.conf index cda1589f..6b27e02e 100644 --- a/minetest.conf +++ b/minetest.conf @@ -1,6 +1,3 @@ mg_flags = dungeons mgv6_spflags = biomeblend, jungles -movement_liquid_sink = 25 -movement_liquid_fluidity = 0.8 -movement_liquid_fluidity_smooth = 2 From 07dcae72588f04dc6910241dfba7c619323435ee Mon Sep 17 00:00:00 2001 From: Craig Davison Date: Wed, 24 Dec 2014 19:54:24 +0000 Subject: [PATCH 0088/2261] Add fancy inventory for bones --- mods/bones/init.lua | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 0f762573..03ed61d6 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -1,6 +1,8 @@ -- Minetest 0.4 mod: bones -- See README.txt for licensing and other information. +bones = {} + local function is_owner(pos, name) local owner = minetest.get_meta(pos):get_string("owner") if owner == "" or owner == name then @@ -9,6 +11,16 @@ local function is_owner(pos, name) return false end +bones.bones_formspec = + "size[8,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;main;0,0.3;8,4;]".. + "list[current_player;main;0,4.85;8,1;]".. + "list[current_player;main;0,6.08;8,3;8]".. + default.get_hotbar_bg(0,4.85) + minetest.register_node("bones:bones", { description = "Bones", tiles = { @@ -158,9 +170,7 @@ minetest.register_on_dieplayer(function(player) player_inv:set_list("main", {}) player_inv:set_list("craft", {}) - meta:set_string("formspec", "size[8,9;]".. - "list[current_name;main;0,0;8,4;]".. - "list[current_player;main;0,5;8,4;]") + meta:set_string("formspec", bones.bones_formspec) meta:set_string("infotext", player_name.."'s fresh bones") meta:set_string("owner", player_name) meta:set_int("time", 0) From 61579827875f42a08797229895a2fc2ad8bc3355 Mon Sep 17 00:00:00 2001 From: Craig Davison Date: Sat, 10 Jan 2015 17:02:47 +0000 Subject: [PATCH 0089/2261] Follow naming convention of textures and sounds in doors --- mods/doors/init.lua | 54 ++++++------------ .../{door_close.ogg => doors_door_close.ogg} | Bin .../{door_open.ogg => doors_door_open.ogg} | Bin .../{door_brown.png => doors_brown.png} | Bin .../{door_glass.png => doors_glass.png} | Bin .../{door_glass_a.png => doors_glass_a.png} | Bin .../{door_glass_b.png => doors_glass_b.png} | Bin ...or_glass_side.png => doors_glass_side.png} | Bin .../{door_grey.png => doors_grey.png} | Bin ...ian_glass.png => doors_obsidian_glass.png} | Bin ...glass_a.png => doors_obsidian_glass_a.png} | Bin ...glass_b.png => doors_obsidian_glass_b.png} | Bin ...side.png => doors_obsidian_glass_side.png} | Bin .../{door_steel.png => doors_steel.png} | Bin .../{door_steel_a.png => doors_steel_a.png} | Bin .../{door_steel_b.png => doors_steel_b.png} | Bin .../{door_trapdoor.png => doors_trapdoor.png} | Bin ...pdoor_side.png => doors_trapdoor_side.png} | Bin .../{door_wood.png => doors_wood.png} | Bin .../{door_wood_a.png => doors_wood_a.png} | Bin .../{door_wood_b.png => doors_wood_b.png} | Bin 21 files changed, 19 insertions(+), 35 deletions(-) rename mods/doors/sounds/{door_close.ogg => doors_door_close.ogg} (100%) rename mods/doors/sounds/{door_open.ogg => doors_door_open.ogg} (100%) rename mods/doors/textures/{door_brown.png => doors_brown.png} (100%) rename mods/doors/textures/{door_glass.png => doors_glass.png} (100%) rename mods/doors/textures/{door_glass_a.png => doors_glass_a.png} (100%) rename mods/doors/textures/{door_glass_b.png => doors_glass_b.png} (100%) rename mods/doors/textures/{door_glass_side.png => doors_glass_side.png} (100%) rename mods/doors/textures/{door_grey.png => doors_grey.png} (100%) rename mods/doors/textures/{door_obsidian_glass.png => doors_obsidian_glass.png} (100%) rename mods/doors/textures/{door_obsidian_glass_a.png => doors_obsidian_glass_a.png} (100%) rename mods/doors/textures/{door_obsidian_glass_b.png => doors_obsidian_glass_b.png} (100%) rename mods/doors/textures/{door_obsidian_glass_side.png => doors_obsidian_glass_side.png} (100%) rename mods/doors/textures/{door_steel.png => doors_steel.png} (100%) rename mods/doors/textures/{door_steel_a.png => doors_steel_a.png} (100%) rename mods/doors/textures/{door_steel_b.png => doors_steel_b.png} (100%) rename mods/doors/textures/{door_trapdoor.png => doors_trapdoor.png} (100%) rename mods/doors/textures/{door_trapdoor_side.png => doors_trapdoor_side.png} (100%) rename mods/doors/textures/{door_wood.png => doors_wood.png} (100%) rename mods/doors/textures/{door_wood_a.png => doors_wood_a.png} (100%) rename mods/doors/textures/{door_wood_b.png => doors_wood_b.png} (100%) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index c82de236..034179a2 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -1,22 +1,6 @@ doors = {} -- Registers a door --- name: The name of the door --- def: a table with the folowing fields: --- description --- inventory_image --- groups --- tiles_bottom: the tiles of the bottom part of the door {front, side} --- tiles_top: the tiles of the bottom part of the door {front, side} --- If the following fields are not defined the default values are used --- node_box_bottom --- node_box_top --- selection_box_bottom --- selection_box_top --- only_placer_can_open: if true only the player who placed the door can --- open it - - function doors.register_door(name, def) def.groups.not_in_creative_inventory = 1 @@ -36,10 +20,10 @@ function doors.register_door(name, def) end if not def.sound_close_door then - def.sound_close_door = "door_close" + def.sound_close_door = "doors_door_close" end if not def.sound_open_door then - def.sound_open_door = "door_open" + def.sound_open_door = "doors_door_open" end @@ -292,10 +276,10 @@ end doors.register_door("doors:door_wood", { description = "Wooden Door", - inventory_image = "door_wood.png", + inventory_image = "doors_wood.png", groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1}, - tiles_bottom = {"door_wood_b.png", "door_brown.png"}, - tiles_top = {"door_wood_a.png", "door_brown.png"}, + tiles_bottom = {"doors_wood_b.png", "doors_brown.png"}, + tiles_top = {"doors_wood_a.png", "doors_brown.png"}, sounds = default.node_sound_wood_defaults(), sunlight = false, }) @@ -311,10 +295,10 @@ minetest.register_craft({ doors.register_door("doors:door_steel", { description = "Steel Door", - inventory_image = "door_steel.png", + inventory_image = "doors_steel.png", groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2,door=1}, - tiles_bottom = {"door_steel_b.png", "door_grey.png"}, - tiles_top = {"door_steel_a.png", "door_grey.png"}, + tiles_bottom = {"doors_steel_b.png", "doors_grey.png"}, + tiles_top = {"doors_steel_a.png", "doors_grey.png"}, only_placer_can_open = true, sounds = default.node_sound_wood_defaults(), sunlight = false, @@ -331,10 +315,10 @@ minetest.register_craft({ doors.register_door("doors:door_glass", { description = "Glass Door", - inventory_image = "door_glass.png", + inventory_image = "doors_glass.png", groups = {snappy=1,cracky=1,oddly_breakable_by_hand=3,door=1}, - tiles_bottom = {"door_glass_b.png", "door_glass_side.png"}, - tiles_top = {"door_glass_a.png", "door_glass_side.png"}, + tiles_bottom = {"doors_glass_b.png", "doors_glass_side.png"}, + tiles_top = {"doors_glass_a.png", "doors_glass_side.png"}, sounds = default.node_sound_glass_defaults(), sunlight = true, }) @@ -350,10 +334,10 @@ minetest.register_craft({ doors.register_door("doors:door_obsidian_glass", { description = "Obsidian Glass Door", - inventory_image = "door_obsidian_glass.png", + inventory_image = "doors_obsidian_glass.png", groups = {snappy=1,cracky=1,oddly_breakable_by_hand=3,door=1}, - tiles_bottom = {"door_obsidian_glass_b.png", "door_obsidian_glass_side.png"}, - tiles_top = {"door_obsidian_glass_b.png", "door_obsidian_glass_side.png"}, + tiles_bottom = {"doors_obsidian_glass_b.png", "doors_obsidian_glass_side.png"}, + tiles_top = {"doors_obsidian_glass_b.png", "doors_obsidian_glass_side.png"}, sounds = default.node_sound_glass_defaults(), sunlight = true, }) @@ -382,11 +366,11 @@ local function punch(pos) local tmp_node2 if state == 1 then state = 0 - minetest.sound_play("door_close", {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.sound_play("doors_door_close", {pos = pos, gain = 0.3, max_hear_distance = 10}) tmp_node = {name="doors:trapdoor", param1=me.param1, param2=me.param2} else state = 1 - minetest.sound_play("door_open", {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.sound_play("doors_door_open", {pos = pos, gain = 0.3, max_hear_distance = 10}) tmp_node = {name="doors:trapdoor_open", param1=me.param1, param2=me.param2} end update_door(pos, tmp_node) @@ -395,9 +379,9 @@ end minetest.register_node("doors:trapdoor", { description = "Trapdoor", - inventory_image = "door_trapdoor.png", + inventory_image = "doors_trapdoor.png", drawtype = "nodebox", - tiles = {"door_trapdoor.png", "door_trapdoor.png", "door_trapdoor_side.png", "door_trapdoor_side.png", "door_trapdoor_side.png", "door_trapdoor_side.png"}, + tiles = {"doors_trapdoor.png", "doors_trapdoor.png", "doors_trapdoor_side.png", "doors_trapdoor_side.png", "doors_trapdoor_side.png", "doors_trapdoor_side.png"}, paramtype = "light", paramtype2 = "facedir", groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1}, @@ -421,7 +405,7 @@ minetest.register_node("doors:trapdoor", { minetest.register_node("doors:trapdoor_open", { drawtype = "nodebox", - tiles = {"door_trapdoor_side.png", "door_trapdoor_side.png", "door_trapdoor_side.png", "door_trapdoor_side.png", "door_trapdoor.png", "door_trapdoor.png"}, + tiles = {"doors_trapdoor_side.png", "doors_trapdoor_side.png", "doors_trapdoor_side.png", "doors_trapdoor_side.png", "doors_trapdoor.png", "doors_trapdoor.png"}, paramtype = "light", paramtype2 = "facedir", pointable = true, diff --git a/mods/doors/sounds/door_close.ogg b/mods/doors/sounds/doors_door_close.ogg similarity index 100% rename from mods/doors/sounds/door_close.ogg rename to mods/doors/sounds/doors_door_close.ogg diff --git a/mods/doors/sounds/door_open.ogg b/mods/doors/sounds/doors_door_open.ogg similarity index 100% rename from mods/doors/sounds/door_open.ogg rename to mods/doors/sounds/doors_door_open.ogg diff --git a/mods/doors/textures/door_brown.png b/mods/doors/textures/doors_brown.png similarity index 100% rename from mods/doors/textures/door_brown.png rename to mods/doors/textures/doors_brown.png diff --git a/mods/doors/textures/door_glass.png b/mods/doors/textures/doors_glass.png similarity index 100% rename from mods/doors/textures/door_glass.png rename to mods/doors/textures/doors_glass.png diff --git a/mods/doors/textures/door_glass_a.png b/mods/doors/textures/doors_glass_a.png similarity index 100% rename from mods/doors/textures/door_glass_a.png rename to mods/doors/textures/doors_glass_a.png diff --git a/mods/doors/textures/door_glass_b.png b/mods/doors/textures/doors_glass_b.png similarity index 100% rename from mods/doors/textures/door_glass_b.png rename to mods/doors/textures/doors_glass_b.png diff --git a/mods/doors/textures/door_glass_side.png b/mods/doors/textures/doors_glass_side.png similarity index 100% rename from mods/doors/textures/door_glass_side.png rename to mods/doors/textures/doors_glass_side.png diff --git a/mods/doors/textures/door_grey.png b/mods/doors/textures/doors_grey.png similarity index 100% rename from mods/doors/textures/door_grey.png rename to mods/doors/textures/doors_grey.png diff --git a/mods/doors/textures/door_obsidian_glass.png b/mods/doors/textures/doors_obsidian_glass.png similarity index 100% rename from mods/doors/textures/door_obsidian_glass.png rename to mods/doors/textures/doors_obsidian_glass.png diff --git a/mods/doors/textures/door_obsidian_glass_a.png b/mods/doors/textures/doors_obsidian_glass_a.png similarity index 100% rename from mods/doors/textures/door_obsidian_glass_a.png rename to mods/doors/textures/doors_obsidian_glass_a.png diff --git a/mods/doors/textures/door_obsidian_glass_b.png b/mods/doors/textures/doors_obsidian_glass_b.png similarity index 100% rename from mods/doors/textures/door_obsidian_glass_b.png rename to mods/doors/textures/doors_obsidian_glass_b.png diff --git a/mods/doors/textures/door_obsidian_glass_side.png b/mods/doors/textures/doors_obsidian_glass_side.png similarity index 100% rename from mods/doors/textures/door_obsidian_glass_side.png rename to mods/doors/textures/doors_obsidian_glass_side.png diff --git a/mods/doors/textures/door_steel.png b/mods/doors/textures/doors_steel.png similarity index 100% rename from mods/doors/textures/door_steel.png rename to mods/doors/textures/doors_steel.png diff --git a/mods/doors/textures/door_steel_a.png b/mods/doors/textures/doors_steel_a.png similarity index 100% rename from mods/doors/textures/door_steel_a.png rename to mods/doors/textures/doors_steel_a.png diff --git a/mods/doors/textures/door_steel_b.png b/mods/doors/textures/doors_steel_b.png similarity index 100% rename from mods/doors/textures/door_steel_b.png rename to mods/doors/textures/doors_steel_b.png diff --git a/mods/doors/textures/door_trapdoor.png b/mods/doors/textures/doors_trapdoor.png similarity index 100% rename from mods/doors/textures/door_trapdoor.png rename to mods/doors/textures/doors_trapdoor.png diff --git a/mods/doors/textures/door_trapdoor_side.png b/mods/doors/textures/doors_trapdoor_side.png similarity index 100% rename from mods/doors/textures/door_trapdoor_side.png rename to mods/doors/textures/doors_trapdoor_side.png diff --git a/mods/doors/textures/door_wood.png b/mods/doors/textures/doors_wood.png similarity index 100% rename from mods/doors/textures/door_wood.png rename to mods/doors/textures/doors_wood.png diff --git a/mods/doors/textures/door_wood_a.png b/mods/doors/textures/doors_wood_a.png similarity index 100% rename from mods/doors/textures/door_wood_a.png rename to mods/doors/textures/doors_wood_a.png diff --git a/mods/doors/textures/door_wood_b.png b/mods/doors/textures/doors_wood_b.png similarity index 100% rename from mods/doors/textures/door_wood_b.png rename to mods/doors/textures/doors_wood_b.png From 5d8b2442ce6238bb1bf662166341f6254e911ef5 Mon Sep 17 00:00:00 2001 From: "jeanpatrick.guerrero@gmail.com" Date: Mon, 12 Jan 2015 20:21:06 +0100 Subject: [PATCH 0090/2261] Add straw --- mods/farming/README.txt | 3 +++ mods/farming/init.lua | 17 +++++++++++++++++ mods/farming/nodes.lua | 8 ++++++++ mods/farming/textures/farming_straw.png | Bin 0 -> 892 bytes 4 files changed, 28 insertions(+) create mode 100644 mods/farming/textures/farming_straw.png diff --git a/mods/farming/README.txt b/mods/farming/README.txt index 4663181a..7bfc195c 100644 --- a/mods/farming/README.txt +++ b/mods/farming/README.txt @@ -57,3 +57,6 @@ Created by VanessaE (License: WTFPL): farming_cotton_6.png farming_cotton_7.png farming_cotton_8.png + +Created by MasterGollum (License: WTFPL): + farming_straw.png \ No newline at end of file diff --git a/mods/farming/init.lua b/mods/farming/init.lua index d3157a07..8606e94a 100644 --- a/mods/farming/init.lua +++ b/mods/farming/init.lua @@ -59,3 +59,20 @@ minetest.register_craft({ {"farming:cotton", "farming:cotton"}, } }) + +-- Straw +minetest.register_craft({ + output = "farming:straw 3", + recipe = { + {"farming:wheat", "farming:wheat", "farming:wheat"}, + {"farming:wheat", "farming:wheat", "farming:wheat"}, + {"farming:wheat", "farming:wheat", "farming:wheat"}, + } +}) + +minetest.register_craft({ + output = "farming:wheat 3", + recipe = { + {"farming:straw"}, + } +}) diff --git a/mods/farming/nodes.lua b/mods/farming/nodes.lua index a99f5051..6d25598b 100644 --- a/mods/farming/nodes.lua +++ b/mods/farming/nodes.lua @@ -80,6 +80,14 @@ minetest.register_node("farming:desert_sand_soil_wet", { } }) +minetest.register_node("farming:straw", { + description = "Straw", + tiles = {"farming_straw.png"}, + is_ground_content = false, + groups = {snappy=3, flammable=4}, + sounds = default.node_sound_leaves_defaults(), +}) + minetest.register_abm({ nodenames = {"group:field"}, interval = 15, diff --git a/mods/farming/textures/farming_straw.png b/mods/farming/textures/farming_straw.png new file mode 100644 index 0000000000000000000000000000000000000000..e4277723b128e9845d427fb22c6bffafd7292565 GIT binary patch literal 892 zcmV-?1B3jDP)zAAqFsmt5n?&*{zmPJ9FmS}fu#KGe9b zh&FwWw2Y$OMdVUMIF@m12GebmTEioW4{YNWPoFE0>6BHO&ws73ECr`lAXM;oHJqx6 zu#HoyPma0#p~-fma{BcbC`A)pTOyn_g`yH9D^A)~j?c@4i-3! zNHY|BgOrEpRT;aa!S;ZZ>-a;3B2RG4F~LkhYy(=|C5zb_fn+jzSboK&?-};%l-eE! z3H$Ms$%Bu$c`wmwyA0oN=v{QMYjr-{q^!e?e?FFxr9PM6t~l&`TD2HmU1D~?k4>B- z6_KuE7PB261`g~KiZDcTJc=Y@@vx*-H>i3QHp_%odri0+^5QHbo&=no+X&aK5Dfms zamxg=CBf7o+wBqJIm2O0p&j`9_Z-{SNz^LE+GCj-Pz6 zcb{OZ2+sD9t2So3MNvyECnJ{03Q_O&$PO-!J>&M)!j#+W_Ei>fh3TWo%C~vac*@2v zGnqHJ`_JRq%O=Gpq2nru!L^EPJ~HZ0DD;F)G-f&zM0=l`KQ`n{(6R;b-oPK;a@>d* z+)2nKm1@^U1X+YGA937!O)wavOA(5^B?~j0&JIlpDH=9!-rSQ$GSwrKq)0ew&baTZ z2um2O*K0bLHCheOJcC14LsANww!@d-T@ej7l=Xlory*9Q$2RCwv7RCFkpBT>mv7$x S>1I#>0000 Date: Tue, 20 Jan 2015 16:48:43 -0500 Subject: [PATCH 0091/2261] Mossycobble fixes --- mods/default/crafting.lua | 6 ++++++ mods/default/nodes.lua | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index c8839ec4..71f00a7e 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -650,6 +650,12 @@ minetest.register_craft({ recipe = "default:cobble", }) +minetest.register_craft({ + type = "cooking", + output = "default:stone", + recipe = "default:mossycobble", +}) + minetest.register_craft({ type = "cooking", output = "default:desert_stone", diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index ddf92332..49e0524e 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -168,7 +168,7 @@ minetest.register_node("default:mossycobble", { description = "Mossy Cobblestone", tiles = {"default_mossycobble.png"}, is_ground_content = true, - groups = {cracky=3}, + groups = {cracky=3, stone=1}, sounds = default.node_sound_stone_defaults(), }) From 4468015cbe956a48875b3faad6561ac4220468e8 Mon Sep 17 00:00:00 2001 From: Xanthin Date: Thu, 22 Jan 2015 22:30:30 +0100 Subject: [PATCH 0092/2261] Fix typo for obsidian glass door texture I think that was just a typo? --- mods/doors/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 034179a2..2fc0ed3f 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -337,7 +337,7 @@ doors.register_door("doors:door_obsidian_glass", { inventory_image = "doors_obsidian_glass.png", groups = {snappy=1,cracky=1,oddly_breakable_by_hand=3,door=1}, tiles_bottom = {"doors_obsidian_glass_b.png", "doors_obsidian_glass_side.png"}, - tiles_top = {"doors_obsidian_glass_b.png", "doors_obsidian_glass_side.png"}, + tiles_top = {"doors_obsidian_glass_a.png", "doors_obsidian_glass_side.png"}, sounds = default.node_sound_glass_defaults(), sunlight = true, }) From 5518c277f31800d407ddf2af8b64e532a85f7533 Mon Sep 17 00:00:00 2001 From: "jeanpatrick.guerrero@gmail.com" Date: Sun, 18 Jan 2015 22:38:58 +0100 Subject: [PATCH 0093/2261] Textures Update --- mods/default/README.txt | 21 ++++++++---- .../default/textures/default_bronze_ingot.png | Bin 358 -> 232 bytes mods/default/textures/default_clay_lump.png | Bin 333 -> 167 bytes mods/default/textures/default_coal_lump.png | Bin 243 -> 160 bytes .../default/textures/default_copper_ingot.png | Bin 356 -> 233 bytes mods/default/textures/default_copper_lump.png | Bin 234 -> 177 bytes mods/default/textures/default_gold_lump.png | Bin 199 -> 165 bytes mods/default/textures/default_iron_lump.png | Bin 253 -> 163 bytes .../default/textures/default_mese_crystal.png | Bin 362 -> 237 bytes mods/default/textures/default_paper.png | Bin 327 -> 200 bytes mods/default/textures/default_rail.png | Bin 414 -> 270 bytes .../textures/default_rail_crossing.png | Bin 364 -> 271 bytes mods/default/textures/default_rail_curved.png | Bin 361 -> 259 bytes .../textures/default_rail_t_junction.png | Bin 374 -> 256 bytes mods/farming/README.txt | 32 +++++------------- mods/farming/textures/farming_cotton_1.png | Bin 95 -> 110 bytes mods/farming/textures/farming_cotton_2.png | Bin 119 -> 120 bytes mods/farming/textures/farming_cotton_3.png | Bin 148 -> 147 bytes mods/farming/textures/farming_cotton_4.png | Bin 179 -> 155 bytes mods/farming/textures/farming_cotton_5.png | Bin 221 -> 160 bytes mods/farming/textures/farming_cotton_6.png | Bin 290 -> 164 bytes mods/farming/textures/farming_cotton_7.png | Bin 317 -> 228 bytes mods/farming/textures/farming_cotton_8.png | Bin 289 -> 331 bytes mods/farming/textures/farming_cotton_seed.png | Bin 271 -> 150 bytes mods/farming/textures/farming_flour.png | Bin 335 -> 164 bytes mods/farming/textures/farming_wheat.png | Bin 547 -> 249 bytes mods/farming/textures/farming_wheat_1.png | Bin 105 -> 174 bytes mods/farming/textures/farming_wheat_2.png | Bin 143 -> 220 bytes mods/farming/textures/farming_wheat_3.png | Bin 187 -> 319 bytes mods/farming/textures/farming_wheat_4.png | Bin 227 -> 358 bytes mods/farming/textures/farming_wheat_5.png | Bin 298 -> 409 bytes mods/farming/textures/farming_wheat_6.png | Bin 396 -> 456 bytes mods/farming/textures/farming_wheat_7.png | Bin 479 -> 493 bytes mods/farming/textures/farming_wheat_8.png | Bin 582 -> 577 bytes mods/farming/textures/farming_wheat_seed.png | Bin 325 -> 141 bytes mods/screwdriver/readme.txt | 3 ++ mods/screwdriver/textures/screwdriver.png | Bin 261 -> 182 bytes 37 files changed, 26 insertions(+), 30 deletions(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index 695d3b1f..888aae46 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -67,7 +67,6 @@ VanessaE (WTFPL): Calinou (CC BY-SA): default_brick.png default_papyrus.png - default_copper_lump.png default_mineral_copper.png default_glass_detail.png @@ -83,7 +82,6 @@ PilzAdam (WTFPL): default_junglewood.png default_obsidian_glass.png default_obsidian_shard.png - default_gold_lump.png default_mineral_gold.png default_snowball.png @@ -119,17 +117,15 @@ BlockMen (CC BY-SA 3.0): default_stone_brick.png default_wood.png default_clay_brick.png - default_tool_steelsword.png - default_bronze_ingot.png - default_copper_ingot.png + default_iron_ingot.png default_gold_ingot.png + default_tool_steelsword.png default_diamond.png default_diamond_block.png + default_book.png default_tool_*.png default_lava_source_animated.png default_lava_flowing_animated.png - default_book.png - default_paper.png default_stick.png default_chest_front.png default_chest_lock.png @@ -189,3 +185,14 @@ Mito551 (sounds) (CC BY-SA): default_dirt_footstep.1.ogg default_dirt_footstep.2.ogg default_glass_footstep.ogg + +Gambit (WTFPL): + default_bronze_ingot.png + default_copper_ingot.png + default_copper_lump.png + default_iron_lump.png + default_gold_lump.png + default_clay_lump.png + default_coal.png + default_grass_*.png + default_paper.png diff --git a/mods/default/textures/default_bronze_ingot.png b/mods/default/textures/default_bronze_ingot.png index 527641b2381a92b6d239b674e6225584b55833db..fea0ee104bdc68502344660660355b8166ace735 100644 GIT binary patch delta 215 zcmaFH^n!7MWIZzj1A~Sxe=v};3GfMV1=7`KyzBjhPeus;s#bfN$oYG^@2@7K`R;e&&&R?B&v;7qtUF4rub9yQAqyqIbmIV0)GdMiEkp|>M zdAc};NL-$K&QqvCfyX6qb_Q@MdxH}%t8|5^7}{oBuNuEHdy_ciGj P&>99$S3j3^P6HK~y-)-H|a%0&y6|e`n^&!HF5+4IKn+ zet>Fl2#Fxtq9K~Ht)MZwk8t0@r9B9AFfj+02pszYMqH5@o}ArL{u}I0(o^Sp)|cP& zyzleEpOBf;gqhPs*ep5=1US1m2S7;{g!BH2QMIJ020nOte1E{)l1^k{8R4`!+S@{W z*g#PL7*$J(hJh!CyGU^rDXs$0Z$AQ1xvAlHTIAQ$6z-k@kVZjYJ`8YseFebAY7zk3 zcCl=adea%6kl#sDDwa{^BW!LDR;`sQV_?_)r0eyEL1s=9`ZmQU@WsWH@)OlB>?W$6WdQJx3}UofhcauU6%lmdN^n4Yv$|cqPQ2%EHdz#ZJJeUDbc@Yq^Cx{VpznJz41*ZQ@ppi(>%_7w zVwxt*^9%_A?@|8&C^Hk8j<#)4*EPzrL{St7f`HH00jykA6@Qwhp+U)U9K>-9&-18t z0AI-S98nbE^?Kp?e5y%E7={Yu`~G_XE7It?t}+;gp&F!ViY&`$<~8SgK$0X1ASXC! zp!g5iifh}pVVdUWPmoCjF^QGgMj0*3q7jeB1Dd9N1kg;W`ns;;cDvzzzvFy9<9fX+ zT`rgPeIQc>lQ(EQolZ*o{T|2Tk?WuBM42RHsyG}DLYl>PyA`|L?n@8TKhuR;b+DPL Q$N&HU07*qoM6N<$f>WE5RR910 diff --git a/mods/default/textures/default_coal_lump.png b/mods/default/textures/default_coal_lump.png index 487f45831ae68b0d2fed98ae7aa29f7a9154275e..6b15f34cd6bee03273c1b47d870a2de305c474e5 100644 GIT binary patch delta 144 zcmey&xPWnjL_G^L0|Ud`yN`l^lxToYh%1n`va<5@^mKG|G%+y=3k!2|bF<_%%?C;_ zmIV0)GdMiEkp|>gdb&7t<8 delta 227 zcmZ3$_?dBnL_G&H0|SGGE`KnPatiPXajls9@&Et-!otF$qN1|0vWkj|s;a8$>gt-B zn%dghy1Kgh`ufJk#-^sG=H}*>mX@}*w)Xb+&d$#6?(W{+-v0jnA%fyDK+~8?g8YD{ zmQ6lu0p!Jbx;TbZ-0D4R$=6`O;}STTW%E(*oEX1sVwmZhol%<(dVCnLk!r?^&Ra_k z5K^Y4cgof zha_qViExiVZVsA?Q=0B?a4m?Mf(R;%ipHF(slX*#8k>?p1gSI9yQjswEH9nwyFEPb z=leYG_klklE0Yu}la!#I-U|fS$e92Pgm>hv-XLEnDesNy27l(V>u5?tg+ho3uG2(B z*xcF%AYUjcJqXO2Ybd4Alm>t}4gi;DN7S1QR+iK3off~o&+jU;4}XZVGD$HOriesi^bZXJaCdVJ!1%;u zAb55E^gV-erAXir%^BXpXd|lM2nYiEtYct0000OV delta 218 zcmV<0044vi0qOye7=H)@0000eEe}%w002BtOjJb}d0+qk|5-#XT}LoxPBnsKLx*QZ zk#0(xc2K2#RH%Sgs)Jjrgj}qKU#*8=vyg1Im2d!hs`r1_S$4QDV0Y_EI-fa_Lh z8K8RBT2?qp&N)m-BHSu;*d#JY5_^IIbrv2pULBJ4?7JzG6#g6bn~(Hc&p|dXnc% zKxvQ=i=o8SDOVJE91Rb$Y*^>w==kRuGeeml>w1?pe7#SAhA?=#`njxgN@xNA?H)3k delta 183 zcmV;o07(C(0mlK57=H)@0000eEe}%w001OVOjJb(1pEL0|G1_O# z+r|;#$pGff0PxlT@Yoa3u&U7j0007XQchC<0CtnjH~;_uP)S5VRCwBr%|Q;pAP7WJ zis&HT|Gu4=P)t|O?!S;A&u^C?5)r~BuqSr_+uf~z2_LY8=`d^W11F5JtR^guF zj3q&S!3+-1ZlnP@Hl8kyAsp9}6$A~WrJW_*^77ac7>z|mT@9RFPx?kOoJbJy3KHUB vFp6NE%FKGO%axVY^&pR1pyQus%nXheEQiwWZFtWEG>E~|)z4*}Q$iB}W;iQC delta 237 zcmV>wX~Mx2}#j2|U&qKwvS|wGil(76jC`>>_Z{ n(me#usM-*i1qK2D5CDKbyE-W;{;{@C00000NkvXXu0mjfJ!M~; diff --git a/mods/default/textures/default_mese_crystal.png b/mods/default/textures/default_mese_crystal.png index a17773125b0aead93af48ad2207fdf48fb15c0a0..bd44e89585a5704ff20e483ba02dad219499f952 100644 GIT binary patch delta 220 zcmaFG^p@y%T&4g3 delta 346 zcmV-g0j2)!0qO#f8Gi-<001BJ|6u?C0WnELK~#7F+{`fx0YDgsai4}dWw@l2LMaoA zL0L?SV=@^`B41g@^?1fh%I>XS@AQ8fe|Rti7CP#tyDmzaX~2*1TpOKrt(>&hRFN;^ zKGrqSN=bX|bkJ5yjTCw0HXng8&{N=9T0m5{`W*^Q1@h}%3xC}&%;)XbZrjyuYTuL}H- z5XOY)qNIO$pB%#eNU#sp{5{+f9SL+EPsQ04Aic%R3kVyNFqslsZF;^)o`5TqI9Y}3 zQ+g!b@d&GR22;NfP~)C|lA5J&cZB(Z;UY>}Z77k>~00{{R3?cL&10000dP)t-s0002i*4E0(%HQALv$M0PsHl~d zm4=3ff`Wp)yu6#6o6ykE$jHbC8GoMu0004WQchCcVK0HQ;uxSX*B(Mp;=#>NvESe2Btg^i6DFmNd;Z88)zZU;&&(iRjH2dU){ n6qG0c>s~0{05OIgOk)B7ftL+6FFE-t00000NkvXXu0mjfehNtD delta 313 zcmV-90mlBw0mlN67k?251^@s6)UPbW0003FNklp>a%Zx zid0&y6~v8*;3`CL2{JS0|0mPTREsai-XH--34$;7;c!XF`R*Y%*#Ph-{S(0E_@F2| z7a$GxGoWZ(yti2iQUDaq@zudc1LYZt02dWPXV5Lf7qfN(Tz@vHCdd$=J%jI55*-S? z%>e35=7v>N)0z@yKqH^gF5D+TL)aS9a&&M0TY?u+VSGNq_RbbE;OOKKE=q)6uVkPs z0~0lDtI#h)h6vM;`R6;hzL~+zC45xSmV>JrTsLTYn1C9ca8Gi!+001a04^sdD06b7kR7C&)0II60etv#)Q67njiIZ$EZ%-Y` z$;q2@GI&)Vq zfBF(odn(&6NOu}>FZCEh1SAeJ!AIn*dNF;r9ZUHFm> zrd44VD^nM`%LtY6GTya|QYg`;2&1fs%BW~jP#6ULwztoLIYX-!w(!8=T=;n4dB1Z^ z`uO_pA`tS!^vCGcQ0?!!&*lttz)4~PS2-D-k^^@|2cC9Z+JE^xBcZV|3LS8hw;Pc7 z0>=R5pn&N7F!Fu@#ee{Hl}F0QBSUK~Vq*Yh*}?#QEA$VzFFTmRg({(y6!Et2#`}Q> zmsuIl+b-M|>^R&UV+tP)j{(^Wk1#;a&m-pLkX;jKFQ7y@WL9`27C9uzTL;v_wn56^ zq2go;XQ@f*v44zHMMOI*q1&9MJCWXkgyZ-GQ@GB_1|;pXFhGj-J^wg4D@z>eG-6=d)UD_XMDI!y#vjHJT9iX{ZLRPK! tRa(nIYp?&>e~8YR86Yw{^gkK=03q&6B;;E2;{X5v00>D%PDHLkV1i~fxL*JO diff --git a/mods/default/textures/default_rail_crossing.png b/mods/default/textures/default_rail_crossing.png index 3774beb8fd87ee83f1c49fadaabce444772963df..e511dbde631093a30be542bc64cd543ff486754b 100644 GIT binary patch delta 254 zcmVp?5TrY%i;RH;ZR2Yf2Zoy|z_XQ#Rde#Q*>R0d!JMQvg8b*k%9#0E$UO zK~xyiO;1}6!!QW54GDR)-R^(dftrt5Q2-;^27n6(Migj>26sFSD&j+mq%)!X@iod^ zrhL@`NcQQ#Sk)z(Yqx8yt2c2WH`JVMKGCOn9G7tevqQ&LHDDBRG+JNn-g_JSt1-rk z5j(_J!x6ce$F@>Y6)cO(;H1&t@XGSKMA=?{*B;1$AF8DT6$PozCjbBd07*qoM6N<$ Ef>DHMYXATM delta 348 zcmV-i0i*tp0_*~i8Gi-<001BJ|6u?C0W(QNK~#7FV}OBOd$;`$4G;d$KmdT$fYieH zSPdu-lKQ`_$`r0B*INR}H~Wv(01yX;p^_LFpBk`3^JIu)M|$?!0MvhX0oW{ky8p{QtaC=~ zKTn3iNwVIwBfD>0(X21y(OmoSgywhoXz^)+7i30000P#vnOs-k!`Y)l-T zbTg4_FMV1gc2pmUiHVqTG0DlvtbaF+Xex(dDT7}nsC+jz^SD+30004WQchC5Q7u1Q6v)`f z49M|N3XVj!B_GAi_Y2Lvj=P_050Y!NvIAfBNVKeq=}BJ8<)+5jc|agLyOS~E;TXm~IRCRt-qpxpmSIR^MOR!6G*Us7R;q7f#S?IZJlNu?Qn14@JC;F{6p zY9kf@PsrBCZvaelOM?3UHFXvkikoAV|IaEi!fpt%%>@B+|9^YaHUCdUvJoOK`+sV_ z0RaP`pd?uSe{;P0|G6c`aIvBQIk2GwG$TMosQmxB7}ftX3K7l*#YS(Y9)w>PqxQcg zQ5z9(SU_=*JlH#nDonxhIli(81It3>;hNVpSo~jDZu)U0XHTl0BNF%(X08$4}%6R>s3p6CdOXh!`pX~qDb>{zP7aPMh r7Y53LT#9J`o{R)?9o&F9&{zQgO5yhG9&|vD00000NkvXXu0mjfqr9BJ diff --git a/mods/default/textures/default_rail_t_junction.png b/mods/default/textures/default_rail_t_junction.png index d692241657ed08340affcb65f56ce754989b3100..91d623fbde8bfe37388a99d37e960b7fb77bff6e 100644 GIT binary patch delta 240 zcmeyy)W9@BqMn7Bfq~)e-A6${${@fe#1%-dTD7XKuCBAQ^W@2sg#ohjN{uJw=x2FL zH^iz|g)1ztHk)2xSQ0F^rrx|aUDJ<`=NwQEV@Z%-FoVOh8)-mJou`Xq2*>s0gn}dn zCTBLbyobq8O-;L4d1Ra>#s&&%De>?)IY>G>D;s1w2Sf^-D1LM+-v3kWJ+d!Nv@+2HV57Uu~aOw8A1QrX!26q(uDeme-pEl=mRt%@6PiaRt($;lb&i(ivVdncgxvJ~BDJGP%Aod496_ zK;$o55Fl3wM1itJfpWz`@+HCYrNMG#A@UWWK%`I^rcfQJQX8pQ7o%DiqgEfS)Euwg zlAzw3uGycZH!)j(QjWpoT!SgO2GjBlr{~uj&L}XPQD`)~*mzEf@!S&Qc_qg4OHJmN z880k1T~cAXyvBS*jrr<2^EGuAYZ@$e?cL^nwQx7kjf^Ehe!&b5&u*jvIjx>9jv*C{ zq36^2m=q;i9!gdRzPVfaHuk#Fcl+7#Oq{QO_p49fVQ^{Dh?rTiBX8U5*j>xR*i}PMh?Pc~`eL%ONSBez`Qp3!XM# zj=q1)cRDa}#_W)|?K}#PzhrIvW*3EMn* diff --git a/mods/farming/README.txt b/mods/farming/README.txt index 7bfc195c..67246957 100644 --- a/mods/farming/README.txt +++ b/mods/farming/README.txt @@ -36,27 +36,13 @@ Created by BlockMen (License: CC BY 3.0): farming_tool_stonehoe.png farming_tool_woodhoe.png -Created by VanessaE (License: WTFPL): - farming_cotton_seed.png - farming_wheat_seed.png - farming_flour.png - farming_wheat.png - farming_wheat_1.png - farming_wheat_2.png - farming_wheat_3.png - farming_wheat_4.png - farming_wheat_5.png - farming_wheat_5.png - farming_wheat_7.png - farming_wheat_8.png - farming_cotton_1.png - farming_cotton_2.png - farming_cotton_3.png - farming_cotton_4.png - farming_cotton_5.png - farming_cotton_6.png - farming_cotton_7.png - farming_cotton_8.png - Created by MasterGollum (License: WTFPL): - farming_straw.png \ No newline at end of file + farming_straw.png + +Created by Gambit (License: WTFPL): + farming_wheat.png + farming_wheat_*.png + farming_cotton_*.png + farming_flour.png + farming_cotton_seed.png + farming_wheat_seed.png \ No newline at end of file diff --git a/mods/farming/textures/farming_cotton_1.png b/mods/farming/textures/farming_cotton_1.png index 2581db59bcdd8bdc52664cc2da0086d9c738aa47..5fc218078722b9634503146a0fb0d3353c3e5859 100644 GIT binary patch delta 91 zcma#gn;;R!#LU3JkTh5P6OiHw@CkAC$t;X1*Kp5PEojpD@rPRoD9%_CHlOWR56qt~&`di+`I^r~Arcq=6>{IpX d(X4xb%2&v-HHsQ{mjZP#c)I$ztaD0e0swae7f1jA diff --git a/mods/farming/textures/farming_cotton_2.png b/mods/farming/textures/farming_cotton_2.png index af9ed340f4fd331cbd2a504546b0e73b9e79234e..db4f4a3e58233f32f343f924218dc910e1f1be13 100644 GIT binary patch delta 101 zcmXS~m>`kB#LU3JkTh5P6OiHw@CkAC$t-lsQps=9jxJM|`P9=26lW|6@(X5gcy=QV z$dU4NaSW+oOkTiZV6=hZq&t^G(_Kc77jX#;41x!kd^miI&48*HJYD@<);T3K0RXQt B9K-+s delta 100 zcmV-q0Gt1KcaRug2nGNE03Y-JVE_OCK1oDDRCobnzzs&hC>RB{X0rd0`KG#(|4A~y z%2?*VJ=73u6KNn#1~Af*0Bf{22O2~!aJG{F?_sBe*8l)e=MD7)mw&7P0000rzZyh diff --git a/mods/farming/textures/farming_cotton_3.png b/mods/farming/textures/farming_cotton_3.png index ba46f3d67eb4e2f92dac8832294cc9cddb14b32f..34a9588e287dce5cd611e1b58abedeae3a716e38 100644 GIT binary patch delta 130 zcmbQjIGJ&RL^TUD0|Ud`yN`l^lu&?Ah^tR#VSb~wd!}kkse0=~)3j>Mq>R=ype$oa zkY6x^!?PP8j=rahV@L&K@&XZ#0}^}&ZH!JWlFQmW8w6F(A31Pp0fU%PN=nPBpso@0000V^Z#K0003J_L_t(|0b>|^U=)l3Jq@w{xa4e2Wd9R1 zz`;!JzpXK*LK`EQ|E9WELfxg3y9B5<`* l{13Dl;w5qc$Yw&$2LPN88@1<0pSb`4002ovPDHLkV1ho8HD&++ diff --git a/mods/farming/textures/farming_cotton_4.png b/mods/farming/textures/farming_cotton_4.png index e6708b55ed41f05113048b588e3d885f94f99216..6b46fd34fad8fbc27890d960fbdd533721f9e6d0 100644 GIT binary patch delta 139 zcmdnYIGb^TL_G^L0|Ud`yN`l^lu&?Ah^tR#VN$kEX}N)KyjFLIbxxt)^eU0vKv~9; zAirP+hi5m^fE;sA7srqa#$*NF4F@Fn4BD95Iv7Gk7c(;}PheS{7?!|v(%5)|kwk-P o>x>x-PVw?8m`vVaFoA_3;|o(n#f*$lpb-q7u6`~o>zopr0HRYX00000 delta 163 zcmV;U09^l@0kZ*+7=H)`0000V^Z#K0004SPL_t(|0b>|eU=-LG$o!|s05ff=|30=V zcnz^Nlm*I@sldTR?!Tq3G=2k2wI%;M7|VebxtJ@!6+4^C|2Nf=B+iT0`qKYRwNVv2 znJEw-KIXo<{}HxhdW~pTz+%PKLh(NklO98kKz{=R4x*V{U>u?)@t;uo007tIDeRtR R8?pcZ002ovPDHLkV1nooMcn`Z diff --git a/mods/farming/textures/farming_cotton_5.png b/mods/farming/textures/farming_cotton_5.png index 0ad6a8f5a5b64dca02dd15636d3679ccd18b9402..639a6dec6445f54ec13130b56d9d7b0e14fbe607 100644 GIT binary patch delta 144 zcmcc1xPWnjL_G^L0|Ud`yN`l^lu&?Ah^tR#VRf!qMxx=wddJ{U{i1Z^;PfZ#Kv~9; zAirP+hi5m^fE*i77srr_xTz;L@-`UoFc_%oR{JrmWOs=P`1n6C=S{_ydNv2~1^XHg uWG+bE9lYpF*Rhft54sp^q~Anv>z5cZ^Ee)=+XXa-lfl!~&t;ucLK6V5+A_TW delta 205 zcmV;;05boe0o?(R7=H)`0000V^Z#K0005*(L_t(|0b`&M7zLKv(*Nq`FzX@c=> zbn&~6!No)YMS+f@$baN;0lNqvus4u}yTVjM60X=(UGhK3HAck707x;4UkPeP4=6KD zssHHF=4z_=9~uLM0ni)ZsD*h88Z(3ex~;Z)sG7+!grETcsc%E^6CMdm00000NkvXX Hu0mjfnygu= diff --git a/mods/farming/textures/farming_cotton_6.png b/mods/farming/textures/farming_cotton_6.png index 838fa930d79b84db303ac41405582627e1c09e0e..f4bd4fb346ec9ee2a71696d9337723d2be7de8dd 100644 GIT binary patch delta 148 zcmZ3)w1jbjL_G^L0|Ud`yN`l^lu&?Ah^tR#VPmpQUby-6Quj!2lZseNdCNClKv~9; zAirP+hi5m^fE));7srqa#@-W#ybTUK3WQ#^CAd=d#Wzp$PyGQ8M8G delta 275 zcmZ3&xQJrs|TW8j@xjQs%z87Ftr4 z+R|1!GS)iMHo7vlda`!C#O?q((-$4&!nVyrI-@(X5gcy=QV$jkC{aSW+ooO{qQ ztl2<>;Xt4vj| zRrFkZ+OMY?Gp{g*Z3~}vMD)u-!_YRSGns0F(`8RIF5D*S@IC3znRhNTZKdoP%%%3Q W1np1%n^Kv~9; zAirP+hi5m^K%69RcNc~ZR#^`qhqJ&VvY3H^TNs2H8D`Cq01C2~c>21s-)9sSRoA`R z9wh)2^7eFb4B@z*oN$1hDS?Mw<1E*7-@*njYXidug$akbLXI+t1Td@$VmM{UYQW;S zL`FhFHo~DxQgVhQ%Yk2^5fKa2I5`_ySt3M48*edqq_OrtJRRZ!G?&5C)z4*}Q$iB} DP~17- delta 302 zcmV+}0nz^C0lfl{7=H)`0000V^Z#K0009I^L_t(|0o_quPr^VDyg#8qxIz)4QfWbK z{Lp%ch(==Lt5Fl5jq(3KjyGv??k0KE^?w7Q%B&i`ou>GFdDIDy zhb_2q(zsGxknboa%vRH;R;h@KQ3qGv{rsR42>xG4MqG|87DZ1FN_FY>{Ao;e(x`E&u=k07*qoM6N<$g0NkS AumAu6 diff --git a/mods/farming/textures/farming_cotton_8.png b/mods/farming/textures/farming_cotton_8.png index d4bf6bd5e16cd8b9fbbd0a17b2316027c08f1028..189c12dca4b16706866b728be85403dfd5716221 100644 GIT binary patch delta 315 zcmV-B0mS~H0?PuB8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-yj6%IBXm7iMS0002kNklh(LyQbY5hXi!Lm0LU1(VwgD2Mb!ILqGHi=7B zBv_EE$tB8hs5uE;RUYfm;E8iZvX}BePz`cMLpM)1r*BHro3#<6Z%UJVIURWE?rV%1 z&on7B+WB|0vo!CUl7lCnSDx!V0Nn16oxT`{nyGMjzTTk1850%u?;i*7pYlGY^mqUO N002ovPDHLkV1fzxg)RU9 delta 273 zcmX@jw2*0nWIZzj1A~Sxe=v|r4)6(a1=5e3b( z(v}+1R+`e*nljc}GB#SWHrleb+Ol>!a`r%^E9U@0@{W4)PC%p&L<-LO3N8i;u7-+k zhKlY+O5Ua_|NsBLweRO{pf!voL4LvY3=Yq3qyc$3o-U3d5|XS3IhhVRh_G%5_?7D# zdi>n(|C*{mS)ghL6-LgMSso`uXC8`;ZRRwcw(nx%Z=PE@ikVl88}mL-N;Z^jkjgM# zKC$8Wtpne^!yI1My*hJ&eMRcV*XFv6XVf1rXGr+JkC{Qw{D6GBxCd|4ZJD{#IUg(5P9#D$0B*-tA z!Qt7BG$6;+)5S5Qf-(63;|x)UCBn?j6B#-bbq*+Sh^2=dSUQbyjTnzZmg2324iSu} i(nJ^}k2YM^U}M<4kg2})GkZAD00vK2KbLh*2~7Zh7%5c% delta 255 zcmVjK-~z z$FG#hvY5-Xn#{JH&9|P;xuMUxqS3vk(!Z(Gz^c{5uGYk_*T%Bg$FthXx7*CR+|9e+ z(ZJ!;#NpJ&=iJcf-qU=<2HF4s00DGTPE!Ct=GbNc003r5M0i0|7#Rh@3j%^56acW5 z{S5UX28wn6bG8AX0R(oA*94UJ%{8jt3y{`}N7`5cGAaN7XaM-2Jr58Vb5NInSQ7Ja zqJZBL*Z~h@01Wd49jM$(;2aOg>B|gxs?ehWY(N130RC|y1b!QpGdBPL002ovPDHLk FV1lhVc8LH0 diff --git a/mods/farming/textures/farming_flour.png b/mods/farming/textures/farming_flour.png index bd33f937dd69b45e7195b6b4a1f935940363d77b..90ba411aa65e2b7f58b94df80c089298f8d8323a 100644 GIT binary patch delta 148 zcmX@lw1jbjL_G^L0|Ud`yN`l^lth3}h^tR#;n%NU|NsC0=+UDWFJAoq{rk5+nFVdQ&MBb@04;Jm A3IG5A delta 320 zcmV-G0l)sF0nY-E7=H)`0000V^Z#K0009jjq@0&mw?XmKjhKh3dLiS(bJt+O|aqM}OZ%eBYPnc_M(ju2Y`p z{X&>L-_Pe$Q55NRyUAdz(J$(_sHzJ40QM?yk|cIdj-U<^c4xoe%XM9>k}w#NrfCc& zN6-$lL5La#yj(8jOs7-p3q|Z9MoVAQClAOOn8B{sYx^sM!Qj)ucDuEnSQOF{`{{Ht z0bVo(Z>gn$FIe9 S=qIfJ0000mUjP6A0d!JMQvg8b*k%9#09;8#K~#8NrOw9+fG`w9(P7Lh>9M!}|58E4kfk`g z19vgz(*&)dERBiLcyeHs>Lt!hH5vP(BXM^D8^VxQ)%gyDeJR7VtlE>}D!Og=*~vp= iWAY)7!21iZ=GRU)(E^7LunegH0000dL8) z7#k^8YWG4!H$}RsqP1owF=Lr{%%GhDB)g`WVi)~ zn-VVfKH+%Fa+?TQ5SJy~#GJQR`wj-v9D8eKZK6{m*j;Ug>}!Auh~1H;mGLZ2Do!IU z+60N9g%mX6I_gApLxM_}zIL!Kg7!?53|kS~$Y4iasKNaAQoa`cRR>jal)x9HgmPj~ zO0n@wlVGHykbeo>{RRYn*5WuMA++2G#s853Mrc8?iJ|3IB`VKRGYo00`$`Z~MJ7+<^!HO8@ zbG?T5M;XNT&rmEpzDK!2M6 z^SdV~GvsLcTld!U)s$lYxBu4u9R8^{80#*=P-i}L*;JP`kG=X_<a!Fx2P!WTttDnm{r-UW|tluf# delta 87 zcmZ3-m^ncrkb{kZfkFQB|3n~V;OXKRQo)!ku_i&Jrz!A4ox&sgjakwBEs9slWV?U$ q>)hC6E}|E?S(8C~cV+pDdWN;`B6EcVKeqw(GI+ZBxvXYNfhWOWQ1`G@goCO|{#S9GG!XV7ZFl&wkP>{XE)7O># zKBE|?sg${n>MNj7rl*Tzh{fsT1PRu~2_gxsSG7z32`|=L;4V8SrrqS8`VCz|rU`FRR&*$Iguw-6mUwiHV5M0=L^^3hVw>C(x^T(vp l9cyP@npDthFgr1c;j6m%`LaVUjX+x&JYD@<);T3K0RYqIL7D&n delta 114 zcmcb^*v~jYB|FU1#WAFUG5G+W+d&NpR$>13|LRe17jpP)T|1lU-(gkGhHtu#9HzF_ zP6y^JE3Nzgutwv>t;U4y`MfQgtIOK|9WU^EAJ>uaU9Ur}r0n^(1dHlR6FdGh{9CVM S&a55G00N$_elF{r5}E+pfH20AK5dFaQ7m32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra0Tu~06{nLpdjJ3c%t=H+R5;7+k1-0uKomqDF{#8tk!WFKAtDkBJwqz{ zG@it3Xy*k&K(J5Y5wx%p3!5Oa5pn>dYazQPh+<=xX?7WA{(t))3KjZ?7OS!RB{!Wr z62Jght|z)wDVINnv;R?lfF97ORlm{(-QJsbO|P#3kq`j*p(icV0$>)nn%c5$T~uV{ z8Gh*HZa&4&VP?tDUL=G*Q<1m(J$~p(qgij~2u^1RKzh5A-9QzU6u>-Rj>JgaLLg6d5q*a3s+N^lb{jR6FZH1Xys< zshIy{S=PTf5G=U(3}FL$H~Rm_Fm3wYP%u4XUl?4nbG0v=J!yL|m0AK5dFaQ7m32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra0Tu~03tgNA7ytkO^GQTOR5;7+k1+)w|C@om_S)(u zA3FcPFRt8f|Mu?E{pV2t>3JF&@j=`H)b^)i^d1FZ;zIx)p03?r8(y3ZI<>W}HvvVN zxk?0pN`#({0LaIq5SADdjGmkrLs4c<`6RE!@*RLk>rksiD9X$=$+%=ovqmc$s;>uMg-niRju{Nt@f dY}V!Ln_na3W(P4Bdoch2002ovPDHLkV1ffTkPZL< delta 199 zcmV;&0672V0^?pOs~FrMn?lu z9UzByNv+VM?rqrDOWkG=r^`BOY%g`PT95`GyK5PJe)FNLNI= zCR1fK8JjTroyVRH;tz|vfI2IW#@C^i&lMeoKLH(jeIp~PGh+Y%002ovPDHLkV1g)) BSFiv8 diff --git a/mods/farming/textures/farming_wheat_5.png b/mods/farming/textures/farming_wheat_5.png index 2ddff0370a52bec9ef652a62701e5012e6b1bbe2..e74de6122fe18cc8f01cc32d192b363b84dcaf6d 100644 GIT binary patch delta 394 zcmV;50d@YW0+|Dl8Gi-<001BJ|6u?C00v@9M??VL0KotNU+ac200009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-yj76~;2Q%8*|0003dNkl@B>_3}@~+-@OC>^+)RZ_RQG(?D+T*|;~)X8ww%5m1qa(@<{-xL4<00DGTPE!Ct z=GbNc003!8L_t(|+O@|=62dS51i>bQEz3y`=i5o4S!i9an%Hi)v#H^SS+(9 z*&sfE(+r%s=X~c5{2%uASJYp$)AP-Uc67WRXgj;h>bJphf!ZSg3WcTcVcMLDwDkRc z#Hc+2z?f_TaCNz%#*wqx;+RlB2&mS|%I#VJxLpe=B>v|Plt zYR0&1$hvIFx@*j}T+qR8(7|xg!f(>UaMQ$b)WmSu$a2}qbKA>v+{|>{&2@!4Nxc97 z00DGTPE!Ct=GbNc0056kL_t&-83n-!LV`d50Klmf!KhF~A$G0ow8J1f_Wv(y1^@s6 z0002+^9KOfe|32ufWw=S-{dI)hvaq7Mmq9|@zM84#8-T{rnI6)p*}T>&WY{>g{6zIaDOY;oh`h$Qe?JM<)zT)^ZcP%pL9Mp a%E>=2staf-M+r#)0000d>?f z>LN&@NL<>Ih@iDK936v(Hvgoc{~(B@C26zG#fApOnv@ftl7FcrhxZ!vop+r?TW@*r zz3=z?`TdRu|9*-$r|K`-^TS0%E8XX&+THbu`pvkgP-g_d{=u>TA(mK)OgWiMB0-%I z0G2fd;Qi%FEh6t^4kM+m>rM-*<${t@03fBnG)(}WZu9E=^4S2eZO;#CvTb`*%LOHL zlRh1%4S*S2@_#ic1=Vsv1<8%t2d?WP;?^icu(x8<5y$hrZQJ7~NCTF?`U#wFZz`H5 z9cLUeKHcV(l!A|$N8j#vg1ze@x`Vpk7NqD&I>SbY7}Wdy7-C~JL#tbh{AJk=Poh0R z-RZp|dY>)!Ge-c#tx+iSSUgig2)ctho5^%U2N22_@>f=`0MKkU=?oi`?sH0yyqC^m zsAOc7y>xc|kaU}&k^m@UNPNQr;H_R^eQn#P2X()|^E^KYkV>WIhS>@l64U{{0r9W6 Uq|R%)=Kufz07*qoM6N<$f<<=Np#T5? delta 464 zcmV;>0WbdT1K$IX8Gi!+001a04^sdD0OU|iR7C&)0H2OWppQzRkVc`8N1=~NqmfCZ zkV>VJNu`rZrjbgfluW0SO{bMhroKdiyP_Ug+u%A$|o>Q@)QL>*>v!GM7pi;G>Q-8LiQn;g1xTI9MqgA=3 zRl25Bx~O8js#LtIX1%CYzp7Qgs#n3RSHZ7m!?9_{v0KNrYst22$+&CFwOz}&ZOyuE z&bw~Uyl>FCT+qF6(Y%jF|;3Id6r z3;Dnm@qx1Im^P7Z>|58Tx#@V(sg^Yz88LNgN=kbzp-Hb7={IdDX&j~&R6@nwi?VDv zwjw$TRiP^+x=H8ey!_Z`)O9np)Zg|_(xr{+WfH>9YWfRUJQH6LTa-Hh0000?Rc@yuz=@gGVi<} zbIy$M=5<9zvj>A*IeTIY^V@aVzZ|Y%UZW;OG$oq1cPahzlZy>3f({3ZY$zlm*|xyU3 z@h>^(59oDUQhz8XRpXl}0QQclv5w!Q*KNss@)Or3juV7iYpf--&;0C)e^$mpf1riq z=m>z(PbX_(J{xk{bOG4kvw8pS27uZ8006hzlE){{N$(Z_+%JA)!?u@%*O!P7!7rp~ z0kBL~(>`t-0x%ecJa$K#lgI1zR|wDXNuz53CbxAeB7eK;;`=yz2`i?YpgDPbI{Ji| z&-=*zmjF!T`?Z0d99E=NDiDMbPQ}^60Ys9-guyug^7j|Mjjw1P)uc4D57qE`n5NC! z&spzzTz@3xW|}qtNfJ{$r~(iM=j`tKIz5kTgXLYSg#bqRR1>UHfyv}Thvabpp;DDl zwW9XQTr91dxJd1%`alUy)5aW+gRW@%g6u#002ovPDHLkV1l0~ B16=?B delta 568 zcmV-80>}Nq1jYoA8Gi!+001a04^sdD0Uc0GR7C&)0Hl;kpN~hHi$tG|N1u*IpO8tQ zkw~GCOQVxXqmxUcl}V(ON~M)arIkyjlS-zROsADir_m$!FkuLSr#|1u{RGM`A#DK#=`24$l|5E%E`6}6;h=Mh0&UpU zP|>J47J7q=HRgQQx#zqTU~_mYX}0K4TG-$Ut-BN;=c%qBw|k3*5;n>np~>?y^_FR? z!ZYx8{4xE5tvV+(an+;BrsY)5FaoS@=vaoWNZl8*Biw&=nIP8&0X}O00000;Tu)} diff --git a/mods/farming/textures/farming_wheat_seed.png b/mods/farming/textures/farming_wheat_seed.png index 81fc3b228ed7ac9d6e038c26b753b40628a489e5..a9031fba979d5fd323ce9f5200f6ede53b2e733f 100644 GIT binary patch delta 124 zcmX@g)XO+QqLhW1fq~)e-A6${N;JSH#MLLWaNF{PY0XaO4|gt};4`<={m9lLHLrI~; a28PAwnPffx2)6@uFnGH9xvXe*2LDi5Z z0nAGja){cLAd4uXQOl|7?+n;E7)MS4iIIHC&W>hxHjQhspE~%Lunm|&C}z5$n0N5* zGNc1)7s*BxAE#o}YbwI>sfn#mkn>XHXVHdySyU( z*_-PK+4KR8d!v{**NbM{bWm^y@e9HC+#(`;)4tsJE+9Dnz8^bCeTp=ssK%!XiKoe% zSAw^03x{RLAX`)TU6;zjx7|TK;y!_yzzvY@q{~mw7)KpUtx(Rjqo_w9#tg>w%6Su) zS+^`gqIUGR(l52ttMGOKQG$0=5B=B!4YXOjJcoX>m*?4ryp;xQk$5F%#+O>78aaj9xl-N+zgvN72#I zUS3{pZEbmZdA`2Bxo1gX00001bW%=J06^y0W&i*HH%UZ6RCobnU{GLy0Hz=)L-nZw zRAe1YPIol}6dZ*K@vattvJSUE8ItBuA(mv~gkUBJGQa@<7ZZF5x%j!~1^@s607*qo IM6N<$g3Dt#qyPW_ delta 233 zcmdnS*vd3PrJk`k$lZxy-8q?;3=9kg0X`wF&EXn)^1RmSLN2-@0j3fWmNK!nk_Fz% zi3urXWexq4rY&8*a_63X*KXc;`s&T^zrUN(wjTlNWh@Eu3ubV5b|VeMN%D4gVd!9$ z^#F1>3p^r=85p>QL70(Y)*K0-AbW|YuPgh#Bp!BdF=34@lIwwDj-D=#Asp9}6B-!j zZ8kWzmo`K6j3E2`M9jYcAYEKwa c4Gb9=dfE9RQfuyQ2O7rU>FVdQ&MBb@0Q!1M4FCWD From 047ecea3a28f1d516bd6a54b690affccbedfb022 Mon Sep 17 00:00:00 2001 From: Xanthin Date: Wed, 4 Feb 2015 14:47:22 +0100 Subject: [PATCH 0094/2261] Make trapdoor better visible when held in the hand Screenshots at: https://github.com/minetest/minetest_game/issues/411 --- mods/doors/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 2fc0ed3f..ea097399 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -380,6 +380,7 @@ end minetest.register_node("doors:trapdoor", { description = "Trapdoor", inventory_image = "doors_trapdoor.png", + wield_image = "doors_trapdoor.png", drawtype = "nodebox", tiles = {"doors_trapdoor.png", "doors_trapdoor.png", "doors_trapdoor_side.png", "doors_trapdoor_side.png", "doors_trapdoor_side.png", "doors_trapdoor_side.png"}, paramtype = "light", From 75ea7e3160321fd60c80907accb427650391bb0e Mon Sep 17 00:00:00 2001 From: Tim Date: Sat, 27 Dec 2014 16:46:03 +0100 Subject: [PATCH 0095/2261] Bones mod fixes 1. don't delete protected nodes, 2. time out in loaded chunks, 3. don't crash when dying in certain nodes (like default doors or sign_lib signs) --- mods/bones/init.lua | 97 +++++++++++++++++++++++++++++++-------------- 1 file changed, 68 insertions(+), 29 deletions(-) diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 03ed61d6..f35d5192 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -21,6 +21,9 @@ bones.bones_formspec = "list[current_player;main;0,6.08;8,3;8]".. default.get_hotbar_bg(0,4.85) +local share_bones_time = tonumber(minetest.setting_get("share_bones_time") or 1200) +local share_bones_time_early = tonumber(minetest.setting_get("share_bones_time_early") or (share_bones_time/4)) + minetest.register_node("bones:bones", { description = "Bones", tiles = { @@ -96,23 +99,47 @@ minetest.register_node("bones:bones", { on_timer = function(pos, elapsed) local meta = minetest.get_meta(pos) - local time = meta:get_int("time")+elapsed - local publish = 1200 - if tonumber(minetest.setting_get("share_bones_time")) then - publish = tonumber(minetest.setting_get("share_bones_time")) - end - if publish == 0 then - return - end - if time >= publish then + local time = meta:get_int("time") + elapsed + if time >= share_bones_time then meta:set_string("infotext", meta:get_string("owner").."'s old bones") meta:set_string("owner", "") else + meta:set_int("time", time) return true end end, }) +local function may_replace(pos, player) + local node_name = minetest.get_node(pos).name + local node_definition = minetest.registered_nodes[node_name] + + -- if the node is unknown, we let the protection mod decide + -- this is consistent with when a player could dig or not dig it + -- unknown decoration would often be removed + -- while unknown building materials in use would usually be left + if not node_definition then + -- only replace nodes that are not protected + return not minetest.is_protected(pos, player:get_player_name()) + end + + -- allow replacing air and liquids + if node_name == "air" or node_definition.liquidtype ~= "none" then + return true + end + + -- don't replace filled chests and other nodes that don't allow it + local can_dig_func = node_definition.can_dig + if can_dig_func and not can_dig_func(pos, player) then + return false + end + + -- default to each nodes buildable_to; if a placed block would replace it, why shouldn't bones? + -- flowers being squished by bones are more realistical than a squished stone, too + -- exception are of course any protected buildable_to + return node_definition.buildable_to and not minetest.is_protected(pos, player:get_player_name()) +end + minetest.register_on_dieplayer(function(player) if minetest.setting_getbool("creative_mode") then return @@ -131,26 +158,29 @@ minetest.register_on_dieplayer(function(player) local param2 = minetest.dir_to_facedir(player:get_look_dir()) local player_name = player:get_player_name() local player_inv = player:get_inventory() - - local nn = minetest.get_node(pos).name - if minetest.registered_nodes[nn].can_dig and - not minetest.registered_nodes[nn].can_dig(pos, player) then - -- drop items instead of delete - for i=1,player_inv:get_size("main") do - minetest.add_item(pos, player_inv:get_stack("main", i)) + if (not may_replace(pos, player)) then + if (may_replace({x=pos.x, y=pos.y+1, z=pos.z}, player)) then + -- drop one node above if there's space + -- this should solve most cases of protection related deaths in which players dig straight down + -- yet keeps the bones reachable + pos.y = pos.y+1 + else + -- drop items instead of delete + for i=1,player_inv:get_size("main") do + minetest.add_item(pos, player_inv:get_stack("main", i)) + end + for i=1,player_inv:get_size("craft") do + minetest.add_item(pos, player_inv:get_stack("craft", i)) + end + -- empty lists main and craft + player_inv:set_list("main", {}) + player_inv:set_list("craft", {}) + return end - for i=1,player_inv:get_size("craft") do - minetest.add_item(pos, player_inv:get_stack("craft", i)) - end - -- empty lists main and craft - player_inv:set_list("main", {}) - player_inv:set_list("craft", {}) - return end - minetest.dig_node(pos) - minetest.add_node(pos, {name="bones:bones", param2=param2}) + minetest.set_node(pos, {name="bones:bones", param2=param2}) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -171,10 +201,19 @@ minetest.register_on_dieplayer(function(player) player_inv:set_list("craft", {}) meta:set_string("formspec", bones.bones_formspec) - meta:set_string("infotext", player_name.."'s fresh bones") meta:set_string("owner", player_name) - meta:set_int("time", 0) - local timer = minetest.get_node_timer(pos) - timer:start(10) + if share_bones_time ~= 0 then + meta:set_string("infotext", player_name.."'s fresh bones") + + if share_bones_time_early == 0 or not minetest.is_protected(pos, player_name) then + meta:set_int("time", 0) + else + meta:set_int("time", (share_bones_time - share_bones_time_early)) + end + + minetest.get_node_timer(pos):start(10) + else + meta:set_string("infotext", player_name.."'s bones") + end end) From a9137e8c212a5d9da20311a0cae549858ffe535c Mon Sep 17 00:00:00 2001 From: Craig Davison Date: Wed, 24 Dec 2014 23:13:15 +0000 Subject: [PATCH 0096/2261] Fix typo in survival formspec & create legacy file --- mods/default/aliases.lua | 9 +++++++-- mods/default/functions.lua | 19 ------------------- mods/default/init.lua | 9 ++------- mods/default/legacy.lua | 25 +++++++++++++++++++++++++ mods/default/player.lua | 2 +- 5 files changed, 35 insertions(+), 29 deletions(-) create mode 100644 mods/default/legacy.lua diff --git a/mods/default/aliases.lua b/mods/default/aliases.lua index d80082e2..72477513 100644 --- a/mods/default/aliases.lua +++ b/mods/default/aliases.lua @@ -1,6 +1,7 @@ --- aliases (Minetest 0.4 mod) --- Provides alias for most default items +-- mods/default/aliases.lua +-- Aliases to support loading worlds using nodes following the old naming convention +-- These can also be helpful when using chat commands, for example /giveme minetest.register_alias("stone", "default:stone") minetest.register_alias("stone_with_coal", "default:stone_with_coal") minetest.register_alias("stone_with_iron", "default:stone_with_iron") @@ -65,3 +66,7 @@ minetest.register_alias("lump_of_iron", "default:iron_lump") minetest.register_alias("lump_of_clay", "default:clay_lump") minetest.register_alias("steel_ingot", "default:steel_ingot") minetest.register_alias("clay_brick", "default:clay_brick") +minetest.register_alias("snow", "default:snow") + +-- Mese now comes in the form of blocks, ore, crystal and fragments +minetest.register_alias("default:mese", "default:mese_block") diff --git a/mods/default/functions.lua b/mods/default/functions.lua index c5623205..82c9282a 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -83,25 +83,6 @@ function default.node_sound_glass_defaults(table) return table end --- --- Legacy --- - -function default.spawn_falling_node(p, nodename) - spawn_falling_node(p, nodename) -end - --- Horrible crap to support old code --- Don't use this and never do what this does, it's completely wrong! --- (More specifically, the client and the C++ code doesn't get the group) -function default.register_falling_node(nodename, texture) - minetest.log("error", debug.traceback()) - minetest.log('error', "WARNING: default.register_falling_node is deprecated") - if minetest.registered_nodes[nodename] then - minetest.registered_nodes[nodename].groups.falling_node = 1 - end -end - -- -- Lavacooling -- diff --git a/mods/default/init.lua b/mods/default/init.lua index 663a3ae1..3f0efea9 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -21,7 +21,7 @@ function default.get_hotbar_bg(x,y) return out end -default.gui_suvival_form = "size[8,8.5]".. +default.gui_survival_form = "size[8,8.5]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. @@ -43,9 +43,4 @@ dofile(minetest.get_modpath("default").."/mapgen.lua") dofile(minetest.get_modpath("default").."/player.lua") dofile(minetest.get_modpath("default").."/trees.lua") dofile(minetest.get_modpath("default").."/aliases.lua") - --- Legacy: -WATER_ALPHA = minetest.registered_nodes["default:water_source"].alpha -WATER_VISC = minetest.registered_nodes["default:water_source"].liquid_viscosity -LAVA_VISC = minetest.registered_nodes["default:lava_source"].liquid_viscosity -LIGHT_MAX = default.LIGHT_MAX +dofile(minetest.get_modpath("default").."/legacy.lua") diff --git a/mods/default/legacy.lua b/mods/default/legacy.lua new file mode 100644 index 00000000..76fcc8ed --- /dev/null +++ b/mods/default/legacy.lua @@ -0,0 +1,25 @@ +-- mods/default/legacy.lua + +-- Horrible crap to support old code registering falling nodes +-- Don't use this and never do what this does, it's completely wrong! +-- (More specifically, the client and the C++ code doesn't get the group) +function default.register_falling_node(nodename, texture) + minetest.log("error", debug.traceback()) + minetest.log('error', "WARNING: default.register_falling_node is deprecated") + if minetest.registered_nodes[nodename] then + minetest.registered_nodes[nodename].groups.falling_node = 1 + end +end + +function default.spawn_falling_node(p, nodename) + spawn_falling_node(p, nodename) +end + +-- Liquids +WATER_ALPHA = minetest.registered_nodes["default:water_source"].alpha +WATER_VISC = minetest.registered_nodes["default:water_source"].liquid_viscosity +LAVA_VISC = minetest.registered_nodes["default:lava_source"].liquid_viscosity +LIGHT_MAX = default.LIGHT_MAX + +-- Formspecs +default.gui_suvival_form = default.gui_survival_form diff --git a/mods/default/player.lua b/mods/default/player.lua index 688ef62f..87618e31 100644 --- a/mods/default/player.lua +++ b/mods/default/player.lua @@ -98,7 +98,7 @@ minetest.register_on_joinplayer(function(player) -- set GUI if not minetest.setting_getbool("creative_mode") then - player:set_inventory_formspec(default.gui_suvival_form) + player:set_inventory_formspec(default.gui_survival_form) end player:hud_set_hotbar_image("gui_hotbar.png") player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") From 60520b80321ae6066be208401f836505248334e9 Mon Sep 17 00:00:00 2001 From: Steven Smith Date: Wed, 4 Feb 2015 09:16:09 +0800 Subject: [PATCH 0097/2261] Fix download URL --- README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.txt b/README.txt index 9456f815..7a9b12f5 100644 --- a/README.txt +++ b/README.txt @@ -17,7 +17,7 @@ Additionally, when the minetest engine is tagged to be a certain version (eg. 0.4.10), minetest_game is tagged with the version too. When stable releases are made, minetest_game is packaged and made available in - http://minetest.net/download.php + http://minetest.net/download and in case the repository has grown too much, it may be reset. In that sense, this is not a "real" git repository. (Package maintainers please note!) From 03c00a831d5c2fd37096449bee49557879068af1 Mon Sep 17 00:00:00 2001 From: Jeija Date: Tue, 3 Feb 2015 20:11:23 +0100 Subject: [PATCH 0098/2261] Clean up trapdoors code and make them more flexible, so custom trapdoors can be registered by other mods --- game_api.txt | 29 +++++++++-- mods/doors/init.lua | 119 ++++++++++++++++++++------------------------ 2 files changed, 80 insertions(+), 68 deletions(-) diff --git a/game_api.txt b/game_api.txt index 0f53dbc1..4d4b579b 100644 --- a/game_api.txt +++ b/game_api.txt @@ -26,11 +26,17 @@ The bucket API allows registering new types of buckets for non-default liquids. Doors API --------- -The doors mod allows modders to register custom doors. +The doors mod allows modders to register custom doors and trapdoors. - doors.register_door(name, def) - ^ name: "Door name" - ^ def: See [#Door definition] +doors.register_door(name, def) +^ name: "Door name" +^ def: See [#Door definition] + -> Registers new door + +doors.register_trapdoor(name, def) +^ name: "Trapdoor name" +^ def: See [#Trapdoor definition] + -> Registers new trapdoor #Door definition ---------------- @@ -52,6 +58,21 @@ The doors mod allows modders to register custom doors. ^ If true, only placer can open the door (locked for others) } +#Trapdoor definition +---------------- +{ + tile_front = "doors_trapdoor.png", + ^ the texture for the front and back of the trapdoor + tile_side: "doors_trapdoor_side.png", + ^ the tiles of the four side parts of the trapdoor + sound_open = sound to play when opening the trapdoor, OPTIONAL, + sound_close = sound to play when closing the trapdoor, OPTIONAL, + -> You can add any other node definition properties for minetest.register_node, + such as wield_image, inventory_image, sounds, groups, description, ... + Only node_box, selection_box, tiles, drop, drawtype, paramtype, paramtype2, on_rightclick + will be overwritten by the trapdoor registration function +} + Farming API ----------- The farming API allows you to easily register plants and hoes. diff --git a/mods/doors/init.lua b/mods/doors/init.lua index ea097399..7c2cf1c7 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -354,78 +354,69 @@ minetest.register_craft({ ----trapdoor---- -local function update_door(pos, node) - minetest.set_node(pos, node) -end +function doors.register_trapdoor(name, def) + local name_closed = name + local name_opened = name.."_open" -local function punch(pos) - local meta = minetest.get_meta(pos) - local state = meta:get_int("state") - local me = minetest.get_node(pos) - local tmp_node - local tmp_node2 - if state == 1 then - state = 0 - minetest.sound_play("doors_door_close", {pos = pos, gain = 0.3, max_hear_distance = 10}) - tmp_node = {name="doors:trapdoor", param1=me.param1, param2=me.param2} - else - state = 1 - minetest.sound_play("doors_door_open", {pos = pos, gain = 0.3, max_hear_distance = 10}) - tmp_node = {name="doors:trapdoor_open", param1=me.param1, param2=me.param2} + def.on_rightclick = function (pos, node) + local newname = node.name == name_closed and name_opened or name_closed + local sound = false + if node.name == name_closed then sound = def.sound_open end + if node.name == name_opened then sound = def.sound_close end + if sound then + minetest.sound_play(sound, {pos = pos, gain = 0.3, max_hear_distance = 10}) + end + minetest.set_node(pos, {name = newname, param1 = node.param1, param2 = node.param2}) end - update_door(pos, tmp_node) - meta:set_int("state", state) + + -- Common trapdoor configuration + def.drawtype = "nodebox" + def.paramtype = "light" + def.paramtype2 = "facedir" + + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + def_closed.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -0.4, 0.5} + } + def_closed.selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -0.4, 0.5} + } + def_closed.tiles = { def.tile_front, def.tile_front, def.tile_side, def.tile_side, + def.tile_side, def.tile_side } + + def_opened.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5} + } + def_opened.selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5} + } + def_opened.tiles = { def.tile_side, def.tile_side, def.tile_side, def.tile_side, + def.tile_front, def.tile_front } + def_opened.drop = name_closed + def_opened.groups.not_in_creative_inventory = 1 + + minetest.register_node(name_opened, def_opened) + minetest.register_node(name_closed, def_closed) end -minetest.register_node("doors:trapdoor", { + + +doors.register_trapdoor("doors:trapdoor", { description = "Trapdoor", inventory_image = "doors_trapdoor.png", wield_image = "doors_trapdoor.png", - drawtype = "nodebox", - tiles = {"doors_trapdoor.png", "doors_trapdoor.png", "doors_trapdoor_side.png", "doors_trapdoor_side.png", "doors_trapdoor_side.png", "doors_trapdoor_side.png"}, - paramtype = "light", - paramtype2 = "facedir", - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1}, + tile_front = "doors_trapdoor.png", + tile_side = "doors_trapdoor_side.png", + groups = {snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=2, door=1}, sounds = default.node_sound_wood_defaults(), - drop = "doors:trapdoor", - node_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, -0.4, 0.5} - }, - selection_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, -0.4, 0.5} - }, - on_creation = function(pos) - state = 0 - end, - on_rightclick = function(pos, node, clicker) - punch(pos) - end, -}) - -minetest.register_node("doors:trapdoor_open", { - drawtype = "nodebox", - tiles = {"doors_trapdoor_side.png", "doors_trapdoor_side.png", "doors_trapdoor_side.png", "doors_trapdoor_side.png", "doors_trapdoor.png", "doors_trapdoor.png"}, - paramtype = "light", - paramtype2 = "facedir", - pointable = true, - stack_max = 0, - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1}, - climbable = true, - sounds = default.node_sound_wood_defaults(), - drop = "doors:trapdoor", - node_box = { - type = "fixed", - fixed = {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5} - }, - selection_box = { - type = "fixed", - fixed = {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5} - }, - on_rightclick = function(pos, node, clicker) - punch(pos) - end, + sound_open = "doors_door_open", + sound_close = "doors_door_close" }) minetest.register_craft({ From 3b526a72769cff4ef9296725d4148d8291ab0bb3 Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 21 Jan 2015 15:27:29 +0000 Subject: [PATCH 0099/2261] mapgen.lua: Add dirt/sand/gravel blob ores for mgv5/mgv7 Create register ores function. Select and order functions per mapgen Use blob ore for clay. Update ore height_min/max to y_min/max Tune flower amount --- mods/default/mapgen.lua | 521 +++++++++++++++++++++++----------------- 1 file changed, 299 insertions(+), 222 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 25eb8f8e..72179afa 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -31,192 +31,203 @@ minetest.register_alias("mapgen_stair_cobble", "stairs:stair_cobble") -- Ore generation -- -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_coal", - wherein = "default:stone", - clust_scarcity = 8*8*8, - clust_num_ores = 8, - clust_size = 3, - height_min = -31000, - height_max = 64, -}) +function default.register_ores() + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 8*8*8, + clust_num_ores = 8, + clust_size = 3, + y_min = -31000, + y_max = 64, + }) -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_coal", - wherein = "default:stone", - clust_scarcity = 24*24*24, - clust_num_ores = 27, - clust_size = 6, - height_min = -31000, - height_max = 0, - flags = "absheight", -}) + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 24*24*24, + clust_num_ores = 27, + clust_size = 6, + y_min = -31000, + y_max = 0, + flags = "absheight", + }) -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_iron", - wherein = "default:stone", - clust_scarcity = 12*12*12, - clust_num_ores = 3, - clust_size = 2, - height_min = -15, - height_max = 2, -}) + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 12*12*12, + clust_num_ores = 3, + clust_size = 2, + y_min = -15, + y_max = 2, + }) -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_iron", - wherein = "default:stone", - clust_scarcity = 9*9*9, - clust_num_ores = 5, - clust_size = 3, - height_min = -63, - height_max = -16, -}) + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 9*9*9, + clust_num_ores = 5, + clust_size = 3, + y_min = -63, + y_max = -16, + }) -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_iron", - wherein = "default:stone", - clust_scarcity = 7*7*7, - clust_num_ores = 5, - clust_size = 3, - height_min = -31000, - height_max = -64, - flags = "absheight", -}) + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 7*7*7, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -64, + flags = "absheight", + }) -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_iron", - wherein = "default:stone", - clust_scarcity = 24*24*24, - clust_num_ores = 27, - clust_size = 6, - height_min = -31000, - height_max = -64, - flags = "absheight", -}) + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 24*24*24, + clust_num_ores = 27, + clust_size = 6, + y_min = -31000, + y_max = -64, + flags = "absheight", + }) -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_mese", - wherein = "default:stone", - clust_scarcity = 18*18*18, - clust_num_ores = 3, - clust_size = 2, - height_min = -255, - height_max = -64, - flags = "absheight", -}) + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 18*18*18, + clust_num_ores = 3, + clust_size = 2, + y_min = -255, + y_max = -64, + flags = "absheight", + }) -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_mese", - wherein = "default:stone", - clust_scarcity = 14*14*14, - clust_num_ores = 5, - clust_size = 3, - height_min = -31000, - height_max = -256, - flags = "absheight", -}) + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14*14*14, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -256, + flags = "absheight", + }) -minetest.register_ore({ - ore_type = "scatter", - ore = "default:mese", - wherein = "default:stone", - clust_scarcity = 36*36*36, - clust_num_ores = 3, - clust_size = 2, - height_min = -31000, - height_max = -1024, - flags = "absheight", -}) + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 36*36*36, + clust_num_ores = 3, + clust_size = 2, + y_min = -31000, + y_max = -1024, + flags = "absheight", + }) -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_gold", - wherein = "default:stone", - clust_scarcity = 15*15*15, - clust_num_ores = 3, - clust_size = 2, - height_min = -255, - height_max = -64, - flags = "absheight", -}) + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 15*15*15, + clust_num_ores = 3, + clust_size = 2, + y_min = -255, + y_max = -64, + flags = "absheight", + }) -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_gold", - wherein = "default:stone", - clust_scarcity = 13*13*13, - clust_num_ores = 5, - clust_size = 3, - height_min = -31000, - height_max = -256, - flags = "absheight", -}) + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 13*13*13, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -256, + flags = "absheight", + }) -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_diamond", - wherein = "default:stone", - clust_scarcity = 17*17*17, - clust_num_ores = 4, - clust_size = 3, - height_min = -255, - height_max = -128, - flags = "absheight", -}) + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 17*17*17, + clust_num_ores = 4, + clust_size = 3, + y_min = -255, + y_max = -128, + flags = "absheight", + }) -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_diamond", - wherein = "default:stone", - clust_scarcity = 15*15*15, - clust_num_ores = 4, - clust_size = 3, - height_min = -31000, - height_max = -256, - flags = "absheight", -}) + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15*15*15, + clust_num_ores = 4, + clust_size = 3, + y_min = -31000, + y_max = -256, + flags = "absheight", + }) -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_copper", - wherein = "default:stone", - clust_scarcity = 12*12*12, - clust_num_ores = 4, - clust_size = 3, - height_min = -63, - height_max = -16, -}) + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 12*12*12, + clust_num_ores = 4, + clust_size = 3, + y_min = -63, + y_max = -16, + }) -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_copper", - wherein = "default:stone", - clust_scarcity = 9*9*9, - clust_num_ores = 5, - clust_size = 3, - height_min = -31000, - height_max = -64, - flags = "absheight", -}) + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9*9*9, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -64, + flags = "absheight", + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "default:clay", + wherein = {"default:sand"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -10, + y_max = 0, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=-316, + octaves=1, + persist=0.5 + }, + }) +end -minetest.register_ore({ - ore_type = "scatter", - ore = "default:clay", - wherein = "default:sand", - clust_scarcity = 15*15*15, - clust_num_ores = 64, - clust_size = 5, - height_max = 0, - height_min = -10, -}) function default.generate_ore(name, wherein, minp, maxp, seed, chunks_per_volume, chunk_size, ore_per_chunk, height_min, height_max) minetest.log('action', "WARNING: default.generate_ore is deprecated") @@ -433,6 +444,7 @@ function default.make_nyancat(pos, facedir, length) end end + function default.generate_nyancats(minp, maxp, seed) local height_min = -31000 local height_max = -32 @@ -455,6 +467,7 @@ function default.generate_nyancats(minp, maxp, seed) end end + minetest.register_on_generated(default.generate_nyancats) -- @@ -462,11 +475,8 @@ minetest.register_on_generated(default.generate_nyancats) -- function default.register_biomes() - minetest.clear_registered_biomes() - -- Temperate biomes - minetest.register_biome({ name = "grassland", node_top = "default:dirt_with_grass", @@ -482,18 +492,16 @@ function default.register_biomes() --depth_water_top = , --node_water = "", --node_dust = "", - y_min = -32000, - y_max = 32000, + y_min = -31000, + y_max = 31000, heat_point = 50, humidity_point = 50, }) - + -- -- Register decorations -- - - -- Grassland - + -- Flowers minetest.register_decoration({ @@ -501,7 +509,7 @@ function default.register_biomes() place_on = {"default:dirt_with_grass"}, sidelen = 16, noise_params = { - offset = -0.015, + offset = -0.02, scale = 0.03, spread = {x=100, y=100, z=100}, seed = 436, @@ -509,17 +517,17 @@ function default.register_biomes() persist = 0.6 }, biomes = {"grassland"}, - y_min = -32000, - y_max = 32000, + y_min = -31000, + y_max = 31000, decoration = "flowers:rose", }) - + minetest.register_decoration({ deco_type = "simple", place_on = {"default:dirt_with_grass"}, sidelen = 16, noise_params = { - offset = -0.015, + offset = -0.02, scale = 0.03, spread = {x=100, y=100, z=100}, seed = 19822, @@ -527,17 +535,17 @@ function default.register_biomes() persist = 0.6 }, biomes = {"grassland"}, - y_min = -32000, - y_max = 32000, + y_min = -31000, + y_max = 31000, decoration = "flowers:tulip", }) - + minetest.register_decoration({ deco_type = "simple", place_on = {"default:dirt_with_grass"}, sidelen = 16, noise_params = { - offset = -0.015, + offset = -0.02, scale = 0.03, spread = {x=100, y=100, z=100}, seed = 1220999, @@ -545,17 +553,17 @@ function default.register_biomes() persist = 0.6 }, biomes = {"grassland"}, - y_min = -32000, - y_max = 32000, + y_min = -31000, + y_max = 31000, decoration = "flowers:dandelion_yellow", }) - + minetest.register_decoration({ deco_type = "simple", place_on = {"default:dirt_with_grass"}, sidelen = 16, noise_params = { - offset = -0.015, + offset = -0.02, scale = 0.03, spread = {x=100, y=100, z=100}, seed = 36662, @@ -563,17 +571,17 @@ function default.register_biomes() persist = 0.6 }, biomes = {"grassland"}, - y_min = -32000, - y_max = 32000, + y_min = -31000, + y_max = 31000, decoration = "flowers:geranium", }) - + minetest.register_decoration({ deco_type = "simple", place_on = {"default:dirt_with_grass"}, sidelen = 16, noise_params = { - offset = -0.015, + offset = -0.02, scale = 0.03, spread = {x=100, y=100, z=100}, seed = 1133, @@ -581,17 +589,17 @@ function default.register_biomes() persist = 0.6 }, biomes = {"grassland"}, - y_min = -32000, - y_max = 32000, + y_min = -31000, + y_max = 31000, decoration = "flowers:viola", }) - + minetest.register_decoration({ deco_type = "simple", place_on = {"default:dirt_with_grass"}, sidelen = 16, noise_params = { - offset = -0.015, + offset = -0.02, scale = 0.03, spread = {x=100, y=100, z=100}, seed = 73133, @@ -599,11 +607,11 @@ function default.register_biomes() persist = 0.6 }, biomes = {"grassland"}, - y_min = -32000, - y_max = 32000, + y_min = -31000, + y_max = 31000, decoration = "flowers:dandelion_white", }) - + -- Grasses minetest.register_decoration({ @@ -619,11 +627,11 @@ function default.register_biomes() persist = 0.6 }, biomes = {"grassland"}, - y_min = -32000, - y_max = 32000, + y_min = -31000, + y_max = 31000, decoration = "default:grass_1", }) - + minetest.register_decoration({ deco_type = "simple", place_on = {"default:dirt_with_grass"}, @@ -637,11 +645,11 @@ function default.register_biomes() persist = 0.6 }, biomes = {"grassland"}, - y_min = -32000, - y_max = 32000, + y_min = -31000, + y_max = 31000, decoration = "default:grass_2", }) - + minetest.register_decoration({ deco_type = "simple", place_on = {"default:dirt_with_grass"}, @@ -655,11 +663,11 @@ function default.register_biomes() persist = 0.6 }, biomes = {"grassland"}, - y_min = -32000, - y_max = 32000, + y_min = -31000, + y_max = 31000, decoration = "default:grass_3", }) - + minetest.register_decoration({ deco_type = "simple", place_on = {"default:dirt_with_grass"}, @@ -673,11 +681,11 @@ function default.register_biomes() persist = 0.6 }, biomes = {"grassland"}, - y_min = -32000, - y_max = 32000, + y_min = -31000, + y_max = 31000, decoration = "default:grass_4", }) - + minetest.register_decoration({ deco_type = "simple", place_on = {"default:dirt_with_grass"}, @@ -691,11 +699,73 @@ function default.register_biomes() persist = 0.6 }, biomes = {"grassland"}, - y_min = -32000, - y_max = 32000, + y_min = -31000, + y_max = 31000, decoration = "default:grass_5", }) - +end + +-- +-- Register blob ore +-- + +function default.register_blobs() + minetest.register_ore({ + ore_type = "blob", + ore = "default:sand", + wherein = {"default:stone"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -63, + y_max = 4, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=2316, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "default:dirt", + wherein = {"default:stone"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -63, + y_max = 31000, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=17676, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "default:gravel", + wherein = {"default:stone"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -31000, + y_max = 31000, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=766, + octaves=1, + persist=0.5 + }, + }) end -- @@ -703,9 +773,16 @@ end -- local mg_params = minetest.get_mapgen_params() -if mg_params.mgname == "v6" then - minetest.register_on_generated(default.mgv6_ongen) -else +if mg_params.mgname == "v5" then default.register_biomes() + default.register_blobs() + default.register_ores() +elseif mg_params.mgname == "v6" then + minetest.register_on_generated(default.mgv6_ongen) + default.register_ores() +elseif mg_params.mgname == "v7" then + default.register_biomes() + default.register_blobs() + default.register_ores() end From edb02e9d3361538dea2fdae92f5fe72e712dbbe2 Mon Sep 17 00:00:00 2001 From: BlockMen Date: Tue, 24 Feb 2015 11:59:15 +0100 Subject: [PATCH 0100/2261] Add beds --- game_api.txt | 36 +++ mods/beds/Changelog.txt | 18 ++ mods/beds/README.txt | 45 ++++ mods/beds/api.lua | 78 +++++++ mods/beds/beds.lua | 104 +++++++++ mods/beds/depends.txt | 2 + mods/beds/functions.lua | 205 ++++++++++++++++++ mods/beds/init.lua | 16 ++ mods/beds/spawns.lua | 60 +++++ mods/beds/textures/beds_bed.png | Bin 0 -> 540 bytes mods/beds/textures/beds_bed_fancy.png | Bin 0 -> 537 bytes mods/beds/textures/beds_bed_foot.png | Bin 0 -> 390 bytes mods/beds/textures/beds_bed_head.png | Bin 0 -> 387 bytes mods/beds/textures/beds_bed_side1.png | Bin 0 -> 296 bytes mods/beds/textures/beds_bed_side2.png | Bin 0 -> 316 bytes mods/beds/textures/beds_bed_side_bottom.png | Bin 0 -> 561 bytes mods/beds/textures/beds_bed_side_bottom_r.png | Bin 0 -> 537 bytes mods/beds/textures/beds_bed_side_top.png | Bin 0 -> 611 bytes mods/beds/textures/beds_bed_side_top_r.png | Bin 0 -> 596 bytes mods/beds/textures/beds_bed_top1.png | Bin 0 -> 583 bytes mods/beds/textures/beds_bed_top2.png | Bin 0 -> 616 bytes mods/beds/textures/beds_bed_top_bottom.png | Bin 0 -> 495 bytes mods/beds/textures/beds_bed_top_top.png | Bin 0 -> 556 bytes mods/beds/textures/beds_transparent.png | Bin 0 -> 143 bytes 24 files changed, 564 insertions(+) create mode 100644 mods/beds/Changelog.txt create mode 100644 mods/beds/README.txt create mode 100644 mods/beds/api.lua create mode 100644 mods/beds/beds.lua create mode 100644 mods/beds/depends.txt create mode 100644 mods/beds/functions.lua create mode 100644 mods/beds/init.lua create mode 100644 mods/beds/spawns.lua create mode 100644 mods/beds/textures/beds_bed.png create mode 100644 mods/beds/textures/beds_bed_fancy.png create mode 100644 mods/beds/textures/beds_bed_foot.png create mode 100644 mods/beds/textures/beds_bed_head.png create mode 100644 mods/beds/textures/beds_bed_side1.png create mode 100644 mods/beds/textures/beds_bed_side2.png create mode 100644 mods/beds/textures/beds_bed_side_bottom.png create mode 100644 mods/beds/textures/beds_bed_side_bottom_r.png create mode 100644 mods/beds/textures/beds_bed_side_top.png create mode 100644 mods/beds/textures/beds_bed_side_top_r.png create mode 100644 mods/beds/textures/beds_bed_top1.png create mode 100644 mods/beds/textures/beds_bed_top2.png create mode 100644 mods/beds/textures/beds_bed_top_bottom.png create mode 100644 mods/beds/textures/beds_bed_top_top.png create mode 100644 mods/beds/textures/beds_transparent.png diff --git a/game_api.txt b/game_api.txt index 4d4b579b..d2394903 100644 --- a/game_api.txt +++ b/game_api.txt @@ -24,6 +24,42 @@ The bucket API allows registering new types of buckets for non-default liquids. "Lava Bucket" -- Bucket description ) +Beds API +-------- + beds.register_bed( + "beds:bed", -- Bed name + def: See [#Bed definition] -- Bed definition + ) + + 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 +--------------- +{ + description = "Simple Bed", + inventory_image = "beds_bed.png", + wield_image = "beds_bed.png", + tiles = { + bottom = {[Tile definition], + ^ the tiles of the bottom part of the bed + }, + top = {[Tile definition], + ^ the tiles of the bottom part of the bed + } + }, + nodebox = { + bottom = regular nodebox, see [Node boxes], -- bottm part of bed + top = regular nodebox, see [Node boxes], -- top part of bed + }, + selectionbox = regular nodebox, see [Node boxes], -- for both nodeboxes + recipe = { -- Craft recipe + {"group:wool", "group:wool", "group:wool"}, + {"group:wood", "group:wood", "group:wood"} + } +} + Doors API --------- The doors mod allows modders to register custom doors and trapdoors. diff --git a/mods/beds/Changelog.txt b/mods/beds/Changelog.txt new file mode 100644 index 00000000..988db2af --- /dev/null +++ b/mods/beds/Changelog.txt @@ -0,0 +1,18 @@ +1.0.1 beta +---------- +- Add backwards compatibility with PilzAdam's beds mod +- Fix placement +- Fix small bugs +- Prevent possible crash + +1.1 +--- +- Add fancy bed model (based on jp's model) +- Add API to register beds +- Allow players always to detach from bed (by donat-b) +- If more than 50% of players want sleep they can skip the night +- Don't show sleep dialog in singleplayer + +1.1.1 +----- +- Prevent possbile crash by trying to reposition leaving players diff --git a/mods/beds/README.txt b/mods/beds/README.txt new file mode 100644 index 00000000..20893b81 --- /dev/null +++ b/mods/beds/README.txt @@ -0,0 +1,45 @@ +Minetest mod "Beds" +=================== +by BlockMen (c) 2014-2015 + +Version: 1.1.1 + +About +~~~~~ +This mod adds a bed to Minetest which allows to skip the night. To sleep rightclick the bed, if playing +in singleplayer mode the night gets skipped imideatly. If playing on server you get shown how many other +players are in bed too. If all players are sleeping the night gets skipped aswell. Also the night skip can be forced +if more than 50% of the players are lying in bed and use this option. + +Another feature is a controled respawning. If you have slept in bed (not just lying in it) your respawn point +is set to the beds location. If dying you will respawn there. + + + +You can craft two types of beds: + + +Simple shaped bed: + +wool wool wool +wood wood wood + +Fancy shaped bed: + +wool wool stick +wood wood wood + +Notice: You can use any color of wood or wool, mixing different is also possible. + + +License of source code, textures: WTFPL +--------------------------------------- +(c) Copyright BlockMen (2014-2015) + + + +This program is free software. It comes without any warranty, to +the extent permitted by applicable law. You can redistribute it +and/or modify it under the terms of the Do What The Fuck You Want +To Public License, Version 2, as published by Sam Hocevar. See +http://sam.zoy.org/wtfpl/COPYING for more details. diff --git a/mods/beds/api.lua b/mods/beds/api.lua new file mode 100644 index 00000000..320fcfb3 --- /dev/null +++ b/mods/beds/api.lua @@ -0,0 +1,78 @@ +function beds.register_bed(name, def) + minetest.register_node(name .. "_bottom", { + description = def.description, + inventory_image = def.inventory_image, + wield_image = def.wield_image, + drawtype = "nodebox", + tiles = def.tiles.bottom, + paramtype = "light", + paramtype2 = "facedir", + stack_max = 1, + groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = def.nodebox.bottom, + }, + selection_box = { + type = "fixed", + fixed = def.selectionbox, + + }, + after_place_node = function(pos, placer, itemstack) + local n = minetest.get_node_or_nil(pos) + if not n or not n.param2 then + minetest.remove_node(pos) + return true + end + local dir = minetest.facedir_to_dir(n.param2) + local p = {x=pos.x+dir.x,y=pos.y,z=pos.z+dir.z} + local n2 = minetest.get_node_or_nil(p) + local def = minetest.registered_items[n2.name] or nil + if not n2 or not def or not def.buildable_to then + minetest.remove_node(pos) + return true + end + minetest.set_node(p, {name = n.name:gsub("%_bottom", "_top"), param2 = n.param2}) + return false + end, + on_destruct = function(pos) + local n = minetest.get_node_or_nil(pos) + if not n then return end + local dir = minetest.facedir_to_dir(n.param2) + local p = {x=pos.x+dir.x,y=pos.y,z=pos.z+dir.z} + local n2 = minetest.get_node(p) + if minetest.get_item_group(n2.name, "bed") == 2 and n.param2 == n2.param2 then + minetest.remove_node(p) + end + end, + on_rightclick = function(pos, node, clicker) + beds.on_rightclick(pos, clicker) + end, + }) + + minetest.register_node(name .. "_top", { + drawtype = "nodebox", + tiles = def.tiles.top, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 2}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = def.nodebox.top, + }, + selection_box = { + type = "fixed", + fixed = {0, 0, 0, 0, 0, 0}, + }, + }) + + minetest.register_alias(name, name .. "_bottom") + + -- register recipe + minetest.register_craft({ + output = name, + recipe = def.recipe + }) +end diff --git a/mods/beds/beds.lua b/mods/beds/beds.lua new file mode 100644 index 00000000..531b55d9 --- /dev/null +++ b/mods/beds/beds.lua @@ -0,0 +1,104 @@ +-- fancy shaped bed +beds.register_bed("beds:fancy_bed", { + description = "Fancy Bed", + inventory_image = "beds_bed_fancy.png", + wield_image = "beds_bed_fancy.png", + tiles = { + bottom = { + "beds_bed_top1.png", + "default_wood.png", + "beds_bed_side1.png", + "beds_bed_side1.png^[transformFX", + "default_wood.png", + "beds_bed_foot.png", + }, + top = { + "beds_bed_top2.png", + "default_wood.png", + "beds_bed_side2.png", + "beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "default_wood.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"group:wool", "group:wool", "group:stick"}, + {"group:wood", "group:wood", "group:wood"}, + }, +}) + +-- simple shaped bed +beds.register_bed("beds:bed", { + description = "Simple Bed", + inventory_image = "beds_bed.png", + wield_image = "beds_bed.png", + tiles = { + bottom = { + "beds_bed_top_bottom.png^[transformR90", + "default_wood.png", + "beds_bed_side_bottom_r.png", + "beds_bed_side_bottom_r.png^[transformfx", + "beds_transparent.png", + "beds_bed_side_bottom.png" + }, + top = { + "beds_bed_top_top.png^[transformR90", + "default_wood.png", + "beds_bed_side_top_r.png", + "beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "beds_transparent.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"group:wool", "group:wool", "group:wool"}, + {"group:wood", "group:wood", "group:wood"} + }, + +}) + +-- aliases for PA's beds mod +minetest.register_alias("beds:bed_bottom_red", "beds:bed_bottom") +minetest.register_alias("beds:bed_bottom_orange", "beds:bed_bottom") +minetest.register_alias("beds:bed_bottom_yellow", "beds:bed_bottom") +minetest.register_alias("beds:bed_bottom_green", "beds:bed_bottom") +minetest.register_alias("beds:bed_bottom_blue", "beds:bed_bottom") +minetest.register_alias("beds:bed_bottom_violet", "beds:bed_bottom") +minetest.register_alias("beds:bed_bottom_black", "beds:bed_bottom") +minetest.register_alias("beds:bed_bottom_grey", "beds:bed_bottom") +minetest.register_alias("beds:bed_bottom_white", "beds:bed_bottom") + +minetest.register_alias("beds:bed_top_red", "beds:bed_top") +minetest.register_alias("beds:bed_top_orange", "beds:bed_top") +minetest.register_alias("beds:bed_top_yellow", "beds:bed_top") +minetest.register_alias("beds:bed_top_green", "beds:bed_top") +minetest.register_alias("beds:bed_top_blue", "beds:bed_top") +minetest.register_alias("beds:bed_top_violet", "beds:bed_top") +minetest.register_alias("beds:bed_top_black", "beds:bed_top") +minetest.register_alias("beds:bed_top_grey", "beds:bed_top") +minetest.register_alias("beds:bed_top_white", "beds:bed_top") diff --git a/mods/beds/depends.txt b/mods/beds/depends.txt new file mode 100644 index 00000000..470ec30b --- /dev/null +++ b/mods/beds/depends.txt @@ -0,0 +1,2 @@ +default +wool diff --git a/mods/beds/functions.lua b/mods/beds/functions.lua new file mode 100644 index 00000000..ea3d3af8 --- /dev/null +++ b/mods/beds/functions.lua @@ -0,0 +1,205 @@ +local player_in_bed = 0 +local is_sp = minetest.is_singleplayer() + + +-- helper functions + +local function get_look_yaw(pos) + local n = minetest.get_node(pos) + if n.param2 == 1 then + return 7.9, n.param2 + elseif n.param2 == 3 then + return 4.75, n.param2 + elseif n.param2 == 0 then + return 3.15, n.param2 + else + return 6.28, n.param2 + end +end + +local function check_in_beds(players) + local in_bed = beds.player + if not players then + players = minetest.get_connected_players() + end + + for n, player in ipairs(players) do + local name = player:get_player_name() + if not in_bed[name] then + return false + end + end + + return true +end + +local function lay_down(player, pos, bed_pos, state, skip) + local name = player:get_player_name() + local hud_flags = player:hud_get_flags() + + if not player or not name then + return + end + + -- stand up + if state ~= nil and not state then + local p = beds.pos[name] or nil + if beds.player[name] ~= nil then + beds.player[name] = nil + player_in_bed = player_in_bed - 1 + end + -- skip here to prevent sending player specific changes (used for leaving players) + if skip then + return + end + if p then + player:setpos(p) + end + + -- physics, eye_offset, etc + player:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0}) + player:set_look_yaw(math.random(1, 180)/100) + default.player_attached[name] = false + player:set_physics_override(1, 1, 1) + hud_flags.wielditem = true + default.player_set_animation(player, "stand" , 30) + + -- lay down + else + beds.player[name] = 1 + beds.pos[name] = pos + player_in_bed = player_in_bed + 1 + + -- physics, eye_offset, etc + player:set_eye_offset({x=0,y=-13,z=0}, {x=0,y=0,z=0}) + local yaw, param2 = get_look_yaw(bed_pos) + player:set_look_yaw(yaw) + local dir = minetest.facedir_to_dir(param2) + local p = {x=bed_pos.x+dir.x/2,y=bed_pos.y,z=bed_pos.z+dir.z/2} + player:set_physics_override(0, 0, 0) + player:setpos(p) + default.player_attached[name] = true + hud_flags.wielditem = false + default.player_set_animation(player, "lay" , 0) + end + + player:hud_set_flags(hud_flags) +end + +local function update_formspecs(finished) + local ges = #minetest.get_connected_players() + local form_n = "" + local is_majority = (ges/2) < player_in_bed + + if finished then + form_n = beds.formspec .. + "label[2.7,11; Good morning.]" + else + form_n = beds.formspec .. + "label[2.2,11;"..tostring(player_in_bed).." of "..tostring(ges).." players are in bed]" + if is_majority then + form_n = form_n .. + "button_exit[2,8;4,0.75;force;Force night skip]" + end + end + + for name,_ in pairs(beds.player) do + minetest.show_formspec(name, "beds_form", form_n) + end +end + + +-- public functions + +function beds.kick_players() + for name,_ in pairs(beds.player) do + local player = minetest.get_player_by_name(name) + lay_down(player, nil, nil, false) + end +end + +function beds.skip_night() + minetest.set_timeofday(0.23) + beds.set_spawns() +end + +function beds.on_rightclick(pos, player) + local name = player:get_player_name() + local ppos = player:getpos() + local tod = minetest.get_timeofday() + + if tod > 0.2 and tod < 0.805 then + if beds.player[name] then + lay_down(player, nil, nil, false) + end + minetest.chat_send_player(name, "You can only sleep at night.") + return + end + + -- move to bed + if not beds.player[name] then + lay_down(player, ppos, pos) + else + lay_down(player, nil, nil, false) + end + + if not is_sp then + update_formspecs(false) + end + + -- skip the night and let all players stand up + if check_in_beds() then + minetest.after(2, function() + beds.skip_night() + if not is_sp then + update_formspecs(true) + end + beds.kick_players() + end) + end +end + + +-- callbacks + +minetest.register_on_joinplayer(function(player) + beds.read_spawns() +end) + +minetest.register_on_respawnplayer(function(player) + local name = player:get_player_name() + local pos = beds.spawn[name] or nil + if pos then + player:setpos(pos) + return true + end +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + lay_down(player, nil, nil, false, true) + beds.player[name] = nil + if check_in_beds() then + minetest.after(2, function() + beds.skip_night() + update_formspecs(true) + beds.kick_players() + end) + end +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "beds_form" then + return + end + if fields.quit or fields.leave then + lay_down(player, nil, nil, false) + update_formspecs(false) + end + + if fields.force then + beds.skip_night() + update_formspecs(true) + beds.kick_players() + end +end) diff --git a/mods/beds/init.lua b/mods/beds/init.lua new file mode 100644 index 00000000..09982c24 --- /dev/null +++ b/mods/beds/init.lua @@ -0,0 +1,16 @@ +beds = {} +beds.player = {} +beds.pos = {} +beds.spawn = {} + +beds.formspec = "size[8,15;true]".. + "bgcolor[#080808BB; true]".. + "button_exit[2,12;4,0.75;leave;Leave Bed]" + +local modpath = minetest.get_modpath("beds") + +-- load files +dofile(modpath.."/functions.lua") +dofile(modpath.."/api.lua") +dofile(modpath.."/beds.lua") +dofile(modpath.."/spawns.lua") diff --git a/mods/beds/spawns.lua b/mods/beds/spawns.lua new file mode 100644 index 00000000..5fcf1b93 --- /dev/null +++ b/mods/beds/spawns.lua @@ -0,0 +1,60 @@ +local world_path = minetest.get_worldpath() +local org_file = world_path .. "/beds_spawns" +local file = world_path .. "/beds_spawns" +local bkwd = false + +-- check for PA's beds mod spawns +local cf = io.open(world_path .. "/beds_player_spawns", "r") +if cf ~= nil then + io.close(cf) + file = world_path .. "/beds_player_spawns" + bkwd = true +end + +function beds.read_spawns() + local spawns = beds.spawn + local input = io.open(file, "r") + if input and not bkwd then + repeat + local x = input:read("*n") + if x == nil then + break + end + local y = input:read("*n") + local z = input:read("*n") + local name = input:read("*l") + spawns[name:sub(2)] = {x = x, y = y, z = z} + until input:read(0) == nil + io.close(input) + elseif input and bkwd then + beds.spawn = minetest.deserialize(input:read("*all")) + input:close() + beds.save_spawns() + os.rename(file, file .. ".backup") + file = org_file + else + spawns = {} + end +end + +function beds.save_spawns() + if not beds.spawn then + return + end + writing = true + 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") + end + io.close(output) + writing = false +end + +function beds.set_spawns() + for name,_ in pairs(beds.player) do + local player = minetest.get_player_by_name(name) + local p = player:getpos() + beds.spawn[name] = p + end + beds.save_spawns() +end diff --git a/mods/beds/textures/beds_bed.png b/mods/beds/textures/beds_bed.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0054c6cf9a42d248601d8c527c0a0da2bf92f6 GIT binary patch literal 540 zcmV+%0^|LOP)nsVZn?U zRen}?snu%uzK`$weEC}8{fCb<81o`bsxqz0iW$phJP~0|mB%7{+uml^`^D<&8V??3 z4**lDdD@I@F30%z1Q!R+;__xph)`DLxfvx@=2R)EGOJ42 zj6xkWBtlYz+}Id>kwYYUJ8{c_07d6mFk?}bry|U&GFP9bWJba{lFo5KgiGg+5)Fq) z#=A(L=?c1)Y=U(&UYhMEmdz-caZ7}>2npv%#g7n=bTE?YCUyGQ!4?+p^)Y!P#=I)8 z%y?!-(TqXoxGX~QCFhksW7of2iKF`48%Hv&C1qr@%i-#cdniwGZ^`AYRf9$zS7e) e^$$S1zwtN1Qq}5$b^0~{0000g*HHLyD4EErh^$d!evj~?!;w+tqZzwqymgMeDx1#n?dXW(+7I^j z_St_k^B1t(Ej;stoGM$Yq*ckNl2xT_#?IM0W5(**8tdz?@h4-*Vz=IaP{gq|ZRp&Jk-9GAj#=g#%0sb|R@8%9aQvGv2AP?HoI*&VnKxfzHnFf+Xn~N3;zD6Tfu*Y?3Zb$v zg2=$aA_3zUP;9`2-#iw&AXrdfX>qGJ@60_f1*8tiLCgPuzXI66BWmOr8pFgGtWtzZ zF%w}XLZmgXTJvrUQ)384coAXT%rkE0N!h^TqhF>YLQjP8H)y0ak=DF@FAlXP6k%ix z))=Bj4jXu+s)Zw}g(DtCXp8XRI6NuEK!m;s9i?b1MOSN{wWj4bG#!VlqRUm${c4bC zB(-Sf6QY16?2P83#QW&QJRk|weB8Qo{O_K%6XC6?A_ zaN~V7NL==%cIuMct9I)CzJU!q!rL@)?_ynb-ag~*@`QQ&oVZsatY`T7eyy-^^O>}^ kHKIlq8>9*AnJsvdPtZDUt>P4NqW}N^07*qoM6N<$g2%O|ZU6uP literal 0 HcmV?d00001 diff --git a/mods/beds/textures/beds_bed_head.png b/mods/beds/textures/beds_bed_head.png new file mode 100644 index 0000000000000000000000000000000000000000..763f5e14048e931e237397df959ac20041b5c26d GIT binary patch literal 387 zcmV-}0et?6P)iQ^b)nj#1SL{Wq+%dpvO5QZT<&qI+L6 hP*s3AYVMI2_yGC^`^BWEuA=||002ovPDHLkV1jg)Z%*=ZTOTcn^vn)iA$(CEh(y=mOD|9)MV?|wgnb2TpX^xpv!I3ISX!Ls{+#>4Re*{iYWZLAR{{x+qvt2}TjB*pmasI2 zg)wZb4W-4n@5*!j753>=?Jf)eZ?8=n(&ePTT zw3B$yB@|i0bllhDztGirl;8ylaaf?1Asi2BR0px`@C z7srr_Id>=R_c|OP(yo8@?Bte)$9Ho%wkT|uG~SZ@IK`R$;KD2Q=4@v#EazA|A^d}> zOLCHc$owb80=zF4NH`Y!m{$Cw_PMzXV~1V|*MISYMO9yuo$fE3e86SZY=!Q<@figw zs@|HOIkTBhKML>?n|8D_ck}(%h2iFR%=vBXY=gs0L+=*U1{Xz#`LyXBa^Vuz)Jv<~ zbVIq@Hmtb+Pe|~RgVQ;HVv{c}KYA-8>~q)-v$X}2drqX)`YaJ}mD&^k??m+EI~nJ` zZ=3l__tRrpGq>VxtK+1BX5CM;Dd4Pazfdm0f9vP{e~uH`_AqQXW1hm`TF?yiIfJLG KpUXO@geCwE>46;p literal 0 HcmV?d00001 diff --git a/mods/beds/textures/beds_bed_side_bottom.png b/mods/beds/textures/beds_bed_side_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..99ff309fa2243dc6243b1eb054773eb977b5054a GIT binary patch literal 561 zcmV-10?z%3P)4JgSaUyQK~PuL z2xmguTH8|hOPTY1$I{GNi6aUxgf0w51pS5IE?Px5-PmOp->bvfMwKS|{!x#=!={ZMNgsuoZ z=QvPh!x$RYvS}@CRVpHwx^rxeE;K_S0ulB^=&Ryei*GG`RrW*(L}-RWbXD1Mj=FO{ zfSPl(RaqBd+c}ydbX2KXOU+t3sx(Kl_0h+*pTOsL8T_2b>!Qb?JjZTsmgDL?ZwgmA zEY32hMDbTV_KOh?OCJ8J$8j~r(eoQTNKRk|+eu#LBjgt+DWs>!r=}<-r^qKKDc>3= zdwYy*e40Wk%+tgK*@X)n)zb8jp5=2j~;%9NoM}ZIKbV;t&aZ({#D?u z_q5E|7GXz(rgL=6NK{EwIq;sI8Hor7-qQ*KPRuw`B~`_3h;V4eruXc4&j;t|o6%LJ zBf@?VaAwA_DkrL>-g9O~DneHkx2?*aDjhR+gMdtg6A?a{k$O+ZdwRpUD?(3%jtC#k zXa~V{U`v%lGv14^ugb0ni5XkobD&B~gw%|tb8HWH(&5`~urts3#$$So9O+t~L1UII zD$uXz=*QEXzk5U$>{TCd-h9I6&4;8>fz!Bv`|cSZH@+gh)4y)k=jkytO!#y|Hnxh}z=k>xE)zZDcS`H^!4kvlJaF<{902*{fSad;kbZBpK099;dVPqgvd2@7S bZF4LjNp52<$sIm+00000NkvXXu0mjfQ>pbb literal 0 HcmV?d00001 diff --git a/mods/beds/textures/beds_bed_side_top.png b/mods/beds/textures/beds_bed_side_top.png new file mode 100644 index 0000000000000000000000000000000000000000..b2807c5fa275087fd66be04e6f76e53b6e36797c GIT binary patch literal 611 zcmV-p0-XJcP)H1JHG{o<1xeL3G{ZoM zCXVA!uh(fb1f5QYv$Hc=trm{saDIMHr_(_+n^dbcDkn9HB@L-m(y;6@cDX{eT0@8y zr>CbhgrLz7wA*bQr;QK-Aq354lWMJos_7`X0@BxS-`P7jq;Pc1aZ%+^$#Ha4MAuDp z!$Q?`R8>beObpXP$>ljv6!L{*_78JNyPK0_;y%_Q{bc1EWMv;2*~{CQmqetW?23}PGRk2gymGLO8ZLD7w!op}bi^0ppLT;x0T|@$I z;z1YjF&B~1ZdN0Mq~sy)kGYX{)3-=OJlqSonH|6OS2LkrWdr>Eo{d64K_= zASrp6>5(py4?S!rCfG?%v6Gx)Yc<5e?dxo86Ef?|C|o<;=v$`fvfxgxZ>Zj6KntfnN`yHPynLQoy-uxGr*?9}(eW`qs#WrZBH7)2w3G-7B0N`$ z8C@qS!n_EMQcMN{925^J`xUA`>y%1m{K^pr#Y4PYflr^e(B?!)h_I*>PYi=+BFq{F zNu`MEI{Uc-`9hKJC7(SnhnFj`lig!?&tvP$SG1M!4qiqtDMYc&(U(MT-RL?qZk%xWTLwK6`? zN;K5K=s+9MzVl32jf@5xSexnR^<*!RU<+C#e38F3WVJD5wXvDLi8I{Ao$Ke&Qg%D1 z+~E#37W&D!gJj%6))N*FZ(U+N(Z|L@7pG(@8`@RCt_4l0mK;RS-qbz4h#Fw?7yWh)@Pdh&el8h{RU12P8(U zf(5aUC_zGr^dX7u@9y`i7?_9})!^3PoLlgqgvBI>-q)%n!qRz+f`gs#*t;d!K(pD~qpD|4c7v^|GM5P7_o~J2aL&B-(Ox_| zzJ|pX+%gkR5eaK%!O<3+GX5=4&Q&?80e|;C zOHF#;`&M;~sH%U)5G*!u&D^TGG|x-pE~jeEZ1x_us$118P0}?}Fh@u_k8zM2VClgI z)=c2@h&2I_RD}%Ydg4(5pcNk zR2hyD9iFN-I7T$PNjgMat2US;47W_dWG9?6OR{9R-hb)4Z$9IfpMakE=G{3H18}Qc zpDq#l_Qlsz3qH-i+3@`uy literal 0 HcmV?d00001 diff --git a/mods/beds/textures/beds_bed_top2.png b/mods/beds/textures/beds_bed_top2.png new file mode 100644 index 0000000000000000000000000000000000000000..2fe5bf2b0c133858993413cfa495379f4c4b9aa1 GIT binary patch literal 616 zcmV-u0+;=XP)pG^hrcPRCt_Ckj;@DMG%BDtE#)_?da`Zv=?MCzyJE90XUz}LZ)P=Wg$7n1hB3vfLg05 zA0E!vBfng>h>+o4>u#!MskPQxQxy>&$5Cq))s#|ieU4E|o^7{3{@RvY#vC%lOhu&k z4j`o*;k|bcl#;2kU0$BvJeoUZ_*zyoZLN_~N+x;xa5|mloUM0wobJ|QY5+{FUazK_ zQdZ^B8Ui_|2-I2ukOXn9^^2vyKYlDZi)d@l$x_Z4q+cciqC#@pHV-#V04&1ae)IK+ z(1;|GfEjT_6f%)lcL0m(1U}FC?a$v?yY8917g1oi6F92|aJVbEnmN!T2)wo%zj7hn zUC37=1X@HytRe(H&q;C-abS<=)8*-_$LE_z;Of55X@CIxoS()pG664RT;?S3{=;U) z^iE{BcQTRum%E7Mh!!z`Ma0P$_mjf_2=HK*fNf3zR*?X%5el4DCvZdraIgAB>%FQ+ zbl{aLfWtk2yW7m2WFZyUBbM7>cR!H;K8>Md7IEM*CjccS;(1O7iYkDA08wZmbtryJ zD*ylh8gxZibU}4=Xm4@=RcvKpWFS*{b97~Gb1Wc9ZeuRV9X@sd0000}2bnaV8HDJOC7U?3D1dvS0AV^Zu83clQb}!Ob_gUJL>oK5e zwXaoAdq{t~m#R+Q$CziSV7$r#K*5#-b_lGA0oaqeR_*q+YELdzYjUaDlD9D)_O)tD zZex7eQ~KRq0rCHmBr!abfF!>d42GquR{JPkUiD9VkskJ0TJ77R?#QcVz%Tcm04Hg{ zo+J?z1PX=()R3O9C$s9_eUiTH+p)fCPp-#vX|rb_(qUsjO9xd+1p+546d*O!FT12i zGNk)U%QD86OzCb<=~(|vrZf#37?3PAGz7Nf3_bv)BiW$d#yILf?OAnCkbZXW(mfef z_e52Hk~%mAhK80l=)_W_NRI^R({AY`1zP$C%r-WvXBHb10000QbVXQnL3MO!Z*l-t lY-M3&AX9mBbY*RGEFej4V=l=ZK6U^A002ovPDHLkV1jl<*RTKp literal 0 HcmV?d00001 diff --git a/mods/beds/textures/beds_bed_top_top.png b/mods/beds/textures/beds_bed_top_top.png new file mode 100644 index 0000000000000000000000000000000000000000..e877c808afa166a782c29eef02c051c540db186d GIT binary patch literal 556 zcmV+{0@MA8P)RudT=q5w$>%R$qs7bDXOa89&$XHW03F!LPELS8*iy8J z)?(C%*0^S7O42=ZkVj@Gm;FSpsxDpE+55PztF>_D)4mhf#!!#|1Q4)IfFC8TN05{x zk|bM;F}j9yR_)Sd|KGI77%OwzMrQWj*UD|%0V)9l1^}dO+rVjqgh3L3Z2%<7sads2 z4|_&WB~~zP_AoE7!a>{rRzM;wU)Msn;qnPRg-SE$k)sk{dT*T zalE}(`Tgyvs^d7?0tyh2WCCfE405hjRaL&-@1m|bLyFe^0N<1_(B0*u2BR0prEv; zi(^Q|oa7(>|JyUG&QLnLn5{?3AnQPa5d*`~wSVP9epPk@l}VMjMwB>~mSp4?F@)x% kCZ;F^R~DC~<`(NHc;+SRos_jJ1FB;1boFyt=akR{04v}rR{#J2 literal 0 HcmV?d00001 From ea7b04a7123bf18eb3fa5d70bea4673fc8229dbb Mon Sep 17 00:00:00 2001 From: BlockMen Date: Tue, 24 Feb 2015 21:44:21 +0100 Subject: [PATCH 0101/2261] Use only red and white wool for beds --- mods/beds/beds.lua | 21 ++------------------- mods/beds/spawns.lua | 16 ++++++++-------- 2 files changed, 10 insertions(+), 27 deletions(-) diff --git a/mods/beds/beds.lua b/mods/beds/beds.lua index 531b55d9..acff444c 100644 --- a/mods/beds/beds.lua +++ b/mods/beds/beds.lua @@ -42,7 +42,7 @@ beds.register_bed("beds:fancy_bed", { }, selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, recipe = { - {"group:wool", "group:wool", "group:stick"}, + {"wool:red", "wool:white", "group:stick"}, {"group:wood", "group:wood", "group:wood"}, }, }) @@ -76,7 +76,7 @@ beds.register_bed("beds:bed", { }, selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, recipe = { - {"group:wool", "group:wool", "group:wool"}, + {"wool:red", "wool:red", "wool:white"}, {"group:wood", "group:wood", "group:wood"} }, @@ -84,21 +84,4 @@ beds.register_bed("beds:bed", { -- aliases for PA's beds mod minetest.register_alias("beds:bed_bottom_red", "beds:bed_bottom") -minetest.register_alias("beds:bed_bottom_orange", "beds:bed_bottom") -minetest.register_alias("beds:bed_bottom_yellow", "beds:bed_bottom") -minetest.register_alias("beds:bed_bottom_green", "beds:bed_bottom") -minetest.register_alias("beds:bed_bottom_blue", "beds:bed_bottom") -minetest.register_alias("beds:bed_bottom_violet", "beds:bed_bottom") -minetest.register_alias("beds:bed_bottom_black", "beds:bed_bottom") -minetest.register_alias("beds:bed_bottom_grey", "beds:bed_bottom") -minetest.register_alias("beds:bed_bottom_white", "beds:bed_bottom") - minetest.register_alias("beds:bed_top_red", "beds:bed_top") -minetest.register_alias("beds:bed_top_orange", "beds:bed_top") -minetest.register_alias("beds:bed_top_yellow", "beds:bed_top") -minetest.register_alias("beds:bed_top_green", "beds:bed_top") -minetest.register_alias("beds:bed_top_blue", "beds:bed_top") -minetest.register_alias("beds:bed_top_violet", "beds:bed_top") -minetest.register_alias("beds:bed_top_black", "beds:bed_top") -minetest.register_alias("beds:bed_top_grey", "beds:bed_top") -minetest.register_alias("beds:bed_top_white", "beds:bed_top") diff --git a/mods/beds/spawns.lua b/mods/beds/spawns.lua index 5fcf1b93..39da21c2 100644 --- a/mods/beds/spawns.lua +++ b/mods/beds/spawns.lua @@ -16,14 +16,14 @@ function beds.read_spawns() local input = io.open(file, "r") if input and not bkwd then repeat - local x = input:read("*n") - if x == nil then - break - end - local y = input:read("*n") - local z = input:read("*n") - local name = input:read("*l") - spawns[name:sub(2)] = {x = x, y = y, z = z} + local x = input:read("*n") + if x == nil then + break + end + local y = input:read("*n") + local z = input:read("*n") + local name = input:read("*l") + spawns[name:sub(2)] = {x = x, y = y, z = z} until input:read(0) == nil io.close(input) elseif input and bkwd then From 3e912f7b85ec42c1d0a5b049337d2a66a5b5c946 Mon Sep 17 00:00:00 2001 From: MT-Modder Date: Fri, 13 Feb 2015 19:21:36 -0500 Subject: [PATCH 0102/2261] Add reverse recipes for hoes - Adds material for crafting (keeps def.recipe compatibility) - Fix two typos in api documentation --- game_api.txt | 5 +++-- mods/farming/API.txt | 5 +++-- mods/farming/api.lua | 28 ++++++++++++++++++++++++---- mods/farming/hoes.lua | 36 ++++++------------------------------ 4 files changed, 36 insertions(+), 38 deletions(-) diff --git a/game_api.txt b/game_api.txt index d2394903..99c34a78 100644 --- a/game_api.txt +++ b/game_api.txt @@ -125,7 +125,8 @@ farming.register_plant(name, Plant definition) description = "", -- Description for tooltip inventory_image = "unknown_item.png", -- Image to be used as wield- and inventory image max_uses = 30, -- Uses until destroyed - recipe = { -- Craft recipe + material = "", -- Material for recipes + recipe = { -- Craft recipe, if material isn't used {"air", "air", "air"}, {"", "group:stick"}, {"", "group:stick"}, @@ -138,7 +139,7 @@ farming.register_plant(name, Plant definition) description = "", -- Description of seed item inventory_image = "unknown_item.png", -- Image to be used as seed's wield- and inventory image steps = 8, -- How many steps the plant has to grow, until it can be harvested - ^ Always provide a plant texture for ech step, format: modname_plantname_i.png (i = stepnumber) + ^ Always provide a plant texture for each step, format: modname_plantname_i.png (i = stepnumber) minlight = 13, -- Minimum light to grow maxlight = default.LIGHT_MAX -- Maximum light to grow } diff --git a/mods/farming/API.txt b/mods/farming/API.txt index 9234bc44..171c3c38 100644 --- a/mods/farming/API.txt +++ b/mods/farming/API.txt @@ -9,7 +9,8 @@ Hoe Definition description = "", -- Description for tooltip inventory_image = "unknown_item.png", -- Image to be used as wield- and inventory image max_uses = 30, -- Uses until destroyed - recipe = { -- Craft recipe + material = "", -- Material for recipes + recipe = { -- Craft recipe, if material isn't used {"air", "air", "air"}, {"", "group:stick"}, {"", "group:stick"}, @@ -21,7 +22,7 @@ Plant definition description = "", -- Description of seed item inventory_image = "unknown_item.png", -- Image to be used as seed's wield- and inventory image steps = 8, -- How many steps the plant has to grow, until it can be harvested - ^ Always provide a plant texture for ech step, format: modname_plantname_i.png (i = stepnumber) + ^ Always provide a plant texture for each step, format: modname_plantname_i.png (i = stepnumber) minlight = 13, -- Minimum light to grow maxlight = default.LIGHT_MAX -- Maximum light to grow } \ No newline at end of file diff --git a/mods/farming/api.lua b/mods/farming/api.lua index 6ce996d8..8c27233f 100644 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -83,10 +83,30 @@ farming.register_hoe = function(name, def) end }) -- Register its recipe - minetest.register_craft({ - output = name:gsub(":", "", 1), - recipe = def.recipe - }) + if def.material == nil then + minetest.register_craft({ + output = name:sub(2), + recipe = def.recipe + }) + else + minetest.register_craft({ + output = name:sub(2), + recipe = { + {def.material, def.material, ""}, + {"", "group:stick", ""}, + {"", "group:stick", ""} + } + }) + -- Reverse Recipe + minetest.register_craft({ + output = name:sub(2), + recipe = { + {"", def.material, def.material}, + {"", "group:stick", ""}, + {"", "group:stick", ""} + } + }) + end end -- Seed placement diff --git a/mods/farming/hoes.lua b/mods/farming/hoes.lua index 084d586f..31da19ff 100644 --- a/mods/farming/hoes.lua +++ b/mods/farming/hoes.lua @@ -2,64 +2,40 @@ farming.register_hoe(":farming:hoe_wood", { description = "Wooden Hoe", inventory_image = "farming_tool_woodhoe.png", max_uses = 30, - recipe = { - {"group:wood", "group:wood"}, - {"", "group:stick"}, - {"", "group:stick"}, - } + material = "group:wood" }) farming.register_hoe(":farming:hoe_stone", { description = "Stone Hoe", inventory_image = "farming_tool_stonehoe.png", max_uses = 90, - recipe = { - {"group:stone", "group:stone"}, - {"", "group:stick"}, - {"", "group:stick"}, - } + material = "group:stone" }) farming.register_hoe(":farming:hoe_steel", { description = "Steel Hoe", inventory_image = "farming_tool_steelhoe.png", max_uses = 200, - recipe = { - {"default:steel_ingot", "default:steel_ingot"}, - {"", "group:stick"}, - {"", "group:stick"}, - } + material = "default:steel_ingot" }) farming.register_hoe(":farming:hoe_bronze", { description = "Bronze Hoe", inventory_image = "farming_tool_bronzehoe.png", max_uses = 220, - recipe = { - {"default:bronze_ingot", "default:bronze_ingot"}, - {"", "group:stick"}, - {"", "group:stick"}, - } + material = "default:bronze_ingot" }) farming.register_hoe(":farming:hoe_mese", { description = "Mese Hoe", inventory_image = "farming_tool_mesehoe.png", max_uses = 350, - recipe = { - {"default:mese_crystal", "default:mese_crystal"}, - {"", "group:stick"}, - {"", "group:stick"}, - } + material = "default:mese_crystal" }) farming.register_hoe(":farming:hoe_diamond", { description = "Diamond Hoe", inventory_image = "farming_tool_diamondhoe.png", max_uses = 500, - recipe = { - {"default:diamond", "default:diamond"}, - {"", "group:stick"}, - {"", "group:stick"}, - } + material = "default:diamond" }) From df353603727e6084ae32b4c3d2c6e97f851f0ce2 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Thu, 19 Feb 2015 20:26:30 +0000 Subject: [PATCH 0103/2261] Make empty buckets stackable --- mods/bucket/init.lua | 70 +++++++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 23 deletions(-) diff --git a/mods/bucket/init.lua b/mods/bucket/init.lua index 6715ebbf..2bdb4714 100644 --- a/mods/bucket/init.lua +++ b/mods/bucket/init.lua @@ -103,31 +103,55 @@ function bucket.register_liquid(source, flowing, itemname, inventory_image, name end minetest.register_craftitem("bucket:bucket_empty", { - description = "Empty Bucket", - inventory_image = "bucket.png", - stack_max = 1, - liquids_pointable = true, - on_use = function(itemstack, user, pointed_thing) - -- Must be pointing to node - if pointed_thing.type ~= "node" then - return - end - -- Check if pointing to a liquid source - local node = minetest.get_node(pointed_thing.under) - local liquiddef = bucket.liquids[node.name] - if liquiddef ~= nil and liquiddef.itemname ~= nil and - node.name == liquiddef.source then - if check_protection(pointed_thing.under, - user:get_player_name(), - "take ".. node.name) then - return - end + description = "Empty Bucket", + inventory_image = "bucket.png", + stack_max = 99, + liquids_pointable = true, + on_use = function(itemstack, user, pointed_thing) + -- Must be pointing to node + if pointed_thing.type ~= "node" then + return + end + -- Check if pointing to a liquid source + local node = minetest.get_node(pointed_thing.under) + local liquiddef = bucket.liquids[node.name] + local item_count = user:get_wielded_item():get_count() - minetest.add_node(pointed_thing.under, {name="air"}) + if liquiddef ~= nil + and liquiddef.itemname ~= nil + and node.name == liquiddef.source then + if check_protection(pointed_thing.under, + user:get_player_name(), + "take ".. node.name) then + return + end - return ItemStack(liquiddef.itemname) - end - end, + -- default set to return filled bucket + local giving_back = liquiddef.itemname + + -- check if holding more than 1 empty bucket + if item_count > 1 then + + -- if space in inventory add filled bucked, otherwise drop as item + local inv = user:get_inventory() + if inv:room_for_item("main", {name=liquiddef.itemname}) then + inv:add_item("main", liquiddef.itemname) + else + local pos = user:getpos() + pos.y = math.floor(pos.y + 0.5) + core.add_item(pos, liquiddef.itemname) + end + + -- set to return empty buckets minus 1 + giving_back = "bucket:bucket_empty "..tostring(item_count-1) + + end + + minetest.add_node(pointed_thing.under, {name="air"}) + + return ItemStack(giving_back) + end + end, }) bucket.register_liquid( From f86ac2fdffba76621935e2ea62038107f5269daf Mon Sep 17 00:00:00 2001 From: jp Date: Mon, 26 Jan 2015 10:23:25 +0100 Subject: [PATCH 0104/2261] Optimize textures and model (use *.b3d instead *.x) --- menu/header.png | Bin 156026 -> 80804 bytes menu/icon.png | Bin 5776 -> 3008 bytes mods/boats/textures/boat_inventory.png | Bin 1468 -> 851 bytes mods/boats/textures/boat_wield.png | Bin 847 -> 546 bytes mods/default/models/character.b3d | Bin 0 -> 86880 bytes mods/default/models/character.x | 7457 ----------------- mods/default/player.lua | 4 +- mods/default/textures/bubble.png | Bin 544 -> 459 bytes mods/default/textures/crack_anylength.png | Bin 583 -> 348 bytes mods/default/textures/default_apple.png | Bin 320 -> 251 bytes mods/default/textures/default_book.png | Bin 222 -> 201 bytes mods/default/textures/default_bookshelf.png | Bin 639 -> 471 bytes mods/default/textures/default_brick.png | Bin 596 -> 351 bytes .../default/textures/default_bronze_block.png | Bin 568 -> 356 bytes .../default/textures/default_bronze_ingot.png | Bin 232 -> 224 bytes mods/default/textures/default_cactus_side.png | Bin 589 -> 314 bytes mods/default/textures/default_cactus_top.png | Bin 546 -> 267 bytes mods/default/textures/default_chest_front.png | Bin 630 -> 423 bytes mods/default/textures/default_chest_lock.png | Bin 670 -> 469 bytes mods/default/textures/default_chest_side.png | Bin 576 -> 375 bytes mods/default/textures/default_chest_top.png | Bin 607 -> 422 bytes mods/default/textures/default_clay.png | Bin 318 -> 272 bytes mods/default/textures/default_clay_brick.png | Bin 178 -> 158 bytes mods/default/textures/default_coal_block.png | Bin 290 -> 240 bytes mods/default/textures/default_coal_lump.png | Bin 160 -> 157 bytes mods/default/textures/default_cobble.png | Bin 739 -> 268 bytes .../default/textures/default_copper_block.png | Bin 608 -> 359 bytes .../default/textures/default_copper_ingot.png | Bin 233 -> 225 bytes .../textures/default_desert_cobble.png | Bin 241 -> 235 bytes mods/default/textures/default_desert_sand.png | Bin 647 -> 350 bytes .../textures/default_desert_stone_brick.png | Bin 516 -> 249 bytes mods/default/textures/default_diamond.png | Bin 397 -> 313 bytes .../textures/default_diamond_block.png | Bin 659 -> 572 bytes mods/default/textures/default_dirt.png | Bin 730 -> 277 bytes mods/default/textures/default_dry_shrub.png | Bin 217 -> 148 bytes .../textures/default_fence_overlay.png | Bin 240 -> 219 bytes .../textures/default_furnace_bottom.png | Bin 578 -> 274 bytes .../textures/default_furnace_fire_bg.png | Bin 289 -> 129 bytes .../textures/default_furnace_fire_fg.png | Bin 660 -> 558 bytes .../textures/default_furnace_front.png | Bin 656 -> 307 bytes .../textures/default_furnace_front_active.png | Bin 1694 -> 1024 bytes .../default/textures/default_furnace_side.png | Bin 689 -> 296 bytes mods/default/textures/default_furnace_top.png | Bin 578 -> 274 bytes mods/default/textures/default_glass.png | Bin 204 -> 158 bytes .../default/textures/default_glass_detail.png | Bin 183 -> 135 bytes mods/default/textures/default_gold_block.png | Bin 648 -> 483 bytes mods/default/textures/default_gold_ingot.png | Bin 313 -> 225 bytes mods/default/textures/default_grass.png | Bin 859 -> 263 bytes mods/default/textures/default_grass_1.png | Bin 226 -> 140 bytes mods/default/textures/default_grass_2.png | Bin 257 -> 153 bytes mods/default/textures/default_grass_3.png | Bin 319 -> 179 bytes mods/default/textures/default_grass_4.png | Bin 443 -> 211 bytes mods/default/textures/default_grass_5.png | Bin 550 -> 260 bytes .../textures/default_grass_footsteps.png | Bin 827 -> 722 bytes mods/default/textures/default_grass_side.png | Bin 473 -> 347 bytes mods/default/textures/default_gravel.png | Bin 219 -> 201 bytes mods/default/textures/default_ice.png | Bin 371 -> 254 bytes mods/default/textures/default_iron_lump.png | Bin 163 -> 160 bytes .../default/textures/default_jungleleaves.png | Bin 193 -> 184 bytes .../textures/default_junglesapling.png | Bin 193 -> 190 bytes mods/default/textures/default_junglewood.png | Bin 297 -> 230 bytes mods/default/textures/default_ladder.png | Bin 703 -> 467 bytes .../default_lava_flowing_animated.png | Bin 3210 -> 2315 bytes .../textures/default_lava_source_animated.png | Bin 2758 -> 2193 bytes mods/default/textures/default_leaves.png | Bin 744 -> 304 bytes mods/default/textures/default_mese_block.png | Bin 302 -> 224 bytes .../default/textures/default_mese_crystal.png | Bin 237 -> 222 bytes .../textures/default_mineral_diamond.png | Bin 280 -> 262 bytes .../default/textures/default_mineral_iron.png | Bin 922 -> 172 bytes .../default/textures/default_mineral_mese.png | Bin 345 -> 234 bytes mods/default/textures/default_mossycobble.png | Bin 819 -> 315 bytes mods/default/textures/default_obsidian.png | Bin 162 -> 155 bytes .../textures/default_obsidian_brick.png | Bin 418 -> 195 bytes .../textures/default_obsidian_glass.png | Bin 217 -> 128 bytes mods/default/textures/default_paper.png | Bin 200 -> 197 bytes mods/default/textures/default_papyrus.png | Bin 3804 -> 234 bytes .../default/textures/default_pine_needles.png | Bin 512 -> 203 bytes .../default/textures/default_pine_sapling.png | Bin 406 -> 210 bytes mods/default/textures/default_pinetree.png | Bin 693 -> 280 bytes .../default/textures/default_pinetree_top.png | Bin 802 -> 574 bytes mods/default/textures/default_pinewood.png | Bin 455 -> 223 bytes mods/default/textures/default_rail.png | Bin 270 -> 242 bytes .../textures/default_rail_crossing.png | Bin 271 -> 262 bytes mods/default/textures/default_rail_curved.png | Bin 259 -> 241 bytes .../textures/default_rail_t_junction.png | Bin 256 -> 247 bytes mods/default/textures/default_sand.png | Bin 338 -> 253 bytes mods/default/textures/default_sandstone.png | Bin 414 -> 258 bytes .../textures/default_sandstone_brick.png | Bin 561 -> 336 bytes mods/default/textures/default_sapling.png | Bin 195 -> 190 bytes mods/default/textures/default_sign.png | Bin 699 -> 442 bytes mods/default/textures/default_sign_wall.png | Bin 501 -> 416 bytes mods/default/textures/default_snowball.png | Bin 268 -> 183 bytes mods/default/textures/default_steel_block.png | Bin 604 -> 357 bytes mods/default/textures/default_steel_ingot.png | Bin 283 -> 201 bytes mods/default/textures/default_stick.png | Bin 168 -> 130 bytes mods/default/textures/default_stone.png | Bin 388 -> 233 bytes mods/default/textures/default_stone_brick.png | Bin 442 -> 258 bytes mods/default/textures/default_tnt_top.png | Bin 146 -> 143 bytes .../textures/default_tool_bronzeaxe.png | Bin 224 -> 192 bytes .../textures/default_tool_bronzepick.png | Bin 249 -> 210 bytes .../textures/default_tool_bronzeshovel.png | Bin 298 -> 233 bytes .../textures/default_tool_bronzesword.png | Bin 194 -> 168 bytes .../textures/default_tool_diamondaxe.png | Bin 238 -> 195 bytes .../textures/default_tool_diamondpick.png | Bin 257 -> 219 bytes .../textures/default_tool_diamondshovel.png | Bin 285 -> 222 bytes .../textures/default_tool_diamondsword.png | Bin 207 -> 177 bytes .../default/textures/default_tool_meseaxe.png | Bin 252 -> 205 bytes .../textures/default_tool_mesepick.png | Bin 248 -> 201 bytes .../textures/default_tool_meseshovel.png | Bin 285 -> 213 bytes .../textures/default_tool_mesesword.png | Bin 222 -> 194 bytes .../textures/default_tool_steelaxe.png | Bin 238 -> 199 bytes .../textures/default_tool_steelpick.png | Bin 237 -> 202 bytes .../textures/default_tool_steelshovel.png | Bin 276 -> 213 bytes .../textures/default_tool_steelsword.png | Bin 194 -> 168 bytes .../textures/default_tool_stoneaxe.png | Bin 221 -> 177 bytes .../textures/default_tool_stonepick.png | Bin 284 -> 210 bytes .../textures/default_tool_stoneshovel.png | Bin 284 -> 221 bytes .../textures/default_tool_stonesword.png | Bin 218 -> 183 bytes .../default/textures/default_tool_woodaxe.png | Bin 227 -> 168 bytes .../textures/default_tool_woodpick.png | Bin 225 -> 181 bytes .../textures/default_tool_woodshovel.png | Bin 253 -> 184 bytes .../textures/default_tool_woodsword.png | Bin 190 -> 159 bytes .../textures/default_torch_animated.png | Bin 1099 -> 833 bytes .../default_torch_on_ceiling_animated.png | Bin 1133 -> 916 bytes .../textures/default_torch_on_floor.png | Bin 222 -> 214 bytes .../default_torch_on_floor_animated.png | Bin 1093 -> 830 bytes mods/default/textures/default_tree.png | Bin 626 -> 309 bytes mods/default/textures/default_tree_top.png | Bin 763 -> 659 bytes mods/default/textures/default_water.png | Bin 581 -> 257 bytes .../default_water_flowing_animated.png | Bin 4403 -> 1607 bytes .../default_water_source_animated.png | Bin 3626 -> 1283 bytes mods/default/textures/default_wood.png | Bin 342 -> 218 bytes mods/default/textures/gui_formbg.png | Bin 1967 -> 971 bytes .../default/textures/gui_furnace_arrow_bg.png | Bin 463 -> 324 bytes mods/default/textures/gui_hotbar.png | Bin 306 -> 284 bytes mods/default/textures/gui_hotbar_selected.png | Bin 1872 -> 1649 bytes mods/default/textures/heart.png | Bin 368 -> 293 bytes mods/default/textures/player_back.png | Bin 142 -> 140 bytes mods/default/textures/wieldhand.png | Bin 153 -> 129 bytes mods/doors/textures/doors_brown.png | Bin 127 -> 109 bytes mods/doors/textures/doors_glass_a.png | Bin 204 -> 158 bytes mods/doors/textures/doors_glass_b.png | Bin 204 -> 158 bytes mods/doors/textures/doors_grey.png | Bin 115 -> 105 bytes .../doors/textures/doors_obsidian_glass_a.png | Bin 217 -> 128 bytes .../doors/textures/doors_obsidian_glass_b.png | Bin 217 -> 128 bytes .../textures/doors_obsidian_glass_side.png | Bin 88 -> 82 bytes mods/doors/textures/doors_steel_a.png | Bin 449 -> 273 bytes mods/doors/textures/doors_steel_b.png | Bin 461 -> 260 bytes mods/doors/textures/doors_trapdoor.png | Bin 350 -> 257 bytes mods/doors/textures/doors_wood_a.png | Bin 555 -> 294 bytes mods/doors/textures/doors_wood_b.png | Bin 539 -> 291 bytes mods/farming/textures/farming_bread.png | Bin 548 -> 393 bytes mods/farming/textures/farming_cotton_3.png | Bin 147 -> 144 bytes mods/farming/textures/farming_cotton_4.png | Bin 155 -> 150 bytes mods/farming/textures/farming_cotton_5.png | Bin 160 -> 159 bytes mods/farming/textures/farming_cotton_7.png | Bin 228 -> 170 bytes mods/farming/textures/farming_cotton_8.png | Bin 331 -> 196 bytes .../textures/farming_desert_sand_soil.png | Bin 637 -> 467 bytes .../textures/farming_desert_sand_soil_wet.png | Bin 590 -> 351 bytes .../farming_desert_sand_soil_wet_side.png | Bin 601 -> 272 bytes mods/farming/textures/farming_flour.png | Bin 164 -> 159 bytes mods/farming/textures/farming_soil.png | Bin 835 -> 706 bytes mods/farming/textures/farming_soil_wet.png | Bin 831 -> 677 bytes .../textures/farming_soil_wet_side.png | Bin 109 -> 96 bytes mods/farming/textures/farming_straw.png | Bin 892 -> 887 bytes .../textures/farming_tool_bronzehoe.png | Bin 258 -> 212 bytes .../textures/farming_tool_diamondhoe.png | Bin 244 -> 183 bytes .../farming/textures/farming_tool_mesehoe.png | Bin 230 -> 181 bytes .../textures/farming_tool_steelhoe.png | Bin 230 -> 181 bytes .../textures/farming_tool_stonehoe.png | Bin 263 -> 185 bytes .../farming/textures/farming_tool_woodhoe.png | Bin 222 -> 171 bytes mods/farming/textures/farming_wheat.png | Bin 249 -> 241 bytes mods/farming/textures/farming_wheat_1.png | Bin 174 -> 120 bytes mods/farming/textures/farming_wheat_2.png | Bin 220 -> 142 bytes mods/farming/textures/farming_wheat_3.png | Bin 319 -> 172 bytes mods/farming/textures/farming_wheat_4.png | Bin 358 -> 191 bytes mods/farming/textures/farming_wheat_5.png | Bin 409 -> 218 bytes mods/farming/textures/farming_wheat_6.png | Bin 456 -> 234 bytes mods/farming/textures/farming_wheat_7.png | Bin 493 -> 253 bytes mods/farming/textures/farming_wheat_8.png | Bin 577 -> 310 bytes mods/fire/textures/fire_basic_flame.png | Bin 719 -> 646 bytes .../textures/fire_basic_flame_animated.png | Bin 1216 -> 1051 bytes .../textures/flowers_dandelion_white.png | Bin 2954 -> 142 bytes .../textures/flowers_dandelion_yellow.png | Bin 3013 -> 133 bytes mods/flowers/textures/flowers_geranium.png | Bin 3030 -> 163 bytes mods/flowers/textures/flowers_rose.png | Bin 264 -> 136 bytes mods/flowers/textures/flowers_tulip.png | Bin 3002 -> 143 bytes mods/flowers/textures/flowers_viola.png | Bin 291 -> 153 bytes .../alternates/vessels_drinking_glass.png | Bin 167 -> 0 bytes .../alternates/vessels_glass_bottle.png | Bin 166 -> 0 bytes .../alternates/vessels_steel_bottle.png | Bin 238 -> 0 bytes .../textures/vessels_drinking_glass.png | Bin 508 -> 188 bytes .../textures/vessels_drinking_glass_inv.png | Bin 508 -> 188 bytes .../vessels/textures/vessels_glass_bottle.png | Bin 341 -> 200 bytes .../textures/vessels_glass_bottle_inv.png | Bin 341 -> 200 bytes .../textures/vessels_glass_fragments.png | Bin 741 -> 497 bytes .../vessels/textures/vessels_steel_bottle.png | Bin 425 -> 257 bytes .../textures/vessels_steel_bottle_inv.png | Bin 425 -> 257 bytes mods/wool/textures/wool_black.png | Bin 2863 -> 213 bytes mods/wool/textures/wool_blue.png | Bin 427 -> 269 bytes mods/wool/textures/wool_brown.png | Bin 435 -> 267 bytes mods/wool/textures/wool_cyan.png | Bin 430 -> 305 bytes mods/wool/textures/wool_dark_green.png | Bin 361 -> 259 bytes mods/wool/textures/wool_dark_grey.png | Bin 2933 -> 265 bytes mods/wool/textures/wool_green.png | Bin 401 -> 308 bytes mods/wool/textures/wool_grey.png | Bin 2906 -> 315 bytes mods/wool/textures/wool_magenta.png | Bin 435 -> 301 bytes mods/wool/textures/wool_orange.png | Bin 431 -> 288 bytes mods/wool/textures/wool_pink.png | Bin 224 -> 221 bytes mods/wool/textures/wool_red.png | Bin 435 -> 292 bytes mods/wool/textures/wool_violet.png | Bin 339 -> 251 bytes mods/wool/textures/wool_white.png | Bin 2917 -> 306 bytes mods/wool/textures/wool_yellow.png | Bin 297 -> 263 bytes 213 files changed, 2 insertions(+), 7459 deletions(-) create mode 100644 mods/default/models/character.b3d delete mode 100644 mods/default/models/character.x delete mode 100644 mods/vessels/textures/alternates/vessels_drinking_glass.png delete mode 100644 mods/vessels/textures/alternates/vessels_glass_bottle.png delete mode 100644 mods/vessels/textures/alternates/vessels_steel_bottle.png diff --git a/menu/header.png b/menu/header.png index c22192d0f8d8a7c2e0dfe0b624b31f5c5218a27e..2866626eef393f4765f682101aa8b09ef9780487 100644 GIT binary patch literal 80804 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 LNkvXXu0mjf@6&QC literal 156026 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

>^4cNlCL0y%plJt8o z@H6vXNo#3FWba3uII?3>wv07}4*j(mD8F3&d_1h9TP4ZeGwpsHRM7hv4b<}3dm0^> z45|E_2Bkhp5YS;6r03G7`H9wFsm(>td;`u=D-1U`=NbUr;nNJQ*IgK~MJ`>cjO}*ary=VuIVM{xh}V(zv7e{z#AE?RiAQQm zf6VfE`z)Q0HZGd1;Q_!tDvxd#TMjT0B3 z;_#-TYAIRNo~oP)04lflsCoE`WVj*J20T)rDhUw;PmN@nMk&;RLbg1^F!d70F62nV zy)V8{lW=H~SG|yQDJ&Lt=;zhce5zh|&I{StrGR3b^!~uIQ`#-yhTYGfVy@k;<$j76 zCYo$@n$SWnKOe?sPR!wZI8(7a%6)-=FRCepDv4P1u}7?=H@#6pmi&qKo6Y=xEkMQo zJFR=qZ?lcJYhceSUvu8m)sLSAjaApr-7Pu)pO?Y^(RA+rOuzphPm1KQN{ld-Q{_zN zG*c-mht*p-Gp8u#FsHCNpN|U_BCAxAGdZ6R8AIz;2R#4I zSPuOf0Ti5c9!7L_LKBMZmn0_8%y>;&0V7#gW&6OWOykXGdfSd@^J$iYD|cx{H_5R@ zbK5eDdaISp$)7{*;$u7>zG=tyIKDKC7i>N0O9XIkZ(+%|F;HgPg6kh>pTwqsiHJxI zwM6xBDSAnB%Y~L9eyq`r)(zG1UR?Cx;fX!mm<(;y-KlTkn!z%GgUr#$ba`C;C8<(x zSITgtJKNsIuawTlztRaj5X#xwcS8Spd1K&{RH>;^-7)0Ep&G;6)S6dIxnlJxeShyK zQ!c-TskViCpr{bQbsC}geV2o+e0D8)^ zGIVT)9OG^tZS*7u`Hn|-282qzR@0@_#7cUIRwj9dIQCn0DEifWAa`8)tyhI&x*8K@ zz)3Tp{eK$6hBc=JK$J;${%-wT@))_LPI&4c!e?wGDr}|njp=G^)jtVyBJ!0%3pW0z z@*d%lO}2SUH}CsPo{ZZ^BXgmZOIOE)fp}6pK+Nr0{Weu*fEHuzGwG@;?C>cAawH(5 zp)`h%lndDBG4~o++7{N|Ta@KU9N&z!<%70YxHF5sY$rV46m6aiujlj-6>`mZfT{aD zLI2CqFn;fAJ%Z>JIPt0iXy8_#0$fE$a=X6?bpnb{a1LB?L9%mWhq<_!KG(-_g%ujA zf+nuY93qVj9*&xL%e`Oi+2~5mn|$EF-ZeH}lU)n-B1`Z1T7*+o)FgOd6y&s%R+8N* z=q@x(qSp5-Lw_t|>Z#?j*kHDZoXsOv9GJv!h}Y=!;2GZyAm4)nt|KCGLaxCyoIcWh z_5H+TqsM-M*g9K{F6u3NdD2K-2Ny~$^lIlv5_ab2)BTt3Z$p)%`5~39j8%w^{}`H6 z!67C>bWAB@%Ag@bBc)llsc?!;mcGoN#?2}_wyy5Zfdc|psfEwymnTxhEq=M`p^BEz z4D58VX!o(miqA?S6o`0HtjEzqt!X>@j&_;&x+>=)Z=P?>D?lM{eFpp zP8*fQ?gT4f_hHJ3tj&a#3yO#dT=Cd=2IP)u(c!W7I1owq*P9R{HuSDQ z{sX|P-)V51@QiTPaD9T1tL$M*z9OZ2Cw$N4i;Tbinah$|O#N~5xl5cDM#&#Bd|v-< zVrBnEzJ)gAN>!fF@I6@5Rnv2*u_j2JxDBl(S*wKInkbz@Z4JGgJJlz3=DZBJCQ&ks z$}fJ#iYvm4H}hn_rT0T<=<9eU@txwftPyj_C6@^U-RDWpU=^GG94v1ym_#MmouVu)Lcb@ z7(w|h;?=k*zu#|QDRYLqX3-4QnJrn%e{Z&^2dOjklx{HyMR*Vr(kG97SDK%Bf~B<1 zkJkIUjefD5T%8mI*Ia+CL*G(c6+Bl{Rh9B-Q1GeEV)vISc239p^87`PXLOlfO+voJ z369?(n>SViKaV)%JMh%229a{V?(VjW^IG+SXCljT@SC!$1GAkU0}|O=24Mr_yF7{N zP}Q1#Q6oO(%iZHVMf=NTCYx1ELGjsFYiL|k+fc#NuyKHhPV=psW04D|O^%Pu(Z9vT zal*-n1Rzpmy=AyfHV5f``?V94GSw7n8O~Wl)ok*6^-Q#WcFA`}qb@{RR>a;i;Ud}+A%mR`)aY02w38BD^xZMoiyL8#^-L^}xjh4hsx z=RkWsukz{OnRjL2Ev_(Pq!_MQj8Le^ezu~Om!Z}@ZxcosQJYuT6qdQdXZgIOOywjYTlZ4uw84?M^`@QjkQd0P~a{GPd75ZgU|FE74seb`EjHiQN z+vom?TBOWzDi?(&ay1Zs1?){sv?un_Ra-AP!SC#fId!_BP#1hdGE@{J&0aNZ5Ow!) z7lX)mq3vyU0mGy=WiiBJl`{32qFr#-%{-$3szbFfaFfGpwWGCyoY~AW+_kV)o}PHU zLCpeb3pE?0eQuZ1?~TI9I~tZ;O|pSplHph?5*7&!oC0o?8fDlMvcx)JRF zU6;)Ix|?>81~|xBb>03kd#`y?Zb?Xa-|4LHSDX(fRXMbgr&_aq>aO*9e+~HgRCG8g zY^=O~Fch7$VI{7enSB0(d(Cp?QC=n(fBZupYPD8 zjNY!Eyd4`Sx0%wZ=drI-xa(faiCVNd=r}Nco4*7Ibf6Ngbh&KU?rRczyv_p&q7gQH z-e>YI6jZEB0J#!nBqk;$iatf(ROv-xP4EYD*Lv>N+(pjV?4_XEnM{g=`qU3~Ht+VH zv~j?X>vocm4>;Yd_b8ya_O8Ac)^kSiegZD+qz(0~Qm&RHAa5#Tk*_`06{@Y{budZc zgbFkr-ovaiOKv|aS9>@Cj^8@D7v*oy! zjB8Nani=vY|88Y*D~giwoi0hLn$1svMf0xQw(@v{*|~lXy$5-;y7rG9Zg)Wav3 z?xcNOH|VMS5hm}@*bpO=+h~p^!FYt7N=2#05~a8s*=Q#Rl6J19$RJDx&pA;e!nx&C z(fMyV=VrsA6xN0_$g#xuoNx-i7ir$Gro$@~a2a8_Zy*S*9KZ7vLNsX&Of{_Ov-bM! z)kMQTlc=8^8HB1VwWCCYHK-qA_r8udZH~KeDLQLZ4c218Qa;>*w1sdOUk|(=uVTXJ zun}^=wL+9Q6|!>2pB1xnXpGxaIM|ySCqq2;t94R^EX%h()`P-5HV?bXt;%y08KR&~ z8ZS^}mgTY0=#4Ti*`$6R453dT7EO}~y@JT{6>HIoRwP&wC!2Q=@L9`DtU$!G#Gl_K zbgMs;_iWx{dp=FDs9U&~d9vvY@#z5pSfE7CnhJcD|>aIp%2pz|3UwVjrbXOKwk-c(iT)M!+!T^DAY(sH>BzX-uLyzKf-+0Jp%Y4GKm0(p`5rIZ;vWLB{nrjYKyxbG6dPuG6 zYiKv|$xSIFof^Cp#C*^ybPi+pu#=o;^RZJXkUlCjgD5INUjy6wDdsH3^jb+ki7_dB zN3)z+$rM?JGo-nW1g|8@=`Sv*ySjfOY~ISp7zy@ToZXq;Mbo$GOE{+H)?f&LKk?(Ot-ShZQobEPgTH4#-3*X(y%yhR47d z`o^YP$w*z1MY4$IU0pdeG1-fzkh&CcPu^Kofz~O$4D;{PP|GmMrHM4HXNr_paCT-fsky9Z=l1NwBq4G z#_qGmgQ}^Jf0txm9N$@BHv-QWdua$ug$rDZeaI2@ol zFgS9^KK6EIesN{}<6_q!WpRLXnBs+|JbakMYe%!AT_6Vf{ry$ZQyouDI8pt4Q})Qv zETWL>KM?@7SH>_h{mpT++8gw2oy_%zDiwFW9%bk7qVZo38Nnm`?Y{v^B`ISofVrFu*Y6}zmA2OYZXS>6jDzSXNhUl;T^RzE;W>r;BZtx;yrYoYi?b6 z&+dt_Pm$^n^0zpFN~%7e_|6GZ&P52}+Pj5#r~R%UTF-8Gzqk1Ma)OM&ZT;BcEnpxb zx(Vfr`Lem?b!D*J%F}jXw;rxV8{3p;4h9R~Nv-$zk6|r$Fd3PwI!3;IWJT|)^V&ds zLiyeZ=z3eFxf%_Zt7cR@7cLVwQ*lt?5LEkIeRqB7rRQUcI20GvG^Zc!oa^a!iv2MjKmzylVZ{Pi#W`F`+!?P=>GT#_ZB65 zU>3mvQo60p^20SGt6~nxR&uQFK(c>XKmUP!htxr`lStF*m8dYaqd8yySW)C`6}w#k zB}H!K;yC#hUn3m!O2*8C+N%s`^|^onvu-Gb@qziud+)7R+PpvS@X9c#7k%vfWWt>rGx)(!PCgJWf<+_?Zv{6-D<#_1{U;D&h#&2~&lexSVm zsC=+}dPZpqJXF(HUtxXSHP!JS{PEL#0;ghV@N-!J^%@5;QHF6hE>0dY9D}0wb_fUg zBR1ITcTuz9jNz zr0iKvW_5$=X5SnHE;DZ~U5J@`zg(IrYWAn7HSWk}<(d zaS}2atU3vTK&lFWlg{mT$}A$S#Z8jO01^kYk9V?+c9%0U>LN#cBkLLQ9_wiloUU{# zTO2BtJe4iVDfUj|oE|GH0-Uf(5(qL4tp(R_yeqS zqL;_TnYnZI%b#g~uWy$0p+8qxi>}16$IW(n!h6Ah53@l+B^=Zwq4L^uFY&__9)f+< zGT8i(e)hF7&^CrcYO#0=ku@g1aIUN8LRa|7xf6-X7vNXDKi@4sqak5<+4n6i*{9$B zuI9rhczR03py<}l%4TpOts~2>(vNy6RY-_?DVZJJ>t@W-g7eF$h zuA$S5MI=;gbtBBqyM3*dmbZr{vB^LmYR#}p3{;gg6_y6N8!Z^tL zhCcv*5HXV2$b3yoIrcj(|I~AdD_2fAc-=q!{S$hvdaU#VFzZ4LjOLYlYNUWBB@A{- zj{!_AC?@2`C-L^9H>Wb0czSKnKcc3lueIOqf=o3^W&s-1n||>u$&;;EgeYg?h!Zs{iz)dRM;>=3D9-bn(-hswI_zp1XG2lUsiMVhNP z8PA@-e{Mh$*h2ZW(f9bKy?Zf%TO}VL?P@lcAQLs#uK=w}pdhlrWSg_z!`6Qf0LOdb z`f&uZZ^JlG!K5iSYB(QY){+bia?3>zE+8t1)om7^fyT|au;Kz5H%6!`Au1E0Y{Idg0vrMTpmSn%?h=y}?Kjs>M#a`;mCd#*?EcRAT zRiS+__rfwyD=Tp)TEX%yPg4GBperJ`zx%rO{;j zwfV*Kd;2B;sD~6eKu;Uz8`63G?Ob)8Yi*~NyaHj^#TNZ0D$Wty7e{?@^fuzs2`7N~ zYNsp%-|G&2oMBsKX#AnivT55Lcr0BDWFXFUGrzeAb(>SuWc3-3b>Y;fJNy7dM<(zZ zbYxBmXb0^mf(Csk%ZfDaEX;MxM+WNZpiTySlXYHFHy59_e^z!ttr}CWSXCc8y3JSP z^_kQ4k~PM|H^M|Y+7NXsU}Q8&yYA1)-4O%z)?IH&GvtTecyrMzVWTdHMc_hzSzudG6NeAh*mbhkcT;5P6sjxdMbm5EuX=`0 zTsi$Bw~cmEV4UZ66H;^|uO<1`Wy?sOgp+!gl?E(s;~qn0n{wyg8Bs{Lzq==dW=B4Y z(!6~|sb?d++x$5HxF9YM3*Aqf;4|McKRd|mQX6B!H&{*wEMxs*D13drdFP+IE;za= zT5o?Dklvz8k^yK6$hd~o(KEQDLp!2o)4p9Oh&KH!DeOrrov}DF^Fz;b`!Yscn^+>$ z3%L+x8umu&w)y4cm;|VAzwf;H=~&p(x0Lma{Iar*y_AT8dj+RWR2cPdW8y-CZ|Ikb z350Qteih>jV7$NzU3i%oJsXvwLr%8|u=w2d$-*_GPF-9fAz6Yp&BV;1#Lk?l8ycTG2AB5UxQFeyisoW zVjjyC+;r6MHH|*<#cJ==B`E|SG$2hH?ZG0j#`#NS7M%Op2VVnzVME?|B?&<8&`hkEky(-V zZ4Ntn%*=b_(mxv}EhQ_z8x6JiI^#7tFz3e|RTwufT#ar zo^YA5O@DW1u)Yj@Xo05;LfKfwmEeJ^DnP+3YKm;rwths)yjXe03xtS32)^yUpfFCb^?BWIgVwBLYMd@>3zK7yU#jEqn;FKu zCf3I(C3ywxx^>T^a*XyIN_VM%V)Pv7uylM$bsRB7NYP`Z{7}eeQFl2!moE0rww-B( z`j|QWxv9)QQ<@@^!>31ogw<*fTWxpnHwaM%yexI-Y990!9^9oq^HRQ*s$4F(g7|6< zcfTo~p2W|<@%i>D>kj;E-mI!tR`||28^7k5IrA&Q8k_P(B9EX4np!>)dI<)Fw_WFW zkNaUWZ!LsebQrPm=>g-b>#b`ikAcgzfLx`2s+GLmo9E2^zFDuypaSQ-2o5WGb@t*S ziO&L)V=|j@H$>?lGg}wuI0LpKG&&kN^>ae95>dXRcT~ptoD`J_gog7Ne5YAc21PY2 z76|j}yc-)DH;7Q;l;PX|^Q38iGB5tuuDx^lmE&5oc+1InUE1<$6*^Lp*=#a*9N1}K zlW410zf+<9OT!^<(77_g(-rVWsofn^yuZWpl?aQsEwn^=g$QzvhAM{A<7R%|Q)z(w%d+Ccu$HBsd{4CnQi_>Ew+V8Fk&7}>jWeI-xm}%l zJ{g)+q+vteszbMUkL+oYcbYVV8Elw$2n3yQItt3lBUvDe2AemB`hrmpnzpx=*jy?m zr!wTnCu$l8gYM6GPb;2DWQcc0To8S22;%#0AM{g!>%`n${VNIakuz!wXKK=?t+_s1 zT|N~_JTDo^w&ZbHBQBIr6|Tg^Gke*bct}<}{CyUmPEJMgt(H&e^e#BOhJ<~ibZ|xf zTa(zRV(~nuWxQI(!`z41J4kK;x(PF5MGr2(S>fvM?xnPhU;P4Gyqi`x@v&vbX@31M zpb?q)OFg<&S50JNu-`hXfDdqF5w9+KGFeE20S@!W{Cea+YK{HvUxN03;ogH) z_E;T0C%pKfh)D&a*o(KPGb8J31_a$M6KYF|Y1vMnz(+%C#EpjSVWO1}qUs$VaO6^hQ+m+KMiGGn;!6DQSmRc2_MT~kREN#Ba(<0 znj`|>Yd9u0t4~s84Hu8Q!FTP-d1L0rrU#y8$qSMrQXI3VNzY*;E^erqN9r^>rMzg=E1 zQLU!$3gbkkhW-D_q?Ttz5NA}9%=qm0sYAKfCcaBoYjH-RbnIq$L=o81cwPbE!KZiO*bjBbN-T8y_Rcvw2-+`;M`F~ZFd0ysx z2ow-U1a*o`mmg8q&@QDF&Itnk7&u|TygZ#f<6jKwkUXp=2c_`M|AjRWl?SUeG7aVz z)%gbfv==>9UBzU^Y(htg#U_bT=;zFb(sn)V0;}^ZCY;-=x{BL_F#P5fXh;6EPyu+v z19}`7F{aKDxS(j!>&V$O`ywOGE>Rw(WvXz+SyP` zk@Y(%=n%A`>(crawpeDDCpt6E%^a{icS2O>=BB0l#USSqCpo!N${XHMun=nKGX^$S z=YBYcA-upiBoA&A-_DS{7xVjsj?#+OaLAx-FAY~vsVF&WZT3n2_6us2p{@Gb(2BzwRjWib6E4b7V>kIsl{Q~K7N^I-Wbs6FfGu)%x<@}M_1|4Q) zr_D}`XLS@>#Tz%XPl53)IhEx%ODF&3^6hu(YyT5w(_qg0p(s_>{BV=TnO}jBn9zah z=%6&gMVZTN+VtGRZBkL#**_3XMZSKZ`le98ByiS3Xf%>X_sgTZm7PC$nWR> z?*&kK2f3TQ^3Eo1uxGL4OSoF9f=ci0Jk67o*`ARw(&EAg1}8kp+cytl^4q|yYq|A> zU{nwhvTN!U*x7e9=RbD1UT=fe)rI?zyTY^w#t#UR)2s%4qmQ7P=yS|WOB!C>1Vyj6 zM}!SDSq67VUd@w~P>^b{$8%2iB856(%zJz@Tt;kiq#kwia5K4I8CmP3|0Lo-Go_Y~ zmYzQ*@mKzm<(f1-vnZKqxA)_aUnaGs?LEeTc0Iw~1PNW=Et7hRp*9Frl+uBC+6Olnrq{bCCd#zX+UtL9Ki|Jw-zFj+!-@j{OC za1?(fvGT;c0VB@$@T^DECfke~3%xTk943<~=Y;$~zvKlywrE;>dad98t@}2)r#dG4 zu)M{-CFU`Udpd37^zVZ$RE6enyMQ0I9pa1s#lA4#lp#}gDR5>bLKSYFIiLktSa}d0 z8XEOwur6XWJ8Y67vD;Q=M;Z<}>Sj;gzxdoD>9kK*trvw*_@U~3*ssFa3T(+N2{D>Y z%T%43n7?DMX#F>A*R`Oga&BrPbZ@`L_NeWos+@dkdA#jDJpoZ6v5wO{7A&B)d$1Q* zu*k#Qtdzk9@Ah%uL^Iwh^!<()Ru#NUS4pkl@2(e@k^FG=wxQI8sNBeeO9EVl$o%_f zss$7SN6kYp(N7A?iXJ|_S7dkb`MDdfuRZd<;C(?fBgq$uPSA7I2CWiNXyFN(KO_XY zvbsTo@?+jd4@n&^gjufyg${1i7w;TzgzUzP@oQ=uMb2*JLw>`;C=Trc6W*s?cTN4u(Uj!g8qfmD`psE#NzSv6{SN-a{i zr@PiFTs_n^2PlaCh}F3H7q8INmRB~;=~clifo4@oGs`zZ?Oj*a*VogNtoxOJ;g=;8 zrzA$$qc~+Piqfck=R+wlrv=#@!@p>Lr?50hm!%!=!0~69Yr2TKRCS>xGjy$BK25n~PUZWx#<`j@`S|0I#CCIhxtO$w?v{JY z&V%5jfXyz+;yL%7ArK6$$5K#uWbGWh2c&~j_NZ+D$MW2^+FZ5cN){aVd)aEo6-|6R zz{Bpz?r5{JQ%Hq-iWFRQxUl^M4ALP0-rW-B(ZKLi=nsn1^kO-Mgoqbc%B95>7V7?Z z>lKvzn+KumKF5iRR$)B-2SHdLc01<3J{S}+&{3iGePy-)YeUGT2m!X+6k8WN;hGCt z3Ox!hiE$C0hrQ=~$#(GSGw|i)9r*rI24%G?O=n82A<$ra~5e*)4u^p2gQrs|7L zVXAO`E6NS)Z|$4Yg8vy5GMgCKA>2%@{Gw&VF2g?f8&AU=1)92&UQTHQ zPezGxy784-0hf{{?6Ml-)HM^__qNks&SrFSFe}sKx8vm-YMfxk%e9i5Kok)trs*tX z08;1~F*sh%(a5iz^oPNff7UuDNbEVp%@rp&c{qEtT&mpI9|7gAM{NCI2cO;Levk1m zRx#EHKjE%;U-<7Qk&5^&0db%j!rxmKN2 zD{Qnf(odZemA)3!5iKEX6`nn5RCn@W#x}h@Vnqtm&8ZPAwc6+j?;RkN3_6;Yak!>UIQe5M+$l_B8}zZ|^GT!Yup19I*8#SLlU>v)uybHWiL~ z6xG0`bVGbv*@ssw9q>mpEQM6~t>b%pB!J(SCd~r%W|Tld0mP?%b810l?+)`ZkWI|6 z(gYwEzEy(?(P4wFeu^5zi5?seqc6xBuq>qEX&X7u<-?Pssvo2pGu`AAyq!r2?zGR- zH_u-*M2G9`?<|CA^?b>%-Lc-SMCkJGm-W@&$;;m*#>8P9=44csYMhC+^wH?sF$^(&UCIp9&+l3A7wvtp954PPj3dr!_Eo zP;IkI@Ys!fiy6E!VBiL6eI>Q~eFdKuQRWuEeydrZF$GOJ=>Ecmyj764bz^;2KF8Zo z9ppfA6-B$Ny6OZo>FnH(Jm{Uxyk1a7R-ZzopcrZo0EW|O#^G9}zTI{CwRh+=u@aO=uH#w{IUlbbAhF+Xzv^-V4{ zHv{8jJoRd@?xG>SJoC6GZX_fuvjh{T362*(q<8FhG^6hTXMm{k=k$(dmyKM}%@m{& zUp8L5rm&Dow2<%MMmQ6@{kwe(bZ3}Lxa-I14y6~y>L|Ju7(?i_ydHmm!d`MGXKUpf zp5P?c0OFnZqvD}pbJ)(<_j;Y;VFQrv(DfRJv99=)*&0^~?QJzabsRS&wYM$G>vg-m zEl37msOt6!t>D?)(Rj2urYt;eT;Pkfcw2@jfQi@rd{F6~sCX3HdU|4SOFfqp>S38I zia6k=to6NSmwoZ>jIbqHBJYZ^ekr$BDp6xk6Xx?=fDIR~?CksML}q+Vr1eRk_|tW? z+?2~GFBKHsXE5+H@|~09^$Y1OpFUALT>kqAZ(C{1_B|DTx?(ro2C;s4Oprfx+MC`p z?{?wq=AA&|IT2ktIcv07b~c=J0Qc4I)jtIIIbkP?Y{<@)vA~$BJ6|!V3lR!qj3*bi zFH0)RCMUi>xWGQxeA9a-E72LHf;-DF_)2ukfd|=k7a5DXA^v6_OPyBeO1S%HvGcLl z4cm-Ii5XCQVr^pWXD}D>K02e|IVQTz96yTc~sAuMO%f5D<^QNb&A7-M5W1Etb^+)2mWMHD9o33*^32o{G9^ zl$7hG7hxeJCu|mS2E=E*^KtUVAYmV0;Tsvek#Mxlcse~^D-TiAb*ahw2lkH*@lJ}_ zv?w8~2U3$dr2!i9XAT}FAjwfYqRR!ZfCh{SjRvb9%ZBg_9$Pv|)#=Bs$SMm48Pf6J z5y=cKIOvlis>QaIG9^9dp768T5up{z|nEuHoCtEO<9+O&Qs z%Ery{4P?yw4t!yERb@9dJ9>ft%?5qLt?5j>fyNHWS8Hv&#H8IQmh*b`f2O|P9(Iqh z-e1eULMzj3H!n(yX1HFNhMWRmDSXH8tZpnc8zHV_4yMeRHhAkn>**iaTUK4zQ|0%A zd)v(dh?f*9t*)gloK|i0pv!P)BIZOIyk`j^l|RV$JvH%C$t7HWz6n~dMmL_8Nlsm2 z{c5}9*N~(;AvS}UKu=QMlv@p<%T;lV@NI2j{#HMxDx{d6GZwp%G-ZR=Tc4rMj?CNM3C5QBOb=$oZ>qbLaC2KqEh50YUd;TN_BS# z6pVGbXcqf-p!W~6EBU!*W8)8NENT-@+Z6eNk&?S&l(U13-x`O#aWQMHTpj9Q#63;mrMxvq_wwQ`9bstt;-i%kep>GYCPvc3Q4Aa$1Z&&X$0LDIyuxG zyZMTzIvlZ;45fZMo=p(0vl;1vX>QzWJo2mF9dbqgsI9Ylwu#(}X6vv_=l{^Qlz*k^YDdsC;>w@~-+#%cqG5l9HgXkw&PghzJ^kOwJ{tfR``Lz3T?Yr~kB{F!hl)AwKFN$bcjzP{d8aVGH=vsBBMObHuPX zxPlMMg>%F}lr!JsHU1Xd%M%)trU62~1RTYhD!pOfFK3rdnUt1a5C|sFHEdR+VG2|v z;FnKFJ^A6=te2B&!P~5$3jJ<-gtbXe+}Zk1r(`@+;*vm_AjMeZoLEv>YxK1@vE^`^a`Qv`r? z0r7odcb>^r7l{c0(q@Y27}6P|?L++pus!T1^wqOev4Bz_0NNXeh4s8C^G;e4JlZrq z)82)LN_{GddC0FWy83(5AS}$`>hHmjP)G3=g5nW<-*zK->^mE|P2_3l#j$-6n2gP8 zEZ5j6KvZ)&(iyv1MLi*jO*IHj)O|m7k89?7WU7^1TwYYiUlMc$7 zOA2-FFqLg&!(dw>+1vzP&_xBxfcvZpw>nhE%%BgfLHN9}D`j%pHWq-&n8h?kbx$ z&ajRfiaqtLpl#-iSWyI?7J;nu9Sj`%-d%SwbCwhXL$-Z2)*d(HfV?VUVJ3R;h5+D{ z*YE=cv1Pr<#M8TN1NbRRY#U$Mk#o9Nu0;WGtW>i*p*kH6oT!rr_Si@1x3rMkwI1@6 zHxgVFjkbx-I@fq$f31|_&9#=iY#-SqXoLHt>L2kExx3fRU2#gH-7cx0O?kh<#G7sw zEMs2ovVxi#Jqy~p)Bb1#YMa)rt2=LbEjRaw^Y00S1gmIIFbs%CR<7=}pVlSnhcy%j zZSS4v7oUd(bpA9c+4*)v?RfAN>P#}Xc|{@k`y?x7?u-Ft)|0Z`O8hUqcTAjOmIkqL zR-xa@`gJBKR*waWrd`+lB{Ex?Vhg&)I#{9mEc(`dsd$KAR?gC14x95&0PUf-}I zD1vWdR?dlG4$c|M{>I{9QcEq?5( z)$Qk3Uq9gyNItV{D#jLn_nyFGQ3+)73aH-C@QI3CqD}t94CG1?*FD`X`<(|481iwLzC1cY~;S&9Y3018+sWllHhbQ zJ^6ysE$4ivdpw!@ZxE+_a_@6ML<+D@5O?}(rNsC5Vk;8Qm>^|1An}(ZhU7&@*!joz z6Hg~d=$|U>K%Ac^=qo}}akmNdi-JNw+6m%!6iiH#ZAz~GAj7S6><_TjxN&`|+cu*LWoL)@w@E>8Gka`VPM9Qr zmD#9Ir{K835N4m$9@4$+I?->@eRxhQci){U$=9`0b9_;7(p3bMQjxaQZtai;+rI|h zZUE#+yDmNrqzsOUEL{}`kk1_ls?|IQt9qpOtB_F*>UbO3ylY$i+&2tk7}lv-ae06> z=0aoE9l)WXW?3GQvK$ktA#0MOLFl%ljEX_h`#1upI*mgv0i;d5$Ne{Qwc@i~M zHS{c}=_31)%PHtyk0iIuI>~T-s6aP}8gFeQ+$~;SaT`?G+Y#L=x89Z3@U{JUvHR-S zA}+2;m63iAJT-b(i+C-M0WdMy;_OT*?JZ+6|;qsd^Kj(Ia}d;~26`6U8B z!PZAS5Di2iaQsZ8lX1VP6Ln3CXI(AqyNrf3;CLUgP>-a&HD*q;2lzJ%xpKC2J(~RH z>dbmXDCY}U%m1)OFLio4+5eZ*9Q`3`4bgV`*lo@<={oI1J}}6+JOZIIo}jn8b#E(5 z`BF$JZ1YTLkDjR(L1+vDXw?321Xt5tgox#MM;8N8cmp1Boo5D;p6n`dqE^81Ml?#L+Y6?uJq=DVLtVsgvouA5t-pJ5DN7)H|->Q?< zALTimjJgLRCSr>XsNLWI622i(LCfJUy^!Ja^5sj?Y80DKpFe$DDhaSZA`zND77}1t zq#Y+B$T%rtl(VaI%)1Z)v%VDa@9=W<9kTO>oGgt~g>8+gMkjnv21$KbNk4sC@Jr9! zw{-KNv}Z+^FX@?^C|o~(+2QofpfltXe9Cz?fj#r0CYR&bd&2c@y;8i4a5iHyKMZZx zI#OvDOA$IsO@FS^fBZQNSO1;1t~zhpGIMpMkn0pyjy#CB+b!>}Ae)}6!lp#NKMaX1 zyu7sWu41(tn3wA=EfYfR7C%{Y$A}Yq-w1~h6%pU$v`mx;D!1afe?N370x;(MdNJe& ztbl&by_zQ}9|LK#E6j${eT>k8nz^+rF1PRMt-()~H`FD%D@viZo?aovns-oS+ z3774T*sK+QcMy1auvyxtDWNuok*vx$KZ)+pyjyal(aD>;FWa+}Zpyqy+To`RAd6d( zbp?I?dnAAimc_MCNePqzif`BR`SPDT>Jd;c72as?AZ#WyZ@<`OsONd#1{@@h{;V>T zZsqv#=By7rK)cm!CiD5+%u$K(tW(vq&KlVJq^ClMH=MEhn;9K^2FM#OO>G?!?>=BS z<#Q8d$0nWPEPUnuQavJEef%a*h9fFg-=Q4;?E2h`QrsaGkq0!jspB0SF4Z-0hk}=V zo;G#jfj*-`%ua{FQYKFrV?cV3SgYjB53jUd|1RuUcu&m6kslmrJ)0)sGAk+~*Rmw& z+70H;CfgX15_o(@k=)N(?-FEcQ=~FHHb*(~QO;?7cB1Xq?Z!`Yiy)}wIik6QB-CNB zw_i$bS$`kb+EJW%%ge7+AoGHT4n1Q0l$=?Y{tmZ#zl2V*<>jM4u){yUXRanecb8=q zs-_~tTdfe^`vq?^Z}HjqJ%#7?dF>I;wb~u64V+|Gcg*BD>{4Wa=27L(07uEA^tcWA zU7MNGOt+KGtG~MqMO!YwLYm*Ex(Q(`H7DrN&34<{|BcB=QHvy$8U_vUiG8@^KinF` z^Im>bwp8zkvUxd_3UjJ_#d&!}w%f5+XELMr*zuk?r6*=s!$ZjO^Q`sc#jsMf?r}V7AsCLY|+OONQ!&7Yr4YXe8`dn-#wgcW6|I~(3)(l8&DXOisa^m3^Xfkw?%M< zQ1K@FTeUjVYjfo-%Ws=Q4|TH(7&hl(^9u$^GaAF?5%wZ>z7$wv+)PfwSHO zOIy8M6?cAY`@B1Tr|r3%_^bh{!bugc`5sUAO`ONMNxfgUH0;`22TEB zX96K@W=G7HqcB^sT0W>cbN}JmZe%It&^?*$dqP@m;@)xvW>4?T%K zoz*cbo3kq=^6Bi^h`6S;2VCRp62>Rg1;@9ml?vOklujqBZ-rPj7-ylJXYXn)ZAC%U zr@ZyJ9dk>{{181=-G&PXpO0Pv$VXJUEX7>hU@1ITz%R14?ZO$U)Mn{6Z+Rg`zjDjF zo|HL}&>?!oT{9l$p4@TI%{^|Fnun9GxoBU0+H`T@j&LPhLo6E~1O6oqq#B)xm_tu=S-!g!1rtK^x z(eS%(0X5}~-C$aruZnlL;TVaK$NqC0BRud*Hbu z$C(h#Ps6N}r1i8wF`a*7j!P5AJB}w!6xg7zfTqmh#NqC-(m$25WlcW4?bY>I1rZE5p!Q!gLXX0QLtExE(N|zS!!YrHOhb*;XL48?rlC|< zgm$BpD&@7f0BG6W(Nh#5^T5$={H85Gk64Pn*LxAK^Rg{BcVCh6yasPBEJ_?rI$=|o zs~HjlI8d@fyKgIpVP~+V$UpUkhzwOw==N~)#&mRF@Be!Nu!Gf%jbXF%yI128 zkWKcMxyZoHN8H+z1AW~dVFKNLlx$wNroeElP3S!LUQf6o97!!0b+G0v*5d!9W|t^N)mtWx7PwSD<2ytaHECvzPbZEn2=nkMv&hU)BL$%jaENM=$+wyj7xpA zBAxMG0aDH_Jx1);ukTVg9KE3Ugg~+gqu{b3Lm1xu$|Qvr|ADyC^OGGe8TpQpa!uCk zZF*)$pQB9BRn~lq|3}k#_$ArCVZWS}gUsB6-1WG!QgK0LY32HrPiZ-Dl~0Na?i4XK zB`2DdTPiCnbEo1Sh$C}lD&|DopaL#H)R*`DeBS@zzOL)M&*M102l>vS>S0IW)X8I4Uo)`W_8{C1ik&<+6(d^)ou`|vou~t0d+roL=@Fw1pT^G zbWL4BUelR2cPnLbbHF1}clDfuDTP-^?jK~hmw8jKNK}fuA?mCKDh!}=GacGHx$7IB zgG9=xjP!{ ze)rEr{ZLwg5rEHf|ERSyvvs-4T(8F>zpZm%EfGXW{rupi3ADK;`%>>uq1uWZ=mfXv ztJK-BeJ(qddHDiE+!kS;2A-b@VHm7GcR6%=y#}=AZjA*h9oLn!6l6t72BP57+pbsw zz2^)D>HZ4Vkzl3pJav=!X(MAZKUI=kP+cl$7@CZg#IpC=x-FdNa)g~DJ$1s|;>0D5 zerkBtW{aC_x7pN6Wd~;j$me|v;8NPPc2~|6;j%Or>OdM?45Z7}|H2F8mcgP9rIT8q zrAsy0v2{Ncdg9>KhFEqn~3pSa(QBm$vf{d@up@W|j(gT_V z@<3fGw%cN4pVyDt9~_LBqx52C12au`=U>huo{RS*YHo9N_UZ^PCa49GYWL@^XU`i5 zD3;%Fkx$W`%-gX2$+M1wVB0d#^C z+w9jWxjha$QG`A0YX4R1alC~g=fAvRh}k)Lakf$cLnHYR{^sv*Rx5&0oWC(7?S@>V zF>0y##H}nn4pBMRk5Joe`drE)65t2Ns|<`5s^3)ua_#R zb}Qp{&Hg&NPn?pk3?|ul?s%)%GAcoM;QsGxU|_w4fOD6exj~-a7DQOfbcEY|`36gw zPcHSPu=~v58)h!@(h-5(v$ZFV$+;a<5?bN;6rcRuQ;YZbP2qcwkRVHAZ-njf!QPD= zEj}UT(~}<(ocYc-$tRr-bW?8SsZSc?tGO}WBY|TpWtzrIyJo6hcgjB@i)~9GhoR<6 z0}gU@X9N4ZE%<)3w;$&b?QhRKSr;@)+vf%3dpFTKAg5p2iJtHa#X9^{=q% zTh#^2Lvbq!b3hrpzO2I36!lx+D5m^R5<$-m3uQufzS@-S zxs@y@esZI;_xELKH#I>?qMMo!hMML*p4NZ;j*@y@)P@{dV{hVW?by-7D`-K*?4@g- zs1re(_I;-S&8$z-Wmn0iHyv;G^G$@r--1fd{dT*n<^IDvvpk_~kV}~<5KewBc}4VUh>xqnob7Vr z^p1Gu*6LnTKm);yinwP>Lq{mP)@~tZds*|0O9)5K+7m zd5AYjYjQNPnJllF7esUU-U7As%g@;97ZTj<0jsfz+SDiBx`{*qmHMu9%QE7qrEvPw zYouJF5(eXPnOj#P4=E8ro)mv3S>+?P(cs#;W_S=@GhEurRu+i5mtc>IfhzvC46Tg! zz2s~t^XSiTK#`TL^d@*>p&l)VDiVTlY+GAw7A_{;kHF;ECnTd4pDhp>?TO;ugOI(c zWDPedhw#ng64(hIxtxWec)=|p1?rHLdMWFa)Wu3dOFTwe1=GJk7m@3;it7D0h|nN- z9D9#6Y}8n{|J!#2Xn|7B65biO{?>MPQINge{z+SF)QI&MU%t;OKql+xc{j1H3qRdX zvZ2?mLz^<+MAM3l4BrZSmbCi_Q9ZbF>m&Qu-tHYrI?R_^(mUL_C-~Pp!eCBZCTR%3?v4r>PEEVc?EFrviJ<(nr5h!6aoXmz)KT0?Zg&YMsvQe_6g`-GCfV^^>2D*pWpF7eiAP%Zq_w9qPEK< zMvd!-nxr}DUrl>d@=B?;Qz@U?6BC`#7Zs~*`IXjw}hhe@)o+&DmYcy-E$}1SVTWYoPN!On^7GdK|id787_qQy$?a|7C zrVC^v8TM9&g`jBFaf7H{@#Vjqw@L9!d)ublfq;A~;#WU2gx{I0Eg3cGV`S4Cdbfbd z4l!LaC(OTe9gF#V?9^!ihjZx(!D(~9v4ck{(l0amq6^*vy}n3N9!uAAO{1!PuqCZkfX|bf)e224$vX^V#^X&>+ zlH!tDuO0+VzgTlUT#{p2-2+#Ck+M>J)EnPUL`?*}T(OLEedStNM5GmG+uv9X5^n8$ zg6&uBlQdSVOt>u9I3;B@Pc(nU!+W`j`YyR2r;Yk&Xr9}~k;{!O2`c+_0hup?c>Xhk zN%IOS$U8=>Y^)7CO0XRrx!v zg)TcwbEt27A}=juo|%^&t6;$T8XCT$ipCJKO8I%5c7hv8{k$yS=v|LC`cqC63bItII`=Pq@=MJ`;9KzxzGNU`C3LU~p9H}(Vy{dfM^ zXZ3$*c=QLvB!1C#;iSo3qQA#xe}CKlURQ2MOgAt?z6n2@Z>a%ZRG_l6f;iJ152HK* zko4kGS;NDFdCseE)=c&HA~X451CV8Sri; zrnFV%bI~DE`^mcd?i)`w;<{bXL;VR*=ud5f#8n@G1K1mt+-Fv)J%ZsHll7hkRX|-2 z2QVEib)k!a#dQ`@V3L!pUyhtMK3)!+LLLn7sZ;le+wbQss}_9F@&sT?P^AVljGEZ8 z=FzNv4Tke~{Lj!pW?VnJOGt*Pt)6)kBmHhNDiZZMD>V=U>;wxl5&rAvz!T+_tiG+% z_Kau--5YxV;ZA8r5o`3N-LUA6`sObqPqo+nF1ax$BPnS4h2tV81dqATI-THud+p5i zdBjD_EKr%=zn3x`NHw>}7x%=h)VuE_$YZ8v6#w~sV$t+PRCT;QBX5d!|G2{xQ(WDk zCz{xaxjhi&sgLaVyuJwlqB5PT-#~E_1LdR9k9M9y3mwg_~@*WOIJGK34+|^Jhu zvS5XgWt&`WOC;5sP z#l5P24`Q@h$dNg~#U#*n>R>Joi=*z8A1zC9Gm~?Iknojp)cUxjt!YJ;HOm(-4kjcK z+pI!f3`QXCH&qXZM5aPhN(_1c-9DeC+t7#1PkD-_NjG<^tSEygdOC_NB)@|wpMv#| zdtaQ(&R?rXcyvzn>D23t5xJ}lqN=FuNJC<3*;bB}N(D|3a`aL#Ji`4H?=xIH){aO4 z17!f^sEx`38+c{n;TUR{J>qg8CdhW|?!|C|`;dWA)5tv9cNI&2YygOPXKc56@F_M< z6#2JG8Wk^a!h7QKi|XU|q-B!+ZKul4#a7?UIGjvI?iqbc#PccW@!X6Ff~HHV^0bF! zp7F+akb3@fe4GPWNW<8XBOM5X&dO_$8=0fL@wZEQZymFyH+tNNTt}DJN;a3b5ocFJ zjk#G&tm;#gBGO&z3a(rK@QQrp!~ZejQD(vaO4HS@`h}-Y(KX(&Y_Lhe$(c#V!Tg4; z^H1p2!_^8?oR`ppo%p)MYY^j}1c*zNtlO|FNvRvd`@Ob0Xil7^cwW3Y2P1 z4_-4hs2?t;XXGnE+k;$yj&s$U>%}b$UIE1jA<+(FDhbkmE3wvj!W>zXk`EP~}E z?l4^HDl?F^6i=rXS%q4vq?3B7q#pSFy%X+di~q_)ed;D`v!G`0{5HduC^$;Y7He4B zLLW47Hmu@b-p=02XL3CTp$4vRGZe&pt2c2)bw^5;K z)O^C-AJYxI0d09XtvE%#Bm5tt6Oe|`_IH2nxvCvdQ0=5*1-oyLT>H24 zF(X+e+YB^RtXrT6QgpBfMpCU*#`BJA{*`KBa6j_RyW3Pb16_qOF2~>vz#wq(Ij&6` zRz_;F`vDiwI2zJ8+;)!x;hV!NFCq$rYsqNqkck7y2-+)+!j+-cM}(QB0Q)v~BUM)nWm%Y(8z&E$G@23BSYol2zOCQE3^n@ftifC*CJlkb$ZvMvMWx5rG9 z3bFS$wjehi5dv@pcWQ$be1ntC8Ig124pf;wbOG=npl0Yd7VLbWS9Xx z)zJeD(!}=kXf%Ip56EBf4odySEJmAF5s&ja%_&t2=D`wT6sQKaEme4Kq%3NyG~IKS zJto4LSDWVAW;koe{gt7NUKicksG0{+G4aloo|rlh+wa2wUrKhN2>g^vldCmI5?Zkp zc91{P{s1*r9FkL6>cFh|+ohYvauu!>fTx-|ULpI9N&sH0<S?44UP6-L_mxVyiw8M{+jRX1W%mjr3$1^UxkL30h;7+}x=O0gY zyZO35R`r$p{J)?KjN=|P6|rt(|H4_iDvHN5UNtG=^wdl%Pb6e${XlSFJU?>74v=P! z5s9XeoX(L1iVfr|r3^umH(v32&-_nXAsYtwWoZH&DCY(V=wyxXP&haB%&ec;1P%_gld%i7?%n zSyOn2J?!`JIAlf4s^UMJKxB^&BF0Yts?Jj`N6#9W={>9J5s;D!omiHgA*vs_>A6~e zb@IY(vaM?B8+=Oi7G80i3gdEsKWAN)+aFG6@^&?-KiCeqCuuj}KGG_GT7_0^Qpoiy zk7MLkR0LLZ(h8j5C98{)-Mx`Wkb&*emRj_Fax}BPx(k{A6IKh_XS?3>}Z!W7#bk`S^|ORkqe29YVIk zZkHE^OUe0sjH+x$UFz}BoND=+sSC#&gs*;_H4E*rlK&!8F@L&vpx4V=SC{Cmcz+q$ z$1kv(UW$qMu0zLKU?UgWZ@ks>$k<%ar3PmCa}%R3J}-O?3?82DD71rH3rub=t27Y# zEQ9nm@`O6&A5sI-&|*6Mu7_<`Z9@iY;N-Tk{DsVDPxn?%EN@c-noNhYC5dyJVv2&K@jWi5ryu&;N{^Pby1tVClVwWpurWZUMknG++8~S#$m1!Uzi7@r`9K zM<%E^T|p$MH0%^*TC=|av^)D*$P^&fI$5P^;f8_qIQ~BP4{&fvxarF#vTK=h-P@O! z`TY&NQ>W#MsO`bJ`}tPW^L=93bS-p>grFDsE|isUnF;^pz020mT3vR=t`+Nf1VpxU zWT9C6iU2ex$Cb=BA1ry5a6SZ1Y<B7@44B^N*r+@ggqCV*$ncEYYFb?+x1%6TbbMcg{)%zsvZQ> z+vwyY|E2ck&dFR|splg8_+NBG3>7+$a5p4&+uK8CjT@`NXxIPZ1m(n5p! z>8SvZo6fh1s!88@&K0Yqx{fOZ3A5alF{n#av1LWpnJH;6{MFWz`9XZCWOYM<$hrI@ zAs_EskV{oJ?qJ)9MdZz*ns@4v3WMeOExhHf^cv9fX8sqx9QXGza z8`}5w$?U^~pba2XZa~p7{YKi!45-x8qC63pkJ97^ba``#IQkSuc_H-&Q`ypVVv<;d zF}y_;HUyt_!y)F4O=#3?EmIt3u;pH(&W1j!;DmAgE_*ITF`IS!ZV|7j>05htgMdSP zhF$YbnApe-^9KOIz;~sDb4FbYmkk;;3|WP(MCDfEO&wPkT{QEQXch5TNs#=7CNJ55 z{N8jwuNI%`cSiJImp7$P)j}6wz<`y%v+ML)qXLaTJ0~@4VT&etHR|h0M%IMmO%wla z;4c7aPvW@R^s4;b;e%(JTic(R+!j6sfG< zE`BOioB|{8%X@V^)kJNN7RO6%q&~i!w*TS*aCxzw{c}&U*Nc=ijadA4tk| zQ`K<$1C|#mbYPGQn;C-wFLi=jjXv`VB)hd3SXj5omsfPxH)mfe3@FT5Ut|5VP7L8( z=E6$e^Z#p~X$eI*O@HED4sTP)XX9+uS=3Ft*k8~JJW&}EIeMD-ja5eO){l1R_GVZe zk}_bXbtk-w>>Oxa-t7C)osgN{HYJ^&oiHRU(UY?Ut$CC`{{uv6x03gnFRHo!tVfjj zEj5^=?BrZ*ZicW;=+?$aau*kxXY;WXy({VKWnN8~!oNkE2xR zhZDOzAp#u8%_0O*fXRN{YrLq@&w-7|Kdnec@-F*#YF0^EgAYpv+I7F=zy^y{t9H~g zd=2R83#jRJ1hkHd(^EWgG=6l@_$t-62Q-Y<;v@-PLflbrrbZb zJ6Y{kI7I7pqkIb)Ii_ryg`pWTHZ00bLtJVXp7}pk%_`qf60&XiSYA`_ zc|d^Y7dyB(c=j0DPBnC^?-8x-f_?<;xw-Q;(eQt_q{~*t>VomsPeSAk*M2TT4pzh4D3o7jSN?=|6;LM?hlF#o|zh-rm27? zhQ}{Fa;_S_e&fu}o;pV<{On`SNiEa!FQ}a&Ij^#v56=FSET2&(SjkG;DZ!XDhwa)N{`A6y4I334{^us?L{N8{Qkm3m_(!;`mzS&-05$sEYQU%q^4H4UB#NSX zbq!bW61Kz-7oMmetK2~K>!DW4&kb$HxXdbkph`St&Jp744z(3s9NMNmTMrGAUv#x~ zI7pgRkfxmehdSeMksK!y?iDTc9H(z9rYg9!Ts(MJkKy6Ea|sQt0~+_mtsi`FS6moB z5{z}1CY{*}etE5-1hQT2Vg@fi$-guYz#a^VH*P=8NOWr2em>3TX=jkvnZ!}H13NZF zN}u7?wq?wIjU=-EO}Vh4=+ooH+cfhLZwZd_Q0#{N7Su8F+sp?WeSsK(`_C1l-zy&5 z(Xc!C*QDoP!%pYqs0Mm_H&TSMyp*W~(4z(fN&rV6IW`JnC|;SGWAMjCahPvv@MP@# zuyhn0h=J3%Ok~e299hMYHdvnKf{)35*X<}`ApbLt_4;6F_LtNA*9%+iKewU^#*`iY zD^1)Is+(a)7Li$oHva9~IfKY2h?r>H!Ue5dRub5l_#gPL9bHID$Hm)QzQjiI%)Eo^ zYM(B`QqhQWOVSQN4g)wtQ=9$a znsgu78~oiONho^*I0ZaBnC))2hvF9B9_3=z3Fs5tV zikX3a7G~NW;|Ft(V^21<0l8CCzr-Fh40{;JAKlgHFPy(93hg7eJY7KUKRz)9r@xP| zNRy2VVl6of4_WFc!13)_{bm)7pDXV}z^Wxk^-Ot08`|exWN_QLmPg&B!AeKf0Ipkb zwbj$ZIgbuz&qQ-s6q!C40ilEWNzG%5xXi|`k#0rP^!EVZS`pzgHobVJQN4>G36wRjLwI%k8fQF2wW$=k z#3@+NUqYf5o`?U>cW2Qvd_gseLvBbFr982Lh+x>S@3(;h)& zJCWP4WfRe(<|NEW=8}z=(u36WXs?k?=hF5}M<0bYE)Ap4Bj?c7G%?^3!Z)QdjWt%u z6+yDnR-c!G8TYN*Vu~0;jzQKTnc7_pp(%Q|PUTdSmFV{_hhiee>fp*@ai0;Yq}z*h z4I0|MKMY}In(v8>+i_)gD5o6_LH3`a&6_Xo(s$9X^ZX+lN1{6F4|-jao0`SU&ztk< zU+oD^JI0R{=W9Tp>bk>kxk^4CSF6_~ep3-SC*RuYhyw~ovF5 zuW9SGWkYzQ=xm_0Bwpor@ir3lPr@!w1HTrwW4crAot3;^QTX=7f3EEx$qr6U(A$89 zx`%$t&R&tVy#f(1?I4gJcVheArIdEMIcyIev>ubOlEdNwwx;FPf|eCqm#-q)_*=qVqp_Cn&Z2vrmBAgJv&nLFHSD6TublJTa|O_g+n&0vv=ea@_+Mr&H5d6&35Dr8(9Q#=#If5I z=JEzv8AWMxcq`Bzmle^X9LdEOX&=qa;+6n`te4GZQ*-x(G$+4Nz^Ba)HS$gS9}9Jvt8X5rQhnnf`^&K3j(VDia(C z@%uY4zJVj>V)G2kq*54y=p#rDS~5RfMAL*I=}Kz5FxmNnm`-5`TW*g`qJd?2A9)k_ zW7B=-Esy80z^SkTSHOqhAK-aFX-GP#ySUP$SoXT;zyzQ!d)YkX?CiWu_riRhbHobF z@8=QH&pAk|F(TW4Ml~*KO;j$ja@F~Oppchj#$fguv3!mnFu5;a;-b$>(B*{E;3OO4 zK0kwGh25SVZ;KfhGKB@b)UvxuDL<-y@2e{XMb4Shs@#L1Sl+>##gTK)qM(`!oriHD z?~J5|B`gGv{o)c_rv;@eCtoP!87gcj$v!=Zw(nAomlyqS-XiI0kjtgp_ZWO{>aLwo z0>r$$eyKj+{zIguvzQtNc1fasMp9+6Qz<-R5>D?K?HT~e+4Ys#13^ydKOk>vH+QC( z>r2ShhV55YWx@E_fU3J5bANaeO2faytL0i@mHO^^=jaP9rTizrQTK+FZw7)Mq|n^l z|L_eizq(VE;rBff^unCy)ikeZi<$^FTOJ{ViQRZ4ewo8jeZY*}B=ALbWq$4F`w>>* zep}1Oohw6Ev}v%;id;JTFI!b=dj6*TYKe4(ks{&s?N}F&0gGDPxFymAonwYn1~89F zk{Qq(<^^BA2SWFDka$7 zqUli!J;P`7)YM+(<&HW?g0S3Ns1MTa0M; z0ENX%gb&~STrIvs74MC5#sw@5l+o*fg$>N zZi?b5xi>$7nGcHR{s14KPR~+H1v`3Vb`yIFWs6SB&Sk$!-mJ=h4_?AERK zKyS+9>(;%E3GtDV^-Oh)3%rDcgt>nKa`7Z4f0P&tA~_YwzT|1oVn>49!*Geb;76UA z_BKmaRm@@Y)-2S;#ehq_WI=;uAeha89)2p1FK7xt*=+4{<(8*p-)*X4be9q|Ny3O9 zGW#fh5n%l2&$qY=a*;QPU`5{^q0SWEbG!Tgsup zVBB+GPN%y315NnCCQnV{(Qd%eBsGGlrEzeix*y<&xQ(VWxiB)d$z;u{oz=oeo#@<_ zE>a`Q$&@q%$|k2DnVqjp#*(}-hh9Ao$?$g%NS31MDqsZR!7i!N_@u+3|Mb`L+ztn? zl02`HoLuSHW2%(O zeKitkub$Ojx?b*}lRpwFKq1dI?acsM*12j`st`tg;u(_3E`qR&%z?}{!MB*Ew*N); zcxO3FjgMXBs9U&)0m@+AO5mN4)MmKM=40Ur*a-8);Nn;P(ku@)**3p%SsK8^XVBU6 ziBsH?uDd`#hN$G;T*(uY&r-AD-a-RR^XYiG=)f9j$vWAAydnZNyoguIBgPeZpUmow z8ec_cSyv%c-p;j)xlS$HBc9snMB^uO`TZ*?fBUz>K8*Jp<`hP4)LTMWtie2BWIFQG zL6vu76cmsz^1bKQ+2^NduL@O+(#0S3TzV_cy$5gIeEFg6ze|sXWM@BGg9C+xZ~W8J zBfZstkRoRZN`JpTAqJ&IPV!g z#isBLm#MrV3BknG_E)ycNoX%v$CbOk&4GD6314|0D`_j)bkUrwD}~ApY^*2d@N%{U zp~Fr+e|lVWqE4->FK1W$GSG*r9ydLo0Ym*^loJV36KTCyY@_+(w00SpzJb5=aj>qc zQL{@6iQ(QFGuuyjenRFgqVtC)7H*Y!1l;{CT_sPpfH430z1_i^7ppEg)jh11nKfd& zcYnt|h|(BHrd}Qh7gyvQ{h)V%jSH#?%Dn2hb-Jnr>l>jF47za0lzfm{+Et0x(OYnI zCcRMzd`Eao473Id&&M`{h)0A)HI^GC;LT3;o9^&x;+zoTdaHDzL(Px)c*oNwjK8tB zksWQV)G@bE5g=@8;Ms1k(51P(3!jbsE-UH=IsgMY-52Z*xVqZQX9q5E?K^fTMy5~^ zvIA{X*uE$`kh1l>9V|D%vMZXb2cqTxyJRAWL24H%@c3J42JT7UXMgMi)&3qF&>fuh zd>S1&8`UB^HmfWVFsXZe0JobA<=8p2P+VGT_WzC-K3iTG;9f{TMRxxzr{CPc89`v5 z9qj@?BZR?v1#okOR?c0O(UbJ|(SXZ}U{8SpXWg%Rm%RLm%v8mKskM+Tv2O&8^8PjOU$)?sQ8{&RX?{Xu9~-Q zAo*#?8`g<^YSnE86nhRzv zSW7zpz&a32euaxmaYl?^MS&`x20}TjlaKhZRQICr8rK(AL8)dmDLl-;mD=G~I+s5? zF_-PP+8+1!b}g8Bx@4Y5zE>^f3=K^Tsg>a^YN6rY4lZEWKXnd%-Cfj| z=R9D3;ud7cz0bx@0_h-PDIq;p9)rJhK3sIpDf9M5#}mQLA;{eIB=oC z0g9wcbZfjt<_-*KmOEpMw3?ac#IrbRhP10vjfnSPS}A#cq8GYlcmAR-v zZlbvf&a7No9wOhA$0qt!&EYZmXN5`uNdXMRC%Oh?L{or}7!(B?Sp4UEF#W4^Ous%N z)|b4#IwH8tNKqIK#kqASK8wrulAVpn1n;H9*`;>JjWwN$rbvh4?;#t}cG1g+6D-L- zIOC5uw-ycZi-v4k-wgZ_IXYqwyanK_E%R*MDZQC-?54U3-$idkZCd~jk87Yqy0ivU zCgFdc83ad9h0Nst9WU2imO93B*DWyV*rgc+;qKKM$D+nm(}kcWE+>alNQbwXD^9Ra z9b3-#jsVfFh8PZ zML(N}1v+2YV7li8Id=?*#;D(okh@Q#=)Q|E|CipWcF25X+9X|c5{^vI0k~{+Tm_mk z^qqNR1)>N%&vx0vY8ixB@J<#--Tt66HtUq6j`l6LY~aZ%ny(n{P*b?nqr<_2&-N16 zB6jg#>gvVz9GF=XzQcd_)}_7P&f`ub$-GyNSoMM6^QYL=?PiDWMW+!3{*0Q8I*zg5 ztY|x4BRBgaz7W&%qSDYQn33#wANlA%{oAahH@@1nJ!hm&z2h%K!C5z+bB*uz^wGge z3Y!EFOgd+s6e)B!FzUXQ{Nq+%&O0uw0hrXSu21YdUZ#^Ln8IqHXXH2zU|ar~uf^2W zKe}Y+=S`(H-LZ+SyqVlgP&4UNYfhW+@3Z8nT1-4{TFRfM`rTcW$Aqh80dn(csv9;b z;i{RUdYY?_CQA1RCe z@c?g58Y*^di_a^`k9=IqNVVigVn%jYQ{uDr)4?+QX&5odu_f5cP?FPb!Det@} z1N`9N20mG^B{0n#jCTj*UF;ZdYEzegb~i~b=oP{s^xIA_O-vE~(h97^&6}vbMFxHZ zz&2z&Rf^eD`b`NjrrkKQLlpD6zZ}Ill6GNtyM|tanz!{dc?cVjVmHpnui(%h0%sfp z;Rl+n3{6Vwgmkk;A(FkS==Eqw$Bfq_a=j){@GT<`BcIo|N`Qd3i=1o-k)iEMkUvk6 z4o837b~6R*I14I9AA1o^`<*${NcX{`GP2dckkx}gCJ2(*o0Tj5shFMUV2Up$oltBU z8ni$MIqhKjbIoMnf8{gPfZG~QeOViZ<3mN|Q8muaPrWKx*u&qt3K3rOe)(jI($zCK zDdCdk+`e(A9jDEvE%D73ZfG;If4Ioo^fIozeku1&9z0v6(_{nDX-TM&ePP1&4~fz? zkKeH+{ZbFzj(=FnaCKUL@V+4BhwtI_be9pc`?eMK1x{nZk*+EZZtE z7O~TRm`}2RMzBYyXe$Bp}zya(#dQMUY}F z2iL)w{)4LGS&yksw5w8@5V)e8o^$u*oN3z9mn4;|Y-J0EW}BCiH8AGEdvojCZ4dLQ z;GCYPcc1+J&{uOtT+|bUfwkW*_vFj^P90Y5+>hRI08AtH*S-7K$R1J1+)L5U6%MfF zaEYA>hl|K0gcr5^dDdKTM~6lDs=k23>Rw+7rvGE#gHSo45i{}p@`4+5!;?(+xQ?DO zb*c8VN3U)SO>)7{X$Q!$JcZj$u-wvf=uGEjxPCpk=!2JC03f`giuVDrw_@+X9pLSE zJ$FP;9&?Hp?S{(JzSOL+C77@czJHNQ$qE~O@;{>A>jEojGZ^|4@nnOxB^ zgZA?g1S3F>|~R&!ttKZ{S&(iK>d z7_k{zXs6~|-+X0T`R7K03Vok^86g~IvK6L?ozYm@H%-SZbl?FV+;k)7*-J4XxU|}_ zQ^i!9TkOF6g9ad!AVj`uv&hae$6#zZjbbl|xQ3x~2A||tU}qbO=~ZCZawF#K#wXA8qLwKPA(IIcaql$3+)t5lbln@1Ab-)S zy}gPPf4TwR)-l+v!#+OZfHWB8<@I!afd+#Z?|vCMl-x>tIER|#o!A=OAI(8sy!Bxt zOWNlN*>o}|Y{0=+H)^Lu7h68oa!}vCD5XhXb5acVZ6OKKA7cW>S%jLk7rtFdsjhE( zWw@s+lG7IE72YO>_L?sdRMOKD?RghB*eL|9FVnSM)j{=$L48hPoqFnZ6;~26wDc?r zar6t-c5W`kPGzfk{lSURmlg)NX3%f?i((Mf#s-Jdd!B9yF}AfUnuWb*<2LR){IN39 z1bp*EI{$jLSyH>4RshX0z9@}}-sqBx_Vyqo$J@{Tiu=5NBy|(UP)=M&g~j^Ujwltw zhw%K?>}v4`&d-jYhz3xoZHBWCg_9rF6cljABM8z&mJ4caFl>Qbla{B?d1DM(@jGFC)7q}vgck37x8CGH4)buzutNh}E)IQkvz2D@64pq}yD!o7|(0O4)6Qze8x5*M=jQm%n06!&P^ z@!)~O#Ib7detHv(pE8$3pF25x zYZ(+kmJkX&ZDl8Z;gv$(2^#}`;4_=>u5c|TJ9 zzJEL`nWrM7!#S0ZZ0gwSEhMW_Mz$lAV`UxV94lncvK^zSWbZwWS++Qiz2Y4EaBv(4 zU!Nbof57Xv`*q*fbv>Wg|wRM~e_#!EKw_g0Ybz28R41l8vv zQF67>RLxFKQoL=+sVpAl@&0=v{_KZ4Xc4g3O!J;wn`~h;sJXJZ{~Pru8t>|-!4r?q zS|Sfr!`DB&f?*#T*_Kb;8Sgn3)sOXxWyP!}nt1ERx7r!Q2!p7TFTAqvZ|EGy4^baj z4KVS3ILqEFU=y@Ed2~T?g9SrvEnhpWmP9&`Gbq&fN@yut#T$5qc^>CCV=O0=k2Q%INHpTZgxX zemTRS<`M#dZ_Wgs#<@-Wl)V{!rQ<)Un!CBzp0I~KDEX`W{jXNZUwUm&&1 zmWs!L>){vQA9h$^qs@Us{mU1pnQbR+h)o&fO5lNO%VEhbX|^4U=0tI$S$Y`HI?B0T z^9(BgO}(}kzk?q}C|fQU%=ZXd{ng4uE)aMZBvD&UnARQ^Njj@m7>-Tt7}oVdq^HU$ zvWC>-JrD_My3ST&yk$^nSA|}fN_2OOPGxMe^MKJ`UEYc4T{rDnD&YzRw7z52u&SOF zjPQdlatPR1Hqgwt0Ka&+}w1nce41e()v?#h6THZcCI#qZ1 zS7k-&j0le>y)$b{h1>~qvu__RG^O+(3||l&+IBXPCr+&!#jPj2d;&2tQwOLkA#7mQ zGFx6UWeCwA#}mc-FOH~K!9&(SKc?Jj)HKU0lK851c6zEwZdE$sunn&``C)=-)Q$)k zOK<)6Dqx;cioK?AGa{zf3Lrd1HM12h@BUJSNXQrG?lysZlmU*QPSR27fe!H?o<3WB z_ec?3I4}1STI>(a;^=%kJOUz>693(BMBV?K4H}ACIQd(&bJ^sfE+$k+1uB(T5zA6# ztbj*s-t?i~?s!amFV^6_bXxz@x37M0t&0kNu72@-RsCM)(qEe4Owo|FRnz)R|`6ZnjB_X0i zLN#j3^@#DqkWk_%*YHzXk!ad~FMd`eX)^Fy4iqVG?Uev58DGKQ+A#{2lYmb8J!8v1 zPOC74L-`WDB=o z?lvOWlA2Xc-&i4}T1S`469oZst5G@2=KkB;OpJQF>6XDXoT3&fgBXuoREwKWDbPZ> z9i7}d@6+KNVqKwQ4%_ay!GiFwDpEEpgqn03FJGZK_AEkqC@#I=_Ud(1ab16Gz7))< z<@#|+L{@gsd7h*f2rIPKG{%+F$a1+_29SX5>pA`|WZE}9PQoJ%uIlP8jiTT21_oOr z=CJwvs8pn?CU47FfiD&qC?OLl-kuI{38_DyRvM9v8#-?xaC&7@UwV!I8QK6|Gv z+y+Ql|Com(Y&NDtexSS^OujpyiOwz`lIg=+=uRdsC!{Fd=Wz|g1oG^=X-e+y7DH0Z z&fa~ziOgp2;g(}1nYZ^{=7o1RX}QqSF^2xe&U$(9LI1El1++gP^R2)cCT0aZHd<(q zWj$-%#|{Uq0eUl^QTZTVW+F$VUQrVJ2gr$V1mXCc6d$-hiMlul^q?3D84wKMLei|f z$^VID&y&6b>8Z6&3b#w6TkDj11{%qrZ8VVKqOdGNYzP=CG%|I=-xbj`*Uw@>fA z$EUK-he2-jB4NtbYIXGk^SDX-5n1Q0j;lpnJC-&8VtlP^iTDh<7y{|=o@#^Vl^*uU zQ-oJa&^op>C*k@JTd&@}*qI`7dq?ba!S+;?(@~7U{e}g+g$JAYFV+WHv3)VU1T%U} z4!7rQo7Wz7Q60w?? zMJQdHh&%g%b!jU-P9i~KpO;?wq?Xb%O)Fg;Er^Ugp}7=Lx(3aanls?cmLq&t6%C3s z-oHmV!CjwC{cCmE1~_~9+YBF{xylVUzK{&XrWFgeRSlt;^GgYX@XCCP$Oir-%k2y=`voV`KiyOx4Lxi)%>(2c=(@zzcH#Gal_ z8G6=ZP39F+LRd$2!`(Z1T@gaF1Q;28*qmmuez8UiZFbjcYf!Nroa40g!vnCB<)^1* zCsdxb0lV{Om>$XX*Or+#e$H)v^_}IPJuU~RNyR4%Ih;x`dkhZtCTtqC?R7FCaY110 zL=9eX1pFi2GzQrFcdiV%%yxlO2{^(Yw{G(8l79QJ#I&?zTj?#k@ns0|F%`&Gth7fIzieK8UX0 zR^UJ_C1lHK@(L=3tQGpiY1wFa2LnBPty*-twX_xP!RS-!cIOI}!D0dPvEkI{)v24i z95z(1fMG!OJhCBUZqR`5t+;4V*z-zN3n}KT`FqtbsxE(VOSkLh52no_K`9O{UXGjM zI74~<6^uFQ=F|IqA)M!X_tTOm(j~R!`;+qrbgo8AK&AA{e^33zmcyIu-S0-<;~q&( zTvkt-(YztXKXXPi){_wGo|jivF>cyR8G_$K`Fk+@S`$bP8&h0W1qQOp=L0AWJ|!r3 z_}{uglT1-RHGqXPu_VnH#lu<%Hv$MgqI<93gPoq5s$QB2Z;S8*@cWD6VHwe-p<8$mOZ9zVVKE+QrZF zumt>-_*Fc;#@~u}!KmSArL~t+VxZ~g=>R49TtRqeq6p(fFv_no;g;qoRB$IY5A3n; z&?j#Ajd)T8BWWs5Lk?xn@4{ytvg8n%>Txdm{LRVZV3+G1)KIi*S9do$* zvy^trKaPrx=A@nn&KWp?Ho~M1SGXGY+BW&PTO>Iy&|uGeiqpku$A65K;mKL=HA$?`TeVC7IVLfHIRMso zzBGp4HK&x6wodX?TO2@97fqV+!{`@TOS`slkTV+Wm7kM(Z@!wy#=U7X3R_4CGkl<1K>pecCV3{ei2(zwrjfT71EY#(MjCuizU8 zrRL9p=>^SdV80EP?+v&w7VJQL^c;Kf`gB0`g4IRI0y%PtFQQ1+3RG?kg!4H(0FBYB z3)$D+5Q;1H8_Z?ZS9+Nncs|p1)^`4_ZI82cQ%}Yf`HeoJ04^`N@~>H?OQ-Qj_$5e8 z>9I1yk?R-K^1n|kwrewG3(eef7IFxx$IP~M+XkAHWP?w}tn%wRl;0hiQ=AG9QKMom zMAG%*j2I@7kjo$XjaRmzt+?(jK_|&H>YVB<&-SL5x3oeW3)b0UDnv%K6iUaa} z44=Q;AY90)J_!%y3wo9t#1~X6dFB1kMh5idb*(L-BpKWGN&99xy_edODUNDH)0a#?mnX*mz_r!j#-jDgR?wKP4h*)u0o zEu&4F8ZPU;*a=jH+)82$2a`v}47Huhqfz%(Dbzw&M|1LvFv_o86 z&gK*-Q6QycDp$Mqc#X7Dvjlw8aQoi(Yr4g;N7#6RD3M<_B&flrsAbR>K;8FU)FSy- z+u0S`xz0XWzn~w=}jhs zt9{-$?!bUQvk=Gg5_QOXz9mB&*KVw|#fB?ehzccn!8S_9q`(OTpc&8;!{pTae^U4M z?AwrLr#yt`>QrV_4LZ8s!2*G!s2002xU~4pi^ZR14Tmx^miPxsiB@d^xh&lNA-+J9 z=8WM)aW4AMn-BN#W%G*UeQpftQJhG*-Y)iqWSE6;_ch|-`i!I5K=qIHm2wY6X&PG~ zd=Wr!S;>tXToV0dT{hnmE2D_xIy$d?rKbM!(rmcn`WtuSh;-i!wV6J{1AhV-!fpO3 zjoR)uS%>16^XS&Heih_wqptDnmf_CBAE#H*xi_WNQoVao0=DG!mJu3J5`>d6DkuGb z_ycjzz^zOaih}qnJaY;?#1j{{lUnDe<>N5wDhF?}Yt^>Ma5TBK%pcQ~14R?H;`!wQ zB2;Q>Yj!GZ&T~o{3wL4Zs7jl#95aKcqOAnIbgi~6T7;AO=Ka%gt!$aNm2;1aEo0=r zz-dO7)Q$^78A`m{*dHi&riZ~y&TYbn=AI+aX`@vv_wJh=mB&d#MJ}y)Jz%rztVe^vvE$GNNI`GYMNG^AP7FK#quc= z^u`y{!IYO11zYXLz008S5W;i9@S}78lL%SgO ztqF4p_S&o}SzaRtmC9sMe!1f>xv(ynUWWw~C}J>1P&>8t4e)qI$zHhT*wDPl9ln922Jbn0hwaa5nEpsJ56~OGn?5J4IY=BF9Oa9+XjJTD_1J6%9tS2E_T-5KNl}#&NZTo zB49(d{|uLlHt+s#S1hndOjGxE-Upsg{HVbePhHu(zZYejxDL305Pq(M9*$JeGx2th zz-%ncFna6NksiRIvqkCZd*uu{S8h_?nA|s1UE32v(`LQM8@aOH)lQ_f%zxS%lT5M?9z6TRr_lFV`%&QB9q|;I=Nkc8MGUF$HBF z(p-Tk?YqK#f2F>@K8+zGR!SbC5HqB>XY-0A9lo_@?S_*!YQ}4c1()2vVihwZ3ngND z5lpN(?E4$g7g9dj^ri!`WgB#wCYQTKLp^@QGvOWg-nndFdO;QxC6}4k?n-mxpYt;J z+vuO+8)&;_p#w{|jo_D^osn6;zO|YPB#3lWCsf7U#&w~BwMUt^e{FE?B3M_nqx6bT zY;=)K4822|dluyt+~2^irm+>llWmKkg4*h}Z*y+S9Dqy|?+cOPD=g|#8b6Jdm>e?|MwVtc%wB7tqs%a7|+C2VP9v&Jh ztzb_dfL{1Gnt0xmUmU0{Iy=~Vbt=@)bI*mRt)p!@hoxQW^fDi?2%fN-!DK}`=GZwR z09N{+p?WHPWeM8baA_mpjD6thN51*RP{2C5L69$Fwa_?Vq+zgW*ljSFew!F6);c1| z*)|ytR#ugf2sU)JB`l$M7DHjtJWc;d*mQz~YP@;rXSWY?)DMiN(jJm)DjZ~%Id79Z z1;By#P_m!A&l9poQJsZLnyep=85(PE+L0y#U!{IZafGpb*7h;1b<%~_9?rO1{XYAR z+T`fHIlZmlIuOv8Ew=sM(&TO8h>hV^Cw97Qo<{1JoY7=gBF^zQ(;yIob{xW9 zZLmW8+e<$vc%qDH9rK<`1Q{#2dTlE!fnQd=Py+=-Ta>%E8_kYR3TQH4S6TcUdYd#J z*|{)s-Gg|GessBN`Kr~b!G~*)*oj0Z>2JJ~AX3L)F2ov7xl)Rqcbz2$xf3w7J2ZhR zIJkc(*)lQyQ~XLPFf~yL+{&EKNk~OR55mlvT}p-pN*Fw;#O14uOzF+XnVQWwyS&dv zYLN1OPOJ?A9nE|w`BjI(=OcN5)WhLR3{(41WsbM$IOy0eAEz*?O z4f<8#xtVc+7c@?gA*dl8&en%v!?Q&5p&vPjT;XB0ruu<}=&~Wl=whWs4iysd-f#|5 z#Bv3_}boqf9>R}hQ-x)qeqcp%K(>ATRXU&`P$>08;ts! z3lE-6@mEYU8Ii1~?BcXEP41QG2g_LQg%$dlB$@?28XRQUdu0m%M}y937u+<^T=eoh zsvW5xjRL(S!V(vw1rMIt_mAHDnZsAtcN=OMSs%m_2rs|&p%KFg@D$?iRFIp8Ogl&} zs-*)|>;j|{x#@U6RLa!S&p=d2wyutsjrl-#KM(O2XkMB3K2yswSln^^v0q`t=We<$ zEH<(0Iqx~XJrr2!*YpiM zdrNUKTX!_CH{eQ}=T8-R+$c>0On&JrOSmILE==F*P{LzR9YUi+BxU##MMp!T-ANt^ z#y6uJ;1#^pduyC)eNbgr+PyK&nP!5TYq_fU>3tfY2Ff{^Uu7a*tdGSCG3rrP?m;=O zRSJ|6Yrq!Jv^nO*f2mToyCV&rEG^RusJAcn=u{6w^pvQqwLYOk*}hQJtALw5!~NVX%Z!)37b>&A9!W5 zi2q@fuHPt_!pEQE;`Qg0Pq(VZjS))iaXbNLun&U~q|o}_qgjQRf1!|)Ng2cx-Kjkv z>t?>c`^0nzz=`(ME*?8(?KccL`X?{ATd-M>nuF;|D>dfT$$FN-Di7S>>$VHMWL-U4 zcy0jskW^RSV{meVVl#>nmG}zu>ej9R^*9z+6_TiKk@xDVZErNPO472(Kg_AIf3rEz z(DnIplwN|`oB{+phSAlCT%v8jSq1Nu;09U?>62lhFuu{DZ4yTc|l|M0NNt=Wz}*U z*;2aDa8N)-{@4~q2?K~h-Tf{vr~RVB!ec-cE&j>_w0p{(wP;Obo- z4^4yRxO&%r^Wz6{%)=7}4I6w`W*9BPOX|&pTzT^{S2+y5x*5_Sz_Mm3;OUEpZ(vuL zWQV?>O)mH#mb$fy-M&Nz_bpuY{tNM+ZfVHe~@^F;I|>0eImrfh0UpS>;=Z7 zZhiTil$r&%cZ5Jl-FyLifBIZ6xV`e<}wTy<{4|OGdRW8 zIC4cNqx=kn&&orr(64&vDbBJ*&htR2cmq29qcGOy!BAInFMY;PKQ&mMazubWCXKr= z&rou9Pja+}DI82HJGs1KJ;|9Ci!zOFqSzp|vvf3<8l5PY5KR^3cR`JB39sIxy?&!N zSF-Umt)wyf(v8E%UqE{kGfao&&li>*L@cTfIdFU`9@5FBxOO-x4U<1@&z3Vi`VG20 zw5C5yxC#z)K9KQ#Ct}XC5vu_{B54>%sjib#+x=8KkYwOH`N<(xEd1PBalZRnfNWpK z`Qls4?SNF>(nCoZ@F-@X)DJzEte^HyT6yO3%omSqehC=ko~LL^<{*z_-3hfvu{Rw9v+X1QCBwuBQ?P4mkrrewGKBa_b=2ZCK9CzC`YCC)UVBXM= zeEih~>74}L2TG<4C&vexpp|f8blm;SK$ABMZ!WB7!wa5B2PRG37Va_CBK@ix2pA{* zPdKPWtnz{7lx8QwTkH9A+UFWoji=-I({0Mh(Ctm%;S12)vgyl9>F33K^F)c?vKfEL zW}%0kUD5kBmFP!|&FBn^4$XnDf`k%rY3nlZz*H?<7v+{>h*gYoCp#9&tlR>`;v} zKHdTHxfEA8XzyOt)@E^P_13{jzsRZ=wBY(`&XdEt%LQkYrxkHnS(A8CS!EfA?;VP% za=o!I#nO^GGtD{DaCn&`Q|MhADdt~Y2*fmRmDaqDu`w$$DDREbG#ui2$jRM zmh84pRcyc!Y2_}mGoGcWzm?IC*I?^%r`n=O@W!u88`|gcH@R0FmtF+eTNB>P4F9O1 ziAS4KuAu(Yp-j-s$ez(cf!fc6vH3hbK^)yL3u7}SA&mUxJahjoGUPjTQ=8oEuCJD) z&3xfXKgz}>a)plZQY+pLN%S3g(Pvhv1Nz{|W=(sGBvA^cbbzzeh8IeHj_Vsme?A$Q z(JZ!OFHAD=9JQNDqFPxD4!k;NreiV(LLEyi&;MRd6d{F}MtW&Kr0~Ziy+7LvmO(hb znUryc=$31lwNC&hS0hlq*)~s%nm1fs95U$`7zg&^L0Dn|&4;>cnKUjOt^vNwc3TQs zFMkoYPnz8W&EX@Cc`i#bGO*E}vio^$9-$F_X#-P?|l?O9IU#l;IKq^_m|$~HzsB_Cb=vI^nM zs_x)*-MY4m!>b!`Lhr5`JMKq7c1)3P z>SwYC$jUafiq1}Cp7NA!)H!W8wBmlfJp#6V8kVC1CS8x_4KQN<{OCCM3rhv~(#+Ry zMEs|6#!97hpw|5ceNJ4@+{(D9pn{BYIR$wiWTp;YMx2Dk5GIG(_+_7wJX<~^hEDm} ziSlEdN@&O8g~KWd1pWgO^wNA0c=nDKydHlk)GHJ7@E8A7B>ovM14L{Dv=1kX#d%2P zn-G=MwmlEzl)9Yc7gzL)K-7`KuYOOu8PJCgLnJTe(r%-<) zWIU@Swv6JAIGBArS8`5Fv9i!`KTq2Dq_!85=|mc12w3{hr`&z+HluMx!daBZRIzZdrI2!M6u-#EV>pX97PUJsf* z+C-WykUS2ZPH(4fpg?|iMu4T;G+7fzZ|IHY>nPe$MB&n%{)T zr_R8Qc*}h+q-b0D|31%9M`UV4r*6;ftDIpo;imJY;{G?;MjS#v%vjoA&Y8$uPRKy- z(C{p+Y?BofGBZG#G-m&q@Is!spm?YlWL_jg`bGF~>g{nFUPYRQSJ%qt1ehO&OKS@K zgj%{i$)%2!uGL<4bf(Bk(LJS>D{)%%*hqTVVH&s&G0d8_VLhaF?XOV1>zndO>KcQW zcD^Jol_E{6*w~B8kN0B=t-2FGeAAhd`oN5q$9ablLVDR}BYCslFZ%t9UT9@PavtK? zC-4|Q2&56~SMOzG5C8MYX5uQHCERd;iizR7UW~7qCzlgxD0Wc7D6JN|yL1J%c#TQX z1jqHbVZ;#{CdSmQKRi?kJjldev zMn!dtPvw_b%Hol-LXwNf!Mc%B9;Eld3$YwP4b^ z%uI985vN!6!dU`J-(R9+H3G1RApHQK?r>(1JEFw!al3CE`zxml)0U9a(~=ylwKHkX z$#X3lgfYL$&~AQR$hMi^I{9{?^NbaON!W7OS(d*k>HE#%9)7FH#KZAK-9b#JS@Tcc z>|RlSit9h65ndJ2^-$vXJvF2T3YKtI;nC>Dp4?@!nHnKd8f!yOu9Swf8;#`o5P}0M znT`rs5cCTbVh7zhi>I@w3%wa7*!9kZ257fkag`DeQN_57nt#4KEHag>Ykh(j?PixsyvL;UN#WSm{!O^m24DuT1IqGWkOl$d1WorpMUadtU}Vkdh-|Zzp-;OS8*5 zZH6^B+9sUI&gk^Gx=j6Jynn2mfAf;-mtL$}jy!;My@3CYDf~f56?NDQj%!fDaFCyEq)T)S#KW;y_%<`G72Nt2NvPwOUeg_V1&>)!WJzqH z+_cDTC`ePJ!XFFxp%iFe-YS=kv+*PQdmgjpF>?CAYPrR}GT&H9 zdS%A@PFEzr4Wlwewycy&7L$>dZaVNrR!#EjcKnZ9Nc@0#j^d_+K5^=P1FmS;Z!mlQ zDx^qt%F1IItQUZf0LVMDX~>YqzBn(coK>iM6ses5DCbp%@=V)lv9TN{y7;xxEkk0&1p0DFpgcE z#M1QNA1=ia|Nd;>m?D3~;DY+~!|7Ywp0R=QAKx8p(4@NYaZ>h10G#js)QX9*237?d z91?n!tFUtTT4w)nwuLaJ6KC3(B0_day1OgT%v^0D(xo5tGD(_|HkiFfaW z-*s9U*qiAdpNsulyhBedTG+yniL#C>AahuH)$p%h=I~ysG9C!`isiNGGPa?ZFWV!p z2{GV(9b^Z`=YU|nU+yF7qE7N=i#ndp1C483yDYu{(Ggp9CF1+JB^~9J?r4L*1Zl)} zg4?B9#Q&V0J|L)rBf9@sAB!$=;cwj3wAV|xEJVmR?N$I6J)8B`2LTCIiLv6PsPZGI z-|EMjsV>eFaprxs&4@DQ-^pG2Q0q$^B8I|nw06^sbQ{(!MSdvYR0KSByX8YU4ejl` zih=5#8^fw9Jl1g*Z=(-QhYiM5kVZ<{wg>7MXW7AyGLbJHSyS@oqO*~xw8;!=LvMV- ziZ4lUr-QeU_(X7-Po!I#Y<Xde~$u{+k{v7nDyE<2M2gUz+s9}HtnC5lm7NkTp;wj#0Pzge7=JYcSkub zfX>a5k3Ilt;+Yxkp8>mLfBH^t5bm~?lXg?ZoQl|qPENNsSAzNz?8}4SdGrKk~3;SNenO!KO{Vgiz(C zr;z5F{tZ`ItG6Hpy=F}<<5}ZLFIx|}P zzn8@F^87tczvkz7C~(_g&%REHosmiYF=y7K>hB)wKG#D@`h_Zd<)?M@7Ik3HL)yY{*5aSB}rZbUmA-WKIf>d(6M-Qj#F&eEc+(xfjesvbi8At zzusJ*K>vo1=!ZBa!h zsd6#_qHTh=@8u0I&f!~ViO|*`r6#E_ZN)3@ST6NRs=Jg2$d2~#;l zY<=^Bj)d9(4<1Weu%Sft{g2&b*Y!ug#V6GyQMT=?SXkZ&DxLUU%_$KL$k?7qxt!r< z?cG6js*pz^l3!;98*IWsJQka~h6)Z-hu@MR?qT9l&O3M}Fe|BGLBJBJR!8&{IkD}} zJ>YP#0J`n)w0L-%oE}l`pN(5FH~|L^2eCFwihG$n9{S#?7Ev8LOMF9BdQRDOL(_}j zEzCBfDn5Tm{P6e?KU*|l`;({8Txf3fa{M>^olWLM)k$TJexP2=h(kO|IJ?ffr6qpb z`OL4)S-P;XrIwB3Pxtgf4fJp!;N7Mn9-q`2=UK2)d$b+yF&uuhaRfK2a~SXbT@)c& zUUl-1rzuy^uSi{9%*R3fM0{brh?0FFS0#uPLoLQT%2rAG)+%pZQ9^EHvHXr0u@{CJ z*%)H)TB&?SqjWz(&CJpJ4-uWqKaW0ZB25O&WwMk~ED%-n0D{+qqG8tMd#-HVr!pYV zPHSQid!G>Xbw2;)e`|&kK*`?)U)eLLV}&}5wX`{e5JKS}YIJ^@uXm;7iPLeW)qHl` zbQ)FH%JZbkPND-tVYx&tra;8`n994P7f(G!t8e;wNU#$974Cgn(&(h8r|Q>ya&!Hc zc)>fh)H_Vd<<_6pdQ)kf_oXaX?x&WXO7b%?g7#<}JeR(SpIfYixhurTpxjp>;OxWa zS7K-Q5;c-@?oT`Z484J+drE0^2_2B+LG-Y3*w8sa+9TiG!5i}mu8w#z`k?4{5CIVB-tk8Nv!FU(=&w$OnRcxhRN{&08eg^3pWO zJo?JIaGtCCWU|C8nG<4S>tMNJ{X+%0?+@Mk$_DF$0{>UM3RCeXx1a&Ep1YOeAVQ5Hxxo%vgGK4lL( zM8k4Q+Pn`)P=AD`x%tgZ>!hDs-#Ol}4zu2MTK~P}V6x1} z;&8+T(VnR2n7{PYXdPA~J6ZVr!sE!RbUw{%_C01a8#qG<_eEAc!(bWB+_F)BO#Om1 z*QZHYv(Xl#PAA6h2}&bX%KN^x)>-BWgXJ_Q9D&Y=wVAcQL&w-0BAq+Bs)eV44t zkY$v8CBsm`koJzp$jyfg56eekD_>FmzborsJPga9nPFkoOH6TCGNg5T_MwMO<5`w@ zCcw3aU2%k6gw|IZqKv3?unua`v2FE~e#D(D2wC4%!QH~>fz#ojoB-LWrUM*JiR`k) zP6f1_0eOMCx7X~$6g~e9Mhr(=U+)QdJU@GUwS3hyQ*IF>5Cz)nk>ejBzSt-J9woRa z9t<=tH6ss5)>J6R^}luxMme7@t_89DI;`OiVo1lWO-{K@1y!!Nu>j!}bjP@iVOdH+ zaH%_WtW)iaeR^@=1yRCe#dy4~rwuLl&;9m7cXrY>?QjCzUS*AqGV;{uz^NBNCNAad z3a#4FoQqu%O9DGw#^7PU__C8nt&~s_MKXNnKfst(%z_Q_Q9oC$=Nia`TGXtj99Yy= z1#VSEnR^;=NOeR6CWIn76Ghig*CM22VtkxIhjtoFdPgB~(%HmC1}oy=m%oR^#4TL9 z0q+~f&1gsfT7KaNps5!CUXDL=7MTOmILJ$~8kA2M4P@o+id~|pN?_jEnrM(o zT8^+wHs3ot-@Q1;?)1`=*w1GpfC~W&r}HvzL%9Ry&{uNENg7*dX;b{#5&Rmz7!IBD zmvcDv^*6eTupcZljn{d*bBes2P1!gEjhb6c1X^AW8uDfS7LQ?)_&;+ z#(&kxYE5BT&ruZCS1gLn4zq-FTi*{89(fIoG*zg7j7@BZrgxSU!=8teHi9^JG| z_bclpA4z$&wblz-b&@H4{9BR8*%RsoG2b5+4+1I;NcLdH^!tmX*ZXO8Xm62{B_EWdSuWR+Q>mxrzAL0)B#yh+ zcq*h}wh0p9|7f5;egNv+4F)f1{l;DTIkSqhE;WYYBDahcpWl|JE0fy^{(?&P>Vk2)sgx7RHiGIJQcOVwn44S0zl6Py$0o2-ShHT zEC0qEXliA|Opc}T8M}BipR?-t>1#++cHq2K&C=|x&V0{ft{A2)rKJ?&!z>wxIyWl) zpl`GcNl$)HDa)B8D@1>*U_Fcdb|-3OAmzpWgLk^x%;>2cNc9a>v&{SY_Xg?*EJ9rF z?nx8iFC18@_;X@0_F@4NJU!p$%}Euq5~><*wogP&RxzbzPb?%nS+t1k4pNf#OiaqN zD^>TbJKCvx9>o3#3?35b;MoxU&o1;XNXL5ut=l34;rMfooG|CV+w-0Cc|VHa0m0y| z_23@ttvz=vQm;(FaM6RN7|)stp^cKMo8@&U(h(KZsyA>~Lv+#u*&cCFBSwQlKXQ9h z2k+p%;vwb)1EXys1K-(5cwX*=_$uB^ zO4e?X6tLO);JdCF_c~-?E!eQum9?L5=Hd6ZG$gM@%#5mHIg583h-VKi$n*u5NVA|+ zQ3P)M$m#!imQ*2}#vKt}(4As=-+T?4NnXMPY+Y?re*2Avl1?9wZ=lNnk&=+`Re$m_ zz#gRh1b|qX5)m2m?U&B#XI7w8(KXLp&!}U$v{WrSz(Z(G-vaC$4k%e=c*A_|TKMDe zS#tj7Z5DugbBk7yxa3sF?UlIq!>qGIRtufUAxQ7HpyphaZ9AM65SZuiVF_ptQ{NJz z5>QZFG~v+O*9AEer4Q7XTeUL~2`dws7$fJf)px545{ z-SNzMe4|ybN0A4yaF;ipG-K9>>GsTS@*2g$&;0(>BVNWwI8%GYm9>yJxpRWcYU$q;_1br!?OD#nIjyuN6PN99%tZ8+q+Lo62slgZY7u7$MF8 zO;ajyQ@rcew!~e*EDB?pe5);+zNN`0n$m9RsfWZ70Z9t(nU#m5OnlY7wPiHv95J-) zMey-fWKVm>jH$cXk7QlA^+(B^b01()dWNC3Y804g8Ej0^Dn<8t_Hf_^TAIHFR%MArpTL)C zpxda$SXC5qh<^|Jc3o~Ks&cv2Tfx{0rB&m4+HK(dM9XvH>Q~vuqhi-aow}X@mPOek z&`8M#&lU&unZ})LUe(=>tVQC$NGeJC(DCf6!V#3^tDxUorY-eM<$VV4)Gz^?rKR-Qkn8rUd?=suRm9(OBdtzLGbUq^5nzq<=eeOC!SCRSNDwT zJiu{dCrg54OGew^`sO?=WAi7=`fuE;`NfSr|Gz8YQjEW|uJ`f#Lwwk+X=pujpD_yk zVO^L3@Q3M;=}g*`h3X5!u68rA<2;Z(sy5`8wNGA-tum-FSVw(zW8hPcDS$ig@H!TB zn^a5RF%TH!r>eT9gCy{A;l<0@DTLBk^J&=A*c#Q9Zfr>2kS%N}jD|U8qR7A4ZxMT1{T=g{Tl)6$sNY=kHRJ6V0(9pA;GVK&HTf1_i{!e zel+xjy9ACuRc;KDo_YSvZ|}|Gm#^(tmAKq&!?F`9WZX&1pL+Jcn?l-NDyY;bEeCT# zrKJt<7VYl#Y@)EYE zjYUC;6xL%J7ajM9VDOE{=#Ere=+1x|ryapA+kF1b37tj#xCQX#qnI1aSQBN(=I(gC zFI!7g&h^Lk*&zxQBKQPy$T>NAIAu1#nuS)@mtO?}@N#OPF9`~1ZBgVntn zfupOYeMSH81#r4J^mD!Yw{@~Cay0qx?&!Q&W#^y9kuO|cmh0XYvhTBg<$mnHoHJyq zD|YpQRAw3vk-VI|o-c>sk8tywz-*t0AlgB+(5 zN7O%S@!}GqYTe=C^*Yv;+rmM&y1)5-RfEi~x>tPFQuCuel`noiL6f$x z{_C}&)5twE#I;{$9C@xn?HdOEmd;Ci}}_5 zkEZkRX7hjJe(ko3Z)?{`TQypnHdZ85OYLr2BUXiq86^lYN~$(h6tUWBe^q;r7%^)_ zt=J<*>>!9(kLNk(`48^wK=)`}M|ajJL1iDHI8(3RQOh1zAt=be&uq(a2!j z0_h^({RsIREiax0o4&vD3Sv51PT~OYfk1PO5A+y+s_~rpytpKL#o(5D%I!6KgszWi%phW)4%{>e|j(8a~EB)VcJ?$@pt*)Mv@YxAa`XprKgCIlDP;U*H zSvS!UiK6BKGLH`rc!o)X4MD({ORa`cNnr1AN#ZE0DG5%Ee*dSJ^)JYq2}YGwwKZ&{ z5VB(98VQean2g58DMM3Q@u4E8)qXFQrH;y;4wRs5H8W23{DN}1mQP$Td_u@$CmjVC z(@O5U!h<=f%}hs*_EdJ2of3IOF~0Kc5g;zG@b*ZdNfIsF>7o;cq8h|44M3k=0+dR@ z@eMu##|x&X3#dA6&dPW!kvA|QEC&DLZ2bl|&f8Hk58yZUCa4uNnS%OS$0%Kz&J=i{ zfUomcYQ}OB!@%&Q9#nC!0-X~XSu<`UH}HxEs;S6fSbjVB`T^9gZtAgR@jYPvw z??(6Iw}xmRmJ#f(?7py*$}VovPK$KhM2ur3XC)PSIGr^2zx{S!-J>1WmEz{CASzXr zroEMO#WiC!Q z#c)#og5jV5f6hV8$tr&gK5zY-kI7nXjHCYc*X$hM@t&Sj5=TDTyU-X2*&S>HeG<99AfBE95*bv8}?Vc|iFfq{#!Lvczr0oX(vJIQcwpl?HFnI{iRd{?O z6S;P0v&7ePdYrKzN(+akQWx_^Y^Xh9Sao}%_92@{WXX=j;m=dre{p+(ezegN!T{Z- z>3tVS5I^^Ah*h+IZqa8CV_aoe6;NxrVtK!^lCDwIF;cWod!7RCb9Edcrr~;hpKRhS zH-?MeTWM4!g!`JlEsW!U)Gs&2^ewll)Fv4c%ua8|zB#ja9^j#!vcnQ2x0!tOiDmsZ zl*cr1!^SE(sT$^McX8qgA>M+|p0Iy((axw5qleB`ldEXmkbA-TPxwp9Y(t67y4 z`JTU5KTbBV|K1RA(kf)qrKq40ETDAxvhN=VQ|?1;W(dzlHtkBpKx+EH+@K}R{`LZ$*Z~GE zdQ4eZY>+Rz(RN=8y_S)1O2gl}^^>=NFwzlvt-sxX%!|^16J0^F2GLet(UPn&5!rVV zsydsagelKEhv&_*rHkhQqKWV9nT;=rufKUX7lA$yA7d;yoMRT-aKNXWE)6=0*>HlI z^Ly2><4s;RdqB$SxcO(Bs>2UqYP|>pIG4L>q*~bDpII>bF7c9FZV>g`*f|9a2vCsB zY-Y}S+|<(23?_<9z9}X*=?dY*GtHU%?Z=exs(&+rr5mWPM&7Y;^Q`q<5oWtNNyY=*;Jn_` z&dx0|rZG*A`^;w1W4dshFEtTQM>LcX5Khrha4!2i@e}T1m>9Lsal?AR`b$pB(a^ zEAhC`ZSLyZclPr2j6SHbMW-)RCOkoRmIL6|fI6mCD7*BZL$t-8Q0Jnq=cD7Je);L5 zarAPjs^)^Jz)?1+d!_xlzlTQA2sq%x?2XewYtW8LYU&uf1}SUg)+n{7k><#CNUQ*J z*8V_%n~I2*U0+-(yG0LKA*9jONyCCMWyp|Tw2kCQ>By!14z4|zZ-)m*8BmM%MN7X@ zWcgZ}EO_N@6tBQLgxpmN?)la7{HhAhkTvlD%3K&6@a4FbZpi1U3-U1b**MmjB+Qtf zGBI&Awno@7K=zvY1BJXjnOzSk4^5quhF){p{mGH0UpyK+)V?(n!QH+VQFeZ2AL-=t z4i*osbX&Q{zVzK3jC=Te0;Fq{UQe6(1gRgpW%V(D`bxB!Z>7EY%dn7PR^du#?bc0c z_{t-ZH=^TJCWPNagM;-+VW-p-NaxfWCbHhTE|a@GDcE(_9nkY#Or&&pIEdRf7V!3W z${r3pQ3f_U>`o&4{?0c%MMOXX{fl+lUsf&o6rB%RMJ`7rN8c4Ew%6NB3UzcUMwcT7 znY|??)Gecu*PBJdpaVJPQv0uG+EjqIPm|9ar29skPONrewR#i8%{HA;gBlmEjRo}` zb3|5fbx`2m;>fGzy_;<>fgYUQnwo`*$e8qHJ1ND&uK|Bw`(BLuXO`&wxfSKlo{His4bpfqoja% zQ_z)H_^7vfvsYg?aNAzgyGNUKbS0R99eIt7c&A;h^N+{v`qu=nTh%|qeg!S*O4DhI z@|M&`km$?-rS@g>SPF;UE~%SgMz~+XGFT=5LYyu;tJPhFoQcHAx%({N$E*kBib-mM z0dzyXPs*>$*Jd1_Yr^M#&i-a&v^91_mEx(S$@z#cO}8J%10>e}E%W8Gcu>u-wVtGq zUBH>KNmnloPx&Qnj{gMWd>@z_;luU5)FsgMp{#f4ZEOI0M_lQ759?QyhisQ~o|9$z z9crh8wbvfy0>nF2mJhit{-hL!xc=J|h{w&sQCz0aR2f8QxTa$jC^!Sd=Gm*D|`(6R;` zBNFgacLr{B{GUA472hiNChw4MVof`xhCsk@lnBCtWPLt5FZ~0{QTlYp9SYrjM;ro% zS+?&6(Ee-`4q8Q0zCNt6X7}%XuWIje%qCWvU;zr|&GPDpbUxqIepTJHe!f^4G^M3x z%q<6PE}PWE_$YS$c%=PY+Yp{7gsh3UGvh5V`o>hHusi7oM0B(Ua!>(1D%9Tnm2&>3 zeyU=xcRTik!HCT>K(Z$8)rrxonH^rJBL7+qE0+fML4oX|e4EWXI7th-_!4d@bfSvC z8ZkYK7q;4WiOG?q7q>@Fjodm|BHL!DgLN_MESjXhrh|*pdRAQYF|kY@$s9-TL5&G}70vbGqWe|VH#v)?_mQ5SimtGB{8L&b>S2Kc z!mh&a4GbguDS52JdeU;^?LW{LSzVV2|IEzyvDQAd4bTm*iZ%q*bkEFH)i-T}1E!tu zJh@=ps0dG>h3pYHfP$hk4fqt}(F^nT3_ zrg-nmv)-r(Fk^kwH~G_^!BBE-c9Hyb#$Nhu{IPh%fUONZNx7EsT39rClwRR9tN+Xi z?4@87*n=_C-BS3$5$A)D4wV=S82`#ieOr9(#j&6%4rsp$|3L1{aNv&a{RKE3XvHws zaNGi)n*c@0k+GETnwB<&91Wh$-yGMxDq>g`}d=69G^cHTvG%Dt3RCwB8S35?O-__+l$ zouucYFP*MO6}r?H`_;DkrVILerFLgHeA787{*Z=8q6pt>hI7JU2k^BITTSowGQGdd zAiE>6B~*J+S}upYtCRZe-yV68T^F&WvWJl}OX3zmFt9lK0o!T&Y^@8HiLQY_eL;<<0 zg7}W}J@9KFJ*#(sTf_{vErgpxZ~3D>kyFaS%2$pyXVd>}#z1ZSTv4ZvDz^mscL|HX z^8%;QiyG70@=%=bR$kubCT&?NLQ3p;(BANNiV&&VcWaZ_Gu?3brKPdr)$I0ykjA zEwu~4&O-Kvyl-6MIT@&WaE8JZ?&=*xahL>@#TK)Ni)^zT&{rTkX)1G^5s5{z&@fBEt%x`83%(?x-{{?6bJFgVDr z`AnD+%mQk=#!`4}V00s2;AKW=OtnMis4jq>t8LmwAMrb6J+}Fk*%)a>9!LuM1EV*O zY{?*>j|+{V&osCE&@CKn0YOGfGY@JtJkW1D@0ZMMwCY7%evQSv`-5KTKl;Yu4hHyc2=kAd^a18ccM_9#J`3lhWVQx8$C}`dsEiI zgaO)unqZsSnsUGgmAaRDW-Brfr`}OcL(iW3fu%3GIETATg(lQt1v(*`U+Dr_rq1qe zpaJCulJinm$M>@ae*UwK0QV_>XY#^J&;K^Pl?(F=NFXV$^n1-xrjXqpK&;wn-S&TT zo3sqtX{IMAaJlcqR_p*OJX+RY9ki@^>Mg8djhs8>&vc)xh9s`LoGl^$^qX_R&TMDO zPTDsn4$#ZZDHp!B2)37P{a7D%KXTm?EBS6bP0cVdt(`Kd$9Gt#BwKHn2H~#Ms04%I zs&Rh&&>tH93#M>9lj?r!fxkx+|6Y>VM+`h{gJQ8AyZPsgT>fQMjJ22{kfvzyzBtdW z;BetCN<9mZWQxOR^T?m4nCaP@wgA84efVC*d^&anq3$*P&uT)#h2f}r`8P0wi(81y z{^9yjGpR38e!0R`q6t3LkIi3?j)AwH(gudm3ylK6$I-^@{{G}#Z-wlPw2c~nIBb7`4 zMq`=HpwupcE~Be%AvQXCbgbdqC@T7Va~-UvdVwy^*~eMlInwC)>%7lXtssCZQ0C(` zSJo8CSCH?fSEojC3L`9qUg>2rJXvWLKvrE?)hqIL4m$Ay14HG~cn}pi@=wx*3RlKj z&XzojqWiCoax4q?2T%yNu%a^K$eRcuaUYB*9Uf*99cC?jLpStCN7c zT&gu8s>ZG;#E)b z^th0e*M%{^JrxuqIH%72^_~uPfc5_XOT#0MJ(^Z6za0Kfj)5%ho80;U3}mlvr?|pS zVPPq<6t?Q~TYz5&AuQH#>QquDmSTc&$`ilj(+;?f0tdAIe)dmWLaAlajMKHL93L7( z_+6%Ed6e;4{-ZMa*ZC=2#&O`F%f`17<~o}On4hWdD7Cui`0wK2aq1QF^}N3KL3X14 zy#4U{fp)Pm+b-*}x4XY!gY?-*%V{N2?}LjFfuu{iPVvo?^FL186P`l$&?NV>4VNrI z)#fMZY&vLq3;UMn=vI)kOj}FXY2KVEqV-d;Z?D1Tj z+~&ksUxn+M*&El`ulBf#>q1e^3+@_pHy=i6B7atC$h@`BTbayV&HYCQ?G*0)Ih^Dv zwfz-AA+92}_ag%S5WU|lclZlDR(R;-Y1DB^c+H{;n7(S@UA*sa=w-l<+ zyn^DCmxP%Lrvyt~yHWo9MGSki|qC*KHc4xcFwIcA70 z+=KC>bdI7!n2N~1cZ*F#u5XFDZ1w8&9f8-gK5$P=y7y!Lx_B#5PW#*2(fjG!?wz?H zRXpHdP)5+PrXM!#rqtL?UQTDJDw30xr3YDhCrpKz+Rv_e> z-v*x?*;vzo!A^0hT7>&oqnZAVHV(SsAP zY=+qJtc?AuNxY`x&=KpqTM)(`sH9BLtz6aZJ+S`)c zfw%w1cul9A93M8Is1?DYoOSXwPo;uSj3sEPUv=B99;e1q>-sZVu}JHpZ~f!V?Ip8& zEW`=16>%n}s%;xemy?WD6P9UCC^N{Fw{bx(@tP7Zeg5El%;i$hT>DdLF=qk74%V1FG!3B^mn}_Sid7HP)iX;eqLQ_uE8?fXp1@ znWdXtwe)u#I#Dj5)U0(fg?9rUSCB<(m0ZeyEIS<&o_DUgromfNPsf;Xm!bCL;j}YC zW(nYo)&Uc?u}9jopU>p_{C?Y+kQUBO>I2EuJV?%p_7tI|cm z(e`7Hzx!=>(K_FZMW(-Y3v$tszb&pgSo_~oX_)J-D1o=D((Tz722J|M-&|O^Tr7;O8I z#`Kb-PkBv8%6+Gy23UCmrm$Y~#(|4`Jp~eb=al;xmG&3t>1A55I=G_axq1a+wm0$b zZpgDOe~DX6Rf7-*6DWnedoUuVj!`+P5N(P-tK-)&2%ePo9-jGMiQ>LXFZH%H)Ki3` z(pX-(J*EWy$YPDn$}z<>&XXjIv*G-`@dGjC;l`cWHMl0V;_zGfTg!e<<$%K3Yaa7b zon@fZf)@u@xJZ&2IyEx=@)?4_a=pzH*>urZwdIR@ot}l2=l=i46F>U? ziJM1P|81Pj01xe64V-my&C~OlVtT!kqc2yT^Lxsi_L_h3<$PU0AjK}@{*yY@qry4# z+1|`aow7+_^SPQoY-N(d^_qAI)TV>Tj+5N|7b0*mAg~SMMVeAQSY?ySudplRwik}3 z%!AV@OuD;&XsK+0T+Gt;g;g;mjG4HAN-`M~duaMEdOK<9DL-Pfc{hH}{ba9ke-wMt zaV|AHLwx(yJu)+*K2M@sFc2m7?`W+D$KYfc8xwcmO84@Z+}uICE2{(=4m?@tri;I^ZwK9dN4oS&}rgv zweRO|UZ``$A_pu`O-TGnC5P;z?=~k=`W||Q!NaC?egoL9E++(^aC!bi-3Nz2hxXaV z{@rpxNsm+}z&RnR9s*OJQ56ugu1HAB$?f>q^9#cCp7|MFHCrT5A&u z&WLfvzrJM?gb@GD9Hw&-9x8zCVGyEDrbop_D~_H=yp|eVQ0JX12M!~qO&?SWV2oC*(GM^g%1xX- zotKo$ZQ~@pR+v;-re8L@|N1ju1}=W!78+%Pw;E}N!5;p4oLUt8A&S<=| zO@0dBpLV(f*!_vG0zC3}o~28u#(~{M>|yJI2%M`;Bv)xOX#}a!?kLj(=NH+{*%()? zPmB{Ka@7yJWHm}Ec)JxAiI$KX&yLV%V-2SNol!q-uUQN9uQ>gR0|KVgVHUn} zIpg~l`EEVxBYR(M>VcxK0!MDB2OHCx1{gHnQ@c&b*~X1Nl^1+*vTm#RLb6$%Kp)%W zV7T8u-jl^{YMe=<r%C#&NtR1u8!6 zF<(5HEKcL^03DBwckRzfz>fac+AJDtP!0rK6}ekYA8Q{Sz@*Zp}+ z9W!bW-U^WU7d<^dGOM+Ri3(#u!L|R-0-$~iCy83(g(MbU5e2i(8KdklRJirfo%#O( z<-Mr)x!x=d$8qdTjX2rs)=3gm98{;b+IrRcxxf4Yj~pRJO;y`+j=nPoVOqq$$EDli zF_H_>Si5>x(vxdmf4gf06`RzU?b&4X?iT-33-`Qr;&sn-ul|<}m7Zz}xSXcnu1d)M z#@A7k8iTv?fx)AF$(a-e#<(~02oF3M6;SeMT2g}GsA6FOLJuE#D40dbs$W*Wk~nbQ z_%jX}vb@j=WB+7RBz4%(iZ$n6()T^sz3T zod&HBFv!<8iOM1GUPyy}_!$j2NYmfv>q7|VmKk`*q+?32EN)KW_?aiP zS2!k??i%*T5p{(bAJK z|L8qdH(mO=)4wX*dX(@uxm8F7a(~Or=lnM~5XxahGz5om0rlk~(}UUsPb_yQ9CF3H zx5EmREr5+cj5^nIg8c#Vb`|*WZgjx2F4L76)Ov{ykr zgc!k@O;N?>8`n+84Sx`2jY`NHICKHY$yWGS(_i`LYbM16z|pmkKh2-}|FNBr`>n@9 z!Wx|OEd&WahowBm(?WK-Za`(Bp>K+=GDymnj7^=pHa4A zxYEj?J0Br!^m(^64)~ZD#JkB*q^FZJ?|yr8O)8@bbx+!7AgN^jV{O*SSXO4O=O58c z)J5zcW7NZ}W67DtEYu|~>MPuL9Mak9$HB-~uiW`Kp!!JGx?T2R>yy&|Nfy!kT;QR& zAW(hVT08%g^D=nQD@xhS=&fGPUs%tA>coLh{P=}!7Je5L#WzNuZV6YC*BR#P zFfr&obEZbGPCrHJiF;heoKU;GeWUyFuFXgwi+hLH%PT<{=GpzLyK%~n6X+Pp12)d2 znh|zfQ_5oHJa2&w7SMz>ZjQkb!-3(@fhx>{u0k$etOp8XU$|!gEuNMf)Fx1p*$&yr5 z6Be%n@=KoIYfRf&+%R5A)I_nf(i4m=U`iJqB$)(V7lr{47R+Y{Hw5p`y}=n|M4@P$ zgNo0|m8&KTDgdlNi79dX!b-Q=B)gkJsJykfH+jwq;JTC<*`(TI_{x=>&Zf&5o1M8S zLMH3*HCsTd)dnq;)DYy1?rO>ty&~aPBCkZU#Jt487=+oly=h}(bF}3T5f`J2nz?ZQtp?#f(rV85WGW3>*jS5=w z=unoiy_9I{Xy%y;MOh~&b;9aRCbd%K6LE(Hg(^SS{bV}^k$1{~H%lr-{FzbmHRqjpE>7=HmAKfL z*r~%eic$zL7F87F5`8wy{^$6T+*0^=zcMwY$1SB|_3!XmB@Ue_J^C{!t2#xh^%X*_ zUV5H)6!e7f5|*+1%)o0pp4nHt9ueqPGQFbyyKfIYwbubiPIdn>cUg$;5LX-~Ss+}T zS7s+%2a`XR&Me`uUx~!61aHQit4Ky9!mSL;iTolK_5>b;<&nxe!_Byov-jPH;x;LA ze_^73T~<9ZNMDUPG?tVdFe&C*y0l``jXnoS_qA^b^JZ%hMsU602=z-|p9n^KOC6_y zKlv3aLoywgDZOml|Gqvv_`^VM7CLMH%T8!hZb*fC#zFmgvwloVhZ|^eT|@yU`O~ zT>syVHUrObfBQd8P++R7fQy^Z-O|}Te)KlKq#Ng+=(WU&@t8jOlYjEYUjwJwILWCp z>wVYfvif#lFW|uioNc5*&sEhGlffnPiM~Azv&QekfhPy!hxl@UjQZa?d~^&&yf$3? zY>_m+az~^oCa@%F-r<~f2TMW_8$D>7E;J!LSykGn(}fu7XVW9Go3pJ8f&JY)SnwBH ztE6QP4sefdop8V&UcSQhSryyD#77Wrc_4Plt4QI23Cq1t4)Gb+sxy+GKfA?(UaJaP z6YkEQ3izG&PoT1qiAUznj5))=kCNL)Hv9LY5ZM;DEFL&w6Y&w&H;J<^ z|8@TyN-L7&b+{K70OHHYR8tb%c9hc&w&nFEv`Ld*2xJ5md-Zxud|nmvxH#U|u3q&- z!2tCCc(L}2X0XzEF31w!Me18BZO7L?`n47!PFJXdPw{xZ>`_VY-GTrFEBDSk*ALgy z9uh~+;WqvBpb_0SHxrVFNJmgng$AN59H2^@I!6`k&tG}$=A@dSQ#mcc-F3|yX|CQO zSqfq7>H7Ig*#WA*^ZBEoJ6w_liqmQ(xc!UQFA0b=abm}bfM^5C+})`iy)N_wbDzJzwD z(jvq?y2wdh2@~zvdw#GBIosvtr=^C0GrMGw^Wht_F&n?^VL->z>G5<&uwE5K-dU0B zklCDA%7MH~75|UK=6?JLT1)@oPXA$OPL2cESCnbcb|3j@u`RtTdjY90Mte1<$DRzb z^lKhWmP70*S1bg!m8;`5tUo zX`WI*?QGV%&P}${sk){7h5P)V)`t(3YRh5TPcXePpAz z{JzZ=yWQhBzZG4Ru>}l>Bcl`OeI|X(q5Kl7hHle)HDhVw5iYG#Wy{)Wh>tJy3vx#G0cWLy(3=T{N?md z$Dc>*VVq+EB0DcV_0L9H#w}(JGyU2`Yk$~p2LrC-`Siw;ZIuF~q}^O*zIWGu=of7_ z8+LcjXpmG1a3Hn8a7j?gO+~FNxY?Bt;r>Jc_PVGjd=X(rR38Kx0>r}kt-WvcrD8~yfBoD02fmwm7chNF)m3q5TK>Pf96@)&)}M2eJ4F5L ztg|k~yt}jxM|!!j&y)^~xme0`%{zuSL*a%%lt2%@SI5RCxK-gXlJ7R_M@0i&Z9zw# zJFTL#mzuMKFMeTZu4D#Q`hC=5_6oDdD18x90dBZq+fpGW4ZV8TkRBU5HiKSh}9s?_`%YI5JLbgk`k!)WUw2~paFnG)$(T@Ma zk6#F`YOHw4<%G?#*SvWy?QvOj64(YH2n7+vn*<%sWhVISc)rt)CzO^Xh#E1@5@mk+-x+5;jY)lGM|P%kVK!+;p&sN*zz6!woUzPHhy!9? zz7vj``#$6Pj_mtzrzt6RCr@{Og)p z5k}j2jx-xBj(d;In(q*WM~%L#6pLn7{q>-wK$i`(&ce4d_Z1EB`MZs$=+X%+5wTBt!>YOGtrdTr{RT zt7R|K@9Rf`7Lp3ckt)Ko4<-A>Kb;ftGv;1&F&L-(uY|}j#Is}GI=;vSuP+6Z53nu) zcRK#>7~)t2?8+0&X!u}&%KpFUmKQeozL{#LVotG0VTnW@LBgDnw~Os7t#{ZQE~e^P z*DF`bPvThrxcoVj6Bndin;HYA;~xUX6XjmdcIjy%WNnd#ZRjp+@3tEl8Z3+AnUMvO zbD>W|+0yoL_Jytr#z{tILCGf|gVM5o(vK|%Lg#w7Q-Oy8DyIc)mH1T^USXlZ-l@Uj1jK6BP}=i6h<>ITRGOZNhC1C}G@-^8}M)R)N06o=O-42wOndK}K8$F2)a{3B1Fm-}+<+sNvp#Rn#eGte5URpozZ)&q% z>9!y=|>B#o9|{!A@$eiM=n{?jCn< zt$zSa_^mwV^fcD32?3K66Q%~djM1n+dO$B%k44_Kq{B}exHoqTRod0~qOvuU&)n{} zr*et}GcRygEJpr4rzlJ-s|iP7R8!RyKJZ^()Py0^xzM{ayV!$*H@cf7`}IiRc~{Gj{ieml zP7P`pK_&QpIav9@X{NW!l&&viCI6$V6*3nOP0|(v&`~d509d)fYQ+X-BeP@5q%UUFN`j>TRh39pP zQkCdv`JmlPr(r5WZ}Yvgjxy`3a0M=%KqxkReQc?#Y}bA5q=aL6Le-$C^Y2+cN)&_!2x|HtWu0ne)r0^ular zh;-}};xg5LH?RLD5|wRGb`=;fX{`TI<<(zg-KDkSbfB1BEq&Yip+d6Fq?q~zq zzXyjUm9;*S>t|+L?~I?mh76Y)S4b%CGKu>mOT5Uj+x0aj+Fql4AiN52)0|@<{nGl7 z{O>&htW&da<2A*aJ-lF{M@u*DnAr~`{Us(mb9-R{L8rM!S>PP5Of+4USIv&YrfNU0 z^WPYkReUR>Mq~{{5X8CG$6{g{9D;L7=-Q1RF_|4I^y7gGm6UEdWURoSH@Vf3Z0fa^Va0=w1FDM_bZb&gV!!cJvX`6c%wEW#CU<-#|};FE>n=^ z66h$JWq)ozE7{*duuQ$HTIH7(Cjb-CdS2is$N%xbdS{0%{W(sGZLYbh)iS*r;Q=mE zP>0c6x4=B@2+uLDe@({LIe8L}tzkhm!G&HbJ#?O@S3XPkDzg@@+sX(fPYleR!EG!L zV;ZX@K8lbElHn04VVW^!vn{w3U2@6WJs!W-Mp|AJ!c#UY-U98X#WBG8(rs;U_!t9P z1bHR2jo!6N3OAbf-F2CqFh^BxBZ1bVC&z3J-DW7Ai$06owCV_6v^YE910)@}RFH*3 zU1Noh`#;KZ%C;8{NL`Kwpjuxa-t|A8^bZj=8o&tE5IZW2?^rwKMFQ3d%50VM&ofGd ztlxM(ln+`oQYpQ@JZNe^rh$HD;p@(^t$)WNfnQ!}APeNcUv*6Q3g7Kgp|M+2?{2n% zYyPl1R5*)=d3p~OLhJS|*KtmuIM+iiVVg(LwaSVgU$x!rRVwcQC-FLANi{o7KALur z?fkw3y}5<&)e-7Ap1nxZwaz|+KNK-psr1&Q-VB!i|> zPy}&#*Z@dxCg(f*7^UngpCv7MJ#aYGnz4J}mMch&1PI@+PiWaOtcz_*hNJ()H_hSkWO_zz_gbG5ztkjo{!k^|id&&rmpgZ;K@3|eLBsz@tJ z<8DMfV{o&MVk{6wuG-tv2pA*pO6_1awSg|y1()5&dger#IsKqh_9_$$pe?crCw}!_ z#naj1k0v=t0;Uf&qN@i=5Wyky^j_^(XvLS%Zixk~Vk*=EZ@D70x%!C$Kd85rg~=a& zxTrtIVoSezd}YjtUM^kH56!@k)S#-p)?IxGmfW zQ^vMEVi7t$3FKBU#$z_U*aLQCYu`5JOV^I}Psc%8GI~3mOYF|9FGNOO4*PVq?ZWG5 zG52sefL<8(vWS0EmuA4Akk6s)v{QpWc=+Czm}t`0WmEbf3tGLU6j`M;&w@5j!|z|m zk_Gztju``C{sUe810++foi&)LdW(?6QhakWVEfmM-(Y>tHQ0MEsRMcH4@YTIS%bt; zO>TnGW0X)}V{o~-X zGNJ1jv`^V4@)ihu#MC6uqV{+7?pvcNipV^C&L0$dly}DK5w(KOaS>mFP(6?E<_Cd0OBRpdANT@2+3U8m|xTNLHRn z{mqI6Ll$sn?BO5V1s{rLDRP?KpENd5D}^qF)(VMX54nQYJI@FN;w9G2z(oB`+Ruqa z3KIVS@k7!YHFfnUYQ;YfjJIKrPUH=NN^|eIf%W5%$l=-1e-W&%7Hce#m!k*d1S3CxV z@NmGGfm@;sW(!}5Tn6ENTCUnevO+Ei2=M13- z3%4QueY8@c`sn7tnyT-J#wibL>$A8aoIdOIG}}CVQ9kb4yp<;D_3K&gcmGO%w$=V| zYC^m}o*3_m5^<$v$4S)fMGS(DZwvRgtQH1djXgl|y79&XZ&Dw2y#9TzX#qz--~@i1 zYq$OGDOKlV{Mu{U(_QcR6e6z`6~jz%4jC+?*BKBovILo+PnT-TYZOx~otk<3KPfB4 zPY43^g=Br^*%Ur-jb%#Pb?I`NXG>!BWoW=WHw%J$8L zab_vLuR{mr=D|!6CvZ~1yabbpmfuz-&ALrV8fHgIG#3eKS+%GN%Q!G^D!*TGNDdm+rFtvJ*s)KW4b=~m&^Z`R>poh-BkNgq`l03iJytFlF&n=O z%7=)KK;$($Z|jyH<_HBul~qFHmT0-IjUOQ$l>rqEV%H?R=a_bcG?JN!!9j3Vw%!JM zY`?QzOZ7WFZ=y)0f=5c|B^>!EED6)r%$%m{Itc0=lFk4cws0r<&<+kP$VMhaST51 zo5Tg?`c~)z4|mQQfz&bwRI?p8&4A*RK4I4sq8b(v)b=&V9mAZilQ^e(9hUThuna#5 z(Nw4Mb<)N^+$rR-*;M;qdktZsCox$q^nx3;atw&UCi2jW>2rY7xxFso^-f0lbVxt_ zQ`EO7rJ*e9)Zx+j2o=z65%cDF6t(K&A;T@?bscyAa-u$kichjyd0>L-T$0IY=|I_w zqpDkCdal)fc!c?6qm;dze;)U&Ioh16T@$LTQ+_SH5Sj_dOH{=t#*A?V`uIr5TW;sT za330(bWcaVe={^CjfG8h#z>sNU(mk7kONV|PKnL8@-_EbxiQAOoh6@a&VB)f5}15E zRLr2@2N4^&mrVP~a88i8_CASyU0;vXsedlcn7Gx7x%~h%cR>ZY?S60K!|RVA<*XQk zT5q|Vp8^nvnv>BXyl1_ebm8`d-~9I}AIyX#Nz(Jt+FVoKJJIzhy_|<8mqcB661ux@ zmZs%paS(EqttcO{F2Gj2s*s$IBm|6n!5lx)u-vyf#>}yk+TT(2NI>o1CF5G`=)af- zVq{=+|K@zGk%iH&KB_y3LZBu*<-F?a-KqnanNv1f;8? zdiQC@YkXyg9|bxTRO+tMUDfFqc)IWembwcI>MxuSm^Iuyyfm@Bc3g4X+qY;yCCqYD zWH*Ujk`S*@KX|ZYI^|})t4C|Cj!|yKK|0(sN>tvXLtE~>NlinHKqC)Vn}?rS4?gO^>XZU}Z_F6a5-nlzFD~5A4Ny}( zo@3Q9Cpl}jEjw7t%}&&Y=c^+2EejGNQFa~X{fjTFOYTEMvr-Y&u@XYX+=p2Vp@WRg{8J5K2=ZS5^<`tW-(Hub zD=_d@NkxE<#u~d}>~fAs@BIm5F3Z^_xpyi!ZGQD;-oEphsVPa5X0*p@RK63k+@9Ag zI^1P2|E6`^=@AsxoujmsZrjmV(#WMoo3bn%z)ijdwWmo0%t0tRL9$UmmYgA z2<9(+W{libI;RHs^c=N9oOGUETP}`nz9jHO%P>gT;)c?~$bX59)-;3QYo9JCa-pGj zs2T8uTfa+?7mZ+u`tP#(3EBy+GHP7|5y`?%?DN7sNTrB(3I+Jj3k-J_xiT z+g|80Nn9SmeABYRbz2|oRhH1oi~!$4+N^yILQ>hY+6Ss0#Y8Vu&V{7=g(kseIm;9^ zULsx5i}#Hv!IBnpum1s)Efwy6Fy>-vy(6K>HTzg3pF;{GwkJYPr*iiJ; z)iWo_r8;#@iwo+FdNY;VEl0Qc8Z$R#C~!jF)+@0>k&N|%-qsf-MOM*!+4C3rhmeEK z&FHyk&h+@PNxtaIjQtcJ_h_U86ERtNa(7fAdA$oOJU@syc;gpqy5qZ3!tTE=Q`E%P zzJLd~-rFN#BrFd$p4>AAjAHw@d>coizOZyIacG)5uTP_eK1kO2n}`NIc?wS;MbUN{ z1ZKOT|A(gYerL0B`*2aTwYtoN)NX69*iluq)k<4!sS&e{TCqwHL9H60sM=E1^7OIy z9uc!fsHaA4f~b`cBm}ST5APq45AptEbaI=lQzp6DC8Qh>dE>mXMv(PhN_DSr@|8lSCLm`I=7vze=L;ALw?4@x;j z-#SXplI|eXE=={l*pOg<@nr|#j&g5m(6GFWzF30e zF)g{}(-zl7F;*&ia@~A!x}Qg2$BRxP5}oWHO9rEUwP>OyEG(9bzzfTDix>UK(FzbZ zRx^#*Yh8MO%H??iO~L6uR~7kKoEH^7PkcuGW%i2X3Fv)q>LuIe+D*FV?>6MO;m&=u zzMG88a2wOD4Ah6UmepEnZWUy7IS5o8Oj>lFtSwTC6XX5VPqkf@C1hH?K`1K49@*bS zEQn(hN8%nNsN{0lU5eh+>Oq$%IDd_nKI#DMkJ+$8825%`6#9b59mdlOhTYyjyhsaN z#;Vj9sNcU)9ntYb6LnS9r9p9NI_Wz>S9ioH5k_?Cfjn;yPy9z_?VcZ8wfD6(T?|MU z6C^SDXl3Om#{V&a?N@@c*U^?(xBZ%Gep#MGep$hee{15~rVyXB*Ni~NLOS+0TkW5^ zkr29DkzoyPuRZ)i6Z5mfq=ekQ%puhh1XNeZZ7Mqb{K_U19Dj2AqN=_%U!@=yz29`b zH+Xhl2(S3%F23M<+wn)5YP-*DJRiB+`VrK2NRgD)1<0diA7!ls3S3K`D8cv<2N?VeHd5f_n3 zR%u}q4?a;xQfRb<5ziSW&}jAi_VvMV))oe*IvsP3LHcT_$675hf2SXn@Q8aqfA!2% zeo#_Ic2TVSP|lhQY`yVCVKUt|oXaZ3(6*}{qNP4GK{Yn{B_ZASJrRtW8}| zKeRyvC@}4pv_j5;++B<3H<`^JZ{3J!~*TKQ1@GekkI8M+TY4pYdA9t4V@rCFE zKvbI)TT{wg;SiNH*riCw@*YR3Vv{nKjk>Qnr@7m)VRt0h=9jmIFY6ucPTlGwoLX1u z%F-lG$!lz{CN`WdJ>F?h=a)OClG^UBA*{O2wR9>f(QX92xQw6k*^j{FFLK#v;Nv_L zuW3_Xb4-lrhx2OjN;#Lm^U6egF?geuX9)4>h0AIQ<BvzL6BRJF19K7Bp5=)|cK7I} zxDH=4qqDz?T}K@;FSgE{+b!db^Nr4znhn&yP57hJet)1QZ{>*ka=@y;W^XfFkUa#M zc3?+pH}G+f4{-RDh#&jowi&I!h##S$6@2YvU;d$e;_r$;aDV(Qp!rbb8+!(gIdhDS zx*R_C!QrQ%E`!LV76FWbRi2X03K%jI!JMSw@nZFg`WfeEhZ6-pYkuEegzS^LQ?&hU zvnb%Gm37=O?SKwT`I;cUKx%7h7PPpFJz)R2<5`;)J(;5m z?V8RcOS;iD2T0uF>_;isvhpA4-h?-(zDAJg*ezsbn85q2`d`)n9)3UL=)qyNsLkGw zWq(&4z5nH5>XZXbF~~2GEnn(qxUUIMd3x}#;P(WaFgCNwQH$A;~9ZPs^yO#!K;DV;TTs z&-p59)(zJr@I9_h@3+pu$YtuJr3sxy~?s7eFfJR$WkLJ82 zYjIyIJIBZ6{Zt-7Dgu8PQa!s@>MzV!%zSavlSntRC=drsu&G@;(iP~7%c z?Y{40bai#C2&zvZ;P#D)=?OF+Pyu6uF*I15*W0qkeReaj^`lIO6z(qRoh)%E99|i* z2B5R9d4FUYGa&%fxdB5sk2U=6KweQ~0d&QFwcQ+d2aVLG2_M^=aC=9JqLHr{yb;~C zOkWDogh6S4fV^_!N}U@ivke~$%3BwV@BC!gtMKm#fJb$-YC_UAg#V(kqfScw@e|HD zF=GK7$D9Ku@#BazfxNX0Rht5C3r%`8mbTNI{iWoc`oVjL!*9 zxWi%*UC}NG?3fj6N6_^lw4yNEyG)S&XsD^_=S?>eD-&uJuT>=gptUQGehUdvDXqT@ z-ymjPhsA#FgB|flSZ!3XQ(&Z8r;KJF+9l>NQqj3j*Ju@|vulG0^lry_qw*+8Yb)0U zk7o2>xn5&~H_K9pG?Ij%%ztW8Ll1ySV9?gtDnaz2Ifl+Jnj* zNU3o52Nlhiz`Ph95wOIDRjE`K{Vz{oS`S7E%ZXwt8w*x8#K_BCW7O%)DB-6vP zp&(SeJr9+Hk2>tL*n;~s+`%jeisa&AI9sw023Z9bphm8ldjfKdervr#V?bdFO_4d`iKyP@RBVZ_B2$R1#%iy}uZg+X8XVTirSHp%QDfF^6FniQ8 z0wwwIi^|7}tJUW}n1(dnye!$YCHN^UUZ!Fpu@y>kyChgUD9ECc9g#PIo^$(Y)NXR> zW_!6*49+~9q0b>NQhx|XcTKXGG1`td5p7f-y#t^Ai<U*YY7C*#G zl7ZUn;rz3}%kGFA8Cgxo2M?Her>|x%#yKYIpJSBKr^d}6iv{=1SGlhY^FUX7cmwf{ z=x=Y_o#dP(YpzNM51ZeFo9*^V3D(q~iPZv*!F{cn#)uN42WK#y31AXme)pQGQ+^@* zY9XEPLD*nzx3dX0&j+>(v`H@y;ZP5nJiiOrSLF7iwWqtSw08pTz>hcX%z?#^g9|9s z=#)VTSSMN zv?PFSW1L`If{I|@(<`_Fhsz3nD^)}l9=!>COI^|Ae|HN&uu|b|+OqAe`yF<(%?cdv z@!pHoyu=<8Yh1w%%^k}#@z*=r#g}Bbh z^*EUEpZlrL8@N{eX|ft`@?qhk9?C9fn&`;y{haY(4(5V1<*B9aXCpe|v6Url%Tgd) zwNhaGS&3d*F8&J7nFZF*2rIjo2PJnY$CJ+c?<7Ay2^E!{xX8EI@>q7NBfNzeP~Qmt zOvu=tt#?S0SCopQ5N{}K>{>NCS1C`~-S#VXzcdv)wHup=k=*)V@?-HorACG2$scLw zVbgsw-sb`2cLaJA+RNU?Z_L(u^ka}2Yd)Qo@0c0(Mwsv}t+o$53W3<3)`3a;v#GV_9 z((zFc>CA6%Ba*BfS30iAsUGE=XB?@1$|>&iE)w8X{|#t0d>$+YrCjkQGwsAdo9WM# z7tL~)cqU=!Pcp;12UurhfN?avhgqI4=Xc^1lE|{E@E5uy8a|>7buF;IkO;fEbBx+Q z8)nw@rI+U49#=y~V`jZmteJy?6+`v1)mmi>E9&6oS9o^J_Jo7i&Ya~RSc4r1Kol8n zTuBkE?{kM;vLM8Fr2#kgy472~`V7?98>6nhsl&4%1Gz+>qVZ|-alNQo;GfUxXT@$9* zoB!0)!as+unq86wi?z)_pvw)^qBR$DK;^D&PMnDj$y}HpMpBJx+1Lv0!^M`&Slch` zdalZ+`s@8Ax=UQE<{RqS=guM7pPYZl#3swe^6d-LSErvJv#*z1_GK_VtOp9p4awd4 zvq3@_*!!5}$uVUmMpwj70Q)+s%0$q+dM%~@qW@qV%PxUIHVTvXI!%o9i|Rwg)ulzF zzdiOJ`if1U%8*F6nA*S8S#;+u3HE$<1YGn^&KOz|gpZueZXeI$zlx>1cS<~8veV}a z)P1-2cdsWGRk`QY7gCIY_}gSX>X7G?jG1sCTHYB+be9l*@F=+>EyvpAE^$2GUZrvv zW9p2|lEWoIy_c^gi@jpaH?(YPU{0Pbzx-(nL-~=h%E!tfF0?_qHuTmw<}8kO`uz+d=^3&Pz1@jZ;sLzBEM?()WPPSJgrwQR-;XfDPj2RZ)?O zq9YzucBN<2LUt$C(q{K-O>EW1Ysv(V+w1_-YFNMd?Q4N^Vqen2_;duPwksnCh2$_X8Pym$a8;rs;e_ zsPso}efyVWPomjhb@DV*UbCo9PN~#Js5A`UnuU}7@UN1rW;HmD)4Gn$;3q{%-k0Mi z*}EqnVC(I9yjD03;PfKbrCkM!-Ph>&{ezIx1BGcSfB+L-CY%(^X`pdYM_e8J)L2l9fR;5*Qx0#3>X327JCqLgL)3RpH35w{kn< zfbH8|ihp2Y89gxPy@R#VWp|&Ek68?USJHf<^sC;v!_Kq3-Qm$A3fDN}JtSd_TPaR` zhQ3L4Zcpc*mk8`xB6yhsz*D%lQHzhI1Lv^*l^5e~W3wQxzfe~sy& z1n-<~KcT=4(>9b)Y3Z^ub?`O+IJvNjPQ1B_`-lH3>FY&*)q&S~j>}eU^SQbhC2-r* z(O=;?*?rr+r&K|cwhc?zS!46Bapd^W;pFdN*Ne9JxY^$j;*BCrx5q}UvzaXHA&#e0 zZO2nGJs-OS+?}f$x?tRptmyt8!q2TZ^5$Fi)^gXfJ0OQDwH*6r(`2SBsMec)-^d3F zq(G&!ioxhyou5(+R$+~NnSzmU;ViP@M5VZG3C0#QRXZ&r(c1a^Y}=5ig~J?2RYBP` z?YL!!!@l1nS3ts%Sz?+>U)42Y+e4i$gsR-kXPU&(oL@Zp1HA9huAX2&{Q8csAb~b} zh-@N?*ic`Ns2h!)tR5ent`Zc}JXqD*`pMKC5hcyvKJpVT%i^o)3BONfA{!ZyeS9V2MFhGQE5KBeF_5 zqZjV=jHGQsB091AOip&Zyt>8up0&RUcCY@8_{kHo*RH{Cy}9K{=jq*}YK_TU`@WwP zs}-a4Cg-p4pw^t_Urqe`&4p8tEM|)%6R|V4z-OOQ)O_OA6Wfwrao>dE;s$9F=<+D5ef&65X#kCC z1$C#VPPli5nLP`2zCdvi;N)*q1pL6CyK_Y^Qps|q z{i-QdQX$(~J8ip}>>v&KYk1Al{Ec{`NJw}X8XV;amgbll<~s1q;TL@Qce60l>YwfZ zTob%Jm>GY9wvVMvDk^wT_RQL7QQK;8jXoK}g$bVgWx}Z-IuSWYdzqEy4FHtaA>Q}C z-gpzg%ILE~KQ473#JZsSz}-o&84hV0L#T&MQnsOBz5gm;Cq#2a(YkDF?(i(A9^=>{ z;A^Il$U>86gq+?xIX@j4DPp+ycOa)qg*-RKUS@8V^!f|L^-?iLtqwjD$6njrW3TgP zhh3NGPN0xRl};9yGx^W2Su?Vt5pd-UV?BsnsYTt%)O51Bjp%-#a?k#HmAmrL-jeu= zo>kn|mb$Hygzb8~%1rM{CW`1j`02DnrCbRLS;(TQe8vpy${q!n8oP33N?DVH1jTP#geRGA!o~d)iDf_@udnX-E`y#NtiC?m7(Z#Ox^nYGR zBZmkR2B2blg)MT$SQ1X;(oC5Ms%GKccJc2fY?ba48-C+GZC#?n%vn$&l3K1F(&`;J zj%H$t{rW*)Lifv_T3PH%HgCD~(0(P&hIw-F4fuTWd1-j(rRziOcR2B6&VmQmum0O^ ze;*fWp4E~XUtpWno`u-kJZV#|Gftg;2SYRd{@&ZQRmh z>7E+6`{q898hx$mbn3zvMVSWz#)!iQvLth2MszF1-uv{r|DWIM<9b24ux`^SNt*rq z-DmfVD{fWfnY>g^vc1}w#@PqE;vhR9Txu_Or4j%;ye@Kx(t6H>uZU?v;Tup^W-Z<~-&&G}eRS)E`D|ypJ7PJB`o_Qy3THp(O5>EA z!@y!_md?0w0r<-q=*D5DaOJu{CX{N4v>#L;JDDkHX76^*dH|#YT*8;yk2)O{bN79{ zYPz9KI({^oOi!&?3gVT{!rDMxZ#z0yv-g}2M-cjr{SBV%UIXI;qC*voK`OJ`QD)6) z-C>nU&*k&X<*4Aj} zc~ir(fLR{=lcg1qu0)&>Ami3-)1rS^9Wl0Ug=PGX|@#5`>fv$|MZ?LU|~+ z2p@%QeJT|iyYvJPg`5K>rL56+ZBb{4NBN&YuGLBYI|L~a#I1j$Pk!b&fwNZ3QGe}_JpkmxHZ!tH;PNMxc_eg zYHsD~%Mr<{cc10R20bdZs-7pkgFF{l zsN071JoY>Ow{ZrWT`#?J;EX5kG9eu-unn_8Hmm(*=`-q@b5AhwGjMHvlNK;E?ss_$ zB7%l^(VqQ6cLRnVw7bf(a9v&J?DboY^^Ni@Ex*DEG}AZR;g#jSqr$huoW*q8S0K6K zT{KbQX@enPxd-m%%~f3#dr|DYvlWWu#T^bygCwE=*;LM%v^GnP+<_K=x`-P za&g2;2EB8LUjlM=u*p~R{#8XHLX~~a?4s)=oFu2svrly1wWEX!%kq|>B6G-R5a$Zc z>g;NJSF|#@&`@ybYP}d92=M?~S{sVCL-;_I5AA3bMM~svRbcGj&D#m@>P*_5K&&s> z1&2i)(f1(1<+y$|x}~o*{-b+unBEjF7wsg*BD}^0pf0#AiM7TTDp($>A#A%+;LfYj z^zTZ$G08J00Vj2&jVaMqkz>Xxe>lJqq_buqg&c_)AUZX{L`K50-5we%$NT`NlfI>i zeJEWim$VtF86l?7BF$@8w5fb^D}wnJ?PVPX8(O#T)0j?H{w9Ly%MhKui**LM^}IYg za@cwHNo#X#@z&C&Euwf}&PL z?$T!qZ%-|*+~w8e=v8Qaa1}l-XHlZ=(c0&0_wfH&0L<=xB6VP4@_X@telE`ll`N8D zPz8?P&ZXE|I(kO^xec`*jjf@jVhlA(p3djIM0g#<7K|T;5Yu;7tF>mI5d1n4b znG5w>7V!59P5^CU3m5ogK6nKL8^T+nlWm7T;fKA>xXjqHaQ8*&FfRWJDPRL+X zyLGKn8JGL|9apBwiL~YoX{o->*57K#Rh6Cd4dngoM3PF|V_@c)T!np1=s`%J6=7xB zrJ~-6AvOj6%pZe0ea_j-g^DjBZASO^o|kUusCiezjO8X06MbK^95%h-&*CacTSf89 z?G^>lnB$2*c4Qk}?m{T;bNlYmYTXw5J$SbC(+}c1nQ?G>iGY0y?7UDSSko?1Bv{o? zaZcyBWX>%d?&oq``y-G44_#iCG@IF{u<&C}07F1>v$wj)-Nh1c#IyW@@-?yc)&+UX zVUYJf0&te27;xYYUq~KwPq=t5hRKV-qq-lRFR<&bgq*;(-#>{+32$T<&Ju@EvoBC?rpd4FkCsTp%w}Q)kKlO)H`T-RB4~$tbTR2RS?>1AU;ndR zMUQA--f7CwHw}#mAYxB5sD&B5GH}Y%YEtgDm?8)MD67$ezbpB+-c;I=#OaDD85S)Y zOuTm_wY@qnJ&SKOyw8|e0R4z>Bhlx`Ixv#~%!XAOi zSATTzxqC-5X_8^81rH>+gZoVQvIMj`oFv1Jfx)>;U7sbbs0;rP7NytH4b0uIYq)9j z%&uonD`W;ZRa&IXAgk^Ewe<>XJApa1|0i&;7>8{?yGI-Ff#gHQs`bS5F)mH?3ZM&3b97qR&jlXvy4kedWGV^Y$F1Nyoc{OL}tQq4bW%FU&M;)DWxT;J7cl z-=~jo?AzW{I_@l>l*6%?)R%PE&7gr_&2yEbbDb%Xm(-O)hfZ|=(*nr6q^N^n8%|7j z(_pA*Q@IVI-e;syRBALvcqL9@dS)~%J`>&CB?hAlHNA}gV9}y8!mKr8@ZEm1M*nBt`XSO6o*?!kn+)g-*_$vV*Wnb& zul=_lx{#6h7taqp{CSP$ycFLQ(YD1+|Jv+zJ7gp3OqKTQwQ&CK!%8TppS&I3*iL>M zm&G-~@e*YiE)EJ6ccWJa(d#svkKgd@_J?)%iMvUHcT&8y=B_sp6{AaPk{p|cN?YUp zg9RSU$V}MXH*WZz9-dfZdTpuY#u?^=FVv9PZhv7Knc`LcSv`L5SEL;9Z>mE}vs3Xz zsPO4lsLWK@FBP>20ZvQb2_yVmKf5Z%-ne!V;G062jF0c$N%L;uQr7)5oX#FTwhCFe z%MWw9o3Akw(vl;C|SHz8xv;p7nDz#5DR9pkf z6g&1x>kA%1mzg?Xc?-)8=9B@uhU9Zwg1aW<8K7PwrF$seg(zG4Omf?}bM}na-n^)%LM3*G+bW!duZ3f@vOP zFP^mDezremR%WVdr!hh3)4}Zo?}dAwXJgOTxGIa#Yi?)nPcs)WOZ)dy{L8mGrHq`@9Pvz!-=s$LilWo{%%WwCz|D|$FHyl?lzcr+YYq5EP z(c==<|{@y)w9^{uuHnRnmPA zCQKAP_oClY-+F@t%e6t>-~}gBUx|Rq=Rj28X-xOP-k-f<*xJ{SH5FC=Q}&+e3j)d} z7U*}6Mhc!tNzZO9Y(O$9`7IWHjzo?=Awrq~G-NB!g zdiH0WbP4KK^Q|%ZeQG5^+L_@}mef6+nJT5@k+2k&&(!~-jdWyyl-~q-`lY6YHTQz5 zZa!kSLUu2k>*mD2Q)T~sU6?rP+mSO&DR{DILgF{3M7)UOYoY(pnRYPBWtfTN87STF zzVwjl_9tt+utjk`tJ`Je7dy|{S?sp)FVTt?;Z`2iU&>k@huy~s zigc6p#vR65Fki~1<1|lP9y>*MQ>;$rx(&9%0%$=}(Q(pXyoq(*py^^R*TQ2{-`<-L z%;+i%RTb&lT!bAShDxE|Cxj;;U7a=KQ&>7hPQdRVxA12zQMW#o2$Hr=Ie@OXO}Bpd zj=xs238oL!$IP;ml7|>1%^ki&X5bUdSC-SDhVIjLc+=nCsLI?TXP?4#SSXk0AEB5P zT9-2F?ewU?jeo|(^3#0;9Bo`mo*KMeSy=uDrYhnNdA8+&77!p5to)NU85>L&59ye) zG%0id4KjebkbK-vpvAw}Y(~%emhtR7)V0lemOl^gxz>TfVk#hl=@5C|WRaC^S<&x( z71~c3BqB7`Zfr1Wfw37m3%}KoIBnU@oU>&MR(BU5_ebzvS9|0@j>&|=aBiQuOPWpT z_FRXLDm%-CTt0rL`E$Of?&0umZ%_D8-<^b&wIb5x8>CD3mui?B#dv~ogX!@-A2|ub zD;yF-?XQL%HgtvktQ105d!4QDd$o3j+k5MYi??WpUC$3kGOCDQSPNPCY=@jVdql4V zti9(8z~resikG>S)S~Xhx8tkW6RaP~9hf-CkS>J64)h&B?^ZUrn&!9s5VA+2jXGZa7 z13ZI`sJ%ZmJ*%5D_}$c^pnMKEqt}!hAnTWm>T5UMxQ|tQE$ukp!`B_r;!5pZAD!|2 zE)A*<%`DRc?s_SwQZI7GmE#h16c6g|kW%AlnO(x&<-ZU*ZA!MTX64a{@j3->dcKjL zlBsP40u7cq{e@GZ>h_n+_Y65`HS0vf>FLKbcH6v=bc&2c`v4DTV82Bl*A(@` z7#1o$9__X9$aXj0{6kVoGqC_9(k;=H2HCk&afh4G=~^ElZi%|e=P4CZq2buZK%1b~ zWsOU*)2Co2YoPZl*Ep4?T~=fu+X48?A&t|@ef-DDI^mR9dr9h;RDMg(&L7nosX@-p znS83(dRX8-J}v&I+0I7B_%Uj$HD62P@I0pNS4`VWGjf0zcKesDDfwbD(0%j$cO~C_ zYe+QcsNLWZ^)ZWvpcU@oHh978H^8Mk|~zF9Z(C2^a7H$*33KY#ae*+KKF zZhzatYP@>Dnp9!0*CA07E5Dj@xbSi)zYv-?!EQwLDR6wp@_N{?UxhxHu|?`NB(;Zf zy1~(2uW~yKhQfo?Tx)XA%IP&3ea}ve%u2^d?JFf&xq0GqDL>NrQ&1haRu@Z%vrg03 zE4smdIT_RxCR0*J8dQ_^E&WEDk$*H;s_`E$(`HFPmapF+x}BWj;s8`@)-y70EaIXX+Y z*C!?F@zUAJyrH3DisyJVm^wuF9+b*G;q1}Zh3nh_IPe-s% zg*CMz8{hD4T~_gYD4djR)|Ajb2vymx82)t^@WCB&l9RJ!@hvi59Qfre-mcze9&(&uN$E`rARiVLzGigH)~Oe}6!NTR$5 z)ELF)u2f04y@pmMPoiQ*jF?vT{G|-MrlfE!tbm!qml|@DbtiS0d`G3vi4e_Qk?%U1 zjCSUuFa6s!sQVsa-@O*mO*e+k^n}-#f-n%z>iG^%K3<>h{kr<@51N57kN0^(4$V9F zx&^^*#kf}WRyuQ29KUZouK_YebV~T>)Ja-C4O;#7TQq$ona2j)E5(~d6Ijx;rjB;0 zwQ;d)t^3=0*~bTTiGlR7^7d;1k3CXWX;saIiiY7ln%4PY(Lt5%gEYpK+DY?f0fmqb zH>=B|pw^Ajq@3+cJhb-#xOq70vF5v7HHcY1Zyhl{+`)gvaD7iJF?d`I9^NTE&wMbZ z2Y#c?e&pdJ>9*{S+`Z5^f`=Fz&02?~akjg1wRS_a2aP@A)J~%Y_#5 z=JOmC(^>|n6e=G3E3$OiW_1iVCI{iF8uO;b^3ybEa*dbJXl?|=#{OpyT}7z83*fP1 z=amSjgM<$p1}D4|PrQYMC;HX-k_oynu$a?bgH{6rPylg$%z(0%dHS(`!eO?NWO%EE z`u0et@#yApf%~qN?$r8jamY^sKy^n~H4t^O`?q;bqU>%C;ioPGlkKaOfl+)!EAuKZ z$gj}@`9;Z12V-ijIb>X~HQ|1$r2o1ir}+|gcWy$c>2qT5`@)K`8@}^$bri1Z9D5E& zN(J%k;bon+qNS~UpW zo}@VY%BI}AMSz*sq&@W|FXfj4jY$yA3~Y*N1tkQI8Jmjm%cLbJz=-wj}GVdQ--K7XeCP&>0G4UNzkVddh!A; z0Lc98i5E9_KB4CP)2F7}@1OmW7xcWL_3~y?79)EQc=4RBK;sH(sjpz1`};KPKPrcjeVcO^jccl{}pLB)|qFeby8sTTxu8E+p zs~O<>>V;;Vti5z{pwU&chm#1R+u&*%puuVa@xvxwhG^xy| zKqm zh-N1;R~)OI3`f8F@~gekuz@YPhp`u_ z6ly#Hi9Y*-JDg5Q0e#E2er>9E_ns*w@pHq-q5*XQFvR$v!>y--gXCYs4Gld_Vs&1zszkCOLTLI8x)Lju41#SHk z7q?f71}WgT?@l>7P@l_w7GDtKTPq#=qHSZvVZ95bb;Px0^{bMVc*YhlMs?!`d{pNN ze!2MPoL?>)&;cPO)0>voLXHU*>Yx^wm`Bgz18$TmJirXw{QUUW;oUKBfzvy-SRMT` zQgz=5!MxaiW%IOkXCumolDlsmJb!4bM{aLBiYhy5JSG1dv>n`62rv1V)<^!|6VcR& zaJwU-`2oGi1PKn5K~Ve!hG%LDW^YOV65QJAiqmv?>@#1iXWJ7uNd6UjZQL0@l*#Ae zdGKopNSIX0s*je@`w5@85rQ*lQ?dOfo>hI4s?fJJ9~69;t+)7M_5dh%ILrbHIe1{C z*?G9J{1kAL0UV0}Pm?7NQjWCX&3j^Q8fkJv)xozKX8)5L=u8Zkvp?rrj~mE+kC`xN z^CExM2J9XzGUpyn^73V6B1TrAsQ(1e#6KFoG`7Z*sauTrvTh+k!q~IIzw=d>V8kPQ zp`3Aq>@8WA$Lrdq(Zs^^r7yrFN9M~G+(ze$!;=I)>Pwgn*@Qit|MFDvejumZ2Z8^r z&md9hlnKcf3{58ZK~3x#JF5pXy2g1`D=;{6b0-caL3h_Tp!G6a5LF9 zCuE6O)P;UmXd?BSzMqt8hu*LAym+^AIL?}R_-kksg?B@|*TcMF(sx!@|3^|qWLkFX z`=1IUMx#D{p|=|PekS&Ax!J#@?$|rpEyhb}4!%YxR|;qJ8X47!AzHIS@Re92>802h z$<4vXyNr*&&t}xxNNG@*daF}ckpzGDAw~2I0};0AU7yuQC)BLA!>JNYkzKlT zcplrXyoznqsx~y3SIv5$@1;rB%-n$cQtY;HoJ??V*8Jb=66=ZgNcZ@V^gjy0?m9EB zv9}%V9(kOwO#9a0>|EM+*9bH1_Lha5#}n*4`SI9I^}11)uof~u z3pCmz3a_{|Iaxhe3+XbX|C?vlFGEwbJ$re564bH6y6X+m_f-V-;cMgd7FA(x+3^TySwh#*iKOQ6%;MC*nfMD+OYGT{MRCGQTB zdB~o58t3n4rF1=AnywB}ii@ozgBmH=&<8cHb+|@o-nMV6lvKk>g&@z>sLA-6r=?4EFF8Qk{QpEpMPeREZlpXs_j zh5O(>pMAW>VbB9&;6TOcigSOY-k|dDh>Rt&4=g)@EZeo4X+l;wYfw{cRT`JV=4{Z` zWQ)xllc#Z+doS0V4F5U(LVKB2^d9enxEDJs$!SSvZ~oZXd0e~rfUdU zGQ-~UA$=vx07gs`9S_s8D>0uT0ySTJW-pm^@$2;VC7DQ&*3|h!d=?fF`VeaCf!w3h zlO$ut+|8cWU-iGs%9KhIVdRqg5x1H(8zUblQ-S-3YlYC^B!k^}G`Cg;$2G0V`!3y6 zH}1Eye!dq25@v*$ZUcmSMc1_PACJkAk(7|L4wb9p+e`G}}?$!H_+gR~jz_0^&g zrJkDe{p{;KXE*yd!o%k%=05SSIS3<>;pg*k2_^Asr>|Y~VcuL(;rSYtc0+|W>jPV4 zHLS4RIdxy^cMk0OpjMmylus+O>%}DNW8E0n9o$%9miZffsisKrhP4RuiTXF}74$Q> zNhWRfjN1f(-xCL<(>g|_jwofjus}EUTz7EGc}nVD^ih*F#4hCl2qF#FNQsdnf2v;Q z)_S9kEH6VVS6vaL>j&}&<>o;{sDFGZh6ieXi-htji|Yz2u^}iO*CaoTREEwd?c-q8 zgecEcxu~1)QSBw`9!8b7YuiI(znw}MP(h**+X0HN?PT`gcsu0ub_DH5I&So9VG?V} zrQS=?;2p(J1UtDmT^^DDw1W5D-Xj2>l`l{`0lxDe_yR@`?^zmbyZa-m^NG~qXZTA6^$n04s(p}*hqmfN7IY9r;rG#y}PMiq3K=IN(A zjwH;V5et9Uw>u^uwXJsJ%w>}e zP_4xz1zhAnuKB@m*`OEw9cm3R6jKZrN-1QZpfaZo6bictt=AU4;dqK}o$=gr?QYu^ z9OygZXd`o&uy?gsclRtzNAU=2?5|}v_kq1{PWLMCO=RXQ-=PyURJ+)++HuH$**Fy% z)m?)6bFV~yjFZx(KG7-ElQ!{GPv`7Q)mct;Ubnhl*IjA6?q4yK>(rid`a*`k4Vg5F z)YNf*Ov>qHsgLrLtQSc6ZBl z{+$!^)Sn8l{n27L{WP$pVAZag{d&(zv7~+XB1%$%AajoOJ5eI^XwSefcC}kYN?h?t z_r~DUE?~a4H?vVdkM?ZEiGlCjkJ2a4ZU)J$yE5@SzU;EQ(u6T*trW|+od9Mcds>5x zcMg)$S{rzOQV3fP&n%HIfP^d~)Eb z8;iFp?ptnj4rR|VzkJeRV{53V<#xl%PV zHRXd4=UI}aa!GID=0A=V7E0jVdHT{_5TK3Ke{|-S-ZLMW13{AckSdijBzdm#;nl0L z=(x8W*U(g(i+;H{f(|%*F!^2X2tbNVLCwvXtHoPg0^7Kl5_HJx@@ zuRF$2)55wh$e~Vi>`wLawJaWuSVLOJRbAh%unLFwT!Ydohu-{|4uV{@serYw4d!)U z9`L!UHpRY0J3(N`w3M?q4UOKELrSVjuLMkQBdruZ>u6qvc2f%6D$#(rfn&C5o#8xa zH@>V>+T*f-LBj0OPFmYWH;Fj~drHT)QO)%B%s3KvcqZ*1q61TdNSCZ2Lv0J<WGtfQ116RD z8@IG5Q)0@c%k4~K0!EAFrIH3=EKhLw8?mV?f*dF|kED&G(fFH}HI#*D&xbFVCJg<< zr>=aFFX2YT^^H3jC!5k??!$jPe^tDn7`k(cA)vQ>PM3{YL%^V;ID&eE{ww=5~m_OO#|P}F-Ng{+#yc)UvpB`J}Srs@8! z@~b%&p`J~pn5eDi^X`XgXZnT~86>-mgl2^gBwN&1aRo>?Dr;Mtgi;l4#nh#yw5KA{ z23o?tsmBk$Yv+^`03^=-uQR9Yj-l;nNbMerEGn9(CO!ETC~Mx3r!g=AWa;bS=vsTt?qlCHfTXRIR@&IZ)Z6~@pX;+y zx(oAFWh}(k;dQe~4+^e|2jDx^4xPeHl#}?esIPU{?xWjIet$J(J2UIE9+>35?YcU* zKJOaM5A+#Cf^&8TcX|TqPuddAIrkSZdUL)}w@y&_I0=p$laqI3hpl94Cnk`FOu&f| zi^?YOkd80?lMg^x$Nqb7REeuHPS|GG>bY#?PC9F!j(7VsuzvXn`Mmd4#GfaiqwQd$ z+0^JhOcZPObb>GSQPGY6qv_oLnSTF2o^v@C<;)1tJ7+a#ON!*MN~N5cP|hajvyk&S za+ac!^Z7LAjU47s%y~|mv(1K$nXk_e-#_8?!|Qfk*YkOQ+#eoBvLWy!;&^SQ#tM>k z!g{WSFEJ?dO#xo;Xm4ibUR(S#0?v0t*~NZboJnhH zoG;z=mzyZ)j z^L}S5g8N=@{~aq}?%3hYHCOk*x$lM4%|b1-?O7z7Kwe&+ATVT|Kje?_#o%0}PQrY< zOi5_HVTzsj$M)csI{r$Gqph7`E_H<&W}jBL9)uqNQVcDxSsrwK*I*$A4YC^AdhUrzcn$U@7Kp{1Xx^B@24 zWS$UEwCn8;Exet#_g(ES5eYNh{Vzo?DGF&->2E~th9?(>xc;_(#%-j0Ug>FiU8z)? z-70eP7g0AFbiQQ@JBWe3CkA>){9}BIW0tSqd~9so?~hx10Uzs!8b8tH)jyJuW(n8T zB5b&8v`d?9lq^d>E23-TxKR9^G#|{0C2MVoWkA$+|3f|s-mDAE)u}4ZQtIUd(?BA1 zqjv@x*KACh12I-(88!hBcK1Q2HosT()dF(?l^oz)2awtd-`SIIuCMU+a~_cr)WxF& zF=3hKPyTY=v>?Zb-v`7t-u%M4^Bo)!&2UCs)&>Rm6|hRM`>=@twc}mL#57MzULrcC zvBXbGG?A7`$g2LFMieBzdVcNiz~qdDU)QH4`xw98r-0dlx+@*7pHP{Ld$#(w0{9Ft zE_bwhkZ(Ys=x{*B$)WZ6VFS&SyIZb6{hpAE>D<|4gIr@QF#r0m=K26t(&`o<=gw26 zNCP>3p^e85?R{Bn4(^Qk_a0Sh^jLYMsgocqEh?hw3l=5%q0|wkk;vPYsGQE~RMm9> zmMSbhV~KPr2+elq5pZ!`>`0`kmq3XFJL3?L^{=U$E&~4G4x@L)wxD{lg3w?Q3ZDl` zGcm?DzN`rY&2=6%RB3L!^jvdE^6UtIlq=iu#noY=kYV1;6Og$p6y`|WbPmyK=#LEQ*Wg1Fm;DW@*mT>JuUS)b zN168pg1>Vw%JHAunI3VLRpe4)EYZ$+3LcRi3YF$fmBY%kHdV=%!;z|?(2=Q?{`oj7 zBAFhr7P_+}3BeTCQBE*RJ`4Ppha%)&&;3))wO*CH(!TLHB)f+V=)GFSu5w6A->7x( zW0qegX!u%L^)+x1KilgZb1g3Qbu-UsZfYWzvK?EJQ(d|s!p*Co#V_^_1@+P;9iT}S zi5UvK0GV992Off276mm15pD&=;V_lE9OngCo$;=7YOu8Nk`CQ+H~4tkCb+cG-3{7U ze^PC8I8sXJ6x$~Js7CpH_ z=R^@eKtb-ETSHkJuXJz{F=UrPxkSk_U4YN@bO3}6*r;K|fjnI1ki@>HyNg?D>J`{L zJ5y@#C%7a0w?Rw+CD^n?VfMySbJg*dEd3xxU7XiQv|X&F?H*tLza32RYJt%&z9B$0 zr#mhRA{RRFJR$J&61rwhqhncPL*XJ!Fvs5PG>x?HZL!}2Nt%+N@;0=b_hqDRgq)ZU z@Y0Os)ifzx%B*Jia_Lh0!ym={DAxF-hqta2727O}V49C#ih{1M$-L<2)JdzDlGC*8 z3?lE8g~MDbNv^#=MSu=G;ZXbl7uZ4@yT1AYm`6$<5k;v8>WP+#i>7XuWr;{YjKxrg zSKdb{35jc5G4CPVyV}}47~$GJ!tXM+hN}+kLhOMx4{^g>Giwzn>rjCv5c6JKNNR)6 zK5pFR#kGa6j~XKq1&KF7=9xRS4EzPfdO($~m{B4`4=Qe`_S$|^E_Q`Y4q}^Kfxl(I zQaX~m!o7QVI1@5v`%XSw<)DI~<@p$GuWiB^F6Tcka>pMXC$}KZ;s`ObNc?%pIUE5| zNAT*!%K;kn9}EddXQQgo+izGVFVD)QE!KMK4w+utXMCO9*1ZevMM_xb7^pV%YO5vK#e6`Mq5l9T@JwQgshH*DUGko%*Qw6Z(F z1=jk>+p=a_1Oh3hX_xaBi51Auu3g`U9}WuSzCs;+&acAJ1mw^O0K@M{lY})A@xy+r zsH~9$XrH;&g+YqKEbFoL=rU+Xd4NN#v6m@W<+f~36%UKSOmMCviy`!UypLsWIi6{0 zS;zY=b5i~iIsdIGazGmU>i#ER!aY)}>BG0+Mmg$8WGdwew@-I` z<%(eE0ZeO}eVSO=Wh>`Bh8t`K1#g(><3%}A=AeqJ9HELObq&|Zm4>M!4*V^)>)U~$ z`zCnjX)Ps+ulw!kPyZSpZH+9d6Sg+ycFTOMovlF;-MTwnM?rO2B`$Ee4#6ma(1=r7 zr_mjF6>3D|C`KvhMge?4tmE&4NX;=GkW)OD)<1_VnIW#x_$8NQYmp82!4@%ujNdD4 zmkwp{JB&|TS+4PLNCtOJ-Q$}%`Jq<8VbJ<>g55vVdx@4W!E2GQTer1-Cstp_R(}-z zjb55vD-eXE5xPz#GrD6ep2Rrq#@or8P_Qx8R;ysm*5sI-+U?s{RI~m7zhRYhGm8q; zuk8QXke|nqWI>>N#bIJAx`$Q9I7d{i7kVtTS6RVGx;25vm1%Opsy@v~EQzP?m- z3(BV4Oo)BIsns0D)AmUW+Q-*E5)M!&cE?x@8gHmf1vFOepQP8sC#+8{2kp!#&3IIP zn+G35eF{le)hAvynnug^GT}N zPl&&Wws*NZuIe{60=8-_^vd~hf0N7jnfTMoA=5gARAQvb8_QNlQtHWd>2gWi|Q)!=9_3n1Qw92&F5%4|F8M!LI}ip)&S2%qt}%P(gNSl9v1D8+zxH zR(s5+-fC^j^zo&fZ=QXIWWBfuE=w2BHluq>X_F|p`CF(sn?~R(g$dd#EF(&-%qX~i znnzLL{d%XKh&|3c2be#mC^iIE&$u%elxg_SAE!*%c*H~KX|Z3V9deWT=KUA>%I`JW z08aVTK~ib!`qS+OUv`wW;(QgwAV>gBZ!Guzgfqr~>lnY^5P_qMtJ87A_pDY0`~r=& z>dl-`u?d`?{pG(iy*bI{LZu>ueC{GvimE+Esy1x2W$?w?`^0|b1k}RW^6tnzcSF8<|+YZ8$}HIWXjkSaywn$b^Ar zusjyLL$_p=G;j?z@p8`_lkRFk5^f`?9%0Oxr69OF$kcv|dUAY7ZA&PPz>W{Ypr@$M zhf!+Nf2`3QOE)5eKFfM%n)E!jjv+-CH&pZJu3Wcnz_mc`fpk+9iAf=J1DcC zEsuk%d~ZA&Z*-aQ5(`7R4zSz2rtOy$f56eK{kW9>-H&wRt9|#WVcrw91fDgp2kp1w z=&;L|zkP;0=P~S&#=LRdhwjzwwY)X9 z$#0mlfF`M8csudg(5epPG(s|e6~lwrZa6>WIP2nQKjP^PO&^pyKafK<`Ls7aenqsm zBEDz$wqdsywZ6T0OA!;eMsD3}N!QS$lK3f_NG$KxF-Te+hsiQmznU5(x*S~)+%&b1P8Ij_5bi;=_W z9&Fza`mVfl1{0kjke&ueXDc874!|2fT@G*MnKeZ>4 zPL5IX?#T@4!27Hlf`yGvGdJv|GmKFg+WyynS%uj@%@}^oSM@-ZUBlzLU~S(dA?({i zvlWk{1R~AuaxTlT=UTHxC+TRR%{{?dlhVV~xqqs4g_m0%#)Ia!#w43gV>$tj{8q-1 z*LeOm+z!9TvpYP*SJB1ZWmzJJo-026LrPlpJ3D9#J*jX%JBLWOA3xdk=~nfB^T$B0 zlbH50;YN?330kZv&BLo#pk*>sb!Gexw8JXPa~a&#t4tlR3R?|(QmZOq{8?$D(q2b> z*Zew~fiYp7FTg2KMjr%ur?jpv*k^X4WkK^yom3R)2({~ib4laulkysXa77=Qd5s(G z{*{(~vRBs<#(M?YdlbyzdhvPuCYn|bGYo0H5l|_jykWQW+tsv=qF%o`tyU3)-{qwl#$C@qEsyQ~hRebe~GvF>wk=d0M~Wse1v^ zyCOfK7li?sR)KD}xDn45OBXZgtFZPU=H$^W-CrHkE=vQ~;j-#+!g` zI-g96KtfkhUq+#nL(jc)OuG7s33zI@Cs*lQVI8#B5iV+57O2uV7Je^;(E}zEXl9I1a;&G6(zAD*|aeomO77Uen_ZQZT;X7Tfvfu#) zOvVT%{%c-WbNS?kDpfdG^)uP%zNeXbiq$%9+4LpeDeK}olj^`<$RtVRg;`Hw)gG5f z;oz)ZbX3Li{yn_zS1oqnmkyZxY^Rb3UhZN+i)~&yIco9+0TphKrtO2OTF%Q|S_zr) zqxgVbQffFh1P@4hgk3rri?O=rtGZmpzKFV%|3zR?h}fT%n%***Ofu@MJd^_rA&M2w z=2Buq_702h2>4Te^L~U)tk7ysuQz$IQ3Us>A=d}<)=ptNQv+!WFXj24GaWUA4I-%>x zd9Fq^T8CkYppRPxqO=NP60etp#u^{d=oF<`(H+n!Uhh^to?PSsIS^dvwU_e9;v8^(DGAI+@z!5TrpluU(PtaeamH49g+sAYuVMmp-70=H>XB(z< zqeLev;Sk~!+)A!V4tAMRl2uD3J$}x6wWG+@toV zzit@B>1H^}r0JDYVCygAHymi)5E#rnni#%kHfA{Gv^TKB^{HD-%QlXJ;t%X`zaox6 zgwO+bwazxd;Ir8dN9Wmw=Buyi+jcZMzSPlkh5GsV6PE}y?mJt&w+s}YTs1UAXs?W# zL&i_45Dudt>Oj}Pep1woW_+;%Pk>~TI$fd5mRyXnl|2|@fl!8j#mX@)Rg%AiO2!KC z9<-MFcgY!!=lVBkzqML>>xMEFs@*n3ZW|R8wgdR*=w`0I!F7p;+Kc zn-uC3T7&zgxTAi#%;t}xjms{EAYywEr%uJp%J4&RZ>&B@(7#ImWOQ$iMEG9cP z%`W%ONQ&(=FoeUroweYIPBqHf&;m<=3$vU(jtQc(73C>hc*_uk2<4m35adq2AL2V) zruuc?I$O%6*)*o7rVc{+g7w!VdjCv-o$r%8Q@W=+lotcG&re1L+(}YFxp`JwM&h91W$ij2GF=N0jCC~2u>Y;9ca2Z=t zpksgbOz!EstiU-JZM8z@COIYA9g8eq;zf_rav3AzUI+PT?)*sLe@nKH!>Oxdp`p(b zP*ZKzrviS7N-Ih84w?}C1p;K8+y)svp9}T(Ia;FZc2cLUg+Wx6^ABlk^5oAeT;K3M zgY)fa0*Tht!jRYpYv8tv9-=m3C@9&xT_Gpjz8N<1&Dfbm}VdM9-I)u2Z zOWY3p>)xvRw=dONdQ5bW(&d|Ee<&GlRF$$3v*_`rhtI8=7{YCp*)MC-c`#?7Y2_iQ zVdf(8rD^x|g(5F`Fn{F*o#ow3K;XaryV>LC^kdsZfrdNSdv;KuU<+lJuFK#I%^=j(R0?7n?9VtGSS)S^?KHgEDdS2y_jm-Y{dlUc*_D!19m`uv=bOWC+m(tX9~ z0xIr%ha+Zj?*nKjOqnKfr*t6!GQ3)yBS_b29bO%`ddlH1k}{0cKuFeaia-1KCZtbraLD+kb#b;Fh(2-+94&8nYxY22iBBL( zdh@v^xx1_pmR>Tdq{y8;5X-t8Cxp_@SNR;a^8^^sMV|wYSS>vHS(sCgUkznF)#A5M-k>UX(M`zJxbKwtOD6a0|N2*-L$ zfj2^_)}{BdEB<*t<+9N94hvg=IP}BXt|~cR0WM|@d4FDUZRkMO`}tRkA$sn!Ki>k!h&J&OcYA&;g*U2P~%Zw^ulCZ`E- zfxEt4voZ%*=m(+G)0LjPxQjV;S-2eU>1g${cnmV+sE)9G!&{>;xo2;5boAC|n?%b$ z&h^VfL(8Q?>}DQxpxIba_;mDsSd&(GZ>91Lf*Bt)&P=ExkxtP}^<`eL?;H$YsuIe!1o0?0`9V?RvBQfAx$ zw{XcpP*}g87k$X9nxFZL3mi{DacA>V%hnD2v!ed{cj1!0N^Pe417Wu>RTT2myuZQ~ z{_Me>;0NpC24-WlQ}>PET<_9uGG9$#w0X*%llJ6~68pMIp8cTG2ii#IXr{}%1Bs0Y zLDSgUcmAWcp06ZES9Sihxrgq>TT=kK3o+Fi?EB3^J`?Z{Ui?|f6@AWEUa;uPr5!`` z{G@A=mp*8bex0{LJbkc>DOLNXV?sJ7HGtC^ou?%{USde@?L6KYvyW*FkN)em|HkPV z%=`JSn|SWL!w*Kv8{=GvzEpCdEAdV?%gSt~h&iib(C(bdYYA4S)#c(p zD)3`VvAZg|!T6qRTf>zq_9Pp65aw$IgIK$#H0H4`J0ZiOt0<7rC%GfQ0l^i@}G6eK+TWGzv zYi`YAKzZ#qS#xwDtbejEAsB4-y`l#9b}xwD|G!WiB9t<;`eAAbaG=nO$F?URlEv_k zUoGEetqAe#U)cFC6meTIRa7%+I~S$4%1Ujk$C3P1#e~V)EYUm^BD?$xR}+ zdOc6h*3?_>-E&fpJkqT`leJf9m@j@`VR13Ku~nlfvaCEUHvO8TLqV@zh{texN30}J ze}?hgDaj>OaG?LeI3`JDr6L?0yk%mt=n^GM67d;1I#9BY0_GD-9uoT)$?_r5R8&4} zV~pYK6;@ctlhJiu;GDV?y64>FettB?J>p7)C?}VEt8=NOlu+yiScLxyH((!c#|SS9 z=;5yEO-C-ygU=EbPtOOHJIOJtq(Znm0|iZbi2ttb0bjyn{nhjK90iG(aTF@ATi3cs z_`{!X4wI8-Aq11$aUM3XW7{(;%5vxNF|}Ou6d#S(iEG7Uig<=dL=QvTc7LG!B>{?m zi=bf-cTm>@m2eYMqzU1n6+la{^v@vqib@2iu`0Q7Cv4&1hSLwnA^BhV3LUE7jZeey z2P|^l?>IL-)xS#yhrXX5%mq<|3U#e9w-*1TqZ-NCWe?c*MzZ!Nt<=5TXkwF&cAh6a zEC9BXY1Krv3Qe@QC|STkQJZ2&khyk7~gOdg_@D zp9DVRz6!nG5BiZSzaZBof<|HI`2R7UF+Q^<>^kVb5~Hlli4lU1!}2PSbMshERj(?- z*0w4_#%U{F&gR{57<7?`=k|bV*?`j8yh_RL$_Qb$@=VgH@ada(?*3Ln`=6)xMtbwu zgOd047lK_k;u1EZd#~-Nu)%vh%nT>u!BO>Z!)8;&77TtvEw&o)n<)TYTMwT$dh3%1 zliJqYbgT(fqN5EdtngorziyTjuerdgF!>|FzuoWcm+*; z^oy3iKuB2ngF@DUul@AcZ~62;9^DR^p*NH9*&MK~u?b%QN$VaTPFokY*W6RgSbGdy z?rPtdkaXU{JqFs}_wm&|)!awyKpJ?aM`k|6M^%Dnrry)}cAg&1xvNC`7Od{Q(>nIO z*gR0LQL;INd(+5L#P0>xQsX{g(3*V#(TE#pgU&~Y%z9r7NVs>}A_B+YBo#grdwT*AyA*+xc<%W#(+wNdCgk7_{tZByQ z1#$XF`8iBP%kuVg=-G4`RYD$j>CVO6;{?9Kg^RShV9%EVFL=$RpzVrCyBDrl67OCU z%=d8F)=9H!7to7Sj_&)8(!godnTK3qoXxi33i^rKn%C8aMZ05^Hf9Abaq4|=p-Zx1 zE45`bB1LgfFPAPe94&w9j9}Sa?u!=A;kK2i1HXyLT5H5&ADp2>`G2q(d)?%K+OgO> zQ`d&whO^|p>>g`<8m6w3jB7}U{RtZD2hnTyU(Jp&&DLM~~n1Fbx-xgrkgaY#}%4(a%`a5fVRLQRDLr%JYTz~+jEmQN$Dyyg_ce7$tS)rEl!bL z2AL$35^aM>L$9&wi3xqwvpA(y+&g-7iP2_QQ9-Sge&{9rpE3ncROtR~+);GNUp&&1 zocdb1<`;M?{a&io`k_iC^tA*5KN;brSyku-)N_QY4!gU!pKQ4PX?esF`8D2NcBWLU zJ0m>B6%7V+TPJ)6Tc~@IWi<`RQI8R7>VTLU=OwXYQ_oM?-=G4`}r{;K~JSW9JfwtQcC)i)%r( zBjK;wX2}I_!#w#IeY7E{24;;b*%%1>njQOvF$gn=ShMc=V)K*DlI8b_^V~|l^uKOo z-^!S(z%`GJZtV~!UTe|7LLhfvi2|=PkV%>&pp5}L)-WNNPW*v34L7KDv$&_?4-%V$klN1Ze;WDE*K_?h3vqj@whMPB9kO=lUi^Jc8wrT0(dUE4K zovvs2qmcet?)2o*5w;Tfi0%xeff(Px_BhcPN&Ziug)C8%ZPlxD&ZxuM*z#&+fTO!D zlIh&fK$2%^1>^crRvC;<(K{44y#+5xu1Ns`DlBljnhl8H@&r3ECJ7#jtySs$mEsOHi z^Fd3#suV3_b3=!1|0Ku{&)=}XHgd=8+LW*>`@9c1R^MP4uDug8&%kJNxpCIRzKK#N7}44EIKuKsR<}z=quibDp=?+Z z>Idq@zgJehQ{%FFX{Y{=EY9a3%YSrjOjz?!LfJ2LgJCDnu%Vq^t@}QaNFng4pthc( ztqwb^?op8nco8#G>Mr2xk{g7o#IAig7kBqYsi}X!hz)f5J;6|ZD46~J0~*N9J2YVg zFOy(cKNEq*IcQub9SYiaeK`enH3NJWR> z=Ixq>nd(c0KbIEHpuOF%u3~1KuYlGLqho)9{E7X9;2W5t8$1m85I0AU$skyqYW&=m zkwb9jZ`H@gBv5R2bV`+Odg=NIs^^18+0*hrB8?6~eE1y^ z0k1)t<(3xDSN4@jI*N>o1M?*NzH4b6HJewK3f$KXu$+d-LG8e^!?*FXB{RO2ssm}p zKA2gJ%xg9lf^`*SKcE_7{R}k_x9S>5e3g(a7ql2?Dxtd0g-#6G82Fk9!sh{cKrQ1u z{y%+<7$xHEwU2QeVr#}pI}D{ga;@C^-X+NjLUAEmXaK;&7{QP_v(av7m=f4s8KqD_ z9AX?0mSI}_*DGT_{<$)b{Gc(`9STi(#2f8@hPQh9%>;UoAgvjbZXfQ892B+6QvFDC z^5(Gq-}2eKdvJl)TfuQsZi-t@06Lm(H^U#FZSb@A zd8n*}k`x1E3wk+DmrHC|jT=^v*$R#pB>M_52e?CkXwA+RjYFa zlxyEftjUOJ=&vxUXly-M-#u(x3h12h<2ARyM#!o+4a&apAo5p1k4Jsh1Jc zXrqt(<&kF|G!J{^mht?F51Hg|7^hvG+m*XUXukoHxa^S8$19~MIr1}Wj82V#UqGHe z%WK|5e*LZV8UM{G<+QyE@sD3FYVC)Y#jUl0H$o;P?(4a>``f?*uN_t7zgVA+52fWw zN~m_gL9TvmzPT5z_uw~%*R|s2(KiR3V*WLV=dOOm(iSQOk8=g{Xly3IMn`=>k9$4n zUqriJTQlqW1~{7&9I$i**Q#P+mI`4C#-j8s#tXv!j~qK$}3Q~sH&E6IJv3V4kG+aVj*bm`PH>zAcXlZ$c30Va17FEhvhZlP&nj3| zw~!&I#C75=f_+RL)HYNt%KzAXZ$0>469kf%r!$Y0Pt5_$e`%si%HcRmeG~FgW8{tI zZ@hWjTArbXULw6YJDA=cz z5?-AfnV$7#oJ3v0a%WK#LCwM)_-pVL>@%_-?_%M@!V1Ct1xqVy$SU(ZZpfQMNuC27 z+{p>-VbW+T4Gq!8|M}fWT>N_3!3N2@HTz=Rlr{Vw63yW@`)%-eKnVWYoLcxXLAb!7 zQ3ccOHkhzW;MrlI4n7R_j}0V@y4OnPs=LnO5No<2%zWvISa`KOdWr1zNJ#zFzzxg0 z0_idYhMlJ_T&9|)@G5`D_~j5yB(Ox|H~ZFf3+3A*8=q#&jki_gbHBL4@=@nG%P~!G zdp`@lsQowTS_kD>P-WrAf|F{74#+{v)$%GEzd5(S&_~m~B@M`^X2h#_y`53bizQ*5 z#fW6etRG{W$A7O{rkD!QECp*kE7t+36L zZhi!Nly=tD)!haj|4H$!)rcON!MwSBT!*G7iB1wi<2gxr!Ey<78AVr%L=ZI0kFV>Y zK7PTOzkceb&u?3tDat_W=&iY0e>*wi_RoG=h-Z}yL-8`7``<(tuUXZD6IK7v3Dzi$@w%ZJ7Ms)M|XM`l_usyRP`{Yee4I zz}9r}%kL{yd5z-}26GZNlkzeXl3+Iiwz#+GiT=7O0&HkP(O&DM`Wclm_Pf{cQ} zTi64)?su$2TY7H%XC)wD+HWOgS^waYa-MzC1SLq3J2_9T6%Kx7n;`}-2V&e7H+Ywn zULRYeJ}%OBNGIbXX$f{2_+E9wY&QF9HOGOdBrpQj|IHaHmWy#P2EI?IDD)h!Ni7oY zv|m=u!8|U6yw=k8-*5xDJ3=)}I!8{mN6FI9*w>XiTU|9(iH~LAM1_Ub{;NAAC5yTSK3>ZX z8P_hUy7XfjETq=qRbMD@jo&#Y($fe4XX7F!cDit~i?cXIJ0gc)3bp@K*5X4eQHsA5 zjQ@)%_*o4MQrYYe^v zc*=V)<9u*HKrZo}@OB0q%oF5wtGpkA_JWnu7f%*NCw6F8-`#I3;IHe_eCUFgZdTY!tPx>iKq zOg%y%@WaF{vxYaw0uT19s%eX6IuDaaiHb$&jEWK%Urw3nvu_%z>VCMDXlLLUq<=%cF zWa3XJ6IL%x|JgZ&P0o({`(@c>+drQZ@$T$|dmMy6@R=rzOG5CFz~6Uzm0JVfz_-kg zs{@JG1zNUdv{Xy>dl?`@=3_XTF7P=K3=R#;VvsjKZTsof@ww{sjfe3~=dXsOORvzh zh7qQcmv7&WL|@9*zN9V@pxbplt@{Vv`#%qpX`Gy=k-qf*^k?aHr#W3N-M1dk>Q(@H z->9z|e~|?J;3RQJ_1T+D)4L~556rz*n{DiF#T)ovMbvHvG$&SZs&XeKTLDy${yZMF z254AhpDgWu3J{=)1=tNI<6Um!T!<<5fq2ea@MA;kpRq<|VW1OQrt5Ws7;PDhlm0;p6Y|5fL=Av9xqR7er zQJg04T=ZiBDS4(s+`5Y_rmXYm zMTg6wz8weg33aoc&CEyY6^;_Pyjhu=5anNjDgfkXj?1fuirLu7~aTI0lZ& z<>-Yj;iYlRcLltibh{C#_LSbOwoSF5kthj*XibKVAoJ>E+H*l|NU#r>eQPjH8f6fY zy%Qf?Ie1y7cHG)r;`~7p(3vdNnx@oncgVu2n6t2ne0c05RnkRQbV4h= zPUAi(C~0-GEZHb}srGgvi4<`Yd^iT%Keu6kAWMz4sJo)dJ|TaCW?za7X;-m~-uwAqP0#k$usJ;dqmmY_zNFk`$V2RVmXa^T z(^~u5&by$=M0ZN&wMH48VyTYfnRs>DF}D=!i--qI3}(BBuC|y2AU|=hrO`{qjfSzo@!EE z&C(dW2Es_yto;?2J4sh<#Y7}2={Z?#qzI^XC8)VV+et#_58Kcnvh@?xoSlE$Ya4R} zcb+q+w(%T#TU9-8b&?M@!7^W2)zc-AKiT2`-`ag$_M`j4yTJE4$!kwQC(e$nUZv1l zbjiUZ2JY2bo_ZpOi7RZlJ4^8dyerRl#NFX zZZ#+Y>Jy?Gv1=dQDN-)Kd~m&5Blp^q8^fwRuL$R_CBFi-9k!%XpEn}g`rA6L`i> zb$E)~v@aWVoac>%B~cd|$5@4eQamBC-12}+mc-bL$#gH^(Hj;`c}#4b8Fc-fI7tSQHN z!E@3dU18SN+3Nx}CIWs3!}kQD8}`<JoFGAeST}z1uD6g1~PF7Olh^N8;YewbaBPFpY zvA02gV1L|3b;hTQHC=ib7R8NZ%o6_{zl?owHO8`D6DqqIpuwB}=V<$6A20V7_u;Z&j6a*zV3;8T{c3ZxqrOmUaLi?7Ib=W3%yx-H5`%zN z9?6nY|DsrLns#^RF(j<@y&CJ66xu4uZ+SP=Xt}+AQqdiwsI{EeJewiIzMQ?6XDaXq zHelb-wo?&+oa)*RaE!E)6ja9R$&pGga-?!pHl~7pN38$=HNQowuD|Rogkclao&Wdj(XQO7$f)MZQ>~6J?E*J-1KvE(L-OP9Y z_lOW&l5o%?^%D%dGoX}1diL>Ha=|i9@>XKEoPbU~xCvE<$0MW14(3}F#!%oee6EUoB4wo#mb8g%zY{OA!j8pJ3Y*JFM2TO)afPqH$u|`hMwxwnuubSa%J58qotPW$hLNxqJV;rsy28>HU10cfSI;Q$vM&ZTn9xGZwIQpRh|)REe9j1dFDZG zt~IdI>mX>zbVjD$-3&Xhzcw*WVFV;>=D}?+mL0G(sqUk8`1=Hc&BWY3F&(b}dsY&n z@;>hM<3dVkWzm<6r4`q$S5!_-uzVJE&SVZs03&oI!qKCWBQN%YymZVngmTwUAE4!O zQ`N0ZLV~tWT#IiqyYcc?cHUBXtB~#yV=s(!ztI^MOgpIC|AL$i?0+EOWTzCWUy3o} zu%9_^bRbY7NK(mebYQ^2DjiW`dgWJRP>drxB<0KoXt?z7jaKz&rMU+qMd5e>8C70% zhZ*g6rTXIqS{@f6l~CP4^MZYLTea)Sz}D?-57iHYe60*1me=-8GA#ek0(=j2jC-Mi zgY_11m=%~vODJkEE5EwnLxakz|DjF4SF&f6n1Mzt(%&9B)rYC9-@k?Ac!qls5ydeI zT~M8eRo1F4VFI!V)ai#<$-nmB<+*EDRZc!eijIK?nexZkgeKm_%cvFkvLn6-5Ax@~ zOx}bOe7t!ZoYfxG*?-dhs_nkq=dboBydwBYdQ7W#qB5^jnSNR_0OGjg0f7b2zAYf7 zKIUZ#aZffKM&~F^adU9X&vtX0!4)fS-e%dJZ5_Rx+7Rg~wf)t3k>K`)MRuFBY+=Ip;!JiyMTC)08yV)@7^H(FA&6i#1QcK{EC7LYU@ zLGFeEu6T4H0ES(Lh2X|Y*=KhKXvbx5FHWY5_gE~bTb!0nQbTJd>fV_L3Mg4O*IxeM z7EZ(Cy?Fd!CMpE;GXZe3L|Nl6bj@=9wf@CjSI-)nrHel*1w>2SJ%Gsf>D7}(Zmn&{^T@Ba z*xxvkc*-o;0o=F^(auWZ2tqRL2dk=4yAFwixDjq4d*Tc-#3!U7X854OKGWSsEG@Ja z>pnowwiNYmG@SiS%Fm$7u8KG1jxv$gnl@sq@V^S|rkxvLJ8B$_)_vKUWa3^O$1;@O}LZ;*4& z$3m^vdcJd^iODPZ{ziuDbu*4N1;}VNl`kxrnjxB|q)R~aoiI&2r^6wn>cI0DSYvAh zAllR=N_wv=pJYfDSqpx6rQ12UZz5Yxk*lpe{Ro}C6G*7CAt@1V8F<;u?Ud)m3JzB> zNJOj+g$zcp8s!46gJxP1CC=9Pz4R4dRuxjhH4?wOlU2;TRcMO4H@yNv%1$-@NlweC za168280r~brSIuJbS_ymH@@=m@^G3!&v%h0>FBLHKW}d`nH_w4jhz!4_x)_o;B=g) zWCr(sT7-?e^t8xiTF&oD9P_7Hwt}S*UbyS%yO)@)>L>5bJodO5v4x|*uXrLWp;GBf zOj4w7#Mb?}d&9-pr_MYaBmEwP*7K~58xY2|wi-uAN8}mYodT!Vpi8Y!lf)@8!+Woc zOZE~kI_}xY%(eE0m3d!|fXo}cl>(MhC#clJ*xV>f7AdtTHk39C+gXR%CAp1p<&LA1 z9r0$l5KmJDnCkL1cXqflk8v8B??eV|CROBGuz~#M^nU=#KsCRN$>G2#CjzgY!KaN3 z^f@MTQ*T`3cxEp8n}d2zi=9aHoJ-ELBYYc6F^;)P4)H@?#)5ryWQ3;rcGjKoPe0Cd zCLuIeKN7;xWOlbQq89V97Q7vjwGqHg7g%Y^F>Z&;!2d294%H zNA7*cj?M~J=4Cz>k@SiurNxC!5_;o{*@QX4kolS?tV)O_A(9Umc9@HKln9e6`-Nlt zX#@AhRzCQF570rMYV_uXx)z8l247qly$l@G0aYIADAsqZ#_+ukoj9NN~# zd3#;mTEEiRUa#$nclbSQuGRq-U_x%d_V{=hfCc!J%gHT#iYe}woAU$g7+%E&zCipd z7eGsY1&)n@CY*v5Zb}7K7LnzE{=NV&UDIj_TmVV9F#=V;(k+=z|uT;ezut zSI^X2n4u4o#xx#&N}}<^_>E-xIp9~w5@7?!xB$*OitI$4Kp`-LPoBDG_***^! zC5~$%8SVAFCcf%xzomNx3(xK&n?M9lPcQ*9GYK3zgadd#8;Ok9?O-k2fC<<1P4{#y z!Gae!%a-_lm_f%To9i|t*$14lJ$}!paEdzpDr1~{z)cZ!`Ofalz(&ay%@zLnT{6tS z^M`x|TOwogBqwvfJvPo2dLSdY5u4No4K`;O{#fBN*p;?)mEX>;8$%!Qp|7c+m%pEc zMj5_=e6vON=x8Ch+QU^gu|DfMTQtnp9<#L;mz`JJ+>U+K_;W5Nihlc0I{9#|tiEC$ z%XNOC#ar=3zxsFHlRMORzn-^!!cg=sVrtiOOMgpu?SsE{p_#lVE)`hg?_mSB`j+Z9-DL*83Yu=j~id}88S9>b@X53psl6`#2Kz`!$Y)yr%62iJUvGyE!p zKRn;uG6YF3FAaIIJ-&~PXVW&<SzC@a8oaO3B)R*wC4r`ZnP3~v8&as@gJbe{UD=&B|ky{hG)w!aWJZ*(RIAj|Oo9o}(vOGA7Kpwus1h&9(ni2}_)@zIcFX-$j-{!Im>; zf|fb9kd>^N2RdkQJkFd1xv&Y&NJ--;(0W{|qVKJQ*gt9HsiB7|CK~^0(Wq;Wl`*Y}L(J5%m2uDVEG;i1RM<+07 z1BwpJk@y8tZONOiUGqiy*eK8+W?)zlFki39!8ZB=kom)#c5q6Lf(uNc2_NJJ4`>?8 zZu9bgIFkwXr*C~@*k21edSqAn8VgUo(pr!=wr7%m`ugG*zc}Y<9^NEi&*lZ6?1PW~ zo!|ML88GQsU-lh+xbo=u|E3OLiM8-(CHd#;LJydcAq9vE?AsfvqXG?3t~@It=k)bPYeS z$^P49f-m@Jcc75Ab!J6Ki+re@>g4K zirl9>$B&@RM5N6Y^X5kscHx@8RG)2%qvWQKjaO~Fl|T-j-MV#a+9!X_7TG8p=3CU! zm(s#iA2O#eI&e?7{Eh_plb`(L^f&190sIp`qYVF+EpF|RO|H4Z*4AeKec3)cU~N2K z?Fl{iTN}(4SDW1CDTdmPb70__3;otyptusvmEXq23qR{vW6Nq&`fu-#u~M63=e5rD zmfrS0`n7eAPcg2|Rs0{~bsME}Yx?&+ZN8i>!-Y6kuHYIrwSy&?f}j3vVDX9VY75Kg z!>AY_c4(tN9J6aSAnx%c{6_f~y2`sZ<41#593pV`*@4{qn(9Kl~&Wnce!V9x41rY=#0bUCYL5L#S!Q%)Cl41lRAa+ftz)Yx|t$WX- zS3)cKp$v&JP%9}-UxuZveieO;Z=7~jGl2V)c@8io=LFQNliZg4t`1@)f6AfUCkwM# zd<3YR=5_~B{d7e8KE_`A?jH@N$9LV_cnwwXB3sUfj>wYCI1zHAlXh+Bln&^qwFOyJ>yg)3i=wGgCQGp=0ISqd9(mQkAqgCr>`;4l&HZY+>=ML7|q$y zoJarGg?z}C49FrIA`80kOdIoI3uLDqemT4rxUR{Ntng7X;;c^zDgMk04fM>-n0Red z$0Ei~oHLo}qa9u26IPVBPA@pa;cPd`*0$FA@SSaK69V@wMhn2xMhDTcYTp%DZH_J0 z-~#{Vrp`Qa?#^_a&IC^LCoj{YH*NHx2lH1S7W9J+ZL$d%a2T^sIN(bgx;f^LhQ8*z z)#IPGPu)$d4;dQ=Ep|Xx$v$682im}aw-qdkC93$=HXFdRIYqaP8TDwGv-ugzI2PJo zwKq4LE81nRc*$3wsl58qOTbWq+rLBb$x4YRU2X9&`<^IUAGZ2I*U<|%SDhbZ+!O5F z=<0hzhXXFVX*$yvJ<&HihebN0+Y-t)U$m$9+hb!7Ui5!% z`$FGXux^9H;>-2R`*wrawA-6n#_R3735|K16FIPd@-p}0rFpgx_l$h_60(xl^tP7` z8uFE}M+;rDrYG0>uvzg!8}>-{`Wb^?H?DfVp6tn0e|^ap56bZ44O#;VraRZ zbGdPu~FCM73503?3B+fua*n88J%q9gZW9c=}2x#m*j~4^y!ZGQMqctd10DE2=lXb z3L>Zy8baX!CFrgJI|og94#LbaG6ssIJbm;9c0xv5V%8@(6pxI zBPE%00r(e&qi6w9f?%;mr{uOK#$?IS&{eXfkCIcmBi7UU#Gf0Nn zt6wnDf(UKFl*4o|T=eigL9mqheSy&)&4Mqw=$VUt_;JsewNW4cEf(6mfTMVYL$r+V z+8hm!53;j}AScgC?mROdIVql-gL07f@;?`0Qz-zD2YKS7ABrfM(Z(U+z!QGZS4Te* z5}$D5g^jd`Ha82DoTI+xK@R#`P|}A|@?*>rA8iFBZOIQk^4{CDWH%d`G)CEC&waf`wmKn_?Q-%mbl<_R?PhbDOoK;~1TfOj-u4StQK-PzgM z`~(Kx+DJl!|21dxhXMFTqm2bLv_ao9N1GAoqPH$Wrca&jboVLHUZE;VawWI@xLJN` z)&IWBByn8{ODl%f>-^uT^S0l0<2?({lgWWs_)t8c8(7QN(k&dM=XLW1CbVr)NcV66 zTd@*MzWMBST}fxh&J%Xy*q*m_>32)xy0Nc%j@CBc**T|O zuXwU}GxzOA=9*7L=R%Hg#o*h%HLZSo-jX^tPI0aUC!Ukz?9cuj><#{4LA)xi!4=HO z3B)FC;maAW-~{H_DvZOH`*IwZ4DbAbdVRdD1E1v)`td0?>R}o$4&NbHmQOg-_hf&6 z%r;N8>_6cwUl8BPgN^ZT=46iisW*E(BMWloL)o5do79TAlaoI3gyJ&4r=CpNavS_) z=@}YgJRd=}#+^C(prZ_dt$2Q_B6}QzU$@{4AOo&*r)2_{aB_ka2K)pH;C4I!wdBro z3rt15M2vH$Ac7{~=w(R#c#WMs3ZY!jGLDP}ZO_n>R9jTcg~^^z&m?#Q@!O<$w%M1} z@K@tV(K$6VwA~@$dgD1o_d)7c=bZDz*VdUgmzDqX8De_>>LD2dJLBWpo{C8)Nj zLTCRAuVM0#_%@z#@Phu?+1cb3Ch?ka=TzcPUrvUjm24SLG7g($!=aEBTIh#acvsIk z8592;5sX{3m~XGA!n<*%?d*0gr#$hXsMoh&%7tNd92X~r9vzv7ah*Na4&U@dhRMzx z(Z*Br#t;70AQc$QUmZWx+5O_Rv+vid(QRytjuI&a$_ zAK}@p%?}=M1RJpCOjjkMd=`AN4cOEsY{Ck^3{TGdP_Nz5wf5-f%ir*)`k>+Lxp)mb zY|K46wTCeY8w@Jr4XKC0!Q;}>R%WXW&N0SY1~Y-cuQ`yDIq~7i&~q|oAMzKno4Lj) z<|~f0@MLFXsx3QZJ3jr?hs@}SpK;IjOLnzYXPlB#^3G4ONB)d`dK0Db$D2%iV{aVv z)rEcHdHfrC=AHBp4{Whm9uC?0+1c5whhG?SFXq9PSg1};QBI+y99&I4aV z@G~g_I)LX;2~SXxdYSyd48)f|dOAoYL&@Q9e3^orCU7L7a0*mN83$ z83iN2)0%*LJ_Fr@zfYcH$bnL9&a7maIIcp(`s|dWxu1ID3TCFF6~@l%QU+ zaceA?J;SqkSp-;cav18>k%wZ=;T>INe44deWsd7!sg+dV%Yuc|^J*k~(+_*l*HJ=g z90i|vW{>)|pwLeH7F2j-TXcqR^2H~)l|1T8256I$cI4vP;o39fDL!4EwskqdsBX4f z%8GT>aGYI*>(zmF-D0zi9(@bUcSob$tKxfG$G62IosfgzNj5Mc@RErImS>ZRaW)Uh zU+u`8%-Rtq7ub||YY!8!&u^6k3NCQ!Il1a1(RS~9kgz5|jlt%)YZ*WGGW{?<;Ds&< zKIqW1gAV(|Lp>e}T6`?r(GjfXZ_&gTEP9Ryb3x0lb>Ej)XG~}K&<=gU)g16|zB3Sx zf__*S^Ce86q>B!V&#v=Bv+o0z1hxupty^ht+ive4aOfM|ym=qwLQinONAX8=1eXe2 z&^h~1e7di#cuA)gLF|LyaAr5K4F~Y-)lm9}eRSN5_x!6wHO%UVCT#HE{Oe3q_o5u% zWXTr93BJU9$dpXjmwJV5Szt?2*`jN*WOvyt*^>|butEL#7;mJg z=Zihd_KJu6y0OvilPAx#C0BImS{*vd7#AK|Sgy86@sG0L%vaB0=3wV#i^Z)?uI;yd zH>4i=7TuM{>*7lToywg~F|xLAE^FPE-uC_~y6eVj{Hqfmc8S}*w|I4Xyaq3x@y+Ez z;fWpEz!t;c7G~fDrr2wnQEZr>5Ua}P^i`*@b3Oo;K?@Df*#jFezSqU&@9Z57WiY?m z`IFN5UK$U6@Qt#x)<$ z>|~oer(~|=L4IQg`e1W?+C`q^ua7U4n=_fCr4PpyzuK`AW0%n2N5UgWBx|q^~oq-MK?A!=ou}T zpffs#6*z#yK5fSbc{}@_=C+JYi0NC$>xPq$7OwDvA2z4(bA8%`r-CD$DFPi^@k|~6 zhbK6oTeO@lG!=R`RyZ|(_bqVsmpo6thiuK=oE_-Gfij-a=XTM#U2x8}`?C7Owf?H> zV|})Ma7+JKpR2}rR-esz(w7T*q91y7&CkIFtimV#!K=bP`t*YCEr?)8J32=*yK<)U zd^;QAC)ts963%Q0Z8+?^@!BXO7T;8zOy4rfv_-#FK~7}IW=cN!QFCH@;tT&No{$%N za%TIU>qGYXqvcF?bV1hS%vVgg3|~W65?N!ibGk4ddVHGiR?{20WY4bAuzAczl`+mS zTU~7rt5fHZhpe4kP-hSj{HL~c#<`~{bWzBxBoY)ZB-0~nSKqWAN%01^e z1vF$+l1#{gnIx#6VFyyr0TZA(UrOLO^#x?BeY89$cnWt<$rP(k38Ask>w63-E?Um` z7_hnu{N}x#`_^%pdTow5iuVE%E05djm8YIvnA4EM%nr#z;3HE9d2$*Yl*JS0A&5HD z2P4y-%*mQg7+Rmk6^u*J>6~$COW)d~rJ$u`;3YmKHt7!yhL_QYsWG9Wvd4pYp_k(` zrn&i*Qi~>Ilt93R>x|pD9Ep4Nu!l!;f^qfg!W+kwvzKh>qbM#whfg>qHHtR+ODK$GE_g(*-EYoIJ$|j}WOM)kAOJ~3K~y{=S2m%23tBeWVgWtB zR!djx6YuOS*_wj|7`YTg$jjmezd!n;KRVkAWX5TcsttV{Rm7alg>npw$81Zd>LXwX z$BJVDW6LdW{C}1ih?5C@NXp0|U(+TDzXg+IN-nTsUIGMN*=(RobCguVANg9Kp`~6M z&$K7gbb=;X!i|CtatwE2crZGjuVqYfCb>3H@FNJp8w^?KO6tvt&Ls8lLjP^t(7OaT zpK2`Ec-K#0b8pV<7+;EKFn|`C=3xHh)TWL36bL1~p5>>Fvo9u73oDN3-OsctC9Zi!8oMJ=%vvboXg^csPcOqjP&q>bREnu*Jhyhs>WHlOcb? z&d91bW1+{s$%-Gy)>|l&nSScUi*gxs>Bq0m7MsY_bNWD!?#Ngj+U}j%BKt*yk9S|3 zB%}RzWLNoSkK%tedQ9#QBjRK7yx+Qq8Sj4j7=If#^sD|9jry$T+O9M`-`1a^c~$*N zN4u40*A|fo|G8BWoLbFl>tSeBC) zbI^0Zrsw*?qC*+KLOsuS-+ueR@2uF#f5qj#`iY)aoL|8F;QL+v(tLZ1#~j(V!e_Co z+vAf@b>u(yH4)xUG5;)l8^C?Xs~7aLf@F^(?hw%VEULn z8RET`<($`}mdo4i=M*m*#D2jEV1y@-5Ne4xr4X*9Mi6o>p#ffP2-Gtm)vr%*I8FbY z+G2zfI9~sbfpT3NCxd8LR$EFc2`s^62q`mz)VH5Nen4TR=&kcQ1%L-6|47ZRD0w$f)uTQCs zpJD0KV$Zo9I=Yt}3$&c1<3M;Xy79@-yvj-FZ#+qrI(_j~LJ(gtf}XL>&3w#7Uv;kW z$N{t%3vV2YaSHzW;#E5ihJ4`D!jpq119R7Y9=q>oOaYA~Y@Us!E$7pMg8WR{u^KBmk*iq8@!DY2DUm< zukMu2kBH-etDYq72WI9y>Ts~R{2$%&HD_mM6KnJbcd(ewV3^M7lV14=n-yqiPp@LN zxXpjU89c$5dv7`L4~?mh=j;jQU`HEvWGv5(-`glxylu1#8t;+tmSI-^qI%jQ{@HlG zgPn(cGG<$1pBPD=*$Fw3jsE09eq^8z{gA8YXrbYn-LdQRlrG$hBVYQ`m!{3?V;uh4 zfj_YfU4BB@$HY^%m>s^~?eUa9I90#E;pk#@igp~w`d?MQ(!K5)on1n6aj}{IJOmE0 ziLLea2}~*cGkmbSY_$BVg^+vK`okC8!8TfaggA#jtif*^-Q`QLtS{`N(<}D;2-`~xwbe#&ESdZ8hd(?MEZ?m|hj9T7 z+vPkdx@x}LXF2affZsNF5AN@Whhxq#*6t1P?lSUGLpLQCj7s3k5I7n-qdWgImE1iO zNa?{shf%c4O4f|kLXr{rL<~02VNBZ6A)UeqS`61&8@u89GGt>gOrP+;gZ3FDy>3h2 zfi#}Nu#JZ&bI>2A@Qq%ZA)djEb}%VvkZ6;IIy8)HOl`?4TzT&BsTZf9E#5f`GQ&R{ zsy9dDD#j!8LF+J)79SD@W6%S6b7ICouVRi4GGZIf`k15d2pR_+{p_5($Abkh{v1yJHw7o2(?@a^IAM`I^oK!uBy&0?Yu9Kx(>)p%a_F}>C2KlFPv9q0_vA|E z$I76+Q}o_v;*aktpy3fV@Mf&WD=^WCakZzTeoY#mbWSFC&?cXZUvqGe4x0E2@A&|8 zM+XgUTa38Jk21c4y6UGX9;-Vx{RgQ#hKpmEdJvk=QrmT|+lA7cM~feR&t`;snCJU? zC7T{$Md6qD6EWE4BE7Ty@SQ&m`)~-4?5SU_M9XtHgeyr}|5Aw`4Qu?XK(xi-%56UGOE2X*rl=6 z+dv>^_UK&BgGYXdf9iUivlCUTTvz*@wzFW!r{ZzZ^wSv`%66Me_;s5 zU_?H}#^uH^1uJj@FP^~^+&NqH^oq9r{y(#4Fe+B?AMjnCgjVCA5C6urF%752UGs(U z|GAs%CEjmB#jw#~r8|GgHj8Cs#s1_9VmSME&&K4f?AM!Pa$Ccbw@5Q3Qk$b<)^ zfb6~`mGXd4GVi%xMg77TzHr!?0cv0cY=X}y^r1`&3G|Yv76bw#1p`3;-wOCCxg;Mi z6GR;G)$fxZ4cuEnEcd4z&lO$X^G650jgcq6ciwvI@Ew3VL*_tDJ`Rf|`e7){kPJDM zv$5c31QvvzxtE-9c7iNDyY{@Fir2oKZTfA;mt&HIxaZXLZE;EOik*qnO!_{b-u0p9>;--sM>~Az zcWZnS^4q`t+w+-m^)oMaU`#e@v7jv)_(oTqLN@tu_2{{04``W(IiYuZd=ic~V=Mm6 z(uuO_>``%XVugk#t^3AYUEE3Zc`2xF!vlgZ> z!tYxs%1hM47kh_Gxe;8W;VfpbX;>>}XfJ0%OP%pQ{_&5`xM)1Fu~+BsUe39*y{l~S zaf5Fi>%zD#aAL-w zGkscQp+U#`YeRPud2P_(7$j7yf@a+)_;YZm1%4PXH)Eq~OjtAr3ljK2n{#$AF@st2 z(FcDe4UFHRZQtk9PX87z`Wgq{IVsLZdwt1E88&iQalEo$e6Sn+ER5}{nJ+%^$Ywmp z6FTb12iE%$95x|g;*^oWkL{)#clA8$EZ3k`Z=TNcyC#EW_ANB?JMXV3k) zw+D8gY+dIN=U7jwj5!@}U4qPMTZqFH449iEe_&3624_!)<^;Ryv~OWZ4}1-IHupZ+ zAX9!zee&*8oB|fvqG2Hm3)&w`4D+opj7R*@J6_l#9*sc{1vmVfpYic%9Ge`ltgU;` z(;Zr2$vEU;9OId{YuIp)9{oG~(lcD@L%y!f!!!M68GL=OJVgl%{3>*wub>|~=L6`8 z?qQJMfL;DApQJCF`OIfNGxf}m=!=#EhG2t#qkH|8Fzq=!@sH|YP#bt*Tk1BaxFX^I#3w#+s6$)3%FFwhaz3N)UA^BVKG3TXjj93_yTCqPmzo&;6&+kG9txe4HZs^A#1?zQ6S zIDnsAEhGiA0wOswn5paGK8+Vbm(9l4hHBM9XaR~4Q=Uz{y8anp*v&1kYKDY zytZk!B2}%f!)C93=>-gZjcd^=h#u=n5LoMV5lJUt1}4~#kJkWS&19$nKNOh_+4I-=a{kHJAjBhm_$l=IKA3*) z$v9h0u6!{*_4{7=&qo4q1Y>N>b)UrZ$!rzA*gpKhC!DZZ8x}Cjf5Q-;06*@F4=^nL z!y{X^@hoqHvElyTR&i^XTM?-Nda=nHK!lN%`X#Mkl(p3?s=Ml@hW(HAWN)N9u0!BW5E3O{%%xTEVA zUB|A}g{a!U=I|W9c*Ku>X!<@|Nize7BUsFsjj1oJ<^(uVZPmH%nR&E{!6BIgnUSZy zcwU3PHh5|d+Nc{7IR7&0c&=zSak@XFi3jo{BlBuO%dxRPbqXGgTTp2n^c*XHu3MO* zt&jHR<}f~)D4w&WbW3&;Cv60`UT2<-&&z6KTYK9yeWcq1?H6BtmGBOm5#ccE_%}y7 zC;x3BBUmL*$uoU9>q9>39fGjAqt9p23q0qm=m#eB(MD;bLR;g|)AFN1hdB(s4qw)# z+k%nBAf0)=PQj-HA*`93I(nivyx`kC9`T%?R8ObcIZL4N4?p_#z2FuoaF0H|(c-ts zrXQ1%__p9g`+Mc-OMqU#GxSS`k{qko z`eKDTn|%3y^vHxQp+`^rFx_O6uE~rXwV^|HPJVPkcXZKPEo=@Ab@}kgw?E%2&$0x{ zN4N2F-p?FjzqtT^{4%`2tDFZWyp;k!uoR}8;RrVQ0%v`SeV(&_J_CKv#V@%W+@6h% z>oAF~XL4*lKnxKN%0uuuaJYryI(;x`Bph28zoDAGk>A4Yji*Ik&jH;`a1F>#?_B+<`4FH#C5W| z?)j6J?E}$2l_}(e56*bJ^E^M{1W-;6Kq+emxgj(QzFr66Xth%)hu{d4L2!-~L7)Jv zaNd+wB88>}3HlTZ%!YcFv@ zpT5$cHuzHS%#nIl@ZU}lPh-HzhlD^od|SAd7{L~Y!J(i9SMb5;du0}%cv9~m3p~Sh zNxOOCAB~c9G+Xc)hoiuYF<_f4&W58#n;iFnq6O#k@9cl2Ry%Uxu*kKfzlC%2Qg0md z?ipR6i%;`Jt4}$}LObormP}Sz`4rYObJkBlG6%e(OAhAkIh$6GPi@{FZHM%qrn8$t zGet0x@XSh(`POxkKgFMX1yvd*h9QMLCSqnnsVD9ASnV>=!4t}S; zQag2!UJHs~mD0r$q@ zU(_4V7|OuRiiHF3Pf0)9kb;fF4|v75dE&pgn2oa&_DJ4j#4gB=jM#=V*;st4??=hV z5iP};O^PjIiLt~L`4m5*pw)uc*!a>1Pi@lDyK?XCx7lBI=zMIBv+eiFvnzq(I?VC) zFv5n}I~xp_aAkohCtiqNLy4>QJbUvka}D2gF5GKwx)>r41(0ZRWm;qs*3S2d@Sx>^7B{u54e ze0%R;$c(`-HrMpVv8>6bdx@-Mle~S(mEJg=9Frv3LFVZAbg^CDl8*u}ezZ&Xf;Bw3 zXQ=6saXPf6?_p^djE!z91#U^SIdQBo2cw>~(*$dF=2|?!o#)0iFTB98`6{qTHux)P zHxJI&K|U6WlfQi;hn{}P5&y0|AAb&?aQ3eP>WkMft`5)Y$Y0;R1Ddvh7lERr(Rk#B zcZp32N%o{ae%+h1GkuYfw%MRpyL|tM&5{K>q#flmBeqRPNn-d&ua292WW?h92&YW4zRV*RR^x z1r$Yh*Q5ROLx;mMrZJCg=R>`Fzjipje?Fgm==;C_-~7>^|M_1G`CjmKzxHdtcBSu& zrE#v^srF0L8+nQEd|=7P!6({up*y~+cr4N3+t>qN%_j0~`Cr(CQ}zy5EfTeZ9|cXg zf>AhuO?5NAjzb?ffqnh5G5zuKm&2YEIJl9L-N_aBcAs#LxtK4xu}LzrAS`a>M?Eud za_9H;A(u9BT=U1tHyiDh_u>j4OO7q-#jyMg`&B&S4~#=k>{c7k$zA!uzwtNz>8C&S zseii4c+kD~&Ye5|d;sO^gTHs!)3C;II=4mb-QTY*{)uW;?nhw>%;#U1!% zR~hZtIlbOY-R^(;0l#Fb$Q{gy?AWP!@tI_80ZLYm{Gd4(lj*|3UY*6{UItSiD3Z$~Uy*H`Ez(<_we4q1;?~UgY!ST?@_(U^N__+|OeqMbi=YNdgd35Fxcg z0<3^bSUsZ<0f>+}Q3(sBP>?o&O%d9tlVEEL2kkl= zRU$SF;aHGc=e(WwNr6494~7Gno?wD_I0m|4Pyk+XP$DWpC~+rC2I+?+1UY)AU%K{; zjtYQu%>mM(MT>qJSPMTqNQT1?-5U#Eu*1nQa=H`j)t5wVWp5q|thhFQ3q*6^93{ub z!v}uV;c1Fj)2Dm+Tz>J?`GM>IRLX7E}yewv1kAuy@ z+u^sY)Z-2R#x@rY&OPS`-^L@u0)}xcXvkX|XLI%{99ktIbV^5f^nDBUcws;0PF{^~ zjusi|moC~sA{RV3v?qsa%9FOK>6ga5-hFu|*C{u=)1zw#d77_{68bQIvM4ZyX|m>P z$k<%TM!+U-Sf_J1GIugXTRs0p?%Fxf*VmZZXp2sp8GdbfU(V&Tyi$vP2|b>a7MZX} zAI@!P7&AM;Kdee5)Oki8uGQnge4Qn@PKk_3#GUvkg;z1%} z{y#L@jAVBHD2)Fb=9OWx9rv${*Wmx>6(jRknfEq(;obOw*KGOxee-?K@vOSJI39Bv zAY92lHxld%_xF1$5!$15Vhwc2^U;3qA+P)rk zzeBty?dVV;L)hR)$%?)dHcOYqVQsX97y6}lSWw^!Mqo&P_u4q}jrzj@T%#ji^Qr%- zz59!`ExYRcUS(5%T!s$VgrLwy*R3=nYJ|aU(+F@{JRpRGEXV^dP%_fwbop7jyc9}{KlAbuD#E`pqUViX`#=?{B=GH!`l#|Ri#glc59PhcD<3$&r=@V|^(pbjV zAI7b<_{Hy+#zyY-U;WfmZ~Mf@KK8e@9h>CEgqL6c z`tfD9mmh!qI7T3kAb#EAS9PO-ud*!9M_yXaJtJb|vZbzi?U(*LS+A@8NxSjy<3Bn2 zoqY9uWKnGC@)QS^@8x*P8Fk0ooP+)_Sdv@NT!T*|*WWiI{(7t_{#~{jeVn;u3~p znBDMI2Wz&9FL@ER>g3BdhvH8xi&dW*E9P-nk^9koNtNFV*B$QxF!W;%f6Bj3W&UuK8h`=mSa{@2{udYO@o|6#W ze1wS0x73B2we@l^NJjFN;KQpgAzPiT~V=MG40eMaz zcCZ;v2=aEJxB)N1yo4 z268Nf=+-AuY!{pN#)LAQG#~%~AOJ~3K~&A5~K;pvlcOY$QEtr#@Ek|4K*9Z zQ-8z7t|p)bv5b-x{t#>V=^6vbjrN9PYn&p#wj)nZ^$bi8hPnQ}N=N zvG^Gd^rIVFypUjnzw==`KkLgD_LW0nQJm5T*Zj9Dctx)^y#LKV`bUdw*lNdqhs~$F zuq^u=?O2-%MrErY>A_x>mqlw^UVOd4ks)xKy7%P)oJTc z)cITEej#;vuHP%|-ZJifc__EEzi%=evGm;dWc-;oz3IosqxUWiZh5gu8VloPGbjh) zX!*@zM_$2&HZ^d-x)<&@v} zjo(=M+#9(WUW!=KzIjJp;;-VfdTqp@U%-aDSpDyQ>ZeXO{Mzxa7sboV$PtU575@IV-fM#mmH&wZ)%W_V=P~;$5|{cJBl%eIP<)s z4Sp!aso31%_YLFxOU0r#r|~#&{Hh^qe3Rn88r45NeDkhPKKtwk;?&qpFEYysuJ2nY z>~!JR`|6j5_t&hSFJ9gG*5y)0AGsxYi;X+k_g#;1-6wOorpu|AlPBuo$}f0lJlE;w zhdQ<4gHMk2hj@~QVQGzQ&5S?RCSn%PwCBHGB;j0n(HRf%SiLs53P1hu0H2Ie?3*`Q zUs$VXOIOcvk*tNoVqyF5H&5-p4Hx~H9S^XBz1iiOO|XEI7e(Sg967_>^SG?P7kY9e zEMa3_mjA4=^y%x%`uWC{7yEGb%$%o?qpv!68h_lQV8?BM?xA$p+Hmqg2jM5zyRXzD zokRsNz`OPz&m+3z3N#B3MC1^7wU`5>dNMfGGyMgIgl^FWWDeG68GPLLsRMc5ygD17 z^NeTlEXX+9MCfgVanvm`b|0TFH?Pq${;#$r(@S1(fl~`dNrx}sEE!q!@_~uWVw|s9 zfO@X4KK$SftKi@Zz7%*SF&rSDe*~Y&k&kU)_*8$BGTsREHksZLwk8-cptXVJS|?vFKCiANFL!&{*`O z3pvH8d%BPzPT%_0w=V6&U1Ic{92*w?H#Xai&Hrt1;68md^hP6U;AV%h=ng+QKmx~2 zdh;6}u^V3UN(*H6#Z}2)Tj%naYrKIYe!&2L`V<*<{A5h>-ILLVHcqO?2|k`m>kx!q zHk^E`@Ims7$#-OuVXTEm!&b4U&`%tB)&jy<`tTLLxYw_RMlplK`4|Vt#h)fr{L;n& z5Aw?CVu2hu+R(sNd-m$Tv>p0=(^!CK8+k=nJ1ujtvof{4I|c7Ie0d#WbDwUy|S7$5T@?S7|vy zqjFX5EW}A=X67KX963-it(>SiaSt@NmLmsk>r)Qgnu4gHMCI$-G8IRPm-xx&iw<{bNO`h2;WAyL@C;0;$5PRaWv;(p=KB{Z^OI^pkd2=-u%F9)6BWHJ z6h7S=$QVPPz-I}8%`~@|x5SZg@!S8H*c+MZol29!1wLDvx7+K0A~yh$h^b>52TOy_ zSSLHcEoSQh^vJ=P<8!|Om0lC2CD~igsgsw*?Sm@(R$f&<2b*;3gI+A(Qjf@pR%Bw% zyu-fw^(Vo9tm$t7WLpNudAa4H`h(MCf7jRT$L1^Q-w2p|jS_rh%!^l!JDzlN!MgZh zA^qT)@qMC!U%bHaXTUTmf71MMWp>2iH?Q}W0Y7^f9S^!D zy_7T{O~+r)^!m`_e#UWX987Bzv==Y68Hotv#wcxvu|W3J`Wu~FACx7THxmqtT-)7o zhkH1j?=1^eCNgGY*{1$v;0klNSyq7~%i^#IMya_2$GyIv6Qd)49rwvY-5X9X3u^Z0 zHv&{rqR?I^7nX}1v*JG~t5;XN{Cj6PJHSVr^vuPn1i|RdFREbNz5@sbtE$Tc6}n|H z;P{W_B35Sho~Ixc?+Px3$nmaHqfL`i99%dYH+P7G^_x?wqJ2IGb3Q78mt9IFrg!A| zS2{lnhe?SERaBmiice)`amlr3yGoGLq)n>WgGC@b`@7) z_K1gpZ;-ce`rNw&7@N=$v4DzrHjUv!qZhq(b=!n#gQ;t&u^-zrKR!b#xQ6YnHy>FK zlJ#6*k%8-&KxBHXUkPwXgo`O-#QvWFBnGHNB9WW?vp+UhY(R`3tm;N-`sV8CEIS8HzY;cbykx6ZTi0PIYu^Sd$qOK`ABP# zDFMCujsJE^Xomm%k4nSqmYV`RpfY>Pj44a;Z9Ko`^eRBsv&z^-qqy}k;Gp9%xN}3T zJsdoxDpiPRyXeMzD?soMX;=8KxGO}69A?a66mhuRXC%pgI7eOj1?Z~(?q^l@WUj+y zqU&Uniwt|}pY2k{x}JdZNdy1lO8a=Dd0A9*mJdk7WPrwZMrTAhC(b6Xg^ zE{L8g*PY6?fmk~{cZb)%|X#*d$`bIfG6uL+T6=p)Z5u;48qtA8sfI{61#^vb!e00dN zDmrYn0Cj)vz-RbS{9ptUwtUn9)Bz0Z>b%AJwpWaioR=A%RIBhlFI!;lYpKv7QJ}Kf zF`}7f^R8U#aHy>qDhShu_`MT6|D#%Qa%Z5~e%X`^a`rnF2{4FoMlqaI`Mv75_|ri+ zgpm&GI!{5+!>yo1XFvU zs;~er4j>DwZH(*APUsTEmqK!Zx|Wj)-$t*nzSsR4ZFyEU7K-hk4Sck<<7#*0p02F0 zPKY(vEJ=)y6AKWzP|0W0D@wVUQy~kK6~D}R+E{D&;z-6|t5CiCz2xWQX0r#!)+X%Y zPDBaF`Gxl3^Ac4TxZfxJvHRf=@~JRuAXgX7dI5t#imzvpY;p^ct%=KGPeI9@!q(Be zKJ7ttG_{etUUu%ul&!!9&MAd=)Z_`SV#R`2)r*@Z^oD?zZ%eH!iJ|ub$kZFh&iVB!Je%!?aHwdRz>Bp zj+da|yF&Ja1X9AU;GeG%%~jFTZD$p#SUQscN)wAP+Vu(M;n($TKh zoDSo6Tpt{keZeR%pSj$?di%rXJzD)qXZBN(GuE%LBM+s}64g7C{tfkY^Si=X&8GHk z?gztLPcc2#$m1sU1;4{fN9RZ}fG@>ef=3i^0;(wdF5hXiFw9p-p(02 z_4k62Rd0I2*SYyuMpWkj!~RG&MQ{A^$c02}*QrnLtYnA4SFscCbiT(r2WQ-hWL%Cw ziVV-?D6KR4C;>$6aXPlx{LNj0t}jukFU>A9pS3ee;yzVw2v##^{2ux z68l@Q!>y<0F`qR?sHFGO_JlVf6phNMlw{v!Zs!I*9O0aUo<;=VrY=Y!ISlhn*>NLi zmm6}_G9BCx_YAM;9}ex6a7k8iNo#f~p&ac8FE&1TF?jfyNqVfzE)Zxs&D~SuOHZXn z!_49!zl!>OmAyHexJ-RleABopI)nBO(zGiev^h?n2CY*r z@+R?0Gzjx+rKu3%xjk>CMnfecW)ivJ3_eH;elAUA+4#$Lq^|zZ){mE{EsT~Op!N+p zO!Ag$Bdrigwq~`a6$N*f{gIiGP*9rw*lW?9>$6LFYXl3VtBx^*-Ad!{x*IS4iEM3< z(0T<=?TkML~<0!hO z)~kq_jFr)mg5w+=(W9ATocyPiE`z^na=ChlGq@}3o=Z`7YJ|B*mEZVJQsD#Yt=fAy zRE{`rR)G^0U|d3oxpOiSoRi0VC=G0}1V$fagyV4yH;hl*3^zUYO1rXX_toLaXFJFh ztq|ldcea-RTdhpJ+On=Z1E5JU6w1$PzS$vIdH;;OL~UPouctb`^0ZKK{`lfT{&q2@ zt@)F|m%xDJ`GA)hay*;PFjdDK++N;&J7KTN$&!?remnK)iXLj5;O0jIOuKx9tc(=$ zgUs`z`R&5`{^a3)`c^6jUygu#t=5zYZ+4c82&PZLpsBW#Vd@YmUUxmBLQ2DULLrQ8 zM)AY7?}Df9962ZXx9g@{RDXtQ$( zhBUBr0aOYU6wdnjk@unwz6N?Nwd9Oty#h%2RiRy+WI6MOP?3^=ov8#`iC-(cJpuHu z%HWVX)@}p^S9ZAMNrP&@QG3g6CWgAS4-xfzn#@5bGj{v!-%X6~j7JEnH=rUoR;Rc(j zJkA^*KL(9QzhNXS;5AjcviCH}3Xg|bYccNTPeqGHqG9V?d%j

    yCaY2CO%bhTo? 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