pax_global_header00006660000000000000000000000064133615746010014520gustar00rootroot0000000000000052 comment=08ca96708f3a0493b5c7a1b9d809cef97b02d4c5 lucky_block/000077500000000000000000000000001336157460100133655ustar00rootroot00000000000000lucky_block/README.md000066400000000000000000000021461336157460100146470ustar00rootroot00000000000000Lucky Block mod [lucky_block] This mod adds a new and exciting block to the game which when broken can give the player something good, surprising, bad, hurtful or just simply a troll. Lucky Blocks can be crafted with 1 chest surrounded by gold ingots. The api.txt document shows how to add your own blocks to the list by using one of the 9 commands included and the blocks.lua file gives you many examples by using some of the popular mods available. https://forum.minetest.net/viewtopic.php?f=9&t=13284 Changelog: - 0.1 - Initial release - 0.2 - New api commands added thanks to blert2112 - 0.3 - New blocks added, also error checking, new options and schematic rehaul - 0.4 - Added ability to add custom functions within lucky blocks - 0.5 - Explosions now have radius and fire setting, also added new blocks - 0.6 - Use TNT mod for explosions and if not active do entity damage only - 0.7 - Added new floor feature and moreblocks support - 0.8 - Added wishing well with random block drops - 0.9 - Tweak item drops, add replacements to schematics, tidy wishing well code Lucky Blocks: 252 (depending on mods enabled) lucky_block/api.txt000066400000000000000000000160701336157460100147030ustar00rootroot00000000000000 Lucky Block API =============== This guide will show you how to add schematic files and lucky blocks from within your own mods. Please make sure that lucky_block appears in the depends.txt file of your mod so everything work properly. Function Usage ============== Purge Block List ---------------- lucky_block:purge_block_list() This command is used to clear all of the blocks in the lucky block list so that you can add your own. Add Lucky Blocks to list ------------------------ lucky_block:add_blocks({ block definitions here }) This command is used to add new blocks to the lucky block list. e.g. lucky_block:add_blocks({ {"nod", "default:dirt", 0}, {"dro", {"default:dirt"}, 5}, }) Purge Chest Items ----------------- lucky_block:purge_chest_items() This command is used to purge all items in the default chest list so that you can add your own. Add Items to Default Chest -------------------------- lucky_block:add_chest_items({ add new default chest items here }) This command lets you add new items to the default chest when it appears inside a lucky block. e.g. lucky_block:add_chest_items({ {name = "default:apple", max = 3}, {name = "default:steel_ingot", max = 2}, {name = "default:pick_steel", max = 1} }) Add Schematics to List ---------------------- lucky_block:add_schematics({ add new schematic definitions here }) This command lets you add schematic files and arrays to the list so they can be added to the lucky block list. e.g. check for Ethereal mod then get the path and add two of the tree's to the schematic list and finally to the lucky block list: if minetest.get_modpath("ethereal") then local path = minetest.get_modpath("ethereal") .. "/schematics/" lucky_block:add_schematics({ -- name on list, schematic, offset placement {"appletree", ethereal.appletree, {x = 1, y = 0, z = 1}}, {"bananatree", ethereal.bananatree, {x = 3, y = 0, z = 3}}, } lucky_block:add_blocks({ {"sch", "appletree", 0, false}, {"sch", "bananatree", 0, false}, }) end Lucky Block Commands ==================== Using the lucky_block:add_blocks() command gives you access to many features from within this mod, these are listed below using this general format: lucky_block:add_blocks({ {"command", command options}, ..etc }) Place Node ---------- This command will place a node in place of the lucky block or at the players standing position. {"nod", "node name", position, chest items} e.g. Place a dirt block where lucky block was {"nod", "default:dirt", 0} Place a chest containing random items from default chest items list {"nod", "default:chest", 0} Place chest as above only add up to 5x roses as well {"nod", "default:chest", 0, { {name = "flowers:rose, max = 4} }} Place fire at player position {"nod", "fire:basic_flame", 1} Drop Item(s) ------------ This command will throw a single or multiple items out of a lucky block, random colours can be used also. {"dro", {"item names"}, how many to drop, use random colours} e.g. Drop 5x torches as itemstack {"dro", {"default:torch"}, 5} Drop 10x randomly coloured wool (colour name added to end of item string) {"dro", {"wool:"}, 10, true} Drop 1x random tool from list {"dro", {"default:pick_mese", "default:shovel_steel", "default:axe_diamond"}, 1} Place Schematic --------------- This command lets you place a pre-added schematic file or definition in place of the lucky block or at the player position. {"sch", "schematic name", position, force placement, replacements} e.g. Place lucky platform at player position and force placement {"sch", "platform", 1, true} Place apple tree where lucky block use to be {"sch", "appletree", 0, false} Place apple tree where lucky block use to be and change wood into stone {"sch", "appletree", 0, false, {{"default:wood", "default:stone"}} } Spawn Entity or Mob ------------------- This command allows you to place a monster, animal or other entity. {"spw", "entity name", how many to spawn, tamed, owned, range, nametag} e.g. Spawn 2x Dirt Monsters over a radius of 10 blocks {"spw", "mobs:dirt_monster", 2, nil, nil, 10} Spawn 5x randomly coloured sheep (random colour only works with Mobs Redo sheep) {"spw", "mobs:sheep", 5} Spawn a single NPC who is tamed and owned by player and called "Bob" {"spw", "mobs:npc", 1, true, true, 1, "Bob"} Falling Blocks -------------- This command allows for a tower of blocks or blocks falling within a set area. {"fal", {"node list"}, position, spread, range} e.g. Drop 2x sand and 1x gold block spread over a range of 5 blocks {"fal", {"default:sand", "default:sand", "default:goldblock"}, 0, true, 5} Drop 3x obsidian onto player as a tower {"fal", {"default:obsidian", "default:obsidian", "default:obsidian"}, 1} Troll Block ----------- This command is similar to the place node command only it allows for a sound to be played on placement, then after two seconds the block will disappear or can explode causing damage to nearby players. {"tro", "node name", "sound", explode} e.g. Add diamond block then after 2 seconds remove with explosion {"tro", "default:diamondblock", nil, true} Add gold block with wood sound, then after 2 seconds remove with pop {"tro", "default:goldblock", "default_wood_footstep", nil} Random Teleport --------------- This command will teleport the player opening the lucky block a random number of blocks away using a preset range. {"tel", horizontal range, vertical range} e.g. Teleport player to random position 10 blocks left/right and 5 blocks up/under {"tel", 10, 5} Explosion --------- Now we start adding the bad lucky blocks that cause damage to the player by adding explosions. {"exp", radius} e.g. Cause explosion with damage radius of 4. {"exp", 4} Lightning Strike ---------------- This is one of my favourite commands, lightning strikes the player and hurts everyone else nearby, can also place fire at strike position. {"lig", "fire node"} e.g. Strike player and place temporary fire {"lig", "fire:basic_flame"} Strike player and place permanent flame {"lig", "fire:permanent_flame"} Floor Placement --------------- This feature places random blocks from the list provided to make a floor under the lucky block with a pause after each block. {"flo", width, {node_list}, offset}, e.g. Place a three wide obsidian and gold block floor with offset of 1 to centre on lucky block {"flo", 3, {"default:goldblock", "default:obsidian"}, 1} Have a woolen floor at 5 width with offset of 2 to keep it centred {"flo", 5, {"wool:red", "wool:blue", "wool:white", "wool:orange"}, 2} Custom Function --------------- This allows mod makers to use there own functions when opening lucky blocks and passes the block position and player opening it. {"cus", myfunction} e.g. Punch player and deal 5 damage points (function first then line to add l.block) local function punchy(pos, player) player:punch(player, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 5} }, nil) end {"cus", punchy} Final Words =========== I hope this guide helps you add lucky blocks from within your own mods and for more examples please check out the blocks.lua and schems.lua files. lucky_block/blocks.lua000066400000000000000000000501661336157460100153550ustar00rootroot00000000000000 -- Load support for intllib. local MP = minetest.get_modpath(minetest.get_current_modname()) local S, NS = dofile(MP .. "/intllib.lua") -- Default tree schematics local dpath = minetest.get_modpath("default") .. "/schematics/" lucky_block:add_schematics({ {"appletree", dpath .. "apple_tree_from_sapling.mts", {x = 2, y = 1, z = 2}}, {"jungletree", dpath .. "jungle_tree_from_sapling.mts", {x = 2, y = 1, z = 2}}, {"defpinetree", dpath .. "pine_tree_from_sapling.mts", {x = 2, y = 1, z = 2}}, {"acaciatree", dpath .. "acacia_tree_from_sapling.mts", {x = 4, y = 1, z = 4}}, {"aspentree", dpath .. "aspen_tree_from_sapling.mts", {x = 2, y = 1, z = 2}}, {"corals", dpath .. "corals.mts", {x = 2, y = 1, z = 2}}, {"largecactus", dpath .. "large_cactus.mts", {x = 2, y = 0, z = 0}}, {"defaultbush", dpath .. "bush.mts", {x = 1, y = 1, z = 1}}, {"acaciabush", dpath .. "acacia_bush.mts", {x = 1, y = 1, z = 1}}, }) -- Default blocks lucky_block:add_blocks({ {"lig"}, {"fal", {"default:wood", "default:gravel", "default:sand", "default:desert_sand", "default:stone", "default:dirt", "default:goldblock"}, 0}, {"sch", "watertrap", 1, true}, {"tel"}, {"dro", {"default:apple"}, 10}, {"sch", "appletree", 0, false}, {"dro", {"default:snow"}, 10}, {"nod", "default:chest", 0, { {name = "bucket:bucket_water", max = 1}, {name = "default:wood", max = 3}, {name = "default:pick_diamond", max = 1}, {name = "default:coal_lump", max = 3} } }, {"sch", "sandtrap", 1, true}, {"sch", "defpinetree", 0, false}, {"sch", "lavatrap", 1, true}, {"dro", {"default:mese_crystal_fragment"}, 15}, {"dro", {"default:mese_crystal"}, 10}, {"dro", {"default:mese"}, 1}, {"exp", 2}, {"sch", "acaciabush", 0, false}, {"nod", "default:diamondblock", 0}, {"nod", "default:steelblock", 0}, {"nod", "default:dirt", 0}, {"nod", "default:chest", 0, { {name = "default:dirt", max = 15}, {name = "default:dirt_with_dry_grass", max = 15}, {name = "default:dirt_with_rainforest_litter", max = 15}, {name = "default:dirt_with_grass", max = 15}, {name = "default:dirt_with_snow", max = 15}, }}, {"dro", {"dye:"}, 10, true}, {"dro", {"default:sword_steel"}}, {"sch", "jungletree", 0, false}, {"sch", "sandtrap", 1, true, {{"default:sand", "default:silver_sand"}} }, {"dro", {"default:pick_steel"}}, {"dro", {"default:shovel_steel"}}, {"exp"}, {"dro", {"default:coal_lump"}, 3}, {"sch", "defaultbush", 0, false}, {"tro", "default:mese", "tnt_blast", true}, {"sch", "acaciatree", 0, false}, {"dro", {"default:axe_steel"}}, {"dro", {"default:sword_bronze"}}, {"exp", 3}, {"nod", "default:chest", 0, { {name = "default:acacia_sapling", max = 10}, {name = "default:aspen_sapling", max = 10}, {name = "default:pine_sapling", max = 10}, {name = "default:sapling", max = 10}, {name = "default:junglesapling", max = 10}, {name = "default:acacia_bush_sapling", max = 5}, {name = "default:bush_sapling", max = 5}, }}, {"sch", "platform", 1, true}, {"nod", "default:wood", 0}, {"dro", {"default:pick_bronze"}}, {"sch", "aspentree", 0, false}, {"dro", {"default:shovel_bronze"}}, {"nod", "default:gravel", 0}, {"sch", "sandtrap", 1, true, {{"default:sand", "default:gravel"}} }, {"sch", "largecactus", 0, false}, {"dro", {"default:axe_bronze"}}, {"dro", {"default:bookshelf", "default:book", "default:paper"}, 5}, {"dro", {"default:fence_wood"}, 10}, {"dro", {"default:fence_acacia_wood"}, 10}, {"dro", {"default:fence_aspen_wood"}, 10}, {"dro", {"default:fence_junglewood"}, 10}, {"dro", {"default:fence_pine_wood"}, 10}, {"sch", "obsidiantrap", 1, true}, {"sch", "sandtrap", 1, true, {{"default:sand", "default:desert_sand"}} }, {"nod", "default:chest", 0, { {name = "default:acacia_wood", max = 10}, {name = "default:aspen_wood", max = 10}, {name = "default:pine_wood", max = 10}, {name = "default:wood", max = 10}, {name = "default:junglewood", max = 10}, }}, {"nod", "default:chest", 0, { {name = "default:acacia_tree", max = 10}, {name = "default:aspen_tree", max = 10}, {name = "default:pine_tree", max = 10}, {name = "default:tree", max = 10}, {name = "default:jungletree", max = 10}, }}, {"dro", {"default:coral_brown"}, 5}, {"dro", {"default:coral_orange"}, 5}, {"dro", {"default:coral_skeleton"}, 5}, {"sch", "corals", 0, true}, {"dro", {"default:mese_post_light"}, 5}, {"dro", {"default:fence_wood"}, 5}, {"nod", "default:mese_post_light"}, {"dro", {"default:silver_sand"}, 20}, {"dro", {"default:sand"}, 20}, {"dro", {"default:desert_sand"}, 20}, {"dro", {"default:gravel"}, 15}, {"nod", "default:chest", 0, { {name = "default:silver_sand", max = 20}, {name = "default:silver_sandstone", max = 20}, {name = "default:desert_sand", max = 20}, {name = "default:silver_sandstone", max = 20}, {name = "default:sand", max = 20}, {name = "default:sandstone", max = 20}, {name = "default:gravel", max = 20}, }}, }) local green = minetest.get_color_escape_sequence("#1eff00") -- custom function (punches player with 5 damage) local function punchy(pos, player) player:punch(player, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 5} }, nil) minetest.sound_play("player_damage", {pos = pos, gain = 1.0}) minetest.chat_send_player(player:get_player_name(), green .. S("Stop hitting yourself!")) end -- custom function (pint sized player) local function pint(pos, player) player:set_properties({visual_size = {x = 0.5, y = 0.5}}) minetest.chat_send_player(player:get_player_name(), green .. S("Pint Sized Player!")) minetest.sound_play("default_place_node", {pos = pos, gain = 1.0}) minetest.after (180, function(player, pos) -- 3 minutes if player and player:is_player() then player:set_properties({visual_size = {x = 1.0, y = 1.0}}) minetest.sound_play("default_place_node", {pos = pos, gain = 1.0}) end end, player) end -- custom function (drop player inventory and replace with dry shrubs) local function bushy(pos, player) local player_inv = player:get_inventory() pos = player:get_pos() or pos for i = 1, player_inv:get_size("main") do local obj = minetest.add_item(pos, player_inv:get_stack("main", i)) if obj then obj:setvelocity({ x = math.random(-10, 10) / 9, y = 5, z = math.random(-10, 10) / 9, }) end player_inv:set_stack("main", i, "default:dry_shrub") end minetest.chat_send_player(player:get_player_name(), green .. S("Dry shrub takeover!")) end lucky_block:add_blocks({ {"cus", pint}, {"cus", bushy}, {"cus", punchy}, }) -- wool mod if minetest.get_modpath("wool") then lucky_block:add_blocks({ {"dro", {"wool:"}, 10, true}, }) end -- extra doors mod if minetest.get_modpath("extra_doors") then lucky_block:add_blocks({ {"dro", {"default:steel_rod"}, 10}, {"dro", {"extra_doors:door_woodpanel1"}, 1}, {"dro", {"extra_doors:door_woodglass1"}, 1}, {"dro", {"extra_doors:door_woodglass2"}, 1}, {"dro", {"extra_doors:door_door_japanese"}, 1}, {"dro", {"extra_doors:door_door_french"}, 1}, {"dro", {"extra_doors:door_door_cottage1"}, 1}, {"dro", {"extra_doors:door_door_cottage2"}, 1}, {"dro", {"extra_doors:door_door_barn1"}, 1}, {"lig"}, {"dro", {"extra_doors:door_door_barn2"}, 1}, {"dro", {"extra_doors:door_door_castle1"}, 1}, {"dro", {"extra_doors:door_door_castle2"}, 1}, {"dro", {"extra_doors:door_door_mansion1"}, 1}, {"dro", {"extra_doors:door_door_mansion2"}, 1}, {"dro", {"extra_doors:door_door_dungeon1"}, 1}, {"dro", {"extra_doors:door_door_dungeon2"}, 1}, {"dro", {"extra_doors:door_door_steelpanel1"}, 1}, {"dro", {"extra_doors:door_door_steelglass1"}, 1}, {"dro", {"extra_doors:door_door_steelglass2"}, 1}, }) end -- Flowers mod if minetest.get_modpath("flowers") then lucky_block:add_blocks({ {"nod", "flowers:rose", 0}, {"dro", {"flowers:mushroom_red"}, 5}, {"dro", {"flowers:mushroom_brown"}, 5}, {"dro", {"flowers:rose", "flowers:tulip", "flowers:dandelion_yellow", "flowers:geranium", "flowers:viola", "flowers:dandelion_white"}, 12}, {"nod", "default:chest", 0, { {name = "flowers:geranium", max = 15}, {name = "flowers:viola", max = 15}, {name = "flowers:dandelion_white", max = 15}, {name = "flowers:dandelion_yellow", max = 15}, {name = "flowers:tulip", max = 15}, {name = "flowers:rose", max = 15}, {name = "flowers:mushroom_brown", max = 10}, {name = "flowers:mushroom_red", max = 10}, {name = "flowers:waterlily", max = 10}, }}, }) end -- Doors mod if minetest.get_modpath("doors") then lucky_block:add_blocks({ {"dro", {"doors:door_wood"}}, {"dro", {"doors:door_steel"}}, {"dro", {"doors:door_glass"}}, {"dro", {"doors:door_obsidian_glass"}}, {"dro", {"doors:trapdoor"}}, {"dro", {"doors:trapdoor_steel"}}, {"dro", {"doors:gate_acacia_wood_closed"}}, {"dro", {"doors:gate_aspen_wood_closed"}}, {"dro", {"doors:gate_wood_closed"}}, {"dro", {"doors:gate_pine_wood_closed"}}, {"dro", {"doors:gate_junglewood_closed"}}, }) end -- Screwdriver mod if minetest.get_modpath("screwdriver") then if screwdriver and screwdriver.handler then minetest.register_tool(":screwdriver:screwdriver_magenta", { description = S("Super Mega Magenta Ultra Screwdriver 2500\n(left-click to rotate face, right-click to rotates axis)"), inventory_image = "screwdriver.png^[colorize:#ff009970", groups = {not_in_creative_inventory = 1}, on_use = function(itemstack, user, pointed_thing) screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_FACE, 2500) return itemstack end, on_place = function(itemstack, user, pointed_thing) screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_AXIS, 2500) return itemstack end, }) end lucky_block:add_blocks({ {"dro", {"screwdriver:screwdriver"}}, {"dro", {"screwdriver:screwdriver_magenta"}}, }) end -- Vessels mod if minetest.get_modpath("vessels") then lucky_block:add_blocks({ {"dro", {"vessels:shelf", "vessels:drinking_glass", "vessels:glass_bottle", "vessels:steel_bottle", "vessels:glass_fragments"}, 5}, {"nod", "vessels:drinking_glass", 0}, {"nod", "vessels:glass_bottle", 0}, {"nod", "vessels:steel_bottle", 0}, }) end -- Farming mod (default) if minetest.get_modpath("farming") then lucky_block:add_blocks({ {"dro", {"farming:bread"}, 5}, {"sch", "instafarm", 0, true}, {"nod", "default:water_source", 1}, }) end -- Home Decor mod if minetest.get_modpath("homedecor") then lucky_block:add_blocks({ {"nod", "homedecor:toilet", 0}, {"nod", "homedecor:table", 0}, {"nod", "homedecor:chair", 0}, {"nod", "homedecor:table_lamp_off", 0}, {"dro", {"homedecor:plastic_sheeting", "homedecor:plastic_base"}, 15}, {"dro", {"homedecor:roof_tile_terracotta"}, 20}, {"dro", {"homedecor:shutter_oak"}, 5}, {"dro", {"homedecor:shutter_black"}, 5}, {"dro", {"homedecor:shutter_dark_grey"}, 5}, {"dro", {"homedecor:shutter_grey"}, 5}, {"dro", {"homedecor:shutter_white"}, 5}, {"dro", {"homedecor:shutter_mahogany"}, 5}, {"dro", {"homedecor:shutter_yellow"}, 5}, {"dro", {"homedecor:shutter_forest_green"}, 5}, {"dro", {"homedecor:shutter_light_blue"}, 5}, {"dro", {"homedecor:shutter_violet"}, 5}, {"dro", {"homedecor:table_legs_wrought_iron", "homedecor:utility_table_legs"}, 5}, {"dro", {"homedecor:pole_wrought_iron"}, 10}, {"dro", {"homedecor:fence_picket_white"}, 20}, }) end -- Boats mod if minetest.get_modpath("boats") then lucky_block:add_blocks({ {"dro", {"boats:boat"}}, }) end -- Beds mod if minetest.get_modpath("beds") then lucky_block:add_blocks({ {"dro", {"beds:bed"}}, {"dro", {"beds:fancy_bed"}}, }) end -- Walls mod if minetest.get_modpath("walls") then lucky_block:add_blocks({ {"dro", {"walls:cobble"}, 10}, {"dro", {"walls:mossycobble"}, 10}, {"dro", {"walls:desertcobble"}, 10}, }) end -- Carts mod if minetest.get_modpath("carts") or minetest.get_modpath("boost_cart") then lucky_block:add_blocks({ {"dro", {"carts:cart"}}, {"dro", {"default:rail"}, 10}, {"dro", {"carts:powerrail"}, 5}, }) end -- 3D Armor mod if minetest.get_modpath("3d_armor") then lucky_block:add_blocks({ {"dro", {"3d_armor:boots_wood"}}, {"dro", {"3d_armor:leggings_wood"}}, {"dro", {"3d_armor:chestplate_wood"}}, {"dro", {"3d_armor:helmet_wood"}}, {"tel"}, {"dro", {"3d_armor:boots_steel"}}, {"dro", {"3d_armor:leggings_steel"}}, {"dro", {"3d_armor:chestplate_steel"}}, {"dro", {"3d_armor:helmet_steel"}}, {"dro", {"3d_armor:boots_gold"}}, {"dro", {"3d_armor:leggings_gold"}}, {"dro", {"3d_armor:chestplate_gold"}}, {"exp"}, {"dro", {"3d_armor:helmet_gold"}}, {"dro", {"3d_armor:boots_cactus"}}, {"dro", {"3d_armor:leggings_cactus"}}, {"dro", {"3d_armor:chestplate_cactus"}}, {"dro", {"3d_armor:helmet_cactus"}}, {"dro", {"3d_armor:boots_bronze"}}, {"dro", {"3d_armor:leggings_bronze"}}, {"dro", {"3d_armor:chestplate_bronze"}}, {"dro", {"3d_armor:helmet_bronze"}}, {"lig"}, }) end -- 3D Armor's Shields mod if minetest.get_modpath("shields") then lucky_block:add_blocks({ {"dro", {"shields:shield_wood"}}, {"dro", {"shields:shield_steel"}}, {"dro", {"shields:shield_gold"}}, {"dro", {"shields:shield_cactus"}}, {"dro", {"shields:shield_bronze"}}, {"exp", 2}, }) end -- Fire mod if minetest.get_modpath("fire") then lucky_block:add_blocks({ {"dro", {"fire:flint_and_steel"}}, {"dro", {"default:flint"}, 5}, {"nod", "fire:basic_flame", 1}, {"nod", "fire:permanent_flame", 1}, {"sch", "firetrap", 1, true}, }) end -- Caverealms if minetest.get_modpath("caverealms") then lucky_block:add_blocks({ {"sch", "sandtrap", 1, true, {{"default:sand", "caverealms:coal_dust"}} }, {"sch", "obsidiantrap", 1, true, {{"default:obsidian", "caverealms:glow_obsidian_brick_2"}} }, {"flo", 5, {"caverealms:stone_with_moss"}, 2}, {"flo", 5, {"caverealms:stone_with_lichen"}, 2}, {"flo", 5, {"caverealms:stone_with_algae"}, 2}, }) end -- TNT mod if minetest.get_modpath("tnt") then local p = "tnt:tnt_burning" lucky_block:add_blocks({ {"dro", {"tnt:gunpowder"}, 5}, {"fal", {p, p, p, p, p}, 1, true, 4}, {"nod", "tnt:tnt_burning", 0}, }) end -- More Ore's mod if minetest.get_modpath("moreores") then lucky_block:add_blocks({ {"nod", "moreores:tin_block", 0}, {"nod", "moreores:silver_block", 0}, {"fal", {"default:sand", "default:sand", "default:sand", "default:sand", "default:sand", "default:sand", "moreores:mithril_block"}, 0}, {"dro", {"moreores:pick_silver"}}, {"dro", {"moreores:pick_mithril"}}, {"tro", "moreores:silver_block"}, {"dro", {"moreores:shovel_silver"}}, {"dro", {"moreores:shovel_mithril"}}, {"dro", {"moreores:axe_silver"}}, {"dro", {"moreores:axe_mithril"}}, {"tro", "moreores:mithril_block"}, {"dro", {"moreores:hoe_silver"}}, {"dro", {"moreores:hoe_mithril"}}, {"lig"}, {"nod", "default:chest", 0, { {name = "moreores:silver_lump", max = 10}, {name = "moreores:mithril_lump", max = 10}, {name = "default:copper_lump", max = 10}, {name = "default:gold_lump", max = 10}, {name = "default:iron_lump", max = 10}, {name = "default:tin_lump", max = 10}, {name = "default:coal_lump", max = 10}, {name = "default:clay_lump", max = 10}, }}, }) if minetest.get_modpath("3d_armor") then lucky_block:add_blocks({ {"dro", {"3d_armor:helmet_mithril"}}, {"dro", {"3d_armor:chestplate_mithril"}}, {"dro", {"3d_armor:leggings_mithril"}}, {"dro", {"3d_armor:boots_mithril"}}, }) end if minetest.get_modpath("shields") then lucky_block:add_blocks({ {"dro", {"shields:shield_mithril"}}, }) end end -- END moreores -- Moreblocks mod if minetest.get_modpath("moreblocks") then local p = "moreblocks:" local lav = {name = "default:lava_source"} local air = {name = "air"} local trs = {name = p.."trap_stone"} local trg = {name = p.."trap_glow_glass"} local trapstone_trap = { size = {x = 3, y = 6, z = 3}, data = { lav, lav, lav, air, air, air, air, air, air, air, air, air, air, air, air, trs, trs, trs, lav, lav, lav, air, air, air, air, air, air, air, air, air, air, trg, air, trs, air, trs, lav, lav, lav, air, air, air, air, air, air, air, air, air, air, air, air, trs, trs, trs, }, } lucky_block:add_schematics({ {"trapstonetrap", trapstone_trap, {x = 1, y = 6, z = 1}}, }) lucky_block:add_blocks({ {"dro", {p.."wood_tile"}, 10}, {"dro", {p.."wood_tile_center"}, 10}, {"dro", {p.."wood_tile_full"}, 10}, {"dro", {p.."wood_tile_offset"}, 10}, {"dro", {p.."circle_stone_bricks"}, 20}, {"dro", {p.."grey_bricks"}, 20}, {"dro", {p.."stone_tile"}, 10}, {"dro", {p.."split_stone_tile"}, 10}, {"dro", {p.."split_stone_tile_alt"}, 10}, {"flo", 5, {"moreblocks:stone_tile", "moreblocks:split_stone_tile"}, 2}, {"dro", {p.."tar", p.."cobble_compressed"}, 10}, {"dro", {p.."cactus_brick"}, 10}, {"dro", {p.."cactus_checker"}, 10}, {"nod", {p.."empty_bookshelf"}, 0}, {"dro", {p.."coal_stone"}, 10}, {"dro", {p.."coal_checker"}, 10}, {"dro", {p.."coal_stone_bricks"}, 10}, {"dro", {p.."coal_glass"}, 10}, {"exp", 3}, {"dro", {p.."iron_stone"}, 10}, {"dro", {p.."iron_checker"}, 10}, {"dro", {p.."iron_stone_bricks"}, 10}, {"dro", {p.."iron_glass"}, 10}, {"dro", {p.."trap_obsidian"}, 10}, {"dro", {p.."trap_sandstone"}, 10}, {"dro", {p.."trap_desert_stone"}, 10}, {"dro", {p.."trap_stone"}, 10}, {"dro", {p.."trap_glass"}, 10}, {"dro", {p.."trap_glow_glass"}, 10}, {"dro", {p.."trap_obsidian_glass"}, 10}, {"lig"}, {"sch", "trapstonetrap", 0, true}, {"dro", {p.."all_faces_tree"}, 10}, {"dro", {p.."all_faces_jungle_tree"}, 10}, {"dro", {p.."all_faces_pine_tree"}, 10}, {"dro", {p.."all_faces_acacia_tree"}, 10}, {"dro", {p.."all_faces_aspen_tree"}, 10}, {"flo", 3, {p.."all_faces_acacia_tree"}, 1}, {"dro", {p.."plankstone"}, 10}, {"fal", {p.."all_faces_tree", p.."all_faces_tree", p.."all_faces_tree", p.."all_faces_tree", p.."all_faces_tree"}, 0}, {"dro", {p.."glow_glass"}, 10}, {"dro", {p.."super_glow_glass"}, 10}, {"dro", {p.."clean_glass"}, 10}, {"nod", "default:chest", 0, { {name = p.."rope", max = 10}, {name = p.."sweeper", max = 1}, {name = p.."circular_saw", max = 1}, {name = p.."grey_bricks", max = 10}, {name = p.."tar", max = 3}}}, {"flo", 3, {"moreblocks:copperpatina"}, 1}, }) end -- Bags mod if minetest.get_modpath("bags") then lucky_block:add_blocks({ {"dro", {"bags:small"}}, {"dro", {"bags:medium"}}, {"dro", {"bags:large"}}, {"dro", {"bags:trolley"}}, }) end -- Additional Wishing Well Styles lucky_block:add_blocks({ {"sch", "wishingwell", 0, true}, {"sch", "wishingwell", 0, true, { {"default:stonebrick", "default:silver_sandstone_brick"}, {"stairs:slab_stonebrick", "stairs:slab_silver_sandstone_brick"}, {"default:fence_wood", "default:fence_aspen_wood"}, {"default:steelblock", "default:tinblock"}, } }, {"sch", "wishingwell", 0, true, { {"default:stonebrick", "default:sandstonebrick"}, {"stairs:slab_stonebrick", "stairs:slab_sandstonebrick"}, {"default:fence_wood", "default:fence_junglewood"}, {"default:steelblock", "default:goldblock"}, } }, {"sch", "wishingwell", 0, true, { {"default:stonebrick", "default:desert_stonebrick"}, {"stairs:slab_stonebrick", "stairs:slab_desert_stonebrick"}, {"default:fence_wood", "default:fence_acacia_wood"}, {"default:steelblock", "default:copperblock"}, } }, {"sch", "wishingwell", 0, true, { {"default:stonebrick", "default:desert_sandstone_brick"}, {"stairs:slab_stonebrick", "stairs:slab_desert_sandstone_brick"}, {"default:fence_wood", "default:fence_pine_wood"}, {"default:steelblock", "default:bronzeblock"}, } }, }) -- Special items minetest.register_node("lucky_block:void_mirror", { description = S("Void Mirror (Place to see through solid walls during daytime)"), drawtype = "normal", tiles = {"default_obsidian_glass.png^[brighten"}, use_texture_alpha = true, groups = {snappy = 3, not_in_creative_inventory = 1}, sounds = default.node_sound_glass_defaults(), }) lucky_block:add_blocks({ {"dro", {"lucky_block:void_mirror"}}, }) -- Troll local green = minetest.get_color_escape_sequence("#1eff00") local function fake_diamonds(pos, player) for n = 1, 25 do minetest.add_particle({ time = 15, pos = { x = pos.x + math.random(-20, 20) / 10, y = pos.y, z = pos.z + math.random(-20, 20) / 10, }, velocity = {x = 0, y = 2, z = 0}, acceleration = {x = 0, y = -10, z = 0}, expirationtime = 4, maxsize = 4, texture = "default_diamond.png", glow = 2, size = 5, collisiondetection = true, vertical = true, }) end minetest.chat_send_player(player:get_player_name(), green .. S("Wow! So many faux diamonds!")) end lucky_block:add_blocks({ {"cus", fake_diamonds}, }) lucky_block/depends.txt000066400000000000000000000000431336157460100155450ustar00rootroot00000000000000default tnt? screwdriver? intllib? lucky_block/description.txt000066400000000000000000000001241336157460100164460ustar00rootroot00000000000000Adds lucky blocks into the game which may give good, bad, hurtful items when open :)lucky_block/init.lua000066400000000000000000000337421336157460100150440ustar00rootroot00000000000000 lucky_block = {} lucky_schems = {} -- Load support for intllib. local MP = minetest.get_modpath(minetest.get_current_modname()) local S, NS = dofile(MP .. "/intllib.lua") -- a wee bit of colour local green = minetest.get_color_escape_sequence("#1eff00") -- default blocks local lucky_list = { {"nod", "lucky_block:super_lucky_block", 0}, } -- ability to add new blocks to list function lucky_block:add_blocks(list) for s = 1, #list do table.insert(lucky_list, list[s]) end end -- call to purge the block list function lucky_block:purge_block_list() lucky_list = { {"nod", "lucky_block:super_lucky_block", 0} } end -- add schematics to global list function lucky_block:add_schematics(list) for s = 1, #list do table.insert(lucky_schems, list[s]) end end -- import schematics and default blocks dofile(minetest.get_modpath("lucky_block") .. "/schems.lua") dofile(minetest.get_modpath("lucky_block") .. "/blocks.lua") -- for random colour selection local all_colours = { "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta", "orange", "violet", "brown", "pink", "dark_grey", "dark_green", "white" } -- default items in chests local chest_stuff = { {name = "default:apple", max = 3}, {name = "default:steel_ingot", max = 2}, {name = "default:gold_ingot", max = 2}, {name = "default:diamond", max = 1}, {name = "default:pick_steel", max = 1} } -- call to purge the chest items list function lucky_block:purge_chest_items() chest_stuff = {} end -- ability to add to chest items list function lucky_block:add_chest_items(list) for s = 1, #list do table.insert(chest_stuff, list[s]) end end -- particle effects local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow) radius = radius or 2 gravity = gravity or -10 minetest.add_particlespawner({ amount = amount, time = 0.25, minpos = pos, maxpos = pos, minvel = {x = -radius, y = -radius, z = -radius}, maxvel = {x = radius, y = radius, z = radius}, minacc = {x = 0, y = gravity, z = 0}, maxacc = {x = 0, y = gravity, z = 0}, minexptime = 0.1, maxexptime = 1, minsize = min_size or 0.5, maxsize = max_size or 1.0, texture = texture, glow = glow or 0, }) end -- temp entity for mob damage minetest.register_entity("lucky_block:temp", { physical = true, collisionbox = {0, 0, 0, 0, 0, 0}, visual_size = {x = 0, y = 0}, visual = "sprite", textures = {"tnt_smoke.png"}, on_step = function(self, dtime) self.timer = (self.timer or 0) + dtime if self.timer > 0.5 then self.object:remove() end end }) -- modified from TNT mod to deal entity damage only local function entity_physics(pos, radius) radius = radius * 2 local objs = minetest.get_objects_inside_radius(pos, radius) local obj_pos, dist -- add temp entity to cause damage local tmp_ent = minetest.add_entity(pos, "lucky_block:temp") for n = 1, #objs do obj_pos = objs[n]:get_pos() dist = vector.distance(pos, obj_pos) if dist < 1 then dist = 1 end local damage = math.floor((4 / dist) * radius) local ent = objs[n]:get_luaentity() if objs[n]:is_player() then objs[n]:set_hp(objs[n]:get_hp() - damage) else --if ent.health then objs[n]:punch(tmp_ent, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = damage}, }, pos) end end end -- fill chest with random items from list local function fill_chest(pos, items) local stacks = items or {} local inv = minetest.get_meta(pos):get_inventory() inv:set_size("main", 8 * 4) for i = 0, 2, 1 do local stuff = chest_stuff[math.random(1, #chest_stuff)] table.insert(stacks, {name = stuff.name, max = stuff.max}) end for s = 1, #stacks do if not inv:contains_item("main", stacks[s]) then inv:set_stack("main", math.random(1, 32), { name = stacks[s].name, count = math.random(1, stacks[s].max) }) end end end -- explosion with protection check local function explode(pos, radius, sound) sound = sound or "tnt_explode" if minetest.get_modpath("tnt") and tnt and tnt.boom and not minetest.is_protected(pos, "") then tnt.boom(pos, { radius = radius, damage_radius = radius, sound = sound, }) else minetest.sound_play(sound, {pos = pos, gain = 1.0, max_hear_distance = 32}) entity_physics(pos, radius) effect(pos, 32, "tnt_smoke.png", radius * 3, radius * 5, radius, 1, 0) end end local lb_schematic = function(pos, digger, def) if #lucky_schems == 0 then print ("[lucky block] No schematics") return end local schem = def[2] local switch = def[3] or 0 local force = def[4] local reps = def[5] or {} if switch == 1 then pos = vector.round(digger:get_pos()) end for i = 1, #lucky_schems do if schem == lucky_schems[i][1] then local p1 = vector.subtract(pos, lucky_schems[i][3]) minetest.place_schematic(p1, lucky_schems[i][2], "", reps, force) break end end if switch == 1 then digger:set_pos(pos, false) end end local lb_node = function(pos, digger, def) local nod = def[2] local switch = def[3] local items = def[4] if switch == 1 then pos = digger:get_pos() end if not minetest.registered_nodes[nod] then nod = "default:goldblock" end effect(pos, 25, "tnt_smoke.png", 8, 8, 2, 1, 0) minetest.set_node(pos, {name = nod}) if nod == "default:chest" then fill_chest(pos, items) end end local lb_spawn = function(pos, digger, def) local pos2 = {} local num = def[3] or 1 local tame = def[4] local own = def[5] local range = def[6] or 5 local name = def[7] for i = 1, num do pos2.x = pos.x + math.random(-range, range) pos2.y = pos.y + 1 pos2.z = pos.z + math.random(-range, range) local nod = minetest.get_node(pos2) local nodef = minetest.registered_nodes[nod.name] if nodef and nodef.walkable == false then local entity = def[2] -- coloured sheep if entity == "mobs:sheep" then local colour = "_" .. all_colours[math.random(#all_colours)] entity = "mobs:sheep" .. colour end -- has entity been registered? if minetest.registered_entities[entity] then local ent = minetest.add_entity(pos2, entity):get_luaentity() if tame then ent.tamed = true end if own then ent.owner = digger:get_player_name() end if name then ent.nametag = name ent.object:set_properties({ nametag = name, nametag_color = "#FFFF00" }) end else print ("[lucky_block] " .. entity .. " could not be spawned") end end end end local lb_explode = function(pos, def) local rad = def[2] or 2 local snd = def[3] or "tnt_explode" explode(pos, rad, snd) end local lb_teleport = function(pos, digger, def) local xz_range = def[2] or 10 local y_range = def[3] or 5 pos.x = pos.x + math.random(-xz_range, xz_range) pos.x = pos.y + math.random(-y_range, y_range) pos.x = pos.z + math.random(-xz_range, xz_range) effect(pos, 25, "tnt_smoke.png", 8, 8, 1, -10, 0) digger:set_pos(pos, false) effect(pos, 25, "tnt_smoke.png", 8, 8, 1, -10, 0) minetest.chat_send_player(digger:get_player_name(), green .. S("Random Teleport!")) end local lb_drop = function(pos, digger, def) local num = def[3] or 1 local colours = def[4] local items = #def[2] -- drop multiple different items or colours if items > 1 or colours then for i = 1, num do local item = def[2][math.random(1, items)] if colours then item = item .. all_colours[math.random(#all_colours)] end if not minetest.registered_items[item] then item = "default:coal_lump" end local obj = minetest.add_item(pos, item) if obj then obj:set_velocity({ x = math.random(-10, 10) / 9, y = 5, z = math.random(-10, 10) / 9, }) end end else -- drop single item in a stack local item = def[2][1] if not minetest.registered_items[item] then item = ItemStack("default:coal_lump " .. tonumber(num)) else item = ItemStack(item .. " " .. tonumber(num)) end local obj = minetest.add_item(pos, item) if obj then obj:set_velocity({ x = math.random(-10, 10) / 9, y = 5, z = math.random(-10, 10) / 9, }) end end end local lb_lightning = function(pos, digger, def) local nod = def[2] if not minetest.registered_nodes[nod] then nod = "fire:basic_flame" end pos = digger:get_pos() if nod then minetest.set_node(pos, {name = nod}) end minetest.add_particle({ pos = pos, velocity = {x = 0, y = 0, z = 0}, acceleration = {x = 0, y = 0, z = 0}, expirationtime = 1.0, collisiondetection = false, texture = "lucky_lightning.png", size = math.random(100, 150), glow = 15, }) entity_physics(pos, 2) minetest.sound_play("lightning", { pos = pos, gain = 1.0, max_hear_distance = 25 }) end local lb_falling = function(pos, digger, def) local nods = def[2] local switch = def[3] local spread = def[4] local range = def[5] or 5 if switch == 1 then pos = digger:get_pos() end if spread then pos.y = pos.y + 10 else pos.y = pos.y + #nods end minetest.remove_node(pos) local pos2 = {x = pos.x, y = pos.y, z = pos.z} for s = 1, #nods do minetest.after(0.5 * s, function() if spread then pos2.x = pos.x + math.random(-range, range) pos2.z = pos.z + math.random(-range, range) end local n = minetest.registered_nodes[nods[s]] if n then local obj = minetest.add_entity(pos2, "__builtin:falling_node") obj:get_luaentity():set_node(n) end end) end end local lb_troll = function(pos, def) local nod = def[2] local snd = def[3] local exp = def[4] minetest.set_node(pos, {name = nod}) if snd then minetest.sound_play(snd, { pos = pos, gain = 1.0, max_hear_distance = 10 }) end if not minetest.registered_nodes[nod] then nod = "default:goldblock" end minetest.after(2.0, function() if exp then minetest.set_node(pos, {name = "air"}) explode(pos, 2) else minetest.set_node(pos, {name = "air"}) minetest.sound_play("default_hard_footstep", { pos = pos, gain = 1.0, max_hear_distance = 10 }) end end) end local lb_floor = function(pos, def) local size = def[2] or 1 local nods = def[3] or {"default:dirt"} local offs = def[4] or 0 local num = 1 for x = 0, size - 1 do for z = 0, size - 1 do minetest.after(0.5 * num, function() minetest.set_node({ x = (pos.x + x) - offs, y = pos.y - 1, z = (pos.z + z) - offs }, {name = nods[math.random(#nods)]}) minetest.sound_play("default_place_node", { pos = pos, gain = 1.0, max_hear_distance = 10 }) end) num = num + 1 end end end -- this is what happens when you dig a lucky block local lucky_block = function(pos, digger) -- make sure it's really random math.randomseed(minetest.get_timeofday() + pos.x + pos.z) -- os.time() local luck = math.random(1, #lucky_list) ; -- luck = 1 local action = lucky_list[luck][1] -- print ("luck ["..luck.." of "..#lucky_list.."]", action) -- place schematic if action == "sch" then lb_schematic(pos, digger, lucky_list[luck]) -- place node (if chest then fill chest) elseif action == "nod" then lb_node(pos, digger, lucky_list[luck]) -- place entity elseif action == "spw" then lb_spawn(pos, digger, lucky_list[luck]) -- explosion elseif action == "exp" then lb_explode(pos, lucky_list[luck]) -- teleport elseif action == "tel" then lb_teleport(pos, digger, lucky_list[luck]) -- drop items elseif action == "dro" then lb_drop(pos, digger, lucky_list[luck]) -- lightning strike elseif action == "lig" then lb_lightning(pos, digger, lucky_list[luck]) -- falling nodes elseif action == "fal" then lb_falling(pos, digger, lucky_list[luck]) -- troll block, disappears or explodes after 2 seconds elseif action == "tro" then lb_troll(pos, lucky_list[luck]) -- floor paint elseif action == "flo" then lb_floor(pos, lucky_list[luck]) -- custom function elseif action == "cus" then local func = lucky_list[luck][2] if func then func(pos, digger) end end end -- lucky block itself minetest.register_node('lucky_block:lucky_block', { description = S("Lucky Block"), tiles = {{ name = "lucky_block_animated.png", animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 1 }, }}, inventory_image = minetest.inventorycube("lucky_block.png"), sunlight_propagates = false, is_ground_content = false, paramtype = "light", light_source = 3, groups = {oddly_breakable_by_hand = 3}, drop = {}, sounds = default.node_sound_wood_defaults(), on_dig = function(pos, node, digger) minetest.set_node(pos, {name = "air"}) lucky_block(pos, digger) end, on_blast = function() end, }) minetest.register_craft({ output = "lucky_block:lucky_block", recipe = { {"default:gold_ingot", "default:gold_ingot", "default:gold_ingot"}, {"default:gold_ingot", "default:chest", "default:gold_ingot"}, {"default:gold_ingot", "default:gold_ingot", "default:gold_ingot"} } }) -- super lucky block minetest.register_node('lucky_block:super_lucky_block', { description = S("Super Lucky Block (use pick)"), tiles = {{ name = "lucky_block_super_animated.png", animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 1 }, }}, inventory_image = minetest.inventorycube("lucky_block_super.png"), sunlight_propagates = false, is_ground_content = false, paramtype = "light", groups = {cracky = 1, level = 2}, drop = {}, sounds = default.node_sound_stone_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("infotext", "Super Lucky Block") end, on_dig = function(pos) if math.random(1, 10) < 8 then minetest.set_node(pos, {name = "air"}) effect(pos, 25, "tnt_smoke.png", 8, 8, 1, -10, 0) minetest.sound_play("fart1", { pos = pos, gain = 1.0, max_hear_distance = 10 }) if math.random(1, 5) == 1 then pos.y = pos.y + 0.5 minetest.add_item(pos, "default:goldblock " .. math.random(1, 5)) end else minetest.set_node(pos, {name = "lucky_block:lucky_block"}) end end, on_blast = function() end, }) minetest.after(0, function() print (S("[MOD] Lucky Blocks loaded (@1 in total)", #lucky_list)) end) lucky_block/intllib.lua000066400000000000000000000021421336157460100155240ustar00rootroot00000000000000 -- Fallback functions for when `intllib` is not installed. -- Code released under Unlicense . -- Get the latest version of this file at: -- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua local function format(str, ...) local args = { ... } local function repl(escape, open, num, close) if escape == "" then local replacement = tostring(args[tonumber(num)]) if open == "" then replacement = replacement..close end return replacement else return "@"..open..num..close end end return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) end local gettext, ngettext if minetest.get_modpath("intllib") then if intllib.make_gettext_pair then -- New method using gettext. gettext, ngettext = intllib.make_gettext_pair() else -- Old method using text files. gettext = intllib.Getter() end end -- Fill in missing functions. gettext = gettext or function(msgid, ...) return format(msgid, ...) end ngettext = ngettext or function(msgid, msgid_plural, n, ...) return format(n==1 and msgid or msgid_plural, ...) end return gettext, ngettext lucky_block/license.txt000066400000000000000000000020631336157460100155510ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2016 TenPlus1 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. lucky_block/locale/000077500000000000000000000000001336157460100146245ustar00rootroot00000000000000lucky_block/locale/ru.po000066400000000000000000000033701336157460100156150ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-05-14 08:34+0200\n" "PO-Revision-Date: 2017-08-28 11:14+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: init.lua msgid "Stop hitting yourself!" msgstr "Прекратите удары себя" #: init.lua msgid "Dry shrub takeover!" msgstr "Поглощение сухих кустов" #: init.lua msgid "Random teleport!" msgstr "Случайный телепорт!" #: init.lua msgid "Lucky Block" msgstr "Удачливый блок" #: init.lua msgid "Super Lucky Block (use pick)" msgstr "Супер удачливый блок (используйте кирку)" #: init.lua msgid "[MOD] Lucky Blocks loaded (@1 in total)" msgstr "[MOD] Удачливый блок нагруженный (Всего @1)" #: blocks.lua msgid "Super Mega Magenta Ultra Screwdriver 2500\n(left-click to rotate face, right-click to rotates axis)" msgstr "Пурпурная супер мега ультра отвёртка 2500\n(левая кнопка для вращения лицевой части, правая кнопка для вращения осей)" #: blocks.lua msgid "Void Mirror (Place to see through solid walls during daytime" msgstr "Пустое зеркало (Установите, чтобы видеть сквозь сплошные стены в дневное время)" lucky_block/locale/template.pot000066400000000000000000000021601336157460100171620ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-05-14 08:34+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: init.lua msgid "Stop hitting yourself!" msgstr "" #: init.lua msgid "Dry shrub takeover!" msgstr "" #: init.lua msgid "Random teleport!" msgstr "" #: init.lua msgid "Lucky Block" msgstr "" #: init.lua msgid "Super Lucky Block (use pick)" msgstr "" #: init.lua msgid "[MOD] Lucky Blocks loaded (@1 in total)" msgstr "" #: blocks.lua msgid "Super Mega Magenta Ultra Screwdriver 2500\n(left-click to rotate face, right-click to rotates axis)" msgstr "" #: blocks.lua msgid "Void Mirror (Place to see through solid walls during daytime" msgstr "" lucky_block/mod.conf000066400000000000000000000000221336157460100150050ustar00rootroot00000000000000name = lucky_blocklucky_block/schematics/000077500000000000000000000000001336157460100155105ustar00rootroot00000000000000lucky_block/schematics/lb_wishing_well.mts000066400000000000000000000003261336157460100214060ustar00rootroot00000000000000MTSMdefault:steelblockdefault:stonebrickdefault:fence_woodairstairs:slab_stonebricklucky_block:well_blockdefault:water_source default:glassxc`F0db`b `Y6 fF, `Y| @>Y@k`*mkqjẫŜxXq$臊>Tݪ*ayU3ݐuKU۠rHr"꾪*#C0a@D]qwG8uѱwS|$I5/Egv]y&qmI/$ ](!5KʦUkRO \.E~:[$F-_==qsJۺ3o  ?T01[WNmDS(x A^жg/D)O1`t+q V Š S$),͆0+e\)@x&U6Oc!q_|SҎ y) qwՈG qWx|ѳ4MjdlCl[xcdЀF|\.ӶqRN1Z:A{ 4(MGRcO ]zO@}NT)4eKBwMBCV@}H7 #b%oE Hmd "9TiZq\4ZH~=eٱ/g8SH)P%%&Y v%w!`";Jд)PjG`lI EڦU` ^qDhZKHNC; ިlH(!o!AmwGZH%$!M pې]w풣R %ہHA78Fڿeqdŧ,oKnS{ 5 PGfeߒ BG=^+L2* )I#"AszhO@B |< Q*uKڱ-iJ`58$nr 4•L M HLiPR *j! %R T(jB^^àLb{ۖE "p2leiqEC EGPeont`3KBPNkshg5.gK̹"(&jѲ&``06VZ$0 (A =,!OшHQ^* eT`C ~@^fJesDHI4Z>tB8h#ӏ,Rt> !Z4{2s=UIrnF ڐb-L-%#6e@HtxB ]hq`I, YdAS*HOSs+& 8 +x9%(DDN.n`q]X /.Ѿ lyZZ-9|N##ULZ :HA`@(@zQ{検 "9`AB0Պ́G 4OlRIs<(#Fy [fEF%]!9ӘoikhWтSާ r3*Q[j3b;Q1I J 2|hE{ҀpXGa#D@kQȉPƶa'N=Hmd0 qIf< 2Yip@ J&ʙHy5z~nԖHp7)G؁G? FsRa@e% %hX\@ne+bFrG`CJ8)L8Jrr,XB\ON$!+M4˔Y'?Kq>5%DĈ')')Sffywv'THᐢL4ZI+A(N99 iH %In82Ѻ d[Pȵd)`䊸:ǷNZ$(ϑy$݀x9*{U0MP,IV7 x{ΣKx$>[ J"F"TɡSV *2I<:K!ئW% zZ-脻 & P"n݂@Zrv/@'͐ ؑxbh 4:)h 4GM,P'P-Y_42a@!28%#X$s !3M<9%7ѴZ{ʉaLs^TVi2bKɪⱺ: RɱH;/tL`ܽ`DYQE]Iju.AL4I㈔sC-2> tFvQ$%(M T ! r#"(o(3"Ի} X;8w_E59T)(!j8VǸ 1n8FPQ%IȎ낈 <6Aq|VBi.HC)pH0o%ҮAs(B?PQ`~ g^T'6>H9SL@\}mԕ7>߹ +[r1BǼ,Pvj/4c(S»\ MD^F̡Zjp͹rqUV.#Aej !ؗhj)GpRV߈)%NNLaf5tIed0z!yO qDy\* \j0OX_0&hcTqI{JrAn5paM馆#dt{h-:ŧkmI%T9d ("ջi:0GPYDdHeݑ(RڇIw=VH Z RG!.d{Z#$"`E!MÕRJA\Zꄡz av崉QeӖX۔Ʋ7d尔n/kA>ayjԃq{νmfɮ !BT6HB`X\DW 80,NTW'94̪@̡z'pHb Xqq 4MJ MIK EB. iKՄm;A[` !HÕץq)AVxKA8Ia5\h4 BQ|> 9EA\B=B7EF:1?.:TZA[J}X`z C퇡cFV1W'qB"Ɗ ,KԪ K45`1À`VX Ԙk TdQe AA? SÚ 8i8Ԟ) !,3 ,%Ѝ8a0fѾck$]l!2['=@RjQmZ[}lR6<`Y/jc >+2=7U0εx*^@r&@{Lr& : TZfxL T1"X KF2-UFNlԙHK}e@0]QթCx('5.6+$$.zX5©)I SA*c"H.|` qRF+9%mĘ A2!VKoHtr_BRV`/PS/>ր@!Bt{JDTbw*Ί-z^ yL Z$#0tLڈб Jplzd?h@'߲42Gx XP!&I#/*!R'dž)EH䤆#6%y+z }D̐SAa{zC/A-$ !t@KǮ[3PPK+s*$p ;.Xl,F񖚭ZvK)ߏCr8 ]#OuI4aBs$ypT$16 ;_ \K CSaIMx#o؆P1Ƅb9PP##T.Mh<DEr0WYS]Shŵkt= hSW+{tQ2/r^2^2r{ t [@HAV\ԡTPʾTjM۠t{CqUoD2^IVNҬ)Ibk࠽~:YrcA\SYrZ> ,_+#"t +&!t#'$X¥KHe=`™A=T /K>$TuaFHİqZ  €]b TmhPB z6&袒 f2,pfPHB+ܫV]^#qhfk󬄰Ybv,j}#K TMu6& 3KV3왁Pw,!*26^ e{ 1&!pgu) q[&ls Utj)}7~~:0LpGr_R*˭\suXRґIn<5[@@4neT! [׋ACGͧΆPn떁d,Qrb#8)D`% HB)Fz>OJ--E{)!no,t[ 1@Ȳ&^@OpTy(H]&ݻ\@8OmHB8H*[N3ksd]&Ǡ514À - JAgU:F;r[y- JE yd- G$:u'Sjuɉ\o@wT#-"$!ڂ^C"{'ʗHH6AfXeUH"yl" |V\cC %2MB<%Mh"o!_?WB'x܏'`S]xTƍzGQ=kO?8AyǠ <>H*,k)CNj' mXnX|@f)II4A%m@ AO &m=@J` #jrAWԢK>R) #':[9S̵GdCt컄O% (й[J' 4EN#)FrT.k3ja~X`} ׯiB3F|AtgA}gOL}DAVqp,vqD:$>LUBUI)b]@)m/5Nm z7DB5 @n- SNMX,zKBmĕ| 5Bm6#7._yQTRvj# ƺ5x)ZF{7nh>m y'\$@4FU`o_P:NHO@BN>6suRϪOק˵Q$: fʑtޙ;'\IIEҏTH=s1͍#Ҙ-!7$ϧێO̗&G)mϣY 9@NK`luZk\ =+xVBwl4 HcuoCf#4M2J{ZGC*+poPhY~Bq/^{諴2ʿ!xtxsę=P>tǴJz}=H2L R;fl{Y#^z"|ǿz&urA9dQVWQ<Sd%`9 h&pF3)<4_ *~'~s}>|\@>| Z@ۓ{]xU g+}]z>Z"!sՓ^@wF_Mތg^ZyU毴[/ow.uGx%+ǩ?I(Z%zs&%k=ҥZZ-!)+J:]N{`v8kƝlj0>{I;L5i[e5 Wi-d<~c R"p o޳i] 1QU9dnn3o{3qH @`l3-ǝT]/Ƚyvö9Tprnl࣎U>A@3rM: 㻵_LE! 2(!p: Hv;yd}PـTr#n>]-MLQ nPiu>htIHu:h8_[HN_! !Uߟ':u ۀsY]ÀıD/<3wi"9Mԭ'! Mpx(kw6 ![}QOKHJ~ W1b$BSIDAT*+f/E&v&}[N0Ɩ=fs[gcMAqSTR*\+pu-OJ7F~ϝ%@mg;pDJof!#a˔ӗVY_;]fQڣ]& !6jrbI- 6HX^H+19Y1/S[ˆ$Z,o4펳pT'׷RۃkPfL-hITr49R-M6;,@ho}-"lv}jŹM YS~$D;<3=X+Ekչ ȷexȑ ({Q-T{u gͲ! 97BB3_mo  e9c{P;D:%Հ@XF1׷`ܰdt`}Mܟ%x -mp W[BvH~m5c_I %\шT(Fi5mۨk+J*JMl]f:!!, eWGBEL7뭠Jh} W76Q ֎P]`:n[S?i0ʼrYOi77U V.56̳P6(!׊B QYFKԭDYt A> c凪.72%,/KQJi7ty]0sQ5z+CnZPD.;quAIrfX=}v,&ƭNlГΪ]'^;v;ܶVvc;dHgwrRQTyn}Z*%};v ҙkt6w@av$D]?x`Ő˒? (P2n.+4",>w\vOBʯi@qvu 6jCUT]waeR r쇍Πbͻ#,}sx5۰F}* :v]|@L6 Ep[vĎnVtmQUd~fGޔ3um+5skWttBˉgnn(tAdT׃Ut>؛rTSXx_fndI w`;?8$Wֈ%G> o bj;i<4ڟT:~sc ١:γ@v:(MNYv(]KԻXHc妻tž7r+=hFfT^Ư N@Ujj= )Gè473i9S@Fcխ[t oW:W\'¨zk7qvҰO-TЇcTvQR-z`T_Ms@Uf_PV,*c<l ޽C9uR7UsT_W<} # 7GB~ s}>| @> >|\@>| @f\/w/9Qۂ_wziËۋܪ[r~ʪ/^'%{(pxD$F玖"OK w#z֞~y>y {@~v/x>K{*-{Fʺ^*!Oc.m]!<~^zݥǓKvav]אda3~s$!Ͽ[eKB"*k[=wcR쮏˟yq\@qn}nm~po"ѐZnUsǫj3GO>Xژ.tUD?gly;^_] +TP߼bT: `/rYWZ@&ٮD<' Oq+n"SGbԏ,稦ґsOP,Ya{a @.-%MgZ;wdVaI [lH[R+MC;Xl@ݙ珃=G3V#e_ Y`n{dDvc');x[6ilq=EeUg?5Fw ŝܸN"vԴN HDB|+7n,wu%v6 ԝ $SEJlyFc~8]QY ~5"][kf/ųVD$&4i>p4t՗t/mDYǖ~1ۿ g-R[Io)~VRJR}fk"HniQz%H 8pxa@ 4* g-rj3n& ?Ӏ8nO-mο.\ }F/̾eYd1w۲ im:|jۡΤ7"ZBwkdjb! %^4[=텀Ds$dG |8a-2ں8V{({][6UmDx* هioF+$"MVwBi#TYZ@IT8 [J}>_yܮtmj۾׶yG91@mi p|F;2e KR<ҷV3E.yw2w ;裄x{*ҲfYQDK D:= N>̣}o]G獀lxD>Mu\" _ -a%_R(SYg:] SsnIk#f. ۅt"%G|\ T[̍\d(msڹ'*71\3vgb9|6Ó\'`dH4x[ΆZd Ď3֒V'j7 ڳ] $HgkSR=s Fܬ:Hʰr,1 ߭Lp}|7 uݳ%J9RG@~$z+{=r6ع(d}fHB`U9 "]l!& I}&cϪQj'k _3dᔟK^//!u:pI|ڨAʠ#,-smӣـ/Jg}I@&B42z8_YavcHҭA0{XDN,fvtR\BNB/o]Ȃ7<W\fKVem{5`rэ^#Gֿ_.䤘VۣA)Y2\ tS !8l#;g䋾f@N+nM3#NVC(zxkOIJHӑ$Һxl'1 eH/^ȠK (%#}_z;ȇ1d&4#N%Kd:@$7^ڹ4B" ~an#h6 ̪ٚx 9@+ŀlC딎@X ~wI=nw~v^CgYQTԶR"U YX֔fgj>N^J?X]0Tr?SV. XS :c@Z?,|B}J@9Lfx2 gLȉ̵n|k& uͬa=ghcٮ~FY"ߨoN x1WpHfKȜDNqj亇U 9(XV/Qs+$9VX,0ό x[Z3N,`Qԃ<t}bs/ɋIAd dnIf}:V:QeIf[tL8q=|Ou3":eP4껛.cYYiWo#˞yayvmtʆM'ޅ^4ϤXMOpH":F~C<8>"g57zxqa<ƗҧOM҅ğq9Ts8;K8jU ~)aAr~_rdVn5)Ƥ pFyv-xxധ(H;rfvk@_wM4R ^THzpLlk׉ Oh}GmjŽģ~ oD会i@z~NL/CcO6z:WR7t92?~1Z@iCkOGIO^Tdp֝LU`a-Lc˴_1u\;kQ]_k$Mo0u2:,!Rv zfiu\Gw:24S=`kG:57\,"T۪ZsrE939qui>]9.*9gCZ £ IJ[E3F]z]\MYG\6}r }]pbQDž^M+#n><Y44 Cy&@&M5tiCiqM~@j' \½K9!{Uо ڨ?Q=\KXJa^0W,U~Ђ94X-'fqR#JeY+vx9)$w޹JO7c} 7Fr!.cj_r\w/u]rԃ1JΜg[0PzrmhCZN [ âD3 Fȏ;95KFSm2 1kYTFONNe> rq.eJtf.;S8]a1|^%;)P{v'vrPBk᥷6MXwK9 ONJvMv䬂><5Ͷu5K6s><YWD:8sw,3'[ߗmzMP{'زP2M}5ҘfЀ< fz{5}ܳc=GeM$X"OfP<3vy!i K(Gpz9y2:zNB{>r@e= z|xGu2f̴mCYAM`8Ǥif@/ğG ګP?jΆ]{.<pa{zծ;c W\ >حg=M!lݰ5xșVd"Szb5M]Vєru`^kZ XW{[ }h{Eo :7#˙+}w{&eV2>/#dSl!2Tf^8jn3x@Rr/dZ<ꡗZVƞ*xF}_ƃ_E;e}MYx(&qG6ߵw015$+Yͣo 7"/>E[鬷h aQxٲ*!6%M\ϼkə9կ'h 8DS K_c}7!r_H 6døo .XoR/\][I5Wcp汷%zc[[$NiJJGѵ5ofO\cOYFRťֿ 5.iq⭤ ~Jw<G+3y{PDKR!~3 9Թot c֑߄:@&v IqT\|ץOv/ұ3sx,xSw{| k 48ZGãHźg E$z _ 2"I&zB wnuP58}wIENDB`lucky_block/sounds/000077500000000000000000000000001336157460100147005ustar00rootroot00000000000000lucky_block/sounds/fart1.ogg000066400000000000000000000146471336157460100164270ustar00rootroot00000000000000OggSG^vorbisDOggSG^_&ns2vorbis Lavf56.23.106encoder=Lavc56.26.100 libvorbiscopyright=A1 Free Sound Effects title=Fart 4vorbisBCVcT)FRJs1FbJBHsS9לk SP)RRic)RKI%t:'c[I֘kA RL)ĔRBS)ŔRJB%t:SJ(AsctJ$dLBH)JSNBH5R)sRRjA B АU@ P2((#9cI pIɱ$K,KDQU}6UUu]u]u 4d@H d Y F(BCVb(9&|sf9h*tp"In*s9's8srf1h&sf)h&sAks9qFsAj6s9j.s"Im.s9s9sspN8sZnBs>{sB8s9s9sАUA6q HEiȤݣ$h r GR TI) 4d!RH!RH!R!b) *2,2,2밳:0C KMXckZiJ)RJ) YdAF!R!r)BCVU}SvteׅYn]8u}amXeY9~Xet]_XmVY_}xu]n̺ mc}Yf_w:㩪+ , Ƴ, *±,j°ڶ1ܾn,pk1Qu|_x tu]yf]utG8~@!+8$dY(Y(躢hiiiZgi),iiZfhk)˦jʲi캲mlۢiʲil,ۮ꺤Yyijgjʲiyjzh(j,[g試'j*˦ڲilmmim-jۮ,ۺ/iijg癦il+[(扦j,ʖ癪'ꉞk*˦jڪil-*ˮmʲnljjʲl˾ʪ)˦ڲi-۲˲iʲim.˲mlhm-*۲-,ۺʮo-p0l+ۺo2}DӔeS5mTUYvee}4m[UU[6MնeY}Yma4M6UUMմmYmaeveٷe[uוu_}e溲˲p p0 a1R9Q9 dA!9!92 RZ !Rk8ؠ)8@!+TX癢jڲcI'H牢im['牢ih뺺.뺲+릪ʮ,ª+˲m°ʲl۶oܺ‘.1 G @6pR4XhJ 0!B!RJ!0`B(4dE'C)RJ)RJ)RJ)RJ)RJ)RH)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJRJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)R pz0 HQJ)Ɯ1cI()b9RRi-9!RmsRZ13礤[9RRkVk5ZZ5לs͹k9לs1לs9s9s48ذ:IX`!+Ts9R9"s9!T9tBs9!9B!s: BBA!J(!B!:!B!B!RJ!B P`@ #R΄AA AQ3 BL9љbNj3S9tjA^2  (B1A U DDH.\]BBX@ 88'ST ""8>*,.02468:<@OggS<G^ӣ)x^$ۇZ"-ի^9Of}T/F27=Idgh@oJ]4;$t/tT1O,C[}ƞH+LV]5zdoju¾qЛ$o3qt7l!~0,׏m_OV]*\{_s]OyN~lwi='c 4oWw;1 D?ɯ>5ڵLo__@pcfLoN塪d|o'=oD: toWqVh$To_ w fQ,#9^@0D16Docp> hpzIo/ |mx [=t/pZ"ЂRTo_9?|"|@(#I)Z_(VN:to'T.sb?I|oW+@?Dow6X̶i4#o)g^]"0g4o;F  D%)% )oWf"Իޓ@@2ulo&8nW4 To>\=Vg泐,o[O. xڀ+:c+@tToߪĢ̂E+TJo="`Om(Y t/x}>>N`LD?ΆՀTo^>'KIs14oL*a a*^GTo/uqy{D&h2,oWfW$ָe+@)t/|wMكѧLox@7D\oz^ X@0ȶ5%Lo29]@pJZ oW+3RSQ|Q $\oJ9t 3V0Lox|t /04oO O@4 m t~] To/*@ *R& |oǨ  oX.SB Lo:牧ӏS y do~俾gZ D@/'J)2( 4o1G@E-ob]:Cq.low7#ڡE|(Lo ,@tLDosrﲟRn7 :n,_r?\MP$/c&6@;#oJbOA2QL \o2|p"`gaX"oJEql$/~ܯL@*Vg ד*nX0+1aSDo﫜\6@{T/^yrz0&1* 4Qd. ,o387KOjx}$/^>:7 o39Q4ߐ//^y_2>qXd,w̟WJ@H !:,ݤg^%@白YaڳDYXU Aa.f}:%l6*`dt\y.F NN՟49LSnz .LXl%x@@W(_n09 ң腁lucky_block/sounds/lightning.ogg000066400000000000000000000521001336157460100173570ustar00rootroot00000000000000OggS|4BM"vorbisDOggS|4B vorbis Lavf56.37.100encoder=Lavc56.41.100 libvorbis genre=Other>title=Thunder and lightning sound FX from TV and Movie sources TRACKNUMBER=1 date=2011vorbisBCVcT)FRJs1FbJBHsS9לk SP)RRic)RKI%t:'c[I֘kA RL)ĔRBS)ŔRJB%t:SJ(AsctJ$dLBH)JSNBH5R)sRRjA B АU@ P2((#9cI pIɱ$K,KDQU}6UUu]u]u 4d@H d Y F(BCVb(9&|sf9h*tp"In*s9's8srf1h&sf)h&sAks9qFsAj6s9j.s"Im.s9s9sspN8sZnBs>{sB8s9s9sАUA6q HEiȤݣ$h r GR TI) 4d!RH!RH!R!b) *2,2,2밳:0C KMXckZiJ)RJ) YdAF!R!r)BCVU}SvteׅYn]8u}amXeY9~Xet]_XmVY_}xu]n̺ mc}Yf_w:㩪+ , Ƴ, *±,j°ڶ1ܾn,pk1Qu|_x tu]yf]utG8~@!+8$dY(Y(躢hiiiZgi),iiZfhk)˦jʲi캲mlۢiʲil,ۮ꺤Yyijgjʲiyjzh(j,[g試'j*˦ڲilmmim-jۮ,ۺ/iijg癦il+[(扦j,ʖ癪'ꉞk*˦jڪil-*ˮmʲnljjʲl˾ʪ)˦ڲi-۲˲iʲim.˲mlhm-*۲-,ۺʮo-p0l+ۺo2}DӔeS5mTUYvee}4m[UU[6MնeY}Yma4M6UUMմmYmaeveٷe[uוu_}e溲˲p p0 a1R9Q9 dA!9!92 RZ !Rk8ؠ)8@!+TX癢jڲcI'H牢im['牢ih뺺.뺲+릪ʮ,ª+˲m°ʲl۶oܺ‘.1 G @6pR4XhJ 0!B!RJ!0`B(4d%!B!B!B!Bs9s ؏pz011RcR1 D9tJs1T9!TZ˭rB)T[朔b99))VsΡb;)՚k͹j5\s.Śk5r5s9Ɯs9s8 6pR4XhJ @F)Ɯs:c9!H!ƜsBc9*sB!d9!BȜ:!A!B(sB!J!B!B!B!BB!PB(%X`'Ec %3accCrLSNtLdD'DZP 0 b @"3DBa,0(y!$&(..tqׁ P@N7<':x8(*,.02468:<> "   OggS@|4B'9_||(&#"%%'&$##!('Ί!ĽUFǷgz\7,_B= @ Q~7(_B(JV* 0~y;FbmRG9SS8GiNBpt9YLn  <vTyvU Ewi4VQt!TWkncӟCrF0~3Ř{LiO;>t#qeQ,Al>| N:&08QvstmL0`|(Zqon`2' @9ipTQ 4JV*<RBU+ ٛ01ڒZ=^f9`fӖ7K\.t$V.'Gp|PX4S/t(& ^k҇\SO2ZXL*OON\eRdTaIkT-K+Z_u {rݧ.^TƸdR9Kj-}mrG`tF4p Lj+goOƍ_=c  }{7lGy37R5B^(1n =X~܅ҾD+ÿaVEyo %]<$PMCyJLuqI?1X2Zs͝a~zqV!3a&;tBr.r&ZL~fbIS<5[ؙ!m^ogU.:*)zCGq ҞGV;X5`8Cm`@ 4~:Gz2|ڸvZ$3o~}ʛ _ ?n/jukn{On{o.T `,|, N^h(*k_ŝݮ LeA[ ֗-]YkoF N tMx! m5++LX(~wm-ϟ`|#س˓ UP~ڀYKzZ>MJ(g,SnBeڵb&iY&˜TS՗EcϿ+o)&@VM+ -mG}m+vmOQ٘\ ;c@$wꉳE{r0 ,v"Td{8fn2ɹwb)r斑3SL[Cf>:5&x݇lu̖ز2*x{ǃh#mJ=Ό;VVYX`֑5S߾O7?4fRd"R1|_{;әJu1Sw)E_`P(oVUF9#m,sp;v0054 <,/4+juw5z[c|t|;weOEYYe] <3n=3[70!:ʟ7-T/~: l74-7]wet"+-_}'ju X)eAVR> 7A|3Na*]YwfG 4KێVBa T>,n +ޚ̭ؕc7 k_V z1Ƥ|WWŊxje|P Fsk-Lo1!C1񆨛/6LI`1O'~P73D` ~Xox V:_GL̹5U++KVAWjGZ_?$]o&;;>p݌K{B+BĆ5Vf Csa@?;4Lfz^<pb{ s!,xĐb @>$[|"'Ib&M#43̣dXbM6\w_ߕXtG0l?`GF+Y<%PVo]d%.~De 1؅v $6SyWsϤXs˚֮CXDEךԣFe((wO뮯غseXY奘zl(.l˦uVtLlLAaJL蚇A?^s*20ā^_* ghNK>"B;@UXgv#ls< y7.=wڈ@<c\ŧWǵO;fXj [Kc؄6 Z4f%{۸c3^6sݎM#"aɻNLJ0N^i{b=!W GI&A{Tȋ}^SͮT䓤h9PV=v(g0-GD'0>"tS't!Ago&zHPl`# 5|ׄ0yN]6 vBKfp75;3hkO-i}yJQ͵^:C:;T^2)jKwxpZ,йWѹ.bec9t ŬlOU[/}=l>]PGP9ou 1活Cz l+ ;#2CGYo}O,?w=P,pf=/ Ik:Cދ3F306w7|bC驗.ELpe@5k=7W?X4o7. ^JTFFrz1lL+(/;B[`=(nX_ 7پshvJ]Y030$8mxMgu3$PybzM|6Nd}apu%3ʴo߰۱MN]6*gYoI(oP8$"tWͼߟmDǿjiZA(6#e4Rzurُ ML(N`wNm&׶δj(m{SAm_M46?]S,Q۶ 00YgחĔķ=.(Wrb?!ZLgPnDOZ51ѧ:j+HIBZYg-ns'OHkv&sJItw>od&Jv6n\+*il|{MwD#1ъ`c3oċZ d>5 MjO@aX] R^2!rͿK+og d}ሁi2O94 bi1vބtץ#()N&8yd /M-L cМX#\4OggS@]|4B;,хZ8Vo6y6]Vԕ>t8hzzG.{\IG&l}G'Ľ߱MĂ+parN_ؚxvly qDfLR[*5}+@pGN9e& "bKԞ1-l'T$u̴ׯ{[^}ZyqXS_y셐Յvvq#I2"Lj#w{]mGܿJDucJ q&+F><X;:R<؊5lK1Qc0Ew [#:t确n!/ɘkb浪P9y}R:ՆWXr09cf/} ۫0UikCxs|kwl"ngGꕕ:_26a&>76/z勿y.f>mkuC_S>~_ILvzmZ ge#_co w}gᅬƘh:۾@16֫5 8x\@>?X;qVJ@_-ؔz!fE sIc:<>0#`ǜd;7EXZ $ Fz廮c?{JݻH˷?PFNj$Е Kևxv2]5b=^1E#,2?$cwq9ye R<"9k2N~\ 6{g&ـb@utj}—HgUY;(SѸ/h9u'>ioN)d}6^s7{I}*uPkI?<s&6p+ Н/rN letmBk}VAyR#*1 1\RՋE=y7C=7d5/ƍV&&lҗ2l\cS>>O rn@ؐTג#k;&J]6o#UXY`fPv6mcwƪΊ[}sS˹{SCסcM];ϖhd z= R.w]/K3#p!J "=+\P:Dߴml}%Kf3m44Fw\3LbXǭ9Η鷫X_UAٛ/TCxjsRaerU;m_u %k;rWzn!HuZU+J2hLnǣRsrX{FUfN[<8N13+ehZrf6YU%-x|pmI̶ݕ7^ZGx%O[ݭ~,6lׇ]b(4V,3mY_B>b_Da:c~yN7ɏ|& wZC<(^GQ˝fFTGX}qeg'ZO')pNF=\d[qyr1@JX?O3_e-T2[׈azmB|ng:hԮc-ŷ,"4&Οa/K|l;#<\z1B)ɶBoPVդ?l~~nƋg?Z đյS!P(F$|_˜+l+C 9wOHӇmJ 20r>={fVB~ ' okf8$V3`%v3mu8m%mMfajj(!q,@BNX׎լn~)IQZ9Yv?Ywؗ.<)l+tН8|ub &2X{>F-7zShYRkesU[z*Kl8?(X2[1`{d+u@?sD6LpE1TM̒{dV2_ܝPhOm 1:RII4U+ʘ`lG=]e^Nr,몞Cj )AAx'{se91s}VO}""`*[yS `Sҕn^]䥉 ,r A9ˎp:`ee%7;{ö2}=A!XyCqRƂa?c[0:W~.7lο\4+ձVAL;blz :rtM(_BvlU+ZgPpzcVUWIFeq]`ϳL8Niaa\pMbê& Q)) 6QqB8b Ei@R-^t Aqf12 XVVLXDkyv}7h\6J2gFHy-N54fGpW9'Ԛnu'Hdv3!쎾;֫^8 \.rB(#& ʃc0`muwzb7X#T T铌蘍I$l Ol^xÖ<9Gmf{=HyeulKQL;<ƒ7]HL1r%s,m+++E^ {xa.\:ϥߌWu O]&{6G|w`g3^tĘ~Y.Os+6)l*;TvD<6LM&aYNՄ *ZdU5}>,%Tvy3N&;$kDdL}Vښ=dO_K+Wqn`_@o7G;zzƨ><`OnݽfQ[BVjR拶ߜH0}n`j .SF֪N@\r sǸ:5WHG)okaU#0xLfπ0zvl^+xA96Xvje%@v{E{F+˹zʛlvR{O>dfby@%է'(_NF`;2@{"t蝲Cޱk;~,`G+oNn*F <߹гa+tAmB9:4 =l'q-s$iқݟ^%h`;0SѓtJaU#6sbejN}QlNba6FVR$@&f_@L? Yc 4nemc;L3(yzo4R@|ҽ2[p7Rap?D=f ';&0!/~\qw=Æczm>DV뉟o7zXc}}ŭ P{='̃ 3Tؠ;"w-83ہڷa)b@P#L:,6zk>&SS"t Qs$oAUaԢQ#9Os1he / ]>֣<~ #_sy#ukOҏ́62wft ޶\nZYj,]wkk:Py3ŋ0dE>jmBIHLQ3!rhHOwIIC|8P8d0rhr3^NzZ#$O]-{-;hZY)2g8gXoaQ$TUOSϛs Hm-ڧUЅDi *ߤ͹ZpYU[*/MetxոY77NR$gٕtZ: NbJMuG/ZYUIb^M޹雤ebUnouY?~^}*9A'RFFw곽ݞ6[͕={ކ.^q=O&cX퀍~D>,nhN^8~/@:R$VV= іJԴq~ט5]t 3`Eލh46Y):XըZ,dtqAv ު{8To9 *[b`%>anX ~` &o +C-EZA[t~>mwY.Q;RݗsiS]0aMWz"WHf]7G6%ich;z*U Ltk)}vWc.!Tm~~|p?' >;!.`LyUn WsޫTqF\UJ"9VE[~_m[A ~ BwM6۾ -3Z|俗V,{mKo">7B-|^XLIMtWQՔ%-3)p G$KtB @u>nt0lY/rbdc/}7zk55~F gQH]#Y8e x_.)Ѧ?I{^+xy{Ƈk,v,Rl|3:TzjpPL37X|ee @h!K|㿽ߐXÿvԒ\yctw-V2&Lt= ?SVTi5\r}e%1g7 '5W+ԅ?mOo)`~u?(6:Ⱦ2_Gv=nUH+߮R>ݒQL 'tذeVsCTE}Wŋn_.gSxvvP*зFGLu- ^Z>XB`i^ܧ&M\E=wf|aޙPJiBR#0R -ƦfH~%0M*b.֓o`K T}*>M4Cv.X,k:N{c[r #n H4;5S xhR687uyw)gliNTg2ٱ`5j3VɻHU@OggS|4BnN *{~}x}{}~ N@ީw>Md3![`| v-w#>ivȔsZ^Z5(deҽǚ݇ǖ?k$ GIs:p=?n>nāiw6 K ZT:5Vuǟac+ zWEymZz|b`N5|̸4$ -fJkp۹ @? S r֖X5A:;YY) vxsx?=sOys:~/}1`9Oi0(@Q"'-5ӡEa -=fV τ^KQ8.$&4(N;`*;\mCFUtNlY"p?\۴+.}& =}\:r؄B u ^5tR-:72I 4Z/t ׾чggN3̞Ƥ!3`zLq-+:}H>}5*ym^]UNጶu`&pd93 n@-9~<ޫą.DZj%WC' з}_fgd=;&H?LFJ!wSGZPC1=G߰1 Lb1J$;=6%!W<[|p{1B-@^-6Kv!wݢ,}F65kĪ.s?7כ_OttdUiK˵ge[OvN@g)K笩@ NtBd]eD ZU{n3w~SsroթI.0P3ǻ}p U:Ư!nVl |l^aܴʤ8vۀL% 5xǞdF&MZjY5;g~ΰٱG@Ln0 ݓEHy$jF `[cT:{OS$sC*}cfGfEzF{qb%oZv #= 9O:an !d$h[oVJߟUE=p}e">+ >Zn@`ô՟9tUg|TlʩE]84t):TIחש\<=!|N>^ 6&o8O3lL>-f(m ++ vvmĵ'ػӚ޴¿8\$\ O_ls:T[,8e_>ci 7sp:9^:MȢ:p;r1bl`-섆樂oKi7 \YYIL((G~w[-i/죬5띐-OW,L89L35}Y{>M6z\>\ Znf;yo2K* @۾l;l#BÛf5A uZ)n7^wݟZM_߳=1FTړ0vš %uFO6Sxh.5ngO,2սkHӝ2 vCgJ&^<ՠmoN0봑-a6WEiڳl:vwY@QY{ml[&~g NC=UPS Pv1Ppb{ = 5IO1m޴ @akSݏ޷͹D4r?ϙcb#2xu-oTӁՃ 8&Ŝs5WLZQC/n3X:ve5[Yo UKQ%B ys ш5ȚR:`H1݅guO3~]9枺.~=ןI7Iu=8Wu Cfl__0Tx p}~ #TgE0[\`ee>ƾ8 o?Oo!6DI(v}S޴uECSNŽ=R*`Ӕ+| O̓)L ;c8p$U۝=hJ+tZP2S Ȓ:Z1kt~mKY71!z7hluuGZ)ϧܼ{q6g{Ho@vZ"H۝- 5/s؍ͺF2vaee>S}ﰿϧqsvܒ 7>}6k3%H3*DhO0}\x@;rnscnPc9dE[ -S9;,r!jHC֒\p/bfBDm03)r5qjzX8?; =JɓoSaW#t9a0Hܝ-F'!s9+?w3#:rU+˾WH@Џ{nƲv/ާTz砼_T?!#͸A4:7*5 M"WUzΗ1rΝ3ܡc='v2xw/W9hyx`Oeo:nu)&޻%b{=aul33 $uPk9b2G6s6cBU<f:{By4Olf@,܍5a/{M\Q*|Ĕ{,lz8VrOKBmAJ*j36vW̗e!!_^#m~w|0?WbMY쬵Z 0=ߝKS[d\0n1F쿟SJ.T;,ٿPXbFbs$(qj1|#`~-Bb2eo=F6me))C!Q?y=>c#8n >1\h6%LK0{Ã["u>oYwQXX7Ov|ꢱ%=J|/ 4bw \z"PDY6b%t@`3=[~Ħ"j4{c4#=%A_u!wIVV r(o|ߕxͳt@~2TVyY  F裵Z+Rxsj[E׎s)œdD ^*@~;F;DF; VC@о)3'3^oY;%zjU'EKo2TˠhLϟc,! rxTl+WbG~wO{օ` w#ͳ%! oZʏ;7 ]<~]p~qfH%™ ri&4Il))8УrMƸXf_f#rzߎ7a)$:hr۝5  ,[ݫA +b!@5cwͰmUG)raRKhk#QPI jǜCl=)[WH?40i75!q /+]=NBw;aӹi#k 8m˅U׻߮v\bVv]lOø} ]G*~OPta]e-B]O_2Gc1l HYpa3߾֣L5au(64QtTz/bRj^F(1'Na.+ UN<\hPD!8l;̋螂[M[M))m tȃ2s)tH=3%iNɧ xM3.hxKJؘ醇a`|Cl2!sgacf \p, tX3:V{f75%sr Kd SW@dvFRt(EO&-d !6tLyeM N!@aBsUXH!:9O\̖=rq 0칊#){Adw$ b%]#"ysd0@0! w=(X2N@ dRr~Ʋgҗi^Dž3o8-h0i">߸G_G/oZf|ߟBPrWϬ:џL4ݍY.EX{_LW1U9VyH=Bb.[nGI ͅ6歜!T=3Tm l–dFz:0NyWiρ z2!˰D8 XMqvAt 5,`㜣*@c) t\SClk޲3P}cC=[Z)dˎ9{YrX#rwegKjcr &ї&k2uGQrHlNB9o?~UQ==$N˰7//I5 CM[))^^í&eokqx(Kq̼]tHOˣL7:ɰcotؿ6q1rz*OL ;W#1ys1/V<ںK{ Ekz^,//Zƿrq=4 8eCdtU]ҋ{w^NK$}>aVƇ,v7(,.oVS)5XYmNUݣK̀{f["P`H9ÇrxQ+%s2"2j2,w})4>]f\::X m4:7A]˙ !j-B A5X%rɹD'ń2>K͉DN5k9ٟ̂JoY0 KR4 N5 R63w,bMCgN̄PQVDQhuuT 9XT ڈhJ &(jCiYVYYkJ$p~"}J!pZEd?W?!^C4%85 J_Qغ2 筚)b+싂k)el׊TLT!sߪ2̄=c4;!"?+w{J`+ed.n=3u·RڵZ&?o^'Ozj{ rDt]nNL nGD7}y@%]0Dv O9oWSEM&@{*(jT,1Jve&c%MvF} \-EuLaY )1;F +}Q`L™yа%veߓ%@W` )E>V p/T!',FRBX1Wut%S娏~[ 1h՗{Lux5T!f]\ܘ贮miRq}?X:Mxӹ0/v`^QS<`v~^ނ_8  ˥t7%h|;ĪJ}/d:*(%sCq(bg6)pX޴Ox.La8Sstsy&f7:|l~$ڠ!դodJ疑֤jcHSiRCOf#)~gr= ι BwTf&C3tf/?_=.*Ʌ1RE Y L!Uxd"->ϒ*&pwȝ{ Pw76cG L3^u^.,JQ\p۞2Ġ}~q<і]Ӿ@XK (0