From 8fd34a9dc60a30927919aad850d86bbbcf97ebcc Mon Sep 17 00:00:00 2001 From: Vanessa Ezekowitz Date: Fri, 19 Apr 2013 22:48:42 -0400 Subject: [PATCH] Several changes (see below) Dropped support for punching doors to open them - only right-click now. Moved gates out of fences and into doors file, renamed that file to doors_and_gates.lua. Changed gates to also use right click to open, and in the process completely rewrote how gates are defined and managed; this necessitated creating some duplicate textures. Some of them are blank, and texture pack authors may find the extra filenames useful anyway. Node names for all gates have changed, aliases are provided for backward compatibility. --- door_nodes.lua | 226 ------------- doors_and_gates.lua | 294 +++++++++++++++++ fences.lua | 310 ------------------ init.lua | 2 +- ...ng => homedecor_gate_barbed_wire_back.png} | Bin ... => homedecor_gate_barbed_wire_bottom.png} | Bin ...g => homedecor_gate_barbed_wire_front.png} | Bin textures/homedecor_gate_barbed_wire_left.png | Bin 0 -> 397 bytes textures/homedecor_gate_barbed_wire_right.png | Bin 0 -> 397 bytes textures/homedecor_gate_barbed_wire_top.png | Bin 0 -> 397 bytes ....png => homedecor_gate_chainlink_back.png} | Bin ...ng => homedecor_gate_chainlink_bottom.png} | Bin ...png => homedecor_gate_chainlink_front.png} | Bin ....png => homedecor_gate_chainlink_left.png} | Bin textures/homedecor_gate_chainlink_right.png | Bin 0 -> 505 bytes textures/homedecor_gate_chainlink_top.png | Bin 0 -> 490 bytes ...ide.png => homedecor_gate_picket_back.png} | Bin textures/homedecor_gate_picket_bottom.png | Bin 0 -> 115 bytes ...te.png => homedecor_gate_picket_front.png} | Bin textures/homedecor_gate_picket_left.png | Bin 0 -> 115 bytes textures/homedecor_gate_picket_right.png | Bin 0 -> 115 bytes textures/homedecor_gate_picket_top.png | Bin 0 -> 115 bytes ...g => homedecor_gate_picket_white_back.png} | Bin .../homedecor_gate_picket_white_bottom.png | Bin 0 -> 115 bytes ... => homedecor_gate_picket_white_front.png} | Bin textures/homedecor_gate_picket_white_left.png | Bin 0 -> 115 bytes .../homedecor_gate_picket_white_right.png | Bin 0 -> 115 bytes textures/homedecor_gate_picket_white_top.png | Bin 0 -> 115 bytes 28 files changed, 295 insertions(+), 537 deletions(-) delete mode 100644 door_nodes.lua create mode 100644 doors_and_gates.lua rename textures/{homedecor_fence_barbed_wire_gate_backside.png => homedecor_gate_barbed_wire_back.png} (100%) rename textures/{homedecor_fence_barbed_wire_gate_edges.png => homedecor_gate_barbed_wire_bottom.png} (100%) rename textures/{homedecor_fence_barbed_wire_gate_front.png => homedecor_gate_barbed_wire_front.png} (100%) create mode 100644 textures/homedecor_gate_barbed_wire_left.png create mode 100644 textures/homedecor_gate_barbed_wire_right.png create mode 100644 textures/homedecor_gate_barbed_wire_top.png rename textures/{homedecor_fence_chainlink_gate_backside.png => homedecor_gate_chainlink_back.png} (100%) rename textures/{homedecor_fence_chainlink_gate_tb.png => homedecor_gate_chainlink_bottom.png} (100%) rename textures/{homedecor_fence_chainlink_gate_front.png => homedecor_gate_chainlink_front.png} (100%) rename textures/{homedecor_fence_chainlink_gate_sides.png => homedecor_gate_chainlink_left.png} (100%) create mode 100644 textures/homedecor_gate_chainlink_right.png create mode 100644 textures/homedecor_gate_chainlink_top.png rename textures/{homedecor_fence_picket_gate_backside.png => homedecor_gate_picket_back.png} (100%) create mode 100644 textures/homedecor_gate_picket_bottom.png rename textures/{homedecor_fence_picket_gate.png => homedecor_gate_picket_front.png} (100%) create mode 100644 textures/homedecor_gate_picket_left.png create mode 100644 textures/homedecor_gate_picket_right.png create mode 100644 textures/homedecor_gate_picket_top.png rename textures/{homedecor_fence_picket_gate_white_backside.png => homedecor_gate_picket_white_back.png} (100%) create mode 100644 textures/homedecor_gate_picket_white_bottom.png rename textures/{homedecor_fence_picket_gate_white.png => homedecor_gate_picket_white_front.png} (100%) create mode 100644 textures/homedecor_gate_picket_white_left.png create mode 100644 textures/homedecor_gate_picket_white_right.png create mode 100644 textures/homedecor_gate_picket_white_top.png diff --git a/door_nodes.lua b/door_nodes.lua deleted file mode 100644 index 5cfc6b7..0000000 --- a/door_nodes.lua +++ /dev/null @@ -1,226 +0,0 @@ --- Node definitions for Homedecor doors - --- Boilerplate to support localized strings if intllib mod is installed. -local S -if (minetest.get_modpath("intllib")) then - dofile(minetest.get_modpath("intllib").."/intllib.lua") - S = intllib.Getter(minetest.get_current_modname()) -else - S = function ( s ) return s end -end - -local sides = {"left", "right"} -local rsides = {"right", "left"} - --- cheater's method of detecting if default doors are right-click-to-open: --- default.generate_ore() was exposed to the modding API one day prior to the --- right-click thing. - -local use_rightclick = type(default.generate_ore) - -for i in ipairs(sides) do - local side = sides[i] - local rside = rsides[i] - - for j in ipairs(homedecor_door_models) do - local doorname = homedecor_door_models[j][1] - local doordesc = homedecor_door_models[j][2] - local nodeboxes_top = nil - local nodeboxes_bottom = nil - - if side == "left" then - nodeboxes_top = homedecor_door_models[j][3] - nodeboxes_bottomtom = homedecor_door_models[j][4] - else - nodeboxes_top = homedecor_door_models[j][5] - nodeboxes_bottomtom = homedecor_door_models[j][6] - end - - local tiles_top = { - "homedecor_door_"..doorname.."_tb.png", - "homedecor_door_"..doorname.."_tb.png", - "homedecor_door_"..doorname.."_lrt.png", - "homedecor_door_"..doorname.."_lrt.png", - "homedecor_door_"..doorname.."_"..rside.."_top.png", - "homedecor_door_"..doorname.."_"..side.."_top.png", - } - - local tiles_bottom = { - "homedecor_door_"..doorname.."_tb.png", - "homedecor_door_"..doorname.."_tb.png", - "homedecor_door_"..doorname.."_lrb.png", - "homedecor_door_"..doorname.."_lrb.png", - "homedecor_door_"..doorname.."_"..rside.."_bottom.png", - "homedecor_door_"..doorname.."_"..side.."_bottom.png", - } - - local selectboxes_top = { - type = "fixed", - fixed = { -0.5, -1.5, 6/16, 0.5, 0.5, 8/16} - } - - local selectboxes_bottom = { - type = "fixed", - fixed = { -0.5, -0.5, 6/16, 0.5, 1.5, 8/16} - } - - if use_rightclick == nil then -- register the version that uses on_punch - - minetest.register_node("homedecor:door_"..doorname.."_top_"..side, { - description = doordesc.." "..S("(Top Half, %s-opening)"):format(side), - drawtype = "nodebox", - tiles = tiles_top, - paramtype = "light", - paramtype2 = "facedir", - groups = {snappy=3, not_in_creative_inventory=1}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - selection_box = selectboxes_top, - node_box = { - type = "fixed", - fixed = nodeboxes_top - }, - drop = "homedecor:door_"..doorname.."_bottom_"..side, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - if minetest.env:get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "homedecor:door_"..doorname.."_bottom_"..side then - minetest.env:remove_node({x=pos.x, y=pos.y-1, z=pos.z}) - end - end, - on_punch = function(pos, node, puncher) - homedecor_flip_door({x=pos.x, y=pos.y-1, z=pos.z}, node, puncher, doorname, side) - end - }) - - minetest.register_node("homedecor:door_"..doorname.."_bottom_"..side, { - description = doordesc.." "..S("(%s-opening)"):format(side), - drawtype = "nodebox", - tiles = tiles_bottom, - inventory_image = "homedecor_door_"..doorname.."_"..side.."_inv.png", - paramtype = "light", - paramtype2 = "facedir", - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - selection_box = selectboxes_bottom, - node_box = { - type = "fixed", - fixed = nodeboxes_bottomtom - }, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - if minetest.env:get_node({x=pos.x, y=pos.y+1, z=pos.z}).name == "homedecor:door_"..doorname.."_top_"..side then - minetest.env:remove_node({x=pos.x, y=pos.y+1, z=pos.z}) - end - end, - on_punch = function(pos, node, puncher) - homedecor_flip_door(pos, node, puncher, doorname, side) - end, - on_place = function(itemstack, placer, pointed_thing) - return homedecor_place_door(itemstack, placer, pointed_thing, doorname, side) - end, - }) - - else -- register the version that uses on_rightclick - - minetest.register_node("homedecor:door_"..doorname.."_top_"..side, { - description = doordesc.." "..S("(Top Half, %s-opening)"):format(side), - drawtype = "nodebox", - tiles = tiles_top, - paramtype = "light", - paramtype2 = "facedir", - groups = {snappy=3, not_in_creative_inventory=1}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - selection_box = selectboxes_top, - node_box = { - type = "fixed", - fixed = nodeboxes_top - }, - drop = "homedecor:door_"..doorname.."_bottom_"..side, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - if minetest.env:get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "homedecor:door_"..doorname.."_bottom_"..side then - minetest.env:remove_node({x=pos.x, y=pos.y-1, z=pos.z}) - end - end, - on_rightclick = function(pos, node, clicker) - homedecor_flip_door({x=pos.x, y=pos.y-1, z=pos.z}, node, clicker, doorname, side) - end - }) - - minetest.register_node("homedecor:door_"..doorname.."_bottom_"..side, { - description = doordesc.." "..S("(%s-opening)"):format(side), - drawtype = "nodebox", - tiles = tiles_bottom, - inventory_image = "homedecor_door_"..doorname.."_"..side.."_inv.png", - paramtype = "light", - paramtype2 = "facedir", - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - selection_box = selectboxes_bottom, - node_box = { - type = "fixed", - fixed = nodeboxes_bottomtom - }, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - if minetest.env:get_node({x=pos.x, y=pos.y+1, z=pos.z}).name == "homedecor:door_"..doorname.."_top_"..side then - minetest.env:remove_node({x=pos.x, y=pos.y+1, z=pos.z}) - end - end, - on_place = function(itemstack, placer, pointed_thing) - - local node=minetest.env:get_node(pointed_thing.under) - if not minetest.registered_nodes[node.name] - or not minetest.registered_nodes[node.name].on_rightclick then - return homedecor_place_door(itemstack, placer, pointed_thing, doorname, side) - else - minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer) - end - end, - on_rightclick = function(pos, node, clicker) - homedecor_flip_door(pos, node, clicker, doorname, side) - end - }) - end - end -end - -function homedecor_place_door(itemstack, placer, pointed_thing, name, side) - local pos = pointed_thing.above - if homedecor_node_is_owned(pointed_thing.under, placer) == false then - - local nodename = minetest.env:get_node(pointed_thing.under).name - local field = nil - - if minetest.registered_nodes[nodename] then field = minetest.registered_nodes[nodename].on_rightclick end - - if field == nil then - fdir = minetest.dir_to_facedir(placer:get_look_dir()) - if minetest.env:get_node({x=pos.x, y=pos.y+1, z=pos.z}).name ~= "air" then - minetest.chat_send_player( placer:get_player_name(), S('Not enough vertical space to place a door!') ) - return - end - minetest.env:add_node({x=pos.x, y=pos.y+1, z=pos.z}, { name = "homedecor:door_"..name.."_top_"..side, param2=fdir}) - minetest.env:add_node(pos, { name = "homedecor:door_"..name.."_bottom_"..side, param2=fdir}) - itemstack:take_item() - return itemstack - end - return minetest.item_place(itemstack, placer, pointed_thing) - end -end - -function homedecor_flip_door(pos, node, player, name, side) - local rside = nil - local nfdir = nil - if side == "left" then - rside = "right" - nfdir=node.param2 - 1 - if nfdir < 0 then nfdir = 3 end - else - rside = "left" - nfdir=node.param2 + 1 - if nfdir > 3 then nfdir = 0 end - end - minetest.env:add_node({x=pos.x, y=pos.y+1, z=pos.z}, { name = "homedecor:door_"..name.."_top_"..rside, param2=nfdir}) - minetest.env:add_node(pos, { name = "homedecor:door_"..name.."_bottom_"..rside, param2=nfdir}) -end - diff --git a/doors_and_gates.lua b/doors_and_gates.lua new file mode 100644 index 0000000..118881c --- /dev/null +++ b/doors_and_gates.lua @@ -0,0 +1,294 @@ +-- Node definitions for Homedecor doors + +-- Boilerplate to support localized strings if intllib mod is installed. +local S +if (minetest.get_modpath("intllib")) then + dofile(minetest.get_modpath("intllib").."/intllib.lua") + S = intllib.Getter(minetest.get_current_modname()) +else + S = function ( s ) return s end +end + +-- doors + +local sides = {"left", "right"} +local rsides = {"right", "left"} + +for i in ipairs(sides) do + local side = sides[i] + local rside = rsides[i] + + for j in ipairs(homedecor_door_models) do + local doorname = homedecor_door_models[j][1] + local doordesc = homedecor_door_models[j][2] + local nodeboxes_top = nil + local nodeboxes_bottom = nil + + if side == "left" then + nodeboxes_top = homedecor_door_models[j][3] + nodeboxes_bottomtom = homedecor_door_models[j][4] + else + nodeboxes_top = homedecor_door_models[j][5] + nodeboxes_bottomtom = homedecor_door_models[j][6] + end + + local tiles_top = { + "homedecor_door_"..doorname.."_tb.png", + "homedecor_door_"..doorname.."_tb.png", + "homedecor_door_"..doorname.."_lrt.png", + "homedecor_door_"..doorname.."_lrt.png", + "homedecor_door_"..doorname.."_"..rside.."_top.png", + "homedecor_door_"..doorname.."_"..side.."_top.png", + } + + local tiles_bottom = { + "homedecor_door_"..doorname.."_tb.png", + "homedecor_door_"..doorname.."_tb.png", + "homedecor_door_"..doorname.."_lrb.png", + "homedecor_door_"..doorname.."_lrb.png", + "homedecor_door_"..doorname.."_"..rside.."_bottom.png", + "homedecor_door_"..doorname.."_"..side.."_bottom.png", + } + + local selectboxes_top = { + type = "fixed", + fixed = { -0.5, -1.5, 6/16, 0.5, 0.5, 8/16} + } + + local selectboxes_bottom = { + type = "fixed", + fixed = { -0.5, -0.5, 6/16, 0.5, 1.5, 8/16} + } + + minetest.register_node("homedecor:door_"..doorname.."_top_"..side, { + description = doordesc.." "..S("(Top Half, %s-opening)"):format(side), + drawtype = "nodebox", + tiles = tiles_top, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=3, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + selection_box = selectboxes_top, + node_box = { + type = "fixed", + fixed = nodeboxes_top + }, + drop = "homedecor:door_"..doorname.."_bottom_"..side, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if minetest.env:get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "homedecor:door_"..doorname.."_bottom_"..side then + minetest.env:remove_node({x=pos.x, y=pos.y-1, z=pos.z}) + end + end, + on_rightclick = function(pos, node, clicker) + homedecor_flip_door({x=pos.x, y=pos.y-1, z=pos.z}, node, clicker, doorname, side) + end + }) + + minetest.register_node("homedecor:door_"..doorname.."_bottom_"..side, { + description = doordesc.." "..S("(%s-opening)"):format(side), + drawtype = "nodebox", + tiles = tiles_bottom, + inventory_image = "homedecor_door_"..doorname.."_"..side.."_inv.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=3}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + selection_box = selectboxes_bottom, + node_box = { + type = "fixed", + fixed = nodeboxes_bottomtom + }, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if minetest.env:get_node({x=pos.x, y=pos.y+1, z=pos.z}).name == "homedecor:door_"..doorname.."_top_"..side then + minetest.env:remove_node({x=pos.x, y=pos.y+1, z=pos.z}) + end + end, + on_place = function(itemstack, placer, pointed_thing) + + local node=minetest.env:get_node(pointed_thing.under) + if not minetest.registered_nodes[node.name] + or not minetest.registered_nodes[node.name].on_rightclick then + return homedecor_place_door(itemstack, placer, pointed_thing, doorname, side) + else + minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer) + end + end, + on_rightclick = function(pos, node, clicker) + homedecor_flip_door(pos, node, clicker, doorname, side) + end + }) + end +end + +-- Gates + +local gates_list = { "picket", "picket_white", "barbed_wire", "chainlink" } +local gate_names = { "Unpainted Picket", "White Picket", "Barbed Wire", "Chainlink" } + +local gate_models_closed = { + {{ -0.5, -0.5, 0.498, 0.5, 0.5, 0.498 }}, + + {{ -0.5, -0.5, 0.498, 0.5, 0.5, 0.498 }}, + + {{ -8/16, -8/16, 6/16, -6/16, 8/16, 8/16 }, -- left post + { 6/16, -8/16, 6/16, 8/16, 8/16, 8/16 }, -- right post + { -8/16, 7/16, 13/32, 8/16, 8/16, 15/32 }, -- top piece + { -8/16, -8/16, 13/32, 8/16, -7/16, 15/32 }, -- bottom piece + { -6/16, -8/16, 7/16, 6/16, 8/16, 7/16 }}, -- the wire + + {{ -8/16, -8/16, 6/16, -7/16, 8/16, 8/16 }, -- left post + { 6/16, -8/16, 6/16, 8/16, 8/16, 8/16 }, -- right post + { -8/16, 7/16, 13/32, 8/16, 8/16, 15/32 }, -- top piece + { -8/16, -8/16, 13/32, 8/16, -7/16, 15/32 }, -- bottom piece + { -8/16, -8/16, 7/16, 8/16, 8/16, 7/16 }, -- the chainlink itself + { -8/16, -3/16, 6/16, -6/16, 3/16, 8/16 }} -- the lump representing the lock +} + +local gate_models_open = { + {{ 0.498, -0.5, -0.5, 0.498, 0.5, 0.5 }}, + + {{ 0.498, -0.5, -0.5, 0.498, 0.5, 0.5 }}, + + {{ 6/16, -8/16, -8/16, 8/16, 8/16, -6/16 }, -- left post + { 6/16, -8/16, 6/16, 8/16, 8/16, 8/16 }, -- right post + { 13/32, 7/16, -8/16, 15/32, 8/16, 8/16 }, -- top piece + { 13/32, -8/16, -8/16, 15/32, -7/16, 8/16 }, -- bottom piece + { 7/16, -8/16, -6/16, 7/16, 8/16, 6/16 }}, -- the wire + + {{ 6/16, -8/16, -8/16, 8/16, 8/16, -7/16 }, -- left post + { 6/16, -8/16, 6/16, 8/16, 8/16, 8/16 }, -- right post + { 13/32, 7/16, -8/16, 15/32, 8/16, 8/16 }, -- top piece + { 13/32, -8/16, -8/16, 15/32, -7/16, 8/16 }, -- bottom piece + { 7/16, -8/16, -8/16, 7/16, 8/16, 8/16 }, -- the chainlink itself + { 6/16, -3/16, -8/16, 8/16, 3/16, -6/16 }} -- the lump representing the lock +} + +for i in ipairs(gates_list) do + + local gate=gates_list[i] + + minetest.register_node("homedecor:gate_"..gate.."_closed", { + drawtype = "nodebox", + description = S(gate_names[i].." Fence Gate"), + tiles = { + "homedecor_gate_"..gate.."_top.png", + "homedecor_gate_"..gate.."_bottom.png", + "homedecor_gate_"..gate.."_left.png", + "homedecor_gate_"..gate.."_right.png", + "homedecor_gate_"..gate.."_back.png", + "homedecor_gate_"..gate.."_front.png" + }, + paramtype = "light", + is_ground_content = true, + groups = {snappy=3}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + paramtype2 = "facedir", + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, 0.4, 0.5, 0.5, 0.5 } + }, + node_box = { + type = "fixed", + fixed = gate_models_closed[i] + }, + on_rightclick = function(pos, node, clicker) + homedecor_flip_gate(pos, node, clicker, gate, "closed") + end + }) + + minetest.register_node("homedecor:gate_"..gate.."_open", { + drawtype = "nodebox", + description = S(gate_names[i].." Fence Gate"), + tiles = { + "homedecor_gate_"..gate.."_top.png", + "homedecor_gate_"..gate.."_bottom.png", + "homedecor_gate_"..gate.."_front.png", + "homedecor_gate_"..gate.."_back.png", + "homedecor_gate_"..gate.."_left.png", + "homedecor_gate_"..gate.."_right.png" + }, + paramtype = "light", + is_ground_content = true, + groups = {snappy=3, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + paramtype2 = "facedir", + selection_box = { + type = "fixed", + fixed ={ 0.4, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + node_box = { + type = "fixed", + fixed = gate_models_open[i] + }, + drop = "homedecor:gate_"..gate.."_closed", + on_rightclick = function(pos, node, clicker) + homedecor_flip_gate(pos, node, clicker, gate, "open") + end + }) + +end + +minetest.register_alias("homedecor:fence_barbed_wire_gate_open", "homedecor:gate_chainlink_open") +minetest.register_alias("homedecor:fence_barbed_wire_gate_closed", "homedecor:gate_chainlink_closed") +minetest.register_alias("homedecor:fence_chainlink_gate_open", "homedecor:gate_barbed_wire_open") +minetest.register_alias("homedecor:fence_chainlink_gate_closed", "homedecor:gate_barbed_wire_closed") +minetest.register_alias("homedecor:fence_picket_gate_open", "homedecor:gate_picket_open") +minetest.register_alias("homedecor:fence_picket_gate_closed", "homedecor:gate_picket_closed") +minetest.register_alias("homedecor:fence_picket_gate_white_open", "homedecor:gate_picket_white_open") +minetest.register_alias("homedecor:fence_picket_gate_white_closed", "homedecor:gate_picket_white_closed") + +----- helper functions + +function homedecor_place_door(itemstack, placer, pointed_thing, name, side) + local pos = pointed_thing.above + if homedecor_node_is_owned(pointed_thing.under, placer) == false then + + local nodename = minetest.env:get_node(pointed_thing.under).name + local field = nil + + if minetest.registered_nodes[nodename] then field = minetest.registered_nodes[nodename].on_rightclick end + + if field == nil then + fdir = minetest.dir_to_facedir(placer:get_look_dir()) + if minetest.env:get_node({x=pos.x, y=pos.y+1, z=pos.z}).name ~= "air" then + minetest.chat_send_player( placer:get_player_name(), S('Not enough vertical space to place a door!') ) + return + end + minetest.env:add_node({x=pos.x, y=pos.y+1, z=pos.z}, { name = "homedecor:door_"..name.."_top_"..side, param2=fdir}) + minetest.env:add_node(pos, { name = "homedecor:door_"..name.."_bottom_"..side, param2=fdir}) + itemstack:take_item() + return itemstack + end + return minetest.item_place(itemstack, placer, pointed_thing) + end +end + +function homedecor_flip_door(pos, node, player, name, side) + local rside = nil + local nfdir = nil + if side == "left" then + rside = "right" + nfdir=node.param2 - 1 + if nfdir < 0 then nfdir = 3 end + else + rside = "left" + nfdir=node.param2 + 1 + if nfdir > 3 then nfdir = 0 end + end + minetest.env:add_node({x=pos.x, y=pos.y+1, z=pos.z}, { name = "homedecor:door_"..name.."_top_"..rside, param2=nfdir}) + minetest.env:add_node(pos, { name = "homedecor:door_"..name.."_bottom_"..rside, param2=nfdir}) +end + +function homedecor_flip_gate(pos, node, player, gate, oc) + local fdir = node.param2 + + if oc == "closed" then + minetest.env:add_node(pos, { name = "homedecor:gate_"..gate.."_open", param2=fdir}) + else + minetest.env:add_node(pos, { name = "homedecor:gate_"..gate.."_closed", param2=fdir}) + end +end diff --git a/fences.lua b/fences.lua index 8ba9020..e5afa53 100644 --- a/fences.lua +++ b/fences.lua @@ -456,316 +456,6 @@ minetest.register_node("homedecor:fence_chainlink_corner", { }, }) - --- ===== --- Gates - -minetest.register_node("homedecor:fence_picket_gate_closed", { - drawtype = "nodebox", - description = S("Unpainted Picket Fence Gate"), - tiles = { - "homedecor_blanktile.png", - "homedecor_blanktile.png", - "homedecor_fence_picket_gate.png", - "homedecor_fence_picket_gate.png", - "homedecor_fence_picket_gate_backside.png", - "homedecor_fence_picket_gate.png" - }, - paramtype = "light", - is_ground_content = true, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - paramtype2 = "facedir", - selection_box = { - type = "fixed", - fixed = { -0.5, -0.5, 0.4, 0.5, 0.5, 0.5 } - }, - node_box = { - type = "fixed", - fixed = { -0.5, -0.5, 0.498, 0.5, 0.5, 0.498 } - }, -}) - -minetest.register_node("homedecor:fence_picket_gate_open", { - drawtype = "nodebox", - description = S("Unpainted Picket Fence Gate"), - tiles = { - "homedecor_blanktile.png", - "homedecor_blanktile.png", - "homedecor_fence_picket_gate.png", - "homedecor_fence_picket_gate_backside.png", - "homedecor_fence_picket_gate.png", - "homedecor_fence_picket_gate.png" - }, - paramtype = "light", - is_ground_content = true, - groups = {snappy=3, not_in_creative_inventory=1}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - paramtype2 = "facedir", - selection_box = { - type = "fixed", - fixed = { 0.4, -0.5, -0.5, 0.5, 0.5, 0.5 } - }, - node_box = { - type = "fixed", - fixed = { 0.498, -0.5, -0.5, 0.498, 0.5, 0.5 } - }, - drop = "homedecor:fence_picket_gate_closed" -}) - -minetest.register_node("homedecor:fence_picket_gate_white_closed", { - drawtype = "nodebox", - description = S("White Picket Fence Gate"), - tiles = { - "homedecor_blanktile.png", - "homedecor_blanktile.png", - "homedecor_fence_picket_gate_white.png", - "homedecor_fence_picket_gate_white.png", - "homedecor_fence_picket_gate_white_backside.png", - "homedecor_fence_picket_gate_white.png" - }, --- inventory_image = "homedecor_fence_picket_gate.png", --- wield_image = "homedecor_fence_picket_gate.png", - paramtype = "light", - is_ground_content = true, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - paramtype2 = "facedir", - selection_box = { - type = "fixed", - fixed = { -0.5, -0.5, 0.4, 0.5, 0.5, 0.5 } - }, - node_box = { - type = "fixed", - fixed = { -0.5, -0.5, 0.498, 0.5, 0.5, 0.498 } - }, -}) - -minetest.register_node("homedecor:fence_picket_gate_white_open", { - drawtype = "nodebox", - description = S("White Picket Fence Gate"), - tiles = { - "homedecor_blanktile.png", - "homedecor_blanktile.png", - "homedecor_fence_picket_gate_white.png", - "homedecor_fence_picket_gate_white_backside.png", - "homedecor_fence_picket_gate_white.png", - "homedecor_fence_picket_gate_white.png" - }, --- inventory_image = "homedecor_fence_picket_gate.png", --- wield_image = "homedecor_fence_picket_gate.png", - paramtype = "light", - is_ground_content = true, - groups = {snappy=3, not_in_creative_inventory=1}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - paramtype2 = "facedir", - selection_box = { - type = "fixed", - fixed = { 0.4, -0.5, -0.5, 0.5, 0.5, 0.5 } - }, - node_box = { - type = "fixed", - fixed = { 0.498, -0.5, -0.5, 0.498, 0.5, 0.5 } - }, - drop = "homedecor:fence_picket_gate_closed" -}) - -minetest.register_node("homedecor:fence_barbed_wire_gate_closed", { - drawtype = "nodebox", - description = S("Barbed Wire Fence Gate"), - tiles = { - "homedecor_fence_barbed_wire_gate_edges.png", - "homedecor_fence_barbed_wire_gate_edges.png", - "homedecor_fence_barbed_wire_gate_edges.png", - "homedecor_fence_barbed_wire_gate_edges.png", - "homedecor_fence_barbed_wire_gate_backside.png", - "homedecor_fence_barbed_wire_gate_front.png" - }, - paramtype = "light", - is_ground_content = true, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - paramtype2 = "facedir", - selection_box = { - type = "fixed", - fixed = { -0.5, -0.5, 0.375, 0.5, 0.5, 0.5 } - }, - node_box = { - type = "fixed", - fixed = { - { -8/16, -8/16, 6/16, -6/16, 8/16, 8/16 }, -- left post - { 6/16, -8/16, 6/16, 8/16, 8/16, 8/16 }, -- right post - { -8/16, 7/16, 13/32, 8/16, 8/16, 15/32 }, -- top piece - { -8/16, -8/16, 13/32, 8/16, -7/16, 15/32 }, -- bottom piece - { -6/16, -8/16, 7/16, 6/16, 8/16, 7/16 } -- the wire - } - }, -}) - -minetest.register_node("homedecor:fence_barbed_wire_gate_open", { - drawtype = "nodebox", - description = S("Barbed Wire Fence Gate"), - tiles = { - "homedecor_fence_barbed_wire_gate_edges.png", - "homedecor_fence_barbed_wire_gate_edges.png", - "homedecor_fence_barbed_wire_gate_front.png", - "homedecor_fence_barbed_wire_gate_backside.png", - "homedecor_fence_barbed_wire_gate_edges.png", - "homedecor_fence_barbed_wire_gate_edges.png" - }, - paramtype = "light", - is_ground_content = true, - groups = {snappy=3, not_in_creative_inventory=1}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - paramtype2 = "facedir", - selection_box = { - type = "fixed", - fixed = { 0.375, -0.5, -0.5, 0.5, 0.5, 0.5 } - }, - node_box = { - type = "fixed", - fixed = { - { 6/16, -8/16, -8/16, 8/16, 8/16, -6/16 }, -- left post - { 6/16, -8/16, 6/16, 8/16, 8/16, 8/16 }, -- right post - { 13/32, 7/16, -8/16, 15/32, 8/16, 8/16 }, -- top piece - { 13/32, -8/16, -8/16, 15/32, -7/16, 8/16 }, -- bottom piece - { 7/16, -8/16, -6/16, 7/16, 8/16, 6/16 } -- the wire - } - }, - drop = "homedecor:fence_barbed_wire_gate_closed" -}) - -minetest.register_node("homedecor:fence_chainlink_gate_closed", { - drawtype = "nodebox", - description = S("Chainlink Fence Gate"), - tiles = { - "homedecor_fence_chainlink_gate_tb.png", - "homedecor_fence_chainlink_gate_tb.png", - "homedecor_fence_chainlink_gate_sides.png", - "homedecor_fence_chainlink_gate_sides.png", - "homedecor_fence_chainlink_gate_backside.png", - "homedecor_fence_chainlink_gate_front.png", - }, - paramtype = "light", - is_ground_content = true, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - paramtype2 = "facedir", - selection_box = { - type = "fixed", - fixed = { -0.5, -0.5, 0.375, 0.5, 0.5, 0.5 } - }, - node_box = { - type = "fixed", - fixed = { - { -8/16, -8/16, 6/16, -7/16, 8/16, 8/16 }, -- left post - { 6/16, -8/16, 6/16, 8/16, 8/16, 8/16 }, -- right post - { -8/16, 7/16, 13/32, 8/16, 8/16, 15/32 }, -- top piece - { -8/16, -8/16, 13/32, 8/16, -7/16, 15/32 }, -- bottom piece - { -8/16, -8/16, 7/16, 8/16, 8/16, 7/16 }, -- the chainlink itself - { -8/16, -3/16, 6/16, -6/16, 3/16, 8/16 } -- the lump representing the lock - } - }, -}) - -minetest.register_node("homedecor:fence_chainlink_gate_open", { - drawtype = "nodebox", - description = S("Chainlink Fence Gate (open)"), - tiles = { - "homedecor_fence_chainlink_gate_tb.png", - "homedecor_fence_chainlink_gate_tb.png", - "homedecor_fence_chainlink_gate_front.png", - "homedecor_fence_chainlink_gate_backside.png", - "homedecor_fence_chainlink_gate_sides.png", - "homedecor_fence_chainlink_gate_sides.png", - }, - paramtype = "light", - is_ground_content = true, - groups = {snappy=3, not_in_creative_inventory=1}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - paramtype2 = "facedir", - selection_box = { - type = "fixed", - fixed = { 0.375, -0.5, -0.5, 0.5, 0.5, 0.5 } - }, - node_box = { - type = "fixed", - fixed = { - { 6/16, -8/16, -8/16, 8/16, 8/16, -7/16 }, -- left post - { 6/16, -8/16, 6/16, 8/16, 8/16, 8/16 }, -- right post - { 13/32, 7/16, -8/16, 15/32, 8/16, 8/16 }, -- top piece - { 13/32, -8/16, -8/16, 15/32, -7/16, 8/16 }, -- bottom piece - { 7/16, -8/16, -8/16, 7/16, 8/16, 8/16 }, -- the chainlink itself - { 6/16, -3/16, -8/16, 8/16, 3/16, -6/16 } -- the lump representing the lock - } - }, - drop = "homedecor:fence_chainlink_gate_closed" -}) - -minetest.register_on_punchnode(function (pos, node) - if node.name=="homedecor:fence_picket_gate_white_closed" then - fdir=node.param2 - minetest.env:add_node(pos, { name = "homedecor:fence_picket_gate_white_open", param2 = fdir }) - end -end) - -minetest.register_on_punchnode(function (pos, node) - if node.name=="homedecor:fence_picket_gate_white_open" then - fdir=node.param2 - minetest.env:add_node(pos, { name = "homedecor:fence_picket_gate_white_closed", param2 = fdir }) - end -end) - -minetest.register_on_punchnode(function (pos, node) - if node.name=="homedecor:fence_picket_gate_closed" then - fdir=node.param2 - minetest.env:add_node(pos, { name = "homedecor:fence_picket_gate_open", param2 = fdir }) - end -end) - -minetest.register_on_punchnode(function (pos, node) - if node.name=="homedecor:fence_picket_gate_open" then - fdir=node.param2 - minetest.env:add_node(pos, { name = "homedecor:fence_picket_gate_closed", param2 = fdir }) - end -end) - -minetest.register_on_punchnode(function (pos, node) - if node.name=="homedecor:fence_barbed_wire_gate_closed" then - fdir=node.param2 - minetest.env:add_node(pos, { name = "homedecor:fence_barbed_wire_gate_open", param2 = fdir }) - end -end) - -minetest.register_on_punchnode(function (pos, node) - if node.name=="homedecor:fence_barbed_wire_gate_open" then - fdir=node.param2 - minetest.env:add_node(pos, { name = "homedecor:fence_barbed_wire_gate_closed", param2 = fdir }) - end -end) - -minetest.register_on_punchnode(function (pos, node) - if node.name=="homedecor:fence_chainlink_gate_closed" then - fdir=node.param2 - minetest.env:add_node(pos, { name = "homedecor:fence_chainlink_gate_open", param2 = fdir }) - end -end) - -minetest.register_on_punchnode(function (pos, node) - if node.name=="homedecor:fence_chainlink_gate_open" then - fdir=node.param2 - minetest.env:add_node(pos, { name = "homedecor:fence_chainlink_gate_closed", param2 = fdir }) - end -end) - minetest.register_alias("homedecor:fence_wood_with_sign", "signs:sign_post") homedecor_register_fence_with_sign("default:fence_wood", "signs:sign_post") diff --git a/init.lua b/init.lua index ce22cd8..8a88599 100644 --- a/init.lua +++ b/init.lua @@ -72,7 +72,7 @@ dofile(minetest.get_modpath("homedecor").."/shutters.lua") dofile(minetest.get_modpath("homedecor").."/shingles.lua") dofile(minetest.get_modpath("homedecor").."/door_models.lua") -dofile(minetest.get_modpath("homedecor").."/door_nodes.lua") +dofile(minetest.get_modpath("homedecor").."/doors_and_gates.lua") dofile(minetest.get_modpath("homedecor").."/signs_lib.lua") dofile(minetest.get_modpath("homedecor").."/fences.lua") diff --git a/textures/homedecor_fence_barbed_wire_gate_backside.png b/textures/homedecor_gate_barbed_wire_back.png similarity index 100% rename from textures/homedecor_fence_barbed_wire_gate_backside.png rename to textures/homedecor_gate_barbed_wire_back.png diff --git a/textures/homedecor_fence_barbed_wire_gate_edges.png b/textures/homedecor_gate_barbed_wire_bottom.png similarity index 100% rename from textures/homedecor_fence_barbed_wire_gate_edges.png rename to textures/homedecor_gate_barbed_wire_bottom.png diff --git a/textures/homedecor_fence_barbed_wire_gate_front.png b/textures/homedecor_gate_barbed_wire_front.png similarity index 100% rename from textures/homedecor_fence_barbed_wire_gate_front.png rename to textures/homedecor_gate_barbed_wire_front.png diff --git a/textures/homedecor_gate_barbed_wire_left.png b/textures/homedecor_gate_barbed_wire_left.png new file mode 100644 index 0000000000000000000000000000000000000000..df12cedca73a0d0c3922403e1f02373ebff669af GIT binary patch literal 397 zcmV;80doF{P)P!7WeiKAr2nk%r$0XPh&K}Z1&N|emY9=ACHuKg#~Zw@cdxOuqCoV)E86x**CsKVI--fL#GI2&WKi>7AI0)`F6XlI@M*FjF$S?Ivl8 rKB`h7j);bFiZQ@}6zlb^Kv~=$>fMsesf*|p00000NkvXXu0mjfv!AA7 literal 0 HcmV?d00001 diff --git a/textures/homedecor_gate_barbed_wire_right.png b/textures/homedecor_gate_barbed_wire_right.png new file mode 100644 index 0000000000000000000000000000000000000000..df12cedca73a0d0c3922403e1f02373ebff669af GIT binary patch literal 397 zcmV;80doF{P)P!7WeiKAr2nk%r$0XPh&K}Z1&N|emY9=ACHuKg#~Zw@cdxOuqCoV)E86x**CsKVI--fL#GI2&WKi>7AI0)`F6XlI@M*FjF$S?Ivl8 rKB`h7j);bFiZQ@}6zlb^Kv~=$>fMsesf*|p00000NkvXXu0mjfv!AA7 literal 0 HcmV?d00001 diff --git a/textures/homedecor_gate_barbed_wire_top.png b/textures/homedecor_gate_barbed_wire_top.png new file mode 100644 index 0000000000000000000000000000000000000000..df12cedca73a0d0c3922403e1f02373ebff669af GIT binary patch literal 397 zcmV;80doF{P)P!7WeiKAr2nk%r$0XPh&K}Z1&N|emY9=ACHuKg#~Zw@cdxOuqCoV)E86x**CsKVI--fL#GI2&WKi>7AI0)`F6XlI@M*FjF$S?Ivl8 rKB`h7j);bFiZQ@}6zlb^Kv~=$>fMsesf*|p00000NkvXXu0mjfv!AA7 literal 0 HcmV?d00001 diff --git a/textures/homedecor_fence_chainlink_gate_backside.png b/textures/homedecor_gate_chainlink_back.png similarity index 100% rename from textures/homedecor_fence_chainlink_gate_backside.png rename to textures/homedecor_gate_chainlink_back.png diff --git a/textures/homedecor_fence_chainlink_gate_tb.png b/textures/homedecor_gate_chainlink_bottom.png similarity index 100% rename from textures/homedecor_fence_chainlink_gate_tb.png rename to textures/homedecor_gate_chainlink_bottom.png diff --git a/textures/homedecor_fence_chainlink_gate_front.png b/textures/homedecor_gate_chainlink_front.png similarity index 100% rename from textures/homedecor_fence_chainlink_gate_front.png rename to textures/homedecor_gate_chainlink_front.png diff --git a/textures/homedecor_fence_chainlink_gate_sides.png b/textures/homedecor_gate_chainlink_left.png similarity index 100% rename from textures/homedecor_fence_chainlink_gate_sides.png rename to textures/homedecor_gate_chainlink_left.png diff --git a/textures/homedecor_gate_chainlink_right.png b/textures/homedecor_gate_chainlink_right.png new file mode 100644 index 0000000000000000000000000000000000000000..3033279ef74ee083d12f4f39aa34b4ca6b83e41d GIT binary patch literal 505 zcmV z=kwthV<`myRP{VhM09D+xz>8UUf=I`N-2a8V;p0!s>T@a_d5UpfUCzCV+;TYA@~6i zpU-DXi4aj$y#o;efSHXk{8v@ogNUs)5uuclh#;bf_`##h%*=eAoOADeUDpr-@B4ne zUJ=owYpvb{0LB=e<_RJaLZC6m_xp7SIp=j<9e}Dbv!~Ts=XrJ~G4njnF-9}1wI0Wj zbM^#ByetbM)>?_k%-GCCL{-g>oQX(P+00b+cDpgNs=7NOx;p>> z05c!QQA+8(uj`74lu{xh062~V0AdD!FviSrApqo@w{4@=8Z-aj2w@^Jv);Rz#pzn> zG)-Jearcm)=UGHlHI{J?0EkFRNmWIJhGE$EJ+{B!FCwaHEQ8hg5fLI1B97yDx(~59 zYG!97GjsQp67T!|o0vr;93x`RSwxQG2%s?l0J-}x3}zO{PbVT$N{Nfqa6iX>oYmE|4c|;VEGgTDg?ol~0|H@X?h#QpRjUZyYm-A5(A}-4k zzT>wOe*_4Vz4!3UrIgR-bHCq-h?(7e-}iAG14hI(vt?NxkB5kGz<$5qDW!-t3{XE z)7O>#4jUJ%CiA4g{4Su7kf)1dh{fsT1PRu~2_ijA91ILB0t}3;_N$73vJ9TCelF{r G5}E*olopo& literal 0 HcmV?d00001 diff --git a/textures/homedecor_fence_picket_gate.png b/textures/homedecor_gate_picket_front.png similarity index 100% rename from textures/homedecor_fence_picket_gate.png rename to textures/homedecor_gate_picket_front.png diff --git a/textures/homedecor_gate_picket_left.png b/textures/homedecor_gate_picket_left.png new file mode 100644 index 0000000000000000000000000000000000000000..54da3c2c18f715d0091b12e1ac5735d7001c44f1 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#4jUJ%CiA4g{4Su7kf)1dh{fsT1PRu~2_ijA91ILB0t}3;_N$73vJ9TCelF{r G5}E*olopo& literal 0 HcmV?d00001 diff --git a/textures/homedecor_gate_picket_right.png b/textures/homedecor_gate_picket_right.png new file mode 100644 index 0000000000000000000000000000000000000000..54da3c2c18f715d0091b12e1ac5735d7001c44f1 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#4jUJ%CiA4g{4Su7kf)1dh{fsT1PRu~2_ijA91ILB0t}3;_N$73vJ9TCelF{r G5}E*olopo& literal 0 HcmV?d00001 diff --git a/textures/homedecor_gate_picket_top.png b/textures/homedecor_gate_picket_top.png new file mode 100644 index 0000000000000000000000000000000000000000..54da3c2c18f715d0091b12e1ac5735d7001c44f1 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#4jUJ%CiA4g{4Su7kf)1dh{fsT1PRu~2_ijA91ILB0t}3;_N$73vJ9TCelF{r G5}E*olopo& literal 0 HcmV?d00001 diff --git a/textures/homedecor_fence_picket_gate_white_backside.png b/textures/homedecor_gate_picket_white_back.png similarity index 100% rename from textures/homedecor_fence_picket_gate_white_backside.png rename to textures/homedecor_gate_picket_white_back.png diff --git a/textures/homedecor_gate_picket_white_bottom.png b/textures/homedecor_gate_picket_white_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..54da3c2c18f715d0091b12e1ac5735d7001c44f1 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#4jUJ%CiA4g{4Su7kf)1dh{fsT1PRu~2_ijA91ILB0t}3;_N$73vJ9TCelF{r G5}E*olopo& literal 0 HcmV?d00001 diff --git a/textures/homedecor_fence_picket_gate_white.png b/textures/homedecor_gate_picket_white_front.png similarity index 100% rename from textures/homedecor_fence_picket_gate_white.png rename to textures/homedecor_gate_picket_white_front.png diff --git a/textures/homedecor_gate_picket_white_left.png b/textures/homedecor_gate_picket_white_left.png new file mode 100644 index 0000000000000000000000000000000000000000..54da3c2c18f715d0091b12e1ac5735d7001c44f1 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#4jUJ%CiA4g{4Su7kf)1dh{fsT1PRu~2_ijA91ILB0t}3;_N$73vJ9TCelF{r G5}E*olopo& literal 0 HcmV?d00001 diff --git a/textures/homedecor_gate_picket_white_right.png b/textures/homedecor_gate_picket_white_right.png new file mode 100644 index 0000000000000000000000000000000000000000..54da3c2c18f715d0091b12e1ac5735d7001c44f1 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#4jUJ%CiA4g{4Su7kf)1dh{fsT1PRu~2_ijA91ILB0t}3;_N$73vJ9TCelF{r G5}E*olopo& literal 0 HcmV?d00001 diff --git a/textures/homedecor_gate_picket_white_top.png b/textures/homedecor_gate_picket_white_top.png new file mode 100644 index 0000000000000000000000000000000000000000..54da3c2c18f715d0091b12e1ac5735d7001c44f1 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#4jUJ%CiA4g{4Su7kf)1dh{fsT1PRu~2_ijA91ILB0t}3;_N$73vJ9TCelF{r G5}E*olopo& literal 0 HcmV?d00001