From c010bc52696275c8762d4d12a18c6c0a038402fe Mon Sep 17 00:00:00 2001 From: Der1248 Date: Thu, 17 Oct 2019 01:08:41 +0200 Subject: [PATCH] Sudoku 1.9.0 upload --- menu/Thumbs.db | Bin 3072 -> 33792 bytes mods/beds/README.txt | 4 + mods/beds/api.lua | 13 +- mods/beds/beds.lua | 16 +- mods/beds/functions.lua | 57 +- mods/beds/init.lua | 8 +- mods/beds/license.txt | 1 + mods/beds/spawns.lua | 2 +- mods/beds/textures/beds_bed_under.png | Bin 0 -> 304 bytes mods/binoculars/README.txt | 37 + mods/binoculars/depends.txt | 2 + mods/binoculars/init.lua | 76 + mods/binoculars/license.txt | 59 + .../textures/binoculars_binoculars.png | Bin 0 -> 219 bytes mods/boats/README.txt | 16 + mods/boats/depends.txt | 1 + mods/boats/init.lua | 146 +- mods/bones/init.lua | 90 +- mods/bucket/README.txt | 6 +- mods/bucket/init.lua | 8 +- mods/butterflies/README.txt | 14 + mods/butterflies/depends.txt | 2 + mods/butterflies/init.lua | 133 + mods/butterflies/license.txt | 58 + .../textures/butterflies_butterfly_red.png | Bin 0 -> 110 bytes .../butterflies_butterfly_red_animated.png | Bin 0 -> 125 bytes .../textures/butterflies_butterfly_violet.png | Bin 0 -> 110 bytes .../butterflies_butterfly_violet_animated.png | Bin 0 -> 125 bytes .../textures/butterflies_butterfly_white.png | Bin 0 -> 110 bytes .../butterflies_butterfly_white_animated.png | Bin 0 -> 125 bytes mods/carts/README.txt | 3 +- mods/carts/cart_entity.lua | 126 +- mods/carts/depends.txt | 1 + mods/carts/functions.lua | 54 +- mods/carts/init.lua | 8 +- mods/carts/rails.lua | 4 +- mods/creative/README.txt | 7 +- mods/creative/init.lua | 24 +- mods/creative/inventory.lua | 12 +- mods/creative/license.txt | 1 + .../creative/textures/creative_clear_icon.png | Bin 0 -> 708 bytes mods/creative/textures/creative_next_icon.png | Bin 0 -> 727 bytes mods/creative/textures/creative_prev_icon.png | Bin 0 -> 728 bytes .../textures/creative_search_icon.png | Bin 0 -> 1908 bytes .../creative/textures/creative_trash_icon.png | Bin 179 -> 712 bytes mods/default/README.txt | 165 +- mods/default/chests.lua | 318 ++ mods/default/crafting.lua | 96 + mods/default/craftitems.lua | 16 +- mods/default/depends.txt | 1 + mods/default/functions.lua | 153 +- mods/default/furnace.lua | 72 +- mods/default/init.lua | 14 +- mods/default/item_entity.lua | 4 +- mods/default/legacy.lua | 24 + mods/default/license.txt | 117 +- mods/default/mapgen.lua | 1360 ++++--- mods/default/models/character.b3d | Bin 84526 -> 0 bytes mods/default/models/character.blend | Bin 634876 -> 0 bytes mods/default/nodes.lua | 1303 +++++-- mods/default/schematics/acacia_bush.mts | Bin 113 -> 114 bytes mods/default/schematics/acacia_log.mts | Bin 65 -> 55 bytes mods/default/schematics/acacia_tree.mts | Bin 204 -> 207 bytes .../schematics/acacia_tree_from_sapling.mts | Bin 205 -> 208 bytes mods/default/schematics/apple_log.mts | Bin 90 -> 88 bytes mods/default/schematics/apple_tree.mts | Bin 169 -> 209 bytes .../schematics/apple_tree_from_sapling.mts | Bin 173 -> 208 bytes mods/default/schematics/aspen_log.mts | Bin 118 -> 120 bytes mods/default/schematics/blueberry_bush.mts | Bin 0 -> 80 bytes mods/default/schematics/corals.mts | Bin 171 -> 0 bytes .../schematics/emergent_jungle_tree.mts | Bin 0 -> 504 bytes .../emergent_jungle_tree_from_sapling.mts | Bin 0 -> 497 bytes mods/default/schematics/jungle_log.mts | Bin 96 -> 94 bytes mods/default/schematics/jungle_tree.mts | Bin 255 -> 255 bytes .../schematics/jungle_tree_from_sapling.mts | Bin 247 -> 247 bytes mods/default/schematics/large_cactus.mts | Bin 94 -> 98 bytes mods/default/schematics/pine_bush.mts | Bin 0 -> 110 bytes mods/default/schematics/pine_log.mts | Bin 93 -> 93 bytes mods/default/schematics/pine_tree.mts | Bin 176 -> 178 bytes .../schematics/pine_tree_from_sapling.mts | Bin 174 -> 175 bytes mods/default/schematics/small_pine_tree.mts | Bin 0 -> 174 bytes .../small_pine_tree_from_sapling.mts | Bin 0 -> 172 bytes .../snowy_pine_tree_from_sapling.mts | Bin 232 -> 235 bytes .../snowy_small_pine_tree_from_sapling.mts | Bin 0 -> 202 bytes mods/default/sounds/default_chest_close.ogg | Bin 10099 -> 10768 bytes mods/default/sounds/default_chest_open.ogg | Bin 10578 -> 11092 bytes .../sounds/default_dirt_footstep.1.ogg | Bin 11144 -> 9155 bytes .../sounds/default_dirt_footstep.2.ogg | Bin 7504 -> 7553 bytes .../sounds/default_snow_footstep.1.ogg | Bin 5992 -> 7159 bytes .../sounds/default_snow_footstep.2.ogg | Bin 7364 -> 8726 bytes .../sounds/default_snow_footstep.3.ogg | Bin 8245 -> 8722 bytes .../sounds/default_snow_footstep.4.ogg | Bin 0 -> 6795 bytes .../sounds/default_snow_footstep.5.ogg | Bin 0 -> 8126 bytes mods/default/textures/default_blueberries.png | Bin 0 -> 166 bytes .../default_blueberry_bush_leaves.png | Bin 0 -> 813 bytes .../default_blueberry_bush_sapling.png | Bin 0 -> 204 bytes .../textures/default_blueberry_overlay.png | Bin 0 -> 165 bytes mods/default/textures/default_clay_brick.png | Bin 158 -> 160 bytes .../textures/default_coniferous_litter.png | Bin 0 -> 873 bytes .../default_coniferous_litter_side.png | Bin 0 -> 371 bytes mods/default/textures/default_coral_cyan.png | Bin 0 -> 202 bytes mods/default/textures/default_coral_green.png | Bin 0 -> 287 bytes mods/default/textures/default_coral_pink.png | Bin 0 -> 242 bytes .../textures/default_desert_cobble.png | Bin 280 -> 520 bytes mods/default/textures/default_dirt.png | Bin 277 -> 5889 bytes .../default_emergent_jungle_sapling.png | Bin 0 -> 190 bytes .../default_fence_rail_acacia_wood.png | Bin 0 -> 444 bytes .../default_fence_rail_aspen_wood.png | Bin 0 -> 235 bytes .../default_fence_rail_junglewood.png | Bin 0 -> 230 bytes .../textures/default_fence_rail_overlay.png | Bin 0 -> 141 bytes .../textures/default_fence_rail_pine_wood.png | Bin 0 -> 235 bytes .../textures/default_fence_rail_wood.png | Bin 0 -> 230 bytes mods/default/textures/default_fern_1.png | Bin 0 -> 370 bytes mods/default/textures/default_fern_2.png | Bin 0 -> 691 bytes mods/default/textures/default_fern_3.png | Bin 0 -> 1172 bytes mods/default/textures/default_glass.png | Bin 158 -> 270 bytes .../default/textures/default_glass_detail.png | Bin 135 -> 125 bytes mods/default/textures/default_kelp.png | Bin 0 -> 312 bytes .../default_large_cactus_seedling.png | Bin 0 -> 256 bytes .../textures/default_marram_grass_1.png | Bin 0 -> 253 bytes .../textures/default_marram_grass_2.png | Bin 0 -> 447 bytes .../textures/default_marram_grass_3.png | Bin 0 -> 341 bytes .../textures/default_mese_post_light_top.png | Bin 155 -> 128 bytes mods/default/textures/default_moss.png | Bin 0 -> 485 bytes mods/default/textures/default_moss_side.png | Bin 0 -> 328 bytes mods/default/textures/default_permafrost.png | Bin 0 -> 266 bytes .../textures/default_pine_bush_sapling.png | Bin 0 -> 166 bytes .../textures/default_pine_bush_stem.png | Bin 0 -> 280 bytes .../default/textures/default_pine_needles.png | Bin 391 -> 766 bytes mods/default/textures/default_stones.png | Bin 0 -> 405 bytes mods/default/textures/default_stones_side.png | Bin 0 -> 204 bytes mods/default/textures/gui_hotbar.png | Bin 284 -> 0 bytes mods/default/textures/gui_hotbar_selected.png | Bin 1649 -> 0 bytes mods/default/tools.lua | 116 +- mods/default/torch.lua | 58 +- mods/default/trees.lua | 79 +- mods/doors/README.txt | 5 +- mods/doors/init.lua | 65 +- mods/doors/textures/doors_door_glass.png | Bin 491 -> 499 bytes mods/doors/textures/doors_item_glass.png | Bin 186 -> 232 bytes mods/doors/textures/doors_trapdoor_side.png | Bin 233 -> 169 bytes mods/dungeon_loot/README.txt | 11 + mods/dungeon_loot/depends.txt | 1 + mods/dungeon_loot/init.lua | 8 + mods/dungeon_loot/license.txt | 24 + mods/dungeon_loot/loot.lua | 62 + mods/dungeon_loot/mapgen.lua | 170 + mods/dye/init.lua | 64 +- mods/farming/README.txt | 3 + mods/farming/api.lua | 19 +- mods/farming/hoes.lua | 13 +- mods/farming/init.lua | 42 +- mods/farming/nodes.lua | 11 +- mods/farming/textures/farming_cotton.png | Bin 166 -> 316 bytes mods/farming/textures/farming_string.png | Bin 0 -> 166 bytes mods/fire/README.txt | 4 +- mods/fire/init.lua | 96 +- mods/fireflies/README.txt | 22 + mods/fireflies/depends.txt | 2 + mods/fireflies/init.lua | 285 ++ mods/fireflies/license.txt | 58 + mods/fireflies/textures/fireflies_bottle.png | Bin 0 -> 172 bytes .../textures/fireflies_bottle_animated.png | Bin 0 -> 205 bytes mods/fireflies/textures/fireflies_bugnet.png | Bin 0 -> 192 bytes mods/fireflies/textures/fireflies_firefly.png | Bin 0 -> 113 bytes .../textures/fireflies_firefly_animated.png | Bin 0 -> 121 bytes mods/flowers/README.txt | 8 +- mods/flowers/init.lua | 35 +- mods/flowers/license.txt | 1 + mods/flowers/mapgen.lua | 61 +- mods/flowers/schematics/waterlily.mts | Bin 75 -> 0 bytes .../textures/flowers_chrysanthemum_green.png | Bin 0 -> 236 bytes .../textures/flowers_dandelion_yellow.png | Bin 133 -> 138 bytes mods/flowers/textures/flowers_tulip_black.png | Bin 0 -> 172 bytes mods/game_commands/README.txt | 7 + mods/{killme => game_commands}/init.lua | 3 +- mods/game_commands/license.txt | 24 + mods/map/README.txt | 44 + mods/map/depends.txt | 3 + mods/map/init.lua | 81 + mods/map/license.txt | 60 + mods/map/textures/map_mapping_kit.png | Bin 0 -> 763 bytes mods/player_api/README.txt | 32 + .../player.lua => player_api/api.lua} | 65 +- mods/player_api/init.lua | 34 + mods/player_api/license.txt | 84 + mods/player_api/models/character.b3d | Bin 0 -> 73433 bytes mods/player_api/models/character.blend | Bin 0 -> 698016 bytes .../models/character.png | Bin .../sounds/player_damage.ogg | Bin mods/player_api/textures/gui_hotbar.png | Bin 0 -> 411 bytes .../textures/gui_hotbar_selected.png | Bin 0 -> 175 bytes .../textures/player.png | Bin .../textures/player_back.png | Bin mods/screwdriver/README.txt | 4 +- mods/sethome/init.lua | 4 +- mods/sfinv/README.txt | 13 + mods/sfinv/api.lua | 183 + mods/sfinv/init.lua | 22 + mods/sfinv/license.txt | 24 + mods/spawn/README.txt | 7 + mods/spawn/depends.txt | 2 + mods/spawn/init.lua | 144 + mods/spawn/license.txt | 24 + mods/stairs/README.txt | 25 +- mods/stairs/init.lua | 492 ++- mods/stairs/license.txt | 41 +- mods/stairs/models/stairs_stair.obj | 115 - .../textures/stairs_glass_outer_stairside.png | Bin 0 -> 255 bytes mods/stairs/textures/stairs_glass_split.png | Bin 0 -> 249 bytes .../textures/stairs_glass_stairside.png | Bin 0 -> 249 bytes .../stairs_obsidian_glass_outer_stairside.png | Bin 0 -> 194 bytes .../textures/stairs_obsidian_glass_split.png | Bin 0 -> 129 bytes .../stairs_obsidian_glass_stairside.png | Bin 0 -> 195 bytes mods/sudoku/init.lua | 3432 ++++------------- mods/sudoku/lv4_1.txt | 9 + mods/sudoku/lv4_10.txt | 9 + mods/sudoku/lv4_100.txt | 9 + mods/sudoku/lv4_11.txt | 9 + mods/sudoku/lv4_12.txt | 9 + mods/sudoku/lv4_13.txt | 9 + mods/sudoku/lv4_14.txt | 9 + mods/sudoku/lv4_15.txt | 9 + mods/sudoku/lv4_16.txt | 9 + mods/sudoku/lv4_17.txt | 9 + mods/sudoku/lv4_18.txt | 9 + mods/sudoku/lv4_19.txt | 9 + mods/sudoku/lv4_2.txt | 9 + mods/sudoku/lv4_20.txt | 9 + mods/sudoku/lv4_21.txt | 9 + mods/sudoku/lv4_22.txt | 9 + mods/sudoku/lv4_23.txt | 9 + mods/sudoku/lv4_24.txt | 9 + mods/sudoku/lv4_25.txt | 9 + mods/sudoku/lv4_26.txt | 9 + mods/sudoku/lv4_27.txt | 9 + mods/sudoku/lv4_28.txt | 9 + mods/sudoku/lv4_29.txt | 9 + mods/sudoku/lv4_3.txt | 9 + mods/sudoku/lv4_30.txt | 9 + mods/sudoku/lv4_31.txt | 9 + mods/sudoku/lv4_32.txt | 9 + mods/sudoku/lv4_33.txt | 9 + mods/sudoku/lv4_34.txt | 9 + mods/sudoku/lv4_35.txt | 9 + mods/sudoku/lv4_36.txt | 9 + mods/sudoku/lv4_37.txt | 9 + mods/sudoku/lv4_38.txt | 8 + mods/sudoku/lv4_39.txt | 10 + mods/sudoku/lv4_4.txt | 9 + mods/sudoku/lv4_40.txt | 9 + mods/sudoku/lv4_41.txt | 9 + mods/sudoku/lv4_42.txt | 9 + mods/sudoku/lv4_43.txt | 9 + mods/sudoku/lv4_44.txt | 9 + mods/sudoku/lv4_45.txt | 9 + mods/sudoku/lv4_46.txt | 9 + mods/sudoku/lv4_47.txt | 9 + mods/sudoku/lv4_48.txt | 9 + mods/sudoku/lv4_49.txt | 9 + mods/sudoku/lv4_5.txt | 9 + mods/sudoku/lv4_50.txt | 9 + mods/sudoku/lv4_51.txt | 9 + mods/sudoku/lv4_52.txt | 9 + mods/sudoku/lv4_53.txt | 9 + mods/sudoku/lv4_54.txt | 9 + mods/sudoku/lv4_55.txt | 9 + mods/sudoku/lv4_56.txt | 9 + mods/sudoku/lv4_57.txt | 9 + mods/sudoku/lv4_58.txt | 9 + mods/sudoku/lv4_59.txt | 9 + mods/sudoku/lv4_6.txt | 9 + mods/sudoku/lv4_60.txt | 9 + mods/sudoku/lv4_61.txt | 9 + mods/sudoku/lv4_62.txt | 9 + mods/sudoku/lv4_63.txt | 9 + mods/sudoku/lv4_64.txt | 9 + mods/sudoku/lv4_65.txt | 9 + mods/sudoku/lv4_66.txt | 9 + mods/sudoku/lv4_67.txt | 9 + mods/sudoku/lv4_68.txt | 9 + mods/sudoku/lv4_69.txt | 9 + mods/sudoku/lv4_7.txt | 9 + mods/sudoku/lv4_70.txt | 9 + mods/sudoku/lv4_71.txt | 9 + mods/sudoku/lv4_72.txt | 9 + mods/sudoku/lv4_73.txt | 9 + mods/sudoku/lv4_74.txt | 9 + mods/sudoku/lv4_75.txt | 9 + mods/sudoku/lv4_76.txt | 9 + mods/sudoku/lv4_77.txt | 9 + mods/sudoku/lv4_78.txt | 9 + mods/sudoku/lv4_79.txt | 9 + mods/sudoku/lv4_8.txt | 9 + mods/sudoku/lv4_80.txt | 9 + mods/sudoku/lv4_81.txt | 9 + mods/sudoku/lv4_82.txt | 9 + mods/sudoku/lv4_83.txt | 9 + mods/sudoku/lv4_84.txt | 9 + mods/sudoku/lv4_85.txt | 9 + mods/sudoku/lv4_86.txt | 9 + mods/sudoku/lv4_87.txt | 9 + mods/sudoku/lv4_88.txt | 9 + mods/sudoku/lv4_89.txt | 9 + mods/sudoku/lv4_9.txt | 9 + mods/sudoku/lv4_90.txt | 9 + mods/sudoku/lv4_91.txt | 9 + mods/sudoku/lv4_92.txt | 9 + mods/sudoku/lv4_93.txt | 9 + mods/sudoku/lv4_94.txt | 9 + mods/sudoku/lv4_95.txt | 9 + mods/sudoku/lv4_96.txt | 9 + mods/sudoku/lv4_97.txt | 9 + mods/sudoku/lv4_98.txt | 9 + mods/sudoku/lv4_99.txt | 9 + mods/sudoku/textures/sudoku_meselamp.png | Bin 0 -> 309 bytes mods/tnt/README.txt | 31 +- mods/tnt/init.lua | 37 +- mods/tnt/license.txt | 1 + mods/tnt/textures/tnt_tnt_stick.png | Bin 0 -> 149 bytes mods/vessels/README.txt | 6 +- mods/vessels/init.lua | 11 +- mods/walls/README.txt | 2 +- mods/walls/init.lua | 16 +- mods/wool/init.lua | 42 +- mods/xpanes/README.txt | 3 + mods/xpanes/init.lua | 19 +- mods/xpanes/textures/xpanes_bar_top.png | Bin 3516 -> 3516 bytes mods/xpanes/textures/xpanes_edge.png | Bin 0 -> 269 bytes mods/xpanes/textures/xpanes_edge_obsidian.png | Bin 0 -> 98 bytes mods/xpanes/textures/xpanes_space.png | Bin 149 -> 149 bytes mods/xpanes/textures/xpanes_white.png | Bin 3496 -> 0 bytes 332 files changed, 7345 insertions(+), 4647 deletions(-) create mode 100644 mods/beds/textures/beds_bed_under.png create mode 100644 mods/binoculars/README.txt create mode 100644 mods/binoculars/depends.txt create mode 100644 mods/binoculars/init.lua create mode 100644 mods/binoculars/license.txt create mode 100644 mods/binoculars/textures/binoculars_binoculars.png create mode 100644 mods/butterflies/README.txt create mode 100644 mods/butterflies/depends.txt create mode 100644 mods/butterflies/init.lua create mode 100644 mods/butterflies/license.txt create mode 100644 mods/butterflies/textures/butterflies_butterfly_red.png create mode 100644 mods/butterflies/textures/butterflies_butterfly_red_animated.png create mode 100644 mods/butterflies/textures/butterflies_butterfly_violet.png create mode 100644 mods/butterflies/textures/butterflies_butterfly_violet_animated.png create mode 100644 mods/butterflies/textures/butterflies_butterfly_white.png create mode 100644 mods/butterflies/textures/butterflies_butterfly_white_animated.png create mode 100644 mods/creative/textures/creative_clear_icon.png create mode 100644 mods/creative/textures/creative_next_icon.png create mode 100644 mods/creative/textures/creative_prev_icon.png create mode 100644 mods/creative/textures/creative_search_icon.png create mode 100644 mods/default/chests.lua create mode 100644 mods/default/depends.txt delete mode 100644 mods/default/models/character.b3d delete mode 100644 mods/default/models/character.blend create mode 100644 mods/default/schematics/blueberry_bush.mts delete mode 100644 mods/default/schematics/corals.mts create mode 100644 mods/default/schematics/emergent_jungle_tree.mts create mode 100644 mods/default/schematics/emergent_jungle_tree_from_sapling.mts create mode 100644 mods/default/schematics/pine_bush.mts create mode 100644 mods/default/schematics/small_pine_tree.mts create mode 100644 mods/default/schematics/small_pine_tree_from_sapling.mts create mode 100644 mods/default/schematics/snowy_small_pine_tree_from_sapling.mts create mode 100644 mods/default/sounds/default_snow_footstep.4.ogg create mode 100644 mods/default/sounds/default_snow_footstep.5.ogg create mode 100644 mods/default/textures/default_blueberries.png create mode 100644 mods/default/textures/default_blueberry_bush_leaves.png create mode 100644 mods/default/textures/default_blueberry_bush_sapling.png create mode 100644 mods/default/textures/default_blueberry_overlay.png create mode 100644 mods/default/textures/default_coniferous_litter.png create mode 100644 mods/default/textures/default_coniferous_litter_side.png create mode 100644 mods/default/textures/default_coral_cyan.png create mode 100644 mods/default/textures/default_coral_green.png create mode 100644 mods/default/textures/default_coral_pink.png create mode 100644 mods/default/textures/default_emergent_jungle_sapling.png create mode 100644 mods/default/textures/default_fence_rail_acacia_wood.png create mode 100644 mods/default/textures/default_fence_rail_aspen_wood.png create mode 100644 mods/default/textures/default_fence_rail_junglewood.png create mode 100644 mods/default/textures/default_fence_rail_overlay.png create mode 100644 mods/default/textures/default_fence_rail_pine_wood.png create mode 100644 mods/default/textures/default_fence_rail_wood.png create mode 100644 mods/default/textures/default_fern_1.png create mode 100644 mods/default/textures/default_fern_2.png create mode 100644 mods/default/textures/default_fern_3.png create mode 100644 mods/default/textures/default_kelp.png create mode 100644 mods/default/textures/default_large_cactus_seedling.png create mode 100644 mods/default/textures/default_marram_grass_1.png create mode 100644 mods/default/textures/default_marram_grass_2.png create mode 100644 mods/default/textures/default_marram_grass_3.png create mode 100644 mods/default/textures/default_moss.png create mode 100644 mods/default/textures/default_moss_side.png create mode 100644 mods/default/textures/default_permafrost.png create mode 100644 mods/default/textures/default_pine_bush_sapling.png create mode 100644 mods/default/textures/default_pine_bush_stem.png create mode 100644 mods/default/textures/default_stones.png create mode 100644 mods/default/textures/default_stones_side.png delete mode 100644 mods/default/textures/gui_hotbar.png delete mode 100644 mods/default/textures/gui_hotbar_selected.png create mode 100644 mods/dungeon_loot/README.txt create mode 100644 mods/dungeon_loot/depends.txt create mode 100644 mods/dungeon_loot/init.lua create mode 100644 mods/dungeon_loot/license.txt create mode 100644 mods/dungeon_loot/loot.lua create mode 100644 mods/dungeon_loot/mapgen.lua create mode 100644 mods/farming/textures/farming_string.png create mode 100644 mods/fireflies/README.txt create mode 100644 mods/fireflies/depends.txt create mode 100644 mods/fireflies/init.lua create mode 100644 mods/fireflies/license.txt create mode 100644 mods/fireflies/textures/fireflies_bottle.png create mode 100644 mods/fireflies/textures/fireflies_bottle_animated.png create mode 100644 mods/fireflies/textures/fireflies_bugnet.png create mode 100644 mods/fireflies/textures/fireflies_firefly.png create mode 100644 mods/fireflies/textures/fireflies_firefly_animated.png delete mode 100644 mods/flowers/schematics/waterlily.mts create mode 100644 mods/flowers/textures/flowers_chrysanthemum_green.png create mode 100644 mods/flowers/textures/flowers_tulip_black.png create mode 100644 mods/game_commands/README.txt rename mods/{killme => game_commands}/init.lua (96%) create mode 100644 mods/game_commands/license.txt create mode 100644 mods/map/README.txt create mode 100644 mods/map/depends.txt create mode 100644 mods/map/init.lua create mode 100644 mods/map/license.txt create mode 100644 mods/map/textures/map_mapping_kit.png create mode 100644 mods/player_api/README.txt rename mods/{default/player.lua => player_api/api.lua} (66%) create mode 100644 mods/player_api/init.lua create mode 100644 mods/player_api/license.txt create mode 100644 mods/player_api/models/character.b3d create mode 100644 mods/player_api/models/character.blend rename mods/{default => player_api}/models/character.png (100%) rename mods/{default => player_api}/sounds/player_damage.ogg (100%) create mode 100644 mods/player_api/textures/gui_hotbar.png create mode 100644 mods/player_api/textures/gui_hotbar_selected.png rename mods/{default => player_api}/textures/player.png (100%) rename mods/{default => player_api}/textures/player_back.png (100%) create mode 100644 mods/sfinv/README.txt create mode 100644 mods/sfinv/api.lua create mode 100644 mods/sfinv/init.lua create mode 100644 mods/sfinv/license.txt create mode 100644 mods/spawn/README.txt create mode 100644 mods/spawn/depends.txt create mode 100644 mods/spawn/init.lua create mode 100644 mods/spawn/license.txt delete mode 100644 mods/stairs/models/stairs_stair.obj create mode 100644 mods/stairs/textures/stairs_glass_outer_stairside.png create mode 100644 mods/stairs/textures/stairs_glass_split.png create mode 100644 mods/stairs/textures/stairs_glass_stairside.png create mode 100644 mods/stairs/textures/stairs_obsidian_glass_outer_stairside.png create mode 100644 mods/stairs/textures/stairs_obsidian_glass_split.png create mode 100644 mods/stairs/textures/stairs_obsidian_glass_stairside.png create mode 100644 mods/sudoku/lv4_1.txt create mode 100644 mods/sudoku/lv4_10.txt create mode 100644 mods/sudoku/lv4_100.txt create mode 100644 mods/sudoku/lv4_11.txt create mode 100644 mods/sudoku/lv4_12.txt create mode 100644 mods/sudoku/lv4_13.txt create mode 100644 mods/sudoku/lv4_14.txt create mode 100644 mods/sudoku/lv4_15.txt create mode 100644 mods/sudoku/lv4_16.txt create mode 100644 mods/sudoku/lv4_17.txt create mode 100644 mods/sudoku/lv4_18.txt create mode 100644 mods/sudoku/lv4_19.txt create mode 100644 mods/sudoku/lv4_2.txt create mode 100644 mods/sudoku/lv4_20.txt create mode 100644 mods/sudoku/lv4_21.txt create mode 100644 mods/sudoku/lv4_22.txt create mode 100644 mods/sudoku/lv4_23.txt create mode 100644 mods/sudoku/lv4_24.txt create mode 100644 mods/sudoku/lv4_25.txt create mode 100644 mods/sudoku/lv4_26.txt create mode 100644 mods/sudoku/lv4_27.txt create mode 100644 mods/sudoku/lv4_28.txt create mode 100644 mods/sudoku/lv4_29.txt create mode 100644 mods/sudoku/lv4_3.txt create mode 100644 mods/sudoku/lv4_30.txt create mode 100644 mods/sudoku/lv4_31.txt create mode 100644 mods/sudoku/lv4_32.txt create mode 100644 mods/sudoku/lv4_33.txt create mode 100644 mods/sudoku/lv4_34.txt create mode 100644 mods/sudoku/lv4_35.txt create mode 100644 mods/sudoku/lv4_36.txt create mode 100644 mods/sudoku/lv4_37.txt create mode 100644 mods/sudoku/lv4_38.txt create mode 100644 mods/sudoku/lv4_39.txt create mode 100644 mods/sudoku/lv4_4.txt create mode 100644 mods/sudoku/lv4_40.txt create mode 100644 mods/sudoku/lv4_41.txt create mode 100644 mods/sudoku/lv4_42.txt create mode 100644 mods/sudoku/lv4_43.txt create mode 100644 mods/sudoku/lv4_44.txt create mode 100644 mods/sudoku/lv4_45.txt create mode 100644 mods/sudoku/lv4_46.txt create mode 100644 mods/sudoku/lv4_47.txt create mode 100644 mods/sudoku/lv4_48.txt create mode 100644 mods/sudoku/lv4_49.txt create mode 100644 mods/sudoku/lv4_5.txt create mode 100644 mods/sudoku/lv4_50.txt create mode 100644 mods/sudoku/lv4_51.txt create mode 100644 mods/sudoku/lv4_52.txt create mode 100644 mods/sudoku/lv4_53.txt create mode 100644 mods/sudoku/lv4_54.txt create mode 100644 mods/sudoku/lv4_55.txt create mode 100644 mods/sudoku/lv4_56.txt create mode 100644 mods/sudoku/lv4_57.txt create mode 100644 mods/sudoku/lv4_58.txt create mode 100644 mods/sudoku/lv4_59.txt create mode 100644 mods/sudoku/lv4_6.txt create mode 100644 mods/sudoku/lv4_60.txt create mode 100644 mods/sudoku/lv4_61.txt create mode 100644 mods/sudoku/lv4_62.txt create mode 100644 mods/sudoku/lv4_63.txt create mode 100644 mods/sudoku/lv4_64.txt create mode 100644 mods/sudoku/lv4_65.txt create mode 100644 mods/sudoku/lv4_66.txt create mode 100644 mods/sudoku/lv4_67.txt create mode 100644 mods/sudoku/lv4_68.txt create mode 100644 mods/sudoku/lv4_69.txt create mode 100644 mods/sudoku/lv4_7.txt create mode 100644 mods/sudoku/lv4_70.txt create mode 100644 mods/sudoku/lv4_71.txt create mode 100644 mods/sudoku/lv4_72.txt create mode 100644 mods/sudoku/lv4_73.txt create mode 100644 mods/sudoku/lv4_74.txt create mode 100644 mods/sudoku/lv4_75.txt create mode 100644 mods/sudoku/lv4_76.txt create mode 100644 mods/sudoku/lv4_77.txt create mode 100644 mods/sudoku/lv4_78.txt create mode 100644 mods/sudoku/lv4_79.txt create mode 100644 mods/sudoku/lv4_8.txt create mode 100644 mods/sudoku/lv4_80.txt create mode 100644 mods/sudoku/lv4_81.txt create mode 100644 mods/sudoku/lv4_82.txt create mode 100644 mods/sudoku/lv4_83.txt create mode 100644 mods/sudoku/lv4_84.txt create mode 100644 mods/sudoku/lv4_85.txt create mode 100644 mods/sudoku/lv4_86.txt create mode 100644 mods/sudoku/lv4_87.txt create mode 100644 mods/sudoku/lv4_88.txt create mode 100644 mods/sudoku/lv4_89.txt create mode 100644 mods/sudoku/lv4_9.txt create mode 100644 mods/sudoku/lv4_90.txt create mode 100644 mods/sudoku/lv4_91.txt create mode 100644 mods/sudoku/lv4_92.txt create mode 100644 mods/sudoku/lv4_93.txt create mode 100644 mods/sudoku/lv4_94.txt create mode 100644 mods/sudoku/lv4_95.txt create mode 100644 mods/sudoku/lv4_96.txt create mode 100644 mods/sudoku/lv4_97.txt create mode 100644 mods/sudoku/lv4_98.txt create mode 100644 mods/sudoku/lv4_99.txt create mode 100644 mods/sudoku/textures/sudoku_meselamp.png create mode 100644 mods/tnt/textures/tnt_tnt_stick.png create mode 100644 mods/xpanes/textures/xpanes_edge.png create mode 100644 mods/xpanes/textures/xpanes_edge_obsidian.png delete mode 100644 mods/xpanes/textures/xpanes_white.png diff --git a/menu/Thumbs.db b/menu/Thumbs.db index 264774de69552fd5cde0cf673e026966b30aa613..ca38abc2ea0450aebc0a5bee9e17902a1275a3ef 100644 GIT binary patch delta 30462 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 delta 78 zcmZqZU}})qAi=cRgKY=n!~}y$EII5OzIRNiH@z~sm?f0sKNL)EWYu8$!aP}#$7}Kt eR-4HNJT9A$u=+4@#USGV diff --git a/mods/beds/README.txt b/mods/beds/README.txt index cda6ebd..b4cf0c4 100644 --- a/mods/beds/README.txt +++ b/mods/beds/README.txt @@ -10,6 +10,10 @@ Various Minetest developers and contributors (MIT) Authors of media (textures) --------------------------- BlockMen (CC BY-SA 3.0) + All textures unless otherwise noted + +TumeniNodes (CC BY-SA 3.0) + beds_bed_under.png This mod adds a bed to Minetest which allows to skip the night. To sleep, rightclick the bed. If playing in singleplayer mode the night gets skipped diff --git a/mods/beds/api.lua b/mods/beds/api.lua index 9349545..c545a20 100644 --- a/mods/beds/api.lua +++ b/mods/beds/api.lua @@ -109,7 +109,7 @@ function beds.register_bed(name, def) return itemstack end, - on_rotate = function(pos, node, user, mode, new_param2) + on_rotate = function(pos, node, user, _, new_param2) local dir = minetest.facedir_to_dir(node.param2) local p = vector.add(pos, dir) local node2 = minetest.get_node_or_nil(p) @@ -121,7 +121,7 @@ function beds.register_bed(name, def) minetest.record_protection_violation(p, user:get_player_name()) return false end - if mode ~= screwdriver.ROTATE_FACE then + if new_param2 % 32 > 3 then return false end local newp = vector.add(pos, minetest.facedir_to_dir(new_param2)) @@ -141,6 +141,9 @@ function beds.register_bed(name, def) minetest.set_node(newp, {name = name .. "_top", param2 = new_param2}) return true end, + can_dig = function(pos, player) + return beds.can_dig(pos) + end, }) minetest.register_node(name .. "_top", { @@ -160,6 +163,12 @@ function beds.register_bed(name, def) on_destruct = function(pos) destruct_bed(pos, 2) end, + can_dig = function(pos, player) + local node = minetest.get_node(pos) + local dir = minetest.facedir_to_dir(node.param2) + local p = vector.add(pos, dir) + return beds.can_dig(p) + end, }) minetest.register_alias(name, name .. "_bottom") diff --git a/mods/beds/beds.lua b/mods/beds/beds.lua index bb2fd5d..0bdde9c 100644 --- a/mods/beds/beds.lua +++ b/mods/beds/beds.lua @@ -7,19 +7,19 @@ beds.register_bed("beds:fancy_bed", { tiles = { bottom = { "beds_bed_top1.png", - "default_wood.png", + "beds_bed_under.png", "beds_bed_side1.png", "beds_bed_side1.png^[transformFX", - "default_wood.png", + "beds_bed_foot.png", "beds_bed_foot.png", }, top = { "beds_bed_top2.png", - "default_wood.png", + "beds_bed_under.png", "beds_bed_side2.png", "beds_bed_side2.png^[transformFX", "beds_bed_head.png", - "default_wood.png", + "beds_bed_head.png", } }, nodebox = { @@ -44,7 +44,7 @@ beds.register_bed("beds:fancy_bed", { selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, recipe = { {"", "", "group:stick"}, - {"wool:red", "wool:red", "wool:white"}, + {"wool:white", "wool:white", "wool:white"}, {"group:wood", "group:wood", "group:wood"}, }, }) @@ -58,7 +58,7 @@ beds.register_bed("beds:bed", { tiles = { bottom = { "beds_bed_top_bottom.png^[transformR90", - "default_wood.png", + "beds_bed_under.png", "beds_bed_side_bottom_r.png", "beds_bed_side_bottom_r.png^[transformfx", "beds_transparent.png", @@ -66,7 +66,7 @@ beds.register_bed("beds:bed", { }, top = { "beds_bed_top_top.png^[transformR90", - "default_wood.png", + "beds_bed_under.png", "beds_bed_side_top_r.png", "beds_bed_side_top_r.png^[transformfx", "beds_bed_side_top.png", @@ -79,7 +79,7 @@ beds.register_bed("beds:bed", { }, selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, recipe = { - {"wool:red", "wool:red", "wool:white"}, + {"wool:white", "wool:white", "wool:white"}, {"group:wood", "group:wood", "group:wood"} }, }) diff --git a/mods/beds/functions.lua b/mods/beds/functions.lua index 78df9a1..bf7bf90 100644 --- a/mods/beds/functions.lua +++ b/mods/beds/functions.lua @@ -9,15 +9,18 @@ end -- Helper functions local function get_look_yaw(pos) - local n = minetest.get_node(pos) - if n.param2 == 1 then - return pi / 2, n.param2 - elseif n.param2 == 3 then - return -pi / 2, n.param2 - elseif n.param2 == 0 then - return pi, n.param2 + local rotation = minetest.get_node(pos).param2 + if rotation > 3 then + rotation = rotation % 4 -- Mask colorfacedir values + end + if rotation == 1 then + return pi / 2, rotation + elseif rotation == 3 then + return -pi / 2, rotation + elseif rotation == 0 then + return pi, rotation else - return 0, n.param2 + return 0, rotation end end @@ -58,6 +61,7 @@ local function lay_down(player, pos, bed_pos, state, skip) local p = beds.pos[name] or nil if beds.player[name] ~= nil then beds.player[name] = nil + beds.bed_position[name] = nil player_in_bed = player_in_bed - 1 end -- skip here to prevent sending player specific changes (used for leaving players) @@ -65,7 +69,7 @@ local function lay_down(player, pos, bed_pos, state, skip) return end if p then - player:setpos(p) + player:set_pos(p) end -- physics, eye_offset, etc @@ -80,6 +84,7 @@ local function lay_down(player, pos, bed_pos, state, skip) else beds.player[name] = 1 beds.pos[name] = pos + beds.bed_position[name] = bed_pos player_in_bed = player_in_bed + 1 -- physics, eye_offset, etc @@ -89,7 +94,7 @@ local function lay_down(player, pos, bed_pos, state, skip) local dir = minetest.facedir_to_dir(param2) local p = {x = bed_pos.x + dir.x / 2, y = bed_pos.y, z = bed_pos.z + dir.z / 2} player:set_physics_override(0, 0, 0) - player:setpos(p) + player:set_pos(p) default.player_attached[name] = true hud_flags.wielditem = false default.player_set_animation(player, "lay" , 0) @@ -104,12 +109,12 @@ local function update_formspecs(finished) local is_majority = (ges / 2) < player_in_bed if finished then - form_n = beds.formspec .. "label[2.7,11; Good morning.]" + form_n = beds.formspec .. "label[2.7,9; Good morning.]" else - form_n = beds.formspec .. "label[2.2,11;" .. tostring(player_in_bed) .. + form_n = beds.formspec .. "label[2.2,9;" .. tostring(player_in_bed) .. " of " .. tostring(ges) .. " players are in bed]" if is_majority and is_night_skip_enabled() then - form_n = form_n .. "button_exit[2,8;4,0.75;force;Force night skip]" + form_n = form_n .. "button_exit[2,6;4,0.75;force;Force night skip]" end end @@ -134,7 +139,7 @@ end function beds.on_rightclick(pos, player) local name = player:get_player_name() - local ppos = player:getpos() + local ppos = player:get_pos() local tod = minetest.get_timeofday() if tod > 0.2 and tod < 0.805 then @@ -171,6 +176,15 @@ function beds.on_rightclick(pos, player) end end +function beds.can_dig(bed_pos) + -- Check all players in bed which one is at the expected position + for _, player_bed_pos in pairs(beds.bed_position) do + if vector.equals(bed_pos, player_bed_pos) then + return false + end + end + return true +end -- Callbacks -- Only register respawn callback if respawn enabled @@ -180,7 +194,7 @@ if enable_respawn then local name = player:get_player_name() local pos = beds.spawn[name] if pos then - player:setpos(pos) + player:set_pos(pos) return true end end) @@ -205,16 +219,25 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if formname ~= "beds_form" then return end + + -- Because "Force night skip" button is a button_exit, it will set fields.quit + -- and lay_down call will change value of player_in_bed, so it must be taken + -- earlier. + local last_player_in_bed = player_in_bed + if fields.quit or fields.leave then lay_down(player, nil, nil, false) update_formspecs(false) end if fields.force then - update_formspecs(is_night_skip_enabled()) - if is_night_skip_enabled() then + local is_majority = (#minetest.get_connected_players() / 2) < last_player_in_bed + if is_majority and is_night_skip_enabled() then + update_formspecs(true) beds.skip_night() beds.kick_players() + else + update_formspecs(false) end end end) diff --git a/mods/beds/init.lua b/mods/beds/init.lua index 8b25890..5a3959c 100644 --- a/mods/beds/init.lua +++ b/mods/beds/init.lua @@ -1,11 +1,13 @@ beds = {} beds.player = {} +beds.bed_position = {} beds.pos = {} beds.spawn = {} -beds.formspec = "size[8,15;true]" .. - "bgcolor[#080808BB; true]" .. - "button_exit[2,12;4,0.75;leave;Leave Bed]" +beds.formspec = "size[8,11;true]" .. + "no_prepend[]" .. + "bgcolor[#080808BB;true]" .. + "button_exit[2,10;4,0.75;leave;Leave Bed]" local modpath = minetest.get_modpath("beds") diff --git a/mods/beds/license.txt b/mods/beds/license.txt index 0494b36..f3c517f 100644 --- a/mods/beds/license.txt +++ b/mods/beds/license.txt @@ -30,6 +30,7 @@ Licenses of media (textures) Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) Copyright (C) 2014-2016 BlockMen +Copyright (C) 2018 TumeniNodes You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/beds/spawns.lua b/mods/beds/spawns.lua index 6b1f404..baee364 100644 --- a/mods/beds/spawns.lua +++ b/mods/beds/spawns.lua @@ -53,7 +53,7 @@ end function beds.set_spawns() for name,_ in pairs(beds.player) do local player = minetest.get_player_by_name(name) - local p = player:getpos() + local p = player:get_pos() -- but don't change spawn location if borrowing a bed if not minetest.is_protected(p, name) then beds.spawn[name] = p diff --git a/mods/beds/textures/beds_bed_under.png b/mods/beds/textures/beds_bed_under.png new file mode 100644 index 0000000000000000000000000000000000000000..a9301156432af19eaa9732249be96dcdbfd4ded1 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Wq?nJYmmKixU*`qw^m((L0y7j zW0Fy0G7uTJWLURk*tBK>k!^dnZD+Ra+)CH^weAb+JQme^ENk>SJI|L5Xb5AHx4R2N z2dk_Hki%Kv5n0T@z%2~Ij105pNB{-dOFVsD*&lJqh{-D*-&P$0*#XNF%vT;RnfI<> zE<*@o{0VzCdjZdyiFqB9xAMkHF$UC2EnM<4MymYzgOx9j-1@jO{_?eLXV~|>=3T)x pOUCcoHX9E%Pr2&y?!%UU7_NnKmj9X= 5 then y = 5 elseif y < 0 then @@ -193,24 +217,24 @@ function boat.on_step(self, dtime) else new_acce = {x = 0, y = 5, z = 0} end - new_velo = get_velocity(self.v, self.object:getyaw(), y) - self.object:setpos(self.object:getpos()) + new_velo = get_velocity(self.v, self.object:get_yaw(), y) + self.object:set_pos(self.object:get_pos()) else new_acce = {x = 0, y = 0, z = 0} - if math.abs(self.object:getvelocity().y) < 1 then - local pos = self.object:getpos() + if math.abs(self.object:get_velocity().y) < 1 then + local pos = self.object:get_pos() pos.y = math.floor(pos.y) + 0.5 - self.object:setpos(pos) - new_velo = get_velocity(self.v, self.object:getyaw(), 0) + self.object:set_pos(pos) + new_velo = get_velocity(self.v, self.object:get_yaw(), 0) else - new_velo = get_velocity(self.v, self.object:getyaw(), - self.object:getvelocity().y) - self.object:setpos(self.object:getpos()) + new_velo = get_velocity(self.v, self.object:get_yaw(), + self.object:get_velocity().y) + self.object:set_pos(self.object:get_pos()) end end end - self.object:setvelocity(new_velo) - self.object:setacceleration(new_acce) + self.object:set_velocity(new_velo) + self.object:set_acceleration(new_acce) end @@ -246,7 +270,7 @@ minetest.register_craftitem("boats:boat", { boat = minetest.add_entity(pointed_thing.under, "boats:boat") if boat then if placer then - boat:setyaw(placer:get_look_horizontal()) + boat:set_yaw(placer:get_look_horizontal()) end local player_name = placer and placer:get_player_name() or "" if not (creative and creative.is_enabled_for and diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 8688fa1..5fcae41 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -1,6 +1,8 @@ -- Minetest 0.4 mod: bones -- See README.txt for licensing and other information. +bones = {} + local function is_owner(pos, name) local owner = minetest.get_meta(pos):get_string("owner") if owner == "" or owner == name or minetest.check_player_privs(name, "protection_bypass") then @@ -11,9 +13,6 @@ end local bones_formspec = "size[8,9]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. "list[current_name;main;0,0.3;8,4;]" .. "list[current_player;main;0,4.85;8,1;]" .. "list[current_player;main;0,6.08;8,3;8]" .. @@ -157,7 +156,7 @@ end local drop = function(pos, itemstack) local obj = minetest.add_item(pos, itemstack:take_item(itemstack:get_count())) if obj then - obj:setvelocity({ + obj:set_velocity({ x = math.random(-10, 10) / 9, y = 5, z = math.random(-10, 10) / 9, @@ -165,6 +164,18 @@ local drop = function(pos, itemstack) end end +local player_inventory_lists = { "main", "craft" } +bones.player_inventory_lists = player_inventory_lists + +local function is_all_empty(player_inv) + for _, list_name in ipairs(player_inventory_lists) do + if not player_inv:is_empty(list_name) then + return false + end + end + return true +end + minetest.register_on_dieplayer(function(player) local bones_mode = minetest.settings:get("bones_mode") or "bones" @@ -172,21 +183,32 @@ minetest.register_on_dieplayer(function(player) bones_mode = "bones" end + local bones_position_message = minetest.settings:get_bool("bones_position_message") == true + local player_name = player:get_player_name() + local pos = vector.round(player:get_pos()) + local pos_string = minetest.pos_to_string(pos) + -- return if keep inventory set or in creative mode if bones_mode == "keep" or (creative and creative.is_enabled_for and creative.is_enabled_for(player:get_player_name())) then + minetest.log("action", player_name .. " dies at " .. pos_string .. + ". No bones placed") + if bones_position_message then + minetest.chat_send_player(player_name, player_name .. " died at " .. pos_string .. ".") + end return end local player_inv = player:get_inventory() - if player_inv:is_empty("main") and - player_inv:is_empty("craft") then + if is_all_empty(player_inv) then + minetest.log("action", player_name .. " dies at " .. pos_string .. + ". No bones placed") + if bones_position_message then + minetest.chat_send_player(player_name, player_name .. " died at " .. pos_string .. ".") + end return end - local pos = vector.round(player:getpos()) - local player_name = player:get_player_name() - -- check if it's possible to place bones, if not find space near player if bones_mode == "bones" and not may_replace(pos, player) then local air = minetest.find_node_near(pos, 1, {"air"}) @@ -198,44 +220,48 @@ minetest.register_on_dieplayer(function(player) end if bones_mode == "drop" then - - -- drop inventory items - for i = 1, player_inv:get_size("main") do - drop(pos, player_inv:get_stack("main", i)) + for _, list_name in ipairs(player_inventory_lists) do + for i = 1, player_inv:get_size(list_name) do + drop(pos, player_inv:get_stack(list_name, i)) + end + player_inv:set_list(list_name, {}) end - player_inv:set_list("main", {}) - - -- drop crafting grid items - for i = 1, player_inv:get_size("craft") do - drop(pos, player_inv:get_stack("craft", i)) - end - player_inv:set_list("craft", {}) - drop(pos, ItemStack("bones:bones")) + minetest.log("action", player_name .. " dies at " .. pos_string .. + ". Inventory dropped") + if bones_position_message then + minetest.chat_send_player(player_name, player_name .. " died at " .. pos_string .. + ", and dropped their inventory.") + end return end local param2 = minetest.dir_to_facedir(player:get_look_dir()) minetest.set_node(pos, {name = "bones:bones", param2 = param2}) + minetest.log("action", player_name .. " dies at " .. pos_string .. + ". Bones placed") + if bones_position_message then + minetest.chat_send_player(player_name, player_name .. " died at " .. pos_string .. + ", and bones were placed.") + end + local meta = minetest.get_meta(pos) local inv = meta:get_inventory() inv:set_size("main", 8 * 4) - inv:set_list("main", player_inv:get_list("main")) - for i = 1, player_inv:get_size("craft") do - local stack = player_inv:get_stack("craft", i) - if inv:room_for_item("main", stack) then - inv:add_item("main", stack) - else - --drop if no space left - drop(pos, stack) + for _, list_name in ipairs(player_inventory_lists) do + for i = 1, player_inv:get_size(list_name) do + local stack = player_inv:get_stack(list_name, i) + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + else -- no space left + drop(pos, stack) + end end + player_inv:set_list(list_name, {}) end - player_inv:set_list("main", {}) - player_inv:set_list("craft", {}) - meta:set_string("formspec", bones_formspec) meta:set_string("owner", player_name) diff --git a/mods/bucket/README.txt b/mods/bucket/README.txt index 45e0ec5..58997b2 100644 --- a/mods/bucket/README.txt +++ b/mods/bucket/README.txt @@ -4,9 +4,9 @@ See license.txt for license information. Authors of source code ---------------------- -Kahrl (LGPL 2.1) -celeron55, Perttu Ahola (LGPL 2.1) -Various Minetest developers and contributors (LGPL 2.1) +Kahrl (LGPLv2.1+) +celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest developers and contributors (LGPLv2.1+) Authors of media (textures) --------------------------- diff --git a/mods/bucket/init.lua b/mods/bucket/init.lua index 62392e9..1d37cb4 100644 --- a/mods/bucket/init.lua +++ b/mods/bucket/init.lua @@ -148,7 +148,7 @@ minetest.register_craftitem("bucket:bucket_empty", { if inv:room_for_item("main", {name=liquiddef.itemname}) then inv:add_item("main", liquiddef.itemname) else - local pos = user:getpos() + local pos = user:get_pos() pos.y = math.floor(pos.y + 0.5) minetest.add_item(pos, liquiddef.itemname) end @@ -189,6 +189,12 @@ bucket.register_liquid( {water_bucket = 1} ) +-- River water source is 'liquid_renewable = false' to avoid horizontal spread +-- of water sources in sloping rivers that can cause water to overflow +-- riverbanks and cause floods. +-- River water source is instead made renewable by the 'force renew' option +-- used here. + bucket.register_liquid( "default:river_water_source", "default:river_water_flowing", diff --git a/mods/butterflies/README.txt b/mods/butterflies/README.txt new file mode 100644 index 0000000..a7f52a0 --- /dev/null +++ b/mods/butterflies/README.txt @@ -0,0 +1,14 @@ +Minetest Game mod: Butterflies +============================== +Adds butterflies to the world on mapgen, which can be caught in a net if the +fireflies mod is also enabled. + +Authors of source code +---------------------- +Shara RedCat (MIT) + +Authors of media (textures) +--------------------------- +Shara RedCat (CC BY-SA 3.0): + butterflies_butterfly_*.png + butterflies_butterfly_*_animated.png \ No newline at end of file diff --git a/mods/butterflies/depends.txt b/mods/butterflies/depends.txt new file mode 100644 index 0000000..df07aca --- /dev/null +++ b/mods/butterflies/depends.txt @@ -0,0 +1,2 @@ +default +flowers \ No newline at end of file diff --git a/mods/butterflies/init.lua b/mods/butterflies/init.lua new file mode 100644 index 0000000..008211e --- /dev/null +++ b/mods/butterflies/init.lua @@ -0,0 +1,133 @@ +-- register butterflies +local butter_list = { + {"white", "White"}, + {"red", "Red"}, + {"violet", "Violet"} +} + +for i in ipairs (butter_list) do + local name = butter_list[i][1] + local desc = butter_list[i][2] + + minetest.register_node("butterflies:butterfly_"..name, { + description = desc.." Butterfly", + drawtype = "plantlike", + tiles = {{ + name = "butterflies_butterfly_"..name.."_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3 + }, + }}, + inventory_image = "butterflies_butterfly_"..name..".png", + wield_image = "butterflies_butterfly_"..name..".png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "butterflies:butterfly_"..name}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) < 11 then + minetest.set_node(pos, {name = "butterflies:hidden_butterfly_"..name}) + end + minetest.get_node_timer(pos):start(30) + end + }) + + minetest.register_node("butterflies:hidden_butterfly_"..name, { + description = "Hidden "..desc.." Butterfly", + drawtype = "airlike", + inventory_image = "insects_butterfly_"..name..".png", + wield_image = "insects_butterfly_"..name..".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "butterflies:hidden_butterfly_"..name}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) >= 11 then + minetest.set_node(pos, {name = "butterflies:butterfly_"..name}) + end + minetest.get_node_timer(pos):start(30) + end + }) +end + +-- register decoration +minetest.register_decoration({ + name = "butterflies:butterfly", + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 2, + sidelen = 80, + fill_ratio = 0.005, + biomes = {"grassland", "deciduous_forest", "floatland_grassland"}, + y_max = 31000, + y_min = 1, + decoration = { + "butterflies:butterfly_white", + "butterflies:butterfly_red", + "butterflies:butterfly_violet" + }, + spawn_by = "group:flower", + num_spawn_by = 1 +}) + +-- get decoration ID +local butterflies = minetest.get_decoration_id("butterflies:butterfly") +minetest.set_gen_notify({decoration = true}, {butterflies}) + +-- start nodetimers +minetest.register_on_generated(function(minp, maxp, blockseed) + local gennotify = minetest.get_mapgen_object("gennotify") + local poslist = {} + + for _, pos in ipairs(gennotify["decoration#"..butterflies] or {}) do + local deco_pos = {x = pos.x, y = pos.y + 3, z = pos.z} + table.insert(poslist, deco_pos) + end + + if #poslist ~= 0 then + for i = 1, #poslist do + local pos = poslist[i] + minetest.get_node_timer(pos):start(1) + end + end +end) diff --git a/mods/butterflies/license.txt b/mods/butterflies/license.txt new file mode 100644 index 0000000..eebdad6 --- /dev/null +++ b/mods/butterflies/license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (c) 2018 Shara RedCat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2018 Shara RedCat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file diff --git a/mods/butterflies/textures/butterflies_butterfly_red.png b/mods/butterflies/textures/butterflies_butterfly_red.png new file mode 100644 index 0000000000000000000000000000000000000000..8edfc3659c113f648b8efa5771c2731110e254c3 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|u0Z;FaPSgNt$)$s%0Lcd zNswPKgTu2MX+Vy!r;B3<$Ms|dHUldL&Sh*#QgTe~DWM4f DxxpD+ literal 0 HcmV?d00001 diff --git a/mods/butterflies/textures/butterflies_butterfly_red_animated.png b/mods/butterflies/textures/butterflies_butterfly_red_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..4a2097bd0447df99bbf0c6388fdf5e8124b86fdd GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0zllr#0(_se=}|bQk(%kA+A9BdT{U(POX2@;mSY` zV@Z%-FoVOh8)-m}lBbJfh{pM31qKO67GdV8jm#Yx3clw9$~BMFHlGM>Ryx2Ce1n;{ TOe@C&sG7mk)z4*}Q$iB}%%LCs literal 0 HcmV?d00001 diff --git a/mods/butterflies/textures/butterflies_butterfly_violet.png b/mods/butterflies/textures/butterflies_butterfly_violet.png new file mode 100644 index 0000000000000000000000000000000000000000..8b8c29ddf0edf7a2267a5ffb622b8bfe409962a7 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|u0Xm?XIC7gTe~DWM4f DkqH>G literal 0 HcmV?d00001 diff --git a/mods/butterflies/textures/butterflies_butterfly_violet_animated.png b/mods/butterflies/textures/butterflies_butterfly_violet_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..3f9d72e9fce79e261a27e5126b6dbfef4d548d42 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0zllr#0(_se=}|bQk(%kA+A8WO=nje!<029YLY+> zV@Z%-FoVOh8)-m}lBbJfh{pM31qKO67GdV8jm#Yx3clw9$~BMFHlGM>Ryx2Ce1n;{ TOe@C&sG7mk)z4*}Q$iB}ne!i0 literal 0 HcmV?d00001 diff --git a/mods/butterflies/textures/butterflies_butterfly_white.png b/mods/butterflies/textures/butterflies_butterfly_white.png new file mode 100644 index 0000000000000000000000000000000000000000..db4eaec81fd2e2c958f22a6623f316a331f95bfc GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|u0Z<#|NnRH+zH(qeG~V%8lDfAy0;L%|UHx3vIVCg! E0GjX|`~Uy| literal 0 HcmV?d00001 diff --git a/mods/butterflies/textures/butterflies_butterfly_white_animated.png b/mods/butterflies/textures/butterflies_butterfly_white_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..e7cada39a9bc439eb7501472c4ccc843cef1b096 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0zllr#0(_se=}|bQk(%kA+A9B|NsAw?_U0_cXbPp z!&nmJ7tG-B>_!@pqvYx07@~1LS%E>qkwut!Y9n(;hJx?;fO5?vwaq6&o0SeQ1m9rh UEz`>J0IFv2boFyt=akR{00r125C8xG literal 0 HcmV?d00001 diff --git a/mods/carts/README.txt b/mods/carts/README.txt index 31ce644..c0be2d7 100644 --- a/mods/carts/README.txt +++ b/mods/carts/README.txt @@ -6,7 +6,8 @@ itself is based on (and fully compatible with) the carts mod [2]. The model was originally designed by stujones11 [3] (CC-0). -Cart textures are based on original work from PixelBOX (WTFPL). +Cart textures are based on original work from PixelBOX by Gambit (permissive +license). [1] https://github.com/SmallJoker/boost_cart/ diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua index 031e456..855450d 100644 --- a/mods/carts/cart_entity.lua +++ b/mods/carts/cart_entity.lua @@ -1,10 +1,12 @@ local cart_entity = { - physical = false, -- otherwise going uphill breaks - collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, - visual = "mesh", - mesh = "carts_cart.b3d", - visual_size = {x=1, y=1}, - textures = {"carts_cart.png"}, + initial_properties = { + physical = false, -- otherwise going uphill breaks + collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + visual = "mesh", + mesh = "carts_cart.b3d", + visual_size = {x=1, y=1}, + textures = {"carts_cart.png"}, + }, driver = nil, punched = false, -- used to re-send velocity and position @@ -27,6 +29,10 @@ function cart_entity:on_rightclick(clicker) elseif not self.driver then self.driver = player_name carts:manage_attachment(clicker, self.object) + + -- player_api does not update the animation + -- when the player is attached, reset to default animation + player_api.set_animation(clicker, "stand") end end @@ -36,29 +42,32 @@ function cart_entity:on_activate(staticdata, dtime_s) return end local data = minetest.deserialize(staticdata) - if not data or type(data) ~= "table" then + if type(data) ~= "table" then return end self.railtype = data.railtype if data.old_dir then self.old_dir = data.old_dir end - if data.old_vel then - self.old_vel = data.old_vel - end end function cart_entity:get_staticdata() return minetest.serialize({ railtype = self.railtype, - old_dir = self.old_dir, - old_vel = self.old_vel + old_dir = self.old_dir }) end +-- 0.5.x and later: When the driver leaves +function cart_entity:on_detach_child(child) + if child and child:get_player_name() == self.driver then + self.driver = nil + end +end + function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) - local pos = self.object:getpos() - local vel = self.object:getvelocity() + local pos = self.object:get_pos() + local vel = self.object:get_velocity() if not self.railtype or vector.equals(vel, {x=0, y=0, z=0}) then local node = minetest.get_node(pos).name self.railtype = minetest.get_item_group(node, "connect_to_raillike") @@ -81,12 +90,12 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, -- Detach driver and items if self.driver then if self.old_pos then - self.object:setpos(self.old_pos) + self.object:set_pos(self.old_pos) end local player = minetest.get_player_by_name(self.driver) carts:manage_attachment(player, nil) end - for _,obj_ in ipairs(self.attached_items) do + for _, obj_ in ipairs(self.attached_items) do if obj_ then obj_:set_detach() end @@ -99,7 +108,7 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, local leftover = inv:add_item("main", "carts:cart") -- If no room in inventory add a replacement cart to the world if not leftover:is_empty() then - minetest.add_item(self.object:getpos(), leftover) + minetest.add_item(self.object:get_pos(), leftover) end end self.object:remove() @@ -152,7 +161,7 @@ local function rail_sound(self, dtime) self.sound_handle = nil minetest.after(0.2, minetest.sound_stop, handle) end - local vel = self.object:getvelocity() + local vel = self.object:get_velocity() local speed = vector.length(vel) if speed > 0 then self.sound_handle = minetest.sound_play( @@ -169,32 +178,23 @@ local function get_railparams(pos) return carts.railparams[node.name] or {} end +local v3_len = vector.length local function rail_on_step(self, dtime) - local vel = self.object:getvelocity() + local vel = self.object:get_velocity() if self.punched then vel = vector.add(vel, self.velocity) - self.object:setvelocity(vel) + self.object:set_velocity(vel) self.old_dir.y = 0 elseif vector.equals(vel, {x=0, y=0, z=0}) then return end - local pos = self.object:getpos() + local pos = self.object:get_pos() + local cart_dir = carts:velocity_to_dir(vel) + local same_dir = vector.equals(cart_dir, self.old_dir) local update = {} - -- stop cart if velocity vector flips - if self.old_vel and self.old_vel.y == 0 and - (self.old_vel.x * vel.x < 0 or self.old_vel.z * vel.z < 0) then - self.old_vel = {x = 0, y = 0, z = 0} - self.old_pos = pos - self.object:setvelocity(vector.new()) - self.object:setacceleration(vector.new()) - rail_on_step_event(get_railparams(pos).on_step, self, dtime) - return - end - self.old_vel = vector.new(vel) - - if self.old_pos and not self.punched then + if self.old_pos and not self.punched and same_dir then local flo_pos = vector.round(pos) local flo_old = vector.round(self.old_pos) if vector.equals(flo_pos, flo_old) then @@ -213,20 +213,29 @@ local function rail_on_step(self, dtime) end end - if self.old_pos then - -- Detection for "skipping" nodes - local found_path = carts:pathfinder( - pos, self.old_pos, self.old_dir, ctrl, self.old_switch, self.railtype + local stop_wiggle = false + if self.old_pos and same_dir then + -- Detection for "skipping" nodes (perhaps use average dtime?) + -- It's sophisticated enough to take the acceleration in account + local acc = self.object:get_acceleration() + local distance = dtime * (v3_len(vel) + 0.5 * dtime * v3_len(acc)) + + local new_pos, new_dir = carts:pathfinder( + pos, self.old_pos, self.old_dir, distance, ctrl, + self.old_switch, self.railtype ) - if not found_path then - -- No rail found: reset back to the expected position - pos = vector.new(self.old_pos) + if new_pos then + -- No rail found: set to the expected position + pos = new_pos update.pos = true + cart_dir = new_dir end + elseif self.old_pos and self.old_dir.y ~= 1 and not self.punched then + -- Stop wiggle + stop_wiggle = true end - local cart_dir = carts:velocity_to_dir(vel) local railparams -- dir: New moving direction of the cart @@ -234,16 +243,25 @@ local function rail_on_step(self, dtime) local dir, switch_keys = carts:get_rail_direction( pos, cart_dir, ctrl, self.old_switch, self.railtype ) + local dir_changed = not vector.equals(dir, self.old_dir) local new_acc = {x=0, y=0, z=0} - if vector.equals(dir, {x=0, y=0, z=0}) then + if stop_wiggle or vector.equals(dir, {x=0, y=0, z=0}) then vel = {x = 0, y = 0, z = 0} - pos = vector.round(pos) + local pos_r = vector.round(pos) + if not carts:is_rail(pos_r, self.railtype) + and self.old_pos then + pos = self.old_pos + elseif not stop_wiggle then + pos = pos_r + else + pos.y = math.floor(pos.y + 0.5) + end update.pos = true update.vel = true else -- Direction change detected - if not vector.equals(dir, self.old_dir) then + if dir_changed then vel = vector.multiply(dir, math.abs(vel.x + vel.z)) update.vel = true if dir.y ~= self.old_dir.y then @@ -294,9 +312,9 @@ local function rail_on_step(self, dtime) end end - self.object:setacceleration(new_acc) - self.old_pos = vector.new(pos) - if not vector.equals(dir, {x=0, y=0, z=0}) then + self.object:set_acceleration(new_acc) + self.old_pos = vector.round(pos) + if not vector.equals(dir, {x=0, y=0, z=0}) and not stop_wiggle then self.old_dir = vector.new(dir) end self.old_switch = switch_keys @@ -332,7 +350,7 @@ local function rail_on_step(self, dtime) elseif self.old_dir.z < 0 then yaw = 1 end - self.object:setyaw(yaw * math.pi) + self.object:set_yaw(yaw * math.pi) local anim = {x=0, y=0} if dir.y == -1 then @@ -342,9 +360,15 @@ local function rail_on_step(self, dtime) end self.object:set_animation(anim, 1, 0) - self.object:setvelocity(vel) + if update.vel then + self.object:set_velocity(vel) + end if update.pos then - self.object:setpos(pos) + if dir_changed then + self.object:set_pos(pos) + else + self.object:move_to(pos) + end end -- call event handler diff --git a/mods/carts/depends.txt b/mods/carts/depends.txt index 4ad96d5..8e482ce 100644 --- a/mods/carts/depends.txt +++ b/mods/carts/depends.txt @@ -1 +1,2 @@ default +player_api diff --git a/mods/carts/functions.lua b/mods/carts/functions.lua index 9b7e2c6..a54b594 100644 --- a/mods/carts/functions.lua +++ b/mods/carts/functions.lua @@ -12,13 +12,13 @@ function carts:manage_attachment(player, obj) end local status = obj ~= nil local player_name = player:get_player_name() - if default.player_attached[player_name] == status then + if player_api.player_attached[player_name] == status then return end - default.player_attached[player_name] = status + player_api.player_attached[player_name] = status if status then - player:set_attach(obj, "", {x=0, y=6, z=0}, {x=0, y=0, z=0}) + player:set_attach(obj, "", {x=0, y=-4.5, z=0}, {x=0, y=0, z=0}) player:set_eye_offset({x=0, y=-4, z=0},{x=0, y=-4, z=0}) else player:set_detach() @@ -99,6 +99,16 @@ function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) right.z = -dir.x end + local straight_priority = ctrl and dir.y ~= 0 + + -- Normal, to disallow rail switching up- & downhill + if straight_priority then + cur = self:check_front_up_down(pos, dir, true, railtype) + if cur then + return cur + end + end + if ctrl then if old_switch == 1 then left_check = false @@ -106,14 +116,14 @@ function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) right_check = false end if ctrl.left and left_check then - cur = carts:check_front_up_down(pos, left, false, railtype) + cur = self:check_front_up_down(pos, left, false, railtype) if cur then return cur, 1 end left_check = false end if ctrl.right and right_check then - cur = carts:check_front_up_down(pos, right, false, railtype) + cur = self:check_front_up_down(pos, right, false, railtype) if cur then return cur, 2 end @@ -122,9 +132,11 @@ function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) end -- Normal - cur = carts:check_front_up_down(pos, dir, true, railtype) - if cur then - return cur + if not straight_priority then + cur = self:check_front_up_down(pos, dir, true, railtype) + if cur then + return cur + end end -- Left, if not already checked @@ -158,33 +170,37 @@ function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) return {x=0, y=0, z=0} end -function carts:pathfinder(pos_, old_pos, old_dir, ctrl, pf_switch, railtype) - if vector.equals(old_pos, pos_) then - return true - end +function carts:pathfinder(pos_, old_pos, old_dir, distance, ctrl, + pf_switch, railtype) local pos = vector.round(pos_) + if vector.equals(old_pos, pos) then + return + end + local pf_pos = vector.round(old_pos) local pf_dir = vector.new(old_dir) + distance = math.min(carts.path_distance_max, + math.floor(distance + 1)) - for i = 1, 3 do - pf_dir, pf_switch = carts:get_rail_direction( - pf_pos, pf_dir, ctrl, pf_switch, railtype) + for i = 1, distance do + pf_dir, pf_switch = self:get_rail_direction( + pf_pos, pf_dir, ctrl, pf_switch or 0, railtype) if vector.equals(pf_dir, {x=0, y=0, z=0}) then -- No way forwards - return false + return pf_pos, pf_dir end pf_pos = vector.add(pf_pos, pf_dir) if vector.equals(pf_pos, pos) then -- Success! Cart moved on correctly - return true + return end end - -- Cart not found - return false + -- Not found. Put cart to predicted position + return pf_pos, pf_dir end function carts:register_rail(name, def_overwrite, railparams) diff --git a/mods/carts/init.lua b/mods/carts/init.lua index 53b33cc..fe45303 100644 --- a/mods/carts/init.lua +++ b/mods/carts/init.lua @@ -7,14 +7,10 @@ carts.railparams = {} carts.speed_max = 7 -- Set to -1 to disable punching the cart from inside (min = -1) carts.punch_speed_max = 5 +-- Maximal distance for the path correction (for dtime peaks) +carts.path_distance_max = 3 dofile(carts.modpath.."/functions.lua") dofile(carts.modpath.."/rails.lua") - --- Support for non-default games -if not default.player_attached then - default.player_attached = {} -end - dofile(carts.modpath.."/cart_entity.lua") diff --git a/mods/carts/rails.lua b/mods/carts/rails.lua index 066779d..a5fff8a 100644 --- a/mods/carts/rails.lua +++ b/mods/carts/rails.lua @@ -22,7 +22,7 @@ minetest.register_alias("default:rail", "carts:rail") carts:register_rail("carts:powerrail", { - description = "Powered rail", + description = "Powered Rail", tiles = { "carts_rail_straight_pwr.png", "carts_rail_curved_pwr.png", "carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png" @@ -41,7 +41,7 @@ minetest.register_craft({ carts:register_rail("carts:brakerail", { - description = "Brake rail", + description = "Brake Rail", tiles = { "carts_rail_straight_brk.png", "carts_rail_curved_brk.png", "carts_rail_t_junction_brk.png", "carts_rail_crossing_brk.png" diff --git a/mods/creative/README.txt b/mods/creative/README.txt index 82357f3..32e8d22 100644 --- a/mods/creative/README.txt +++ b/mods/creative/README.txt @@ -9,4 +9,9 @@ Jean-Patrick G. (kilbith) (MIT) Author of media (textures) -------------------------- -Jean-Patrick G. (kilbith) (CC BY-SA 3.0) +paramat (CC BY-SA 3.0): +* creative_prev_icon.png +* creative_next_icon.png +* creative_search_icon.png +* creative_clear_icon.png +* creative_trash_icon.png derived from a texture by kilbith (CC BY-SA 3.0) diff --git a/mods/creative/init.lua b/mods/creative/init.lua index 2a590e3..0f8d4db 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -1,9 +1,31 @@ creative = {} +local function update_sfinv(name) + minetest.after(0, function() + local player = minetest.get_player_by_name(name) + if player then + if sfinv.get_page(player):sub(1, 9) == "creative:" then + sfinv.set_page(player, sfinv.get_homepage_name(player)) + else + sfinv.set_player_inventory_formspec(player) + end + end + end) +end + +minetest.register_privilege("creative", { + description = "Allow player to use creative inventory", + give_to_singleplayer = false, + give_to_admin = false, + on_grant = update_sfinv, + on_revoke = update_sfinv, +}) + local creative_mode_cache = minetest.settings:get_bool("creative_mode") function creative.is_enabled_for(name) - return creative_mode_cache + return creative_mode_cache or + minetest.check_player_privs(name, {creative = true}) end dofile(minetest.get_modpath("creative") .. "/inventory.lua") diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua index 0aad92b..6f485d5 100644 --- a/mods/creative/inventory.lua +++ b/mods/creative/inventory.lua @@ -112,10 +112,10 @@ function creative.register_tab(name, title, items) list[current_player;main;0,5.85;8,3;8] list[detached:creative_trash;main;4,3.3;1,1;] listring[] - button[5.4,3.2;0.8,0.9;creative_prev;<] - button[7.25,3.2;0.8,0.9;creative_next;>] - button[2.1,3.4;0.8,0.5;creative_search;?] - button[2.75,3.4;0.8,0.5;creative_clear;X] + image_button[5.4,3.25;0.8,0.8;creative_prev_icon.png;creative_prev;] + image_button[7.2,3.25;0.8,0.8;creative_next_icon.png;creative_next;] + image_button[2.1,3.25;0.8,0.8;creative_search_icon.png;creative_search;] + image_button[2.75,3.25;0.8,0.8;creative_clear_icon.png;creative_clear;] tooltip[creative_search;Search] tooltip[creative_clear;Reset] tooltip[creative_prev;Previous page] @@ -126,9 +126,7 @@ function creative.register_tab(name, title, items) "field[0.3,3.5;2.2,1;creative_filter;;" .. minetest.formspec_escape(inv.filter) .. "]" .. "listring[detached:creative_" .. player_name .. ";main]" .. "list[detached:creative_" .. player_name .. ";main;0,0;8,3;" .. tostring(start_i) .. "]" .. - default.get_hotbar_bg(0,4.7) .. - default.gui_bg .. default.gui_bg_img .. default.gui_slots - .. creative.formspec_add, false) + default.get_hotbar_bg(0,4.7) .. creative.formspec_add, false) end, on_enter = function(self, player, context) local player_name = player:get_player_name() diff --git a/mods/creative/license.txt b/mods/creative/license.txt index 4ad1d5f..50ff9c7 100644 --- a/mods/creative/license.txt +++ b/mods/creative/license.txt @@ -30,6 +30,7 @@ Licenses of media (textures) Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) Copyright (C) 2016 Jean-Patrick G. (kilbith) +Copyright (C) 2018 paramat You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/creative/textures/creative_clear_icon.png b/mods/creative/textures/creative_clear_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9244264adcf8a710ff13a2d684f148f997f1522f GIT binary patch literal 708 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVCwdCaSW-r_4ck|p0J|`+k@?8 z)4T38Ghetp_qK?~6E??3JeK}D7|j>(if@>5FNQ(xtQ%9xq#I|>oJ-rk-tWo9fB*MH zp5A261T+u{c%448b?emavpj!@3x2dSE|*=GYrgL7A+xn2b!l~{&a|J|bNs}_tEEWpk`5!2*`a}1RyVnJUKYCsTDmAJZ691N{Rw#iPDykKZKfD4SDBXYZavSfp zt(M8LUICfU&F8YHzp0s=(DY%oUz2h9J|Q20x{sb8K$MJ(p@+4@qz<4 z!kg0dK3Eysi%9);Rd;NiTfc_o`reublauX^hYkL8bi5ZVT=BywU-{9yDV`H%&hFSD z{eSy3XBU}c*&BW+C(O>xi5IGCE-m?*7^bhf!nSDs-Ve5G964XH7nBIy_{nX@*CKED zC9J9A$E62L@3|g1-|-{rXX!rIBX13O=8G=aFLdP6;d1{6XTq5t?lu(JC&Y2TP@!hB z!wW0ribzTW? zv>WHHXDQnUw9_l$Ihb?k|95ulYSoBmH}=bWKa)PledlLA%OVzTzIe`-^(=?Nn=}vK z|5|oXdfI~7>hssAan;KT<|{qg^yu`QKY#yx%+Ejmf9+EvCB5Qf=OwiwTl#JLZgovQ z!0-C6bfNb@zk-X!W`9H8=%_c!chCE&^5PxeZU@em`wuKW9OwuSX$khe@MP~-NmYTm zX3qx;1G)7Yj~~+PMrdBTn&4iAk_ zCzVg(Na=19?+|cZ@IbL5e8K}(p%j$~LCzBsW`=l_98+=LxOqcU#KxZ4bF1w%xt0{a z`}n5x5A!4yPfR4$8*;e!gynrkwWs^THJ8fwm6_+NZhvfNz`X2$*7H3+nrmg>zn$fk zcU;DTEsp7Yqx;j4fC<766bo4PXc+pOTKe$LWCb^d;0JOacKq4RS~rcuZuyjTGNpGJ zdGs?sCo&vRd%owBN{66>{6Xdinj19ZyXSmv6+FVRpg$o@?6BAl?l~2f9l{R##m}7n zuvdnKCqd%iW=9Tg|0WBd0qnUq*`xfMA{hVF3Oz`Y&}R^LW-c%^fl>ZU%pX(?803|t z4oqwB*k7+NsASMk@89(JA%AxN0fuev7cTA1*!Id^O!B}t4yQjGPcSs;x3LM-7@9OZ z=w8Uk63@e{@FOXM;ULghj(rkR4j+zQ04pijarA>!#Pd1(`(A$LlzLtR)BDcFwBi3|wtWop4gCi;u{`7xI8ZA2L-PYy1jFf#wRRI3-_)Pq&*Imx z{ps&h?Ts7z{(f(M7~k`?l9BmF{*UDcW^d%bulm8@@b{Ao7I4RluIDspxZ8IB{^$7q z%7?}cf4Be5TKAJ}!~JbQq4U|*l{*+&ZhqrE(0ZO>k$w%({XjJjxaR}i|AR;2$Dwqf z`|W`4{~+n`0jQ)&zs5XMrtS@Ycb-gLPVZrJhW300zWWR^`xq^1m zyWUxR_7M!z4@iFKeHXjyz0AM7AYOB&=QfLf7qn^Ky}aAIU0%C^v)*oIvhlX<8Qz#F e2P9I`9q-0Hd(Hm59fiOI%i!ti=d#Wzp$P!RnKjM; literal 0 HcmV?d00001 diff --git a/mods/creative/textures/creative_prev_icon.png b/mods/creative/textures/creative_prev_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b26cd157f95aec853fce734574e5d319686b8399 GIT binary patch literal 728 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV4Cmg;uunK>+N0tY+*-+wvXwz zGV{>pV?eWW(PFe13zpU}_uI~@{8;u``%wXt0z|TCv@W=53 ztRMJxFuiNkXH!Uj7SHg$kzbdg{D8B3-}@7a_p+b$H~Jso*ufG9bg|50?E~*-*6%X= zp{oh6V%o%>4{WH7l z+KFfIj_uWexoBz8%lvY1e!z>W-gU6xbp)te5*7FQ4;`@FuSbT0~ zesG4L&*4{?z7>OZv;DH)_5U<-S8qQZ_~60(<+)##!W(qOD`oz)FjP!bw_p(4_kbbd zN0ax0R{aXr4Ifz94;&JgVc?E0V9=>KsCwa$_#P&pH1mab=j|8n_P%~ddT!%xg0c8qq1w4R9hWi^tX~{&$kePP23tw zeX`cxZ>W6Da{BQG9yOK(U6%RbeTUyBcriqA%*$HKuiaYEC*D%Tv|*dj8Y31>#v1}n zJC7RZFi3YLX3l4f(>TR(pe@NFWB$b5%@Y{bh#r3WZow{V4z7mX%*+XfCJbWEc&QD$ zCG=cd75-&De5v@MmhqvY0RuYzFUG_yAk(D%K>V)u6JCc14zZH;J^%Usm@rf-MqJoy zR_9bc``1JH*@t)U|JE_;r*hEgWpDPBKS7mN|uQ4@RU{bU;RZBGG9cM4QZ&YGw2;badcT z8^0=@n`5_k4cg)jkHrR_ZUs6C)#;ru{p*MnFzSSy14BnK9k99qvx%(Q|Ku6*tVeE= z;j}fOm}70k#m=-1{B|WKep=e`sqE6mH$a&vhfe)BT5{~=GqH7W4FDtAPF6XfUJMg0 zG)SRiFgWX|#Hdo<6h%bjftQL_(g^a6TBkuGS!%-M3?v2!!-LD$RV3F+$;z#Y3Lq&# z_lXLz)euUtSfqnLL7jl2b-JcIw!dO0JQC!^>f882mU~^SkXzr`0xD$%3+f2q+OnxW z1#r9If&|iNnfe3`b*4|E043HiVCS~J?2$Nf98bhA$TsSxMtQ>bU0iB`d;--0U8=Ry zJ$(nF6is0}714=%paq!4^8&7*G-=qVnCc)Uq1GXZTEy1xasEqQke2{%ythu6(G*D6 zDF?-+D!Ue41yd=tX`8nuzFuMdv3v8p=sx4(#)k(VUp+7uXc=E9WXOjk_@2pQs9(A3 z%Fe+(gW#yEwq~Ezh<5oM;;RAsmL}jVtqyDg;3RO6+(ZS+wa!eGy%Xv)cY8sdSn&;K z=Ps^SBI2ddjn|*vyW-*bv2?_ZIuz7pOr~qbsWd5m^(%dw z+V538xQ3H(-4_xppDzC3sA8pkh`&sY6Nru)^Z(SD+qXv7TA(SYSIuP68ayyP+H0?< zaowVMuFU-jk-0cLhl6vgDyMeXaRacK-*^{WOw9U|9&j|Vd<#9+JeGf*Iy5>ye)R3f z!qwGPGPOQQ{6H;&(Wc;AI2huTl){mQQt=*;F&g!IJS<08ZLf>0u+ENg7s343c&1m7mb$YSA$oW=Ou(;WVMAGQ+9 zU{v(RH~IzT(6ZnE)c?h#57hs2bs8di1zc28QeyD_;W>7ZU(8N^yT}Ash708loHCa&7K!Wixy30l1~_H zt%s71ttI{vsu(~*IL^WdO-8p|;mo$+Ut=}jyoU52j>@^LpIy;y;Aknl_Rb!tje;t0 z4`ZQ&Pd~ODxH|QAh4G_8Ov>8b6FKrNMcniQ{aQW-sL+^9m+j?+iW)Y8u-@$4+ZyKqr5_OPwunRDLxq8ZX8<(~$=F88q9F&sb0`#Qm~!Ma?^gL*o;c9xJrXIg(l#>Bs<*5P z_Oorurv`1CY#wa(+`Gd3dpUO9?{|2zxdX|~OX;BN^lt;g?q=M*AyZzwcOF=an-aR$ zWvqD9Pja5@lpfUFh3giFZ@YlBpa8ns&|&HPv69cekehvTx1-3K!uJ{pthx&pQMU_X zz_OYBuTku;iCT@2eL`2sndtrXyaIV!7w1Pc;qV4`&`*DVI@)O3>nZp58l2 zh86Z3I>$`!bGRg_`o{BU|3AaXW{t-BrPl3lJI0##E>?4JbBElN!tO>W;jyUC9TP&C zcdY$f=J{hbR^H#JQa?PKHouPy0s)EE-W+MDc;Xz%zs`T$`R%Yt?QXQVAN^tty#4`5(6Lbv2~siR@4 z@`h)pegmd;G66wTd;1v6$`5#mabMDZA>){oRw~(J+i2oaY0;7FQaR<-xTRoy>!JU5 oz)Hy+PJ7*y{67!tO!d0_mw-1lpr~N2?{5lnuywWJ5y{E_0lF-AYXATM literal 0 HcmV?d00001 diff --git a/mods/creative/textures/creative_trash_icon.png b/mods/creative/textures/creative_trash_icon.png index e789ad634450a5fa5227e9efd8fe804703d3eece..7d7a0a62f36472ffcc08cd07422d1c5e17e45e3b 100644 GIT binary patch literal 712 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVCwgDaSW-r_4e+?-dhe5trxww zq*naqXuWX$%VVcGb_I&R1tv_`WU!j2d1GzgmQ#n_%r@D(8r!SMY)V`@C3wbkp`zrO9YquH$qXGj<1H+Alhfi&G|FJ(}SLs?`@OU z=Ko=Q^1aIOQ@pdR=KhzuvG=pT`FdxDxp@Z+zq8vWPg;3>!84VT2}&@z?=%LBL9Hq~$8|9AiV@%4Xy%;s14dR}%* zon77A&m;qutR!##$3==^`3{2oa1xFUptOVYBf1?jSv-y|x zQ#1GeuC3o5=i4=WKHIvdyz#uX-M?+jJ8Bj`d-DSr7ho$7bd@n~t^F`3MPuolJ6-v_ z)3Z&!%~Jltw_qE;+@zXk@59#=*ZUcKouw=zcJKN8Nip?5uFpu(S=s~FpY@DkZE@4y u*Z=k$xWstn8Ot*UZhL(O28IL6Y8X5J>UjzKQU*6 zfkJAYE{-7_*OL=$4jfo=K;eJ8V`JyRfAY-?+|4IMbT~B5{cmn;WMp`p!KrFv-vct4 N!PC{xWt~$(69DO#EW-c* diff --git a/mods/default/README.txt b/mods/default/README.txt index 75f869d..8642b39 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -4,14 +4,20 @@ See license.txt for license information. Authors of source code ---------------------- -Originally by celeron55, Perttu Ahola (LGPL 2.1) -Various Minetest developers and contributors (LGPL 2.1) +Originally by celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest developers and contributors (LGPLv2.1+) -Authors of media (textures, models and sounds) ----------------------------------------------- +The torch code was derived by sofar from the 'torches' mod by +BlockMen (LGPLv2.1+) + +Authors of media (textures, sounds, models and schematics) +---------------------------------------------------------- Everything not listed in here: celeron55, Perttu Ahola (CC BY-SA 3.0) + +Textures +-------- Cisoun's texture pack (CC BY-SA 3.0): default_jungletree.png default_lava.png @@ -23,25 +29,15 @@ Cisoun's texture pack (CC BY-SA 3.0): default_tree_top.png default_water.png -Cisoun's conifers mod (CC BY-SA 3.0): - default_pine_needles.png - -Originating from G4JC's Almost MC Texture Pack (CC BY-SA 3.0): - default_torch.png - default_torch_on_ceiling.png - default_torch_on_floor.png - -VanessaE's animated torches (CC BY-SA 3.0): - default_torch_animated.png - default_torch_on_ceiling_animated.png - default_torch_on_floor_animated.png - default_torch_on_floor.png - RealBadAngel's animated water (CC BY-SA 3.0): default_water_source_animated.png default_water_flowing_animated.png VanessaE (CC BY-SA 3.0): + default_torch_animated.png + default_torch_on_ceiling_animated.png + default_torch_on_floor_animated.png + default_torch_on_floor.png default_desert_sand.png default_desert_stone.png default_sand.png @@ -52,13 +48,6 @@ Calinou (CC BY-SA 3.0): default_brick.png default_papyrus.png default_mineral_copper.png - default_glass_detail.png - -MirceaKitsune (CC BY-SA 3.0): - character.x - -Jordach (CC BY-SA 3.0): - character.png PilzAdam (CC BY-SA 3.0): default_jungleleaves.png @@ -75,6 +64,7 @@ InfinityProject (CC BY-SA 3.0): Splizard (CC BY-SA 3.0): default_pine_sapling.png + default_pine_needles.png Zeg9 (CC BY-SA 3.0): default_coal_block.png @@ -88,11 +78,13 @@ paramat (CC BY-SA 3.0): default_acacia_leaves_simple.png default_acacia_sapling.png default_acacia_bush_sapling.png + default_pine_bush_sapling.png default_acacia_tree.png default_acacia_tree_top.png default_acacia_wood.png default_acacia_bush_stem.png default_bush_stem.png + default_pine_bush_stem.png default_junglewood.png default_jungletree_top.png default_sandstone_brick.png @@ -120,9 +112,23 @@ paramat (CC BY-SA 3.0): default_silver_sandstone_brick.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) default_silver_sandstone_block.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) default_bookshelf_slot.png -- Derived from a texture by Gambit (CC-BY-SA 3.0) + default_marram_grass_*.png -- Derived from textures by TumeniNodes (CC-BY-SA 3.0) + default_emergent_jungle_sapling.png + default_permafrost.png -- Derived from a texture by Neuromancer (CC BY-SA 3.0) + default_stones.png -- Derived from a texture by sofar (CC0 1.0) + default_stones_side.png -- Derived from a texture by sofar (CC0 1.0) + default_moss.png + default_moss_side.png + default_fence_rail_acacia_wood + default_fence_rail_aspen_wood -- Derived from a texture by sofar (CC BY-SA 3.0) + default_fence_rail_junglewood + default_fence_rail_pine_wood + default_fence_rail_wood -- Derived from a texture by BlockMen (CC BY-SA 3.0) -brunob.santos (CC BY-SA 4.0): - default_desert_cobble.png +TumeniNodes (CC BY-SA 3.0): + default_desert_cobble.png -- Derived from a texture by brunob.santos (CC BY-SA 3.0) + default_coniferous_litter.png + default_coniferous_litter_side.png BlockMen (CC BY-SA 3.0): default_aspen_leaves.png -- Derived from Sofar's texture @@ -152,15 +158,12 @@ sofar (CC BY-SA 3.0): default_aspen_wood, derived from default_pine_wood (by paramat) default_chest_inside -sofar (WTFPL): +sofar (CC0 1.0): default_gravel.png -- Derived from Gambit's PixelBOX texture pack light gravel -Neuromancer (CC BY-SA 2.0): +Neuromancer (CC BY-SA 3.0): default_cobble.png, based on texture by Brane praefect default_mossycobble.png, based on texture by Brane praefect - -Neuromancer (CC BY-SA 3.0): - default_dirt.png default_furnace_*.png Gambit (CC BY-SA 3.0): @@ -187,7 +190,7 @@ Gambit (CC BY-SA 3.0): asl97 (CC BY-SA 3.0): default_ice.png -KevDoy (CC BY-SA 3.0) +KevDoy (CC BY-SA 3.0): heart.png Pithydon (CC BY-SA 3.0) @@ -195,11 +198,10 @@ Pithydon (CC BY-SA 3.0) default_coral_orange.png default_coral_skeleton.png -Ferk (CC0 1.0) +Ferk (CC0 1.0): default_item_smoke.png - default_item_smoke.ogg, based on sound by http://opengameart.org/users/bart -npx (CC BY-SA 3.0) +npx (CC BY-SA 3.0): default_rainforest_litter.png default_rainforest_litter_side.png @@ -218,18 +220,42 @@ kilbith (CC BY-SA 3.0): default_tin_ingot.png default_tin_lump.png +tobyplowy (CC BY-SA 3.0): + default_kelp.png + CloudyProton (CC BY-SA 3.0): default_book_written.png, based on default_book.png by Gambit +Mossmanikin (CC BY-SA 3.0): + default_fern_*.png + +random-geek (CC BY-SA 3.0): + default_blueberries.png + default_blueberry_overlay.png + default_blueberry_bush_leaves.png, derived from default_bush_leaves (by paramat) + default_blueberry_bush_sapling.png + default_dirt.png -- Derived from a texture by Neuromancer (CC BY-SA 3.0) + +Krock (CC0 1.0): + default_glass.png + default_glass_detail.png + +Topywo (CC BY-SA 3.0) + default_coral_cyan.png + default_coral_green.png + default_coral_pink.png + +Extex101 (CC BY-SA 3.0) + default_large_cactus_seedling.png + + +Sounds +------ Glass breaking sounds (CC BY 3.0): 1: http://www.freesound.org/people/cmusounddesign/sounds/71947/ 2: http://www.freesound.org/people/Tomlija/sounds/97669/ 3: http://www.freesound.org/people/lsprice/sounds/88808/ -sonictechtonic (CC BY 3.0): -https://www.freesound.org/people/sonictechtonic/sounds/241872/ - player_damage.ogg - Mito551 (sounds) (CC BY-SA 3.0): default_dig_choppy.ogg default_dig_cracky.ogg @@ -252,8 +278,6 @@ Mito551 (sounds) (CC BY-SA 3.0): default_place_node.3.ogg default_place_node_hard.1.ogg default_place_node_hard.2.ogg - default_snow_footstep.1.ogg - default_snow_footstep.2.ogg default_hard_footstep.1.ogg default_hard_footstep.2.ogg default_hard_footstep.3.ogg @@ -278,14 +302,14 @@ Metal sounds: Tool breaking sounds added by sofar: CC-BY-3.0 default_tool_breaks.* - http://www.freesound.org/people/HerbertBoland/sounds/33206/ -AGFX (CC BY 3.0) +AGFX (CC BY 3.0): https://www.freesound.org/people/AGFX/packs/1253/ default_water_footstep.1.ogg default_water_footstep.2.ogg default_water_footstep.3.ogg (default_water_footstep.4.ogg is silent) -blukotek (CC0 1.0) +blukotek (CC0 1.0): https://www.freesound.org/people/blukotek/sounds/251660/ default_dig_snappy.ogg @@ -298,3 +322,56 @@ Chests sounds added by sofar, derived of several files mixed together: - http://www.freesound.org/people/bulbastre/sounds/126887/ CC-BY-3.0 - http://www.freesound.org/people/Yoyodaman234/sounds/183541/ CC0 +Ryding (CC0 1.0): +http://freesound.org/people/Ryding/sounds/94337/ + default_snow_footstep.*.ogg + +Ferk (CC0 1.0): + default_item_smoke.ogg, based on a sound by http://opengameart.org/users/bart + + +Models +------ +sofar (CC BY-SA 3.0): + chest_open.obj + torch_ceiling.obj + torch_floor.obj + torch_wall.obj + + +Schematics +---------- +paramat (CC BY-SA 3.0): + acacia_bush.mts + acacia_tree.mts + acacia_tree_from_sapling.mts + apple_tree.mts + apple_tree_from_sapling.mts + aspen_tree.mts + aspen_tree_from_sapling.mts + bush.mts + emergent_jungle_tree.mts + emergent_jungle_tree_from_sapling.mts + jungle_tree.mts + jungle_tree_from_sapling.mts + large_cactus.mts + papyrus.mts + pine_tree.mts + pine_tree_from_sapling.mts + snowy_pine_tree_from_sapling.mts + small_pine_tree.mts + small_pine_tree_from_sapling.mts + snowy_small_pine_tree_from_sapling.mts + +Shara RedCat (CC BY-SA 3.0): + acacia_log.mts + apple_log.mts + aspen_log.mts + jungle_log.mts + pine_log.mts + +TumeniNodes (CC BY-SA 3.0): + pine_bush.mts + +random-geek (CC BY-SA 3.0): + blueberry_bush.mts diff --git a/mods/default/chests.lua b/mods/default/chests.lua new file mode 100644 index 0000000..b70e5ad --- /dev/null +++ b/mods/default/chests.lua @@ -0,0 +1,318 @@ +default.chest = {} + +function default.chest.get_chest_formspec(pos) + local spos = pos.x .. "," .. pos.y .. "," .. pos.z + local formspec = + "size[8,9]" .. + "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" .. + "list[current_player;main;0,4.85;8,1;]" .. + "list[current_player;main;0,6.08;8,3;8]" .. + "listring[nodemeta:" .. spos .. ";main]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,4.85) + return formspec +end + +function default.chest.chest_lid_obstructed(pos) + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local def = minetest.registered_nodes[minetest.get_node(above).name] + -- allow ladders, signs, wallmounted things and torches to not obstruct + if def and + (def.drawtype == "airlike" or + def.drawtype == "signlike" or + def.drawtype == "torchlike" or + (def.drawtype == "nodebox" and def.paramtype2 == "wallmounted")) then + return false + end + return true +end + +function default.chest.chest_lid_close(pn) + local chest_open_info = default.chest.open_chests[pn] + local pos = chest_open_info.pos + local sound = chest_open_info.sound + local swap = chest_open_info.swap + + default.chest.open_chests[pn] = nil + for k, v in pairs(default.chest.open_chests) do + if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then + return true + end + end + + local node = minetest.get_node(pos) + minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap, + param2 = node.param2 }) + minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10}) +end + +default.chest.open_chests = {} + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "default:chest" then + return + end + if not player or not fields.quit then + return + end + local pn = player:get_player_name() + + if not default.chest.open_chests[pn] then + return + end + + default.chest.chest_lid_close(pn) + return true +end) + +minetest.register_on_leaveplayer(function(player) + local pn = player:get_player_name() + if default.chest.open_chests[pn] then + default.chest.chest_lid_close(pn) + end +end) + +function default.chest.register_chest(name, d) + local def = table.copy(d) + def.drawtype = "mesh" + def.visual = "mesh" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.legacy_facedir_simple = true + def.is_ground_content = false + + if def.protected then + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Locked Chest") + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end + def.after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", "Locked Chest (owned by " .. + meta:get_string("owner") .. ")") + end + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") and + default.can_interact_with_node(player, pos) + end + def.allow_metadata_inventory_move = function(pos, from_list, from_index, + to_list, to_index, count, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return count + end + def.allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return stack:get_count() + end + def.allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return stack:get_count() + end + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if not default.can_interact_with_node(clicker, pos) then + return itemstack + end + + minetest.sound_play(def.sound_open, {gain = 0.3, + pos = pos, max_hear_distance = 10}) + if not default.chest.chest_lid_obstructed(pos) then + minetest.swap_node(pos, + { name = "default:" .. name .. "_open", + param2 = node.param2 }) + end + minetest.after(0.2, minetest.show_formspec, + clicker:get_player_name(), + "default:chest", default.chest.get_chest_formspec(pos)) + default.chest.open_chests[clicker:get_player_name()] = { pos = pos, + sound = def.sound_close, swap = name } + end + def.on_blast = function() end + def.on_key_use = function(pos, player) + local secret = minetest.get_meta(pos):get_string("key_lock_secret") + local itemstack = player:get_wielded_item() + local key_meta = itemstack:get_meta() + + if itemstack:get_metadata() == "" then + return + end + + if key_meta:get_string("secret") == "" then + key_meta:set_string("secret", minetest.parse_json(itemstack:get_metadata()).secret) + itemstack:set_metadata("") + end + + if secret ~= key_meta:get_string("secret") then + return + end + + minetest.show_formspec( + player:get_player_name(), + "default:chest_locked", + default.chest.get_chest_formspec(pos) + ) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pn = player:get_player_name() + + -- verify placer is owner of lockable chest + if owner ~= pn then + minetest.record_protection_violation(pos, pn) + minetest.chat_send_player(pn, "You do not own this chest.") + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, "a locked chest", owner + end + else + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end + def.on_rightclick = function(pos, node, clicker) + minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos, + max_hear_distance = 10}) + if not default.chest.chest_lid_obstructed(pos) then + minetest.swap_node(pos, { + name = "default:" .. name .. "_open", + param2 = node.param2 }) + end + minetest.after(0.2, minetest.show_formspec, + clicker:get_player_name(), + "default:chest", default.chest.get_chest_formspec(pos)) + default.chest.open_chests[clicker:get_player_name()] = { pos = pos, + sound = def.sound_close, swap = name } + end + def.on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "main", drops) + drops[#drops+1] = "default:" .. name + minetest.remove_node(pos) + return drops + end + end + + def.on_metadata_inventory_move = function(pos, from_list, from_index, + to_list, to_index, count, player) + minetest.log("action", player:get_player_name() .. + " moves stuff in chest at " .. minetest.pos_to_string(pos)) + end + def.on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name() .. + " moves " .. stack:get_name() .. + " to chest at " .. minetest.pos_to_string(pos)) + end + def.on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name() .. + " takes " .. stack:get_name() .. + " from chest at " .. minetest.pos_to_string(pos)) + end + + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + def_opened.mesh = "chest_open.obj" + for i = 1, #def_opened.tiles do + if type(def_opened.tiles[i]) == "string" then + def_opened.tiles[i] = {name = def_opened.tiles[i], backface_culling = true} + elseif def_opened.tiles[i].backface_culling == nil then + def_opened.tiles[i].backface_culling = true + end + end + def_opened.drop = "default:" .. name + def_opened.groups.not_in_creative_inventory = 1 + def_opened.selection_box = { + type = "fixed", + fixed = { -1/2, -1/2, -1/2, 1/2, 3/16, 1/2 }, + } + def_opened.can_dig = function() + return false + end + def_opened.on_blast = function() end + + def_closed.mesh = nil + def_closed.drawtype = nil + def_closed.tiles[6] = def.tiles[5] -- swap textures around for "normal" + def_closed.tiles[5] = def.tiles[3] -- drawtype to make them match the mesh + def_closed.tiles[3] = def.tiles[3].."^[transformFX" + + minetest.register_node("default:" .. name, def_closed) + minetest.register_node("default:" .. name .. "_open", def_opened) + + -- convert old chests to this new variant + minetest.register_lbm({ + label = "update chests to opening chests", + name = "default:upgrade_" .. name .. "_v2", + nodenames = {"default:" .. name}, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", nil) + local inv = meta:get_inventory() + local list = inv:get_list("default:chest") + if list then + inv:set_size("main", 8*4) + inv:set_list("main", list) + inv:set_list("default:chest", nil) + end + end + }) +end + +default.chest.register_chest("chest", { + description = "Chest", + tiles = { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_front.png", + "default_chest_inside.png" + }, + sounds = default.node_sound_wood_defaults(), + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, +}) + +default.chest.register_chest("chest_locked", { + description = "Locked Chest", + tiles = { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_lock.png", + "default_chest_inside.png" + }, + sounds = default.node_sound_wood_defaults(), + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, + protected = true, +}) diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index 2d11d26..b49dc48 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -49,6 +49,13 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "default:pine_wood", + recipe = { + {"default:pine_bush_stem"}, + } +}) + minetest.register_craft({ output = 'default:stick 4', recipe = { @@ -763,14 +770,35 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "default:emergent_jungle_sapling", + recipe = { + {"default:junglesapling", "default:junglesapling", "default:junglesapling"}, + {"default:junglesapling", "default:junglesapling", "default:junglesapling"}, + {"default:junglesapling", "default:junglesapling", "default:junglesapling"}, + } +}) + +minetest.register_craft({ + output = "default:large_cactus_seedling", + recipe = { + {"", "default:cactus", ""}, + {"default:cactus", "default:cactus", "default:cactus"}, + {"", "default:cactus", ""}, + } +}) + + -- -- Crafting (tool repair) -- + minetest.register_craft({ type = "toolrepair", additional_wear = -0.02, }) + -- -- Cooking recipes -- @@ -849,6 +877,7 @@ minetest.register_craft({ cooktime = 5, }) + -- -- Fuels -- @@ -940,6 +969,12 @@ minetest.register_craft({ burntime = 4, }) +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_bush_sapling", + burntime = 2, +}) + minetest.register_craft({ type = "fuel", recipe = "default:aspen_sapling", @@ -964,6 +999,12 @@ minetest.register_craft({ burntime = 6, }) +minetest.register_craft({ + type = "fuel", + recipe = "default:emergent_jungle_sapling", + burntime = 7, +}) + minetest.register_craft({ type = "fuel", @@ -996,6 +1037,37 @@ minetest.register_craft({ }) +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_aspen_wood", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_pine_wood", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_wood", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_acacia_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_junglewood", + burntime = 7, +}) + + minetest.register_craft({ type = "fuel", recipe = "default:bush_stem", @@ -1008,6 +1080,12 @@ minetest.register_craft({ burntime = 8, }) +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_bush_stem", + burntime = 6, +}) + minetest.register_craft({ type = "fuel", recipe = "default:junglegrass", @@ -1026,6 +1104,12 @@ minetest.register_craft({ burntime = 15, }) +minetest.register_craft({ + type = "fuel", + recipe = "default:large_cactus_seedling", + burntime = 5, +}) + minetest.register_craft({ type = "fuel", recipe = "default:papyrus", @@ -1098,6 +1182,18 @@ minetest.register_craft({ burntime = 2, }) +minetest.register_craft({ + type = "fuel", + recipe = "default:fern_1", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:marram_grass_1", + burntime = 2, +}) + minetest.register_craft({ type = "fuel", recipe = "default:paper", diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index e1d224d..6a1b570 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -50,16 +50,14 @@ local function book_on_use(itemstack, user) local formspec if owner == player_name then - formspec = "size[8,8]" .. default.gui_bg .. - default.gui_bg_img .. + formspec = "size[8,8]" .. "field[0.5,1;7.5,0;title;Title:;" .. minetest.formspec_escape(title) .. "]" .. "textarea[0.5,1.5;7.5,7;text;Contents:;" .. minetest.formspec_escape(text) .. "]" .. "button_exit[2.5,7.5;3,1;save;Save]" else - formspec = "size[8,8]" .. default.gui_bg .. - default.gui_bg_img .. + formspec = "size[8,8]" .. "label[0.5,0.5;by " .. owner .. "]" .. "tablecolumns[color;text]" .. "tableoptions[background=#00000000;highlight=#00000000;border=false]" .. @@ -121,7 +119,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if inv:room_for_item("main", new_stack) then inv:add_item("main", new_stack) else - minetest.add_item(player:getpos(), new_stack) + minetest.add_item(player:get_pos(), new_stack) end else stack:get_meta():from_table({ fields = data }) @@ -247,7 +245,7 @@ minetest.register_craftitem("default:skeleton_key", { itemstack = new_stack else if inv:add_item("main", new_stack):get_count() > 0 then - minetest.add_item(user:getpos(), new_stack) + minetest.add_item(user:get_pos(), new_stack) end -- else: added to inventory successfully end @@ -341,3 +339,9 @@ minetest.register_craftitem("default:flint", { description = "Flint", inventory_image = "default_flint.png" }) + +minetest.register_craftitem("default:blueberries", { + description = "Blueberries", + inventory_image = "default_blueberries.png", + on_use = minetest.item_eat(2), +}) diff --git a/mods/default/depends.txt b/mods/default/depends.txt new file mode 100644 index 0000000..e1c3818 --- /dev/null +++ b/mods/default/depends.txt @@ -0,0 +1 @@ +player_api? diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 4c8d2f0..1165c89 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -1,5 +1,3 @@ --- mods/default/functions.lua - -- -- Sounds -- @@ -117,6 +115,21 @@ function default.node_sound_water_defaults(table) return table end +function default.node_sound_snow_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_snow_footstep", gain = 0.2} + table.dig = table.dig or + {name = "default_snow_footstep", gain = 0.3} + table.dug = table.dug or + {name = "default_snow_footstep", gain = 0.3} + table.place = table.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(table) + return table +end + + -- -- Lavacooling -- @@ -145,8 +158,9 @@ if minetest.settings:get_bool("enable_lavacooling") ~= false then }) end + -- --- optimized helper to put all items in an inventory into a drops list +-- Optimized helper to put all items in an inventory into a drops list -- function default.get_inventory_drops(pos, inventory, drops) @@ -161,11 +175,12 @@ function default.get_inventory_drops(pos, inventory, drops) end end + -- -- Papyrus and cactus growing -- --- wrapping the functions in abm action is necessary to make overriding them possible +-- Wrapping the functions in ABM action is necessary to make overriding them possible function default.grow_cactus(pos, node) if node.param2 >= 4 then @@ -242,7 +257,7 @@ minetest.register_abm({ -- --- dig upwards +-- Dig upwards -- function default.dig_up(pos, node, digger) @@ -288,7 +303,7 @@ function default.register_fence(name, def) connect_right = {{1/8,3/16,-1/16,1/2,5/16,1/16}, {1/8,-5/16,-1/16,1/2,-3/16,1/16}}, }, - connects_to = {"group:fence", "group:wood", "group:tree"}, + connects_to = {"group:fence", "group:wood", "group:tree", "group:wall"}, inventory_image = fence_texture, wield_image = fence_texture, tiles = {def.texture}, @@ -312,6 +327,71 @@ function default.register_fence(name, def) end +-- +-- Fence rail registration helper +-- + +function default.register_fence_rail(name, def) + minetest.register_craft({ + output = name .. " 16", + recipe = { + { def.material, def.material }, + { "", ""}, + { def.material, def.material }, + } + }) + + local fence_rail_texture = "default_fence_rail_overlay.png^" .. def.texture .. + "^default_fence_rail_overlay.png^[makealpha:255,126,126" + -- Allow almost everything to be overridden + local default_fields = { + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = { + {-1/16, 3/16, -1/16, 1/16, 5/16, 1/16}, + {-1/16, -3/16, -1/16, 1/16, -5/16, 1/16} + }, + -- connect_top = + -- connect_bottom = + connect_front = { + {-1/16, 3/16, -1/2, 1/16, 5/16, -1/16}, + {-1/16, -5/16, -1/2, 1/16, -3/16, -1/16}}, + connect_left = { + {-1/2, 3/16, -1/16, -1/16, 5/16, 1/16}, + {-1/2, -5/16, -1/16, -1/16, -3/16, 1/16}}, + connect_back = { + {-1/16, 3/16, 1/16, 1/16, 5/16, 1/2}, + {-1/16, -5/16, 1/16, 1/16, -3/16, 1/2}}, + connect_right = { + {1/16, 3/16, -1/16, 1/2, 5/16, 1/16}, + {1/16, -5/16, -1/16, 1/2, -3/16, 1/16}}, + }, + connects_to = {"group:fence", "group:wall"}, + inventory_image = fence_rail_texture, + wield_image = fence_rail_texture, + tiles = {def.texture}, + sunlight_propagates = true, + is_ground_content = false, + groups = {}, + } + for k, v in pairs(default_fields) do + if def[k] == nil then + def[k] = v + end + end + + -- Always add to the fence group, even if no group provided + def.groups.fence = 1 + + def.texture = nil + def.material = nil + + minetest.register_node(name, def) +end + + -- -- Leafdecay -- @@ -386,6 +466,7 @@ function default.register_leafdecay(def) end end + -- -- Convert dirt to something that fits the environment -- @@ -482,63 +563,7 @@ minetest.register_abm({ -- --- Checks if specified volume intersects a protected volume --- - -function default.intersects_protection(minp, maxp, player_name, interval) - -- 'interval' is the largest allowed interval for the 3D lattice of checks - - -- Compute the optimal float step 'd' for each axis so that all corners and - -- borders are checked. 'd' will be smaller or equal to 'interval'. - -- Subtracting 1e-4 ensures that the max co-ordinate will be reached by the - -- for loop (which might otherwise not be the case due to rounding errors). - local d = {} - for _, c in pairs({"x", "y", "z"}) do - if maxp[c] > minp[c] then - d[c] = (maxp[c] - minp[c]) / math.ceil((maxp[c] - minp[c]) / interval) - 1e-4 - elseif maxp[c] == minp[c] then - d[c] = 1 -- Any value larger than 0 to avoid division by zero - else -- maxp[c] < minp[c], print error and treat as protection intersected - minetest.log("error", "maxp < minp in 'default.intersects_protection()'") - return true - end - end - - for zf = minp.z, maxp.z, d.z do - local z = math.floor(zf + 0.5) - for yf = minp.y, maxp.y, d.y do - local y = math.floor(yf + 0.5) - for xf = minp.x, maxp.x, d.x do - local x = math.floor(xf + 0.5) - if minetest.is_protected({x = x, y = y, z = z}, player_name) then - return true - end - end - end - end - - return false -end - - --- --- Coral death near air --- - -minetest.register_abm({ - nodenames = {"default:coral_brown", "default:coral_orange"}, - neighbors = {"air"}, - interval = 17, - chance = 5, - catch_up = false, - action = function(pos, node) - minetest.set_node(pos, {name = "default:coral_skeleton"}) - end, -}) - - --- --- NOTICE: This method is not an official part of the API yet! +-- NOTICE: This method is not an official part of the API yet. -- This method may change in future. -- @@ -558,7 +583,7 @@ function default.can_interact_with_node(player, pos) return true end - -- is player wielding the right key? + -- Is player wielding the right key? local item = player:get_wielded_item() if item:get_name() == "default:key" then local key_meta = item:get_meta() diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua index 05056e6..a06f3b2 100644 --- a/mods/default/furnace.lua +++ b/mods/default/furnace.lua @@ -3,50 +3,43 @@ -- Formspecs -- -local function active_formspec(fuel_percent, item_percent) - local formspec = - "size[8,8.5]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[current_name;src;2.75,0.5;1,1;]".. - "list[current_name;fuel;2.75,2.5;1,1;]".. +function default.get_furnace_active_formspec(fuel_percent, item_percent) + return "size[8,8.5]".. + "list[context;src;2.75,0.5;1,1;]".. + "list[context;fuel;2.75,2.5;1,1;]".. "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. (100-fuel_percent)..":default_furnace_fire_fg.png]".. "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[lowpart:".. (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. - "list[current_name;dst;4.75,0.96;2,2;]".. + "list[context;dst;4.75,0.96;2,2;]".. "list[current_player;main;0,4.25;8,1;]".. "list[current_player;main;0,5.5;8,3;8]".. - "listring[current_name;dst]".. + "listring[context;dst]".. "listring[current_player;main]".. - "listring[current_name;src]".. + "listring[context;src]".. "listring[current_player;main]".. - "listring[current_name;fuel]".. + "listring[context;fuel]".. "listring[current_player;main]".. default.get_hotbar_bg(0, 4.25) - return formspec end -local inactive_formspec = - "size[8,8.5]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[current_name;src;2.75,0.5;1,1;]".. - "list[current_name;fuel;2.75,2.5;1,1;]".. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. - "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. - "list[current_name;dst;4.75,0.96;2,2;]".. - "list[current_player;main;0,4.25;8,1;]".. - "list[current_player;main;0,5.5;8,3;8]".. - "listring[current_name;dst]".. - "listring[current_player;main]".. - "listring[current_name;src]".. - "listring[current_player;main]".. - "listring[current_name;fuel]".. - "listring[current_player;main]".. - default.get_hotbar_bg(0, 4.25) +function default.get_furnace_inactive_formspec() + return "size[8,8.5]".. + "list[context;src;2.75,0.5;1,1;]".. + "list[context;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "list[context;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end -- -- Node callback functions that are the same for active and inactive furnace @@ -197,7 +190,7 @@ local function furnace_node_timer(pos, elapsed) -- -- Update formspec, infotext and node -- - local formspec = inactive_formspec + local formspec local item_state local item_percent = 0 if cookable then @@ -216,14 +209,14 @@ local function furnace_node_timer(pos, elapsed) end local fuel_state = "Empty" - local active = "inactive " + local active = "inactive" local result = false if fuel_totaltime ~= 0 then - active = "active " + active = "active" local fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) fuel_state = fuel_percent .. "%" - formspec = active_formspec(fuel_percent, item_percent) + formspec = default.get_furnace_active_formspec(fuel_percent, item_percent) swap_node(pos, "default:furnace_active") -- make sure timer restarts automatically result = true @@ -231,12 +224,14 @@ local function furnace_node_timer(pos, elapsed) if not fuellist[1]:is_empty() then fuel_state = "0%" end + formspec = default.get_furnace_inactive_formspec() swap_node(pos, "default:furnace") -- stop timer on the inactive furnace minetest.get_node_timer(pos):stop() end - local infotext = "Furnace " .. active .. "(Item: " .. item_state .. "; Fuel: " .. fuel_state .. ")" + local infotext = "Furnace " .. active .. "\n(Item: " .. item_state .. + "; Fuel: " .. fuel_state .. ")" -- -- Set meta values @@ -273,7 +268,7 @@ minetest.register_node("default:furnace", { on_construct = function(pos) local meta = minetest.get_meta(pos) - meta:set_string("formspec", inactive_formspec) + meta:set_string("formspec", default.get_furnace_inactive_formspec()) local inv = meta:get_inventory() inv:set_size('src', 1) inv:set_size('fuel', 1) @@ -334,4 +329,3 @@ minetest.register_node("default:furnace_active", { allow_metadata_inventory_move = allow_metadata_inventory_move, allow_metadata_inventory_take = allow_metadata_inventory_take, }) - diff --git a/mods/default/init.lua b/mods/default/init.lua index 7b5f62f..b89fd0e 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -9,9 +9,12 @@ default = {} default.LIGHT_MAX = 14 -- GUI related stuff -default.gui_bg = "bgcolor[#080808BB;true]" -default.gui_bg_img = "background[5,5;1,1;gui_formbg.png;true]" -default.gui_slots = "listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" +minetest.register_on_joinplayer(function(player) + player:set_formspec_prepend([[ + bgcolor[#080808BB;true] + background[5,5;1,1;gui_formbg.png;true] + listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] ]]) +end) function default.get_hotbar_bg(x,y) local out = "" @@ -22,9 +25,6 @@ function default.get_hotbar_bg(x,y) end default.gui_survival_form = "size[8,8.5]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. "list[current_player;main;0,4.25;8,1;]".. "list[current_player;main;0,5.5;8,3;8]".. "list[current_player;craft;1.75,0.5;3,3;]".. @@ -40,6 +40,7 @@ local default_path = minetest.get_modpath("default") dofile(default_path.."/functions.lua") dofile(default_path.."/trees.lua") dofile(default_path.."/nodes.lua") +dofile(default_path.."/chests.lua") dofile(default_path.."/furnace.lua") dofile(default_path.."/torch.lua") dofile(default_path.."/tools.lua") @@ -47,6 +48,5 @@ dofile(default_path.."/item_entity.lua") dofile(default_path.."/craftitems.lua") dofile(default_path.."/crafting.lua") dofile(default_path.."/mapgen.lua") -dofile(default_path.."/player.lua") dofile(default_path.."/aliases.lua") dofile(default_path.."/legacy.lua") diff --git a/mods/default/item_entity.lua b/mods/default/item_entity.lua index c34e60e..2a61f08 100644 --- a/mods/default/item_entity.lua +++ b/mods/default/item_entity.lua @@ -16,7 +16,7 @@ local item = { burn_up = function(self) -- disappear in a smoke puff self.object:remove() - local p = self.object:getpos() + local p = self.object:get_pos() minetest.sound_play("default_item_smoke", { pos = p, max_hear_distance = 8, @@ -48,7 +48,7 @@ local item = { if self.ignite_timer > 10 then self.ignite_timer = 0 - local node = minetest.get_node_or_nil(self.object:getpos()) + local node = minetest.get_node_or_nil(self.object:get_pos()) if not node then return end diff --git a/mods/default/legacy.lua b/mods/default/legacy.lua index a8c8ad5..935d857 100644 --- a/mods/default/legacy.lua +++ b/mods/default/legacy.lua @@ -23,3 +23,27 @@ LIGHT_MAX = default.LIGHT_MAX -- Formspecs default.gui_suvival_form = default.gui_survival_form +default.gui_bg = "" +default.gui_bg_img = "" +default.gui_slots = "" + +-- Players +if minetest.get_modpath("player_api") then + default.registered_player_models = player_api.registered_models + default.player_register_model = player_api.register_model + default.player_attached = player_api.player_attached + default.player_get_animation = player_api.get_animation + default.player_set_model = player_api.set_model + default.player_set_textures = player_api.set_textures + default.player_set_animation = player_api.set_animation +end + +-- Chests +default.register_chest = default.chest.register_chest + +-- Check for a volume intersecting protection +function default.intersects_protection(minp, maxp, player_name, interval) + minetest.log("warning", "default.intersects_protection() is " .. + "deprecated, use minetest.is_area_protected() instead.") + minetest.is_area_protected(minp, maxp, player_name, interval) +end diff --git a/mods/default/license.txt b/mods/default/license.txt index 7dcd24c..fecb1eb 100644 --- a/mods/default/license.txt +++ b/mods/default/license.txt @@ -2,8 +2,8 @@ License of source code ---------------------- GNU Lesser General Public License, version 2.1 -Copyright (C) 2011-2016 celeron55, Perttu Ahola -Copyright (C) 2011-2016 Various Minetest developers and contributors +Copyright (C) 2011-2018 celeron55, Perttu Ahola +Copyright (C) 2011-2018 Various Minetest developers and contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; @@ -19,7 +19,8 @@ Licenses of media (textures, models and sounds) ----------------------------------------------- Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) -Copyright (C) 2010-2017: +Copyright (C) 2010-2018: + celeron55, Perttu Ahola Cisoun G4JC @@ -44,7 +45,12 @@ Copyright (C) 2010-2017: GreenXenith kaeza kilbith + tobyplowy CloudyProton + TumeniNodes + Mossmanikin + random-geek + Extex101 You are free to: Share — copy and redistribute the material in any medium or format. @@ -76,73 +82,8 @@ http://creativecommons.org/licenses/by-sa/3.0/ ----------------------- -Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) -Copyright (C) 2014-2016 brunob.santos - -You are free to: -Share — copy and redistribute the material in any medium or format. -Adapt — remix, transform, and build upon the material for any purpose, even commercially. -The licensor cannot revoke these freedoms as long as you follow the license terms. - -Under the following terms: - -Attribution — You must give appropriate credit, provide a link to the license, and -indicate if changes were made. You may do so in any reasonable manner, but not in any way -that suggests the licensor endorses you or your use. - -ShareAlike — If you remix, transform, or build upon the material, you must distribute -your contributions under the same license as the original. - -No additional restrictions — You may not apply legal terms or technological measures that -legally restrict others from doing anything the license permits. - -Notices: - -You do not have to comply with the license for elements of the material in the public -domain or where your use is permitted by an applicable exception or limitation. -No warranties are given. The license may not give you all of the permissions necessary -for your intended use. For example, other rights such as publicity, privacy, or moral -rights may limit how you use the material. - -For more details: -http://creativecommons.org/licenses/by-sa/4.0/ - ------------------------ - -Attribution-ShareAlike 2.0 Generic (CC BY-SA 2.0) -Copyright (C) 2014-2016 Neuromancer - -You are free to: -Share — copy and redistribute the material in any medium or format. -Adapt — remix, transform, and build upon the material for any purpose, even commercially. -The licensor cannot revoke these freedoms as long as you follow the license terms. - -Under the following terms: - -Attribution — You must give appropriate credit, provide a link to the license, and -indicate if changes were made. You may do so in any reasonable manner, but not in any way -that suggests the licensor endorses you or your use. - -ShareAlike — If you remix, transform, or build upon the material, you must distribute -your contributions under the same license as the original. - -No additional restrictions — You may not apply legal terms or technological measures that -legally restrict others from doing anything the license permits. - -Notices: - -You do not have to comply with the license for elements of the material in the public -domain or where your use is permitted by an applicable exception or limitation. -No warranties are given. The license may not give you all of the permissions necessary -for your intended use. For example, other rights such as publicity, privacy, or moral -rights may limit how you use the material. - -For more details: -http://creativecommons.org/licenses/by-sa/2.0/ - ------------------------ - Attribution 3.0 Unported (CC BY 3.0) + Copyright (C) 2009 cmusounddesign Copyright (C) 2010 Tomlija Copyright (C) 2010 lsprice @@ -175,3 +116,41 @@ rights may limit how you use the material. For more details: http://creativecommons.org/licenses/by/3.0/ + +----------------------- + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication + +Iwan Gabovitch +Ottomaani138 +Ogrebane +blukotek +Sevin7 +Yoyodaman234 +Ryding + +No Copyright + +The person who associated a work with this deed has dedicated the work to the +public domain by waiving all of his or her rights to the work worldwide under +copyright law, including all related and neighboring rights, to the extent +allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial +purposes, all without asking permission. See Other Information below. + +Other Information: + +In no way are the patent or trademark rights of any person affected by CC0, nor +are the rights that other persons may have in the work or in how the work is +used, such as publicity or privacy rights. + +Unless expressly stated otherwise, the person who associated a work with this +deed makes no warranties about the work, and disclaims liability for all uses +of the work, to the fullest extent permitted by applicable law. + +When using or citing the work, you should not imply endorsement by the author +or the affirmer. + +For more details: +https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 1305226..9c63d1e 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -43,12 +43,12 @@ minetest.register_alias("mapgen_stair_sandstone_block", "stairs:stair_sandstone_ -- Register ores -- --- Blob ores --- These first to avoid other ores in blobs - -- Mgv6 -function default.register_mgv6_blob_ores() +function default.register_mgv6_ores() + + -- Blob ore + -- These first to avoid other ores in blobs -- Clay -- This first to avoid clay in sand blobs @@ -59,8 +59,8 @@ function default.register_mgv6_blob_ores() wherein = {"default:sand"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -15, y_max = 0, + y_min = -15, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -80,8 +80,8 @@ function default.register_mgv6_blob_ores() wherein = {"default:stone", "default:desert_stone"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -31, y_max = 0, + y_min = -31, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -101,8 +101,8 @@ function default.register_mgv6_blob_ores() wherein = {"default:stone"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -31, y_max = 31000, + y_min = -31, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -122,8 +122,8 @@ function default.register_mgv6_blob_ores() wherein = {"default:stone"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -31000, y_max = 31000, + y_min = -31000, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -134,12 +134,385 @@ function default.register_mgv6_blob_ores() persist = 0.0 }, }) + + -- Scatter ores + + -- Coal + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 8, + clust_size = 3, + y_max = 64, + y_min = -31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 24 * 24 * 24, + clust_num_ores = 27, + clust_size = 6, + y_max = 0, + y_min = -31000, + }) + + -- Iron + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 12, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 7 * 7 * 7, + clust_num_ores = 5, + clust_size = 3, + y_max = 0, + y_min = -31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 24 * 24 * 24, + clust_num_ores = 27, + clust_size = 6, + y_max = -64, + y_min = -31000, + }) + + -- Copper + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 4, + clust_size = 3, + y_max = -16, + y_min = -63, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 5, + clust_size = 3, + y_max = -64, + y_min = -31000, + }) + + -- Tin + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 4, + clust_size = 3, + y_max = -32, + y_min = -127, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 5, + clust_size = 3, + y_max = -128, + y_min = -31000, + }) + + -- Gold + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 3, + clust_size = 2, + y_max = -64, + y_min = -255, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 5, + clust_size = 3, + y_max = -256, + y_min = -31000, + }) + + -- Mese crystal + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 18 * 18 * 18, + clust_num_ores = 3, + clust_size = 2, + y_max = -64, + y_min = -255, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_max = -256, + y_min = -31000, + }) + + -- Diamond + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 4, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 17 * 17 * 17, + clust_num_ores = 4, + clust_size = 3, + y_max = -128, + y_min = -255, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 4, + clust_size = 3, + y_max = -256, + y_min = -31000, + }) + + -- Mese block + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 36 * 36 * 36, + clust_num_ores = 3, + clust_size = 2, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 36 * 36 * 36, + clust_num_ores = 3, + clust_size = 2, + y_max = -1024, + y_min = -31000, + }) end -- All mapgens except mgv6 -function default.register_blob_ores() +function default.register_ores() + + -- Stratum ores. + -- These obviously first. + + -- Silver sandstone + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:silver_sandstone", + wherein = {"default:stone"}, + clust_scarcity = 1, + y_max = 46, + y_min = 10, + noise_params = { + offset = 28, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 4, + biomes = {"cold_desert"}, + }) + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:silver_sandstone", + wherein = {"default:stone"}, + clust_scarcity = 1, + y_max = 42, + y_min = 6, + noise_params = { + offset = 24, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 2, + biomes = {"cold_desert"}, + }) + + -- Desert sandstone + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:desert_sandstone", + wherein = {"default:desert_stone"}, + clust_scarcity = 1, + y_max = 46, + y_min = 10, + noise_params = { + offset = 28, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 4, + biomes = {"desert"}, + }) + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:desert_sandstone", + wherein = {"default:desert_stone"}, + clust_scarcity = 1, + y_max = 42, + y_min = 6, + noise_params = { + offset = 24, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 2, + biomes = {"desert"}, + }) + + -- Sandstone + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:sandstone", + wherein = {"default:desert_stone"}, + clust_scarcity = 1, + y_max = 39, + y_min = 3, + noise_params = { + offset = 21, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 2, + biomes = {"desert"}, + }) + + -- Blob ore. + -- These before scatter ores to avoid other ores in blobs. -- Clay @@ -149,8 +522,8 @@ function default.register_blob_ores() wherein = {"default:sand"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -15, y_max = 0, + y_min = -15, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -170,8 +543,8 @@ function default.register_blob_ores() wherein = {"default:stone"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -31000, y_max = 31000, + y_min = -31000, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -188,7 +561,7 @@ function default.register_blob_ores() "deciduous_forest_shore", "deciduous_forest_ocean", "cold_desert", "cold_desert_ocean", "savanna", "savanna_shore", "savanna_ocean", "rainforest", "rainforest_swamp", "rainforest_ocean", "underground", - "floatland_ocean", "floatland_grassland", "floatland_coniferous_forest"} + "floatland_coniferous_forest", "floatland_coniferous_forest_ocean"} }) -- Dirt @@ -199,8 +572,8 @@ function default.register_blob_ores() wherein = {"default:stone"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -31, y_max = 31000, + y_min = -31, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -212,8 +585,7 @@ function default.register_blob_ores() }, biomes = {"taiga", "snowy_grassland", "grassland", "coniferous_forest", "deciduous_forest", "deciduous_forest_shore", "savanna", "savanna_shore", - "rainforest", "rainforest_swamp", "floatland_grassland", - "floatland_coniferous_forest"} + "rainforest", "rainforest_swamp", "floatland_coniferous_forest"} }) -- Gravel @@ -224,8 +596,8 @@ function default.register_blob_ores() wherein = {"default:stone"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -31000, y_max = 31000, + y_min = -31000, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -242,15 +614,10 @@ function default.register_blob_ores() "deciduous_forest_shore", "deciduous_forest_ocean", "cold_desert", "cold_desert_ocean", "savanna", "savanna_shore", "savanna_ocean", "rainforest", "rainforest_swamp", "rainforest_ocean", "underground", - "floatland_ocean", "floatland_grassland", "floatland_coniferous_forest"} + "floatland_coniferous_forest", "floatland_coniferous_forest_ocean"} }) -end - --- Scatter ores --- All mapgens - -function default.register_ores() + -- Scatter ores -- Coal @@ -261,8 +628,8 @@ function default.register_ores() clust_scarcity = 8 * 8 * 8, clust_num_ores = 9, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -272,89 +639,19 @@ function default.register_ores() clust_scarcity = 8 * 8 * 8, clust_num_ores = 8, clust_size = 3, - y_min = -31000, y_max = 64, + y_min = -127, }) minetest.register_ore({ ore_type = "scatter", ore = "default:stone_with_coal", wherein = "default:stone", - clust_scarcity = 24 * 24 * 24, - clust_num_ores = 27, - clust_size = 6, - y_min = -31000, - y_max = 0, - }) - - -- Iron - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_iron", - wherein = "default:stone", - clust_scarcity = 9 * 9 * 9, - clust_num_ores = 12, - clust_size = 3, - y_min = 1025, - y_max = 31000, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_iron", - wherein = "default:stone", - clust_scarcity = 7 * 7 * 7, - clust_num_ores = 5, - clust_size = 3, - y_min = -31000, - y_max = 0, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_iron", - wherein = "default:stone", - clust_scarcity = 24 * 24 * 24, - clust_num_ores = 27, - clust_size = 6, - y_min = -31000, - y_max = -64, - }) - - -- Copper - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_copper", - wherein = "default:stone", - clust_scarcity = 9 * 9 * 9, - clust_num_ores = 5, - clust_size = 3, - y_min = 1025, - y_max = 31000, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_copper", - wherein = "default:stone", clust_scarcity = 12 * 12 * 12, - clust_num_ores = 4, - clust_size = 3, - y_min = -63, - y_max = -16, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_copper", - wherein = "default:stone", - clust_scarcity = 9 * 9 * 9, - clust_num_ores = 5, - clust_size = 3, + clust_num_ores = 30, + clust_size = 5, + y_max = -128, y_min = -31000, - y_max = -64, }) -- Tin @@ -366,8 +663,8 @@ function default.register_ores() clust_scarcity = 10 * 10 * 10, clust_num_ores = 5, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -377,8 +674,8 @@ function default.register_ores() clust_scarcity = 13 * 13 * 13, clust_num_ores = 4, clust_size = 3, + y_max = -64, y_min = -127, - y_max = -32, }) minetest.register_ore({ @@ -388,8 +685,78 @@ function default.register_ores() clust_scarcity = 10 * 10 * 10, clust_num_ores = 5, clust_size = 3, - y_min = -31000, y_max = -128, + y_min = -31000, + }) + + -- Copper + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 4, + clust_size = 3, + y_max = -64, + y_min = -127, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 5, + clust_size = 3, + y_max = -128, + y_min = -31000, + }) + + -- Iron + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 12, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 7 * 7 * 7, + clust_num_ores = 5, + clust_size = 3, + y_max = -128, + y_min = -255, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 29, + clust_size = 5, + y_max = -256, + y_min = -31000, }) -- Gold @@ -401,8 +768,8 @@ function default.register_ores() clust_scarcity = 13 * 13 * 13, clust_num_ores = 5, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -412,8 +779,8 @@ function default.register_ores() clust_scarcity = 15 * 15 * 15, clust_num_ores = 3, clust_size = 2, - y_min = -255, - y_max = -64, + y_max = -256, + y_min = -511, }) minetest.register_ore({ @@ -423,8 +790,8 @@ function default.register_ores() clust_scarcity = 13 * 13 * 13, clust_num_ores = 5, clust_size = 3, + y_max = -512, y_min = -31000, - y_max = -256, }) -- Mese crystal @@ -436,8 +803,8 @@ function default.register_ores() clust_scarcity = 14 * 14 * 14, clust_num_ores = 5, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -447,8 +814,8 @@ function default.register_ores() clust_scarcity = 18 * 18 * 18, clust_num_ores = 3, clust_size = 2, - y_min = -255, - y_max = -64, + y_max = -512, + y_min = -1023, }) minetest.register_ore({ @@ -458,8 +825,8 @@ function default.register_ores() clust_scarcity = 14 * 14 * 14, clust_num_ores = 5, clust_size = 3, + y_max = -1024, y_min = -31000, - y_max = -256, }) -- Diamond @@ -471,8 +838,8 @@ function default.register_ores() clust_scarcity = 15 * 15 * 15, clust_num_ores = 4, clust_size = 3, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -482,8 +849,8 @@ function default.register_ores() clust_scarcity = 17 * 17 * 17, clust_num_ores = 4, clust_size = 3, - y_min = -255, - y_max = -128, + y_max = -1024, + y_min = -2047, }) minetest.register_ore({ @@ -493,8 +860,8 @@ function default.register_ores() clust_scarcity = 15 * 15 * 15, clust_num_ores = 4, clust_size = 3, + y_max = -2048, y_min = -31000, - y_max = -256, }) -- Mese block @@ -506,8 +873,8 @@ function default.register_ores() clust_scarcity = 36 * 36 * 36, clust_num_ores = 3, clust_size = 2, - y_min = 1025, y_max = 31000, + y_min = 1025, }) minetest.register_ore({ @@ -517,8 +884,19 @@ function default.register_ores() clust_scarcity = 36 * 36 * 36, clust_num_ores = 3, clust_size = 2, + y_max = -2048, + y_min = -4095, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 28 * 28 * 28, + clust_num_ores = 5, + clust_size = 3, + y_max = -4096, y_min = -31000, - y_max = -1024, }) end @@ -540,15 +918,14 @@ function default.register_biomes(upper_limit) depth_top = 1, node_filler = "default:snowblock", depth_filler = 3, - node_stone = "default:ice", + node_stone = "default:cave_ice", node_water_top = "default:ice", depth_water_top = 10, - --node_water = "", node_river_water = "default:ice", node_riverbed = "default:gravel", depth_riverbed = 2, - y_min = -8, y_max = upper_limit, + y_min = -8, heat_point = 0, humidity_point = 73, }) @@ -560,13 +937,10 @@ function default.register_biomes(upper_limit) depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", node_water_top = "default:ice", depth_water_top = 10, - --node_water = "", - --node_river_water = "", - y_min = -112, y_max = -9, + y_min = -112, heat_point = 0, humidity_point = 73, }) @@ -574,61 +948,57 @@ function default.register_biomes(upper_limit) -- Tundra minetest.register_biome({ - name = "tundra", - node_dust = "default:snowblock", - --node_top = , - --depth_top = , - --node_filler = , - --depth_filler = , - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", + name = "tundra_highland", + node_dust = "default:snow", node_riverbed = "default:gravel", depth_riverbed = 2, - y_min = 2, y_max = upper_limit, + y_min = 47, + heat_point = 0, + humidity_point = 40, + }) + + minetest.register_biome({ + name = "tundra", + node_top = "default:permafrost_with_stones", + depth_top = 1, + node_filler = "default:permafrost", + depth_filler = 1, + node_riverbed = "default:gravel", + depth_riverbed = 2, + vertical_blend = 4, + y_max = 46, + y_min = 2, heat_point = 0, humidity_point = 40, }) minetest.register_biome({ name = "tundra_beach", - --node_dust = "", node_top = "default:gravel", depth_top = 1, node_filler = "default:gravel", depth_filler = 2, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:gravel", depth_riverbed = 2, - y_min = -3, + vertical_blend = 1, y_max = 1, + y_min = -3, heat_point = 0, humidity_point = 40, }) minetest.register_biome({ name = "tundra_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:gravel", depth_riverbed = 2, - y_min = -112, + vertical_blend = 1, y_max = -4, + y_min = -112, heat_point = 0, humidity_point = 40, }) @@ -642,35 +1012,26 @@ function default.register_biomes(upper_limit) depth_top = 1, node_filler = "default:dirt", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 2, y_max = upper_limit, + y_min = 4, heat_point = 25, humidity_point = 70, }) minetest.register_biome({ name = "taiga_ocean", - --node_dust = "", + node_dust = "default:snow", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, + vertical_blend = 1, + y_max = 3, y_min = -112, - y_max = 1, heat_point = 25, humidity_point = 70, }) @@ -684,35 +1045,26 @@ function default.register_biomes(upper_limit) depth_top = 1, node_filler = "default:dirt", depth_filler = 1, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 5, y_max = upper_limit, + y_min = 4, heat_point = 20, humidity_point = 35, }) minetest.register_biome({ name = "snowy_grassland_ocean", - --node_dust = "", + node_dust = "default:snow", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, + vertical_blend = 1, + y_max = 3, y_min = -112, - y_max = 4, heat_point = 20, humidity_point = 35, }) @@ -721,60 +1073,43 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "grassland", - --node_dust = "", node_top = "default:dirt_with_grass", depth_top = 1, node_filler = "default:dirt", depth_filler = 1, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 6, y_max = upper_limit, + y_min = 6, heat_point = 50, humidity_point = 35, }) minetest.register_biome({ name = "grassland_dunes", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 2, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 5, + vertical_blend = 1, y_max = 5, + y_min = 4, heat_point = 50, humidity_point = 35, }) minetest.register_biome({ name = "grassland_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, + y_max = 3, y_min = -112, - y_max = 4, heat_point = 50, humidity_point = 35, }) @@ -783,60 +1118,43 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "coniferous_forest", - --node_dust = "", - node_top = "default:dirt_with_grass", + node_top = "default:dirt_with_coniferous_litter", depth_top = 1, node_filler = "default:dirt", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 6, y_max = upper_limit, + y_min = 6, heat_point = 45, humidity_point = 70, }) minetest.register_biome({ name = "coniferous_forest_dunes", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 5, + vertical_blend = 1, y_max = 5, + y_min = 4, heat_point = 45, humidity_point = 70, }) minetest.register_biome({ name = "coniferous_forest_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, + y_max = 3, y_min = -112, - y_max = 4, heat_point = 45, humidity_point = 70, }) @@ -845,60 +1163,43 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "deciduous_forest", - --node_dust = "", node_top = "default:dirt_with_grass", depth_top = 1, node_filler = "default:dirt", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 1, y_max = upper_limit, + y_min = 1, heat_point = 60, humidity_point = 68, }) minetest.register_biome({ name = "deciduous_forest_shore", - --node_dust = "", node_top = "default:dirt", depth_top = 1, node_filler = "default:dirt", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -1, y_max = 0, + y_min = -1, heat_point = 60, humidity_point = 68, }) minetest.register_biome({ name = "deciduous_forest_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -112, + vertical_blend = 1, y_max = -2, + y_min = -112, heat_point = 60, humidity_point = 68, }) @@ -907,40 +1208,31 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "desert", - --node_dust = "", node_top = "default:desert_sand", depth_top = 1, node_filler = "default:desert_sand", depth_filler = 1, node_stone = "default:desert_stone", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 5, y_max = upper_limit, + y_min = 4, heat_point = 92, humidity_point = 16, }) minetest.register_biome({ name = "desert_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, node_stone = "default:desert_stone", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, + vertical_blend = 1, + y_max = 3, y_min = -112, - y_max = 4, heat_point = 92, humidity_point = 16, }) @@ -949,40 +1241,30 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "sandstone_desert", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 1, node_stone = "default:sandstone", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 5, y_max = upper_limit, + y_min = 4, heat_point = 60, humidity_point = 0, }) minetest.register_biome({ name = "sandstone_desert_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, node_stone = "default:sandstone", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, + y_max = 3, y_min = -112, - y_max = 4, heat_point = 60, humidity_point = 0, }) @@ -991,40 +1273,29 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "cold_desert", - --node_dust = "", node_top = "default:silver_sand", depth_top = 1, node_filler = "default:silver_sand", depth_filler = 1, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 5, y_max = upper_limit, + y_min = 4, heat_point = 40, humidity_point = 0, }) minetest.register_biome({ name = "cold_desert_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, + vertical_blend = 1, + y_max = 3, y_min = -112, - y_max = 4, heat_point = 40, humidity_point = 0, }) @@ -1033,60 +1304,43 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "savanna", - --node_dust = "", node_top = "default:dirt_with_dry_grass", depth_top = 1, node_filler = "default:dirt", depth_filler = 1, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 1, y_max = upper_limit, + y_min = 1, heat_point = 89, humidity_point = 42, }) minetest.register_biome({ name = "savanna_shore", - --node_dust = "", node_top = "default:dirt", depth_top = 1, node_filler = "default:dirt", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -1, y_max = 0, + y_min = -1, heat_point = 89, humidity_point = 42, }) minetest.register_biome({ name = "savanna_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -112, + vertical_blend = 1, y_max = -2, + y_min = -112, heat_point = 89, humidity_point = 42, }) @@ -1095,60 +1349,43 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "rainforest", - --node_dust = "", node_top = "default:dirt_with_rainforest_litter", depth_top = 1, node_filler = "default:dirt", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = 1, y_max = upper_limit, + y_min = 1, heat_point = 86, humidity_point = 65, }) minetest.register_biome({ name = "rainforest_swamp", - --node_dust = "", node_top = "default:dirt", depth_top = 1, node_filler = "default:dirt", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -1, y_max = 0, + y_min = -1, heat_point = 86, humidity_point = 65, }) minetest.register_biome({ name = "rainforest_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", node_riverbed = "default:sand", depth_riverbed = 2, - y_min = -112, + vertical_blend = 1, y_max = -2, + y_min = -112, heat_point = 86, humidity_point = 65, }) @@ -1157,18 +1394,8 @@ function default.register_biomes(upper_limit) minetest.register_biome({ name = "underground", - --node_dust = "", - --node_top = "", - --depth_top = , - --node_filler = "", - --depth_filler = , - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", - y_min = -31000, y_max = -113, + y_min = -31000, heat_point = 50, humidity_point = 50, }) @@ -1177,92 +1404,42 @@ end -- Biomes for floatlands +-- TODO Temporary simple biomes to be replaced by special floatland biomes later. + function default.register_floatland_biomes(floatland_level, shadow_limit) - -- Coniferous forest - - minetest.register_biome({ - name = "floatland_coniferous_forest", - --node_dust = "", - node_top = "default:dirt_with_grass", - depth_top = 1, - node_filler = "default:dirt", - depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", - --node_riverbed = "", - --depth_riverbed = , - y_min = floatland_level + 2, - y_max = 31000, - heat_point = 50, - humidity_point = 70, - }) - - -- Grassland - minetest.register_biome({ name = "floatland_grassland", - --node_dust = "", node_top = "default:dirt_with_grass", depth_top = 1, node_filler = "default:dirt", depth_filler = 1, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", - --node_riverbed = "", - --depth_riverbed = , - y_min = floatland_level + 2, y_max = 31000, + y_min = floatland_level + 2, heat_point = 50, - humidity_point = 35, + humidity_point = 25, }) - -- Sandstone desert - minetest.register_biome({ - name = "floatland_sandstone_desert", - --node_dust = "", - node_top = "default:sand", + name = "floatland_coniferous_forest", + node_top = "default:dirt_with_coniferous_litter", depth_top = 1, - node_filler = "default:sand", - depth_filler = 1, - node_stone = "default:sandstone", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", - --node_riverbed = "", - --depth_riverbed = , - y_min = floatland_level + 2, + node_filler = "default:dirt", + depth_filler = 3, y_max = 31000, + y_min = floatland_level + 2, heat_point = 50, - humidity_point = 0, + humidity_point = 75, }) - -- Floatland ocean / underground - minetest.register_biome({ name = "floatland_ocean", - --node_dust = "", node_top = "default:sand", depth_top = 1, node_filler = "default:sand", depth_filler = 3, - --node_stone = "", - --node_water_top = "", - --depth_water_top = , - --node_water = "", - --node_river_water = "", - --node_riverbed = "", - --depth_riverbed = , - y_min = shadow_limit, y_max = floatland_level + 1, + y_min = shadow_limit, heat_point = 50, humidity_point = 50, }) @@ -1280,6 +1457,7 @@ function default.register_mgv6_decorations() -- Papyrus minetest.register_decoration({ + name = "default:papyrus", deco_type = "simple", place_on = {"default:dirt_with_grass"}, sidelen = 16, @@ -1291,8 +1469,8 @@ function default.register_mgv6_decorations() octaves = 3, persist = 0.7 }, - y_min = 1, y_max = 1, + y_min = 1, decoration = "default:papyrus", height = 2, height_max = 4, @@ -1303,6 +1481,7 @@ function default.register_mgv6_decorations() -- Cacti minetest.register_decoration({ + name = "default:cactus", deco_type = "simple", place_on = {"default:desert_sand"}, sidelen = 16, @@ -1314,8 +1493,8 @@ function default.register_mgv6_decorations() octaves = 3, persist = 0.6 }, - y_min = 1, y_max = 30, + y_min = 1, decoration = "default:cactus", height = 3, height_max = 4, @@ -1325,6 +1504,7 @@ function default.register_mgv6_decorations() for length = 1, 5 do minetest.register_decoration({ + name = "default:grass_"..length, deco_type = "simple", place_on = {"default:dirt_with_grass"}, sidelen = 16, @@ -1336,8 +1516,8 @@ function default.register_mgv6_decorations() octaves = 3, persist = 0.6 }, - y_min = 1, y_max = 30, + y_min = 1, decoration = "default:grass_"..length, }) end @@ -1345,6 +1525,7 @@ function default.register_mgv6_decorations() -- Dry shrubs minetest.register_decoration({ + name = "default:dry_shrub", deco_type = "simple", place_on = {"default:desert_sand", "default:dirt_with_snow"}, sidelen = 16, @@ -1356,9 +1537,10 @@ function default.register_mgv6_decorations() octaves = 3, persist = 0.6 }, - y_min = 1, y_max = 30, + y_min = 1, decoration = "default:dry_shrub", + param2 = 4, }) end @@ -1367,8 +1549,9 @@ end local function register_grass_decoration(offset, scale, length) minetest.register_decoration({ + name = "default:grass_" .. length, deco_type = "simple", - place_on = {"default:dirt_with_grass", "default:sand"}, + place_on = {"default:dirt_with_grass"}, sidelen = 16, noise_params = { offset = offset, @@ -1378,17 +1561,16 @@ local function register_grass_decoration(offset, scale, length) octaves = 3, persist = 0.6 }, - biomes = {"grassland", "grassland_dunes", "deciduous_forest", - "coniferous_forest", "coniferous_forest_dunes", - "floatland_grassland", "floatland_coniferous_forest"}, - y_min = 1, + biomes = {"grassland", "deciduous_forest", "floatland_grassland"}, y_max = 31000, + y_min = 1, decoration = "default:grass_" .. length, }) end local function register_dry_grass_decoration(offset, scale, length) minetest.register_decoration({ + name = "default:dry_grass_" .. length, deco_type = "simple", place_on = {"default:dirt_with_dry_grass"}, sidelen = 16, @@ -1401,129 +1583,208 @@ local function register_dry_grass_decoration(offset, scale, length) persist = 0.6 }, biomes = {"savanna"}, - y_min = 1, y_max = 31000, + y_min = 1, decoration = "default:dry_grass_" .. length, }) end +local function register_fern_decoration(seed, length) + minetest.register_decoration({ + name = "default:fern_" .. length, + deco_type = "simple", + place_on = {"default:dirt_with_coniferous_litter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.2, + spread = {x = 100, y = 100, z = 100}, + seed = seed, + octaves = 3, + persist = 0.7 + }, + biomes = {"coniferous_forest", "floatland_coniferous_forest"}, + y_max = 31000, + y_min = 6, + decoration = "default:fern_" .. length, + }) +end + function default.register_decorations() -- Apple tree and log minetest.register_decoration({ + name = "default:apple_tree", deco_type = "schematic", place_on = {"default:dirt_with_grass"}, sidelen = 16, noise_params = { - offset = 0.036, - scale = 0.022, + offset = 0.024, + scale = 0.015, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, persist = 0.66 }, biomes = {"deciduous_forest"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/apple_tree.mts", flags = "place_center_x, place_center_z", rotation = "random", }) minetest.register_decoration({ + name = "default:apple_log", deco_type = "schematic", place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, sidelen = 16, noise_params = { - offset = 0.0018, - scale = 0.0011, + offset = 0.0012, + scale = 0.0007, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, persist = 0.66 }, biomes = {"deciduous_forest"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/apple_log.mts", flags = "place_center_x", rotation = "random", + spawn_by = "default:dirt_with_grass", + num_spawn_by = 8, }) + -- Emergent jungle tree + -- Due to 32 node height, altitude is limited and prescence depends on chunksize + + local chunksize = tonumber(minetest.get_mapgen_setting("chunksize")) + if chunksize >= 5 then + minetest.register_decoration({ + name = "default:emergent_jungle_tree", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + sidelen = 80, + noise_params = { + offset = 0.0, + scale = 0.0025, + spread = {x = 250, y = 250, z = 250}, + seed = 2685, + octaves = 3, + persist = 0.7 + }, + biomes = {"rainforest"}, + y_max = 32, + y_min = 1, + schematic = minetest.get_modpath("default") .. + "/schematics/emergent_jungle_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + place_offset_y = -4, + }) + end + -- Jungle tree and log minetest.register_decoration({ + name = "default:jungle_tree", deco_type = "schematic", place_on = {"default:dirt_with_rainforest_litter", "default:dirt"}, - sidelen = 16, + sidelen = 80, fill_ratio = 0.1, biomes = {"rainforest", "rainforest_swamp"}, - y_min = -1, y_max = 31000, + y_min = -1, schematic = minetest.get_modpath("default") .. "/schematics/jungle_tree.mts", flags = "place_center_x, place_center_z", rotation = "random", }) minetest.register_decoration({ + name = "default:jungle_log", deco_type = "schematic", - place_on = {"default:dirt_with_rainforest_litter", "default:dirt"}, - sidelen = 16, + place_on = {"default:dirt_with_rainforest_litter"}, + place_offset_y = 1, + sidelen = 80, fill_ratio = 0.005, biomes = {"rainforest", "rainforest_swamp"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/jungle_log.mts", flags = "place_center_x", rotation = "random", + spawn_by = "default:dirt_with_rainforest_litter", + num_spawn_by = 8, }) - -- Taiga and temperate coniferous forest pine tree and log + -- Taiga and temperate coniferous forest pine tree, small pine tree and log minetest.register_decoration({ + name = "default:pine_tree", deco_type = "schematic", - place_on = {"default:dirt_with_snow", "default:dirt_with_grass"}, + place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, sidelen = 16, noise_params = { - offset = 0.036, - scale = 0.022, + offset = 0.010, + scale = 0.048, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, persist = 0.66 }, biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, - y_min = 2, y_max = 31000, + y_min = 4, schematic = minetest.get_modpath("default") .. "/schematics/pine_tree.mts", flags = "place_center_x, place_center_z", }) minetest.register_decoration({ + name = "default:small_pine_tree", deco_type = "schematic", - place_on = {"default:dirt_with_snow", "default:dirt_with_grass"}, - sidelen = 80, + place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, + sidelen = 16, noise_params = { - offset = 0.0018, - scale = 0.0011, + offset = 0.010, + scale = -0.048, spread = {x = 250, y = 250, z = 250}, seed = 2, octaves = 3, persist = 0.66 }, - biomes = {"taiga", "coniferous_forest"}, - y_min = 1, + biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("default") .. "/schematics/small_pine_tree.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + name = "default:pine_log", + deco_type = "schematic", + place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0018, + biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, + y_max = 31000, + y_min = 4, schematic = minetest.get_modpath("default") .. "/schematics/pine_log.mts", flags = "place_center_x", rotation = "random", + spawn_by = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, + num_spawn_by = 8, }) -- Acacia tree and log minetest.register_decoration({ + name = "default:acacia_tree", deco_type = "schematic", place_on = {"default:dirt_with_dry_grass"}, sidelen = 16, @@ -1536,16 +1797,18 @@ function default.register_decorations() persist = 0.66 }, biomes = {"savanna"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/acacia_tree.mts", flags = "place_center_x, place_center_z", rotation = "random", }) minetest.register_decoration({ + name = "default:acacia_log", deco_type = "schematic", place_on = {"default:dirt_with_dry_grass"}, + place_offset_y = 1, sidelen = 16, noise_params = { offset = 0, @@ -1556,16 +1819,19 @@ function default.register_decorations() persist = 0.66 }, biomes = {"savanna"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/acacia_log.mts", flags = "place_center_x", rotation = "random", + spawn_by = "default:dirt_with_dry_grass", + num_spawn_by = 8, }) -- Aspen tree and log minetest.register_decoration({ + name = "default:aspen_tree", deco_type = "schematic", place_on = {"default:dirt_with_grass"}, sidelen = 16, @@ -1578,15 +1844,17 @@ function default.register_decorations() persist = 0.66 }, biomes = {"deciduous_forest"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/aspen_tree.mts", flags = "place_center_x, place_center_z", }) minetest.register_decoration({ + name = "default:aspen_log", deco_type = "schematic", place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, sidelen = 16, noise_params = { offset = 0.0, @@ -1597,16 +1865,19 @@ function default.register_decorations() persist = 0.66 }, biomes = {"deciduous_forest"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/aspen_log.mts", flags = "place_center_x", rotation = "random", + spawn_by = "default:dirt_with_grass", + num_spawn_by = 8, }) -- Large cactus minetest.register_decoration({ + name = "default:large_cactus", deco_type = "schematic", place_on = {"default:desert_sand"}, sidelen = 16, @@ -1619,16 +1890,17 @@ function default.register_decorations() persist = 0.6 }, biomes = {"desert"}, - y_min = 5, y_max = 31000, + y_min = 4, schematic = minetest.get_modpath("default") .. "/schematics/large_cactus.mts", - flags = "place_center_x", + flags = "place_center_x, place_center_z", rotation = "random", }) -- Cactus minetest.register_decoration({ + name = "default:cactus", deco_type = "simple", place_on = {"default:desert_sand"}, sidelen = 16, @@ -1641,8 +1913,8 @@ function default.register_decorations() persist = 0.6 }, biomes = {"desert"}, - y_min = 5, y_max = 31000, + y_min = 4, decoration = "default:cactus", height = 2, height_max = 5, @@ -1651,6 +1923,7 @@ function default.register_decorations() -- Papyrus minetest.register_decoration({ + name = "default:papyrus", deco_type = "schematic", place_on = {"default:dirt"}, sidelen = 16, @@ -1663,16 +1936,17 @@ function default.register_decorations() persist = 0.7 }, biomes = {"savanna_shore"}, - y_min = 0, y_max = 0, + y_min = 0, schematic = minetest.get_modpath("default") .. "/schematics/papyrus.mts", }) -- Bush minetest.register_decoration({ + name = "default:bush", deco_type = "schematic", - place_on = {"default:dirt_with_grass", "default:dirt_with_snow"}, + place_on = {"default:dirt_with_grass"}, sidelen = 16, noise_params = { offset = -0.004, @@ -1682,17 +1956,41 @@ function default.register_decorations() octaves = 3, persist = 0.7, }, - biomes = {"snowy_grassland", "grassland", "deciduous_forest", + biomes = {"grassland", "deciduous_forest", "floatland_grassland"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/bush.mts", flags = "place_center_x, place_center_z", }) + -- Blueberry bush + + minetest.register_decoration({ + name = "default:blueberry_bush", + deco_type = "schematic", + place_on = {"default:dirt_with_grass", "default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"grassland", "snowy_grassland"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = minetest.get_modpath("default") .. "/schematics/blueberry_bush.mts", + flags = "place_center_x, place_center_z", + }) + -- Acacia bush minetest.register_decoration({ + name = "default:acacia_bush", deco_type = "schematic", place_on = {"default:dirt_with_dry_grass"}, sidelen = 16, @@ -1705,12 +2003,34 @@ function default.register_decorations() persist = 0.7, }, biomes = {"savanna"}, - y_min = 1, y_max = 31000, + y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/acacia_bush.mts", flags = "place_center_x, place_center_z", }) + -- Pine bush + + minetest.register_decoration({ + name = "default:pine_bush", + deco_type = "schematic", + place_on = {"default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"taiga", "snowy_grassland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("default") .. "/schematics/pine_bush.mts", + flags = "place_center_x, place_center_z", + }) + -- Grasses register_grass_decoration(-0.03, 0.09, 5) @@ -1727,22 +2047,30 @@ function default.register_decorations() register_dry_grass_decoration(0.07, -0.01, 2) register_dry_grass_decoration(0.09, -0.03, 1) + -- Ferns + + register_fern_decoration(14936, 3) + register_fern_decoration(801, 2) + register_fern_decoration(5, 1) + -- Junglegrass minetest.register_decoration({ + name = "default:junglegrass", deco_type = "simple", place_on = {"default:dirt_with_rainforest_litter"}, - sidelen = 16, + sidelen = 80, fill_ratio = 0.1, biomes = {"rainforest"}, - y_min = 1, y_max = 31000, + y_min = 1, decoration = "default:junglegrass", }) -- Dry shrub minetest.register_decoration({ + name = "default:dry_shrub", deco_type = "simple", place_on = {"default:desert_sand", "default:sand", "default:silver_sand"}, @@ -1756,34 +2084,146 @@ function default.register_decorations() persist = 0.6 }, biomes = {"desert", "sandstone_desert", "cold_desert"}, - y_min = 2, y_max = 31000, + y_min = 2, decoration = "default:dry_shrub", + param2 = 4, + }) + + -- Marram grass + + minetest.register_decoration({ + name = "default:marram_grass", + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 4, + noise_params = { + offset = -0.4, + scale = 3.0, + spread = {x = 16, y = 16, z = 16}, + seed = 513337, + octaves = 1, + persist = 0.5, + flags = "absvalue" + }, + biomes = {"coniferous_forest_dunes", "grassland_dunes"}, + y_max = 6, + y_min = 4, + decoration = { + "default:marram_grass_1", + "default:marram_grass_2", + "default:marram_grass_3", + }, + }) + + -- Tundra moss + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:permafrost_with_stones"}, + sidelen = 4, + noise_params = { + offset = -0.8, + scale = 2.0, + spread = {x = 100, y = 100, z = 100}, + seed = 53995, + octaves = 3, + persist = 1.0 + }, + biomes = {"tundra"}, + y_max = 50, + y_min = 2, + decoration = "default:permafrost_with_moss", + place_offset_y = -1, + flags = "force_placement", + }) + + -- Tundra patchy snow + + minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:permafrost_with_moss", + "default:permafrost_with_stones", + "default:stone", + "default:gravel" + }, + sidelen = 4, + noise_params = { + offset = 0, + scale = 1.0, + spread = {x = 100, y = 100, z = 100}, + seed = 172555, + octaves = 3, + persist = 1.0 + }, + biomes = {"tundra", "tundra_beach"}, + y_max = 50, + y_min = 1, + decoration = "default:snow", }) -- Coral reef minetest.register_decoration({ - deco_type = "schematic", + name = "default:corals", + deco_type = "simple", place_on = {"default:sand"}, + place_offset_y = -1, + sidelen = 4, noise_params = { - offset = -0.15, - scale = 0.1, - spread = {x = 100, y = 100, z = 100}, + offset = -4, + scale = 4, + spread = {x = 50, y = 50, z = 50}, seed = 7013, octaves = 3, - persist = 1, + persist = 0.7, }, biomes = { "desert_ocean", "savanna_ocean", "rainforest_ocean", }, - y_min = -8, y_max = -2, - schematic = minetest.get_modpath("default") .. "/schematics/corals.mts", - flags = "place_center_x, place_center_z", - rotation = "random", + y_min = -8, + flags = "force_placement", + decoration = { + "default:coral_green", "default:coral_pink", + "default:coral_cyan", "default:coral_brown", + "default:coral_orange", "default:coral_skeleton", + }, + }) + + -- Kelp + + minetest.register_decoration({ + name = "default:kelp", + deco_type = "simple", + place_on = {"default:sand"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.1, + spread = {x = 200, y = 200, z = 200}, + seed = 87112, + octaves = 3, + persist = 0.7 + }, + biomes = { + "taiga_ocean", + "snowy_grassland_ocean", + "grassland_ocean", + "coniferous_forest_ocean", + "deciduous_forest_ocean", + "sandstone_desert_ocean", + "cold_desert_ocean"}, + y_max = -5, + y_min = -10, + flags = "force_placement", + decoration = "default:sand_with_kelp", + param2 = 48, + param2_max = 96, }) end @@ -1794,33 +2234,39 @@ end -- Get setting or default local mgv7_spflags = minetest.get_mapgen_setting("mgv7_spflags") or - "mountains, ridges, nofloatlands" + "mountains, ridges, nofloatlands, caverns" local captures_float = string.match(mgv7_spflags, "floatlands") local captures_nofloat = string.match(mgv7_spflags, "nofloatlands") -local mgv7_floatland_level = minetest.get_mapgen_setting("mgv7_floatland_level") or 1280 -local mgv7_shadow_limit = minetest.get_mapgen_setting("mgv7_shadow_limit") or 1024 +-- Get setting or default +-- Make global for mods to use to register floatland biomes +default.mgv7_floatland_level = + minetest.get_mapgen_setting("mgv7_floatland_level") or 1280 +default.mgv7_shadow_limit = + minetest.get_mapgen_setting("mgv7_shadow_limit") or 1024 minetest.clear_registered_biomes() minetest.clear_registered_ores() minetest.clear_registered_decorations() local mg_name = minetest.get_mapgen_setting("mg_name") + if mg_name == "v6" then - default.register_mgv6_blob_ores() - default.register_ores() + default.register_mgv6_ores() default.register_mgv6_decorations() -elseif mg_name == "v7" and captures_float == "floatlands" and +-- Need to check for 'nofloatlands' because that contains +-- 'floatlands' which makes the second condition true. +elseif mg_name == "v7" and + captures_float == "floatlands" and captures_nofloat ~= "nofloatlands" then - -- Mgv7 with floatlands - default.register_biomes(mgv7_shadow_limit - 1) - default.register_floatland_biomes(mgv7_floatland_level, mgv7_shadow_limit) - default.register_blob_ores() + -- Mgv7 with floatlands and floatland biomes + default.register_biomes(default.mgv7_shadow_limit - 1) + default.register_floatland_biomes( + default.mgv7_floatland_level, default.mgv7_shadow_limit) default.register_ores() default.register_decorations() else default.register_biomes(31000) - default.register_blob_ores() default.register_ores() default.register_decorations() end diff --git a/mods/default/models/character.b3d b/mods/default/models/character.b3d deleted file mode 100644 index 9ab454366bee8fb6c9e45e64ac0d77808d5ea66f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84526 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 diff --git a/mods/default/models/character.blend b/mods/default/models/character.blend deleted file mode 100644 index fca9f6597fe998d1aebcac4abe126b13099a5788..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 634876 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
O+zw*>Gs^42(pYG`D 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%0AlZ+@5Z_<}GDw^u)tLRh>_O(Fkl-n^!Q5}p# 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 diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 4196474..aa8f361 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -51,6 +51,11 @@ default:dirt_with_grass_footsteps default:dirt_with_dry_grass default:dirt_with_snow default:dirt_with_rainforest_litter +default:dirt_with_coniferous_litter + +default:permafrost +default:permafrost_with_stones +default:permafrost_with_moss default:sand default:desert_sand @@ -62,8 +67,8 @@ default:clay default:snow default:snowblock - default:ice +default:cave_ice Trees ----- @@ -79,6 +84,7 @@ default:jungletree default:junglewood default:jungleleaves default:junglesapling +default:emergent_jungle_sapling default:pine_tree default:pine_wood @@ -126,6 +132,8 @@ Plantlife --------- default:cactus +default:large_cactus_seedling + default:papyrus default:dry_shrub default:junglegrass @@ -142,12 +150,28 @@ default:dry_grass_3 default:dry_grass_4 default:dry_grass_5 +default:fern_1 +default:fern_2 +default:fern_3 + +default:marram_grass_1 +default:marram_grass_2 +default:marram_grass_3 + default:bush_stem default:bush_leaves default:bush_sapling default:acacia_bush_stem default:acacia_bush_leaves default:acacia_bush_sapling +default:pine_bush_stem +default:pine_bush_needles +default:pine_bush_sapling +default:blueberry_bush_leaves_with_berries +default:blueberry_bush_leaves +default:blueberry_bush_sapling + +default:sand_with_kelp Corals ------ @@ -172,9 +196,6 @@ default:lava_flowing Tools / "Advanced" crafting / Non-"natural" ------------------------------------------- -default:chest -default:chest_locked - default:bookshelf default:sign_wall_wood @@ -443,7 +464,7 @@ minetest.register_node("default:dirt_with_snow", { groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1, snowy = 1}, drop = 'default:dirt', sounds = default.node_sound_dirt_defaults({ - footstep = {name = "default_snow_footstep", gain = 0.15}, + footstep = {name = "default_snow_footstep", gain = 0.2}, }), }) @@ -462,6 +483,48 @@ minetest.register_node("default:dirt_with_rainforest_litter", { }), }) +minetest.register_node("default:dirt_with_coniferous_litter", { + description = "Dirt with Coniferous Litter", + tiles = { + "default_coniferous_litter.png", + "default_dirt.png", + {name = "default_dirt.png^default_coniferous_litter_side.png", + tileable_vertical = false} + }, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.4}, + }), +}) + +minetest.register_node("default:permafrost", { + description = "Permafrost", + tiles = {"default_permafrost.png"}, + groups = {cracky = 3}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("default:permafrost_with_stones", { + description = "Permafrost with Stones", + tiles = {"default_permafrost.png^default_stones.png", + "default_permafrost.png", + "default_permafrost.png^default_stones_side.png"}, + groups = {cracky = 3}, + sounds = default.node_sound_gravel_defaults(), +}) + +minetest.register_node("default:permafrost_with_moss", { + description = "Permafrost with Moss", + tiles = {"default_moss.png", "default_permafrost.png", + {name = "default_permafrost.png^default_moss_side.png", + tileable_vertical = false}}, + groups = {cracky = 3}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + minetest.register_node("default:sand", { description = "Sand", tiles = {"default_sand.png"}, @@ -522,12 +585,14 @@ minetest.register_node("default:snow", { {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, }, }, - groups = {crumbly = 3, falling_node = 1, puts_out_fire = 1, snowy = 1}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name = "default_snow_footstep", gain = 0.15}, - dug = {name = "default_snow_footstep", gain = 0.2}, - dig = {name = "default_snow_footstep", gain = 0.2} - }), + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -7 / 16, 0.5}, + }, + }, + groups = {crumbly = 3, falling_node = 1, snowy = 1}, + sounds = default.node_sound_snow_defaults(), on_construct = function(pos) pos.y = pos.y - 1 @@ -540,12 +605,8 @@ minetest.register_node("default:snow", { minetest.register_node("default:snowblock", { description = "Snow Block", tiles = {"default_snow.png"}, - groups = {crumbly = 3, puts_out_fire = 1, cools_lava = 1, snowy = 1}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name = "default_snow_footstep", gain = 0.15}, - dug = {name = "default_snow_footstep", gain = 0.2}, - dig = {name = "default_snow_footstep", gain = 0.2} - }), + groups = {crumbly = 3, cools_lava = 1, snowy = 1}, + sounds = default.node_sound_snow_defaults(), on_construct = function(pos) pos.y = pos.y - 1 @@ -555,12 +616,24 @@ minetest.register_node("default:snowblock", { end, }) +-- 'is ground content = false' to avoid tunnels in sea ice or ice rivers minetest.register_node("default:ice", { description = "Ice", tiles = {"default_ice.png"}, is_ground_content = false, paramtype = "light", - groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1}, + groups = {cracky = 3, cools_lava = 1, slippery = 3}, + sounds = default.node_sound_glass_defaults(), +}) + +-- Mapgen-placed ice with 'is ground content = true' to contain tunnels +minetest.register_node("default:cave_ice", { + description = "Cave Ice", + tiles = {"default_ice.png"}, + paramtype = "light", + groups = {cracky = 3, cools_lava = 1, slippery = 3, + not_in_creative_inventory = 1}, + drop = "default:ice", sounds = default.node_sound_glass_defaults(), }) @@ -569,7 +642,7 @@ minetest.register_node("default:ice", { -- minetest.register_node("default:tree", { - description = "Tree", + description = "Apple Tree", tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, paramtype2 = "facedir", is_ground_content = false, @@ -580,7 +653,7 @@ minetest.register_node("default:tree", { }) minetest.register_node("default:wood", { - description = "Wooden Planks", + description = "Apple Wood Planks", paramtype2 = "facedir", place_param2 = 0, tiles = {"default_wood.png"}, @@ -590,7 +663,7 @@ minetest.register_node("default:wood", { }) minetest.register_node("default:sapling", { - description = "Sapling", + description = "Apple Tree Sapling", drawtype = "plantlike", tiles = {"default_sapling.png"}, inventory_image = "default_sapling.png", @@ -616,8 +689,8 @@ minetest.register_node("default:sapling", { "default:sapling", -- minp, maxp to be checked, relative to sapling pos -- minp_relative.y = 1 because sapling pos has been checked - {x = -2, y = 1, z = -2}, - {x = 2, y = 6, z = 2}, + {x = -3, y = 1, z = -3}, + {x = 3, y = 6, z = 3}, -- maximum interval of interior volume check 4) @@ -626,7 +699,7 @@ minetest.register_node("default:sapling", { }) minetest.register_node("default:leaves", { - description = "Leaves", + description = "Apple Tree Leaves", drawtype = "allfaces_optional", waving = 1, tiles = {"default_leaves.png"}, @@ -668,13 +741,42 @@ minetest.register_node("default:apple", { fixed = {-3 / 16, -7 / 16, -3 / 16, 3 / 16, 4 / 16, 3 / 16} }, groups = {fleshy = 3, dig_immediate = 3, flammable = 2, - leafdecay = 3, leafdecay_drop = 1}, + leafdecay = 3, leafdecay_drop = 1, food_apple = 1}, on_use = minetest.item_eat(2), sounds = default.node_sound_leaves_defaults(), after_place_node = function(pos, placer, itemstack) minetest.set_node(pos, {name = "default:apple", param2 = 1}) end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if oldnode.param2 == 0 then + minetest.set_node(pos, {name = "default:apple_mark"}) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end + end, +}) + +minetest.register_node("default:apple_mark", { + description = "Apple Marker", + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_timer = function(pos, elapsed) + if not minetest.find_node_near(pos, 1, "default:leaves") then + minetest.remove_node(pos) + elseif minetest.get_node_light(pos) < 11 then + minetest.get_node_timer(pos):start(200) + else + minetest.set_node(pos, {name = "default:apple"}) + end + end }) @@ -701,7 +803,7 @@ minetest.register_node("default:junglewood", { }) minetest.register_node("default:jungleleaves", { - description = "Jungle Leaves", + description = "Jungle Tree Leaves", drawtype = "allfaces_optional", waving = 1, tiles = {"default_jungleleaves.png"}, @@ -722,7 +824,7 @@ minetest.register_node("default:jungleleaves", { }) minetest.register_node("default:junglesapling", { - description = "Jungle Sapling", + description = "Jungle Tree Sapling", drawtype = "plantlike", tiles = {"default_junglesapling.png"}, inventory_image = "default_junglesapling.png", @@ -757,6 +859,41 @@ minetest.register_node("default:junglesapling", { end, }) +minetest.register_node("default:emergent_jungle_sapling", { + description = "Emergent Jungle Tree Sapling", + drawtype = "plantlike", + tiles = {"default_emergent_jungle_sapling.png"}, + inventory_image = "default_emergent_jungle_sapling.png", + wield_image = "default_emergent_jungle_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:emergent_jungle_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -3, y = -5, z = -3}, + {x = 3, y = 31, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + minetest.register_node("default:pine_tree", { description = "Pine Tree", @@ -801,7 +938,7 @@ minetest.register_node("default:pine_needles",{ }) minetest.register_node("default:pine_sapling", { - description = "Pine Sapling", + description = "Pine Tree Sapling", drawtype = "plantlike", tiles = {"default_pine_sapling.png"}, inventory_image = "default_pine_sapling.png", @@ -828,7 +965,7 @@ minetest.register_node("default:pine_sapling", { -- minp, maxp to be checked, relative to sapling pos -- minp_relative.y = 1 because sapling pos has been checked {x = -2, y = 1, z = -2}, - {x = 2, y = 12, z = 2}, + {x = 2, y = 14, z = 2}, -- maximum interval of interior volume check 4) @@ -860,7 +997,7 @@ minetest.register_node("default:acacia_wood", { }) minetest.register_node("default:acacia_leaves", { - description = "Acacia Leaves", + description = "Acacia Tree Leaves", drawtype = "allfaces_optional", tiles = {"default_acacia_leaves.png"}, special_tiles = {"default_acacia_leaves_simple.png"}, @@ -908,7 +1045,7 @@ minetest.register_node("default:acacia_sapling", { -- minp, maxp to be checked, relative to sapling pos -- minp_relative.y = 1 because sapling pos has been checked {x = -4, y = 1, z = -4}, - {x = 4, y = 6, z = 4}, + {x = 4, y = 7, z = 4}, -- maximum interval of interior volume check 4) @@ -939,7 +1076,7 @@ minetest.register_node("default:aspen_wood", { }) minetest.register_node("default:aspen_leaves", { - description = "Aspen Leaves", + description = "Aspen Tree Leaves", drawtype = "allfaces_optional", tiles = {"default_aspen_leaves.png"}, waving = 1, @@ -1140,6 +1277,77 @@ minetest.register_node("default:cactus", { on_place = minetest.rotate_node, }) +minetest.register_node("default:large_cactus_seedling", { + description = "Large Cactus Seedling", + drawtype = "plantlike", + tiles = {"default_large_cactus_seedling.png"}, + inventory_image = "default_large_cactus_seedling.png", + wield_image = "default_large_cactus_seedling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = { + -5 / 16, -0.5, -5 / 16, + 5 / 16, 0.5, 5 / 16 + } + }, + groups = {choppy = 3, dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_wood_defaults(), + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:large_cactus_seedling", + {x = -2, y = -1, z = -2}, + {x = 2, y = 5, z = 2}, + 4) + + return itemstack + end, + + on_construct = function(pos) + -- Normal cactus farming adds 1 cactus node by ABM, + -- interval 12s, chance 83. + -- Consider starting with 5 cactus nodes. We make sure that growing a + -- large cactus is not a faster way to produce new cactus nodes. + -- Confirmed by experiment, when farming 5 cacti, on average 1 new + -- cactus node is added on average every + -- 83 / 5 = 16.6 intervals = 16.6 * 12 = 199.2s. + -- Large cactus contains on average 14 cactus nodes. + -- 14 * 199.2 = 2788.8s. + -- Set random range to average to 2789s. + minetest.get_node_timer(pos):start(math.random(1859, 3719)) + end, + + on_timer = function(pos) + local node_under = minetest.get_node_or_nil( + {x = pos.x, y = pos.y - 1, z = pos.z}) + if not node_under then + -- Node under not yet loaded, try later + minetest.get_node_timer(pos):start(300) + return + end + + if minetest.get_item_group(node_under.name, "sand") == 0 then + -- Seedling dies + minetest.remove_node(pos) + return + end + + local light_level = minetest.get_node_light(pos) + if not light_level or light_level < 13 then + -- Too dark for growth, try later in case it's night + minetest.get_node_timer(pos):start(300) + return + end + + minetest.log("action", "A large cactus seedling grows into a large" .. + "cactus at ".. minetest.pos_to_string(pos)) + default.grow_large_cactus(pos) + end, +}) + minetest.register_node("default:papyrus", { description = "Papyrus", drawtype = "plantlike", @@ -1169,6 +1377,8 @@ minetest.register_node("default:dry_shrub", { inventory_image = "default_dry_shrub.png", wield_image = "default_dry_shrub.png", paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 4, sunlight_propagates = true, walkable = false, buildable_to = true, @@ -1176,7 +1386,7 @@ minetest.register_node("default:dry_shrub", { sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", - fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 4 / 16, 5 / 16}, + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16}, }, }) @@ -1196,7 +1406,7 @@ minetest.register_node("default:junglegrass", { sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", - fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 1.19, 7 / 16}, + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, }, }) @@ -1305,6 +1515,109 @@ for i = 2, 5 do end +minetest.register_node("default:fern_1", { + description = "Fern", + drawtype = "plantlike", + waving = 1, + tiles = {"default_fern_1.png"}, + inventory_image = "default_fern_1.png", + wield_image = "default_fern_1.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random fern node + local stack = ItemStack("default:fern_" .. math.random(1, 3)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:fern_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 3 do + minetest.register_node("default:fern_" .. i, { + description = "Fern", + drawtype = "plantlike", + waving = 1, + visual_scale = 2, + tiles = {"default_fern_" .. i .. ".png"}, + inventory_image = "default_fern_" .. i .. ".png", + wield_image = "default_fern_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, + not_in_creative_inventory=1}, + drop = "default:fern_1", + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + }) +end + + +minetest.register_node("default:marram_grass_1", { + description = "Marram Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_marram_grass_1.png"}, + inventory_image = "default_marram_grass_1.png", + wield_image = "default_marram_grass_1.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random marram grass node + local stack = ItemStack("default:marram_grass_" .. math.random(1, 3)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:marram_grass_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 3 do + minetest.register_node("default:marram_grass_" .. i, { + description = "Marram Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_marram_grass_" .. i .. ".png"}, + inventory_image = "default_marram_grass_" .. i .. ".png", + wield_image = "default_marram_grass_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, attached_node = 1, + not_in_creative_inventory=1}, + drop = "default:marram_grass_1", + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + }) +end + + minetest.register_node("default:bush_stem", { description = "Bush Stem", drawtype = "plantlike", @@ -1376,6 +1689,85 @@ minetest.register_node("default:bush_sapling", { end, }) +minetest.register_node("default:blueberry_bush_leaves_with_berries", { + description = "Blueberry Bush Leaves with Berries", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"default_blueberry_bush_leaves.png^default_blueberry_overlay.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, dig_immediate = 3}, + drop = "default:blueberries", + sounds = default.node_sound_leaves_defaults(), + node_dig_prediction = "default:blueberry_bush_leaves", + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, {name = "default:blueberry_bush_leaves"}) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, +}) + +minetest.register_node("default:blueberry_bush_leaves", { + description = "Blueberry Bush Leaves", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"default_blueberry_bush_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:blueberry_bush_sapling"}, rarity = 5}, + {items = {"default:blueberry_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) < 11 then + minetest.get_node_timer(pos):start(200) + else + minetest.set_node(pos, {name = "default:blueberry_bush_leaves_with_berries"}) + end + end, + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:blueberry_bush_sapling", { + description = "Blueberry Bush Sapling", + drawtype = "plantlike", + tiles = {"default_blueberry_bush_sapling.png"}, + inventory_image = "default_blueberry_bush_sapling.png", + wield_image = "default_blueberry_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:blueberry_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + minetest.register_node("default:acacia_bush_stem", { description = "Acacia Bush Stem", drawtype = "plantlike", @@ -1447,11 +1839,324 @@ minetest.register_node("default:acacia_bush_sapling", { end, }) +minetest.register_node("default:pine_bush_stem", { + description = "Pine Bush Stem", + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"default_pine_bush_stem.png"}, + inventory_image = "default_pine_bush_stem.png", + wield_image = "default_pine_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("default:pine_bush_needles", { + description = "Pine Bush Needles", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"default_pine_needles.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:pine_bush_sapling"}, rarity = 5}, + {items = {"default:pine_bush_needles"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:pine_bush_sapling", { + description = "Pine Bush Sapling", + drawtype = "plantlike", + tiles = {"default_pine_bush_sapling.png"}, + inventory_image = "default_pine_bush_sapling.png", + wield_image = "default_pine_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:pine_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("default:sand_with_kelp", { + description = "Kelp", + drawtype = "plantlike_rooted", + waving = 1, + tiles = {"default_sand.png"}, + special_tiles = {{name = "default_kelp.png", tileable_vertical = true}}, + inventory_image = "default_kelp.png", + paramtype = "light", + paramtype2 = "leveled", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-2/16, 0.5, -2/16, 2/16, 3.5, 2/16}, + }, + }, + node_dig_prediction = "default:sand", + node_placement_prediction = "", + sounds = default.node_sound_sand_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == "node" and placer and + not placer:get_player_control().sneak then + local node_ptu = minetest.get_node(pointed_thing.under) + local def_ptu = minetest.registered_nodes[node_ptu.name] + if def_ptu and def_ptu.on_rightclick then + return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, + itemstack, pointed_thing) + end + end + + local pos = pointed_thing.under + if minetest.get_node(pos).name ~= "default:sand" then + return itemstack + end + + local height = math.random(4, 6) + local pos_top = {x = pos.x, y = pos.y + height, z = pos.z} + local node_top = minetest.get_node(pos_top) + local def_top = minetest.registered_nodes[node_top.name] + local player_name = placer:get_player_name() + + if def_top and def_top.liquidtype == "source" and + minetest.get_item_group(node_top.name, "water") > 0 then + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pos_top, player_name) then + minetest.set_node(pos, {name = "default:sand_with_kelp", + param2 = height * 16}) + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end, + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:sand"}) + end +}) + -- -- Corals -- +minetest.register_node("default:coral_green", { + description = "Green Coral", + drawtype = "plantlike_rooted", + waving = 1, + paramtype = "light", + tiles = {"default_coral_skeleton.png"}, + special_tiles = {{name = "default_coral_green.png", tileable_vertical = true}}, + inventory_image = "default_coral_green.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "default:coral_skeleton", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" or not placer then + return itemstack + end + + local player_name = placer:get_player_name() + local pos_under = pointed_thing.under + local pos_above = pointed_thing.above + + if minetest.get_node(pos_under).name ~= "default:coral_skeleton" or + minetest.get_node(pos_above).name ~= "default:water_source" then + return itemstack + end + + if minetest.is_protected(pos_under, player_name) or + minetest.is_protected(pos_above, player_name) then + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos_under, player_name) + return itemstack + end + + minetest.set_node(pos_under, {name = "default:coral_green"}) + if not (creative and creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + + return itemstack + end, + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:coral_skeleton"}) + end, +}) + +minetest.register_node("default:coral_pink", { + description = "Pink Coral", + drawtype = "plantlike_rooted", + waving = 1, + paramtype = "light", + tiles = {"default_coral_skeleton.png"}, + special_tiles = {{name = "default_coral_pink.png", tileable_vertical = true}}, + inventory_image = "default_coral_pink.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "default:coral_skeleton", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" or not placer then + return itemstack + end + + local player_name = placer:get_player_name() + local pos_under = pointed_thing.under + local pos_above = pointed_thing.above + + if minetest.get_node(pos_under).name ~= "default:coral_skeleton" or + minetest.get_node(pos_above).name ~= "default:water_source" then + return itemstack + end + + if minetest.is_protected(pos_under, player_name) or + minetest.is_protected(pos_above, player_name) then + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos_under, player_name) + return itemstack + end + + minetest.set_node(pos_under, {name = "default:coral_pink"}) + if not (creative and creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + + return itemstack + end, + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:coral_skeleton"}) + end, +}) + +minetest.register_node("default:coral_cyan", { + description = "Cyan Coral", + drawtype = "plantlike_rooted", + waving = 1, + paramtype = "light", + tiles = {"default_coral_skeleton.png"}, + special_tiles = {{name = "default_coral_cyan.png", tileable_vertical = true}}, + inventory_image = "default_coral_cyan.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "default:coral_skeleton", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" or not placer then + return itemstack + end + + local player_name = placer:get_player_name() + local pos_under = pointed_thing.under + local pos_above = pointed_thing.above + + if minetest.get_node(pos_under).name ~= "default:coral_skeleton" or + minetest.get_node(pos_above).name ~= "default:water_source" then + return itemstack + end + + if minetest.is_protected(pos_under, player_name) or + minetest.is_protected(pos_above, player_name) then + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos_under, player_name) + return itemstack + end + + minetest.set_node(pos_under, {name = "default:coral_cyan"}) + if not (creative and creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + + return itemstack + end, + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:coral_skeleton"}) + end, +}) + minetest.register_node("default:coral_brown", { description = "Brown Coral", tiles = {"default_coral_brown.png"}, @@ -1486,6 +2191,7 @@ minetest.register_node("default:water_source", { tiles = { { name = "default_water_source_animated.png", + backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, @@ -1493,18 +2199,15 @@ minetest.register_node("default:water_source", { length = 2.0, }, }, - }, - special_tiles = { - -- New-style water source material (mostly unused) { name = "default_water_source_animated.png", + backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 2.0, }, - backface_culling = false, }, }, alpha = 160, @@ -1521,7 +2224,7 @@ minetest.register_node("default:water_source", { liquid_alternative_source = "default:water_source", liquid_viscosity = 1, post_effect_color = {a = 103, r = 30, g = 60, b = 90}, - groups = {water = 3, liquid = 3, puts_out_fire = 1, cools_lava = 1}, + groups = {water = 3, liquid = 3, cools_lava = 1}, sounds = default.node_sound_water_defaults(), }) @@ -1566,8 +2269,8 @@ minetest.register_node("default:water_flowing", { liquid_alternative_source = "default:water_source", liquid_viscosity = 1, post_effect_color = {a = 103, r = 30, g = 60, b = 90}, - groups = {water = 3, liquid = 3, puts_out_fire = 1, - not_in_creative_inventory = 1, cools_lava = 1}, + groups = {water = 3, liquid = 3, not_in_creative_inventory = 1, + cools_lava = 1}, sounds = default.node_sound_water_defaults(), }) @@ -1578,6 +2281,7 @@ minetest.register_node("default:river_water_source", { tiles = { { name = "default_river_water_source_animated.png", + backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, @@ -1585,17 +2289,15 @@ minetest.register_node("default:river_water_source", { length = 2.0, }, }, - }, - special_tiles = { { name = "default_river_water_source_animated.png", + backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 2.0, }, - backface_culling = false, }, }, alpha = 160, @@ -1611,10 +2313,14 @@ minetest.register_node("default:river_water_source", { liquid_alternative_flowing = "default:river_water_flowing", liquid_alternative_source = "default:river_water_source", liquid_viscosity = 1, + -- Not renewable to avoid horizontal spread of water sources in sloping + -- rivers that can cause water to overflow riverbanks and cause floods. + -- River water source is instead made renewable by the 'force renew' + -- option used in the 'bucket' mod by the river water bucket. liquid_renewable = false, liquid_range = 2, post_effect_color = {a = 103, r = 30, g = 76, b = 90}, - groups = {water = 3, liquid = 3, puts_out_fire = 1, cools_lava = 1}, + groups = {water = 3, liquid = 3, cools_lava = 1}, sounds = default.node_sound_water_defaults(), }) @@ -1661,8 +2367,8 @@ minetest.register_node("default:river_water_flowing", { liquid_renewable = false, liquid_range = 2, post_effect_color = {a = 103, r = 30, g = 76, b = 90}, - groups = {water = 3, liquid = 3, puts_out_fire = 1, - not_in_creative_inventory = 1, cools_lava = 1}, + groups = {water = 3, liquid = 3, not_in_creative_inventory = 1, + cools_lava = 1}, sounds = default.node_sound_water_defaults(), }) @@ -1673,6 +2379,7 @@ minetest.register_node("default:lava_source", { tiles = { { name = "default_lava_source_animated.png", + backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, @@ -1680,18 +2387,15 @@ minetest.register_node("default:lava_source", { length = 3.0, }, }, - }, - special_tiles = { - -- New-style lava source material (mostly unused) { name = "default_lava_source_animated.png", + backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.0, }, - backface_culling = false, }, }, paramtype = "light", @@ -1764,327 +2468,8 @@ minetest.register_node("default:lava_flowing", { -- Tools / "Advanced" crafting / Non-"natural" -- -local function get_chest_formspec(pos) - local spos = pos.x .. "," .. pos.y .. "," .. pos.z - local formspec = - "size[8,9]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" .. - "list[current_player;main;0,4.85;8,1;]" .. - "list[current_player;main;0,6.08;8,3;8]" .. - "listring[nodemeta:" .. spos .. ";main]" .. - "listring[current_player;main]" .. - default.get_hotbar_bg(0,4.85) - return formspec -end - -local function chest_lid_obstructed(pos) - local above = {x = pos.x, y = pos.y + 1, z = pos.z} - local def = minetest.registered_nodes[minetest.get_node(above).name] - -- allow ladders, signs, wallmounted things and torches to not obstruct - if def and - (def.drawtype == "airlike" or - def.drawtype == "signlike" or - def.drawtype == "torchlike" or - (def.drawtype == "nodebox" and def.paramtype2 == "wallmounted")) then - return false - end - return true -end - -local open_chests = {} - -local function chest_lid_close(pn) - local pos = open_chests[pn].pos - local sound = open_chests[pn].sound - local swap = open_chests[pn].swap - - open_chests[pn] = nil - for k, v in pairs(open_chests) do - if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then - return true - end - end - - local node = minetest.get_node(pos) - minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap, - param2 = node.param2 }) - minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10}) -end - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "default:chest" then - return - end - if not player or not fields.quit then - return - end - local pn = player:get_player_name() - - if not open_chests[pn] then - return - end - - chest_lid_close(pn) - return true -end) - -minetest.register_on_leaveplayer(function(player) - local pn = player:get_player_name() - if open_chests[pn] then - chest_lid_close(pn) - end -end) - -function default.register_chest(name, d) - local def = table.copy(d) - def.drawtype = "mesh" - def.visual = "mesh" - def.paramtype = "light" - def.paramtype2 = "facedir" - def.legacy_facedir_simple = true - def.is_ground_content = false - - if def.protected then - def.on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("infotext", "Locked Chest") - meta:set_string("owner", "") - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end - def.after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - meta:set_string("owner", placer:get_player_name() or "") - meta:set_string("infotext", "Locked Chest (owned by " .. - meta:get_string("owner") .. ")") - end - def.can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") and - default.can_interact_with_node(player, pos) - end - def.allow_metadata_inventory_move = function(pos, from_list, from_index, - to_list, to_index, count, player) - if not default.can_interact_with_node(player, pos) then - return 0 - end - return count - end - def.allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if not default.can_interact_with_node(player, pos) then - return 0 - end - return stack:get_count() - end - def.allow_metadata_inventory_take = function(pos, listname, index, stack, player) - if not default.can_interact_with_node(player, pos) then - return 0 - end - return stack:get_count() - end - def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if not default.can_interact_with_node(clicker, pos) then - return itemstack - end - - minetest.sound_play(def.sound_open, {gain = 0.3, - pos = pos, max_hear_distance = 10}) - if not chest_lid_obstructed(pos) then - minetest.swap_node(pos, - { name = "default:" .. name .. "_open", - param2 = node.param2 }) - end - minetest.after(0.2, minetest.show_formspec, - clicker:get_player_name(), - "default:chest", get_chest_formspec(pos)) - open_chests[clicker:get_player_name()] = { pos = pos, - sound = def.sound_close, swap = name } - end - def.on_blast = function() end - def.on_key_use = function(pos, player) - local secret = minetest.get_meta(pos):get_string("key_lock_secret") - local itemstack = player:get_wielded_item() - local key_meta = itemstack:get_meta() - - if key_meta:get_string("secret") == "" then - key_meta:set_string("secret", minetest.parse_json(itemstack:get_metadata()).secret) - itemstack:set_metadata("") - end - - if secret ~= key_meta:get_string("secret") then - return - end - - minetest.show_formspec( - player:get_player_name(), - "default:chest_locked", - get_chest_formspec(pos) - ) - end - def.on_skeleton_key_use = function(pos, player, newsecret) - local meta = minetest.get_meta(pos) - local owner = meta:get_string("owner") - local pn = player:get_player_name() - - -- verify placer is owner of lockable chest - if owner ~= pn then - minetest.record_protection_violation(pos, pn) - minetest.chat_send_player(pn, "You do not own this chest.") - return nil - end - - local secret = meta:get_string("key_lock_secret") - if secret == "" then - secret = newsecret - meta:set_string("key_lock_secret", secret) - end - - return secret, "a locked chest", owner - end - else - def.on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("infotext", "Chest") - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end - def.can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") - end - def.on_rightclick = function(pos, node, clicker) - minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos, - max_hear_distance = 10}) - if not chest_lid_obstructed(pos) then - minetest.swap_node(pos, { - name = "default:" .. name .. "_open", - param2 = node.param2 }) - end - minetest.after(0.2, minetest.show_formspec, - clicker:get_player_name(), - "default:chest", get_chest_formspec(pos)) - open_chests[clicker:get_player_name()] = { pos = pos, - sound = def.sound_close, swap = name } - end - def.on_blast = function(pos) - local drops = {} - default.get_inventory_drops(pos, "main", drops) - drops[#drops+1] = "default:" .. name - minetest.remove_node(pos) - return drops - end - end - - def.on_metadata_inventory_move = function(pos, from_list, from_index, - to_list, to_index, count, player) - minetest.log("action", player:get_player_name() .. - " moves stuff in chest at " .. minetest.pos_to_string(pos)) - end - def.on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " moves " .. stack:get_name() .. - " to chest at " .. minetest.pos_to_string(pos)) - end - def.on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " takes " .. stack:get_name() .. - " from chest at " .. minetest.pos_to_string(pos)) - end - - local def_opened = table.copy(def) - local def_closed = table.copy(def) - - def_opened.mesh = "chest_open.obj" - for i = 1, #def_opened.tiles do - if type(def_opened.tiles[i]) == "string" then - def_opened.tiles[i] = {name = def_opened.tiles[i], backface_culling = true} - elseif def_opened.tiles[i].backface_culling == nil then - def_opened.tiles[i].backface_culling = true - end - end - def_opened.drop = "default:" .. name - def_opened.groups.not_in_creative_inventory = 1 - def_opened.selection_box = { - type = "fixed", - fixed = { -1/2, -1/2, -1/2, 1/2, 3/16, 1/2 }, - } - def_opened.can_dig = function() - return false - end - def_opened.on_blast = function() end - - def_closed.mesh = nil - def_closed.drawtype = nil - def_closed.tiles[6] = def.tiles[5] -- swap textures around for "normal" - def_closed.tiles[5] = def.tiles[3] -- drawtype to make them match the mesh - def_closed.tiles[3] = def.tiles[3].."^[transformFX" - - minetest.register_node("default:" .. name, def_closed) - minetest.register_node("default:" .. name .. "_open", def_opened) - - -- convert old chests to this new variant - minetest.register_lbm({ - label = "update chests to opening chests", - name = "default:upgrade_" .. name .. "_v2", - nodenames = {"default:" .. name}, - action = function(pos, node) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", nil) - local inv = meta:get_inventory() - local list = inv:get_list("default:chest") - if list then - inv:set_size("main", 8*4) - inv:set_list("main", list) - inv:set_list("default:chest", nil) - end - end - }) -end - - -default.register_chest("chest", { - description = "Chest", - tiles = { - "default_chest_top.png", - "default_chest_top.png", - "default_chest_side.png", - "default_chest_side.png", - "default_chest_front.png", - "default_chest_inside.png" - }, - sounds = default.node_sound_wood_defaults(), - sound_open = "default_chest_open", - sound_close = "default_chest_close", - groups = {choppy = 2, oddly_breakable_by_hand = 2}, -}) - -default.register_chest("chest_locked", { - description = "Locked Chest", - tiles = { - "default_chest_top.png", - "default_chest_top.png", - "default_chest_side.png", - "default_chest_side.png", - "default_chest_lock.png", - "default_chest_inside.png" - }, - sounds = default.node_sound_wood_defaults(), - sound_open = "default_chest_open", - sound_close = "default_chest_close", - groups = {choppy = 2, oddly_breakable_by_hand = 2}, - protected = true, -}) - local bookshelf_formspec = "size[8,7;]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. "list[context;books;0,0.3;8,2;]" .. "list[current_player;main;0,2.85;8,1;]" .. "list[current_player;main;0,4.08;8,3;8]" .. @@ -2092,23 +2477,41 @@ local bookshelf_formspec = "listring[current_player;main]" .. default.get_hotbar_bg(0,2.85) -local function get_bookshelf_formspec(inv) +local function update_bookshelf(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local invlist = inv:get_list("books") + local formspec = bookshelf_formspec - local invlist = inv and inv:get_list("books") -- Inventory slots overlay local bx, by = 0, 0.3 + local n_written, n_empty = 0, 0 for i = 1, 16 do if i == 9 then bx = 0 by = by + 1 end - if not invlist or invlist[i]:is_empty() then + local stack = invlist[i] + if stack:is_empty() then formspec = formspec .. "image[" .. bx .. "," .. by .. ";1,1;default_bookshelf_slot.png]" + else + local metatable = stack:get_meta():to_table() or {} + if metatable.fields and metatable.fields.text then + n_written = n_written + stack:get_count() + else + n_empty = n_empty + stack:get_count() + end end bx = bx + 1 end - return formspec + meta:set_string("formspec", formspec) + if n_written + n_empty == 0 then + meta:set_string("infotext", "Empty Bookshelf") + else + meta:set_string("infotext", "Bookshelf (" .. n_written .. + " written, " .. n_empty .. " empty books)") + end end minetest.register_node("default:bookshelf", { @@ -2122,9 +2525,9 @@ minetest.register_node("default:bookshelf", { on_construct = function(pos) local meta = minetest.get_meta(pos) - meta:set_string("formspec", get_bookshelf_formspec(nil)) local inv = meta:get_inventory() inv:set_size("books", 8 * 2) + update_bookshelf(pos) end, can_dig = function(pos,player) local inv = minetest.get_meta(pos):get_inventory() @@ -2139,20 +2542,17 @@ minetest.register_node("default:bookshelf", { on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name() .. " moves stuff in bookshelf at " .. minetest.pos_to_string(pos)) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory())) + update_bookshelf(pos) end, on_metadata_inventory_put = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name() .. - " moves stuff to bookshelf at " .. minetest.pos_to_string(pos)) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory())) + " puts stuff to bookshelf at " .. minetest.pos_to_string(pos)) + update_bookshelf(pos) end, on_metadata_inventory_take = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name() .. " takes stuff from bookshelf at " .. minetest.pos_to_string(pos)) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory())) + update_bookshelf(pos) end, on_blast = function(pos) local drops = {} @@ -2197,12 +2597,19 @@ local function register_sign(material, desc, def) minetest.record_protection_violation(pos, player_name) return end - local meta = minetest.get_meta(pos) - if not fields.text then return end + local text = fields.text + if not text then + return + end + if string.len(text) > 512 then + minetest.chat_send_player(player_name, "Text too long") + return + end minetest.log("action", (player_name or "") .. " wrote \"" .. - fields.text .. "\" to sign at " .. minetest.pos_to_string(pos)) - meta:set_string("text", fields.text) - meta:set_string("infotext", '"' .. fields.text .. '"') + text .. "\" to sign at " .. minetest.pos_to_string(pos)) + local meta = minetest.get_meta(pos) + meta:set_string("text", text) + meta:set_string("infotext", '"' .. text .. '"') end, }) end @@ -2263,20 +2670,24 @@ minetest.register_node("default:ladder_steel", { }) default.register_fence("default:fence_wood", { - description = "Wooden Fence", + description = "Apple Wood Fence", texture = "default_fence_wood.png", - inventory_image = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126", - wield_image = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + inventory_image = "default_fence_overlay.png^default_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", material = "default:wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() }) default.register_fence("default:fence_acacia_wood", { - description = "Acacia Fence", + description = "Acacia Wood Fence", texture = "default_fence_acacia_wood.png", - inventory_image = "default_fence_overlay.png^default_acacia_wood.png^default_fence_overlay.png^[makealpha:255,126,126", - wield_image = "default_fence_overlay.png^default_acacia_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + inventory_image = "default_fence_overlay.png^default_acacia_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_acacia_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", material = "default:acacia_wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() @@ -2285,33 +2696,99 @@ default.register_fence("default:fence_acacia_wood", { default.register_fence("default:fence_junglewood", { description = "Jungle Wood Fence", texture = "default_fence_junglewood.png", - inventory_image = "default_fence_overlay.png^default_junglewood.png^default_fence_overlay.png^[makealpha:255,126,126", - wield_image = "default_fence_overlay.png^default_junglewood.png^default_fence_overlay.png^[makealpha:255,126,126", + inventory_image = "default_fence_overlay.png^default_junglewood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_junglewood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", material = "default:junglewood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() }) default.register_fence("default:fence_pine_wood", { - description = "Pine Fence", + description = "Pine Wood Fence", texture = "default_fence_pine_wood.png", - inventory_image = "default_fence_overlay.png^default_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126", - wield_image = "default_fence_overlay.png^default_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + inventory_image = "default_fence_overlay.png^default_pine_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_pine_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", material = "default:pine_wood", groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, sounds = default.node_sound_wood_defaults() }) default.register_fence("default:fence_aspen_wood", { - description = "Aspen Fence", + description = "Aspen Wood Fence", texture = "default_fence_aspen_wood.png", - inventory_image = "default_fence_overlay.png^default_aspen_wood.png^default_fence_overlay.png^[makealpha:255,126,126", - wield_image = "default_fence_overlay.png^default_aspen_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + inventory_image = "default_fence_overlay.png^default_aspen_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_aspen_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", material = "default:aspen_wood", groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, sounds = default.node_sound_wood_defaults() }) +default.register_fence_rail("default:fence_rail_wood", { + description = "Apple Wood Fence Rail", + texture = "default_fence_rail_wood.png", + inventory_image = "default_fence_rail_overlay.png^default_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_acacia_wood", { + description = "Acacia Wood Fence Rail", + texture = "default_fence_rail_acacia_wood.png", + inventory_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:acacia_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_junglewood", { + description = "Jungle Wood Fence Rail", + texture = "default_fence_rail_junglewood.png", + inventory_image = "default_fence_rail_overlay.png^default_junglewood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_junglewood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:junglewood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_pine_wood", { + description = "Pine Wood Fence Rail", + texture = "default_fence_rail_pine_wood.png", + inventory_image = "default_fence_rail_overlay.png^default_pine_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_pine_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:pine_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_aspen_wood", { + description = "Aspen Wood Fence Rail", + texture = "default_fence_rail_aspen_wood.png", + inventory_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:aspen_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + minetest.register_node("default:glass", { description = "Glass", drawtype = "glasslike_framed_optional", @@ -2409,12 +2886,6 @@ if minetest.get_mapgen_setting("mg_name") == "v6" then leaves = {"default:jungleleaves"}, radius = 3, }) - - default.register_leafdecay({ - trunks = {"default:pine_tree"}, - leaves = {"default:pine_needles"}, - radius = 3, - }) else default.register_leafdecay({ trunks = {"default:tree"}, @@ -2427,14 +2898,14 @@ else leaves = {"default:jungleleaves"}, radius = 2, }) - - default.register_leafdecay({ - trunks = {"default:pine_tree"}, - leaves = {"default:pine_needles"}, - radius = 2, - }) end +default.register_leafdecay({ + trunks = {"default:pine_tree"}, + leaves = {"default:pine_needles"}, + radius = 3, +}) + default.register_leafdecay({ trunks = {"default:acacia_tree"}, leaves = {"default:acacia_leaves"}, @@ -2458,3 +2929,9 @@ default.register_leafdecay({ leaves = {"default:acacia_bush_leaves"}, radius = 1, }) + +default.register_leafdecay({ + trunks = {"default:pine_bush_stem"}, + leaves = {"default:pine_bush_needles"}, + radius = 1, +}) diff --git a/mods/default/schematics/acacia_bush.mts b/mods/default/schematics/acacia_bush.mts index df95586110928918f10e78311b6a0a974b7e150a..3322e3b37e47c716b6cf9b4b57ba4fbe74ef26cf 100644 GIT binary patch delta 28 kcmXRcnh-6XET1nQFVCNHaiOHFX@g+s6sTFgQ6B-zQ|N2!`EhoUh JAh3YR0sxNm5VQaQ delta 47 zcmXqa6!i@W_GMsUU}j)qV63kPlFW&jMHBfYg&COL3{nz0)^BH@WMgB)z&VxC6#&;n B3P1n= diff --git a/mods/default/schematics/acacia_tree.mts b/mods/default/schematics/acacia_tree.mts index 4732ade3d9df99c4f543ad168dc090e551cfdee5..9b23498199e4fc4fb6d03d9cc9cad20394f5bff4 100644 GIT binary patch delta 158 zcmV;P0Ac^k0nY&uO;l4&00aOD00{sIe}6weKamhSe_0NIAPfb83v&dHUX5C%EDa!= zk>RJMWb&vGLy^~sPeQYv%$QIGbHpd@6DsyLXNSJ2-3^EIP7f5*A!CwpD5sh)q04_0 z>K)Q(=5dnH7;QJESO~W8Y4U|YOZsILg7-S5plBpF;cc|Uhv?1zh#JmCRuLlgh2{HO MEIz^p1YOZHAKG6-x&QzG delta 155 zcmV;M0A&Bq0n7mqO;l4&00aOD00;mHe}6xJkr6w8-41{t2u76`<`H~!YLzDbFfFpp zdAtF!voDMph`mmIQku=22da6>6YV@8-uCP#H)-8S*zD*7LN_vp1SHkpc~U0NgFCE2 z;j!d#4&%o4dMNhXO|yr1$^XlHD0?jw9P~8i38Kh%eE(oK%t+^w-grVDEl>Au7K@MB J0Lz5}G9GThMRWiF diff --git a/mods/default/schematics/acacia_tree_from_sapling.mts b/mods/default/schematics/acacia_tree_from_sapling.mts index 23e8e4b3a8dadb62539672269d9248d9bb6cbb76..c32a995cb921351166e6cb27a2dad9b5c8915bd2 100644 GIT binary patch delta 159 zcmV;Q0AT;k0nh;vO;l4&00aOD00{sIe}6weKamhSe_IlOAP7a34YLH6UQMNm4<=31 zCXYWLcIJjsUD4-BPhzt-88IP5bEGHj6M}e~v%}ET?nXif=M6yU41JPGfLD!|(C5Di zaf3A|Jia9)Lbst}A-Te<$rlnY`7axxeY6Ch2?YlYxe2Y&5$~cW`(tW47Fk7Ts4pzv N-(>O;1y;f>ET8;lJ}3YH delta 156 zcmV;N0Av5q0nGsrO;l4&00aOD00;mHe}6xJkr6w8VGe*G2u76)a|DiFt&qSRCd=ETe*2C=l9{PNVIVyoQJ;*6sF q{M`7YqWto_iaE&%4NPuqY6@vv)~{cmJ|R8f0VC4{0|x0EOo9Mg`W!R> literal 90 zcmeYb3HD`RVPFPA#`^kt5F;_Oh=C_1H7&6;r^KqHC^eNqEG;L$JhiCUDz~&aqbNT= qH$JH-zdWyEPI3YRvztLmLITt0N3Y*XK5^uclao{6WDtsDOalOtHXH!} diff --git a/mods/default/schematics/apple_tree.mts b/mods/default/schematics/apple_tree.mts index 2bd57c1fc4aa36e2f03c6ac2989c86b575e2784e..d56cd54b8efb295ccb5ab11b99cc914c8627dca1 100644 GIT binary patch literal 209 zcmeYb3HD`RVPI$AU|_GWx332QAfGugvxtE&B{eOvG^fNWCpEDwwU~hy#!oCL$Vp}3 zfpJTUQd2ADyq$QFx50peHIVIPN6!bh<3X(^QI|8W>Srn?70vPQWXsZ8KJUIx@!7;V zkG9-@$|-$(Zv4+9`_7-6u6}x(-)F_^(wTFg8x(xqGX4F!kGub0zh${6ULkvb8zZNI zRO@%$+SzGgMt)Hb^R91hn-bmBU?!9HKASgydCG+kw)5V9`~K(k<|u|ZPwndfaEDza literal 169 zcmeYb3HD`RVPIw8U|_AUx333bAfGugvxtE&B{eOvG^fNWCpEDwwU~hi#xE&KO=aMP z@e&IPa#AbiBqt~c89ZuT!tBPT#+IgVELCpPPM?C<9g#f_mlbAgsJv1pU-)dIY~9D7 zKYxDYU|PQG&;L)qKYxDx`n4hpbAVyM7kg%_iTd&S{fpMw$?vZG{q%qGEcboC+msj> J$|h)D1OV1LMcM!W diff --git a/mods/default/schematics/apple_tree_from_sapling.mts b/mods/default/schematics/apple_tree_from_sapling.mts index d258ab1a80a20520986cd0d37f560aeebac359f8..232510034d7d858e36a8a9fcfdd96c76d988f07e 100644 GIT binary patch literal 208 zcmeYb3HD`RVPI$AU|_GWx332QAfGugvxtE&B{eOvG^fNWCpEDwwU~hy#!oCL$Vp}3 zfpJTUQd2ADyq$QLw?ToYrIGJYM^C|G?bay^oH+LTPdl=>?e+1MLBdN9pZY!bsLtdL ztF@nE!!BsNec~zl%i6lMe2#9}v&q@+Q6Gbq0={jVnm?uD-T$d+e&@>z0)OW;u-@o> yFkLfumif=kaYef?2tKVU(b*8E6LVv;Y)*di%?7Ld%6$*t|Gd6&7o&!g`gH((_g#ko literal 173 zcmeYb3HD`RVPIw8U|_AUx333bAfGugvxtE&B{eOvG^fNWCpEDwwU~hi#xE&KO=aMP z@e&IPa#AbiBqt~c89ZuT!tBPT#+IgVELCpPPM?C<9g#f_mlbAgsJv1pU-)dIY~9D7 zKYxDYU|PQGPgUjbKYxDxs^U1v5W*v}mfiDjdc(#Bmwh#RZMt^-s(JJ5=IQInv)uRn NZc}1l2)v>e2mk;gNd5o- diff --git a/mods/default/schematics/aspen_log.mts b/mods/default/schematics/aspen_log.mts index 180e6fd1be8b31d1578f057edd7e3fb3f321c5ed..d0c723d71d002232207e0d1e77c99903dd0cd564 100644 GIT binary patch delta 103 zcmXS`(DV%n_GMsUU}a!pV63kPvV>An(-KQ_N~{u#3sUpqONvrc8JH6@izYfqm@|l^ z<>Z&A78P6NmKJ9e<>%+d7p10D%t=mYV0KeTNlHjd*s^~8`t9in6Q-v>U}W5&!k}5n GR0jY|jv~?k delta 86 zcmb;@6Y~uT_GMsUUS1-0OD*Mv;Y7A literal 0 HcmV?d00001 diff --git a/mods/default/schematics/corals.mts b/mods/default/schematics/corals.mts deleted file mode 100644 index e1bd7ded6c202e4ca9f308164806f53117606728..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmeYb3HD`RVPIuoW?-$aw+Awr6Elk#L{d`I5=(PRtdjGK5_95#L|%F-gD|RSQc-?+ z9)lRFU~zV8PHIVhUd5cXJr{Wy6gix^-`F!RE)@~k)9~+pchcpcMz;l}!mV5L=PU0m z+!C7hHEZ`~|z=l-1u%eDO2{rtR3^q z?bd8u^MA>+#ii%I{1V)~r!ScIIiK-m%X8@q_vU+F+xb?iTk2f-YOZ&WbbtQdCbsJ7 zKb?hM$L_a(u3KOuc`edl-O}Idx0zdZWh6}dEqi>PYuR6(%11gsuD@>*+VXqvQMvgG z?bY7)*N9(e$oE+FZTAkb#ZuKZY_C?_{4XeRdEeRABB$6m6-I^&TQB%5b&c4;{w+{X zU`z3xAK9^aoJ(shuIwpj(2LR3F$qo-+{c<3#kpYV6e))&haQ*9<+WN2 zV`-|J^4(W^Hi@Tx(37xLUL10a(|kF@^JQP>O5RWAh`D`?=YQUD*K!RrmAi$9e(LR6 zEYQW+`hYdGp*1>ilJDN>tJhDz%W-i=_=&$-6`yoER=oLs=Zj-~piCsFcIPj9_k@KW0JSIhT=+qF{ZHD`8CHhq?pGDrK(@mVJ~@mKiAtlvHF znuw(R%AYy1#(U=#yZ_#CrQ)r{=9tG7qBlQpJ9J(*Lo0L7y}f!ny0%|=e>v*SwAZVT z=*_H`TVL%~YqVx_LY(&Z`0V_wX%|nd`EGrFuh*MzlAn%5epr2<)imY(ce(1i){k?F zY(B>-FxNYKZGC@qr_9zHpS3;G@BWo{)O@`@gn`TA?GlD#GZwn0tINu$ri+0^{jPTsbdtJ%GqixF~{(lV%L<;yf@zh4%D&E>4-H_y|DbyiaE2b z_Xy20aue^J=cv(J*^u3I&|qTxGKTfFF6aL}J8Uyw+yH1XTluV26M@HiY{W=im6&@5-F1pwbr7GD4W delta 58 zcmaz`5c3TQ_GMsUUGJQ%wK_00jUC00n=4Kamd~G#F%n5hsfg2{J%2f`zJMn1TOrq8^CA g0LZGh2NL#RvB3pIkO>hm0J0ziRDv1+0I|3UEf`l92mk;8 delta 70 zcmYd_}# diff --git a/mods/default/schematics/pine_bush.mts b/mods/default/schematics/pine_bush.mts new file mode 100644 index 0000000000000000000000000000000000000000..ca572a7d936614eef2de1906e7fb5c5e78ab695f GIT binary patch literal 110 zcmeYb3HD`RVPFQq`uchhm6%z?AeoYymROooVpWitml~f`TAUG|mztWAlUmFmhACBC tlA2pFCpm$E*-eE*IPs8xW0-Kfe7<}>f6A5r>)AI=bS+?H&|_q80ss&cBCr4e literal 0 HcmV?d00001 diff --git a/mods/default/schematics/pine_log.mts b/mods/default/schematics/pine_log.mts index 744c38b0290fc671f18b6aeda5315bdcc2554768..d51a489f07d8540f65c1b45a047b969be781fe3d 100644 GIT binary patch literal 93 zcmeYb3HD`RVPIuoVqmPVXJBR!Oi4{kEX^sgD#*-BjV~!mO=VzC%q(IMNz2JEPc168 x$}KIzjW0?~shE?T(7^1bkisirq7RFzm}M&6Ati($5P;arR->uLDQW7C@^X`FJDrO;KUeQm@$S}k6-o8MT~(#lS?WUxDoD;y cpgDtm^#6?>J*>pApigX diff --git a/mods/default/schematics/pine_tree_from_sapling.mts b/mods/default/schematics/pine_tree_from_sapling.mts index e42a9965cda4e177a5acac0b2c6753684085b5cf..0800387c07f3ee33220e03352e6b1828e86fe238 100644 GIT binary patch delta 118 zcmV-+0Ez#u0j~iMO;l4&00aO901yBLe}6xb4nkfEV1z?z%TmvM$Rs1xWI=$5ViqHm z1+jw(ZU^bI2=`GlJZT$#)N$WHrN8+6`uuoexkP~cdWQOZhWh$?Vz>+pV8(wq3zMja YK(G#iTcKO;l4&00aO901p5Ke}9n=LS6tc!XdR~DRmVx$w)O>5MUyc#Rz3V zOlE?cOu8(>Rg{MvZNrKZR}DbAiqEglk0+LkALQ3F)aNtQ*VhxnWncg^{=-=)L_Gw8 X6%*uA)m8Wa6~k&2&o%)He2ywuc`oYZ0l zK@`!FqSVxiId20U`3@*>Fx#EGJdo%)He2ywuc`oYZ0l zK@`!FqSVxiId20mavf0M2&w;LSDPHAdxn?$*5z{(x<9;AS!5Ei`qTP^dFAQTRsFus z^B3yjHm=R&T=LT`$FBQ$U+w2})&Ip0T)po0wqaLVke~m0_R{qVbB}0zSYz~Fnos}z NZ{=g0yB{cY0RW(*Ne}=4 literal 0 HcmV?d00001 diff --git a/mods/default/schematics/snowy_pine_tree_from_sapling.mts b/mods/default/schematics/snowy_pine_tree_from_sapling.mts index 0692049adbe71447ee7aebb6c7178aa1d9935335..3d502a3e19867b81302809da506f65e2351bb0cc 100644 GIT binary patch delta 166 zcmV;X09pU&0qX$|O;l4&00aO901yBLe}6xb4o`p44uBvC1pClF!B4nPubJ)AhEt>U z)Uh!Tf%B$_14{E$1MO|(-Iv!!HJCi_y@{XAb9or)8RZ=d8O&8f#ZSr4ujie#C*Np>~6ud>p+n)z1* z*I+3tmmO&k03pbVX~klXpmq<4mtgp|TC+~pWBt@Np3a6;$6aSFrAF>nTy;=o6;}-M RIt(W@lhuzmu><%SJ7R6VOR)d| diff --git a/mods/default/schematics/snowy_small_pine_tree_from_sapling.mts b/mods/default/schematics/snowy_small_pine_tree_from_sapling.mts new file mode 100644 index 0000000000000000000000000000000000000000..d017c9e0970a561a54081e09fdd91b19873c7a57 GIT binary patch literal 202 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 literal 10099 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 oI%2I^rHkG7UHiYQ^0NTEfZvX%Q diff --git a/mods/default/sounds/default_chest_open.ogg b/mods/default/sounds/default_chest_open.ogg index c73c072c05d0b42e5e9ed50e3d7398dcc476fa16..40b0b93416cbf8a724a255ba202bcbf4ec74f429 100644 GIT binary patch literal 11092 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 F{{dc*pj7|> literal 10578 zcmaiYcRZZU*Y|~}aVsHu4~bnwuhF9|me{peEQt~=x{c_fL`x8a5JB|bd(EBbU1W)# zXse4Z>bvCmJ>N5fT;`5*8BY;GO>v^4}G71&v4eSC&ipp#dJC2msvf3}Ce!ce)TN zCgn$r3oOcm4jYWh+SEZTBHAW>Jnpfa*%`{=CcH0)V-diWK$y}C+K@;k63!4FIitAX zdvZ7`TpBlKcQr<({GUcu+7`!EB4G_#5RxJfUXnUy2~m|cqQZ@>aD-4Q*QW#*OXDVU zi)%azCX!xZ3Hid$8yVCtR8JRjL!9?@(4tWH_u!k#;VHoo@nfbC8>JU?f7jqv(ufTv zQtD<1QB%TcKqOsH8`7tg&lCcdCSecZ5VN`s!~#G@CU0aWFBuh6B^l5S091;4v|X+& zJ#SfhDp+ok{DUOK83Q1}&C`g?)`(uzh~q}a@m$yCh(i9p%Ihj}Ev^9okMzh@U1^E0 z<*WdJBtt4P$0#z#HWC{iO%n2|7#|1(fE&1F#2&(B)e}^P^bzB=j#K}unj~5?UW?;w zNcGL`X#r8V5CJ36^*P|w2&9e_Y7hL6kpmetDKbe*q~}r>GLRH0nibNlsTwt2aUUWZ zq_L^)gFVZs!h<*}GZjgmf}4j;ZO=fG{iW_zcnzn3uf|*lS0ATRcjBnKC0?;9Z)$K9 zVToOIidF@V(rEC4ebBlZbH9SRZq_TD|2e^0rdcWq?c zeif-+y?HVXBKd~3oo$4W9NjnVgC_ZN7uqBO6 z39dFUb||TVX@YVRU}V?!;L>P806|7%W;tD^w`-CdRuYS#a$ zJ1j%gJbJfqRbW&^d=##VKwFO|qLFoeCO<+^M}9N7dW?QzlxU6ozv|zu<1RP{&e{KN z1k}mk-Y>nvoj~=UZQ>3TaG_Pd_BTi+x7IiAfp7e}dt$mYa(c9?qhg4W+bBIrM?DGa zQE?Pp0);SeG)#0fsYOpESx+7L&Hb;6BEH_@EdY>-y90{j0>v#zMRP+GZM(sMBGJ{2 zjGX6}@^u{u_iB=O3T( za6e^UF)LMo>K^dZg=HXK3`)xbrBT(TMPX=EG4I3%#KiUV5l~tvMjwHsgJRzCKt-WY zS_GU%6>%E@PlO`gSr3UhPUs_M=n#lHYm-BqpP=VNp%Zin%or3=gT{4d-Z{=B{Wlb1 zTpwW~fxy&?>v^E`5Y|W>@^kC)T7=;k8cK^AheIcBBM^y*35+!&5pC{)KpCRO#}S5y zeiLJUs4?^thAZT83>xtqZ9e8WmxM+c-M!Wdg}`Ygjzh+2<%oka{4bpm69;Gv+7U&g zI(~($ig<^@$E_qs_2VyF{7t|4HJcb$`hMJ7O zSs3%PVMHaB_EriOR~D1kZ8Lw}I{i{PS?k(g8||>(TXCvsee}-yh2xarQ`EiwMn{&W zGEx60xLEKxkN{8&B(=`Cc8^p52#$3R2a&wBzy&{0C>1P{Avjk09*?DtCWxozk)}Ph zB^9_U+iDO(no~`yX$MO9W(?w~eWV#xQezBvsCWf4zL`^Pq-iHyV_@k}(itvHn(Ph} z!Dc7GjQMh^6Q$L2++$(HoH=o@D4rY!K5Vwtu-+<1wmvMPAe+{bm!~rh_L?V$$s|&s zj=`M*2L+3$z%imgU38X%)RvEMP`JfGIn@T5_9bpQnmDL_B?t~m3j%sN2wCIE{;s5c z1qA`&w0eev(t-%rGPpZ|YMC_ca8M2qP$v#bpmth@q$E_|f;^}Fhedxwje*1U;>A2U zlNQA_xW)g;X*YruTuBsFj5AmcfND+QQQ~zBKBWS6X6_X7H3sgHpm93OE#W#2hrt$4 zD%{T788jm*It(15gt3n_ulAt@slYAnSTe?jV_Yp>(8*vqSkY+)cc`gl@X-+%Gj-o; z>0}AEFImPxfofA7N?XRKgK+84kC`l|Q_0K)^w zqb-qXHYtVnebGE#X}pEGMQgQpkZJcK3kwTt9lg>(xMyQ&smb+7V`udmg)un_mA#ibR$KNPMt;zlYrZx*fhR`O5PIx&A;Ys6(7wT|n(uDD63traZl zwWX(xLT8;Wxc9E?zj#3Y=T{hNoybo7n^&(wE1Zg*99C4YZjKOKJOza$z;Gdnhy?)f zwRs7y)y~Ad^SO#^#*8gXa81+|Ju2+Cy% zCYSk|;64oD<;lUBH8nU6ruohtrU@yi8N2eqm0-eV0 zLvlEukE$7)cE@#De1?=r;$cNK%Pb)jg*C@)h?g5$(sFc`)umesrg} zPDy31xg?w(f4j=K9P~O@9saMZ_0!eltNaxY2qdJyg&K+CXcw3mozaymUFC^ElWzRN zq8if6{1P`f2^$a^ppNRNYK%+u2r|xWF)JNmtL%1T_X6Ar06{o$PCS5!gzPC0_%GfU zEXT?Xl4uD4Pzvv-ig*?J^LNHA4z67M!1f!Vra*pqy+%`g;C%wq;SOA|CsC#fGGbB0 zBbAc+_3Ga2?-1tH47mOp2M!k(L4lumz|VSsi!0@8_wbLOE5DBcQe0rf6$aoK0Hjm` z!^4+_M8qVdWMt(Pm2p1tw*&?TUK5JAHZbt-KaIc#*F(V7KaH!2nu+2ErW~AH9AMCw ze>u1~`FPp6xY;>4IqnP8;#v-NE-nxV+`taL559xzv9a-ic{$kFdGGVGvx323PB8yn zUVc8#`}gk&2=d+M1M%Gj34nPy`M~^qAbv0(FCT56^6m@}k{9^k-o>UAgsRDmjP_J6 zKi$_efwzh14Iax7m<&NcRV(1KlVHr~Rqks%a_3cf-BE5d!knaSjGdWwNIA|Hc-aD| z?RBzli3spF=qzF0B3sM5l8Uj<@CBVo$+cLGHa&GoU;jzn@t_>531qRmKNKoYF?%Ms z%o%w`c&6zD@7V{q?D11i*j>nibBla8M_=%bZyq0DS4VCe3Kki$H!ah-lnHTb1?eYE zJqJ#uKc~=}Z5e+;xSteTg%dvvy6NxzP;Rn|s@8~GR)&k*_?U$o`%EV@IoWS~Mh5s? zs2OqJqnyleP{*o|lku$4zZ74eO7iQrWn>$Y@o2Vy8~Ls@dMU zI@WPJ$iK}kc+JAP>rty6Vh=3T^UL97WkYcKJfDy)PGsi*rRC$w!DWW+47pwMqQdBV zPsF#XBNAX?X0lq77HT(5N>*;u05k@6H9L3c9W5M;LTLa+mLB~6!d>eekF8pbbB#OI za(l6CPouNmu+sl|cIof=ZQb?a7q)-alN~GdvYTM3$<3UCGnm zCp}P!txR87Dv6L9Ms&TvIXD_4e9GUBd>g_2JtQMQGpOLPGI&=lBQO z>R>$nQJRj3HH69H>j5(RpQ`dFDe>ie-2=AbVfnGTC58Snz2hb&Yk5JVQFtmdO|OCz zOXn0di*KA7wW&UIz|wA4b={MHM%iU$aQ?;a5=cXL`s1q@I=9Z6m;voW`wC*N0V6N8 z2Hu)zp086?#jF@J603|)spMX^c^L-=KcL)B3uO%3n&S&tlvJrn5>Ro-+q?_VPSD>L z90!V-2wrdS8${{Qevc8}^Dj&3`x!mhP4K?6rGysXM+~j3pLTaZsHTT^VI{)vgE}2V zv+0WH4(n0jRz_Oc#yq zHxqjV+$Ke~M@)+L!agH_tw}&26Cd&PQ?C1`o0QMCDC`x|N%KBjwzPN&vz?!x?vS%! zCb;;{Wfa-^Y3ZnR#YSq#C2zliCNc2#TWpV-4DogbWG#T_WHIn0>5rr$5Z0fAizg3- zzV&sjZmcRenU6ca8}|z^i|IPh5Q`%*x@`zX-mp2Dx-%#@&`@fJ;Ck*bQNv99&y%eL zkC>D_3wYr0U)j~|FJouB!<74?CdJ!VW~V`XUm+ptyz6b)=<}{?t{n!f{^E|P_CWT6Frln zMXC35Z)fmw4v)eB70hBu{Q1`R8|~xGYHry5_QakFcuXT*%RhlS5F`b@7@{n0a?57^ zMy$DoPZ1l_ZR^R|XU!jU-~x0sYVq9KhAl&gzd6GVE&q3Leak z+$jV-r;x>T|IxcNo#6O+k!8?im0TgPu+-zMQj~v0vmx5W*V(|zugB+rXpytE__RYz z{lN1;74zf!3C!!_!!cn=9{=sbc zT_?Nj6Zgb+%F9T9Z}uL(7ch}}?*@@uc}yvK*XL+!@3iSL^O zeh`Vk*SrC^x>nwQ{$wj|qqFUhp00Q4P%NEF?vs#tICPiT5TdI+x8ZD>oH-4UN69UN zoo}9R9FHuTx}rSn4B0K3@9LujP$4C|pHyvE8;P8x6BRy&1*B%ier{ntZ_8ut8oE3k zfa62_gP#NXbItx%FU}}s>}9I=-S|ie-h(MtDg9vM^IZ~-&A6>EQIPW2ho-cXxbd*V0!Vee9*4M%?^ z%VB4N>W=C~2CuSlm$^?hc@DFRA?1h6V8?G(q#;BQ+rF{Wpo1TxY6&K}yRM#6lCqfJ zf>nhB8XV(NNd!e^5bK>**@oVzPz&u0*%}^w<@n}gj2GQRL%4bYQ)9zxTZ{TGTaj0H{9MT5A9EhvHYHo?MG@T(rixUVb6A^j(2 z59g?fmll-qWk)Mt*j+T;p`utF{Mf-swz};tTU8OJx++B`hs~cLK-|lUr`c-l4 z*nVSP2b`kwX$q`zPwKa znOyjEw|uP*W)KggC7G)h9;8vK;PMrfAL(T`!tl@h5S<(5H9iQ#*W2r#)RKqPTO_v( z#5JPx3q`;xP|I+XSK|*Jp3kmqA`Ums8Txm`Z#w3sPf-sKNhqdvYxnQ}4mCwniXU8{ozTtnb7gDMph#LjGWJ^z1mpvRPfmVx^;2gAN(z^L zQ|HpObb@KHA3BVrtC@t}vZ3XNTUTW5n~%Q?58Si2sN{a0?tk8vj`d<0>ocLgFS$H) z84&HnmoDy(&yAS~cQ^}Zq-3Q2eQRH6cK`j`t}dO-OSj8vA3x*z=^a6|WK?e2{_Gi+ zRs~aep1WN)$oL79`4SqJz3cfnz;oUD%<<#Q?%9vc_uC9~NaJdjA>qcjt)wQ)VJaiD z%Xu9hx2>ZYf!9Yz2j9}?rWfbp^hO#MPu`T3o#@=-y4ZClzQgsi$wVjds7tnB*?euX*;`Xm;bM7x zVCW=r1sy#>iN2*hp7Ow#DG;BIW(B!5p+=2K zBQDcTwW0I_ob?M1`rch`zoD)xWoEF>022_8-fbg)=isNG4s{Z;aDiR*A3KNCo?ETxk zuz6Tx9fBnqpJD=j1dD?aaX3d%0|L+kAIJBh!ai8&+umjuOrtp67^j~wlr&46%TM#a z@O9Prg5cId6x_UAHXRCCzwuLOTV(sK%r}dn%Bty8&!gk}?rx^^J79Y!7Nn;Lo-8I7 zTwaQ&;$i}@6&!ly?F?TwR;I^G4$e9G7cXX?Y}a+nsV^rE=RR53>|_%gePuHIK=FkC z^V7=;ctq!ZeTq>fh!+D5I}*4YkJEFJ^{2hjN)8@NuHimv^gPO7Zc2VuzN_!c zh!28QFr6^@nMKk&Bp^FfS$^V)pEJ<07^l1&b)VhvV^Hl8iR;ql?b??6N4;1x>PV#)BH3az(ZQW>Lpv+qFNwH*;>E6 zUtBfAZm5c8b=~znEpukaz%hl|h0OhXPwH?F2sT^j&wZ- z^j?EEj;aX6`Vy5@P71xa9^?OJDymzOD(rcJ{e;d68mfFOfU-YeHu=Hm=DwQTvxU>noub>I9wNsUrx-nUkvtRG`AS9ZehGrQtS( zJ7sr&nM)R%GjByBG0n5hPICH&HD+E?)NcD-(fHaXZv?ew+D59|U)UJGcyBMUezXD8 zLRaRMc8&`_ZSSsf7wd2`Hx5OX5vgdA+A!483%mty=Dn_TnDHOmFx_%_=9-q6$CfXv zn@-Big^5fP1XTLo-zU5L!^t^2yg1$u9jG!JnM&>*`1;GC6&pk2zT$;Gy=Y*oGI4?v zTz`?cVdDBfUnB@{q+EQ)%{#bH2YmeeV15ukp8zkI4+Q4p-~{o4K~43I4ULU$UFDTE zVp;`I=EIsbMwvpv@VmF$F*#?UsjP6|NRGZ<{Y#zq(aJ7O z9hOC?z3mq~3r}D7(`e-7{A66_(r8Ed*u=pPIY!+%_ULtX^YOZL&1dH9p3H4Z@3egt zbf2gg{xk6`a;@=>b?1UcS*erScZ}dM_%(y1bM!X>*RlFP6*2{DuICoB#Qe}2{*q%a zA}*=vvk9B{^rWsIeG4l?^GEC013#z$X4JY>YBxx>-!iQ&ReLCQw_;9&bgYMH=fj?} zL1(BS#Qj0q)6+-C`Gkvo?9QqZ-qYKAU^?wlWAQ9hZX?A9i^GMXrvY}Fc$D{IMw`KN z>4G{PY+krzYhwg)dmo#_K%lKBKOPz2C-XV!?Z@F2w#|E}uPnc`aOpPVOnO_3Ph!O$ zxBfbfxx3m&KxO2+?O@R^UijM0*84kYUg)gyt{wEz#c_Yp+?d*qRP=^P39DrX>!kqX}Xe$??Xr@eb@R-?BVBF_g@G*qh73Ls}wGLtr2 z+s=t|ZDyB_i0vLHEToM=P@M-$kFk@*yx(mq^H9{acsTiWdf>8u<9?5VpTQ%qXC~O= zG(Xw4(Za^Ub5JFL72;vPeE`Ui%=o4YCMEnbnY7w(lzV&o4+dNBeJE{Dc3Yu?7@Iy7 zkFSpi5&P2yrC9M)hVyyzwMT0d?yY)3Z+E~w+0E~TN`)ZY^<^w2xBNkX6&#duj1GVh z)3z;aDmods2w>0F2TH(Dcpi@~xel@Z2*dr)=VmM!`IX@#zvusK`3%@}o*jrit@GQn za*U@Ze1AZ>b9o>B@gTf1{fGNUJY-P^n zBgaV#_oQa4!n*e&_O;yTk$KYVb&11<4olIFDYI=uKp)P+9E93}hUagPyqoo{cbEUU z@8@f-V82ziUcr_`LztZNIwm?*&>PPRqi>uO;OAD#GZ~3Adbn$@G;o|!BDOuqu(t?m z*E1h#G_w`@z9Vt#qyX{q6zfW;BFY4|iW{V__oM{pK>! zvt#_B&(ts(av$BLkbl8i7sL&Ax9qaR)bMR#zHWSb#_=v2kTTW?CpY|7ZyxD?uoH|Q zDfLI?TNNu#IX@GA;J)ebG?7UsDr2z6^)2zIVI%E>unsBEJyYl3-E&6* z69<66oJV1F^7Fi@53M|C&|& zQa7}J`90-Q%l+ldNsAdpFyku#nC<1sc=@L}0h3ppxV6K{`{Krr6dn9>w~{n#@(;5M zg_$GjQHvX{^NxjVTX*L_HPz-jGzR~3%J8Sk1aT)`(^lHrqVTKeUj8!S(Y(M^?zAuS zxS^mtdxsqOse)sA&PIMnf7AHhb0QIBzovL=@C(1WD9duxUM84A1bP#%m+8bEsloVf zadw)hrP>99i3(&%J1d}+E2^(bw53=Fm~m@@C4KpfN1RS9LMqO8Q#-YvIkd_>Oy1&V zTH#V`aBEvahgMnQrE5)^u5au9Bo}w=qZ)&u7Lu|xqajnaGF|Rd&PPfQumsil)qJS&>XR9deIV(tgmslMq~(1L=ebF_4t|DiS|8Qg@`78Y0j-%cEYC zY!<8%uS&sJ=u1|Pd)-tU5PQzOZ38joTh z4z>L~k}iWtGBaZyY0|w`yQna;8mrT1GifVbyKot4%5Evsl21)z%bc8<)NycGOtUmWySxv$+m9C@0y^c`wu!@4lJz83se&S`-q zND^A=Jv429SE(05Ee!aBRlC3Xv76r4Q_c6O z%~QAPA2_W2Zbe|yKy2h4|5gvePwK-i!Fre9?zf~R55hU7DDM8d{#`nyuW4=N{#~;L zueJjW_N-9n-*e^`xKz@QrVhi;XJ-qxtTnkvf7uAscK)u_<}#0QEsN!(V;E$v&JVhO zo(7oOdl|COe7u41<4abvm}wlA==S#YblJ(L-;O!GiC)W-sheDr9fCU&a#Kf1b*##n zMc;03w}bX!4?4W@_eZw#ETHR6_<+0&4@sEs9C4DCK3%Ek;Jaulg6LX{eb89apY7wn@!6bi8Bz3*xb4SWeg#dDhSTSs?8Xa@vax z|Mwy_VUhfv=qiCfDcYrHG6L_XoNV*f8zxTk^4Ldy2oWX5t6e%<+mZAd?doW^GR=Ycg<@aSemBHJX8>-JU|sE)U6$y*AzY7OpyZl0AP%#$ zdZfRkh}_5Td+M`dZ&0@O07_?mpwc3EgVy_nUn|&;fPQP`gjrxf4bz*wP#dl0{-CaU z4F#88pyd2go~co8YpAC>CQr8ZP5dFJg0}dQ_b7fEsiVKHTsu)YyN@-;>Y&nNj>lug zw9H;mjBwh($lT#H8>jK=iJJz7uMg7o>!O${YpLT)Af~rul;=w^)6b~zcS@h%oG_o< zMJjd1hkg5+71Gh4_3uB@l|n`Q6h;pH8}HH*hjMibGvkYyOXcsSj=Pvdj30SpUAinM zFipxLg?o2BgN10twuwAH>XX08;C-a$E*DB@a>|~tu_QWgA)$*ZYS_(q!m5|Z=40(} z=N%p!L&;O!4}&T}G2e0H$GVEs4O1mTbIYCex@&*dPyo>A{CHVZ5U iVWAH?ClKz65v1AmB06% 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 R?9W|`lRI4(^cbyy{{sGL8A<>E delta 9720 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 D>uv6j delta 3895 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 F{SPl&Po@9> literal 5992 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 diff --git a/mods/default/sounds/default_snow_footstep.2.ogg b/mods/default/sounds/default_snow_footstep.2.ogg index 4aac1e7fa68cf981323e86e70b4e8aa8021d7d3d..97a6baa483caba104669dd4d6311cdb0fffa2ab5 100644 GIT binary patch delta 4931 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 diff --git a/mods/default/sounds/default_snow_footstep.3.ogg b/mods/default/sounds/default_snow_footstep.3.ogg index cf4235b7b5192ae1fb52fd44f3dece78d2541971..bde1f21d49a618a6da63bafa6f04b94902021edb 100644 GIT binary patch delta 4927 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 literal 0 HcmV?d00001 diff --git a/mods/default/sounds/default_snow_footstep.5.ogg b/mods/default/sounds/default_snow_footstep.5.ogg new file mode 100644 index 0000000000000000000000000000000000000000..220d60c9326c2a1025ddf0b0985bbded37cefd5f GIT binary patch literal 8126 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 Ef8TN@p8x;= literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_blueberries.png b/mods/default/textures/default_blueberries.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbb0d64fd3a6eb38944c124c3ce257bb23559bb GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ1=6x2A*xc@rn25Hs)-Q> zwc)nE+*^)m0VNnqg8YIR9G=}s19I#=T^vI=t|uofkl3KurvfLW{@qfkrWSy85}S Ib4q9e0RCbv761SM literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_blueberry_bush_leaves.png b/mods/default/textures/default_blueberry_bush_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd112c8c3a8792bb5d63652bd723b21e414229b GIT binary patch literal 813 zcmV+|1JeA7P){ zO^aJ~6o;Slzb{GV#w3mtYa6E(?Nsb&Ww7)GanVkxx)|KpS%~5X5b-0-sfAKB*L!d7|F{Sl3Oyg-{LcA3j~qVKpnfjXu#>X? zaEU*^GEzU9Y3z^j5{ImiGyJV2^`n_`0E)9N_pXe{du0JI%WI;i&X%Y)e0KX8(@7JH zttoLQXJy@0fOKR5$a`g3UK5>PRW;i!%g;Z=JiX|Ubu9IBnfA6kaYu%%V>xgpAWCuo zvW{hEBVvA4_3CF4&pZpp#7fvo>34;3ZaHxOSX4>^C)XqH+0#z>bwvfBIJlkR5B%c})~ibuOCQY<*^duayK z+wvrB1>*R^6Y~YqRv@>wEndNJ^1T`EewQ=9s!C;&Y{$y^i$-Oiu(J^%7e3yv{jSh% ziY%{*ZnrFhc1o${67P=jLql)NlgD33)z);fr4Qka!h}Mkj1x4 zT)Sk%Z;UkU1hTU3>h2)JOn-m%LO@XQICLTapj`8K>djpLxt&rv=z{eDs8)Se)?NMj zlU?q21v&Y~llowgq84h4KH>oFpY)dH_`5|mn+bC#e0G1$i2X6< z@0KTNCy;W@qt@^+Mwq6)xLU;>8Pbs@yjhT+J{{sVgz)~D-j*j`;^0o3Z#R7z^oI)U zrQZG~BDzzOg)^uhW;)hM$b-KoX8zmqMUK5TtFOFMWEf8nUAtst=3uN|!w_CAJc6&X zH0fezBjWWBs+g&g0DpXu01zB;$vT#W_jv?gyD9RpwPyBM5e9JM$AqBlQazoh;~896 rC|6t--tzhH?u>Ld;|UGmVQc>fv>b8Yj%znL00000NkvXXu0mjfAjXiM literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_blueberry_bush_sapling.png b/mods/default/textures/default_blueberry_bush_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7393f7b2a69abe041cd7912df8ae681058674b GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ1=22#O2(o5QDJ&6MIwbc zmZ5!;k0-Nm0wowrg8YIR9G=}s196hP-CYEal|aXmRfK}f|RbD9aq+hb1{5?81=r_NyEP3Ssw$3Z2Usd*(+#IfGc240=zr%pX! pO54D>oUL)H)f-_5+P$@O1TaS?83{1OT?eHi`fM literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_blueberry_overlay.png b/mods/default/textures/default_blueberry_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..de9de623497f7a0488c1e278d5e7913182451baa GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t_2M9RHd@*bhdtcx8gZa zkg+7lFPOpM*^M-iiUNjQ_9$kWLz7z2u?_3S|r-Y wlPa7jaQ1-45}hR+7j;!M8nX2K7#N~fI^HVL4Lsu z4$p3+0XepwE{-7_*OL_(Bv==0nXrhVB`k<(lfsq>3{%3`j6_-+ws1~JWLYHJ$dj&| rsK6Vd{YZytk)w_ygTe~DWM4f6A~uo diff --git a/mods/default/textures/default_coniferous_litter.png b/mods/default/textures/default_coniferous_litter.png new file mode 100644 index 0000000000000000000000000000000000000000..da340e0a6ef0d0dff2526113dc2ed2da6fae0401 GIT binary patch literal 873 zcmWkr`%)Tr82zEeyT;bmTGO;mYa1F@KoCSO%WZ*Ot_v)CVYy#~WnsB07$x37)Fh@h z7?ZR!oyotQ$y4+V+9&7(G!M|3PB$~(`Of*y%=gbZ7r5UwJGDFo0GP#4BqZ|u2TY8L zTefy541nY>+)Fs@s{2muic9wZ)33Vq58VcFAg@8@H9#KYs@DX0O>!T+=7SYDtn`@` zezQDaQ3NdOL8}6{s&MN@*s8{D8zGxAXj6yn>tVZ^KvX0mCmqU&LrpuCq*F^eb(Cw9 zbm>V{Ph&a;+oCaJ)U9Vd2F7cO`7ANNCE>Rv1Ey?Xb333-hpgFGv!FJNV zm$Wugcr8sd(}7xsY-S^^9NEd?t$ehTC-#bLuZZq*%mGJtOH{YSJmOPbo_Sm*56h7O zk98}_lM2xj$bOCK*V#dx8q}H7M*OT1J8wjL&D5Y7?>DpO&DdotdeMqswqk>wT&v;IOpw-0bIHvT=Cfy z-Yy(|vw25W2hxv7XXfcZlXt47b(&KFJU`V`K0m?Zt{3~)Mtp1%Y{R3pYq<&C#mD9y zz^DOVJ$tR^E`$|)271`hl%9g5^kb-fFT4IKWtsVD7hMA~>IcM|W^Rg(zX)PsU$Lw4D|X~T-!Cab`CK^ zcS!aEj?W|5_K(h(U05@;8aDt9bsikW4z$KLq^yO1`@oPC7xz{Y0KL_NA{Vi=vT0cH z7>o>b2tfVR@M&UttX}|w%kwioK0qBG?)%y%$A$zSB|(0{3=Yq3qyag}o-U3d9M`9w+Q{3WAmV!Qdviqn)ClfEh6x4? z9&0>1xFsI{Q}%esbnlfI`~Fw+^YsoNnIWn5amC4u3kSYCRx;)!FJVZM(qUQ5xVLx7 v#Km5#jRep6-p$+WE^swmP-ltGrUys3_a}4Z?d!Ht0y)al)z4*}Q$iB}a$824 literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_coral_green.png b/mods/default/textures/default_coral_green.png new file mode 100644 index 0000000000000000000000000000000000000000..847c57216ae5b2a4236309db7459619db1bef2a0 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Yk*IPE0AWm&A^b$5Ob1&p@Bj7 z5<}q;1_m<*ztap1lNcDR7%VO@FgP%zA7$v=&meT2LFW>K{W%8bvkYm+7#KPk7z`K~ zbQzLA{hACkhp{BcFPOpM*^M+Hr^D05F+}3Btskclvmy`I$FjR`@BX*nnvgbY1vAgV z8Igv~=k^QftK2b{OJdsayzN{x@1{AAqIW7Sz1*>uL*VYW94$-ra|TO~$A^FV%oRteGBjjaSbt64Fw_-AW{o6Q42R!ivS_@2s0qkj5Jq| zG}nl>(2B9ph_=*-v($>W(n_$>inrEEwAMQXkG|F}|%5gHza|R-l zd>4~K7n1^4!$McnVpr25H`8J_vl6#@vl4f+Qg^d55A$*l^9oOkN+9yGsPeL?^Rce; zwQlmaX$`b%1EL@xvTqNz?+CW<40h-VbLtIq>;oaEzHq00Ac}CF5aB#2!g*q(%cLmR z$x$v-K*)7UwChw5a+?<8Ha*6DMvVLPSoc|R9&S7@Gr&In2M?GZ+|}9oSs-Wk%%Nl6~Gr&$`m)85);caykTYoY7;kYKOq8SN>Y-gsuq>8TaB_wm=N-8YEI z+GG6e*u9_}BcYoyic<2+PUcrkm>5*f9q?kK#pi~z-7B6bJlLD*dPFhSFV+9e0y~dt z6=SWBh2MYkT%S}oYvZ9?jVB^{bkNNhM|TX|JhIV8Mvi{*btA!Dt1a&x~c0$s-7 N>FVdQ&WS0Z2>|lfWl8`5 diff --git a/mods/default/textures/default_dirt.png b/mods/default/textures/default_dirt.png index ca7e4aef1415057e60b7f6427ba09ffd0a7546cc..afe4a2e13f0af9e556fab8362cb502ffa16e5344 100644 GIT binary patch literal 5889 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 delta 261 zcmV+g0s8)dE|mh17=H)@0000eEe}%w001*kOjJc-LMmN9CS*h`TRkLKHyme3FjO=d zaZx#KO*LyvGFdtxMkoq=TtshBI8-+rP%#xuE)uWSpOyds0G&xhK~xyi4a&C>1VIb~ zL4cYoZa@EMpDnpn$W5mv|a_kNZQgf4<;-x0qJ27RM^ zNXQjXts~iP(6OC>BMo4}zECzal7{_Fy57?X)El1s^!t9}U`Lu4CQ|GNh{}dwTHG4} zkcrzujLjbqUNvuiWZx5;I8Y6ItXR#*zgW_2s@$00000 LNkvXXu0mjfiSA|# diff --git a/mods/default/textures/default_emergent_jungle_sapling.png b/mods/default/textures/default_emergent_jungle_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..b363b3cc3de03ca3d144bbfcdc9a88b2656f5aea GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(a^>I@1byW6sQnpazw$%|5 zkrPlf5LXmq^|zD?DO3;#Dq}1O@(X5gcy=QV$O-gxaSY+Oo}2&#z6lKs<{ERe7*Y*p zs5w0KkzhJt#QBEzj6&oyhBWqOgAF{JH#2vnaTn?}yjs=p(mb=l$SXnV8D9WfHTRT* gZZD=t3O~ixMR!qy`LBORdre zt-~edGx1Efz31I`&Ush3xi|p;z;~TOHYNK4fX-lOSiDuqb1`_EOnodNTon&wNx(X4 zDl;rjHFfzspig$1lmR^2v$Nd(+97LHKTHAe92m{z1R`-b~z!18AG$Mp+|E_}4={m%KME(!J@SRmo!uTnqq&EiMKm0RZa^ zh9oic2cVkGP`KfUki!5RCnBWPRoGpBRESGq3>)wqn;8~2EORyThtGK>jkY<)E-c<5 zyirD=C!+8HpjpiAH~^rmrB~zQSOn7h{?QXrYH=~>O{Sh>vuZZ;Jo()iQ;J0!Weq@Y zGVKn(&h?ZWkvzw)W;4QdMccl&Ssf>m^0cO ledn4vSDi*PXyFj<(jTLFFTeQ?XRZJM002ovPDHLkV1kV&XEXo+ literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_fence_rail_junglewood.png b/mods/default/textures/default_fence_rail_junglewood.png new file mode 100644 index 0000000000000000000000000000000000000000..ebc1ef06a14f45ed06d6be169de15cd44713f7c9 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnYl@?%-6Jk^qXE9Y~H&f-b z)Znwy;nv>_Lhp$N+b&&1@Z0x71~e=NK4 zmUXKM-=S}DN6y`HHCP+*Wd5c3FWV}a<6f8lReR{vQ6M*gcc)flK!weProa<(SCtw6 z$Xl~ziN519pTJF$wR6sjF(|Tfw``yFD?4PZb1tiW(Z85^!a05it&M-Ly6wtx>s_(U b%72XiQqJYD@<);T3K0RXa;E`$I8 literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_fence_rail_pine_wood.png b/mods/default/textures/default_fence_rail_pine_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..fd8d99d6aeacc2dd0c47e8061a3f31043499dc62 GIT binary patch literal 235 zcmVsf>m^0cO ledn4vSDi*PXyFj<(jTLFFTeQ?XRZJM002ovPDHLkV1n%TWYPct literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_fence_rail_wood.png b/mods/default/textures/default_fence_rail_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..f84b755b90e33be5a9cf0e8810963d6a328aedd5 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnY4YF4bcUDdI)~ZV|XiPS4 z&9rIHw(ZQeom=U;u+C#yqt|Bj4kMuA22U5q5RU7jrwzH73`JNjcqS%K6-Y6?{$tsV zx2#)D_zr!GJ96%ptHIicC-X1Of7w>a9QV5Xui8VWjsm#}ygRib11fATGzFfRyQ<9i zN8Xw(OY|L=`2=o~tetaKj6so=yJh>VU)dpRopV|3i~hyT6VCBFXl?v^)ooXnTknc( bR{mrBm!cN;#^|98&@Bv}u6{1-oD!M<@|Rc! literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_fern_1.png b/mods/default/textures/default_fern_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b307986d43d26c9fabd118ab81a85475f7cf6771 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMffdHQnS0F8|#Al!{qH6Txu9rsuxyb5nf>uTVWPaWfoa&kyNFh zRI4A_WE5L(9oB4|(yW)Vre}9T756};cB|(0{3=Yq3qyaezo-U3d5|@(`B=#IQ za){3(ih1MGg@O?-SFcQSboB2%=;JKE%FX+vm!CsGkO$Kt(=fB^f)5`(5WBWDa3lLC z-ijM3KSWKhZauo>iDZhSmW$*O%gCiaZ&WJAa3rLqBsOhea9GFw@45^p6VNUOPgg&e IbxsLQ00R7XrvLx| literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_fern_2.png b/mods/default/textures/default_fern_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6c5f7d544af1d0485a97cbc478c16089ece8e622 GIT binary patch literal 691 zcmV;k0!;mhP)bPRc|d& zaWGDDHCJ&aM|C<>ax+qMGf{LhQ*<{|bum_TE>?6nRd_X1c`;RZHduKzU3fNLcr;jg zHdcHzS$jBQdM{LcJzIP^T75WKemhlwGh%%&Re~~Ie>+x#Gi84J%H+z^pdz(CNowpg?+~NqeMHcc)E-q(geCWqYkqg|AkRuTP6A)kXjS z00DGTPE!Ct=GbNc006^DL_t(I%VS^|1*2eyg81_6b}*x%7DSe$$HbzkXwu0|Enr}% z$#eH*V5m$q@kUqR?3NtS!oXk~8tK8{km4U3j%iC^zI|z+m9meTk*kJ2hHPtHV{uua zypyn~rGTDzNOW}ts(f%E literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_fern_3.png b/mods/default/textures/default_fern_3.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1f605e79efb7f8426ed8200077c3beba757f17 GIT binary patch literal 1172 zcmV;F1Z(?=P)MiW9kBPB-{CP)@1NEIna z5;a5_D@YnQMH)RtBrZ%KHcKcsP9`o=A~RAKJWv}nQXe`{B{)$bF;*HnQz9}}CrnN& zGFKx^Pb@N6BtBInGg=%#Rwg-FAV60qJz66^S|&VQAV6FsLR=|AT_-(XCq-T&N?s&G zU?x9eCP!c-Kw}+6U@tvnCq-f@JZ3FMWF|poB|&BCJLNo+4jY%)%3FidPROKv4cZzoM|C`)fIPi`|uaV<}8FHdkV zP;f9+Z!J!7F;HJemGfvJ5_))Vtp@NemYfxGF^W=U4S}PgEMA-EMHD850YJ)OfhB;t`K3#@AR*5!ahBjz}PGN^UY=tvo zh&x}1Om2oWZHGH#iacG7H)D%CV~aj$iaT+LJ!FhMWsE>=j4^MEHg1eGa*H)*jY4IP zKyHmPYmGZ{j5KGCLu8LdXpcc^k3?vYKxmIlYLG%}kV9mVPjHV$X_7x@lRb8iI%$$d zXOu;1ls|BjJ!_OhXO=#3kz8?>7*I&Pjube>6co=Sh5L3N%?f1N;dphtt8LwBG;e4j&lpiF+D zLVTh?g`hxoq(^$ANqnPAd!$l$r%HFHO@*XGeWpu#sbzPrM1-kPd#zA@txAEeRe`Wl zg|AkHuvd1rP>-)q#r5?F00001bW%=J06^y0W&i*IT1iAfR5;6HU>F6XfHd&w`TN$b zaNb8aYyZ&;=OC=F%P#L(@d3hq`S>n`acawg+(l5On;D)toj$nk2#|TZ<4|Q2kiI@~ zRb(B*BDiVA^i)JG^!3NuGRt@5#oKXWK6t7byCvC&{^aYfiZ{|JK!O zQ2FlrOKpJc|boc&RszW=*qWnXUt-7un`bR zZ9X1o5v&!E&$%mz!3ZtD6B(RUtnA~LYed`e*7`CiVTlt@hA3s896f$jRt7E{(I(Ev mB*x9cCWR+v8QD3QQAGf}41PZ|#X6e+0000Rtxd!-zxB}^$H*em(d-wkR`wt&JeDvti^XJcBfWfO* zuim_Q^Zxz&j~_pN`t<3`moMMGef$3X`;Q+#e*XOV>({S8fByXY_wWDz|1T$&EdmT>+n@J- z7cek5Gcfe~rJB7K%~Y5+bLpHLYgRDNUuC4C#c-FIp(LImAtF=6HPd46mefNc!k7AA z>S*L}PheyfxjfR|Rr~r>mdKI;Vst0K@%) Ap#T5? delta 142 zcmeBUn#VXnqMn7Bfq~)e-A6${ia)?7#1%*%IPm!X{SRl(yf|{?vA0ab37`;TNswPK zgTu2MX+Vyxr;B3<$Ms|Z5s?%T7A7`EHiHD0Bm+iGRs}JJPQ#|9GaQ|I9GI4|@iz-D r5!HFbaQPgI*r7$TPgocg*ci5~W@=;Q_!tQ^h{2QH)z4*}Q$iB}52q}E diff --git a/mods/default/textures/default_glass_detail.png b/mods/default/textures/default_glass_detail.png index d38dbb7b66419156dd305a20c762af15f13545e2..811a4db83d021603e687e646cb91f73f205a0c5a 100644 GIT binary patch delta 107 zcmV-x0F?iS0ez4dWe5fU001BJ|6u?C07OYdK~y-)V_+Cw;L)Q;IOXo%z5AaiLmobS zh*RPH`}c`63ZxGlczpl8W4$S;_| z;n|HeAVAxUuyE1B1~`hTV^5 S&e{jm!QkoY=d#Wzp$P!yb}I4! diff --git a/mods/default/textures/default_kelp.png b/mods/default/textures/default_kelp.png new file mode 100644 index 0000000000000000000000000000000000000000..70b743d594f2674fb2eb67976a5589ce2aeffab2 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}LV!<*E09i0Rm{v#&dOBI$yO=I zS1l}5D=tziEm1EkRj(-5sI1VauF|Nf)@*FhZfewSZq{jS(dq5hpE$u_`ZS|iGmYoY zF(mm0~ zd2;0pE0*oq~5P5BsuZX(b{44$rjF6*2U FngC5QbLap7 literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_large_cactus_seedling.png b/mods/default/textures/default_large_cactus_seedling.png new file mode 100644 index 0000000000000000000000000000000000000000..378351adb81d8f8ba61e504ccb901dbe10652c94 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!S%6Q7E0E@MU=VO)5cOja31Scp zXON0ukc(wdNMcaVU{K3pP%mWAEN0LyWzeZ$(5Yn5t6@04XPr*;^ou~9j3q&S!3+-1 zZlnP@6`n4RArhBE`xv>78gMwze*bFD>bdv+Z+d;}W1*vpjgyC__tt6st6sNp!p1*u6{1-oD!M<_1Rhs literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_marram_grass_2.png b/mods/default/textures/default_marram_grass_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2db75c706409472f32463a32f4c09d897940d280 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMf!vLQUR|WttKYRBM|QC#y6Y%XAxiAem|DkZx<6>12~- zXP@b0m1A$4>tLVjssjN zTv=vnITR^{VW73fnF;#U*uR~O>d;N#Wc@7ECK+ZgQA z65!t)>fag?&=wZd79Q9c8rBgW+!+zv85PnM71|vWF(Kyc@oCr2&%beT;jPPy?_OK_ z;O2_Zsq41_JGde;{4-%a()Usb7q{hagP3)rWbnFFAi`rz1hFwkf41_#EoX{V!kai9U_yY z4*f9Wx)NE>#u@20ThwjB^c4Y%uB$J*yof9B%CQX%&*ki|FS{$v$6It-Byu6=W{Jc% lHT5%$y(QWzY(!r(==c8RjdYjny$N&|gQu&X%Q~loCIBbBqFVp} literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_marram_grass_3.png b/mods/default/textures/default_marram_grass_3.png new file mode 100644 index 0000000000000000000000000000000000000000..f6c155f489cae6641344777ed45f6070e1aa4d98 GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}W`IwKD+7a}Zm^L_gsDlCnQ^R{ zaiY0Nij_r*rD>{_U9z=(rjv8NuWhldW3h{Cp`Tlkw_BBuZ*6EmU8sL^sBddvU~`Or zYnWeKKuA|~Xm@l}PfW_Jyu^74XOB<2c7FbiiwkdEUVQi3(g!zJ>|3;XDbP~Jk|4ie z28U-i(tw;d>gLgD?O9 literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_mese_post_light_top.png b/mods/default/textures/default_mese_post_light_top.png index 6834bd369e1daa8d372f80d3cfefa84303684d2e..365c1a785466fc0b70465dddab984801a09f53d4 100644 GIT binary patch delta 66 zcmbQu*uXf!)ta#+$S;_|;n|He1_lO6PZ!4!j+w~`3gRtXj*@wY0@`L8?BaOIz>wO_ VnCyScsBeIx*fm;}a85w5Hkzin8U@!6Xb!C6Z$i}27GKY;(8Ym>`>Eal| taXmRfLA-^_Q8MpPK-)}%T^uhN7*e|#lex_+YDO!FhTz@KEfh%5u zD`15zVTUbZh%IA^E@X=?WsNUqkT7YHFlv)9Ym_l;mN9LYGH;qQaGW!7oiuWvHFKaf zbfPwQr8jt{H+iTydZ{>jt2lhDIexD?f3Z7&vO9sZJcPGBhPpn7yFQ7&KZ?IVi@-sR z!9VRhY+Do5)+8%3zR3(=R&%oD*}vYdT?MylBsB1E;Yj3wH@3t|Ba|}{GJu1?D>MD z4k1)e(~c)Ad1^paG{QwuF7B&Nb55ZuDQABFnAV?PPQwhYZj>y>(hke4W8z>P)?Twc z67Ce^_p^ikZ<#y!fjLtuBC!J7cQ)Z-SEk862#|(Qw>rY;v$|VWhdu@(n77%+-83~i b%R~Pk(t;bo&@^<}00000NkvXXu0mjfZ_~(a literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_moss_side.png b/mods/default/textures/default_moss_side.png new file mode 100644 index 0000000000000000000000000000000000000000..4a20345e6b72152983bd907641ef72e0dc207251 GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}SAb85D?=cIbF92uqJn#}f_J8} zPnNQOu1a8mYEYqCaIsownR-}-Mr4gCD->4DNL`27ZSo=&6)7&Z>H!lONvr|2uQ| XCXO(bPjjSz_A+?7`njxgN@xNAkQI4q literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_permafrost.png b/mods/default/textures/default_permafrost.png new file mode 100644 index 0000000000000000000000000000000000000000..d7a19a2f599bf7144db376182c03b8cf03fbdf06 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF3h)VWxo+;Z)e3n8xg5 zs~LhjwuV+8F3(}`oo-#cH@QHa!9~=qtZMn3B!$da|(UZ^@LouM_nqO`o)Rh%JJNvf?pysefY zq4apVL0WY-LwT9`NyF*K7cxwo+H zwUn?k((rD zhXNQD-C&&|al>I#4r>k{C!4}T9y4=xfwM7}*e)++yL_HWiQ(H>*6)d_;md)BFnGH9 KxvXU>WC^)QwM`2{mLJiCzw;v{*y zyD)UH%6b4foCO|{#S9GG!XV7ZFl&wkP>{XE)7O>#5j&Tds7^R@Wd=|v(bL5-gyVX0 zf&yQLYO@C`8{5|eHa4}klRP}L90W_-GTC@;o#XKdmei9re!(aUqa4OXN_*<4}HN=&%5Gvjd{>xN49a9uX(Gf(!MVn}K|6{Nt(@P<_+IqgZY7SJ*V MPgg&ebxsLQ0LSS{(*OVf literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_pine_needles.png b/mods/default/textures/default_pine_needles.png index ad7373b0398f1c778b5a1e9e7ea8cfc7726f221c..f6997271012a7d38ade189ff58584193443dc3bb 100644 GIT binary patch delta 743 zcmV=1O5e&BYy(LNkl+in_H6oBD>?KvNqVE|){l%$E2#PUTh`u?v_ zsZwuRtE#QKiH!>w2IjyV_Uc8y2l#}aXS!}1euNRXtDM0quVq8IZ@6A0Y@SMyiKhT- zb>-N0F!eQ#J$4UAG1LS5lW@15a;`i6{AEMg_RPf<&o!*F2!HhrI#`<2sOFwFqvddH zi9-(qu$(H}x0-EzAxmJLMr5JKKV?JqZlcR5z`XVB`+;;4pf4?5H*#`SO^|w+<$}>F zpI15M#c;TE*uvMFwq^TpkggxGj>FgMoW&%>j!Hg@ND?36LxN`v-qhEo9guy;)#oXj zZ3S;5AHU6c*ngejsli$LjDdsmyy4TFGZ1ZFNz&n3MoMFy^G;N`-_0Xg<^*i@3nK0Gx{ zT^HdtQ@`xF{yIkh1x|mw%3%>J3IOTxLU$DtiebG>xqpA$;~hKt+{fSu<1)l?gzkCA z?$A)RfNPlbBGN&BOkTNsNQ&H;v@pL>H7m07@Yre}N^rgB`lo7Ppf}<2lKwYf%b$V~)GL186XmR;WNaKvB z*Js?$SJ2R6dS?H~=VrIbW75zr%~6V1GuTSZn%ipgYY*7q@6Gi8KeF)3x|*@>BJ>_v zSeR(nt`hXVbfJDI4U7$*OU1=FX`HiRM174fLNloSfcAwjvBC2nu%Gl14EWmO00000 LNkvXXu0mjf>ei?B diff --git a/mods/default/textures/default_stones.png b/mods/default/textures/default_stones.png new file mode 100644 index 0000000000000000000000000000000000000000..4d3b6cfac0cee5303608e5dbd752973209237dac GIT binary patch literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMfmH?j+S0Eh`5fK9du|NFJr7nHgCb8CjWGAds7#ot=}D zlM4bx1qB7gg+(PGP+C$_US3`a1T`SgPzwU}wYAN4b#?Xi&2F+-1!WenvRD^E}yNC1&4@Z_BlhlJ- z3}#EYG{jGs&B**hvq>{{!4%1eW&!Pp27i_nj`La_W7$s_nwz#{Uzo-$G;P(N0!Gg? zg@c;MShfYToUMqHvT)CD6vGP#PRD`; S+IN6XWAJqKb6Mw<&;$TTyqZw} literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_stones_side.png b/mods/default/textures/default_stones_side.png new file mode 100644 index 0000000000000000000000000000000000000000..7ae823a7962ddaf2e8fe4a9038ea34bc3d06a8ba GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}NPtg>E0B(jjZKJ)Pe@2eN=iye zN(O?Il$6xe)J!1C%*@Kl$_0UoEDB&Fu#oph#PzQsjtDnm{r-UW|g&stF literal 0 HcmV?d00001 diff --git a/mods/default/textures/gui_hotbar.png b/mods/default/textures/gui_hotbar.png deleted file mode 100644 index 73fb3ca8f2485ca10114cf40fa793c45d1a541ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 284 zcmeAS@N?(olHy`uVBq!ia0y~yUfKP}kkOqSPFyN&AdNYvE zS`y?JT+C1%W8ZRBr3xsp-P6S}q~g}wI|q3k92i^zFCJ`Ta$$F3Ui5z+OZhjY*`D|2 z{C_EG5WDfzLZ{HWg;v+T=em9g=>2@X>|$LoZ}9hhb%MGp0v0+=6H| z!YQZ~vLZm$1uP*zxx_5jb^BH+vlnfh812O0cRgV1ZO#p^ygze3YugX#+Vv9$fYdtvkTqP)$8Nhv~-X1p*s=uRJCqdiY&{LtXQ^j9K&H4 z(lpExNR}0(nuj3_=X4Gs{yJ_@qm+&dsm5j7_481kKK`64Ey@VIB5}^G$ufrN&~@Dq z?$1e3w?LJK{)Z$Dw<3w6jQ%;ygeWk6(bol&tp-5 z7`@!hB^y*Q%q#KKEn3|zU$e~{w`AG=2$Jsc=?H4AigO2I90(=a(yb6`<)FmqVaOb0 zeMM138uxPLg@(Sotx=Lhc?rpHuLK4};oU?3HdbHqvK2}T*;G~pkb2Teo7xB^rPOsB z7@9}uwUkpE2e?=(MG#{iYpn&UQEKZryM9AOx#p--Lffj5S_rLxZyGCYQ=KcTje*LG zttzX`gbIjN#1qou$x2T!!6ZM>oH`Mk$!Kc<1(k4B)!62It{PnjW`as8B|S@cDBXi4 zl!f?qs!pE!m^PIxlPvo4YXP+_`cInuvutEpj0*?UT#EjYd#IK9IHbRa3Q=E*>$9Zp z6Lfw)e-E7|K)Y*stkYY1zw<(+)wi@~fC@mD>j9O*&DSUMn5y~}4p)xZC+I!jp+S^h zd!{jc?(0Lu>Pf)-}_Zw#LL5)BJ!gcb?gwJd|~!0x_Zc&jVU=K}DMk9(p!x&`Hn> zU$R1LA%fT39Z;s(pR^95c_3(IxR#Vq9(p0@G_gWcf}XXAd7xTjOhe!OFWOH#j)PAs zKryC2J3qs5V&S`iv_oYbrCs-XXk#^?&zuzsm(fJnrC7T!t4c-Jha;#`ZIX5jP|;Kx z(Bm{^f*K|3#i zwJ*-yJ(tru+!>&g68_*jEPb&+g+6?#WA=x~gU3J3j@Oj7R(z*2L67eH)y2_$Bg_w! zPV2sBIZfmLpidqs_1Q!B;++8sXX1dK$>=A?><2~!*?X6Y3qW~1l;pZws&ouK%j|2~ zP~P3gm@>IN=?*of1)t?LCFt&-0{Ti>py~}hPZOXlZ(tUx0>9$)cUg?$P+{YP0&?ANta(F0OD%w!?V3%Zq z3WCBx+h>1rOi+2ak_0vD%n?J;jh)_O$^}(TBVI$lTdHcju|12^tKmW92b5>=TR@|( zKcH9$9GkSXwoVSHRybKWKF*Ys_0PfAQVivBO_4Du5M19VjGrXVMOoq~Hhx1SokH#- zDvEGK^naw7|4a?G1r;0O`IkvHjdqCkcD_fRj+cFprb6}NkjpwXU7N$VX zGg%5M*;>|QY1Dl~0}Su;Ixh(SBW)0YRV1r(C?S2ZEg9uh!d)`x$#ndQk`&Z4)Z!ZD z7o#=#Is~mIVM^*K)IQ16BE5hBJtc2)h+Ex$i69R8z)S|Ig3^JHKbALlL!m^%XEO0R zrh5=Uh#Is@YhXXdrBS9fT3TzB2}nQ@S^xx|vbG_ik6X%67~)fjG67mou`AjWrH;@7 zU}IGCMbb#rO3=Z#N>eUETAwlyV%ML~N18%tEhbX~P0v*j-O7_sa#d$9)z@DyUv%^J vzB%qt@`BP);o(0T-{Y?bTTvoI00000NkvXXu0mjfh=~t@ diff --git a/mods/default/tools.lua b/mods/default/tools.lua index 77ea969..9f503ed 100644 --- a/mods/default/tools.lua +++ b/mods/default/tools.lua @@ -50,6 +50,20 @@ minetest.register_tool("default:pick_stone", { sound = {breaks = "default_tool_breaks"}, }) +minetest.register_tool("default:pick_bronze", { + description = "Bronze Pickaxe", + inventory_image = "default_tool_bronzepick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + cracky = {times={[1]=4.50, [2]=1.80, [3]=0.90}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + minetest.register_tool("default:pick_steel", { description = "Steel Pickaxe", inventory_image = "default_tool_steelpick.png", @@ -64,20 +78,6 @@ minetest.register_tool("default:pick_steel", { sound = {breaks = "default_tool_breaks"}, }) -minetest.register_tool("default:pick_bronze", { - description = "Bronze Pickaxe", - inventory_image = "default_tool_bronzepick.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=30, maxlevel=2}, - }, - damage_groups = {fleshy=4}, - }, - sound = {breaks = "default_tool_breaks"}, -}) - minetest.register_tool("default:pick_mese", { description = "Mese Pickaxe", inventory_image = "default_tool_mesepick.png", @@ -141,6 +141,21 @@ minetest.register_tool("default:shovel_stone", { sound = {breaks = "default_tool_breaks"}, }) +minetest.register_tool("default:shovel_bronze", { + description = "Bronze Shovel", + inventory_image = "default_tool_bronzeshovel.png", + wield_image = "default_tool_bronzeshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.1, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.65, [2]=1.05, [3]=0.45}, uses=25, maxlevel=2}, + }, + damage_groups = {fleshy=3}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + minetest.register_tool("default:shovel_steel", { description = "Steel Shovel", inventory_image = "default_tool_steelshovel.png", @@ -156,21 +171,6 @@ minetest.register_tool("default:shovel_steel", { sound = {breaks = "default_tool_breaks"}, }) -minetest.register_tool("default:shovel_bronze", { - description = "Bronze Shovel", - inventory_image = "default_tool_bronzeshovel.png", - wield_image = "default_tool_bronzeshovel.png^[transformR90", - tool_capabilities = { - full_punch_interval = 1.1, - max_drop_level=1, - groupcaps={ - crumbly = {times={[1]=1.50, [2]=0.90, [3]=0.40}, uses=40, maxlevel=2}, - }, - damage_groups = {fleshy=3}, - }, - sound = {breaks = "default_tool_breaks"}, -}) - minetest.register_tool("default:shovel_mese", { description = "Mese Shovel", inventory_image = "default_tool_meseshovel.png", @@ -234,6 +234,20 @@ minetest.register_tool("default:axe_stone", { sound = {breaks = "default_tool_breaks"}, }) +minetest.register_tool("default:axe_bronze", { + description = "Bronze Axe", + inventory_image = "default_tool_bronzeaxe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.75, [2]=1.70, [3]=1.15}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + minetest.register_tool("default:axe_steel", { description = "Steel Axe", inventory_image = "default_tool_steelaxe.png", @@ -248,20 +262,6 @@ minetest.register_tool("default:axe_steel", { sound = {breaks = "default_tool_breaks"}, }) -minetest.register_tool("default:axe_bronze", { - description = "Bronze Axe", - inventory_image = "default_tool_bronzeaxe.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - choppy={times={[1]=2.50, [2]=1.40, [3]=1.00}, uses=30, maxlevel=2}, - }, - damage_groups = {fleshy=4}, - }, - sound = {breaks = "default_tool_breaks"}, -}) - minetest.register_tool("default:axe_mese", { description = "Mese Axe", inventory_image = "default_tool_meseaxe.png", @@ -283,7 +283,7 @@ minetest.register_tool("default:axe_diamond", { full_punch_interval = 0.9, max_drop_level=1, groupcaps={ - choppy={times={[1]=2.10, [2]=0.90, [3]=0.50}, uses=30, maxlevel=2}, + choppy={times={[1]=2.10, [2]=0.90, [3]=0.50}, uses=30, maxlevel=3}, }, damage_groups = {fleshy=7}, }, @@ -323,6 +323,20 @@ minetest.register_tool("default:sword_stone", { sound = {breaks = "default_tool_breaks"}, }) +minetest.register_tool("default:sword_bronze", { + description = "Bronze Sword", + inventory_image = "default_tool_bronzesword.png", + tool_capabilities = { + full_punch_interval = 0.8, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=2.75, [2]=1.30, [3]=0.375}, uses=25, maxlevel=2}, + }, + damage_groups = {fleshy=6}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + minetest.register_tool("default:sword_steel", { description = "Steel Sword", inventory_image = "default_tool_steelsword.png", @@ -337,20 +351,6 @@ minetest.register_tool("default:sword_steel", { sound = {breaks = "default_tool_breaks"}, }) -minetest.register_tool("default:sword_bronze", { - description = "Bronze Sword", - inventory_image = "default_tool_bronzesword.png", - tool_capabilities = { - full_punch_interval = 0.8, - max_drop_level=1, - groupcaps={ - snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=40, maxlevel=2}, - }, - damage_groups = {fleshy=6}, - }, - sound = {breaks = "default_tool_breaks"}, -}) - minetest.register_tool("default:sword_mese", { description = "Mese Sword", inventory_image = "default_tool_mesesword.png", diff --git a/mods/default/torch.lua b/mods/default/torch.lua index a7b83cf..5de5f89 100644 --- a/mods/default/torch.lua +++ b/mods/default/torch.lua @@ -1,39 +1,17 @@ - ---[[ - -Torch mod - formerly mod "Torches" -====================== - -(c) Copyright BlockMen (2013-2015) -(C) Copyright sofar (2016) - -This mod changes the default torch drawtype from "torchlike" to "mesh", -giving the torch a three dimensional appearance. The mesh contains the -proper pixel mapping to make the animation appear as a particle above -the torch, while in fact the animation is just the texture of the mesh. - - -License: -~~~~~~~~ -(c) Copyright BlockMen (2013-2015) - -Textures and Meshes/Models: -CC-BY 3.0 BlockMen -Note that the models were entirely done from scratch by sofar. - -Code: -Licensed under the GNU LGPL version 2.1 or higher. -You can redistribute it and/or modify it under -the terms of the GNU Lesser General Public License -as published by the Free Software Foundation; - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -See LICENSE.txt and http://www.gnu.org/licenses/lgpl-2.1.txt - ---]] +local function on_flood(pos, oldnode, newnode) + minetest.add_item(pos, ItemStack("default:torch 1")) + -- Play flame-extinguish sound if liquid is not an 'igniter' + local nodedef = minetest.registered_items[newnode.name] + if not (nodedef and nodedef.groups and + nodedef.groups.igniter and nodedef.groups.igniter > 0) then + minetest.sound_play( + "default_cool_lava", + {pos = pos, max_hear_distance = 16, gain = 0.1} + ) + end + -- Remove the torch node + return false +end minetest.register_node("default:torch", { description = "Torch", @@ -84,7 +62,9 @@ minetest.register_node("default:torch", { itemstack:set_name("default:torch") return itemstack - end + end, + floodable = true, + on_flood = on_flood, }) minetest.register_node("default:torch_wall", { @@ -106,6 +86,8 @@ minetest.register_node("default:torch_wall", { wall_side = {-1/2, -1/2, -1/8, -1/8, 1/8, 1/8}, }, sounds = default.node_sound_wood_defaults(), + floodable = true, + on_flood = on_flood, }) minetest.register_node("default:torch_ceiling", { @@ -127,6 +109,8 @@ minetest.register_node("default:torch_ceiling", { wall_top = {-1/8, -1/16, -5/16, 1/8, 1/2, 1/8}, }, sounds = default.node_sound_wood_defaults(), + floodable = true, + on_flood = on_flood, }) minetest.register_lbm({ diff --git a/mods/default/trees.lua b/mods/default/trees.lua index 44176d7..564b714 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -81,10 +81,22 @@ function default.grow_sapling(pos) minetest.log("action", "A bush sapling grows into a bush at ".. minetest.pos_to_string(pos)) default.grow_bush(pos) + elseif node.name == "default:blueberry_bush_sapling" then + minetest.log("action", "A blueberry bush sapling grows into a bush at ".. + minetest.pos_to_string(pos)) + default.grow_blueberry_bush(pos) elseif node.name == "default:acacia_bush_sapling" then minetest.log("action", "An acacia bush sapling grows into a bush at ".. minetest.pos_to_string(pos)) default.grow_acacia_bush(pos) + elseif node.name == "default:pine_bush_sapling" then + minetest.log("action", "A pine bush sapling grows into a bush at ".. + minetest.pos_to_string(pos)) + default.grow_pine_bush(pos) + elseif node.name == "default:emergent_jungle_sapling" then + minetest.log("action", "An emergent jungle sapling grows into a tree at ".. + minetest.pos_to_string(pos)) + default.grow_new_emergent_jungle_tree(pos) end end @@ -379,7 +391,7 @@ end function default.grow_new_apple_tree(pos) local path = minetest.get_modpath("default") .. "/schematics/apple_tree_from_sapling.mts" - minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + minetest.place_schematic({x = pos.x - 3, y = pos.y - 1, z = pos.z - 3}, path, "random", nil, false) end @@ -394,11 +406,27 @@ function default.grow_new_jungle_tree(pos) end +-- New emergent jungle tree + +function default.grow_new_emergent_jungle_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/emergent_jungle_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 3, y = pos.y - 5, z = pos.z - 3}, + path, "random", nil, false) +end + + -- New pine tree function default.grow_new_pine_tree(pos) - local path = minetest.get_modpath("default") .. - "/schematics/pine_tree_from_sapling.mts" + local path + if math.random() > 0.5 then + path = minetest.get_modpath("default") .. + "/schematics/pine_tree_from_sapling.mts" + else + path = minetest.get_modpath("default") .. + "/schematics/small_pine_tree_from_sapling.mts" + end minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, path, "0", nil, false) end @@ -407,8 +435,14 @@ end -- New snowy pine tree function default.grow_new_snowy_pine_tree(pos) - local path = minetest.get_modpath("default") .. - "/schematics/snowy_pine_tree_from_sapling.mts" + local path + if math.random() > 0.5 then + path = minetest.get_modpath("default") .. + "/schematics/snowy_pine_tree_from_sapling.mts" + else + path = minetest.get_modpath("default") .. + "/schematics/snowy_small_pine_tree_from_sapling.mts" + end minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, path, "random", nil, false) end @@ -446,6 +480,15 @@ function default.grow_bush(pos) path, "0", nil, false) end +-- Blueberry bush + +function default.grow_blueberry_bush(pos) + local path = minetest.get_modpath("default") .. + "/schematics/blueberry_bush.mts" + minetest.place_schematic({x = pos.x - 1, y = pos.y, z = pos.z - 1}, + path, "0", nil, false) +end + -- Acacia bush @@ -457,6 +500,26 @@ function default.grow_acacia_bush(pos) end +-- Pine bush + +function default.grow_pine_bush(pos) + local path = minetest.get_modpath("default") .. + "/schematics/pine_bush.mts" + minetest.place_schematic({x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, + path, "0", nil, false) +end + + +-- Large cactus + +function default.grow_large_cactus(pos) + local path = minetest.get_modpath("default") .. + "/schematics/large_cactus.mts" + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "random", nil, false) +end + + -- -- Sapling 'on place' function to check protection of node and resulting tree volume -- @@ -490,14 +553,16 @@ function default.sapling_on_place(itemstack, placer, pointed_thing, return itemstack end -- Check tree volume for protection - if default.intersects_protection( + if minetest.is_area_protected( vector.add(pos, minp_relative), vector.add(pos, maxp_relative), player_name, interval) then minetest.record_protection_violation(pos, player_name) -- Print extra information to explain - minetest.chat_send_player(player_name, "Tree will intersect protection") + minetest.chat_send_player(player_name, + itemstack:get_definition().description .. " will intersect protection " .. + "on growth") return itemstack end diff --git a/mods/doors/README.txt b/mods/doors/README.txt index 9ad7093..9c114b0 100644 --- a/mods/doors/README.txt +++ b/mods/doors/README.txt @@ -46,8 +46,9 @@ Following textures created by sofar (CC-BY-SA-3.0): Obsidian door textures by red-001 based on textures by Pilzadam and BlockMen (CC BY-SA 3.0): door_obsidian_glass.png -Glass door textures by red-001 based on textures by celeron55 (CC BY-SA 3.0): - door_glass.png +Glass door textures by Krock and paramat based on textures by VanessaE (CC BY-SA 3.0): + doors_door_glass.png + doors_item_glass.png All other textures (created by PilzAdam) (CC BY-SA 3.0): diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 41e8b21..0205ec7 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -1,10 +1,8 @@ -- our API object doors = {} --- private data -local _doors = {} -_doors.registered_doors = {} -_doors.registered_trapdoors = {} +doors.registered_doors = {} +doors.registered_trapdoors = {} local function replace_old_owner_information(pos) local meta = minetest.get_meta(pos) @@ -18,7 +16,7 @@ end -- returns an object to a door object or nil function doors.get(pos) local node_name = minetest.get_node(pos).name - if _doors.registered_doors[node_name] then + if doors.registered_doors[node_name] then -- A normal upright door return { pos = pos, @@ -26,23 +24,23 @@ function doors.get(pos) if self:state() then return false end - return _doors.door_toggle(self.pos, nil, player) + return doors.door_toggle(self.pos, nil, player) end, close = function(self, player) if not self:state() then return false end - return _doors.door_toggle(self.pos, nil, player) + return doors.door_toggle(self.pos, nil, player) end, toggle = function(self, player) - return _doors.door_toggle(self.pos, nil, player) + return doors.door_toggle(self.pos, nil, player) end, state = function(self) local state = minetest.get_meta(self.pos):get_int("state") return state %2 == 1 end } - elseif _doors.registered_trapdoors[node_name] then + elseif doors.registered_trapdoors[node_name] then -- A trapdoor return { pos = pos, @@ -50,16 +48,16 @@ function doors.get(pos) if self:state() then return false end - return _doors.trapdoor_toggle(self.pos, nil, player) + return doors.trapdoor_toggle(self.pos, nil, player) end, close = function(self, player) if not self:state() then return false end - return _doors.trapdoor_toggle(self.pos, nil, player) + return doors.trapdoor_toggle(self.pos, nil, player) end, toggle = function(self, player) - return _doors.trapdoor_toggle(self.pos, nil, player) + return doors.trapdoor_toggle(self.pos, nil, player) end, state = function(self) return minetest.get_node(self.pos).name:sub(-5) == "_open" @@ -130,7 +128,7 @@ local transform = { }, } -function _doors.door_toggle(pos, node, clicker) +function doors.door_toggle(pos, node, clicker) local meta = minetest.get_meta(pos) node = node or minetest.get_node(pos) local def = minetest.registered_nodes[node.name] @@ -162,6 +160,14 @@ function _doors.door_toggle(pos, node, clicker) end local dir = node.param2 + + -- It's possible param2 is messed up, so, validate before using + -- the input data. This indicates something may have rotated + -- the door, even though that is not supported. + if not transform[state + 1] or not transform[state + 1][dir + 1] then + return false + end + if state % 2 == 0 then minetest.sound_play(def.door.sounds[1], {pos = pos, gain = 0.3, max_hear_distance = 10}) @@ -365,10 +371,11 @@ function doors.register(name, def) name = name, sounds = { def.sound_close, def.sound_open }, } - - def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - _doors.door_toggle(pos, node, clicker) - return itemstack + if not def.on_rightclick then + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + doors.door_toggle(pos, node, clicker) + return itemstack + end end def.after_dig_node = function(pos, node, meta, digger) minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z}) @@ -406,6 +413,7 @@ function doors.register(name, def) return secret, "a locked door", owner end + def.node_dig_prediction = "" else def.on_blast = function(pos, intensity) minetest.remove_node(pos) @@ -435,8 +443,8 @@ function doors.register(name, def) def.mesh = "door_b.obj" minetest.register_node(":" .. name .. "_b", def) - _doors.registered_doors[name .. "_a"] = true - _doors.registered_doors[name .. "_b"] = true + doors.registered_doors[name .. "_a"] = true + doors.registered_doors[name .. "_b"] = true end doors.register("door_wood", { @@ -523,7 +531,7 @@ end ----trapdoor---- -function _doors.trapdoor_toggle(pos, node, clicker) +function doors.trapdoor_toggle(pos, node, clicker) node = node or minetest.get_node(pos) replace_old_owner_information(pos) @@ -556,7 +564,7 @@ function doors.register_trapdoor(name, def) local name_opened = name.."_open" def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - _doors.trapdoor_toggle(pos, node, clicker) + doors.trapdoor_toggle(pos, node, clicker) return itemstack end @@ -603,6 +611,7 @@ function doors.register_trapdoor(name, def) return secret, "a locked trapdoor", owner end + def.node_dig_prediction = "" else def.on_blast = function(pos, intensity) minetest.remove_node(pos) @@ -658,12 +667,12 @@ function doors.register_trapdoor(name, def) minetest.register_node(name_opened, def_opened) minetest.register_node(name_closed, def_closed) - _doors.registered_trapdoors[name_opened] = true - _doors.registered_trapdoors[name_closed] = true + doors.registered_trapdoors[name_opened] = true + doors.registered_trapdoors[name_closed] = true end doors.register_trapdoor("doors:trapdoor", { - description = "Trapdoor", + description = "Wooden Trapdoor", inventory_image = "doors_trapdoor.png", wield_image = "doors_trapdoor.png", tile_front = "doors_trapdoor.png", @@ -779,14 +788,14 @@ function doors.register_fencegate(name, def) end doors.register_fencegate("doors:gate_wood", { - description = "Wooden Fence Gate", + description = "Apple Wood Fence Gate", texture = "default_wood.png", material = "default:wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} }) doors.register_fencegate("doors:gate_acacia_wood", { - description = "Acacia Fence Gate", + description = "Acacia Wood Fence Gate", texture = "default_acacia_wood.png", material = "default:acacia_wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} @@ -800,14 +809,14 @@ doors.register_fencegate("doors:gate_junglewood", { }) doors.register_fencegate("doors:gate_pine_wood", { - description = "Pine Fence Gate", + description = "Pine Wood Fence Gate", texture = "default_pine_wood.png", material = "default:pine_wood", groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} }) doors.register_fencegate("doors:gate_aspen_wood", { - description = "Aspen Fence Gate", + description = "Aspen Wood Fence Gate", texture = "default_aspen_wood.png", material = "default:aspen_wood", groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} diff --git a/mods/doors/textures/doors_door_glass.png b/mods/doors/textures/doors_door_glass.png index 26c427b9fef32a34b2fd8daa7bff4117933d1924..c296a0ff34e16e887163cb6fc16ca152230d66f3 100644 GIT binary patch delta 484 zcmVrr8Gi!+002q4`hfrd08vm(R7C&)V5Fp^tgNiMy1K^3#^vSZ=jZ3> z=;-R|>g((4?d|RE?(XmJ@A2{R^78WY^Yird^!E1l_xJbs`1twx`TF|$`}_O+{QUj> z{r>*`|NsBMPxC+k0004WQchC#$?t_!fq4}l5&f6QuzqV)ORz>#Yw9ysGI}#BfKC70*!Z=qUo4vtO~vx z%yf=#dYUL~!_wJoeIJEi^|{|EEDxCcX7Gy5kKTZ$?M&lTF$sfkG_BdB8nLVx`J~R! zcumN98)6_b9{c!V22eA6Eq9+!JgG8^o$< av(hg=j~(8!)3Bca00000Dy!50Qvv`0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000JJOGiWi z{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA0YXVcL4Q0eyg`ZbB z042q`NRwQE5{Z$xOAeL0AQ_303%E)V3QBHZij@&jY_ER>?B|Kssu1^s9X3b2tVYsQfUNHdZ`$JC7iJ}hebH+rRDHXSo&cmNtp4{bq zfR$ME|A4v5QmSNLU__jqPGzpBBrpKjZhu;W4_xe3=HtJ#i%?Yn&@|0#@xDJic9V!h zh;inu?@1};uYuaOHN|j)JwupaOi-bcQqE$yN?BO4^cf8{bRH|&E|TW4 zl5g~^lzJYsW$4<~oLU-es6OMZd?)?Qc`Wt2(i;p2o5xbM%wsv_Rhn1)lDY$^?)H`= SV9#s-0000+9_7?D_=})&Kwi0d!JMQvg8b*k%9# z0ANW(K~xyiO^;aufFKA&F)R&i@&1=hguwX_eKI%#3^DiIkWn7^^=d%}6@W%*4sf1@ zo9ya#u*pJ;h0+`nprl!{gRUTQu!7>?)EohJ%@LMEpRKD!df35bvjf=wW&Z&XBmxAK Sh*={50000@ delta 170 zcmaFCxQlUuL_HHT0|P_ST=7ppiYLG)#5GknT}@5xz=6jPAAW48IS&+OU@Qsp3ubV5 zb|VeMN%D4gVd!9$^#F1>3p^r=85p>QL70(Y)*K0-AbW|YuPgflWmdKI;Vst04H)XO#lD@ diff --git a/mods/doors/textures/doors_trapdoor_side.png b/mods/doors/textures/doors_trapdoor_side.png index c45d870d90c4b50e495c4cc48911eb4e62717bc2..4a8b99f2836e47737f494f2c1959486337994e6e 100644 GIT binary patch delta 153 zcmaFKxRP;#L_G^L0|Ud`yN`l^6n}tEh--eRZe4;wN2Ymuw*ACn7ms;&P6DMElf2zs z7&=&GJ%Aj}0*}aI1_o|n5N2eUHAey{$X?><>&pI+je}E$V~=Z~22e=B)5S4_<9c#I xp@iFi@}4Sk`QKw9y1|v&-)9@KLHgpc)I$ztaD0e0sxZzDtrI{ delta 191 zcmV;w06_n#0qFsd7#j!z0001xk!Usm000JJOGiWi{{a60|De66laWatf8YTS7bh~j zl9?R<004GLL_t(2&+U>i4udcd1lJMBzC-S4cnKfiGt_*7Hcv$nceX4r1*Cxn>SW5% zPPgVgboe460bp0+f`qjDLgjNPjnljUXlg#MH3BfJ6^$n6j3>PCkbm$iff@Vu=J}Yc tXe@~RZizir2>@O0P3$Ek8FD4D-vD;QE6W|hu`~bx002ovPDHLkV1htIO+x?x diff --git a/mods/dungeon_loot/README.txt b/mods/dungeon_loot/README.txt new file mode 100644 index 0000000..c500d25 --- /dev/null +++ b/mods/dungeon_loot/README.txt @@ -0,0 +1,11 @@ +Minetest Game mod: dungeon_loot +=============================== +Adds randomly generated chests with some "loot" to generated dungeons, +an API to register additional loot is provided. +Only works if dungeons are actually enabled in mapgen flags. + +License information can be found in license.txt + +Authors of source code +---------------------- +Originally by sfan5 (MIT) diff --git a/mods/dungeon_loot/depends.txt b/mods/dungeon_loot/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/dungeon_loot/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/dungeon_loot/init.lua b/mods/dungeon_loot/init.lua new file mode 100644 index 0000000..9d8ac52 --- /dev/null +++ b/mods/dungeon_loot/init.lua @@ -0,0 +1,8 @@ +dungeon_loot = {} + +dungeon_loot.CHESTS_MIN = 0 -- not necessarily in a single dungeon +dungeon_loot.CHESTS_MAX = 2 +dungeon_loot.STACKS_PER_CHEST_MAX = 8 + +dofile(minetest.get_modpath("dungeon_loot") .. "/loot.lua") +dofile(minetest.get_modpath("dungeon_loot") .. "/mapgen.lua") diff --git a/mods/dungeon_loot/license.txt b/mods/dungeon_loot/license.txt new file mode 100644 index 0000000..0af30a0 --- /dev/null +++ b/mods/dungeon_loot/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2017 sfan5 + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/dungeon_loot/loot.lua b/mods/dungeon_loot/loot.lua new file mode 100644 index 0000000..3fe0bff --- /dev/null +++ b/mods/dungeon_loot/loot.lua @@ -0,0 +1,62 @@ +dungeon_loot.registered_loot = { + -- buckets + {name = "bucket:bucket_empty", chance = 0.55}, + -- water in deserts or above ground, lava otherwise + {name = "bucket:bucket_water", chance = 0.45, types = {"sandstone", "desert"}}, + {name = "bucket:bucket_water", chance = 0.45, y = {0, 32768}, types = {"normal"}}, + {name = "bucket:bucket_lava", chance = 0.45, y = {-32768, -1}, types = {"normal"}}, + + -- various items + {name = "default:stick", chance = 0.6, count = {3, 6}}, + {name = "default:flint", chance = 0.4, count = {1, 3}}, + {name = "vessels:glass_fragments", chance = 0.35, count = {1, 4}}, + {name = "carts:rail", chance = 0.35, count = {1, 6}}, + + -- farming / consumable + {name = "farming:string", chance = 0.5, count = {1, 8}}, + {name = "farming:wheat", chance = 0.5, count = {2, 5}}, + {name = "default:apple", chance = 0.4, count = {1, 4}}, + {name = "farming:seed_cotton", chance = 0.4, count = {1, 4}, types = {"normal"}}, + {name = "default:cactus", chance = 0.4, count = {1, 4}, types = {"sandstone", "desert"}}, + + -- minerals + {name = "default:coal_lump", chance = 0.9, count = {1, 12}}, + {name = "default:gold_ingot", chance = 0.5}, + {name = "default:steel_ingot", chance = 0.4, count = {1, 6}}, + {name = "default:mese_crystal", chance = 0.1, count = {2, 3}}, + + -- tools + {name = "default:sword_wood", chance = 0.6}, + {name = "default:pick_stone", chance = 0.3}, + {name = "default:axe_diamond", chance = 0.05}, + + -- natural materials + {name = "default:sand", chance = 0.8, count = {4, 32}, y = {-64, 32768}, types = {"normal"}}, + {name = "default:desert_sand", chance = 0.8, count = {4, 32}, y = {-64, 32768}, types = {"sandstone"}}, + {name = "default:desert_cobble", chance = 0.8, count = {4, 32}, types = {"desert"}}, + {name = "default:dirt", chance = 0.6, count = {2, 16}, y = {-64, 32768}}, + {name = "default:obsidian", chance = 0.25, count = {1, 3}, y = {-32768, -512}}, + {name = "default:mese", chance = 0.15, y = {-32768, -512}}, +} + +function dungeon_loot.register(t) + if t.name ~= nil then + t = {t} -- single entry + end + for _, loot in ipairs(t) do + table.insert(dungeon_loot.registered_loot, loot) + end +end + +function dungeon_loot._internal_get_loot(pos_y, dungeontype) + -- filter by y pos and type + local ret = {} + for _, l in ipairs(dungeon_loot.registered_loot) do + if l.y == nil or (pos_y >= l.y[1] and pos_y <= l.y[2]) then + if l.types == nil or table.indexof(l.types, dungeontype) ~= -1 then + table.insert(ret, l) + end + end + end + return ret +end diff --git a/mods/dungeon_loot/mapgen.lua b/mods/dungeon_loot/mapgen.lua new file mode 100644 index 0000000..366d4ce --- /dev/null +++ b/mods/dungeon_loot/mapgen.lua @@ -0,0 +1,170 @@ +minetest.set_gen_notify({dungeon = true, temple = true}) + +local function noise3d_integer(noise, pos) + return math.abs(math.floor(noise:get_3d(pos) * 0x7fffffff)) +end + +local function random_sample(rand, list, count) + local ret = {} + for n = 1, count do + local idx = rand:next(1, #list) + table.insert(ret, list[idx]) + table.remove(list, idx) + end + return ret +end + +local function find_walls(cpos) + local wall = minetest.registered_aliases["mapgen_cobble"] + local wall_alt = minetest.registered_aliases["mapgen_mossycobble"] + local wall_ss = minetest.registered_aliases["mapgen_sandstonebrick"] + local wall_ds = minetest.registered_aliases["mapgen_desert_stone"] + local is_wall = function(node) + return table.indexof({wall, wall_alt, wall_ss, wall_ds}, node.name) ~= -1 + end + + local dirs = {{x=1, z=0}, {x=-1, z=0}, {x=0, z=1}, {x=0, z=-1}} + local get_node = minetest.get_node + + local ret = {} + local mindist = {x=0, z=0} + local min = function(a, b) return a ~= 0 and math.min(a, b) or b end + local wallnode + for _, dir in ipairs(dirs) do + for i = 1, 9 do -- 9 = max room size / 2 + local pos = vector.add(cpos, {x=dir.x*i, y=0, z=dir.z*i}) + + -- continue in that direction until we find a wall-like node + local node = get_node(pos) + if is_wall(node) then + local front_below = vector.subtract(pos, {x=dir.x, y=1, z=dir.z}) + local above = vector.add(pos, {x=0, y=1, z=0}) + + -- check that it: + --- is at least 2 nodes high (not a staircase) + --- has a floor + if is_wall(get_node(front_below)) and is_wall(get_node(above)) then + table.insert(ret, {pos = pos, facing = {x=-dir.x, y=0, z=-dir.z}}) + if dir.z == 0 then + mindist.x = min(mindist.x, i-1) + else + mindist.z = min(mindist.z, i-1) + end + wallnode = node.name + end + -- abort even if it wasn't a wall cause something is in the way + break + end + end + end + + local mapping = { + [wall_ss] = "sandstone", + [wall_ds] = "desert" + } + return { + walls = ret, + size = {x=mindist.x*2, z=mindist.z*2}, + type = mapping[wallnode] or "normal" + } +end + +local function populate_chest(pos, rand, dungeontype) + --minetest.chat_send_all("chest placed at " .. minetest.pos_to_string(pos) .. " [" .. dungeontype .. "]") + --minetest.add_node(vector.add(pos, {x=0, y=1, z=0}), {name="default:torch", param2=1}) + + local item_list = dungeon_loot._internal_get_loot(pos.y, dungeontype) + -- take random (partial) sample of all possible items + assert(#item_list >= dungeon_loot.STACKS_PER_CHEST_MAX) + item_list = random_sample(rand, item_list, dungeon_loot.STACKS_PER_CHEST_MAX) + + -- apply chances / randomized amounts and collect resulting items + local items = {} + for _, loot in ipairs(item_list) do + if rand:next(0, 1000) / 1000 <= loot.chance then + local itemdef = minetest.registered_items[loot.name] + local amount = 1 + if loot.count ~= nil then + amount = rand:next(loot.count[1], loot.count[2]) + end + + if itemdef then + if itemdef.tool_capabilities then + for n = 1, amount do + local wear = rand:next(0.20 * 65535, 0.75 * 65535) -- 20% to 75% wear + table.insert(items, ItemStack({name = loot.name, wear = wear})) + end + elseif itemdef.stack_max == 1 then + -- not stackable, add separately + for n = 1, amount do + table.insert(items, loot.name) + end + else + table.insert(items, ItemStack({name = loot.name, count = amount})) + end + end + end + end + + -- place items at random places in chest + local inv = minetest.get_meta(pos):get_inventory() + local listsz = inv:get_size("main") + assert(listsz >= #items) + for _, item in ipairs(items) do + local index = rand:next(1, listsz) + if inv:get_stack("main", index):is_empty() then + inv:set_stack("main", index, item) + else + inv:add_item("main", item) -- space occupied, just put it anywhere + end + end +end + + +minetest.register_on_generated(function(minp, maxp, blockseed) + local gennotify = minetest.get_mapgen_object("gennotify") + local poslist = gennotify["dungeon"] or {} + for _, entry in ipairs(gennotify["temple"] or {}) do + table.insert(poslist, entry) + end + if #poslist == 0 then return end + + local noise = minetest.get_perlin(10115, 4, 0.5, 1) + local rand = PcgRandom(noise3d_integer(noise, poslist[1])) + + local candidates = {} + -- process at most 8 rooms to keep runtime of this predictable + local num_process = math.min(#poslist, 8) + for i = 1, num_process do + local room = find_walls(poslist[i]) + -- skip small rooms and everything that doesn't at least have 3 walls + if math.min(room.size.x, room.size.z) >= 4 and #room.walls >= 3 then + table.insert(candidates, room) + end + end + + local num_chests = rand:next(dungeon_loot.CHESTS_MIN, dungeon_loot.CHESTS_MAX) + num_chests = math.min(#candidates, num_chests) + local rooms = random_sample(rand, candidates, num_chests) + + for _, room in ipairs(rooms) do + -- choose place somewhere in front of any of the walls + local wall = room.walls[rand:next(1, #room.walls)] + local v, vi -- vector / axis that runs alongside the wall + if wall.facing.x ~= 0 then + v, vi = {x=0, y=0, z=1}, "z" + else + v, vi = {x=1, y=0, z=0}, "x" + end + local chestpos = vector.add(wall.pos, wall.facing) + local off = rand:next(-room.size[vi]/2 + 1, room.size[vi]/2 - 1) + chestpos = vector.add(chestpos, vector.multiply(v, off)) + + if minetest.get_node(chestpos).name == "air" then + -- make it face inwards to the room + local facedir = minetest.dir_to_facedir(vector.multiply(wall.facing, -1)) + minetest.add_node(chestpos, {name = "default:chest", param2 = facedir}) + populate_chest(chestpos, PcgRandom(noise3d_integer(noise, chestpos)), room.type) + end + end +end) diff --git a/mods/dye/init.lua b/mods/dye/init.lua index 8028457..42f59cf 100644 --- a/mods/dye/init.lua +++ b/mods/dye/init.lua @@ -1,9 +1,4 @@ --- Other mods can use these for looping through available colors - dye = {} -dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"} -dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", - "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"} -- Make dye names and descriptions available globally @@ -25,55 +20,48 @@ dye.dyes = { {"pink", "Pink"}, } --- This collection of colors is partly a historic thing, partly something else - -local dyes = { - {"white", "White dye", {dye=1, basecolor_white=1, excolor_white=1, unicolor_white=1}}, - {"grey", "Grey dye", {dye=1, basecolor_grey=1, excolor_grey=1, unicolor_grey=1}}, - {"dark_grey", "Dark grey dye", {dye=1, basecolor_grey=1, excolor_darkgrey=1, unicolor_darkgrey=1}}, - {"black", "Black dye", {dye=1, basecolor_black=1, excolor_black=1, unicolor_black=1}}, - {"violet", "Violet dye", {dye=1, basecolor_magenta=1, excolor_violet=1, unicolor_violet=1}}, - {"blue", "Blue dye", {dye=1, basecolor_blue=1, excolor_blue=1, unicolor_blue=1}}, - {"cyan", "Cyan dye", {dye=1, basecolor_cyan=1, excolor_cyan=1, unicolor_cyan=1}}, - {"dark_green", "Dark green dye", {dye=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}}, - {"green", "Green dye", {dye=1, basecolor_green=1, excolor_green=1, unicolor_green=1}}, - {"yellow", "Yellow dye", {dye=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}}, - {"brown", "Brown dye", {dye=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1}}, - {"orange", "Orange dye", {dye=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}}, - {"red", "Red dye", {dye=1, basecolor_red=1, excolor_red=1, unicolor_red=1}}, - {"magenta", "Magenta dye", {dye=1, basecolor_magenta=1, excolor_red_violet=1, unicolor_red_violet=1}}, - {"pink", "Pink dye", {dye=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}}, -} - -- Define items -for _, row in ipairs(dyes) do +for _, row in ipairs(dye.dyes) do local name = row[1] local description = row[2] - local groups = row[3] - local item_name = "dye:" .. name - local item_image = "dye_" .. name .. ".png" - minetest.register_craftitem(item_name, { - inventory_image = item_image, - description = description, + local groups = {dye = 1} + groups["color_" .. name] = 1 + + minetest.register_craftitem("dye:" .. name, { + inventory_image = "dye_" .. name .. ".png", + description = description .. " Dye", groups = groups }) + minetest.register_craft({ - type = "shapeless", - output = item_name .. " 4", - recipe = {"group:flower,color_" .. name}, + output = "dye:" .. name .. " 4", + recipe = { + {"group:flower,color_" .. name} + }, }) end --- Manually add coal->black dye +-- Manually add coal -> black dye minetest.register_craft({ - type = "shapeless", output = "dye:black 4", - recipe = {"group:coal"}, + recipe = { + {"group:coal"} + }, +}) + +-- Manually add blueberries->violet dye + +minetest.register_craft({ + output = "dye:violet 2", + recipe = { + {"default:blueberries"} + }, }) -- Mix recipes + local dye_recipes = { -- src1, src2, dst -- RYB mixes diff --git a/mods/farming/README.txt b/mods/farming/README.txt index 3ccd8c3..d46748d 100644 --- a/mods/farming/README.txt +++ b/mods/farming/README.txt @@ -35,3 +35,6 @@ Created by Gambit (CC BY 3.0): farming_flour.png farming_cotton_seed.png farming_wheat_seed.png + +Created by Napiophelios (CC BY-SA 3.0): + farming_cotton.png diff --git a/mods/farming/api.lua b/mods/farming/api.lua index 1c63ee3..4a7b93d 100644 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -83,13 +83,6 @@ farming.register_hoe = function(name, def) if def.inventory_image == nil then def.inventory_image = "unknown_item.png" end - if def.recipe == nil then - def.recipe = { - {"air","air",""}, - {"","group:stick",""}, - {"","group:stick",""} - } - end if def.max_uses == nil then def.max_uses = 30 end @@ -104,18 +97,18 @@ farming.register_hoe = function(name, def) sound = {breaks = "default_tool_breaks"}, }) -- Register its recipe - if def.material == nil then + if def.recipe then minetest.register_craft({ output = name:sub(2), recipe = def.recipe }) - else + elseif def.material then minetest.register_craft({ output = name:sub(2), recipe = { - {def.material, def.material, ""}, - {"", "group:stick", ""}, - {"", "group:stick", ""} + {def.material, def.material}, + {"", "group:stick"}, + {"", "group:stick"} } }) end @@ -330,7 +323,7 @@ farming.register_plant = function(name, def) minetest.register_craftitem(":" .. mname .. ":" .. pname, { description = pname:gsub("^%l", string.upper), inventory_image = mname .. "_" .. pname .. ".png", - groups = {flammable = 2}, + groups = def.groups or {flammable = 2}, }) -- Register growing steps diff --git a/mods/farming/hoes.lua b/mods/farming/hoes.lua index 5aae390..d6a6565 100644 --- a/mods/farming/hoes.lua +++ b/mods/farming/hoes.lua @@ -16,27 +16,32 @@ farming.register_hoe(":farming:hoe_stone", { farming.register_hoe(":farming:hoe_steel", { description = "Steel Hoe", inventory_image = "farming_tool_steelhoe.png", - max_uses = 200, + max_uses = 500, material = "default:steel_ingot" }) +-- The following are deprecated by removing the 'material' field to prevent +-- crafting and removing from creative inventory, to cause them to eventually +-- disappear from worlds. The registrations should be removed in a future +-- release. + farming.register_hoe(":farming:hoe_bronze", { description = "Bronze Hoe", inventory_image = "farming_tool_bronzehoe.png", max_uses = 220, - material = "default:bronze_ingot" + groups = {not_in_creative_inventory = 1}, }) farming.register_hoe(":farming:hoe_mese", { description = "Mese Hoe", inventory_image = "farming_tool_mesehoe.png", max_uses = 350, - material = "default:mese_crystal" + groups = {not_in_creative_inventory = 1}, }) farming.register_hoe(":farming:hoe_diamond", { description = "Diamond Hoe", inventory_image = "farming_tool_diamondhoe.png", max_uses = 500, - material = "default:diamond" + groups = {not_in_creative_inventory = 1}, }) diff --git a/mods/farming/init.lua b/mods/farming/init.lua index 97dc9b4..723201d 100644 --- a/mods/farming/init.lua +++ b/mods/farming/init.lua @@ -1,35 +1,41 @@ -- Global farming namespace + farming = {} farming.path = minetest.get_modpath("farming") + -- Load files + dofile(farming.path .. "/api.lua") dofile(farming.path .. "/nodes.lua") dofile(farming.path .. "/hoes.lua") + -- WHEAT + farming.register_plant("farming:wheat", { - description = "Wheat seed", + description = "Wheat Seed", paramtype2 = "meshoptions", inventory_image = "farming_wheat_seed.png", steps = 8, minlight = 13, maxlight = default.LIGHT_MAX, fertility = {"grassland"}, - groups = {flammable = 4}, + groups = {food_wheat = 1, flammable = 4}, place_param2 = 3, }) + minetest.register_craftitem("farming:flour", { description = "Flour", inventory_image = "farming_flour.png", - groups = {flammable = 1}, + groups = {food_flour = 1, flammable = 1}, }) minetest.register_craftitem("farming:bread", { description = "Bread", inventory_image = "farming_bread.png", on_use = minetest.item_eat(5), - groups = {flammable = 2}, + groups = {food_bread = 1, flammable = 2}, }) minetest.register_craft({ @@ -45,9 +51,11 @@ minetest.register_craft({ recipe = "farming:flour" }) + -- Cotton + farming.register_plant("farming:cotton", { - description = "Cotton seed", + description = "Cotton Seed", inventory_image = "farming_cotton_seed.png", steps = 8, minlight = 13, @@ -56,7 +64,11 @@ farming.register_plant("farming:cotton", { groups = {flammable = 4}, }) -minetest.register_alias("farming:string", "farming:cotton") +minetest.register_craftitem("farming:string", { + description = "String", + inventory_image = "farming_string.png", + groups = {flammable = 2}, +}) minetest.register_craft({ output = "wool:white", @@ -66,7 +78,17 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "farming:string 2", + recipe = { + {"farming:cotton"}, + {"farming:cotton"}, + } +}) + + -- Straw + minetest.register_craft({ output = "farming:straw 3", recipe = { @@ -83,7 +105,9 @@ minetest.register_craft({ } }) + -- Fuels + minetest.register_craft({ type = "fuel", recipe = "farming:straw", @@ -102,6 +126,12 @@ minetest.register_craft({ burntime = 1, }) +minetest.register_craft({ + type = "fuel", + recipe = "farming:string", + burntime = 1, +}) + minetest.register_craft({ type = "fuel", recipe = "farming:hoe_wood", diff --git a/mods/farming/nodes.lua b/mods/farming/nodes.lua index 1e746ec..cc9d1f6 100644 --- a/mods/farming/nodes.lua +++ b/mods/farming/nodes.lua @@ -30,6 +30,14 @@ minetest.override_item("default:dirt_with_rainforest_litter", { } }) +minetest.override_item("default:dirt_with_coniferous_litter", { + soil = { + base = "default:dirt_with_coniferous_litter", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + minetest.register_node("farming:soil", { description = "Soil", tiles = {"default_dirt.png^farming_soil.png", "default_dirt.png"}, @@ -105,7 +113,8 @@ stairs.register_stair_and_slab( {"farming_straw.png"}, "Straw Stair", "Straw Slab", - default.node_sound_leaves_defaults() + default.node_sound_leaves_defaults(), + true ) minetest.register_abm({ diff --git a/mods/farming/textures/farming_cotton.png b/mods/farming/textures/farming_cotton.png index e2bbfd7af486b64c658bcc7c6101b22ca95ab7e7..8aa50e4e38c75bce9f41cbee1ed6535adb7c7f9c 100644 GIT binary patch delta 300 zcmZ3+xQA(iWIZzj1A~Sxe=v}$3-AeX1=8t3ve^;Jxsl45aXJOD8W~B3SxJW3$;P?K z23cw5Ica9OX{LEVGTl5s-7G)DyfDZ1^&1d)`}Xa-ckkZ52ZIkF@cPrIj~_pN_yhu< zKY#x81q8kV!MAVUzkmPv^Jo3fU%!3>!5=XA`*+o}`G$v}klz+>jX%2nYTLpB_LCHif@qmYK$KgskD%6%UkXBkHe85=Ij(pH*q zEPLs#tw&tWOrCbnzN6FRS5fT$vL=W8uUAjqRXmYY-#P90WwT=$tg14XY;L}3WKDZo f75>OO@IgLvdpv4THu6{1-oD!M<@%x*6 delta 149 zcmdnPw2X0rWIY2ASj||l7f3Oc1o;IsFqBO`YXRiNd%8G=NJz3CT*%vCz`%0gc0H3= z0$0}(IjxBvLbC)`&9??=WmxfiH-p;^W`_%^416&UUo{BGzj08P<492YUYwu1&SAsB uDkis!0ec!E(s{TO4u~*3@n8pO`@nqP-XMGaG`@3>L0nH)KbLh*2~7ZC129Vf diff --git a/mods/farming/textures/farming_string.png b/mods/farming/textures/farming_string.png new file mode 100644 index 0000000000000000000000000000000000000000..e2bbfd7af486b64c658bcc7c6101b22ca95ab7e7 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAm`Z~Df*BafCZDwc^5Q*R977}| zSr0DcZ7^V9IdHq4Ni2b@Yl)oJL=T}^0;}d*gS0ZNc)pv#?FO^M1yu&Vn1`<#1mxd1 zsLOFAD19%^&t2!R;b0Y$+r@xA4H4-)+zAIn7@l~rgS35MzHe`kJ%8G{#~_}ktDnm{ Hr-UW|pV=_A literal 0 HcmV?d00001 diff --git a/mods/fire/README.txt b/mods/fire/README.txt index 099da1c..25ba26e 100644 --- a/mods/fire/README.txt +++ b/mods/fire/README.txt @@ -4,8 +4,8 @@ See license.txt for license information. Authors of source code ---------------------- -Originally by Perttu Ahola (celeron55) (LGPL 2.1) -Various Minetest developers and contributors (LGPL 2.1) +Originally by Perttu Ahola (celeron55) (LGPLv2.1+) +Various Minetest developers and contributors (LGPLv2.1+) Authors of media (textures and sounds) -------------------------------------- diff --git a/mods/fire/init.lua b/mods/fire/init.lua index f97636b..612e052 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -2,11 +2,38 @@ fire = {} +-- 'Enable fire' setting + +local fire_enabled = minetest.settings:get_bool("enable_fire") +if fire_enabled == nil then + -- enable_fire setting not specified, check for disable_fire + local fire_disabled = minetest.settings:get_bool("disable_fire") + if fire_disabled == nil then + -- Neither setting specified, check whether singleplayer + fire_enabled = minetest.is_singleplayer() + else + fire_enabled = not fire_disabled + end +end -- -- Items -- +-- Flood flame function + +local function flood_flame(pos, oldnode, newnode) + -- Play flame extinguish sound if liquid is not an 'igniter' + local nodedef = minetest.registered_items[newnode.name] + if not (nodedef and nodedef.groups and + nodedef.groups.igniter and nodedef.groups.igniter > 0) then + minetest.sound_play("fire_extinguish_flame", + {pos = pos, max_hear_distance = 16, gain = 0.15}) + end + -- Remove the flame + return false +end + -- Flame nodes minetest.register_node("fire:basic_flame", { @@ -28,22 +55,30 @@ minetest.register_node("fire:basic_flame", { walkable = false, buildable_to = true, sunlight_propagates = true, + floodable = true, damage_per_second = 4, groups = {igniter = 2, dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "", + on_timer = function(pos) local f = minetest.find_node_near(pos, 1, {"group:flammable"}) - if not f then + if not fire_enabled or not f then minetest.remove_node(pos) return end -- Restart timer return true end, - drop = "", on_construct = function(pos) - minetest.get_node_timer(pos):start(math.random(30, 60)) + if not fire_enabled then + minetest.remove_node(pos) + else + minetest.get_node_timer(pos):start(math.random(30, 60)) + end end, + + on_flood = flood_flame, }) minetest.register_node("fire:permanent_flame", { @@ -66,9 +101,12 @@ minetest.register_node("fire:permanent_flame", { walkable = false, buildable_to = true, sunlight_propagates = true, + floodable = true, damage_per_second = 4, groups = {igniter = 2, dig_immediate = 3}, drop = "", + + on_flood = flood_flame, }) @@ -169,7 +207,7 @@ if flame_sound then function fire.update_player_sound(player) local player_name = player:get_player_name() -- Search for flame nodes in radius around player - local ppos = player:getpos() + local ppos = player:get_pos() local areamin = vector.subtract(ppos, radius) local areamax = vector.add(ppos, radius) local fpos, num = minetest.find_nodes_in_area( @@ -271,51 +309,7 @@ end -- ABMs -- --- Extinguish all flames quickly with water, snow, ice - -minetest.register_abm({ - label = "Extinguish flame", - nodenames = {"fire:basic_flame", "fire:permanent_flame"}, - neighbors = {"group:puts_out_fire"}, - interval = 3, - chance = 1, - catch_up = false, - action = function(pos, node, active_object_count, active_object_count_wider) - minetest.remove_node(pos) - minetest.sound_play("fire_extinguish_flame", - {pos = pos, max_hear_distance = 16, gain = 0.15}) - end, -}) - - --- Enable the following ABMs according to 'enable fire' setting - -local fire_enabled = minetest.settings:get_bool("enable_fire") -if fire_enabled == nil then - -- enable_fire setting not specified, check for disable_fire - local fire_disabled = minetest.settings:get_bool("disable_fire") - if fire_disabled == nil then - -- Neither setting specified, check whether singleplayer - fire_enabled = minetest.is_singleplayer() - else - fire_enabled = not fire_disabled - end -end - -if not fire_enabled then - - -- Remove basic flames only if fire disabled - - minetest.register_abm({ - label = "Remove disabled fire", - nodenames = {"fire:basic_flame"}, - interval = 7, - chance = 1, - catch_up = false, - action = minetest.remove_node, - }) - -else -- Fire enabled +if fire_enabled then -- Ignite neighboring nodes, add basic flames @@ -327,10 +321,6 @@ else -- Fire enabled chance = 12, catch_up = false, action = function(pos, node, active_object_count, active_object_count_wider) - -- If there is water or stuff like that around node, don't ignite - if minetest.find_node_near(pos, 1, {"group:puts_out_fire"}) then - return - end local p = minetest.find_node_near(pos, 1, {"air"}) if p then minetest.set_node(p, {name = "fire:basic_flame"}) diff --git a/mods/fireflies/README.txt b/mods/fireflies/README.txt new file mode 100644 index 0000000..7382578 --- /dev/null +++ b/mods/fireflies/README.txt @@ -0,0 +1,22 @@ +Minetest Game mod: fireflies +============================ +Adds fireflies to the world on mapgen, which can then be caught in a net and placed in +bottles to provide light. + +Authors of source code +---------------------- +Shara RedCat (MIT) + +Authors of media (textures) +--------------------------- +Shara RedCat (CC BY-SA 3.0): + fireflies_firefly.png + fireflies_firefly_animated.png + fireflies_bugnet.png + fireflies_bottle.png + fireflies_bottle_animated.png + +fireflies_bugnet.png is modified from a texture by tenplus1 (CC0) + +fireflies_bottle.png and fireflies_bottle_animated.png are +modified from a texture by Vanessa Ezekowitz (CC BY-SA 3.0) \ No newline at end of file diff --git a/mods/fireflies/depends.txt b/mods/fireflies/depends.txt new file mode 100644 index 0000000..e0585b4 --- /dev/null +++ b/mods/fireflies/depends.txt @@ -0,0 +1,2 @@ +default +vessels \ No newline at end of file diff --git a/mods/fireflies/init.lua b/mods/fireflies/init.lua new file mode 100644 index 0000000..44d4a31 --- /dev/null +++ b/mods/fireflies/init.lua @@ -0,0 +1,285 @@ +-- firefly +minetest.register_node("fireflies:firefly", { + description = "Firefly", + drawtype = "plantlike", + tiles = {{ + name = "fireflies_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "fireflies_firefly.png", + wield_image = "fireflies_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "fireflies:firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "fireflies:hidden_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("fireflies:hidden_firefly", { + description = "Hidden Firefly", + drawtype = "airlike", + inventory_image = "fireflies_firefly.png", + wield_image = "fireflies_firefly.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "fireflies:hidden_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "fireflies:firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + + +-- bug net +minetest.register_tool("fireflies:bug_net", { + description = "Bug Net", + inventory_image = "fireflies_bugnet.png", + on_use = function(itemstack, player, pointed_thing) + if not pointed_thing or pointed_thing.type ~= "node" or + minetest.is_protected(pointed_thing.under, player:get_player_name()) then + return + end + local node_name = minetest.get_node(pointed_thing.under).name + local inv = player:get_inventory() + if minetest.get_item_group(node_name, "catchable") == 1 then + minetest.set_node(pointed_thing.under, {name = "air"}) + local stack = ItemStack(node_name.." 1") + local leftover = inv:add_item("main", stack) + if leftover:get_count() > 0 then + minetest.add_item(pointed_thing.under, node_name.." 1") + end + end + if not (creative and creative.is_enabled_for(player:get_player_name())) then + itemstack:add_wear(256) + return itemstack + end + end +}) + +minetest.register_craft( { + output = "fireflies:bug_net", + recipe = { + {"farming:string", "farming:string"}, + {"farming:string", "farming:string"}, + {"default:stick", ""} + } +}) + + +-- firefly in a bottle +minetest.register_node("fireflies:firefly_bottle", { + description = "Firefly in a Bottle", + inventory_image = "fireflies_bottle.png", + wield_image = "fireflies_bottle.png", + tiles = {{ + name = "fireflies_bottle_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + light_source = 9, + walkable = false, + groups = {dig_immediate = 3, attached_node = 1}, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + sounds = default.node_sound_glass_defaults(), + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local lower_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + if minetest.is_protected(pos, player:get_player_name()) or + minetest.get_node(lower_pos).name ~= "air" then + return + end + + local upper_pos = {x = pos.x, y = pos.y + 2, z = pos.z} + local firefly_pos + + if not minetest.is_protected(upper_pos, player:get_player_name()) and + minetest.get_node(upper_pos).name == "air" then + firefly_pos = upper_pos + elseif not minetest.is_protected(lower_pos, player:get_player_name()) then + firefly_pos = lower_pos + end + + if firefly_pos then + minetest.set_node(pos, {name = "vessels:glass_bottle"}) + minetest.set_node(firefly_pos, {name = "fireflies:firefly"}) + minetest.get_node_timer(firefly_pos):start(1) + end + end +}) + +minetest.register_craft( { + output = "fireflies:firefly_bottle", + recipe = { + {"fireflies:firefly"}, + {"vessels:glass_bottle"} + } +}) + + +-- register fireflies as decorations + +if minetest.get_mapgen_setting("mg_name") == "v6" then + + minetest.register_decoration({ + name = "fireflies:firefly_low", + deco_type = "simple", + place_on = "default:dirt_with_grass", + place_offset_y = 2, + sidelen = 80, + fill_ratio = 0.0002, + y_max = 31000, + y_min = 1, + decoration = "fireflies:hidden_firefly", + }) + + minetest.register_decoration({ + name = "fireflies:firefly_high", + deco_type = "simple", + place_on = "default:dirt_with_grass", + place_offset_y = 3, + sidelen = 80, + fill_ratio = 0.0002, + y_max = 31000, + y_min = 1, + decoration = "fireflies:hidden_firefly", + }) + +else + + minetest.register_decoration({ + name = "fireflies:firefly_low", + deco_type = "simple", + place_on = { + "default:dirt_with_grass", + "default:dirt_with_coniferous_litter", + "default:dirt_with_rainforest_litter", + "default:dirt" + }, + place_offset_y = 2, + sidelen = 80, + fill_ratio = 0.0005, + biomes = { + "deciduous_forest", + "coniferous_forest", + "rainforest", + "rainforest_swamp" + }, + y_max = 31000, + y_min = -1, + decoration = "fireflies:hidden_firefly", + }) + + minetest.register_decoration({ + name = "fireflies:firefly_high", + deco_type = "simple", + place_on = { + "default:dirt_with_grass", + "default:dirt_with_coniferous_litter", + "default:dirt_with_rainforest_litter", + "default:dirt" + }, + place_offset_y = 3, + sidelen = 80, + fill_ratio = 0.0005, + biomes = { + "deciduous_forest", + "coniferous_forest", + "rainforest", + "rainforest_swamp" + }, + y_max = 31000, + y_min = -1, + decoration = "fireflies:hidden_firefly", + }) + +end + + +-- get decoration IDs +local firefly_low = minetest.get_decoration_id("fireflies:firefly_low") +local firefly_high = minetest.get_decoration_id("fireflies:firefly_high") + +minetest.set_gen_notify({decoration = true}, {firefly_low, firefly_high}) + +-- start nodetimers +minetest.register_on_generated(function(minp, maxp, blockseed) + local gennotify = minetest.get_mapgen_object("gennotify") + local poslist = {} + + for _, pos in ipairs(gennotify["decoration#"..firefly_low] or {}) do + local firefly_low_pos = {x = pos.x, y = pos.y + 3, z = pos.z} + table.insert(poslist, firefly_low_pos) + end + for _, pos in ipairs(gennotify["decoration#"..firefly_high] or {}) do + local firefly_high_pos = {x = pos.x, y = pos.y + 4, z = pos.z} + table.insert(poslist, firefly_high_pos) + end + + if #poslist ~= 0 then + for i = 1, #poslist do + local pos = poslist[i] + minetest.get_node_timer(pos):start(1) + end + end +end) diff --git a/mods/fireflies/license.txt b/mods/fireflies/license.txt new file mode 100644 index 0000000..eebdad6 --- /dev/null +++ b/mods/fireflies/license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (c) 2018 Shara RedCat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2018 Shara RedCat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file diff --git a/mods/fireflies/textures/fireflies_bottle.png b/mods/fireflies/textures/fireflies_bottle.png new file mode 100644 index 0000000000000000000000000000000000000000..ecca0363096bddd994397af8de7a04d786f096e9 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnY1=1I;JlL}5?7kycZryr% z?97d=ThFZCdSYf{ZbxqH|Nm*Rr~8_KiWp0R{DK)Ap4~_Tax6Vv978y+Co2dQ_%vKN z)7Zo)5O&06MF^8}&q1DrGbJQ=6nMlm79Zf&;7Bvra6p33XGNE!kZU6gL#!?9`)lr> RHGqaNc)I$ztaD0e0sta1JbC~C literal 0 HcmV?d00001 diff --git a/mods/fireflies/textures/fireflies_bottle_animated.png b/mods/fireflies/textures/fireflies_bottle_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..96062b3c15c1cea67f971d7112eb158f84797d20 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0zjO=!VDyz{eM3hNT~$)gt!9fEql(MzkGk+kt?@u zJw0~j#@4N8R&PCV>H5Q&jkz7UvH$<4U7z%5E>Im~NswPKgTu2MX+Tc6r;B5V#`$Cg zp#r^z3uhdC83n?gD6I%#67D(3vrtk}f=7X88n1v`BXfYjnS_K!Lm7!cQDc>@Oq^1? z*-vSFkV|>z*m8cF<1@L49|inE-+B5zC|dnxV3=m5J)!f@?Kq$n44$rjF6*2UngC*! BOsW6? literal 0 HcmV?d00001 diff --git a/mods/fireflies/textures/fireflies_bugnet.png b/mods/fireflies/textures/fireflies_bugnet.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec3d33bae24643cd67bb0fc5b388c055ef831c9 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ1=5F4-Q&m*5zIlez7I)Rojc)I$ztaD0e0sw<|LUjND literal 0 HcmV?d00001 diff --git a/mods/fireflies/textures/fireflies_firefly.png b/mods/fireflies/textures/fireflies_firefly.png new file mode 100644 index 0000000000000000000000000000000000000000..c0866894ca0be53a3715199b484589beaa1a70f4 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-u0Z<#D~A8y`tG0QJa~8A zb0D9wB*-tA!Qt7BG$2RV)5S4_<9f0Jn}H<*=P~9Z8mtWJJd7-wW%D-yr5QY3{an^L HB{Ts50`?tG literal 0 HcmV?d00001 diff --git a/mods/fireflies/textures/fireflies_firefly_animated.png b/mods/fireflies/textures/fireflies_firefly_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..e6932e37c69eb1f2ec57ccdeceb2a8f80fba8d0f GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^0zllr#0(_se=}|bQak}ZA+A9B|0{<7-}>&KccM2A0Q+Y?BVGSm=Ckg`;2sgRmKgq<`D` QLZC7RPgg&ebxsLQ0FcHbBLDyZ literal 0 HcmV?d00001 diff --git a/mods/flowers/README.txt b/mods/flowers/README.txt index 2a5e4de..4b3149c 100644 --- a/mods/flowers/README.txt +++ b/mods/flowers/README.txt @@ -11,7 +11,6 @@ Authors of media (textures) --------------------------- RHRhino (CC BY-SA 3.0): flowers_dandelion_white.png - flowers_dandelion_yellow.png flowers_geranium.png flowers_rose.png flowers_tulip.png @@ -23,4 +22,9 @@ Gambit (CC BY-SA 3.0): flowers_waterlily.png yyt16384 (CC BY-SA 3.0): - flowers_waterlily_bottom.png, derived from Gambit's texture + flowers_waterlily_bottom.png -- Derived from Gambit's texture + +paramat (CC BY-SA 3.0): + flowers_dandelion_yellow.png -- Derived from RHRhino's texture + flowers_tulip_black.png -- Derived from RHRhino's texture + flowers_chrysanthemum_green.png diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index 1f55a3f..3ad4bf6 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -59,7 +59,7 @@ end flowers.datas = { { "rose", - "Rose", + "Red Rose", {-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16}, {color_red = 1, flammable = 1} }, @@ -72,9 +72,15 @@ flowers.datas = { { "dandelion_yellow", "Yellow Dandelion", - {-2 / 16, -0.5, -2 / 16, 2 / 16, 4 / 16, 2 / 16}, + {-4 / 16, -0.5, -4 / 16, 4 / 16, -2 / 16, 4 / 16}, {color_yellow = 1, flammable = 1} }, + { + "chrysanthemum_green", + "Green Chrysanthemum", + {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16}, + {color_green = 1, flammable = 1} + }, { "geranium", "Blue Geranium", @@ -89,10 +95,16 @@ flowers.datas = { }, { "dandelion_white", - "White dandelion", + "White Dandelion", {-5 / 16, -0.5, -5 / 16, 5 / 16, -2 / 16, 5 / 16}, {color_white = 1, flammable = 1} }, + { + "tulip_black", + "Black Tulip", + {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16}, + {color_black = 1, flammable = 1} + }, } for _,item in pairs(flowers.datas) do @@ -127,12 +139,9 @@ function flowers.flower_spread(pos, node) local pos0 = vector.subtract(pos, 4) local pos1 = vector.add(pos, 4) - -- Maximum flower density created by mapgen is 13 per 9x9 area. - -- The limit of 7 below was tuned by in-game testing to result in a maximum - -- flower density by ABM spread of 13 per 9x9 area. - -- Warning: Setting this limit theoretically without in-game testing - -- results in a maximum flower density by ABM spread that is far too high. - if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 7 then + -- Testing shows that a threshold of 3 results in an appropriate maximum + -- density of approximately 7 flora per 9x9 area. + if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 3 then return end @@ -142,11 +151,14 @@ function flowers.flower_spread(pos, node) if num_soils >= 1 then for si = 1, math.min(3, num_soils) do local soil = soils[math.random(num_soils)] + local soil_name = minetest.get_node(soil).name local soil_above = {x = soil.x, y = soil.y + 1, z = soil.z} light = minetest.get_node_light(soil_above) if light and light >= 13 and + -- Only spread to same surface node + soil_name == under.name and -- Desert sand is in the soil group - minetest.get_node(soil).name ~= "default:desert_sand" then + soil_name ~= "default:desert_sand" then minetest.set_node(soil_above, {name = node.name}) end end @@ -197,7 +209,7 @@ minetest.register_node("flowers:mushroom_brown", { sunlight_propagates = true, walkable = false, buildable_to = true, - groups = {snappy = 3, attached_node = 1, flammable = 1}, + groups = {food_mushroom = 1, snappy = 3, attached_node = 1, flammable = 1}, sounds = default.node_sound_leaves_defaults(), on_use = minetest.item_eat(1), selection_box = { @@ -265,7 +277,6 @@ minetest.register_node("flowers:waterlily", { liquids_pointable = true, walkable = false, buildable_to = true, - sunlight_propagates = true, floodable = true, groups = {snappy = 3, flower = 1, flammable = 1}, sounds = default.node_sound_leaves_defaults(), diff --git a/mods/flowers/license.txt b/mods/flowers/license.txt index d301162..419ebe5 100644 --- a/mods/flowers/license.txt +++ b/mods/flowers/license.txt @@ -32,6 +32,7 @@ Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) Copyright (C) 2014-2016 RHRhino Copyright (C) 2015-2016 Gambit Copyright (C) 2016 yyt16384 +Copyright (C) 2017 paramat You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/flowers/mapgen.lua b/mods/flowers/mapgen.lua index 2b96090..ad759c2 100644 --- a/mods/flowers/mapgen.lua +++ b/mods/flowers/mapgen.lua @@ -2,8 +2,9 @@ -- Mgv6 -- -local function register_mgv6_flower(name) +local function register_mgv6_flower(flower_name) minetest.register_decoration({ + name = "flowers:"..flower_name, deco_type = "simple", place_on = {"default:dirt_with_grass"}, sidelen = 16, @@ -15,14 +16,15 @@ local function register_mgv6_flower(name) octaves = 3, persist = 0.6 }, - y_min = 1, y_max = 30, - decoration = "flowers:"..name, + y_min = 1, + decoration = "flowers:"..flower_name, }) end -local function register_mgv6_mushroom(name) +local function register_mgv6_mushroom(mushroom_name) minetest.register_decoration({ + name = "flowers:"..mushroom_name, deco_type = "simple", place_on = {"default:dirt_with_grass"}, sidelen = 16, @@ -34,9 +36,9 @@ local function register_mgv6_mushroom(name) octaves = 3, persist = 0.6 }, - y_min = 1, y_max = 30, - decoration = "flowers:"..name, + y_min = 1, + decoration = "flowers:"..mushroom_name, spawn_by = "default:tree", num_spawn_by = 1, }) @@ -44,7 +46,8 @@ end local function register_mgv6_waterlily() minetest.register_decoration({ - deco_type = "schematic", + name = "flowers:waterlily", + deco_type = "simple", place_on = {"default:dirt"}, sidelen = 16, noise_params = { @@ -55,10 +58,12 @@ local function register_mgv6_waterlily() octaves = 3, persist = 0.7 }, - y_min = 0, y_max = 0, - schematic = minetest.get_modpath("flowers").."/schematics/waterlily.mts", - rotation = "random", + y_min = 0, + decoration = "flowers:waterlily", + param2 = 0, + param2_max = 3, + place_offset_y = 1, }) end @@ -81,31 +86,32 @@ end -- All other biome API mapgens -- -local function register_flower(seed, name) +local function register_flower(seed, flower_name) minetest.register_decoration({ + name = "flowers:"..flower_name, deco_type = "simple", place_on = {"default:dirt_with_grass"}, sidelen = 16, noise_params = { - offset = -0.015, - scale = 0.025, + offset = -0.02, + scale = 0.04, spread = {x = 200, y = 200, z = 200}, seed = seed, octaves = 3, persist = 0.6 }, - biomes = {"grassland", "deciduous_forest", "coniferous_forest", - "floatland_grassland", "floatland_coniferous_forest"}, - y_min = 1, + biomes = {"grassland", "deciduous_forest", "floatland_grassland"}, y_max = 31000, - decoration = "flowers:"..name, + y_min = 1, + decoration = "flowers:"..flower_name, }) end -local function register_mushroom(name) +local function register_mushroom(mushroom_name) minetest.register_decoration({ + name = "flowers:"..mushroom_name, deco_type = "simple", - place_on = {"default:dirt_with_grass"}, + place_on = {"default:dirt_with_grass", "default:dirt_with_coniferous_litter"}, sidelen = 16, noise_params = { offset = 0, @@ -117,15 +123,16 @@ local function register_mushroom(name) }, biomes = {"deciduous_forest", "coniferous_forest", "floatland_coniferous_forest"}, - y_min = 1, y_max = 31000, - decoration = "flowers:"..name, + y_min = 1, + decoration = "flowers:"..mushroom_name, }) end local function register_waterlily() minetest.register_decoration({ - deco_type = "schematic", + name = "default:waterlily", + deco_type = "simple", place_on = {"default:dirt"}, sidelen = 16, noise_params = { @@ -137,10 +144,12 @@ local function register_waterlily() persist = 0.7 }, biomes = {"rainforest_swamp", "savanna_shore", "deciduous_forest_shore"}, - y_min = 0, y_max = 0, - schematic = minetest.get_modpath("flowers") .. "/schematics/waterlily.mts", - rotation = "random", + y_min = 0, + decoration = "flowers:waterlily", + param2 = 0, + param2_max = 3, + place_offset_y = 1, }) end @@ -148,9 +157,11 @@ function flowers.register_decorations() register_flower(436, "rose") register_flower(19822, "tulip") register_flower(1220999, "dandelion_yellow") + register_flower(800081, "chrysanthemum_green") register_flower(36662, "geranium") register_flower(1133, "viola") register_flower(73133, "dandelion_white") + register_flower(42, "tulip_black") register_mushroom("mushroom_brown") register_mushroom("mushroom_red") diff --git a/mods/flowers/schematics/waterlily.mts b/mods/flowers/schematics/waterlily.mts deleted file mode 100644 index 69e1d8e0c76ea232c9e17f52b6d4dbcb30e378fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75 zcmeYb3HD`RVPIrnW?-zZuLn{*DXD3Rr8y;5DVaqj49tm{MGS&zIr-(OMa5R-i6yB; dIhi??6?2jk5)x7pew`0Ef8YQE1BWDI695=379ipu8NnS zqK}BIAFol6pk|=Caiok{gspjmuVtLJb+mItpFz|tw%FMsnX6eBJ!eEuBp~r}==kFqQ=Q1v5B2yO9RuIC#1^hDcma zPLMd`5W_T8|CqYM$pZ?y-2#F_i3t-PiBECt_`tAng~6QDXOA8@cHlr~4wo@Ev$Zh0 g{w4us?J0~5jeU$;bge#h0nK9YboFyt=akR{099E@-v9sr literal 0 HcmV?d00001 diff --git a/mods/flowers/textures/flowers_dandelion_yellow.png b/mods/flowers/textures/flowers_dandelion_yellow.png index ec11c1c80990a5e142f3cb9bc3d7da59b6bcce63..544f60c151aa0183c560c4650fb9466e6651e42d 100644 GIT binary patch delta 109 zcmZo=>|>k|q@36XKejpJU;x>6u^^l5h2YCd2FVdQ&MBb@0E&GgfdBvi delta 104 zcmeBTY-OCFlE@$66XMFi!0`VJgJ*)(|CtOS`BvP?jQfE?j3q&S!3+-1ZlnP@DxNNm zAsp9}6@)mr95URJoh_JsyBax{-Qa9K$dYc6U=VPHfuVC6lkD9m?x{fa44$rjF6*2U FngB?tA7cOj diff --git a/mods/flowers/textures/flowers_tulip_black.png b/mods/flowers/textures/flowers_tulip_black.png new file mode 100644 index 0000000000000000000000000000000000000000..1dd09f746caaf3baf52b57c6d262cb2bfe5fbaf6 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF3h)VWWl&_W7F5-fQq_&JG)s0e z&bIQX2@UDdjhShfu+SuVnOVwmv!Yei?FXj&JW_oJ)Wuj5{Oq QfqEG{UHx3vIVCg!00H$fAOHXW literal 0 HcmV?d00001 diff --git a/mods/game_commands/README.txt b/mods/game_commands/README.txt new file mode 100644 index 0000000..a451608 --- /dev/null +++ b/mods/game_commands/README.txt @@ -0,0 +1,7 @@ +Minetest Game mod: game_commands +================================ +See license.txt for license information. + +Authors of source code +---------------------- +rubenwardy (MIT) diff --git a/mods/killme/init.lua b/mods/game_commands/init.lua similarity index 96% rename from mods/killme/init.lua rename to mods/game_commands/init.lua index 9b67475..609c4a7 100644 --- a/mods/killme/init.lua +++ b/mods/game_commands/init.lua @@ -13,7 +13,8 @@ minetest.register_chatcommand("killme", { end end - -- There doesn't seem to be a way to get a default spawn pos from the lua API + -- There doesn't seem to be a way to get a default spawn pos + -- from the lua API return false, "No static_spawnpoint defined" end else diff --git a/mods/game_commands/license.txt b/mods/game_commands/license.txt new file mode 100644 index 0000000..fa85564 --- /dev/null +++ b/mods/game_commands/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2017-2018 rubenwardy + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/map/README.txt b/mods/map/README.txt new file mode 100644 index 0000000..c91e0d9 --- /dev/null +++ b/mods/map/README.txt @@ -0,0 +1,44 @@ +Minetest Game mod: map +====================== +See license.txt for license information. + +Authors of source code +---------------------- +paramat (MIT) + +Authors of media (textures) +--------------------------- +TumeniNodes (CC BY-SA 3.0): + map_mapping_kit.png (map) + +paramat (CC BY-SA 3.0): + map_mapping_kit.png (compass and pen) + +Crafting +-------- +map:mapping_kit + +default:glass G +default:paper P +default:stick S +default:steel_ingot I +group:wood W +dye:black D + +GPS +IPI +WPD + +Usage +----- +In survival mode, use of the minimap requires the mapping kit item in your +inventory. It can take up to 5 seconds for adding to or removal from inventory +to have an effect, however to instantly allow the use of the minimap 'use' +(leftclick) the item. +Minimap radar mode is always disallowed in survival mode. + +Minimap and minimap radar mode are automatically allowed in creative mode and +for any player with the 'creative' privilege. + +The 'map.update_hud_flags()' function is global so can be redefined by a mod for +alternative behaviour. diff --git a/mods/map/depends.txt b/mods/map/depends.txt new file mode 100644 index 0000000..4b15f6a --- /dev/null +++ b/mods/map/depends.txt @@ -0,0 +1,3 @@ +default +dye +creative? diff --git a/mods/map/init.lua b/mods/map/init.lua new file mode 100644 index 0000000..72b04c7 --- /dev/null +++ b/mods/map/init.lua @@ -0,0 +1,81 @@ +-- Mod global namespace + +map = {} + + +-- Cache creative mode setting + +local creative_mode_cache = minetest.settings:get_bool("creative_mode") + + +-- Update HUD flags +-- Global to allow overriding + +function map.update_hud_flags(player) + local creative_enabled = + (creative and creative.is_enabled_for(player:get_player_name())) or + creative_mode_cache + + local minimap_enabled = creative_enabled or + player:get_inventory():contains_item("main", "map:mapping_kit") + local radar_enabled = creative_enabled + + player:hud_set_flags({ + minimap = minimap_enabled, + minimap_radar = radar_enabled + }) +end + + +-- Set HUD flags 'on joinplayer' + +minetest.register_on_joinplayer(function(player) + map.update_hud_flags(player) +end) + + +-- Cyclic update of HUD flags + +local function cyclic_update() + for _, player in ipairs(minetest.get_connected_players()) do + map.update_hud_flags(player) + end + minetest.after(5.3, cyclic_update) +end + +minetest.after(5.3, cyclic_update) + + +-- Mapping kit item + +minetest.register_craftitem("map:mapping_kit", { + description = "Mapping Kit\nUse with 'Minimap' key", + inventory_image = "map_mapping_kit.png", + stack_max = 1, + groups = {flammable = 3}, + + on_use = function(itemstack, user, pointed_thing) + map.update_hud_flags(user) + end, +}) + + +-- Crafting + +minetest.register_craft({ + output = "map:mapping_kit", + recipe = { + {"default:glass", "default:paper", "default:stick"}, + {"default:steel_ingot", "default:paper", "default:steel_ingot"}, + {"group:wood", "default:paper", "dye:black"}, + } +}) + + +-- Fuel + +minetest.register_craft({ + type = "fuel", + recipe = "map:mapping_kit", + burntime = 5, +}) diff --git a/mods/map/license.txt b/mods/map/license.txt new file mode 100644 index 0000000..a89f59c --- /dev/null +++ b/mods/map/license.txt @@ -0,0 +1,60 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2017 paramat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2017 TumeniNodes +Copyright (C) 2017 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/map/textures/map_mapping_kit.png b/mods/map/textures/map_mapping_kit.png new file mode 100644 index 0000000000000000000000000000000000000000..015b878ad5e89994fb63b90c058a7d9e6d0ddb27 GIT binary patch literal 763 zcmVj3g=svTWG;tmJ)vkXqHZ~(ZaAlJHKlMmrEoo?aXzPV zKBaR(rF255bUvtbL8){o@UFQY{#E&&7f}2p=r&bZ_}o3)TV6IrftrueATOV)2w^at$on0fY+^d z*{yQet$5h3cG9nc(yxQju!GXDgVV5r+pu@jv4z~Rchs_m)U$-$vUb?EhTgV(+_r+* zw}#)ifZ(`+*}0D2xrX7ng5bM^;Jb?4yprO)gWBy1l%b4rTmg>x!?$Dg?(3|ejo$t|}@6w*t)z$ISp7GS5 z@YJI5)ui&*qw?3J^Vp{J*r)T^sPx&W-{0Tv?CAgh|CF1oxc~qF0d!JMQvg8b*k%9# z0OUzTK~xyiV_;x#E@gm%a!W9!6&jS7Q&v%!92BDI4HDqt=HwNXm6PJLAtr=KY7}%Iu8I|%X>*}ksBV8F-m>85;r?7J5ws&{6 zR^@tu1lSl^r^y%hPMpxwSnLN@p`;|wRnR+Wa&L2i4@dwA%-u5D`ujR+GCZIHPQm%L zO)U*2;f@SbJ0U9k6Vi*aqI_)_rh*+Nq^N6VVe4S1E+Gu&+oz?(#l}QOhs9?ag9QYY t#WYM^-0id_6+{fcUXg}*pHGc}0RU;tGDu-GPyYY_002ovPDHLkV1oS_i(CKz literal 0 HcmV?d00001 diff --git a/mods/player_api/README.txt b/mods/player_api/README.txt new file mode 100644 index 0000000..22d040c --- /dev/null +++ b/mods/player_api/README.txt @@ -0,0 +1,32 @@ +Minetest Game mod: player_api +============================= +See license.txt for license information. + +Provides an API to allow multiple mods to set player models and textures. +Also sets the default model, texture, and player flags. + +Authors of source code +---------------------- +Originally by celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest developers and contributors (LGPLv2.1+) + +Authors of media (textures, models and sounds) +---------------------------------------------- +stujones11 (CC BY-SA 3.0): + character.b3d + character.blend -- Both derived from a model by MirceaKitsune (CC BY-SA 3.0) + +Jordach (CC BY-SA 3.0): + character.png + +paramat (CC BY-SA 3.0): + gui_hotbar.png + gui_hotbar_selected.png + +celeron55, Perttu Ahola (CC BY-SA 3.0): + player.png + player_back.png + +sonictechtonic (CC BY 3.0): +https://www.freesound.org/people/sonictechtonic/sounds/241872/ + player_damage.ogg diff --git a/mods/default/player.lua b/mods/player_api/api.lua similarity index 66% rename from mods/default/player.lua rename to mods/player_api/api.lua index 0a2078d..e309b08 100644 --- a/mods/default/player.lua +++ b/mods/player_api/api.lua @@ -1,42 +1,29 @@ -- Minetest 0.4 mod: player -- See README.txt for licensing and other information. +player_api = {} + -- Player animation blending -- Note: This is currently broken due to a bug in Irrlicht, leave at 0 local animation_blend = 0 -default.registered_player_models = { } +player_api.registered_models = { } -- Local for speed. -local models = default.registered_player_models +local models = player_api.registered_models -function default.player_register_model(name, def) +function player_api.register_model(name, def) models[name] = def end --- Default player appearance -default.player_register_model("character.b3d", { - animation_speed = 30, - textures = {"character.png", }, - animations = { - -- Standard animations. - stand = { x= 0, y= 79, }, - lay = { x=162, y=166, }, - walk = { x=168, y=187, }, - mine = { x=189, y=198, }, - walk_mine = { x=200, y=219, }, - sit = { x= 81, y=160, }, - }, -}) - -- Player stats and animations local player_model = {} local player_textures = {} local player_anim = {} local player_sneak = {} -default.player_attached = {} +player_api.player_attached = {} -function default.player_get_animation(player) +function player_api.get_animation(player) local name = player:get_player_name() return { model = player_model[name], @@ -46,7 +33,7 @@ function default.player_get_animation(player) end -- Called when a player's appearance needs to be updated -function default.player_set_model(player, model_name) +function player_api.set_model(player, model_name) local name = player:get_player_name() local model = models[model_name] if model then @@ -57,25 +44,33 @@ function default.player_set_model(player, model_name) mesh = model_name, textures = player_textures[name] or model.textures, visual = "mesh", - visual_size = model.visual_size or {x=1, y=1}, + visual_size = model.visual_size or {x = 1, y = 1}, + collisionbox = model.collisionbox or {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}, + stepheight = model.stepheight or 0.6, + eye_height = model.eye_height or 1.47, }) - default.player_set_animation(player, "stand") + player_api.set_animation(player, "stand") else player:set_properties({ - textures = { "player.png", "player_back.png", }, + textures = {"player.png", "player_back.png"}, visual = "upright_sprite", + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.75, 0.3}, + stepheight = 0.6, + eye_height = 1.625, }) end player_model[name] = model_name end -function default.player_set_textures(player, textures) +function player_api.set_textures(player, textures) local name = player:get_player_name() - player_textures[name] = textures - player:set_properties({textures = textures,}) + local model = models[player_model[name]] + local model_textures = model and model.textures or nil + player_textures[name] = textures or model_textures + player:set_properties({textures = textures or model_textures,}) end -function default.player_set_animation(player, anim_name, speed) +function player_api.set_animation(player, anim_name, speed) local name = player:get_player_name() if player_anim[name] == anim_name then return @@ -89,16 +84,6 @@ function default.player_set_animation(player, anim_name, speed) player:set_animation(anim, speed or model.animation_speed, animation_blend) end --- Update appearance when the player joins -minetest.register_on_joinplayer(function(player) - default.player_attached[player:get_player_name()] = false - default.player_set_model(player, "character.b3d") - player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) - - player:hud_set_hotbar_image("gui_hotbar.png") - player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") -end) - minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() player_model[name] = nil @@ -107,8 +92,8 @@ minetest.register_on_leaveplayer(function(player) end) -- Localize for better performance. -local player_set_animation = default.player_set_animation -local player_attached = default.player_attached +local player_set_animation = player_api.set_animation +local player_attached = player_api.player_attached -- Check each player and apply animations minetest.register_globalstep(function(dtime) diff --git a/mods/player_api/init.lua b/mods/player_api/init.lua new file mode 100644 index 0000000..7a1f353 --- /dev/null +++ b/mods/player_api/init.lua @@ -0,0 +1,34 @@ +dofile(minetest.get_modpath("player_api") .. "/api.lua") + +-- Default player appearance +player_api.register_model("character.b3d", { + animation_speed = 30, + textures = {"character.png", }, + animations = { + -- Standard animations. + stand = {x = 0, y = 79}, + lay = {x = 162, y = 166}, + walk = {x = 168, y = 187}, + mine = {x = 189, y = 198}, + walk_mine = {x = 200, y = 219}, + sit = {x = 81, y = 160}, + }, + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}, + stepheight = 0.6, + eye_height = 1.47, +}) + +-- Update appearance when the player joins +minetest.register_on_joinplayer(function(player) + player_api.player_attached[player:get_player_name()] = false + player_api.set_model(player, "character.b3d") + player:set_local_animation( + {x = 0, y = 79}, + {x = 168, y = 187}, + {x = 189, y = 198}, + {x = 200, y = 219}, + 30 + ) + player:hud_set_hotbar_image("gui_hotbar.png") + player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") +end) diff --git a/mods/player_api/license.txt b/mods/player_api/license.txt new file mode 100644 index 0000000..69bb2f8 --- /dev/null +++ b/mods/player_api/license.txt @@ -0,0 +1,84 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2018 celeron55, Perttu Ahola +Copyright (C) 2011-2018 Various Minetest developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +See the GNU Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2011-2018 celeron55, Perttu Ahola +Copyright (C) 2012-2018 Jordach +Copyright (C) 2018 stujones11 +Copyright (C) 2018 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ + +------------------------------------ + +Attribution 3.0 Unported (CC BY 3.0) +Copyright (C) 2014-2018 sonictechtonic + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by/3.0/ + diff --git a/mods/player_api/models/character.b3d b/mods/player_api/models/character.b3d new file mode 100644 index 0000000000000000000000000000000000000000..b3b772a4108a04c96491d1e86599bd3e977abbdc GIT binary patch literal 73433 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 literal 0 HcmV?d00001 diff --git a/mods/player_api/models/character.blend b/mods/player_api/models/character.blend new file mode 100644 index 0000000000000000000000000000000000000000..652579c152ab3ce8c535ca3cfc507cf6537550ed GIT binary patch literal 698016 zcmeEv4PYHbwg2X$=~4?tL@fm|K!qZd0_CIf(IibuZ?UDNEl{+Yrpav+NOJRXlT!Ti zkpk*fkuO0CB2+%Ke*2_ARZLUb_uhR1iULwmv_26l`UIb-2uT0u?3~}-*}1znckhOp zTXx%<*|RghGc&()W_EUVcXrmi*=IG)UNm*}@h8t%M7s&gvIZ9aYVftoX@|B76Jx0QLsGz#T>*w5c@#v1F;XpJ`npr>;th6 z#6A%FK;th6#6A%FK;th6#6A%FK;th6#6B?Ue1J@1?czVQ#o?QShvigF{9toc^F8G6d){++-I-_3zr2*+d){+I{T@Pt zUp3g?%e9|hnzBE}cE9PS&+RJZ_x|^vHBj~h6t2K>ipFn`Z2z(S105i4|HJePar+PS zowA9D+kc>`;`Sf6|K;Qz_{Hac!yoqW{y%R2hP};eggxB;d}2V`=P+*nhCl4#_K(}Y zVeh#8Q!lWGZSnX&(4cYqkK6xp@(%ps^S|K_@%cZn??{HXig#rTR9T_w|aEdwTjd2kGVGqm_>kGz2m%07p_8+(Z9a>NEmggo z$A4_O<=QW9|8e_gpD4R+B-?ZtT|`ve{zrkggt6I3rY&>($K(Hy{k`csWp00Nxy!X* zeEtvV55!$L_y2MG4{7hX{gcO!!p*eH?vja$xc!d;f7o62HuEWS`?KYiYrpvXAM$)a z+{NvmNcdN8X1m;7GS$1B?ayXguKnWnAGd$@iL%>vS9>?}A)?~;KMK6Xw9D?2%iR8Z z{Pq9!H{8DK>TB0W`dvplg8Zq>?awWDx%MmD^FP&r`{BGFKcgLFyJC;a8X$SPB|i$v zcH3jxe~<-6(EdSLl>71JQ~~_Tx&8avA-2CSEjSpr|01sU_V6{J(Dpfu+rN)L?7{Yr z+rN*!&2ix#Y=1rvaJ$DZZvQ_1um{^eZvQ^^j@v)=2z$sDkN*oAGH(BI`(I8Tf?s_8 z_wk4L{9mvS8P$<-|39pG(Dpfu+kf2thjo~8N)WgIVXd{CQs5W2|G51R>oDb%Aa4J| zS_^HT!#%G3^Y^=X{2t|Z_~Co(H^AB6y8TIvw>KFB%c;Kj?Q!k@O=iom)s5SKSjP6e z^vkJA_{Hsi&$Dl#8u_(<_&^*g=Js?R(Dvid?FVBnVlHAIhsN!XU2a*`^raL2*hy_|?Xi}%Pel#w^JZV!bj$0PQE07oLTg{E za=;>>Z2jFAcBd}thG+0xE_9fGO)4Eb^>6|o`q-1A$T5Eet zZ%b=mvUgf)<;rxjulcxRPCj;OYfDekjXGvUXR^C3r#{|^8HgDe#SEM`pZXN)NHW&c zjofd%ApOd4MLuu-c^%#JTilLhIDk+5RdkH|FnzOU^r-$TAgq$a_V^AbUE-}O)OGNF zcK@TD`mDJ)?WC)vW0mrwpyVz4)$e_ic}jd;g^)8}^B!Ni^%M7TIx|GZO$|#LYN_(5 z?~4Jv*AERk`JrD2KHb`zOh#b;NIEfWs#)jISz(Q_{!}%FRJ+!|Ugpzloq8Z&GlV@7 zhbq1i+J9L68RtBNa9+D(hwPauY=6fEj@`SXSs&UEUv zX8BCVA2&!iqeaQtgO&dxG;_(F$8!-l)8`KO?l}HMG06Wl+Gn1&OL=@jbPzbC11^E` z=izU31{c5~9dM{O^da9%$9i!{2OQEtALL8Nsy)tc3hjc=f6~5FKPe~DBVSVw@Y^Ll z@V3|mdchyc2fe@}J@BwA^a77^n0TZI9`VqNa{J}Ko)W`vDyi~%JAfWD{~&#w9^A5J zDk?4;dlL^bX(YJ|tE-TdJ#w{b#}e9yDA}H(Le^7gW8MZxEpSy*?(CsH_@T}wrR%W< zC#-$ZD;LU$;s(T54sg;jHcNUC4%AT!`tf<8s;b%=Z;i9oj-BNE9Kf)Dz?Wab3db51 zq?;<}Y?J(wjhbVy3+w>9WG0J!#m-KF2fp2C4YY4_3qMc~xtb2XT_V09Cx>f9eyfBy zXCPhvyly40y5jdzlT?gS7ihY3{=<4sgy-9$wkV^xV=)?3GW69h*usDSN8o3H+H*vz{w@ z`_t`aq5^VM{H&1q`4#2+ukYG*Ekzt<@WkU?bAvyD7w}}CF8&?hSHAUhe9O$iUyh1r zNAlNP{LwRor_%+(zQr3tC8@vQ3A})(#7xB#_|q}G?_bY!UvKKdqFP>5{Nkc>GE45t z_Xtlo0)F@k!Q8+TcmYqDI>i(CGjaa)Z0+w|T@+0LJQt5|EIKE%&w zfTwJ|^iSefu6DKO&r?fJPm<>1x?6`OD=NOB=$y=wyK;X3PkXsZa(mzjynrWrmh?~J zS2=*}nDtzp?Cndg>1pZc?lY76%2DwPdipw2-6fyuoHE@+=R5AlZ!k(Y-jG=YPv8YS zB^srF62CH`W<8zrT{BVD*WWv=Gm)~W_$5W>WR~2OKNR3ke#1lX1YW>Xrb+rI@hexm z+H>ofZtd^v>1$4fGjLS=Nchv+19+0lB2SgU6L zQ8{CH?!RFUaM8!vRC8rvnmv;9&Dkb4t44FmdX@IYTW!?t!IElm6JPzh}94OD@ zSRdF5HFXVZ>n9zoWbOkokMooy2%5)1JoHHDJCC!SuC}%t2}=>x{9285sB>3`H58{c zd#3b15|)y8DH!-K@;CiANT=(6oh@k|g(Q1h`cl0?$@7j!#h*oYL>8-iO)WiE(bGqs za%|tF=5hA*9Q7CAzwlT1FXorw*ACj5hy3a`S5tkxwfuIH|L-9_MeQ#U7t0C#PLVMW ziTM%4yLy~G<-gRH+Zezbun@B*H) z3lvY_&rqd}dsfrU+Uaf0J-yr~_H`tSyY_Z@DiKe)nq>+r?@i+#_9ydvj{Zp32cEzS zc(Tt{Jb^zQ!~1#lq^YrVN#_mWDI}imrqdK#m>kU-Sk_H6?qQym8&Q1B+`tof0Z)lV ziYM@A;_`UvZs{s!9t3)#;^+1yqjXJ9G0qpBCZkXi`kki06LlU*&H_KM2R%-)fo5T01zF%$9UsU|8T&}fqIoIOO9$E!x_rU<33eB&97w`m);14oFx1QudY9!N~ z>g`B&_q7x?;T#p88$Z=92$3sFufn@Ep7;p-DQJF;uU|3V$M_!_aa{m;G>3)8|NL}K ze%XzVDL=t(KVm25I?wxXf0&^YFXSIkNmOaCcAlZp3-;vm&*mMwrex09pf4EElS4`Cy=gd2+tUnze9Ri*HMC>+1%7Hea+X0(vLk^&-ibD{(AIBjSAH>YTje{61UF{q!Z8QJxocAEb>8; zX8QE$d3EPHc>%Qzk3KSQCazIfH_waMSHJI8e$Lms0gKQZJCYJ#3vgLfSY_E0ZzO5_ zEH3|}k32$;dVHiQIKO@AnZL38klt?FDkU@G^7LD8IbbHPWpd9g%X7-P=a$#X`#kbI zvsuu^iyFFV*u-N2>zHGYJ*V19+kLQ8cNqO=Ss_eia9dKE}L7$7Sah`4k4(WhKH%2K#Sm~v2i*40s`^2ni}U7(bii#89Q3)kA;&3@AJPH0MsUyv+;ufx9MS=o z5FGRYNBx51>&Or3fSV{d=mT!em;q-OIHUt^r?eC318yn3ea9PcNC(^|!9kysnEouS z^zw;xz-0sneZW~(pL1$Ken49$-JoKWS1m%zPz|Rmo z^a77^nE4|;@V4Ng7wxUx=m$}Lqz8WcXQZ8q9^lRX1$d+feuLnl7ws1HFw2khz^@TJ z^lq1Sg>sm9qz67Bc<4nt4k|y=13yvl&*LKhguA5j^w)AH*Nh1HV-8&Gtc$CA; zAL)V53LbiQO8>J?&RZrP>49G-c<2Q_h<~I9zFqLp3q0y!=8yEi&k#KHqQ4E|AL)U& z1rNO$see%ZNDut>>!kgQ9^g?9v;0U8{06~8FZ%E8;s+)k>49G(c<2Q_h<~I9J|TGM zog(!Q>VJ?P`0X-Ig;$I*)Y6j=jF-Kxf3{eGe>imwK-@ z7apaaFG)=Gd5?>g8XK2;fJPh{!C{`y7r*>#O$v_pz<%PD4c(^5_2Esu2gX=_4-6q+ zqpIsv_dT%dYbIIzD{cc{V~8(vQ(AWGC8k+~P%`WSJHReb0(&{~&xBeGR?{ngDU1831>=({-ef-haL%e{<3}?rE#C%nppA0 zim~)FQu>In3r8V;JsE4#yw<*5c#B)9K#BzULY61YW?C{XxYO_%l>lZawMYkz{Y^ z+wM{E^GeFqTZ@$NgrhXXa5le@1b6~3;3=_8@dW;$3!z)jwvMi3cRK9LWl`}>CFP3J ztMF=i9+2A|-;2_>DqWC$@C07KQ|3d8C-7%N-Fmik_jR;%cC@66c*@4r5*6P-xlU~e zovm8{+B-#f;+uqcW|FHa3zPgx~ku@bz@e51JRVx7P{vSPu z%l#8J@Z@*R1fIYPc*-tTJb^#xLa5a#ncmE%q*2Bxt?& zkR!1_@o~&=VZJLX^Iez+!+k#7uSv*#1I&ZzsxOiO$mMi!!UTR&Krye+ci98-9FK&V z<7K}5gmCj+z+qk`;fLRGZIdb==DWUW$a?AX_fa2bzH7%f2ut%_2z}?f){L2C@vpee zqu+oiEoC@gE_Q%jP%YSt?lBC}n=CT#n3#3pPHW4WJjXlbu{Y^l#|T(7$C4RrC4i_b`u-`I7pTX1McSwH;1OVV!8zm2~6{C$Wk=F8m5c0OP10K1@Gu$Lnb ze46ZX(pD9>p6-#5Jn(r(#(X~aU-P6PV*Vce8_Rk;@=&3=AGjY)vhjUddd8R5g`8M1 zpXT#V6@A|HUP<@ky$Nk@tjRn!nq_Y13#r6tZ;w%7i>ZK5)kkwR1Iw2AWxsR(Ffc)c z2%Sgfnb$2qev>JZPQOUP^^<~x@ z<@uP3=kuq77a91SS9N>x&;Io?N9MIW_4NBVGSy%3`#7<>tVaB9yjscCmDP$0t~`b` z==d5#9&5<9A@60#;|%#NhCJSo_x8v<7vR)a?8n!}hIL*`iWAJJD$ zy`xuVe)M?eN0*r&T^4?F`h=gHEd1nT;U^~xKRH?W$;rY`P8NPd=1VCq5Bx)wPM1~v z+;~+#S620NWu?KDRsCF9)z6hx{ajhq&y`jETv^r6l~w&*S=A3RRZsE#6>od8HyG{d zZf|_%9wUC8H{QO>h~KH6&%$^R<3EfC6NjnsAjXLk<@y%Sm*F`*T=#Ohc{`uZzkHpr zmiC_~=d7rBchvstvk?^AN7KHPW^IE*_Ir~2T{b;5_{&^0S>7#}Jr z=3rSllU!-huXl^l>Z52k9dgcdd~Opvz%KUb zVqdYdD$ayPtNx5_ZqX(*?z&vbyw2r%`tf-0DB<5+Uy5Zto&@gTQ#Kd z=&Eb2Nup0rZ0@sN`1d)AU_Umu3Tq)9b=L_u<42neyTA^xOLnHR3+$!Jy>Fvs{qP~w z;dd)tS+@%oItj81;-N=E(=IelUvI6kuCblyEyl$B!Apjus=|^9PWAw<-ML2 z`%{?ptiTI+N_rg#E>!910?9#!r;4<+J9Xgw?D z>3O4abb8I((C)wsc*=fA@dW-%pzBYitw$9VKT_*iF;B~l%2gRMi{J^ofG4|I@dW-% zXkIp)j;chF;CdQ4_%(+ zZQu#KfTv80^iSefCNQs_Ww@Tzks41t-v*v)%*v7sp1=!u%F6fz{FzXfr}ACT>a77h z6?z^DynrY00{$Q)ba^V@^{oCu>wEjPI~$eMLiVQt8gpa3kMTc};JN_vXbt(gY%4XK zpz;5Ol|23*{hK{+t~2k#lxieKSw|@RGqZtUnI^x@Yd@>91|c zahW)K?^8+d0R8SecKT-=zm!J;a@px~!MTIZj$awPDOlq6$?I8R9{G)4&x$**(X^fw zkKyROSIf4qqdk2+t5+K7K)@#JSrKo$YYSS>itV?a3W56!xbI-gdQrF^f#>V+emvfD z$NdPs9_P_HXe}K`Q~fF{msbA8>9M`{9qcw4&mwG+`OmpN_YHLAvXAq%EjXO7v$K8h z_2)M!816H?!;pP4&<=5ZcysPM485JObl(A??|p}*m6K>?pknV3fG@xM4oZuD-$9jS zwEl%%UDc{c0qArFUzW>cCwP%$NC}q)vNfAki0J)uWewN+XdPK zhnI=p;yBBQPwjW*Dg1MuOI_GFhw;31sDS@g(-Wo@?B&I5oUV{viq}+3Zf|@Vwu?=C z;XL(Y%2Mbon7N!P3Z@y2k@l4fbI<*F%SScxnSfz_`0XFyK1Ad&Kl<}fUOgitnKs~Z ztmk}Xyn^vdR%DE8FmA#6I(U8p;~2ek?8p6-5#MhfKYnTDYF0{{K32|Dspn`B+V7X~ z%R-;=hpt@q(e8mmyU)(^!4G}d7_W@J@eA{HjcFXJYuS!p#161a<}4Y%h@F)gPp1CY zdPq!40gYb<_S@#l-aU*v%<;`ezB<+R^yjS8oy+%WtCa$OyBh0yjbG=t`$Ev zV_8#Kj$gzMuuDSPn{T@@D_u5n8IE7X4zLTTM!Qktmv-vMW^LuT2j9AK%X2@!AlF_l zCqKQ8emp)wd(g)(jKTN?@qEk~ztkUe#<-^rJB?={&U6k^ld&qRt4Sk!c`+MbZ*adK z)Lx3$R7`Gfd>TH#EG0g1e)=%&)Bj;Nzi${13mQcU-stfMKVzF$j-CDk>&cJR}zMj6=>*=cSB<_97)`7yFDOP#7)D zjY9;7_Un&dX^cbe;qza8vCnVL6$gAL=Ra^aVfpz@34P~L&a9Yd@o)G|=ZiTrH+5ae z^C)Nq#m>%{ns$#2yTA^x3v!2@A&=Hjw+s8Rxv^K5!)7lu?njA?`%$Ot+PmJY$G84G zFYnl`4c_}viHiAy3OBI%f#a-z#FdgW`Dq*zcd}#J7EN`ANUo zbveb=5`oTGaq}^RVI4?+^!HEA;WnDGDNBt*$ddJXN4}Nd@jmOVv zTs>v|Q2&(m^-gg-f5P!`*9&)^RH^1d96rL<=b51sPX7J1&uu|{JVkj^3CiERRWAP6 z?ESWU`)}3v-TPAYiFN!V-)MlY1+OjQ`%&8VVnaoxCep4tw|Vp9`#s8cy=nai}v2l6akIH>tMZTxNCt+GzHgi~%;a^^ki{hY*+D%7#OpFbY;nM^Z5B(opaQi%NV zorZ~09*XkafI~XqUY7OPq0a@YuO0)3bihqnr|JoPz+F1li$gl#mI@B~T%6iNen&&8=dloRQILptb#e6%zd#!aDvGo<}t{q=T{ksf|(`W^5{5Bxf#T?23W5%5S4 zd{*$#i+oLg0v_pse_8O*i+qFdNDus!&nZ8I-YMeGrhg%Sqz8Vf;Gq}(9E3-D;4^}U zUX**H_z&!Y{E;5`O@fDB)ISK1^uX^FJoKXcL3pGGe&TJ?j-h85{*WH{gy5kUW}omuMs@-qTFi&_(OW&HwYejk#7(l>4D!ac<2S*Y`-W!(gSaQUhxOL$TtX&^uW&$ zJoMuHv^}8yNDq9w;Gq{d+vpciexwI}o#3Gt?I#G2^uT8Y554feAUx6o|FYnr7rdb! zX8S>U;4uz?Uhp53Khgsa{m={k;RlFk{??O#@eby<5{G-oJ@9|@qe1;4>*epRex%y6 zcqB1)>}6xs_bYG>z$xh25BYut!o+!UALjgU^IO1S9>w;>8{e!)iqA z#i)5lJ{CrsSI6#@xSiKihG=g;q- zFGJ;28W*CyrRm^=31?UIIVG*|+^4s%kn2VXvma3XMrK*K{sTDpsV{z@Tl`Y`i-8R^ z$IV-D{RgiT#GBK9Sd69qBNr+^<#@OMIGes*!N1`*oiC-|i&0w2um6A@U>DR1_M+Pp zLv-g*?2wps{PZ)o-1_4yb28HFA?$$r^eppz$@85=Y=`02^ETj`>+e!kp0-) ziq~W!|1~nV^Bt5m+T9bhUrhhO>k*aX#wT>HANn`+XXxLu(!ZhKL%%jr#<#d$LO%x% z;1~ULU=5vHs;kegsCH&RyyK%ppL&iu7k*gvYuR6`gi{s^bvJG{;;oIiqVp!gP1%d9M1j;P<)iHaYo@AI&)OfG^t@C07KQ+Ac&3H+I=-1WT6`};i1 z)9FU#*iXz2Jb@SRWOpc@z@Le8c`EPk^PunH`k{O9yHWyA-~~J-E>JvyzhIuq`};i1 z6W`0!H^1%|Jb@SRl(|sx1pahAyzlx`d4HdWc{+vav%gkB_?33ZT|Yp00Z-XZ>7T@} zbPVsiJeBwNdC=~dC-75fJqqvwp6qVvpM<|)p33|CJm87z2cBr^A#X#w125nyk&^yN z{K^En{#4%I=kepoZ%zn2ffw+U>5=|P{Hg#?^rf8g{XUN$PeJQZ@Hi8^fT!%gN&h5% z70gp<-`8>du{8WheV+$B>HSlo@AH5c@MOz%0r(5%sl30>!#sV=sN6V1W)bZUynrVp z1%Hqcy8ck!-{*lpalO!w^BT_P2A(jV@*_$>6c4*W=dcM!X#)4TXm0_B`#ulmw=mz8 znWEvr*LU+O+>8Ln3>c7R>b52D>DyU_Z?L!H~yKL6$QiZ^ZLy}RhQk$!xCYpwX} zowUyz=7(9<}i7b@7eX6%}_`JwE>L!qgu3`TPrRFRY~e-iL%8U>DRI z?FRB_4RL-6vddvr+>ed^&0aFsyN;a5cyH%J$>-RAJ=@xq;Bmo|WGKF$zwf?B*WArYY4cnU{zb;2654-~>xDn7P}k?T zkLy9;aK6sI;DaAp=Dq$K_z$n_mw|Q+*SF5~+H%Iy^&mpu>%pUICRzL|ZUbL`QZ#u$ zN=x}&55f+xOGfMpdwD8ZwnF(`55f+x3#f;^EN8tki+r5dEwh?#yXO~Mf4Hc-Y2j@@ z+VaawYMKtDw$1PM@O8x}GW|=z0LWq5Pj{G zVb!ehla&Y7tns^n%qfhG+sg~mzZg-DCiB>6mbo8WM|DX^KlocJtWP(PR|RuDi@XGH z-~qPZNU0~|TP=TWF~&dxb@oj!&gwhtqm9GmgSSUhy=SG`l1qA%$>9**_+q%$5p1vZ zbO7f^oG+0E=TY;049ufqUKQy%94q4ho_DIL;WzbEsr2)uz3@`!dMFqERnC_$`<(A| z<+7hUUkVQGKl?Wy{D4jEpEt~x&N5^b8}t|Tan6@R4TPohB|_ixrA>3E{3~wr=rfy^Ly(S}|zeLCw>Z;e3$T0d@iL-gYw}{S=2+(ELF~y=8rO&>HxL z(XRpR4Q*-vZ`8~Tx0fKh*kv*w1je`@TX-Zrr!M{B4vHwI4_8B!dZ_V)ZJOl0pJtwA zUu@u{x88D#GbhA2-q-P(s(3eMAZ8$DAZ8$DAZ8$DAZ8$DAZ8$DAZ8$DAZ8$DAZ8$D zAZFlA#sJS%#`A@5GNZ@UjTwj;h#80(h#80(h#80(h#80(h#80(h#80(h#80(h#82$ zK)Crt^SwU*rzdmYbCT~j<-X_iQCXK;zVl=jd-0;Cow8eW1pRLptCl-XY&f$-}9fkss0lmk=EE zx#hf+ABA?mb0z73TO%^`0rx#6U*Kr<24^={KO;Y+gFeXjk8yGQeI>L9 zd>_RAvG=_W_#ylXdN^OkBR%jl1P{Fv1MCAl(gWWvc<6<{n|1;o>49G-c<6;62H}w& z_^jZe7k*{h8~GzW@GlD_p%?g|@*_R)I|UED@L%|WnLpA4Kk;$JAM|dJb^$w>c%%nDA$aIT z{?KFMkskOpf`?w4D!Mc<4pG@B=e{qz8Vx;Gq}!2H}w&c$^oZ7wsQ<%>0oa zc*H|5`VBw-TTh8`{>A%nSvem=5A3!b{fOAp^v4INzkfiztYKY2Ju$7FUvZ`L{L?`oRO=ba4N5i4$_W9iS5#aCpDR z_Qh{$RC?rnxB(5s27fNXA2`g`y*Y4=coTb8I@vsZ*0J{JWdpYs| ze-9+H4RK$7^vcGGoku$Ii*!(4qqN$Em#iejd&)0}jCkmgkl)>^zk>YHT|d8~qNDOf zi@DC8{cXpOswq*G0b~(&;e9{-tVzeQ%xSUNu*=t5KEr-%U#{$v=@&o$mGXb2M>yq@ zZe_=-RJfr{zAKSb;gki+9`@Pc?c%I!D*3-o8M04hS9{x={qi;Uae1*tUH?8Rex%mV zA4`>;j7nLD=l0AU_Fv`+ynrWrjp7ORGjZ;Eo#nlLKJ#?CQMndFW)VDr7x0w0Sn&k@ zOsLCKd9R=UbFE_Bhw!#S1)jg)3A})(%txdj5Wn((NN{;7-}UqFetp+2_9t`w{8qEF zB!egL0-mz}Pw@o)OsLCK`L3V8NO(GhD#z2;R zD--JaQ~9o+KQ4f$Rc2*1p1=!u$__~XBz|Q=HJ-|L{rvy?r|QR1H~3RK4rn3#3A}(O z`wHow#IH1nv+MFy+WPlV@guQ*{?i&ydjHg6R+eP&1YW>X;!5eC#IH=KThH=cKYxnw zbgNOh3k;b>@C07KQ|2n^pTw_BsLNCNuAjfJ=1*Kdw7Uz<%90G8zzcZFepLD=@hcO$ zxN-Jbvzr$#X->B$yZuh2Ccuy*<4eodQ;P0gs((7ybJVhy8ZwLE3A}(O`{U9-iC>w} zTs`}{J4(4X78QREW$X8yQnQ?eUm-E;*RcB z&FN&gVn@Zl-^sRiamZ{v)i^+SI@NR3vOZ|YEP^NS0-iFTkp4;h%7o_X+0%Y;x}!C; zX`|xj^tP<-=)2e~Rw(%y>7OPOO22Md=A#8Xffw+U{iO6y;#Vd#SI=}uS5Ifh%CIGl zj4v%)Pc_~rJS{YM`miUJ62KF90Z;bT(m#n`nb2H4Tl>>}sV@FdQ%@MDii&S^vaMZ6 z*(Q7YI+9`XMqPgUs_MttpLoOhZn-0Q|9~g(0-h3|mi|fn%8RnBC9{_fl?C4(E*`MrgEz*;erl|P2 zrDSSUV*Ed3{6uqg`eu%&I1W647w}|XFa4AFm9B^P7tA_ycHbUAlceiOScnB$XqJ3iQ3&(;t2f{>Ub7*v=BUj7x0w0LHZ~0D-Gi8GEP`>I;XB= z+V3*kgyrO@_?)5$JIvE0AD(9W=mbyT1w3UwBmI;3l?g>XyHmYgEuG=dHc|0sm6)$y zkCnm`&-?1z8M+|*;0e5dr|gZ=KZ#$NP}EaSa?Rve)RSh%dy>s`kr%S*Ma3`Xd~4|{FJ!)YJ(`3k zbG$THPbB-`3A})(%sT0x#IH;!>e;_K-1riDqT*q_Yn;4@K3 zEd)>C1w3VMk^V{iN`pANsHe2M)>LPzH%zIc;-%d+hRs*6$L#?;yF*t~dABpR`Zs7@aLq9$r2ec48ffw+UxJ~*e@hc7D?4q7sskV-l z9m!C>#0sL~=a-nTUXLm{-~CKK$YnER7QqvE0Z*CFOaCN(WkOL;dcC8Qnj1YW>X_IBx?;8(Y1o#(HB^;~y2Bl47U zC4u zjHvMMavuRl!P99tpoQ=!@B*Ifk4n1}zsghv@zk5_Z0YNu`3+6$@VhQgrQsKql&iN~ zmkLkr^K+`*na?3I3Os=q@RazNv^)6Km>`})U)ni^b$KccAL+tQ=xPw2CW}m8n{oDL z=45vVJb@SRl=-;g3H;e(gLrD|NcYe)ny$*C_FSGy!#9ve z#_9K^T0&mmMa7%tDMik|4pv%@^-%_%zzcZFTrd5T_>~DoJ<}H^JCl8>ZZm#3IVyf} ziTUc~+DoqQZq^Ud{&9xPB6tEX;3<29^iSefCKUB7ZIr0;Wq&LgKLX>-jPy_D^S#HL zmDP9xFW||(QTiwGD-#NyR;0R<;qOYhJe7){Mfpa%D`i=45uVHkBc_{`)p!Cg;3;vF z^iSefCKNpNq|(Xe&W;tmExn;GU83R_QognG!sn~k<1aEE$1%)jo`3^d$mQkt6u}F4 z%6wM(C-Ex{;_RZHtJ>*x1T(S-IVyfmiTUb9%Lq@4^@Fs3q9L;gp1=!u%HAyfllYYh zMLjz%Os6{O=2UY>UrXBW#WfQsa#Z}>ZpxHg>ir$v$u7FM4F80vW%UI3(@8#M22bDx zJlVHM|0I58LQ&7st~%WQsZ{((T({sl7bnnQ02iQSpUz7aJG! zoY)i}1>gz1fT!$j(m#n`nNZX-H@j^n7)FkY&&`hylTV@OdKzc)^K{FNMD%&sybU~o z7w}}?F8!1El?g;WbF)Wgf??#S_}u){F!>aU{w$53n5P?zL`NAii{J^ofTzSA(m#n` znNZZTEgAaOoueu$o>rX;d&|(Qf_0hj#1Z^H0{Zb|@>04yffw+USug#Q_>~DoJ@tOv zOjAgXiXVx7e5J+{mlZrs^C>v|3A})(>=&ee62CH`sAs9yXHoGZaUbCibiVrqRm{Bq zd$d_ulED*r0Z;Z_(m#n`nb7$SOJ*;c+b~a`TcPn@vbUq9(@g6pN5%W;40~*LzexnMn%DQSl2)$kQy)J#rnKF(Te&$Si^<@B*GP z_elRFeq}=SdeRe6EBn)-hEG;hd{YT|nsqo!crx$T9c(7lcmglrDf>m~pTw_Bs9w)> zPqMYYv!&NeQ%H`AUtB_-W_f-Sa2@<^GavePd(dP+QPmF6cta; z`-aZbti%5kp7{MceXG?4*#}SH1w19bEd7)Cl?m1B>5R#H%oK&?sCZ{Q-qS*hPql`c z_tHy+_sw};g~w0W4#AEVf+z3-o-$vN{z?2wgE+f-J-a%3dsCrWo#pADO2U_rr&))W zaleHk^l|2)WJxPb>G zVP65Xa9?UOl}YF6Ftf5GgD3C;p6stn|0I58LOu25hSz4MC@e?CFD@ZZvqV$GpVmtR z#^aOCgd~F}@B*F^-;n-E{K|yt^-T4Ie@-kaenAO&nswMA_st(OBHm-jEP^NS0-iG8 zl>SNl%7p6mq<37}QsIV~p8ly6JfH8v=4sX;D?H&i{ONEU&_eJ8UcgiKThc#?Uuh6$ zSLdmeYvHK)k+=^2Rsc^&n3W|NJb@SRWPe-wC-Ey2itAWsOu$ndp`K#3tf+WrT)_E8 zc#ic|8jtgJFgEzpdvQPu!4r4^PlZ< zH}EtS2ec48ffw+U*(m*!_>~56b{VJ76|}Z=C3{=URKapoe6Z%?V|ad?*UvQ1Z}0F? z0iM7Mc*@=<{ge2W2}M0SlOZ377DZ9<^GeKDug9Un(`EWW+JC1Zvk0ER3wW|0kp4;h z%7mhxVf_etqT(Av`Y-a;!;REGu|JvX6-?9<$v$`jFW@P$N%|-8D--IiXLDO>rJ16z z92uYN>1(e|t*kwxBiY$jIIp1CX5q7T@}OsHAUu#ee9#)r+& ztN_UmQ$NoBbcqo+$>DPv8YSWxp%^llYYh&DB#|uBSOfBaDh4iSg6D!V~I-^WA|s zpoQQGynrYBLFu2wuQZ6WtF4bx%CxV(-cL#Rk(l>ALFO~RYgEphkK$X;``D+ ziC-D2^m>MVhnjV1JeP!bo?{I^P2s7=RWeU!KJRxUA@Pc*Xsc!2 zBkN@SyHpPS_!6_S8c*N_JS85I{z?4GglhFHWx7D;xg`8ZobO(GS-l5@x`C(ja6k*; zPv8YSWwuKHBz~nqoL$E0*LR)N0?agp`V*2(rU66h71YW>XCM*4u_>~FG)w9HT>ZtgUm>>UxjGrbOmDBHe zA__c#7x0w*Z|R@JuaF)g>ZzZsnnN_gsQ8gM-#xC~=j3|feD`)#QVYQocmYrL!_q&A zUuh6$_q+v*<~8Xjyo*x3VdgiY;?44uA_txC)Z4FKjo=BqfTzSG(m#n`c~O>?t7nNP zyr}p$@_eV>e)ZNEJb@SRlzCM8C-EyUO5-V{A3;x!r&96Z+!xt;!kguMcY)_9eM8QW zSp-ku1w3VcDE*W8l?lz&v!!cA2fgmvoN8_D>`&7>;ATpHIV!$EWm~%-T(+LVd{B7e zeq8Un_wuAt0(b&1;3@HA>7T@}OlYp2$?nx1y{T?~HJIKnTh-oI+_i92{A@Q{dcCaZ zY(3R@cK}c0JgK}qffw+U`HA#T;#Vd#SI>^_wvJv}YBvl?q%10au4G#>NmPa($oPrp z$8~>ti&^95uAcPSq|l2Ul8&f&`fgGw*?Ou`Nj&|x9MO5&$CFA4;0e5dr_57|C-7%NbM@2* zH*Xvy5hd7cj>&|{_a0%~Vb z-*kwIH_KCsd^63f@bfCO4e%I4W)VDr7w}|1E&Y@Dl?ipfFSW8anN0Ux+!^jxLR9=2 zCFSa^MbLAselMPYC-4HE5GNHcp>}g4-i|U>H{joU&eqr%hnMKdZe4mqfdLnm3?Vvx` z4}&N00-o$&N&h5%rDJ$Mw=Pj{$EuFD<`t>7i<`q-(niHE;%sYYQMR?`m3m411v%gG z^_{+bNEc)uJb@SRgrwjPGQx$4^B2!;T+Dq_OIsU`79U2%7oSsb$~n?Mx$7OOv_>;@ z4l++!+QWC|dCe$JXJ4wmH?NTH-*e_RpEHlH<QD%Z`k_9kUuHnnFIR6-qMz@` zhV*_{Te4S;qC&eVbrZXGmw%!@s9*b9Rli)l^X*sS7b9J^xqd7mbYn(t5B5WSP`|_# zs(!h8OP2FzFHUd|x>_w89NK0mIopk|U-+Ja-*pVqMGa9u)CcvOa;2(YuHKRn>PPRo z$oF7MuHqYNH}Hb`p+2aeeU++TuHHud`d8C~IqBxr^l)6dSqV^CbjW_WyV@V>gZiP6 zxq26>pHoX9iVxB55EhRtJ|)|4DJ9>~w%S=QzJds4PVJwQ@7f4)qdBay_@8A}I<<7~;kBn!eRt8zLF;`gz;gN$F4<~j z7uZYX-$Q*5Z;4qdG-Y)(=_scD}L=o zX{pZjW5sD5KHoPg1?&Plz%IxS_EK^~qcya@){l{0hTiVT-yqJ1=*Q1uwo5+(JK#B1 zmi2h#p+a?j;b&WLeyJgi9hE~>=ZQXVdane#@KNNir(jKmWIb*)?6X~X?1}NvcG}mw zp@fW^aGrtva7}1i7Zn^w4PQq!dgpTNPY=>S-&0bKS<{>7OBy|?-oDzYwW%;q>J6VW zriT%!e)XH* zWZVV`aSZ?*t^pE$_<>uSls=hb8oJ*ro0%Ch>f_8Y4c$W6p#}?K-nH3ynq#_u%p~V$ zC<+ig`i(TKiLcCXA;7Y}WnVu^@p(hbXB=K7)YFu*zv1k5$3B_GDlAq9>;gN$F2KWH zG%q(~S<4&M@x-i)=D)i67CV`fkzNnM6Ryoz=4&&xoC#lx(Y5y_HzYWG^pQvCQRvzR z5_qeura2~?Y_dwpMg3*{%=Um!YSx777LGPGXaB0~;scFzXvz|0j}7OBx62O78SRaq z-_ftlf(kVuC}NZ!zg+5v{tf*Z`nSZ2YM@hkd0>PhD>z%J~^D+q0FtVw^jjb(jH zyd>wH3&buG>S;>Z&x$=Zd@#IS77|~!w7177bD^_fF?_0CF#TwW-1LCD=Z`S^%YLVQ zSoGbc#k3-LPv6Lv^yTAJe%zn#ORACIWFnb)K3{&1NjW&(b<|fvK8zA^8nso>XmqVp zUVguuTR&ueheDU%?nq=;NzZtW&wORJsxKcP*}ma@xAOQ$Z6x1s$lvnH*^L7^yp!M6 zZoHD!_>|ul*2|;b&vWxr@1eOe=g)lDT7E3+`BiawKj!Agi0of4bIPN}6t1k^w{g?+ zGc=AqNsqo0_!{aByz!hH<)2Hh=J{QDj1kWo_4H#6nXe=C_`M97&JLdVw;1wxL*CmX zb7}Y=$~VTTk1lh4beZd;%SwZb_ts|&^=f+g#yHnSZhgkkm6A8!Tc0tOw?1PmZ+*sC z-uf__^}#>+eLOw_`>X!P^&c9is(A5dRXaVNdV9v_;uRmRtPrlO_;6*#hbt>STv^%I zl@%YZtoU$c#fK{^K3rMx0U7T_q5k_gwIzO}J?ta?>&nW1U0M0BD=YtXWvO3IpVTiW zOZ{@P)GsGX{c^I@FDFa=a)0Co~p*j7&qg(f1)u?#ykL*8yjCYT|okm z_bMvxAM+|JrFO=?ZJ(mX$BB2Saj?Bm^?RAUm7Lk%e|$Xg2M;*c{}W}L%;g>+wZLH< zmYCp!uf3{Cm2LE1|1)2oQ-$>WRPea`j2gdQa&2s@Xl z@mF@=w%mEL7&Wj9>;SviZx#EBot3T=8m)ncwnFc_5+^ind}zOIEMH5%^}IuyEtS7R zi5AAkkP$D@26hA(iT5$orAkViawL}GWqv97h`PDAr%nM{wFzT)J zZr6HB@f25B+YZw9u?wES3wW}h75^3cAw5E~o-2C$)9r{XB8-Zk6*51+BJnrt*HgrM z4W7{6bPRX`FW@QhTk-Dzzw)hTGy9gVJ$OGVo*gMzdvP&m5>MPe@mdSK@p+B6f@@U? zFW@QjoZ<=mDGlyl|9YnTdQ%q`)$*d^>DwSh=H!;y-20;V6OMx?zQ!{*_!D>mPubro zp5Rv|&cB|m{k^M;qREPiZ!9_|v*fOPO#n{?*Qyd;z?1!Z>7T@}TE6{yfo_tm)meo|ca8;wDr~p2Ffs z;#)H}(YvSIKiyzduF%@n-~~Ko{viF6@MowBXg5SvUw=^x0Gd2G=SzOguSk4pZ$@}) z@geEQaTNU%&$*ggu746yD=K~@{ORohJQe!p1$Y5Z z_MfDG68?teDSdHQSF*47Vl!cYoX1m0{Nixg`Ih3J((Vume=79N3-AJ-5-&*qBz~2d z`jY4R%dMvxk9Q^0?a8)|;yNcPSXBIc$}h@joX`CqCZ0Y`;d90~6LUl0k3+OO@B*GP zFG~L;ex+l0Kd7F?w!f%&ho=aQk9p#EF2w!`173nqIi_@r}bPh!=KdsOmB_B6LUxrnHh7wpOX2Q-C-4HE5-&;rBz~2hQ@DR>>7|tkXh=|OA7%0s7T+NG zmFiL4?rxWH<_}#uoV`M8#DN#^l=-XlPvTdGs=WS5uV*n1QHZBv@Hw7JbS&m+oAghU zjmoKeR^Ef~C-4HEvVW8QN&L!-%5Qf)sdTdV*{A6Eg_K{ZzQlE5o~|W-x|+fUqumu+ z!xFrJC;MgTpTw_Nx4xPF0G^8R1=bT4@9Lv^($uo-(gU|0I5uIHYhtp8EzQ z6b}=cJcY&QzWq2%K0(p!PghF+!WtZ*LQtJF_l+&55k|o3wX-xlKx5jDlx4vPt1-QlY8|CNhVKW@lmf^*q_dj z>tK`-{Ww1(U~b?Eynv^yrS2nwKl_ZrJbA{MIp;8Qb7hmKu=tVir`x0-pXV0K*&AcX zEP^NS0-o$jdCoxm%7o_Cv#rf(am__uxJ1P_w6)dpoI#OGL7K&P#!oxZKN;gp_>~R< zPv8YSC8`up;7`Z!zFW_hZu)3gXV{x*QSl9wYeVQ<-CA(FyG?ldf_vE6^LrK)Jb@SR zl&Mxcfj>i)#*><-bJ*ff*P96gWS6JX@XS+7i2TfAFi+=5yZek0>3PsW;=mJl0Z(|& z0sI-N@_6F!&KLJ}0;S31DJ-79$rC0&v;54{yM-sL18%0#W$*-Ez!TDdKgbBpdiJjl z_c%mU{5j`_%May7$UJ>X+TC&-l+fs|oTJRsLfXUgF}rA=(`Dp&87C3_DfuEw6d)hy zMLs(vALQTIo20d>kZbr5`9Lr7Nyu|Q$Y1=ic3N#|j3XcDMLu}G2>D02RCg+me4rQk zfEnZ;wIAYq2FUPuehkl(W%rZoGSBmVhcwbtV-KMWpSu2##&;b20q6NL{dqE84}!Nl zRFL;P8R8`xK^^VnJx{jXT5q}6O-Sk=a(=hbFYV*-tYsX%33I4GO|6+qd7kX^@;n*B zv2q@g&_CzkqdVm}vh3T#Kj+8Kli8B5*^eQ|#LjD+=Mo{i{ZMBMt;?J0N%pqTg&?Ab z4Wr_xG$oHrCp+mGwpwQxL7&8-FPR)^Q89+i8wtKe{rwk6n1KV<5xG5c2mT9xh5zC? zSNOHUt)%B6Z`uYORo2SJ=QhoAo;PCMwS z#UB|@E+V-%{3#70`MF;9U%%%eS<_qSNhpjpS=Ke!cpma@c~A9b<;MwI{P#c=>X>5o z+utG2LryHse~~}@H?vpaa=88%cBV$vCMrJa^%R%l5;_mxMPaAW4|xoxikrKh0x#ex zJ5KQg{v>%WaO=6MC)wTFQTla4Y4|yGzNVS`g{9<;N=zW0eoMkR^yBdhwnEnl-~~L{ z;}uWfFKY)~pRevnUNpU}xu=)=#J-LqF9cnlOT<&Is8^}sc$&v}j=;~0f@(UC@kZT6 z-p2i*bKVeMz*Ayx#S{3;j2nh0dc-eX(s@I83W=wsqv%n;FgfN`-MUP8TAqtiJQbW5 z6JEemW*@~9{3Xl?Rbmc#7i@e~r@6fQg8(i}_o^Pi)bS8}n6r-JkL!V7q^-zxo+ z@RxYoFg$gocvhjArVd*#EaJjBkEf9M`A&AVblNK_yBrhx&Q-4}p7J--HsWklJ3+ZB#@~ovDDnJoEqL(9X;+@hziC<-&3%c%BUvtPWMd2eZPbK1==jdzIZL?v$*S{xaQOk zW1IQd1U!Kk z@C1F}FZ0$Qp2QzQ-pFxzDh(g?J`mUMHtEMNL1pDSIOzEhp4Y}aAm#-D#e5;;(HgF& zf;~wcaL~NqN!7ou)Y}uw`h(gDOU-MKbp19QuI2-635U~fFP-Z=uf+bFp$Q(yKOi9c z`8_W+;dRfPsz=9Nmv=0+U)A>{!2pHw8>p)sbK>UjtU7h(-+p$?W{!Wo`ozsYTXpK- zi$6Pt=Vh&f&p3YiU(dLx?wKpEn#uAl_ir2g_-FUp@|oKA4w0I=XDR*f>37i2cWmVN z4C(p=;eSmSmVZNfcapBZ3;qZFRhy4!dFjEnof8@u|9I0|zCZBnqSNZf-+KzDe~je2 zpI!9eDdX?`F3WpQ+3UFT5B=2X8JO|hrZJI@X%MbKGR;|+;4f5^8fYnmmX}D{8@+kacWw# zDk2|I>!V8XX8g-`Ft_55{qEmBH~7m>ch7wOl?j{I+;!^a_rH9fV}I88@LmU>PIj+* zZ23#4k>72hdvQ+OS}i;El{1UWu-X0b2yUS6_<48EoI<~!s9WDb<)FvVU@ zv1|D|OT5XqPE1)v2L9bpt)h-|0@g*}I4L@3+w>9AV1j4kq2fsS@kDuL!8BSsXx(?Zzj&aOh10N`8m}zE!Y9~ zk6G5^b9$6=r@ippGTKWGY5ZN~m#d!?ectq533lP5$X`#vnhME!+-TTmyYx^&aNgl( zK)9`AJu94_(9gks(j{5;xM<%xsgN&DayguDorpeuc7@BaxMg*+wjr%1IY}Prt?`s) z=cJRp>1Ai8dfQrB+m|&Z(--!odX`!8v6HFC9&^GmCr@olu0H<6V`m(H>~YhV@#jy{ z%kVXnW)_$6S5KD7S5H`=ubwO$>9WT9Vg_OcMjr#|mabO%^6oJ`-K#9CyKVFpFfLKd zK+M3XW`G{W+@%+AfCT#12`#N&VI6Bc2!XM5;$7ZrPy5|I*Piu#O-k?XSTmHrOUo;J znyY*2HS_Lcjn$wvLwOX40d?_Oy?N{|33h=UaE+6#Rd#{Bc2{{y&4+DL=owix8^F)V zVpgEkoOTZmc7YvWm&~CuC*ap^c2Cht$|dL?g|Z8OFSxwy0z1GiAO-ePGQLAQw&~dE zR}LO}=$&=nn}6KkCo=1N=0c&t4eyr=R`1i?ZhX|eLha@LG2UEFIcnY`jpz2V@JM$K zUTYViWxuG_fyZPu( zPr66>Im`7V+EY86H9IOPnVvFnv^qZVjwhV>%sg{%*a{;iOKRD^x;1550LUT|NVgTZhTfkJWmZA zp4+wk@bzDAQstBP53HvQSucJ5KG%mg^$kqC^N!Gb$9g=yf53I-UvZnxmx*94dlP?n z{{UwdTu|Bg3x+JwOfwJHRd|2khm@JMK_+s9&eT9Z#rm zXlc`zi1SUt`wDsYJSB^k;vMTR8u7?Og~~3>8?EtBMWJJt)~YYnwEDcu?!~&&I`L!o zh}v^kBT$yvL|XNBliBBuS&PRkN3k-umwHN!cE{_Rb9vGJXxDf1TPIdeh<2DgLbY4i zJ9DH@J08OG^CQp>cl?xmh1Rk_==68y8WiE%A^V2kn(V4IyH;1S&cx{2hh1O?*d=k4 zvJ32`O5H(vVWX-W$0 zvi^2Ti+(^)sO6%tTP#y9T)zL3 z_kf%=TXt+BU9@HkLf?KYJLY(cf5UIwR(U+Z>*)Bk7p290Ypyu0!{_@(rGQ;v2iOJq z!Cp#!rqLQYV;kZuw#(2QM}B}f&(e?AWI2|&;SF}cc!Fg;UZuicHJv5xDpY75^1;O|MYqp?l7-!%-1N({VTlW6Z)@uU)pr>I?fttBCpTA#fW0yqm{ByrD`1w1YKUa17z%v(&Y`{m~|8 zF85W6;7dLGV@kHKR3XwMT)b!wEiYF)FSV+p)jH3udMd{4T${9~w;*?{< zPgS^G!gWt8IV*G0i9^-;`DRwOwbsGA$7Mp$J>a{?W5!yFLH@7NK9{Xs%0s)p8*oSm z+&aNQp9}t0HSYt5biic=2YtW|jP>G>4!D;E2YoJ1?IAy;18&Nb!fReVZ>r|{1BZ0L zEfpN}x%qik`hc5Uz}mG2C|=0{(|)IQ`7I5SH>ef@G}Gty}+A(1U%9M-!6FQMZQzS&L|h~NDurv z!9y?d4ZUf6AC0Dnji{KTIr{-7891>un% z_=Mo07yJd`kskOpf`{IT(!TQAue2Ye2Y!R#p?8YZI|z^Tz;72k^rGA-hiN~g2i}(R zF!aLiYos0~9_fLfA$aITzCn1T2fkhK(2Mqm{>{uE>4C>M0(!w)5FY7)hkocqx&83# zDKW+?xQCuOM%_Dy9+V&b;5unfuq)DWI6ybvK1-tq9tn&cyLRk>GJ0}HdUQ`*?x7>h z94m9x$E#4+=eN)O#sGEnz+rAR;fw!TlhPsg?rLB3%6=JW$GAScse9;*<#p&0=G{Z5 zHTKtzo#gx!Zn(eT>zl-vxv?fbqv0O989&-&*adcgT~JQg%aLE~noZs^gt%S1{#Wc` z)%OtRYlU}bz(tA7d+3l64?QaMyNAAZY^Bvhzv4IcVKt)lV%)o_VYGR5>`sa8QcoG8 zz2P4EaAgn^1SVs>>nRrf1^SP~G}V8gU%`1ZBj*A1=Qyt+gZI#75Zc?1$gtJb%V>nC zEUfn*nMc%h6+-(2)o)}^4A*}E2S4@4-`J?ihkO6uFl3b8Km4FLsMCK8e4Vh=e;~}e zXEvVtk7X5;oS(lw{V4dlpYmY7%#Ag1|KSs5CLI+r`VZIvc0u7_FGn8uHgS3SHpIPt z`8|#Q-1YQUmfuemUM7{kPr|b##67b!jdun_#XD3S149b*mP`{eW}FAAK!D!ysL0IW}UNS$%3;MH!ob$ z+?wj{ORnh)mvdBnV=0*$Mf?TLQL(Q~Hjev=;0e5dr|iLEH?g0IT{QcwrrC>_rru=&roH#^`wt<(|0G#_~GQJ_|m?d z=q*)Bc*0Q{VmO=MNCG^87x0vMNbv;zpbMc}&$f=PWOtgr)g6kfsQ9Lmaz*J?cr|@* zlG`1B+e_c7bV2sP6L2=)zzcY?|3liH_?3>~eYc+S;r11s{b4$(sQAS#T|J%2wp#fP{H$=f ztJ)kYJh8+)fge2Ap;D>8;0e5dr^J6syA!|CF}&~AGvtR$MNw4zNPNF^oW>Iu3q1MV zp#V?d1w3W`OYsE$q(%qWO#SXs{6~C~gT)pM`zkjO!2}i+`-!&6> z0x#exo0a}a{0h1dYV}N|`e_v03$kBLo{DP8l_10pt@boe7VY+V4-{4Q+1w0`o_=Akl^@kNL7l!GWL_t*i ztdep?=~Xyh^Cv!n{^>2=WR3)$FrV@xI!f*}>;|2~CLE;+yld&Zh1|6_y@}?Exjp8I zk7Ird^Ih3m>7QiY9QTWG-vRSpmOCAmNPcnU?KFK@0v_+it(?w&7O*bWM^(E*7z!LAG5SN~Yo0fPRL@&5 zXKo`;luiV4eoZvhY{Ua#m{<|+ZTMcQvzvAREcNgKm+;+HM3G!doL`lkKW4k1%v^ZZpNBhN809@x+beHF{ z2IoPX_i!G}93s~n<+wy&%A5$T3tfuDx_d2a|8!M$vKM&eR z$-BZ5W=~V+ugpxp^BAWy~yYbuJ5yX6(o@0!(2G(!%Imyq>V)2|r)0*Ql|fr1R+JcaWT&Qo|U8|N?c`6!&P zaQ;Fjv&lId>0E{LR7J(ED&Os2--idVosOvS7<$BGkA&o~@U29DeeQwhH zJ+=$~g3ePF7N70P?^~F#1MHHSt?UAODJJ%9w5%UK1Xg~x(v@|)TqFsC?1FgckzkCD~*JHqHY(qjk&2Od3bGtA_gNS_+KDnybU|RF6akgFIBV?$Sz%4dpS(W z1J`f8ixO;<@?R%azf)wi7s!a0XaveG#Hl;KvC+D|@-F%zNpQ%0KL3K-3mdEazUd1) zz%F0__JTZGL!4iN?6Rw>m{I$`zIOJqxz77w++H$OG~O1O=j_nai6+zGgzY-mGh}$CMqt_R#$z)v>^659`T4sMFTASLwykWiwB% zoAKQpga7;Rje}Kxe14GIm%oo_K-qP!hY5gjJgoSljUEBlBkB zl*BkbU)fi`?^a%W(7S;Pgx=VZl&DK`>Z!si%eJqhBjaZ=Z;w9m2=T7wO#JiQm+sAu zmFX1!6eE4KQpQKb<>|NHa==V3H*dHe#PuJp2URRR$1d}ixNnE|Uhv)wt`m`-!$vX^ zt_Q2CnkxLR2QxKOowXwoX3tdP(#$-c>p5My>|-1S9M0Fi_<@%i6%6y1cN(%!2HGL6 z4{z#v@C$_H>p=;9uLqmxDRcf6w}CIe>p`WZ{H_OK2iOHnz+R3#@M+@mrH2q_4ctQV z;m&w>I&t1aKfd0>yyWp>2aIo7*5h+}lyd4@2I}^sdl;3pW+b&uy6$MI_)6vUigoBr zynsB3?GiMOVoiB~QG9^g%R;IT+S_APR-v%pca@Ep#WS;3>n}z%) zQzXalBfov69Gq?k9fN!rCHnvDeF?lBMU{SMfm}2ZWN-|~$RmJx2!R-g1W59>EEgg0 zNC=6DlZ50!GGuvX(cs2IwyPo_ZV7|>2wMg>K-7ScghhQua2Xwq$|y!h<1!-xDt|@t zudl1VI@Nu>T^z=I#pe#tGenmaC8_H&>zA-sSM0sC*XSJ_NlhMA^vq@FT?bgW9d7h>At&rBJ@VEFao_BLVk`t)@kj3;#CSUOdI*E z-wNZW!uqYK7{3+9pM}dG@T{3;r|VhD{nmxKwj^6tmnkSJxf;pMxzq{&t`-g zx82Z@AL*0^!=any5s!2w)6dC|bUnkObi^Ya?-TMP-J&5;I^vOzc;v_Qq9M|L@H@f# z?;i@ry}HiGNqqLx=2&~8o}ec_>HA{$HRkN@k!tOGjm@W zJ}lQqPkhqPHT2}m@gjczuzcc^zGCRfm-O*|Mtb6tev_dmUzQv1Z=@$a>314>@@2U` zdg7CQ9hYxs~p-fvkx@kw7c^yEwZ`{;>J`n86heA#aC{?GD>Px_69o_twvA3gC& zzunN2FXi^p6QA^DW5>vs^zr+U@)Mu*YYjd5vRofM@kzhY(33CqKOuHsvwY%{o_3gg zsed0m@k!77lYA+65`C{iroHDpxX;*s@}c}3N1DwzM7fBE82fjs{XXE^34%597X9r6 z#^uxX{I{>|V*C6h*wqm9)}sbW(s90(O#fo?`;c{ZU9Gd{BZuw6c3``(Y_?aJ-ulNW zI$y0TsG$8mJl?8i2W^Gl2d$Y#{YSef#Rk0JzOCT+oFJ*J$Y#F;1n})u`5Z4eepC*R z&LiUXm-c{m)n$$G0|7f`_ucmr^(3ezb;pm=m1f>#;!1}eH_B7Mj`_s#P$ zz6Evp#e%-L|0YzH`M0NzZ)^v)OXW?vUD#e>^>EIo_2`GCzSu{m)7+ngYj=273w7ID+4o)`@Bchh3&w0DW9g> zh3yqeAD+K@;z6m2YL`H#-FETp3$y*$b3L(Lux~7@Z*{Z_WLObHUN?Kt5Wq)P=EuF6WFZ*@KC+xp(ii|6}T6Eg&zs+iFND3TR zJl7NZ?~!Uh>X9CPZW+H&>(j80kOTHH9(qGA*k6|~l)tO{Z{>SB&PQE8Hv2EjXa7x; zgZ=M?-(ULaE4vn~>T2q&uXL@iou>a%d$rn(dZJ#aC(=@XOfzOZmn~R% zVb{ueiI4xdM1r+8oUKJPn2-{-vl zH7h(XEO+knrjB6i5+@xk5OxEB^CP4&KhkeFaK#OnFZHyPRF>XnFgVtwHMtwggRk zwT9U#|Js!8LP)Z6$>#~%_C9h5ewwb<|6X9c+R^=#W?4EzySvjea!TL$U4XZW7kYvnr)tE=joXId@;vm(((T9 zJ3EQ~2OXM^SqJI4bV?-cE5zi#M%4o$T!)Ioan*iFtb-gp^q}yk>1zFV_4S_# zjRj7)gJ3cDgur%TJFs0Ub9KA0y~4VL^Odt=^KG5Rc-U(ye7uR{5$7wO>*_fsvJMhH z$Bb7a?f5vOgf!X(zwfIb`f)ty(P1x@oiswlv0wN!+lB4Gb}65u+lB2FO8We+gM{sp zbsZ#IyTD-QYnQ(NH0!=5e!f}^?Sgd>mLH!V`Q+gI<|VfdV)`rlZ|Pj!f7!34|BiV` zbcc03op#5S&k8~W;<)0uo;a?2PK_&{i*QL!Wb3~eaPsxv(htl!o{5u7Z+tHMFU!x{ ze_u-LAU&!{*;) z=a(N;*7lA>{Aecn?@&eSvx~g}%(>zmB^$6Q+C{bl+ofWjL)l&d=Jh>qnev(2FEh_8 zI?Z;uP*wQd>W6g|>iyr064)+CyVpadnEAb)N0!^)q%}2oKlN&QsN(269M#m}UaC#- z-0f=@%?b1SJtMGP*bZzLO3(IUTH>BvN)s2WpNZv)4?1SBzLGS4C(Q5F^ZhY{KNtRd z9JA-kEHmGDpS^^}VxnEb`MsI9?YZ;&+7?#N?*~Wxtv6Pajp1g77%wxlSFgIt`8?13J?voCUHv@QnpRHZ;&+p6srRPVCS>`%4F74@*5bADg>q3*woSF zc+TGu^SP1vNb|aye<}?1^S{4WgTSK9^LxcCEYH_2n$sRQzc=l`c0oN6*j_s2{^z`& zv3o5UzSeZr?DP9;2YoKUum53>o!^^z+lzaCKWLAi-&_9^#@~eXKk`C@i1*}K zGu1BECEcsxdE$a&#*TeM93eycGKCYj0;N0kbIRH;>Ug7x*L_8&`?#;*^*S9droa9t zSU%6`PcZVt%V8SNH%%%*Jkl*TbmT{Tel41G#3S80Lq~q3i~FA-9_jiF9r+2JhFBi) zNcW7PBR|rq6E4cW=yNVjDkdK3n(s30Vd#O2&@(JbM?BKaHFV^ssg&2Fy`pr)BVEPN zk)P0Mi1i~L={6ZU@*`ak+#G&Ihjhdv-A+SCex!R^eJuigmUP4;-AL14$&Yl;4vx|h zk91{2M}DMxdauRd>JrN%9_e_WkRR!KhDGU!M>^t>AJfkcmUe*u2;P4@Kfc|_N&E?( zeg}C$Pkhps?vCEqq-Vb*U(yqw^b-s{`Le&q`xEJjPx{4%o_txZkDmCXUuWpamvqgh zzr^JyKI!`mJ^8LP`iu8Z%1?aKKV#_0w`Az!{gm{?Cw=pm%zbP4u>L-J;*)-^p(kI~ zJKo<}KJiIkG4$lidi&^!Px?)Uo_s0yPLKYHPx_sPo_txZkDmCXANggiKk}vgBV+dk z>rZ^rmkmAnQhz>r;*)-@p(kJVzxaL3@`+FSjfS3l+5dd>#3%iBLr=bx+ec4)(wB@K zCtvozwI2NupY#(9J^509K6>JlezBn^U$(oCp7^Baa|roXOuu74s=EJ8d8Frc^5y-@ ze#Gl&zh0H#^A6v;R7UImM?C6pLTnsnzaSoByx*OwtU5ek4I6gJu%+hd%iUMG*!bUI zTzZ>X|6QqLmtPVLxiMcR9p`0ziSz^C|HdbbzT$P|`BHg)9oTbcwhP;V?ZSGoy>$AC zDLOv5UB~}t(l@ue{x{Av#4AkIv5tYjG_UJi{@43Q2CF3?cpvCA!D!AiE->(gS6IWK7^~<;C8$U?Lep*hX|7b@j0KY>Sd_9)d zSAG9KXcQg3x9$0wqE+v08CSix9j^9mT%~;2;+Gz%uhW&Tps#q)Tx4}8etn>&IexGm z*e;Zl?G>h>!`4|3^V)M4-{0|%i*@>4O6OM@z0WXud9O)x{CH>VI{BEmMa8l6=~oRp zeaO4iFNT?rWV_%J%XiVh$xUa4`+lVRedT|m_Bktky?AJsaR09Ot)L)EMAoWzoY`az_xweUu zMAH4GKdr7(BO(MVjGmaw#|ylziU;b6dZC{B9@BcF{^E2}&qYg?buC}DWX1Aay6P|e zl)6fd*5az?^nHhK8@M59;G~|Y7wW0>Gp#4;&*cMH>bYR~>Lm-7E?KZDmy_fE(zmHn z$F$`xHd2j~jGj(Xx$ZeX_A3{edZJ#ar}EFu_+ zvlcAtUfQ*&$#|n~&sVyx%_yTMq@XA22dAUrfqJ4|sHe)~W_&XJDo!W$T(x+?qFh}m zWYu5#S#^~ft;Ne6J>d%VWR4d{kf|r?g?j4yg&Chrzlsp4gw#{{Mmc}Q%4G|dFYJmV z)kyc3zO$}UqXIqo4?R9HmwHN?Gf_{}3-wg`r5T@0zalTjPCZvBPcrIj-V3`{*YQt0dV=qUc%YuB7wW0}D>FWseif&adahcnhKl&*)O3I8XVq0| zRICRbJ-Opk(l>0WC+dZI;=F+RiiW!g?R=h!=S(P?RAw(>2*BZ=}*Yv`1JB9T9~4qxUTXYm20NQ z3D}ZFo|3a?L4!TD+%-bZb-Oi!o_bXV*SEOdRXWm)<7VAFzTVIG2l4g$f2fE4r_=+; zElSxPN|}QO{dMrC!BmCFdRLEGA2)GntxlIN&bQu0I7i?zp8J|eVGrYMTj()J@A}@X$Q7Tva*cYAxTcJ3E^$M>KxeUn1CTmAM|zl+RxwLueE|6@qI*Ue={ zdVN@>^r_Dy-kU(hk>imem1axB?$1-;TJ!;={`VH{`kGg$KCnp=1reE zGo+dJjwLPEylL9x!;ZdZGp=tq>&^GwdT3Y6>nHtcGSUn`{Qimu6u*|KiXJp~C_G#n zuXtUp=s|<@J&G@Q9cAcmoSIOS7w zu6*c`@7>z*iRY%bgO?lntB?NH$Cc%!1RrzunAUiGv*w{6#lOLezCnH${_c^MjD|HIRJ9Tfg_DQW*B{A0-A1dF#v z7;Pmf+lB4Gc44*HUST@aA)vOfeRj>e&$P?eI)178(9@r}z56 zpkJzA61VC+v?e`P?d1=iHmC$ zmEb+S)5Dv*7-Mdd6kd^(sq!d04?h;s>^&EVORov|}Yp!>TT9QlrEpM9Q9e8*He=FIThr;N)V)OM!yp?vm+ zbR5?b>01YzXI0K2T4HI|HaSLp5VS9>$%A%|)DO=L?^ZvifroSv3JuiKfc5EMd^lL24j(W+9gMGsIFDH~XP@0Pb~|sJ$f(3S`*Lxs!o@WGJD95)^WTjJ}*eVn*3FjB3B9FK5kM8md~^A z&6|?TiPI5}baM?I`4L}zHxIX_^$9>c(p3x{`H}A0y`yx*Bi$xLM}9)5A=Zz0q}yre z$d7bE@OzjTD<|uw(G%&3Px|e#en|Rwy-81e(wFYl{fB(nKJogKp7^AnVCc!0<@)G}Px{4% zo_t9^GNu=nPkhp^GxX%k{>=8FUP(`U()Ss9@+Cdxh|?3F^v@W2@}=Cq@`+FSW;1S( zFZD(~@$!jJdX78fTQU8|S3dDcPyXafddk7;&|j}gaD3x@p%feEsJG@=KaTSQ-)q&- z_Xl-pl0-j0eun!$r$ElE?;ubg zgmAtPfL6^HY^>Koa9!R(e0cAJ0{pTC>I?qO<3V%T^X3a|2eu3A#r6u*Pb{0N-gR!} zwIJXb?x58@!%bVwGuvFBVw%^54L$PRs2Tfi`B|H-M?Jlrh# z^A6xXZ&ju8erxm@ZjKimKl;r0!Eq%%{&F0Qk7rQKEMr@LhcRStTIf>beR*kqk6v%M zyfci;*XePi?_>GK57M!pmOh$5-+F9pyqFzJLu!9uee`<6S&A0x4JJ-pZ#YZ&-Nr9l zi13e*XfE#fp+~V8+JH%-pZ2I5n(e@LVY{-uLV-gcxvL+h@XzgfQ^#{HI*q*$kC_YK zHT?C9FwN`ws{M~W7_l?lj|JZw@-6kVI5mNvs;g*2^y7E{C%s26ex-K0v{OIV zmHxN({Gc|M{8!N~IK$2Ic^0Dl+uCxRGNWz!RGi?h(@AcB=^ODa;E$*?x9BUgGpLPv zqF$({%I{3Onf8mbvh`fDY{3OxIIE@3wyj>$mG$6lzv)qIT&SGs)#~gY^fWAHkdrJV z^+df;Pkq1FdZPZ~BG`IfuwYpoY6|*GKV21zGi~`=Ct8bp)!7>8X+tzS@q0ql6ZJwp z@&2d&VyvW|Z(q{&j{M!J-}L?ZsI;lf*+x&N#VR*6mPV3#qF$&cqEdfMGq(L<&D)uk zEAB77TFp9J-RNEY`QGb=W_;Q&CVA{O46i~@u&=bIw67$k-PP%yc9Y-!w}Xb>f6pf_ zZJD&_qg(d=yS4YnQ6JwE%ocJS^fH7-Tt(rA~?Bb9wM&$W*$ z)@Z+ydA{|Pq^G8>$}X=8pMzbzMJ540(X(p%#crV|+JJif`t_3$gAOq1kynI51BC_( z4HOzEG*D=u&_JPqLIZ^c3Jnw*C^S%LpwK{}fkFd?241=vz#3z*Uii{&|DxuF1_})n z8YnbSXrRzQp@BjJg$4=@6dEWrP-vjgK%s#`1BC|iY9PycV%ux?+5Ep#kJ$462EQuY z!zg87MY1|@|7+zF`kW8I9*e+}bwoB>Xb-S>=LOGl6HtkZ@`;+78l*;rf-+~Bl2>*lE6vc;e{5&VV{d(hG zMG82ep6->~z(Ip18gEunfB%(R%pA(ZeK+WI-%SZ~UNU!L z&do^2IY8x83G~tLzfA~&Gp1-(^wsGwP5@6fPvP2E#_5U{zA{Xl=qqEQ@{@sIdT{lX zaeZZE;hJ9V?!sWZupQVg3s813@3`dz0`lGZZ7Nq_&%&m-wd`Tw*pfxahd`>05w z?N1)s1->#^KF^|8{#aX%vrm~i=eQ|wma%%pilwXOtvK)Bx)!cpwqj9NHfj1xe@0kd z(^)7yTZz?Jzg1`U(Vup?lTnp6N5LZm)D!hWJ+Zy0zX*{^#Ot}NYt`Z|WTHE{+MR$tLMBG-S`Z9Y8&^LKGf40*~+5K@%Z`2j(_p-kk`q_ z#EIkK+TfZXi=PLMhp;{$jxk2EH{^ovF6IlRC-wNlI3IQW*zCV7H{O4JoTdLQU7)^S z4xcLvR)7+dI(BW*>6;V+zfU=QsK(x4%4h#Y8f&e*ZZ0#@{a2;j?^BK#dQ46&mS+!lQcDZ2>@tIOu6#G7qtiBPqMln!Z1{xl9!wtDM)JNi_PCFbm0JbHo=OJnc)*?&@tR zf9%mVB?EW`JBKy3s2{GcHzobYhFAQXs!z`sk6tq9p|}0@kS`zpm#?(G?XRESy6o*i z$M=Udz47m*Ot$DjDDXOf#M}^Xw&yx>oedP5)(zSzHAb<5PRx{bpWo;t9Vn z&-Y_=er0U(JUiJ(Kc)7^=*La!GRvoL_)SJ0A0_FCN4lMcj{JoFj_?K~9q~vv@;+TJ z@*`c(uqYkzNLMy=k90l5qIAR~-F8Dq zenK~KFkqHPJkpg+KOjHS1p(fW3mx%DH^I=6AL-5-5|xv9q+4w0$d7bE5S5d7q+`D& zKhm8wBuYm-(h-mRnC=-S^$Wi*Y2>00_-9O-`0O|FegM6Kp7^A1-W4{JJvY{tmmOCNVuB0bE>DL;1@+DooACaE;q~B=h$(M5b=!sAI?S`Iw zsrPjr`H4^Z^5c43C*P4~eDKi|pY&@DJ^509K6>Jlexso$U$#Hx;C)5?5ufzi4L$j; zHS$xBaeCsDzGUng`BHyA{S%+`w2S1+{>Oe0FQ53N=XLUB`APJ>3b|tJFW+mGkBQo0 zmd|m-Hy)te9`)&|k1J~k%QkG-CBu@wAyK+j`@CdazD@U+(tqd}d};->TaPkiq~p9k znLhpvi6^FL-r3%3p*{%uy%T8h4GG40Ce_cS@(qbgh8+~(mn~3VUr_pr2hGKOuNB7_ zSZTHk+kx#uDcN2+&2~6gJzpdIAKFFfwyABPd_w|#SU;hK0@{Cj>Ng~KzcuY;|IqTj=%A7JU$*n!MxvAD0ts}FHuiQcw&vtX-gk8-x@P<-|c1|@!5Ri2kF>P zD@pW^UxR+B0{4=$-wvGd1JWhE7vEFI54Ho_1@%K0J=bq)QwfB@Y8V)*=AgsQ*6B?D!5=mN z{Wu=-af(wv|7nctkE>#N-~B+r`mU@k%f7WQ57?_%d_(ip=KKdK*jLVE{N<`Kas1 z#{ClR`!VHbea}5>>Y1~rp58HaW}V;3=`VewzLA6el=T}qJ*t1Ozq0>wTw=dg>vs>U zpBh(&sd$)*35pvB+RuCqG^mDcrL=Yff#y1U_R2k9;msRy40edn}T-zt?$0} zB_T!lPdzu?vUip-g(Tqb8&~piBF7glM!U4)elhm^zmzB{nHox|7y}!Db=)r$vj-|@ zXn;mCEP&MyPndv8HOI#?W|xe(>g^sMNoX;<%($Pbco?l8Y*Xv3){*-xsxhdiKgUp?n<8jH*@xJf- zbQ1la)qRd&o?m({k3G-mtG@q78T%EkYtIL*dhfK8)Xs%}%l%*e+#rzp=g4`{akzPu(w9 zs`$!|iw^to!|FHXtP7SrtbXRcsjX$+FMRF{vHj~M>h3yv=;Xop)#i(Iu)X38LDtXSqJT*&?nAI_BVb}7mU^PB5 zzF^7nT!k9s%bc=Ge_tH&UBvy~mD{IA@)vVo@DBanYn@4_mA~!DQ{LwM{-ogWH$)La zr-+k6f??(ZZh{+BYx%Jk-<6VG`f|NBztM*ZB^Bt z@>$(xS_Ar7FHIZl(~rdv7pXLUy4Q!i@czpQJ%b+~G%;vWIpBfc-od!wLn_Ae$OL6A zOX?42K-H}jj0|U|=Y)7?s`Nhxhlc%2fk6-cDcsj8uYfvGc3*7JR8)S0dH-c%kr%Z3 zr|THywU;U#V|}E5Ys8TGv8$IAKDI>71ypF@C8dEw)PbhqFR2aAw0AuNs4 z^Qk@)lb#Ml6?fmm^MY>JBA8*sIEVs6@ z?>+j+!74upn!?{8wYIQV@Dl}3RPiA7Goe+*t$3~>9akQhCL-g9{(SHQN%z1$Jwskc z95+6Fg<1scN0`!e{(?12GrM{7l*Ic}F0Yz7y#EH?(f-f-igFQ;a>el>*TRbyF73+iE-O*u^0Ruqck!<1x-aWbxrj%( zb{aY|MPGgUilu9ob{8zrC1pD<#|ML8%}%_^7gg>F_bbQ6Csgz=8L?g?6h(iJCO4|`8~ z;*-A5yjLP$&~nTS>932@6QA_Y7<%#rJs)7d9y}V9ZjaIvpY+YW(;QpYrE=o^)(pL;U`GTHfb5HQ=p!BIIJ@H8oIT6Sg^x-Z5 zRf)%sQFhSybAtXCE5-0V+d~QuxRqZ0eD{orOILJ8-UH(K1^fNR^c%A(LvbZ#WOK(~mk+*z%bRU$O()6I7 z`1!)%pc9==it!;P%|yq|$Lu z3(kn>%Kj~UHb&d(XW*?$zfZK4fALP^YYY0;zYet-8gIBH$j%1I3kGF9H-WtwhpFEq zU%Lox+M-$@XgTqKRzykdtn$O~1_BL>d)vWk$~Vt!|NO!qb}%M;eKeG{f-WT7zTgI= z!`mJ63S5CMp``~m-8Bh$Ki&76>UT;j?!WmepZD8+3I<;3ebH|Tm2Sz`f3dHnRzSJ9 z0m%283P!p3F$m21RmZx&_~+k!6Qj?UUDlIu;z^q3!2< zb&2D&?LW=Y{?m7BwEy(=)gJ$<%XG^(&*4fo^4(qiXJ^rW9K|Q~9o~}~js1su%hG?a z@0#}gUIpX6FTEmaKPwxf{b$#rMHoIJzVRkkL0W+s~gmt<$09lu-raVF6Ft=l-r-)>^@hpzAT63@;w#h*`UfjZNWti zuP@7CxvH2jP@daV3gz~vzJ_HOp}w0G#C@r^E7;Wsac6cdSL>6iWVJ}yh-J!MyJS<$ zu8U<&jpfDTw0Q*aQJ-Fw;CtcEC>ZsLzaL)Ob$-8IR?Rz2F>PR=+?11Yvk2B_<&p~) z_ebz~Gs&?rG2}j6vEuu2JP&Yv)LCaS^Hr3|XT=~mWrk`OwU}7iso!ZGqOPK?N>4=J zae>MWr_AX8*Fmvb81LuD9@~GuuABv2XrR!*o}+=v$MiGJ^D412Z0Rpj%?+&jQ@k>Jkcs6KNRb~Ig`Go5J zh&=3c;#O#^Cx+zSr?Ch)m}>Adm$@{Tu$qilxfioCpi_@&#M@5bI9#^vI=q4ho?Wf_M$ z+Bz02Q{T%D!vDvN9b4z7Gk;m3-8Xye`r7e*%Nt+uyH+KhT89l(`dTGt1$6%Nsv*Tgz#R>qxbpQR&sbUS6-RLdMcfQQt3`O8%eLHfzoD z`qf|=Q6GJ=GZM(>HCcb=I*27V0P_3Vu(uB1+tm2Dg#2je`<&j(qN0I^t|A{GxfX?k)@Yh|O>IU7TjZVq;Qs1Sg0j8hd(l}3 z?pJ2IzwzQr^!o+IkoulwXeJ=U!1nzu|XVk}W7MCL77 z*1ck-+HA0}OP|SDvit(_ZbTgFOBKrdA!)CUl!HEtP#x?2ztKIQPYxa5qJB7w*;1NZ z?77mqqyBjRyRl%PU9bm~dW-JWiR)jzS8mheH^*y^-<4bR_|0*>@_2CPlNU=l9KVl~ zthylHe;dtxKqkoNwd(PYSd3AxY~y$33&r?Nt<@8AoMe0X#-m1$-{nj7ILVl@vyV_N zUauurBggNZMlQxaxp>_t7wYjsjNiN;cGvjbT#VoB5-N7bY!?<3j^ET<*72L;HOKGL zMm>IWT$d6w#PR$1_=TKl-hY+LqWd?H&ui87ju(=B{4U>FjNftXqehS4 z&6n%`!I(0$k5DdNuO(L_$L~HP7h|7XyzY|=^>`u1Z{82PYy2)3<2Sp6irq2Wg$0G< zH}#fv{N{Mg@tYhuuKS+9#}l#6nD^h}E1sY6yY$6k{I0X9LNbn%Y%kw<)adcMbfxYe zj9CZvAIin+wd88#_`T7{#n>koulwYBp~i3C54&spUR;dd>=G(=$7~lC6pr82TiW_Cyxv+B* zf8TiH;S>3b76x4)Fvgj4?W0Q7E`WckXy|RldP_9Vrqnfr?$~wxT_}{H*U2@{m;LCb zlQlm5bh2Hv9{0pGZe5?+|2bZ=-F)LxqsQ@`rk^mTlB*|kbJZAA}!mM$eWouStF5 zFBd(i$RmU`9|gL61ZTUlRj?uOzxYk{&h-)X&Q;rtZ$EN$%eNo-Y{cI)I7*;xkr+D0 zkNT%RsefO4vz>&uhRR(F`fJpC;yf3fe?_a#bM=Ir>hyk1uHH^*qYlqM{|Zn0#rc?a zRN17xe!aB)u3Z;f{X;HS|M1Q9$Rm&ROaIh2^EEWGLs|r%{?#Zk@3elL^HX~O zwyOGWU3~r(=!ZRkRX^JbnEF2E{;z&frB%?nilm!x-<+})S08<3LK|W9RnRNkgjZ%R zA8Aw4f)C4H_b-38`VWGQ5&h%Z?XRAquKR-Yd(E$>rK zeSmr)`1F5T*9G(XtA90CsC_VDpAR&A$^*L8Z2AWc@S$_Uq|ej;Nz1kak8`hn$o7Ba zyWr)c$yiA|RJ68=%7@N{UTL+&D+ZOic zu{B;+#rQ0&9C=B^7a-*+y+#w1@S-Wly0!t(`uC6Vt?HL*pRr7NSp5y_YI@woI% zbbf^WhZ~hmru;i2KFfPrV2@p!OgUIC<)|1rC|{}^!Rm-!Ajf0-z57IUv^%WV$Y1Jj zyg~l+D!&Z()FsKmaw$itqV+-fQspRB%YibX53C)O9XV98W#garSL1`&SgQ|HF6F40 zH04W`V?Vzfm_+Z{Pjc3c+9!Ez}_=>tX|)JvK^nycm5d%xe_&HhpP zmF}lVGq|!)4wg$fDn<^992HY8 zNN*M%zw%cUF@BM0S6)yK7dInXX^V{*i0vHCFO zQjXGxjXtQCqiR3zmey6vf#*|>rZOz>M{l(pcOSaKj;DQ& z95u(&m>i|+j6SHBG&wd_%W=zvpSI&^`EgetHO5m@uGNQ0Q!lCdxT9JQ^a0#2_*Eiu z)EG}=a+E$|^g+F(>0^^$4#>07>8G{sTb66}VdSV}m1C=44&1lf9XTLZTo!x3m~tsc z>7zy;)JvK^`uuX>zAgPm#xcl&;L1WdST5zL7&$6g<@j!r95S9xaO7~y*AhA7sVSFo zls;zkLA|8uW4m7tw98^gj<_z6w)!yTQjUsAQ!lCa%j14I&@Ss@a>Qk!94wb|ls<0s zL3z^jv9nqZcRcM&xNno@*({fGRE!*yuaYLm6V-CK<7w#^GL9{(HQzVoQjXFmj6Nt& znjFtm%b~{834H!2J94NtY55P|eBYEyIVvV?^^zt>AoWGtWBmicj;9ehYK*5bIZEq{ zJ}6I`93{UTkf+b-r?u`|mTUE49Jp_vapZtpaarvBV#=i)rS(Q1lqXG& zk$yRF-!|{eIG&nvDM!VmD_P}eN|Hmy)47fuaa}+^Rv$4rO4l2GP@Xh>H2dX1yHp%G zP;Oin%E5B2K8zezFKKd&^~-^F*%Xr_E(_(Tm~tsc>EDe$sF$Nto=+!K%i*q{_9fi6 ziQ}m$mvU50n(~#>Ix`e{s#(hWu*)JvKiWhn!+q%s}GZ=UQ+eZ>6asXK8?ts$J6VsJi@MD+Wrxfqx4Cm59%dN zA9MY3sQL#xoqig>S8$zjuw1JTBS$5x9P|BhplwF}Had>QWuY7uQ!eEweah&AdP&pA zV!s?=|A@%}9k{Yk4wg$fDn<^_)#(CQjXH0S`NxrNt5H+YB?~T@_kh4m+tkRmRtYzx5@9tOu3Y!LOG0l zsdB7y%SjkdV{%k3KPP-ghxS3R?GlrtG|IFKchxk^^zvXM!y`WZ|Qe3j>Yelh(1iYl%sT*(Ff&8lj9D*9Jp^MIC7xexGZcJmPUpoDApk4YLIZ$p~7RteLDM#rDqYuiHrjNOPInXZ8#N>#}LOED2<)|1rC|}xs zfztdWIn4JLRiVwl&v?I>aw$jYbw(f5OUk~5(&A(}Fm|9_<~nl3b%C_ihbfnGR7{$B zN!3TUUkB)7RteLDMx9v(FgUCrjNBra>#sclaT}E<2?k%)TH7^sz2U4(T6jjT~sB_!tHqv7fSB zs}Caw^^&TOUcVeDd!r)<%8koHIk@kMasU^B@}U;O)u+IZEo`jr*O( zsq3&&d;RzS+v@J$A*}LS2`e-k1`my&jL?_f^U994-UqOk8KKw0ZSVM*h4nT4-^XX( z!|;{H{Y3Ny76dn*+~VX5CqJLgc9Eys!r%Sml@=B*YHseS*Ht60b;|9v@UOlhaD>kg z+$GiF;0ZTc+923q;nlyn)50#*U=N?M=iTebzs&(nq<=#+b?g`Zp~aD4WKJ``$XW;|;*sKuU{l2&jyH~90I_A6;%ez*+WfabW zje6@bD_5*ufUVK<-nM4J>aLZ`!^3^nz6SbzTGYO}5@=Z4*Xn#wV+5 z;aH{$8`?j+Yp<69f_;78uJX$PyFu|u97kYZMgDCThJBTM;pEegwy(s4ebqtRSEeNP z@qvAnaz|Jg_EqxJ`P|ujV8>S;8fNrxsD(TJRbb(w#9_{es*VJ|ep)*w z-aZbWj8&oC!mzKBudm|2pAYOS18k%Y+P*R+v5$|ouf&6W)j``=rX=?9fqj+xafXFq zUnM^apH4>)Gc64JnomEoopR?`81^-vJg~0}u&+93`^uEWKK;C^!$~0n7`_v z=dVmjtoV5BJ?5_rQTxhVH}=be`6~nFpgQRJD^n8t1@=|)1@hOc)4`u?Sx?f>mrPT!TwO?UhwT^uH!TeRUSlCz5g@y|ITD$+~^kv<3`S3$ukHF z`zpH75a+M1-+{X9>&V?>U*D_NhehUM{wliAP%(eidhprlV*Z+@AH08McwXnPEHn~h zeONM{*ZHdy>p;c)RV%}Pf1T>IS7BeBt`mZ=ulNQn{pldnV_%o9SQx&44flA3dzzXG zn;I%H_RrTBtLCh$2VVnHymLM7g9nGO%gV<`+tf{4H7?eKHLTZ!nJ=7teDs7g<(@AKb;S3s^D+4Fl?&i zXW_HM!GF@iu&H_Yz@`fR2n*vqtK_H41Dh)NhgujmRr1sMz^1BiL2T8Sqbv-YD*5Sr zU{eKuw1r_)B|n`HY^wB=W((sztK_HiflU?sF&4%?CdtpjXRL!i&cb-lnvc(T2mb^M zV;@sKJ|{W&6D^GQtawUlKd?7I@Q6SVPU*y&Bv$H!Jlbiyl2hFXSRbs$HI8envc&p4*t0o#y+Mzd}veY z=M);vY*WWp+tlb;3w`b-@7Wu@_RBLfSo_tm-n+#7^tNy0*&E8Bc2KK%n3h5BUCJ(x zo~IHYdzUl}n@U(}<$vbT^HlP|JXOPbp2~dTdW=y@vfF;CU7_w0>lkC>jPk`Lyo8rJhv=4X)ydzXlhd8&r>JeB$B zeDpk(_?gb$2vY}o0ngqzQV6KmepxT9{c8AmIC~>PIFO#FQl9>uy7_=P-sBl2MFm-WKlCCZtlUf8=teC%B!AM9OXeilC1yF`5KT_PXs zU1EL~K8-tjgSB7!>_*8Ro4RV@f~8&R@=(~}aP4(8Sz%MryZp}zdhM6@Kw(q0 zw&Z_dQ?)Mqwg>xx*?+KKNyB^}5a+4<{seMUY^uCZ zZ7po7^exe>?_Mozs@9QDKZQ-Lt)IfC*49rQJ|g6%b)dqgrs=t`snC#b9HUL;x0HaJ z*`}8JZBrA^v0?3Z_+8?6i7?iF2}4c>RkuVwb*%k*_;j{Qx!o4V+OOnOno!q?eCn{N ziG1o<`%UD7wO^5cn}xCVEBWd5s>AP6qCBvvQtk)~W9?V+)8(mS?Ke@LI@W#@`RF}L ze6G*5_M6D34x5_D2W!9L-)fA7@jg}Zv*@{TewU=&6RZqa`<47G^5mYUChDgSo0`Z6 zewPN>`CPk&@jg}Zv(zj1+Hayfb@*LMZc3cpM4 zcLC!z72kkQ^}E!WWM8Gf5USyKDN#Q7U7CC1@y1_CuZ3Y>C7;~=_N)%S5Q*~4d$_Y* z%I&r=?5pIb%LDs5f6eF*YD~OO)dBBTFa4|boy0uEzUKzmSHa(4VZ2+FeBtEd1N$oS zZ?iD$tK?_lgLkV8nfyW|>KXP`${k^0*jLGCIez_U`$|0V?NGxnM4~*}zLHNSzYvLh z>hKGZ$Vb~(%JaPXg-Dd=1@sHykq7pb;dwo`>X9e6UkDE$*jEO;Th*b4-=#!8b(~vG z28{4OQ(p?!6~cUzZzog1~U&prmf!PPM_3s4Rr1s2d8ydf4O>1Q`nJ4B z?FZifkR7I9Wzo-3j=#4t7RLP5;|DHr9643_HGECa2hDvkuA{m2%$rd9m(+e>m2d95 zEb@#;x#oHL1Pf#SD*5SrriXrmi8o;E>)~3W(C<$0!&qxMzJQ@65gH_khMg?&BYZ5J8;oV^x?eU*GE!Bp!!delo|xu&??0 zPqKZjcm6u}f8_f|b=lX&)%Nw3*ZlAZVc6F^d|+P%zt_T;ze;|(Jg~2Vzrn(=uack62liF)w^GkI#4q{{#!ezUJd| zl7m0d!q_LAhY#Mr3jQPu<2EL%;7&bKz zAJ|mE@3k;&s^q831Dh)N8!QZ)D*5SrU{eKun}uOhB|i(F9S;7J7KTmD!v{81@JCn} zHdXS|<$+BV{6j4an=1L~d|*=rf0Tt`Qzbv04{WO7kG3#us^q8hflU?sW(&inN`5*Y z*i^wEV`11-$6b(Pp~j-YCb+EIrtMT44ayV4{WO7PqHvGc638nvc(H z2Y-%*VN>(*Imf|2*TS%=dHB$#ZmP$ouC2DI@85ByUEd%Kn@U((thP-R{N6Ugu&IQz z@PSPg{3Z*-rb@nW^4sQ42fy3Gu&H_Yz@`d*uZ3Y#B|lvr*i^yaU}4x)$xr74n=1I* zEDW0}`C0hvaPXhBFl=fbKCr2RKf=PWsgj>A4{WO7A8KLPRLM{01Dh)Nqbv-YD*5Sr zU{eKuw1r_)B|n`HY^vZlTNpM~^3(airV9QT3&W;LeilAs9sF??hE2`KXS{=df`wsI z^YJ;!!JlYh*wj3HU{eKul7(SYB|nRPS{?j$3&W=7<1^L4pKf8;)I5A(Qw6_lVc1m3 z&r+{b9sC&8GWm!|+rke(KFtyQl3mc zA`4z_Fn_8~N zre0gvR2iG(&h*)g!lu@~R|}h3TR(+Ot*xIr{4OPq^@UAM({nLTg@%0NJm;xv>#?cp zcArfZe=EIhgz-L=ux|C*ZQsbXUn#e{oiN^~63!yeK(whM|2A6}yib*UshO`2HPY{r zlsm%u+`;=)$xoN(4D~)$o^@pH_X+hrRr1sM?5EzRe&GKuYSEaZEPSVWpDOw3e9lns zQw4vtg`ZIGQzbv0&%Ww?s>m<%)UT-bsgj@02lLc_e&cFWuQ3+J+OOni;WO4Lw|{HD zud?!}b2SDI&(+xcbb0i-RnDIV#@cW1-t-^W-a#1eQwdA0{A2X)Ui-bLjqdc9y%k5*`vpRZZ} z+pFk6$M@1*;1T-Z?~U5n9Uk8hD!)}E6Ue7~yk8x8@sZ|CZ?A=6 zV*jg|a#KBGpA?fBEw-%Zk(<2u&deeBJE zfA-{Y$j^KxAMaNWn)&g~n$HOqhK-eceHH(G^?Hx;4RO`-<4ymEjn&~dYR^*l-2F29 z&e&J&St4x^OtQ3JR(qC)Tt4^Za!o@%dEnddo&WS1qn~yQ!^TR!aP#qbQ}|sQ;)!pF zKdC)S%ynZQp99sNCBZ9qjGDV3)XAmF#vU~IKXTOTRHvWJurO?FzW&qc^q-kd|CyDu z|IBv!$s7w~&r+WLGipTg+0~ytiTA73!KY{1*uMI0th{gC7`3r#uhQ0PNrFJ{VXD63 zlM((6zx~_-Ge-7W7&cb&g`ba4BW;v=n%y>0S)bNOEq z`M24+z{X0x)Xb-6J&z?`)IS7s-Pp$mYr|6R2n)l;O1^ON@xdOZ$(J8sz6%_+v4c1K z?>OP0As-*uSiv7E0h1r7_1@7<-r`KMSAn&KQPo$LRnYOW2M5dd40m z2Cr)R;h-VEer9)^ zbHKaIv&^>VS8o@qc9bjV#yRlDajkK{+ z9`*_A02@o#jeYX$E*s0TF^?te#y)xUK4D^FpRf+Fv4q{&&!=(oSSb(tgmr+8CG5sN zdGtPEVn%H&bKTg-2R8Q4SH0ED_eNP5HdgY5laCKOe){>^DKO3 zcii`*Pa6C=7KV+L{49JLYhx>ou(6wVkB!x5aj28R#!?fE<7>stFKn#VL?dl1bsGdY zi=zW(-dz^?VYsIj!%ynZQAJ|yI!@gl1U}Fipv7b+2 zW1%O%ehNSRwe^Gdu?$fg%Un11>v`b$>2FekZ>+J$$$1}J?Tcw^VOQODC+utgV(zLn z81O8?6anf5!SSbrl4m|KKo*xvS(0&R!H3!hAB`YHTJKtsO%Q=D~8>p#U=*INAtdxo17!h~#gwc0P!_QI~_IcHedRrE&x zcvkq3sI4D8U*+?coOjjlSDCMQ)Y7wlze;?(U)8XFzsme9eDHpi_}IflK83GCXiu*L zQ$K~TL+Mc(YUFuW_C1_;C5$~xgx#`z&r{RF@3gYL&b739pD^=f(Cs>f?o7 z&C_m$UDbWk*B=YJT3bJbU9GL3!Z%ZG{S-cgYwM@cc6D97c6I0Ov#a8dr|{3DdxQLM zb$xdtfBa zwQ^p8_p2ISwLoCu;$JuU$0sLtymRk;jQ^@h79R1t$rjGS2lLfOKXtC*({5qxTatX? z~~ zU%fD26+O(fFwV6~eilBnopR?`81vOU@*JmpM~HsTweX|LcZB4p%VT{KTH!Xe9l`17A}4pa_xqR9m5`-X>BawH++AxlP{cn`hks|e0yMR zEMeGK!otNb&uV33DTC_W7CuASSjiVoK6&m@HujXcC2L~|FHkm?uyFCqGhNwODR+j2 z?@=~Z@`aO69@tpX!%Pdq#!7xVpXtMAJLS%?@IA`L=8@;M%EpQw&b9CkWn(2jT^`!l z(l2WJj>u$VpNZPo2K#3+{y9SbOd)LiGnxGKx;D~xgz^t$$_@Q9g|P9@lv$qLWn-0p zrhT9doNHD7nKJu&gYO8bSLmO~)GPGQl(}9F_RnO>4gE8Pu<_57Ssvq`>3H2kqP`=P zf1|sk=V-_`1{nWL20!%A6vD*mpUL>Y4gE8Pu<_4i@`aO+kMYlB@I#+WA#D6JW#$7Ld+S3>uh1nnTNpN0 z^0UZuRL8?V`lRuTGseQOv67#K5B4@OU~iKS`a7;nN$l6p!1K>^@%rzZXSzup*F5;= z5QdHY)AY_9^Yc~*zum%^$L8ZR)yjZ*EaicXB`jL@+cenNOTS59fn^KB#!9|$^0(Ki zPPsEI3>%wA9?WA!4>K){d937Tk!QA3?i>rl#^#gf97hl5S{Qqq^5}>2*h(X8Y-#t{ z*up=P?pMA(Uf9^$`YHS~rRk^e&jbzm?ypAr8P+X<|Aik3(S?Te{$b|6xX!!crAc4P zJ}0gfTL(>NerC9R54&GsTiG+**muwFt~FwoUHCrKnka0m)`PDf7QPQ_>!+}-we_RF znXYkypzzT|O)!Rigl&DMKelybVOyzBH};Kbg>BVZ^697W(^OkO`g{(1TH#linqXY` zX-exq(QnXEZ}q%?C2e6_MH7T*Tbp;*_R~~z-rAI8Te(LbC26?u)ugqqZ7cOt_-bNb zWL%tm)tc}t`&wH+#o5=|`f2pp*SQ&Ot9I5jb*fztZZ7O9pB;3I)o!=K zuGZF1VOMMGr?9KF^;6i@+WIN%YHj^A+OAgWwX0(byIR=QAkb%VI1k6S(lxyE+kx6U z%6#3Y@!vNeE9`3R`@XQNwe?fj)!O}qZOG}^9is@JYg=(k)D8m3830 zuL^F@bTz*+VBINau2oelM4kFE`I&s{LSp|yvOKg zl!bBrM)HM|Pd_++Blx2&jPo~=pU$TayDCf_2>X}*_0pxLUSlkb^EZ+&1pa#E_AM+- z9SD9T=39AAurT~cNWKvGFtBUFtw}c4Da?TSU2Ao|udcAMC*MBKoOAEBF#JeJzVP$$ zsl$(iFm)iH6yPVm(cAv?7w5e}IB3Xc z8yjh3-~H6l*2WTsjV0{LL3go zOIW0-H3l5v;E%R2Y-}Dru(5*Q-0|6Oeg#L%1DtVPJbcY@t}KB4`Z=oO)qi|wvc?}{ zVc1y77jAw&V>{mZkCBGYxQ=_j`>Vr1g)^=yKk4kQFm)i<*aQCfkikE}!mzQDF9d#h zPU^U7#eE;pn6Rrlz{cLR<>N_yB#07;<9mcji!-ik4%w09rzJwq1Z?cY+sBzRvF#Ry zjg@?2*J`ia-*FYD4y0`?Gs+!jK6PDK7wlvD+tSBg&MS=ldOp?ZCo?Pz8=J5HbUOWK zrqh3B!kEyvu~Ke#J7L&Z!dc|0W3RBw*22cdj@B9BJT`=J z4oA%!O}<6b5~PtICl+UGmp(I59YDsPW`>Lv4mk`31^e%2nT<(g<)g!@X_;FmY8X;Fp(oM z=COCLUU{3&9AjbFSjiU>-~FY14!7Q_G2?zDT3;s|H00+4KN7@0!NRbyk}ur+d@zq? zh}u}@y0MQ>+{TgyHkPm(`}n}d20_y;8W(3=H4Ga|I2)hcV`Eu%jlIG|iNu)4NdFl?;kXW_HMDfdYW!^Y;32R2s99bsYESjkV92WMRc z|4=IfZ0y;8yxi0`oeym6Z5#J8^Q%!7hK-f{bUs)s7W~l`hK-f{bUv`LA6Pr0M`Jcy z81q=kPv-+0+kMBrMh{~w3>z!?S@?|Y=vXx0JcC4StjdQAw@C2yXUt=l-?8s;8u!;WYURIArwt!?Hdgw{4BKa5V3J+OFpt$i&tsXA*e6dN{v?E{ z1Hr~ha+HN(V()9xJ8cTdz96#u9d8pFDaVOU$T^Wv(0h z`Q-M8=(4qN9cNxGtqU}E9!t)dd^Hg{5)VWhD*|TnCn4w#REMu7hgv|qkChbWu{!8^ zEK?Hu`(fj3Ec{9Atg+9@T`NxX)il4btyfwtfoRT3bJbZLO`J z_Bq4qr_!TMNI~ZR^P2`u$0y+SbK|ZM7Z60epS3u&r82KK&H7 zwYGi=+ge*cg>9{^pTf4*){j1)qj7=&`-pXbAAiDb>>J0h#|iV+a(`@Vcam-89%o3Q z;Tpc0Tv08o{r8g()`T^T_pXF3vI2Z{)N8`z)1=lsHC)db9nz{@V3vosBKr}NRamH61(q+z^wB`jS0_0m3u$p>q~WLHqA#y|A~5a%Ryp-n$Zix`kiJGddy<)`VHF(=9Bus?`r0cSeUY z1Oe8BDG&BGQEwuVzdvJ5nE0@*+N*Kvz|v3V*gk{3!IGavp2n>M zhrXIp&flEYb^hv6Z#^c-RnuLt&81;MP`WnB#!6iX6~3CZCI%gKZTrK|edNnJCBB;e zsNS{C{M3@;sV~M2_0Ob|n}zYNRq}<%H|KmY`)d02K2ywD%~2hM@vfDy zXs4DfI>NypZDG7?&BF&aR`8oUZvEz0)}ws9Yn?ZIP3E(^c-JaEY{pm^HdgYbX1;dE z`5W=c6#8nqNy`)ZYBD~YvhW%2`1m=&!mzRVeE-14GBnPQ#6a-Xbl4qVF}{@Wu2l!T zYdzzs>x^$I=KA|#d><2Ou}Ao?OCS57aL|yy-A{G;$qWm_#^&okp|2)$hCKAuWcp9& zt0_nSneFtGITnVE&DVcmV;TClj|n!m^h<3Y!7<5KQwxA)De9|f?$U|5d^L?d_4n4s5{8W>%r-&nm*)rvf3$^RWApIQ^H`SH zKVMCO^=*UwO!RGo{Y>lAopBJDvU$wXym7&upik z%&{ zewu3Qhx>;o)N5Ba6?T>Pq8t0{MqyWL_s7Dn*49s9S8MC1@X=ITKk>ay8oTg+NIf*t zM^lqxy0~7uTE1lcbMFlTyllaTCe_~Ht#S@ZWtelpg?}dKA_$7}u38Vi=Z@mMYi<2# zyUKI-g?}ckE%{%ZcTMX*;@e4i=2L61^xFWx!t7U~Pv3p2=c~lWIxzVZ{+XaX&R5rE zv#Z)Y)6A*zezmi(tL#(K8~yv@3cISc@9^ONjqyjO(l!>!f1p`Hc}O7Ll*{q&O}(|+JYK6QM%)x)RL z?zz=|`n7B|zTKM0r;hiliG1qV51h!Sj&HYm`0Q}>1G}mNzK>4Wjn(~;$fu6?tBHK- z*bkh@r;cy8Ci2mCl^TFu)j|8|XG&t9e(HF?>X9e+eqawDoNHx>p1EPJ8~f^|?J6;0 zS9QRd8^Uhv=ac))O=7+3*te9(XWH;qNB&ITZuRhiU1f;+j$p1E`}9-C`&ExTx%UHm z_~hOX?BSDpKd^^S?lU)ue6S9DuxgOz-~0CicP!}cQofn0_X002Y^vLr3H$nVVNe#cCI3^Z0HBHZjO@)Sh;}~t~+AJ9~T2DUx z6gIWCehQmfTR(+Ot*xJ8o?2T!b?gI9d?uq!t<+;v*CyFiu5Ckp4cFKMoG4Qr-)K$b zQ^z-2J$$hC%X(${Mr$IUI`%3h^3iL*ln1^bG+g5wt%-c<_(rRT57vGuPo{UOiG1qV ztCYy6j&HOk@~Pt+t%-c`St&!b^qAARJs`!!9kh2hUo@`ad{os+8N^ zP8jc235zuTdJV)mtH{62)&+j~C0}ah)3e^QM7;jJTa|K0bP&cj& z@!fMBu0H3`j&F>3-9)At`}q9(t?oC|!Di zVPBykpMDDan$~{``&z62(7u-Iv#-uK<&x|x*RLUghKu*Fy1y3hU$q{5<680lwYGkW z_pi0}Q-`mJ#P?^#``0u*!@hEy&*XzCQO{T(7CtYo_pdm6vo_tnYX3_L*S>S@Eo`dv z3EdCz-)A!lo2qr>(@$YjYwM@5skQY}*wotkDfTqg)=wS&mlB^9U>{*qH`ZfQHx@Rv zu&H(VUP|nXg-xw}&lfhewtfnmT3bJbO|7k;M%&cwIc@4%C0^4#v z$yNG_&d@)9>4Q3MH5b}fEV_s|jfnAF0C`wGzFMA{OD0d0c*bexk53IYr^g|!trbIH1OO!7mi=^@vMax=T{4t{27Dx1*hNA zeE(O!xcJafcS9=1lnEDGJ5#W;i&X&}FNdoZfebq@i;kbWM~0pjls{LM zS^C`6aQvI23P<^sFX(hyxea+vRQ7|RGJMS4uwM*W91dR|wmOgmZ8jhAwxB}DN(`&s76ivXK(%g@H3GLpiuA%?ksD22*hY{xWv(&|2mA`Yx*a`Q4Xx3MQ z;E7h14F2-#<4@f6^|S8Vx$BQ%dhS=gcjD0fpSW+WNuPX5+evRYefIrlJ*TfuG5zv{)dzH{;xmW|Hxl;di^^`pWODR*KVHhC!N0SsD&qYe(2QA5C2A| zTQB(N$&-h@Yje|2b$Xxczk2f9{_(NRbHAn2j~@2xlYhD9^PBJ6q|-N?vd_fd9`p6h zLvPmUFMj-xiNAjPW1E|=*6H(JK7QgOcRjJWyjG{r+ESkQuj2-7xptvW-?!t<6UTj` zw591xoqok57fjrL@hi4G-lo&<*!8xFKfiAOE!VzLr?-w>JMrQDUbSW8u{wQF+dC(I z^OvvMGIxwlmo}}P_?WtWv$_77{Z~&s=_5kFV&>9`KXCY;yMDpM?scUt2b=Q0HTtZH zO~((~a+Q&9(flbBr+np!&8`OX3DX$W6cYYtkm|=eB9*|NA{Nv+wLk@=BIX)8t)y-g)MpdFGjCe)GJu ztH6x^x_gGLe&)I_9o%R5^T^HrwCW%FK5}rA;a|%o-(EFm^mPZPS^j1|x9V#TUv%&d z!~cJK;LcV5`v0aMTxRCyv3Va`HSR}$|N3Dwe_#LC1*>Ae4d?fZcmD32zr7-y|3^Om zm2<9}8p_AG=~tceo4*X@=T{5<*V*eI4&}?P8!K-gJ@bFPdajfHs~K0l_B*Hi?k{}h zHMjon-u1iJ{@!W7?%x*dAL8^caq7qRPjLEQ_u!rT-SOR>`P_bY{39;?_I{T?Ww-p( z{$Dx#`+@3;PO#(@VN{=fX^OAgF*=I8CJHyqgL%wPHZtp{c~^ZV}Z#DT0c z|NpW%eZZBEPmgIlu-cKIhxWA`aOLaMYj+-S8StA2T~*2v#W zA76f8cJNmRCmH!WGIZX7m2+M`_|S7&{@0y3?m*_1M-P7GYdXAnSib{*xvS}5%eQp+ zvLF0(|5dZkJy>-_hcBA`=KddVjvXxfnMuF$nf=e){Nn4S|5t~n^|@*PSqC=0e&9Dc z{K?;z?>}|hqX)Jg)!~1=YRvxon}@GzH~MD#!Z%-Aw&jY|`~E|xzx({Q*Y>9}tLGYh zb?V?DPOhXPaZw6>BlQbXshUV!=7bgvGd`|;(g$6>x2N_F@b-`%kK0nF!~AOBGD_n)?9bsgsW z{d;wI^zXfB!YBpN6~~9;Cy`pJ!Kp4f1sL58jdTzrCzw^~;dAJqLA| z`ta-2hp*@`_2GA+4|kb#>cgdw=Q2~C`taM(hb^Z5E1?flSP!+P{l9=doQ(A{-}I0A za0S*=VERveI1=lv-HfjS`tWA1$NTkouZKQ-5bO2GPjvWE=))glJ(r!S`L`4La4_^? zLt2N2Kp#E@eHc8g!@q+*{1Nowcm7O=pM*aA(Yt^D`urd1@He0j|N1vCy#C&=bogcH z!|S1sHvOv(KMsAkXUeY+y!RhEJRSOQ>9@BY*k$C2`taYe-ySt#U;Zkf5BuL6rvD4{ z;c}<^lhB7xIQ72+ec0x-pMgI7uG7Ct=tH;v_0Wgz`0j;1bjLpu`f!lLpEb~jF8{s{ zedzM{o6v_Y|6hbYbm!*>(1-5)T>yRP&M)<$JOBR-edx-^3($wI{7@gd@|cI)FnCXg zsSmGu_pc6aTA}5O`taW_dgb8zcj++o;fA@p4=#E~hp7*r{CUg4wmDiJs1LvJ<+6kK z$90(cu=W>254PWD(xDF*o%`zRfzc1thxcB$`SmuVKd29Xz4UVj78(6QeOPvS-*aXf z{X>2DTJ`y>-#7Y+`tVC@YF6(u`iuH-#Mk=e^_xAn*z!X z``$l)`K!9F!aOYdbX@H`F=b?cBRLc}{+LR_4_gwm-cujQ7j8t$AnrjI;MInYWaAKvO=}eCMD3awWsB zO&I?YXvm^1SGN4p&;H^yg!A&Y_2wC8Pg$^~>JG)8AUAbG6~8yxP`$|H%s% zFkJVswih3H_Y|{d>m0P>nY^N(&U}6U((nDC^eo0%-^v@(%zFY|0(;$>6KMx@>$9|O z=_Kp7X@&A;<;%*O?gQ+7MhR%`Tlbqe%Gy7`MFMp{5=M9Z{ZQ7$vi!v?=jf>4NeguFI%@hQJ2gn z0(qXbXwhOnM>oRI2g0LcWF2~pwBLuM*xeic8{K2D@4dU?oRv#oHpBS0M}BKfYS!#! zZ;u2XEBJI)rXT|XZXTCrzP3YrSC6_y-_k$*^;I~_=zR7){#mcD61=Hvw&P(Qzdorm zubXxLuH%R=;FdxjZT-?V<5&u>Y+r)=jKLw4+vRWz5Z@gBPb?aqj=|DB&0HG5p^ZGuPbrW>cqk8M?a10B)eVu6QnuoPdYz zxm%TOv$MH&^A)Gdm!0@~48>bLaXIXMW5@CPyx(BmGyA-r?>7Tb zT~|CKKYIG%jZ#~m@yl$_-MZX7ZhX(_*z(Tzo6cHg?XjbQ=z-W*^gZUmZT$on*p|C0 zXVXu#&;2HbO6_`Q{cazaPWbV@(F1Ne)3zbP>XZjf*;=Dxn3taua<>ij*!FDww!Ooq zJ=>2H@=nTW&(?3-n{RZd?MMEM*~{-R*zwu=ZF}veJ=>2HVv}~pXY04^y>HsH{Wu{u zNvAzqzikgm^0ECmAvP)0NPg~tZ`bJWGnOhB4(JE_eHf(OledF**QCwLbvxDu;6pBY z^$mnrpmmb1(ze-CtYgb}<>#@Y!G?LP_>{ql21EMgFI%^zsU9YYMSen0!rj1%v>p9E ze`3$+cL}zSoTox8XlL&C;X4+@iF?-CzIODx+Ka>ZcSc@#2<6&-a1v}2IKP{B2|;kv zg+G7kpZYI9^jkRg^A?0jBM!LEe(ZQ`|7^VV8Sj6(it8%A+vN}4j6Sx*u>{A${{M^V zKjZ!xG{zu(`o?GfV)^ooKPh|R<EaP~8WAgV6+9dq{ zOns$W|6|3Fr{4Mc{`ND(w$X=$^rwF@+eB}_V-frTe8<8v>qPnFzcU9Xs@g8=$?I*S zr}KLId84B&hN%Cza1}a z>V_Zr`mXqgU#|V>KVJbJ&>o)uM0z{ViVuz;|D8EF=?&-gw$amhz5O|(w~apcJ7V=V zUQQhU=MO<|zwqBhZ;K5Q_x?@{-u~JDe59;!;(fj6hnd@rbLk*B>)ng_p6igUlR9eH z4@WJrdYd|XIKozs1@c{6-ecr=SXW_vx}KiI^(3$DrS;p^l%oIaTd1eo4zd3u;Y?pX z8-$rk9eJ?*zdiw{s z%TYMpzTWf0%uao@{!jI*Wx(EfJBc3OIM|Wi zkou5+-6H7iPegj#pN#*K@CU88FIkKCY5WbLuV{SDi^=SR|A}1_)c*FyF!qwQ>uVF) zL}eqcL-gij+p4`QS8#`oy};c<{LYDXT5j$7bbYsVyY_54)A-K!Vo%5DcwN%w?Vb+P zA>H@(@%k=yLDKJGVDG2%a_aEe?Wi6P=OXjal)Qs%;I8aj=T=vL+RPct*t|i|IfpF2 z-TEUs;=sw{0N>}fp?a&22ZOdc+HIA$S5D+7cDG(v*0*)rwr#&``my>|*;<)S=4=hU z^Y@y5S>M*?_sgbt)i37Xkx4hzCF8k7T|+umUt_B}DL(mChDNPkorzZ1hf$uUIs9^) zx9=Wbclz}8b_A)$>NiJ^8OG_{Hr~${hV}l+%EGwb)3!eAchwI!UAHfMMYP=qhJogg zX2S6^Q=W|L6I_9Rv0vZZE&j4zOin?5!zxo__q;v>gQax+NA=m=k8VVt-F*l5six~Q zfOo-9{HO1rVClf|eRs#E^?hr|+M zwvPgT-a6iX^dH%$dg$DKZ;f6yP>o#20aBfUZD<7gJl?_(oN(ZSiO9rapXY^OG znc&IHzDjrlpL`%s$fvo=@t{D@7#m@&@r=MGY1O9!fP=L}L)&L6DZ`XOra+QDkt zM(vL~d!QP%Y=9aL-i$+D@@fS7#CaJov5y)ur=J>jYCkn#Odno3D*72Tv2XS0!}eY^0jGX}Hvps9CEXzOF_+*jl9?Xs%HA zH^$YyjUQL{WUo@0igGpO!Xaw*wh`*AYsRb7tH!En2v1lO6Zx31c97IF{o-N5!y%Bt z*lfKc^xriYQO4f7&FImM)i1gMsl1wb=w$qL(?|(#LXG?*eAEE-8ZJxt{ZCA zBiGlUF9~&j)79$U+{e|_i-w}iIPh$knuxY3w^PrDylxz-PW|X8;mKI6k&z1r$od#w zg7u0y7&Im1!I&wd$!`8`NWM z+ts6=s8tVvFYL#Z3!oFQCa>JKO3l4ul+e@BpRp?ksfm~qt`o`x*UwnU7j*)41sCJs z$rwAwP%}=gync#WR6kM8|JWGJ?HKi$dz#g!?`l$?zOxbj4)r|f=k92fzC3m7wct&? z+I8c0^*~Fdx^G8?y1OxcLa`RnNh^FUd_(%XUmwiyJ1Xc^JcKA4U7^8TDzn&)(Ij_QHMk-WKW83+M~`u?IYP zlKi--UOluksqRM~VtoTOXLuhqdsrW7llp7a!U<}?;2ChURR2MzsD1+`s=ob3t3G{) z?H)3%fAy@(N2oK?6Z*w(=Q#aK7Z%6;=XWClluJKjp_^cwV)q4^+J1t zdj8gWwdbbo>gk*7)Z=Z}Kt8Tf8&;f7o~o&Xq5J#wQv(MM6gO!2scO*BxoXg`)6{_2 z4ApPoWb|RY>f3+JTVof;cF)EdUYMJp=6-CHnsvnpHEGRIHDT2d_2qkV>PvUS-IG;c zy!%@9g}bxrbLi7vwEvkqu2nDG-k_ejB`x#u#3!$jw%I-%+a5G%khs{01!^GLA2?(V zcrY97PeI$`z=Kh5jX7)3?wMPMt2tMWMEfJ9{fXxdg+3XkUb??Y+>7x4^u9**;)6TY zS3cFEzI0!+`tn1cP+$1eb?S5XwW{au$cmiWwr%?Z1`LpX3?6y98a(n0aRUa=#2ieM zIq1`G#9Lz*#dcHY%)J^qJvmx+26-=to8v`u~Co<{Zgdz+;XZrh~o*ar>MyqESzouy(UO2CVG(uY2Mhwh#+drb9g zjD5z3hpW?S$EbPOS4yy+=UhHY9enC$^*Y=e&)%U9J=3mU-*da#|I}^jm4~lWFF$;} z`qPK5Q(plezWBg(1-zH`hfGm}22W7^`}bD^ht0#>FF@O;t3ku(gFY4WFcbVAv3t_^ zkxMz}Ga-WuYM_6%k5>yb6V#ct6V%F2OjCdM>ATf8UbtJm`TSk#>(AY(UfXrO+W*8& z>ea_@QeS)QX7%!}whnExee!(R*d>Z{z_AY;I!EMh(6IR;3v9nn-@&2-7k*@l%=_{i zr>Nzhm?Cm__KrnP{JF&r<^+hg^q2pZ>BBjaxK$H|M_uI_T{7Y3jT?XQ=b;n4y+6 zO;M*_HCp}ov$v^lJbknJ^B3+?Z$69mG5$lC6MxR#@bK~HsF9P-Q^UtDQ$xorR)a?^ z1n*0vZLWd7{YU4q!1(dQm(EL!Qm5CBQ_F9dqRzf$nkv0v8f0O#xchFtO8wa$wExVl z>KkyJ6Spm&?%RL78a}R6jheJZjhwhz4If{M@t-B*A21kWhYq0Zp-EO2PLP=)>8VgH>q%Y~gXzy1oSUbsuReF9`isxr zd(5%3ZR$3*FMYt+N1*+omFlua+%KKVbC?T=fD@t-67ABOe^WBvCVIKF`IY}frvI(O*q)9c2mGg9N# z`A^PK8{yX8KT90)6>Zz*89HXUZhzt`_$x&I1`M9EJLuD|)3LjK7{7eT?!`MN0uM}4 z=kJ=M&bweDw?v~Amu2`h)}UWU0}bJxrswaxZ9 z_MxMfV9bjYWv+j0^6ox;JD+pg-ZA_hw;zM9i9!Di7<>xHoX2^`XrovXWrk~}XkYsD z#hyEK_FH}XiEiySzl(LiN#}UjAKNGPi;iKY^{CCQ=i^N)3<1_o!!KfYW*0d8sWAob zXSSYyV&Bi8S?|+^_a1x7y0XQX_W&p(wiV{44*hvsg z8%w`@Zk^Ba2JLtGn-t8`w^J^LZN=Wt+xf#tP)9@ie?hz-uy!Jwe;6{b-I*q%^%*+_ z|6-$V>6x9#$r`wWsuh-%qVTxD<}@bnku*zXJN&S~VfKk>%deZN)_rQWS^(@u{IL4Y>1xG|Q`H4e%u@@m zouJMDzF%4rl{oqsa)BFnO1YXmXR{hUe7G7j zb-kJ}<6;Rbc^3~JTirc4%fBxfh)XH0@s!KmNUo8W!I{Wsi>as5` zP?vpafm#Xrhc7>@eth6*CG8)0O8xMaM}&U&tB;EBw?Aq2RyA$@$E8iSKY8w-=rH_= zv$v>~7#qibI?lrMH=_NsFm4%tc7j@pv*pI!bJfOObJe2kMB%Y*|GoWBsJCBwP}=?B zD-U`2hP27raJBFv1%^P+iUNiEoYClm_L8~<7Zr|CeQnbntIw*GX9B19vIK@ zFU(Ao@t;*U0rgH-Ywnw=7No|4FVobS;KLG(pS)Q4$!ThF<0Q2JSod74lMN5gk+KV5 z`&fJbOm#YN59P;if86v-AZJoR>NFXX>d}itJM+=EG(p?&@)BVckSIM{xen$c$HK;yksad9qq{+bP0>g^-65 zjQ`B~3BsQxusfVqF-FF|2zCgD{qc{Q06aPRbm0NV&i1u`vB(4aPae$KHd?*?;-_TH zOM#;oHcwECS|_L#w?GDPwmJJwoGl;=OK+SE9!ykAQEtVpQ`F)cCc#ZqtL~eoR^5-Y zk*9w~PcBo#$DE0^2i{}Nam;k%r!#!1^nD5Dbw0*Vz4|s}dg=9(W!;}qH(o8?F;T`# z-M19DauM>LjOX`D47Gn5EB4NLM8=gFOo0vJ9a`1L)qm#oAY zW)bX3t8SaF&b?#0$i2;H{d4b`p*B7>w@2+$_i_&+4{SZwU)nNR+J1N6ZngTZ>FO-V z*qXa%sukB^j=^)A&-!b3%~ThE{xtOy>cT_MbV#@PtWRA_9&rEdZ2XI^odn(fpy;vE zTe0>rr>EDBS7(7QOR)xQJ=S0U@GP|kI;vRvD`$-sy(s%O_h{%(>TvGWjI)mW*vi?X z)uK~i)0;k0`!hzV^`}ql(6;S^?=$b3`4iNtdDzQO8!!HHv`>s+u>#wD>xJ8Z7j}#8 zwrSkgS0FFjUOjKDS~Yj9T8zG|Et#n1j2qmoJ}~d5AeOo?LkDYyD8Txko>oBit7fgUGPEutHv^ z3`-o^TF<#h+jQs59VfC!pKY)nj*IijcFuupor8Wz8;ED$NHdN37oCE469}`6m1Fwn z(xKnv!v$we#u&#-y6_$G^y$t<{agd2IkrWpi#%ohydh2>xbPP^0Ry{karG}#VisM{cK65UP zeExQIS+AGdU?{WWNxb8tR*e?I)K+UY8ub4nRvAGj9Y{?q%^_dj!k`tA!i${hIR zUJnKO<>9$V!Umf%n`OA+V{HJbXA2<)i+Vj(?3sxGPLph{8vLDn#4Ey>0 z_9=T@b6OW^J;yk%#m?57U!T=6l)X~$pKE~a%9;Rg{QUm>Q|_o|*%o!4)eq7y^usTI z3G77eyvJ*Po9k?3pk2WK#D4Zbs^A{)`Rki1l0idlZ+_DZjda$Q-?ke*Vt%9Nu<>Kp z|GU^fVv9el{d)6#zkP+j^WoOv(y_lB_85P&EOx})BdgMXTg=Vl((Mn_j<&Hs^iTWeJI+r}=Yu@zPMH%S%WTWa z+cXBePwcb39}maEYCniEu^l^}aSV8$y$I9sL;jV(F+3kG{KVGccdW~nEFD`0O|v$P z4+8uV5|kSlJTPS78Xe!KPY`2G`a^qg45Zb2jAg3*-i1xK`p~9-m;^pd{|476+Z+6yavi60CecPkCvml=tS-rRb$z?#?}ZfB zr{fCi^W#__<7|C3rrq&h+Jf)eK~~y=fN>n}STBzKd&1#?&F99ES5+p>)7WR4^sdCz>7f6V8`Vb06g2It(i!8rDXanKfREN}B^xzagp zJ}p=IIiJt^#(ilE#-{V3e|uRU;y!ET0Amv#xN{C3yky5~^Fe36u?ViZdShO$7`F_% zlyQDOXu1yh80X|Gvt>Ch##1kM(uU;I_34q=d~TeckK5L0naqzjFT0kf%ts#Re7ZMo zoS(0&_2K3V*HK}+EbHVG{l|7K572Htjyzyq8^^MKKCdsLOT6(qabbOSE*&|Le1-Le z`ZR1ej0^jxE2&BxjLY#ht_`P}-jR=8fIKDS*Pr|atj{^@*v z|CrCMkL}t$!1ARqPRH6fT~_z7Fiy*Ep)S!qbmQ#U3iZ%`%D&~s*?d^j!Yi(GJ6<KG`oZ?*;2E?2GO-+Q{##cD!yJ<%;o)>twu6Tv%Tx{gZs| z*dRmTUm<>R<7{6TXV+0@aaIm&K3DGDI5!{L_2gOl;+6&9%D86S_3Osj`fMD_hI8cZ z@w(T{XZK_`pN$J;NayqG3-N(2jr9CJZR>O6v_1#|cYm||bK`72tOen7*ZXgNe)D^1 z$b)cSWqoYN#SC_Ag>gF8w#&6;$Kl4=`XGP#{oIbjjkEb!mTQ%I!>!N8`T4Zo$m;_s ztK)S4z|%Yyu;VC<)3Mx>xu5GjS-0%Q*}fF+-FhT$oS#qQ4b4-Vk8y6k5JwcY>*W*t z;$e_{9Qnf1Xd{nvET7#t%Rk0-GF~Sxtgn;)Nj`UMJU6xB$6)O_3YW9w-1PoF{kLKI zuwi_Tc;Uldc%K*E>xFlD;dU?F;)QFy@HQ`8?uARe@O&>k$qUE4@X@aoj`w{pe8dYM z_QLzT@Ln&x%L})A;TA7k>xH*@;c_or>V@Zf;YnUN=7o=b)f>MTKH`NBd*OXvc&``U z<%Qe5aElkN^}^e{aJd&Q^}_SL@FXuB^TJ18@y73kk9gt3UU;7u-s^>TdEs_1+~S36 zz3?_KT<(QSz3_Z5Jjn~kyztSNz43eDBVPEh7vATE_j=)7Ubx*0w|L=NFTBkQmwVw- zFFfB1Px8VsFMRYRZ~R{Ph!;NWh4*>ky94V51 zxJdfGBI$d*bYK2<6-jR|lHO7zz1B;YUvG2dZ(EV{@*?S_MbhUNNuN|CJyswsyY%7vpUL?J=Nc#LD>6412 z$BLvMHRmup|Ni*iFOq(wNc!O->HCVL?=6zPt4Ml#k@S`#>9tixa^nFFr_j>96{V4U*pa$QpX8qmV`IvG#nud|M~$-)Q2gPk28*2xjvK@dN#LZD$A6Q~XV3 z#`ABx4>j}^@NIsU-D=`L1b?%kH^DDA^ep%@4bAVHFw8nf;5pLJxOQ&7i!xjCGR!=u z;>q9LAzh88;eXW7XTUEp^wsd0#{3W9d9R_{;m$ua<9LN2Jeh9v; zXCY{gll72x^E_hWSHNFs=*Qs8C4S_80`xKy{}lXPhGw26hNi#B(DZHDJ)rfEN6i+0 zvB^XKSwlY$-`2_cKW*aqeL(zC34CUYPd!DN{u)EmXFkSLH>@>u8T@sIUJrk@p_zWZ zp*O(aXy^;zGau_=`UFFdgU>X^b6tMO(40fgE8{oex!KTL;a_3sKY@Rdp)Z7gxuF@i z#n2yy&otKa5j?Ln^i}Y!497tyOg!b+$~onw(!?j>*BF|9%Fy(;8=5}zv8~hatTS{P ze!ZbH@Tnu1hw0ZEx&eOH&^h?b$2?3w)zEX{GmY_0cYNZ+x&Z&Zt|11`2(T*>ZYX*O_zD}8|UfxO-_HV_GsIG=CPkLCy!g!&y&yZ z^iBF;>tcT#I^TapTe|JsLfY0@;G+)qi6548>3sc6?<7x~lb^Jk$I@<|z{yYA&12~| zoIIr4OuKC!UFO8Qw9U`@UE1a;LpRO8cW5_{OY2&~b<8l!+B{_* ze{6i<@QQglYfJiI8rWp|!XRl|PeEJEWAaIUhqn3MvTmJMo4l-_w9Owl{declonPj$ z?Y5z8nW>BQxO8CR+vsWv%%M0D=Wna&RW8X)>v2W}P`!pPmeP0E~GgAWYQaFy8eH;ll z6OMhH1;;THgRu`RI|+_;vMQxzEs1V0yhS3Ivnxh47ho4#B^!6nQ&v_ z*v4qM*>Lr6Jkt<6&Vj3fn+A6c+*~-OH5qy;{93piTn283p+ zxMn!EMIMrupM)dtQ*h+j;n>zqaFjXn zf-=LiM>`y4<6gKjxCh{N!Lbi(;W+n~!?EvIz;P^p0!NwI3ReTixgbx-Th1-#Bnd~J zCg3dZShvC@fC2;q_aZKzZ=kzW(_N@(WC)_f)Mz|Z{$RqNEeSHXy zWjVJj^C%o;j6A#!j%6uRE8up(wZf5C zT=+Za5kLNG`9Zlo+6QuKelKmUkz0y=e?IV`Z)xgnOH+SanrqC`;~bj%pN*g9&@&x+ zu0zjv=rbIede7EFon`4#hhFW_We&Z;p{cuUS?X0wQ+HZ=t3z*d=#M${)ec?d(6tVo zcIXC&Zgl7thrZsS+Z_59hi-T1yB+#|hknSRcRBPE4!y^rpLghW*eoW+AP@7K<@fBq z1KGg;Ahtw@L3a9Cw|Q+V|k+aLjIW-K5{ndj9;3)VY!pTKU+Ur zvvg;EXX(0!(KF&e#DRzd#W^sHS=P+KqksR7xrZQ%=d|kT>NWar9{GBxV;MIFzY=Lb z+>2Ppd5oClIFJ&@cz(1_b=%SL`q_q~OxKS1u?=n7{rFp;*#$a&WK-89o@|4kj=p9E z+tKMGzJJ4^6|cW}F8yWj5C60&|NFW+&mZ&Cohz3PdBS-iX109$CMF~lw>99FjJZSJ=9uKb8c+lcRT`qjC+q^EFsR()j2es%}ISOm;KuQ10 z_eFS6&zqe)*Y{}~CND{cF2aK$FSMk&VV~~EKV2qzMjVJZ5OJV891w(L@L;$@+mgq| zgMrz*ZSIc#=rD?TdxQtaed(L$xz6kp-NJ)*Kkf_` zO{mvmKa237=AGrAzc*Q)>Rc8NTE2CK2fzPZgPD`EHTS*Q)HNP7_%DwKHyS+Hg`JRi zuqhkBK1l2BaeYK=x{C*6uSIw;#C7Dil?N*)HqH(EacyfNJZSmj^Usa9bVvR%Ci+Ai zh&T{&pnDuRe*0kfZlvp$`h*a($9S-CKe26eZ5u@X_0~RU_v6m+pslHJk78`7bA3GM z+6T{qeXu;jgCQFodrmlKmX|u4#e}uIHNX+q=WR=zVe5Jd9Ez4n!RIL*u}74ya4}-~c3c z{k}Lbww$hc;^^FC;lY9m?E7NZHb~lFjc(Zo?S9-D9t`_rF-u3^$Ai9ousy!1XU^!6mz8E+43qQSmU+h$PEIioh{lVVgLAxJ!h6hi?`{Kh9 z9&`kyGc0H^w$5hppygYy@u0zfc|2HU@SwqoPUnQwcyQ*H#%!t~7aZ4@N_u1;EI$S+Q|$*pG|e7l%Cb`Dgj&`W^YlnCKI6AmTv8f$njj01tL3(px+@Cakeb zJh-R%Ql{lUC&E5x_v6m+V847zu8w777%pZXjQu>iKbU7@r?x@MOP$N&LCd#Z<3WS} z@_4Y`;6Z~E!@g;Xcra6+?2Uo2M|d#y^^=bWLp!$}Z6P*@?1Pps9sS5Y*pVkuOvHhR z1Apus7)1tj`TgQ!y)Rz6bZG&O>x`3q%r7;t4Z08N`^9!Y?hFrx{j`{+qwnLv4)+Hm zJQ%XE2Y9gD@U1I6*zNm+2LI*pV2ixO;0BmZ=n=oxV!;y}cK?r`8Ff4_KOz7IXdgLY5I z*C0gqzF%zjV;>L7rk<~m`jnrJzK;ie`{3aS4{Fxs`RDIVmZv(K#ex7_jwiNj5rW+;E#m^ z(>PFhUmWx|e*)bZ`mx>@hd9b9;E~Rr)nh!^8~dQ$k2}MIC*=O%FQWT{;Z%2q1v|%s zF~hg6@L;#UUu^JS9uGcZ@SwqoVc#^hZu7=eI=yg1GTA^Q;qjot9@z(Dhfh8p^v4*U zpEU2I_r)DKWMd*cXgLx25eFg;L>#ajaNZYp@&`(e{k}Lb_BC5qM}Ke_)nh!!{muN& zjQy<{)X_crpxuu@Ox7=4pQ&%mCUT8E28BJsgNMHr;lWTII0aT7==-z{+k7@p z^!?(Hhn7bnZwk}8N*D2u9uWs34n!R21_vBGI5)gmXAAZg4-T>w9q0E+ju#Kw{rF_z z!S)CbhBMm(JZSmWYdmQ1Umg#B&fr0V6P?Zpxo-0X*~AC<_v+gJXM_hsyuvB)@rsSJ z_(rD5&-Lntc{rF_z!NUv0L4y;W&I!40 z^M&=*un;Ek%2@m!n+JRN_lv(B;lWTYI0aT7tgP5LH|)nncrfIl&p*pI*YC(b#zdcp z0}%%z4s?$Lj(zYXyf1bvjy=SKWyo(GzsH<+-TM0^$URg9Z;8oEWyOsdbw#PP8VoJx76IMLl|79Q&&X4~AHVOr%^`-=}TZ zP1kZ1eZN@qp(Fp?cuRNWpRhc7L>!1X5OJVe95}gnF#LLP&_g_^?+)ts#qL15XCJit z@yWu2c+m2#*Lcw2zdRm1Z1AALiDAo{0v=4&)Z+eNu-s4TZn#Hy z@bGscJQ(3Ye?9azOi?{n9i63jSG=Qq5eFg;L>xHDzc&-UFzzuP40WG7OWnhRc0cY6 z4~Df-xAN1`_rFi#|K3b{gaC2|9;@Xz^p(0oqAW!?R=33mTtrE#b0dhXM}NXdhh7MwmR0; zF+H*my7SPHKZQK(ES+)DC*nZFfrta$;Q+U}HuLvMoVUBC=&|n)1_n=c-OkuBN${Wz z&H`bbjkErV_7>{{6s%ZDxf3wRn)7 zaMzem+px`N{_OboNqqZY?EUEeU?CsHbybUWN5JQ(|4ga<<`LmpdsuySJK+^`=P;lYrHKL0G=T)!j# z7!!RW4n!P?IM6)~96ufm-z|0BQlIe0pFdDMX!qljg$K(cJm^fiyC=DHn8o5j%eP+R zL4*JDc<|Q-4;q{pwyddjn=fsus_D(2FYej*iw}Q4!h<1};T%vdtnbq{?51luiryD% zK6K=t8*k~3{1cW(kB9>i2O}Cl7VnGOBRr^Cm*=0|lUzT{V)3BmTUU6n+wY4F{>$URe=~T{;KZWjTm;bF9V#M{wa>N~NxFBfv=5v{KFs4$DggO+c-#)Ag` z?MHvc3I2iT?W})K@_d@u1dm$NTq5 z?0$T*@L=q3qx*xQc-j5P_rn|(4_dzU8V?%$m&b!63?4K%F>F~=>o#wx%qAL=3pXVb z+jGZ-3VVbHV?T`WV1x(#_0ZceW%*cjbe68=KYB(Sh&T{&pg0E{Ja`g*kD7SWd_GV- zX!qljg$K(cJZR??eph=`n8o5j%eP+RL4*JDcyN-zg9aytEo+K+uqoZpxFMTp_S3o< zmW3jZV;2xR*x`30JQ&Ia8AchgzE9h*o33RlvJYxLbmX5KZ|RQw6P8DhhyxJ^A`Wzm z11A>`ItIrs@!+23OU+)PJA5L3Z^rJ&o#Dao9X9nSKOOy|_Xi_9s9BfipWTyOKg?qB zV7uX4ukoP4e|bDO+u%Wi6T_A@1w2@nOnh*EpQQc0laB|TwPl7|$oscPeygm_q-dFU z<=p0F21}o;-ygJXSih@&xaqo25grWZhTL)Isw3T5x)h2Y5eFg;L>%Y_2SzcE`94X< z?EE=f{%zyx>T3K}?OW%%I;dOUFV2SYYGcp{uL%S)Zj;z7%|uJB;De{aU%zdRm1!{9-K6P?Zp zNj#XzG=6aR2Y+(%@t{9OpZ5_S?8qS-)2DC0pgVXvIA53euf@|`OLje3x-*}B_2cb` zBR}Fm#DRzd#W>*F2Rr6H79K?I0=r(v(m{v@dyEImP`7n%&E3O;FE1-kiSFie!n>Of1>+?ns=6e*xx6iK05Yic$mz*v@wb;a25jAf$Ypah&a)A1!;)u z*7u9;etfd(BQ#2?GgI)6`N{KiSao~@Y11I}^aemk8DIUz* z2nuJWdw9_9$DQH9us*$S7TPYDTKw;mv`2U_WMdETpygXvc(B{=iw*wEWo52b(Gyvx&+^Kc(B@9^t|EU!HtC*su;WWIKqR@q`Nr8rNb=NK4|&YYdmQ1Umg!`HF(hA z#IR*et=qgc+0u(I7o!%DyPg?n=3wa;e2lI^SKty=3152Wa zhyxJ^{^&VSU>}V6?C9+N;I|+7(RuavzhmC#`Xvg(&YpGLc#ywAXnu!~Hp6bcFSh$} zXLwNG4QD^Oe|GK{y+8PO(fvWqJIg;8i$Vew$h@U1I6*zNm+2LI*p;KvOfG&nJA zSyRA+wM}&u$9Z*7>gbVuF!pyR9}oIt)bbqiKEi_?Ib>rZJZL!)`4I;q4n!QV9FT2p z4et+X3}oZAf9(5%fx%OSW!#WhA9X}e@nG-n51ReBGdvjDc(`}+)6p-62g@Tos9Bfi zpT!}rA7-(5(DJRF@qCr*!sYO&8b}D2Zjd^|9yl9Lww3vaMzem+px_S z%24!ul8_f#mff&VcjTWg6FnmiL>!1X&>aqhco4ZAbDl1HY&=MPbnMTFF!=+;gLXeY zS$MEL!h_+=_T>IxFYSXHE?v90^y7Vkw%_dQ|HaF77bvt_kZ|eROU{27=I)aEWJ_aE z(vVH=2ui9FjftS7I+X<&EJ-KuYzbO}ok2@osveI7LZn(rl{92h^^M7FP?OCxH3T~n zX}TprV{1b)$l?AW{pxh0Ca6!;C9hnu?5ZG_*paLXq>(hftrchFXNj`&IZKip9vNfnfpIIG8+>pu9UmRqU=|m$6u>E8@ zSr;^cuRCN?^`x<-Y`&$e%zdH?{LCh+St|?W8nag}1tWw`?M&*C2PJH+q&l0aW9`h0 zCYJ=2WGdUK;pC@N^+{yPpk|Cu%L61vW+E5VGdUONX9-4w0p^nFGzV50fT|2in(C`E z@rtJEKnRXZ2&t+vQ`bNl3F@TL96OgwCbtLGnaZYIyb9-@M13V%%Qa>i7@0`NQLqNT zwvh7qzLH+W56iiFB&5HK@k@S|nFy(isf?s=!tiCx;S^_&!z> z7@NTiL3+|CT~d{)M(1;hOi~yT#(5& z)@I^4up=2%;dki`JH}` zn;M|QbaT)lRl3IwNl=)6u$#|Td5UUaQ2IimD%k*8C8Z@14JL98kic9+s}{~2+D*p6 z)y7nPO)ij0k89z9_$|k(1vlB3T->Ze31EU`qLxLTJFs4AfTx0FRb2*JzCI_-CF&}ehI(ywkWjdi2vTw~M->(;eXLZd9BJ8Rqrzj7R%cRO zx~We3TLqQGi0!HR?bbI@*v)Hd83)~D>aNKqc0l7XGM%cHI>~#6v2jS3uvF7Bnp|z7 zD$~rQolt<%2na;gGmh$AvSGbo*04Q@q!>S5+k_2^`ZN^J#Zat3C9=DeP#Itkr~sUR z(!_p&<;4}2sgS_Zt3)iMN)chvUiFzqC&(jBA*aNdaU?m+OVp!_joAzB=8+{Q_djY!!)IO7HUI zi;m+gKoWs$v~JIj)rl*q%v2Bu8lDhWB*C#fA!>p*XetCF^lEXaJ<$L0H=;IG3q_WtmE&f$4<{5^zyR zw9pfAlBI9=Ji%{B6@kS7*l0NjwRX%+TEm@|3_ zlaPv_Ss`SEV2k+x-pnMiv>^(R15E=?8VYEx%8;y?2-Cwv= z@}Wt>*F4o4k~@P$753q{>7lI;;szLpMJZaD8>{pH+~t?U7+af2XRyyV;K)`V2b-{A z>pZ#bt-?(yP@Bo7cH#u4SC#0*95@1ov6vf+pfIBXhb^-wK^vrHF)}Z;M}3YfE74dN z=VDD&*-)z9lmHfp8_{4cXqHqx4h`sl6HAFDbhmM~!(7v#Q3@vk9MH_*p<|kWwCZ&C zm_c?Lt(P&6%j8^F2i9D<81S$Gic25xsP3DWI96bz)-+WRpDsVb?tuk3k8R!bY4R zVB^sdXJ$T^1T|PWIcZc=%)@mZ4-=dqQ{6Qx1q&i1M|~=naVn4yE zs4e5^fZh`QL98OIQ4))K9+DvQJ3aO3jsm5`X8b4c8ffK!~J#L9u zgK6s2IsgPJQ0Oo5DZ|u?ILe8DSX!W~25d<{1wvTh3NGC&4uDmO>~={kL1Y8h9ZqJX zD1eYY*a>7ewq!n97KG$yCLPKrqU}sGRm4&$hh>w`Nm}xiXcJj=Hl;O0HSwqDi=etz zHr|$2Nerr5fdDa?K@O6oQ72UhLq?mBgn@~S2c_W#sg#L9Hc^0x0!J+ga{zWk=A&K~ zLO977?rcC^LH0B#E1kVTVJhda=unZ^cgym4$TI2P!WwT`Jw zXHZ&>+SuBK5L~*9gR7TqiPkohB>>J{dG=L;?K-BQ2gF)DQA*8HB}@!f9Wezn+5kHX zbPcUTnKYLx{UrhRdY%|yPQ&>a52*5%25z}kbV~x9%25%lR(y&nOAdNLNfKL>4wpy{ z@(z~HOe3ldnp0pP_hn;TAZfN?v7xeHup>#J#Nj3|KS6U+HpJS+LG6;DdT~&V=TexL zF!NYraunt~LEKuBBxf~+4K-7*j}t5}h9!~1M&3Wrhdxc>6u}=n&(+}!Qi*fA zk#rsnaD)s{H<&KWhpwT0bTJ=G%=l@`F+30w5?S9A;3*bW+45zT!H`!&%L-%2bPBet z$6PJ{{*H!q&ETR&3HTe0v@ND<_3X94tknv~Qlj%HXwKMtfkO1XISZ0MS@MNvp`fq*Ey#>%vhlLlda@;06}@VsZuk65}tX zAw`>2bbLMxDO#e@4*N+9O&v^yt?+Pq6+fMUF|?$PUK4~x2+Dd%9U8!iw2l@G_{OUf zzLwM_VbO)<&xE7^Rw~dlQL~IbUePFl9der0ru%B4X#z_GX?YU=vnu$~4tP|`*C z(nqj__zwzG1O`G;8&twz#q9zwA*xb4j0b&*%?^8(02Y}D<|(Pew1{yJ7AmYMvIYI- z>f&aWgLRMZ3!3ViX@K8>Lmf_ZIL<8#l49ozDuIHrDOQ*jO{)>sLP=FKJ8vQ@Got6@ z$zE$2*%6@L9c-{VNCmkomn?@VE=S`ti$V+=V7Y;LC755rKyJbO1wjc^1dw9Dt^!%X zP%raH4q!>5d&nQqx4weWGt;y!}jx@$nlcW!6p{ErYDZbH=X=D!J zDryy4kK39?I6jQ3680pb!xFtiVU49=7$S!al!o?ffK^z`f=xTbRvX$pY(yird=#+K ztEX`*0fFw=#d$e!N9q(_Y~ z@1X~>q6GP}${cmRv1Hz9YAdQlEobZnoqTq2SV&5pIIg&y^BB7t=pYcJCxUXsIHp$5KwAh#{84SI4;3mO{5 zM-E!cME!}`tOmO-;J(;VoQQ;2RKf_z2D=kRRO02Bz>yN{k5B;E0CRY65|m(BwqU*E znMrFy2US2^#~FoycMY_FNCNae_L)F*dmQr)g_zPlLPzmr& zNzv+u?`zGAFzHZGm1zQqHl_;ph4~;g!bxkvIy`{4?tS@d2n0;wnYjxW=8lErF)lK!4qNBz1 z3qHiFQ}yybwvKOwA#IRKYIeO_3Pn|_<0$leDVvfLyH-o_d>FRaO1!Z%?`65z8?oL3 zs_2~j>1a}@Q6f@&-H1gF!!^JcB^mF-np(DMQoq^_mBRL9vS9mZXh1`*&$8ZTt> zn=!+2D9ubIPcwoz@y0*i44W_B@8BRKC=u@{8+9;LmXfNEV3oC*25Skf&LrxfzaVDR zm=*Y?cD?10A}W;bI7V*fm#r{w{g)hk`3K|#yN?FOI5J`gJUUVzVgVWgZ=%_t9Jq~= z)USVS0B`54DPKc-?DyDVsQdUjq&flh5I0bzq>?+d>~u7^IEyr!gt<=apIoxMgn%)^ zqM86-B;@Zl5{Y#k7Z8E#6fn^MZ?T{Q2Xsi@`2iQ`npnv0{x*NyqJun>fMVmR#qK5- zPl(EPIuft2G0q_432)SK+N;nc58fnr9A@p6i-{K?_bpriW*WkvW*|38lMe7;)*Cd5 zSokrX7ERz?bo~z4lS|~Kra2&zlUjaidBuV+fS_k92nlNA8qxAt;%u2f0<>6LyKa3A zY@)`-i)B?&1q3Z#yh6@?Mm1rkc!;5PqCPW0X-v1GQ3}Khhjabv8=y0p#ycAkMHX~| zQcw;NP>I~e<2YQ=+acRyGAp1|!@PJ7MyLuo{%0%ofyX3NLFY&U2uY9)MJAyE%Rx^E z)F$4s!c4>!--IPbzZw@7G({^WPOMtJni4S5z}A3?z%fhHL?b~`5ELUcDJVckYS=-h zVlWT8nHHDaA*!P+U_78Obt4c2)9Y@fWf8!x>*jb0Aesazyi@6 zR5b-vI|3Y!AYZW3P!ma=G-;HIfdsfkE?*Eq3lB0Cwd6FU6LXJSBRGb0ed=pc@E0?% zgpZ|saC^daBwjcJfT0;hmMD(5T&b;?VBS|V0l6nr0ipa4v+p%hJTPUTd>lpkJ6!{_tiF%EKIZxGmv6Q5JV{s8eV&!o@9^uq(x4RApY9 zapxp>6QH9Bdx)sQ4lgm*W`*!t$iBomG)Z3gfhomOnTimvNS8zKO2ZZnA_mPsOnBIp zuE}Xv;4rvEa3QqtPbj>~=Xtq4t=~LCYe^XXj#N%an9Mc7m+F@Sf?s0H4^>SKU@o6{ z^#BjkN{?G1v^x#6G`-f~%>s~H3WjR0g*#u36s88QO_ zNK~eioB4hUz#wkU2iM^C11++^VcZZ6$vT-L7Re=KFnD65gcNrm-Z7D>tbqMd-)$eH4Sv!L4wAUVheOU5d%1|G2S6r`xUj@| z6|riApkJk&%U zl#av@>NKTaKj?Ia#_fzs{n8`>amzM{nv`5QU=8%l(6|I>NqJw+dq&)BaHo(I`l|;C z1beNfG#@y8z-EjP7hU4i2;_{uhES4)PJlIyS6OhHvAe3?XRllg^^W&!71*B5^(0)6 zrHu1jMN6W-D}s<5wjnWypozO+ zUEb2jm$p!Dn!tO{CZHHx$ub9PEMA93xqLj1GIlg7n z#am6PLvIP`E7orewr|)3cR{fIV$hp52ivb$k1*&mIqX9nF;*nR9R2R@W zO?40m?&VIunsIZC>K{{u_t2zpHJW$Jsp51*T@H70aFrS_u4~A0*u;4MM0O9J2db{P zAPzl}6HZecz|^W#LJM+syMa1D5vfYP?B)hglS$ypo-{{NXT^eHfGbOUEFAF(05xo| zt!;srGf7&kZrZuCRbDOP27|5>^G>}h_r2M>EfO8SNb>XLq`pRlvG5KJp4wQW*;K-p zBVx}GKJZOR4i*joKV3Pv3c1G}Cp=^olE6}hkmM>VHRed*or_o(Feb4%b5NQ9%-s%q zr?w7VxFG=A<~oPnjO>8?rZdnQ09r8HRN@^B--YPfQ}qqFphQiOk)#;FQlA$Y=CP@FE4E5OfIRegC@XXGXY)C7p(C_)ed68s*I>0!B^%m z-_p8M)*SAyVlQL}#k2*irYQx>1`iXLP}c(ZU!qM&uk*R!8vgbqR<045t zkN=b`c8?c|x5xp5)cMd_Jlg9RQjC%DT&Ay!)ljF9|C^IA3CX^8MKayO{SAJr@pr)5LH-2d!X#Nz7JY+z4t=uH9PGmRoBB-R| zbx^Jr!i)v6 zCMQL^CX+FGoYS?L$O6}K1fJo*mj(X8H5EK6cx5%qM-3miqGE3lf#910SaYC_xvix$ za(~e7JOULUM(Z*yrd`}Gk_IxBRCw4IHiH8VS_7S54=4)^km3SEU$`!7pqaQ0F$>Qx zAQ8`ykN}#}X9$w`X5Yt!G`u;2aA|`$CJZ#*AmE9Y{CEmpAYm~AX(>zsOIPo%u%{vn z!)!H{2t8yMkKbg#nFcURdmMWrW3JyNaP1ZrjYLL}aUvsk+7L>y5bDN3Gm*i{b?&9* z!=i)*Auy_eCo^-cAq-bya&Qpgriw^{90q|B4uHGMvk2--GF5T zGk;};iK(p65!IEIvKHZ&ZIXSJ*|`w8Fo%f zjZg-1)xgLrODc<97DrGiN*YH+3o60&S{!4jFd3G7wpn={r`JM85Uwo0 z1~4IOZ8cnd-1=l&Pm3)fPTMkGZa^^QVr3Y{Ru|tXCn!=dR;77)1T=vK^mR_3&`HEw zus(&**ZxA=F5xHCV>-D$Q(v9pE>K;aY7ykZTlG>EdKDV!67`9ibZbMcJ{|%ZKvJ=7 zm|&eKLgWTQqVZC`JY^9xbZpj47H(i9dBc-EH8j4Mfq63lTulZ7Gy$B0@m+vx8kXq% zB=nRM1sRe!Gnom$zQWFjUxTqDfU#G9FNUvG^=jr@Bwjkjg;7EDPMEhB;q$YRw>Si_T&4x1;T0N?O)1K>Ra6M?gF6D%aq${7rcprmSBFT2Y8OiCGgU>6~<;>hmtE@+(?X-l;?c%rH(w59fEqk1#h;4Rz6H+{4zxn zc9uU5n6uz}<)bdD*-(jJTFC3sL* z(UKS}AKcC41p%D{iii3^2e=!DA?|e?iIn4xAO!f1L5e}#Ccu1}sx;q~g{r|}T%K4A zV%adECQ9X%D_7v;TwOz>489SIBY1^F=aSd*GT{zmB|?aZI}8~eRJEMnIm3Ay!>Bg5 z3-cj@ABb|8Y$Bv8OkS7~*FQ7Oc90m~*?pfl#i=#Ty+y_8?z3m zZ_E{8G`$p93AaALZ2B^jBmfv`nB_Y>+^(~Eus^^U!ANKrxjTl}YR1Z+Nzaha6T_GQGpwu#>sGcWoC zL-6anmT_?yhHxI#bHUw>W~(anT=QFEh`;0>stgW2kb&_FaWXKh5gt|Yw-HDfGc0si zJ-)@SHLSX?_4$nW-iu9=|@!dKu%q(siW^vIlk+8DIxim^sa^TyP z^6grE=K-1qN09%YvGV||vnv1pxi>etVU>;AKapT4Xbut7+Kt;r@fZ|^KKi}s$=e_SuTYmqh-}|2Ro_(J4oaa2} zyiJlb!6;ha=-JS3XQ9^(qjtdAHQErlYg<2hDDfTM&@e>^Ontci);!la?C!C(hJ~{o zEcFvudO25SaC)B35|433x@j4N#@f1qHq(Ym7mO%#3tZ!Brb2iMiS&_S`zA2XkS|$u z7CLWXmNh*&ggQ`hj!tI8Guy9Ja>y~52ja;obqR|@s~G9I`l+_z9yYMyuaV0{n&)H3 zCoT#2*i_Tvmpl*dkLgRx`+IStBW@zpSs-5hP$*+aqBL2KKgPvdvf< zCuY)FY@JJ>_N|Bbu9`O*aall#_I;w%j(ZZ~HJCgzskW)pO1*${8!EAPG-m;0-B1|z zh12pTt|Jr6XHskS)gdwJvgv&dN{Jy*C-)Xg^6qusETX-kVSUcxg__10N^J?b=w)<( z#g;U?IF=I!7i#y)rpuT*&^L$0QlsD9nQPFs&WDW$89qnkKV1zw|bQ z*QhCH>#0~GiTkDqog{kGSXb$-Jn)-HcVepAeo!-VzHitMboXySw=Pzi@?^U6%vV+e z%=<3ZkDqMP^Qq|D?IWqvW)*k8tY zsvFueyUIJQK0L74dWdH%MYI{OMf-RVuR_}w_B#r!)~trn>_$R~T-_@Y840CBKg@Jv z5D|3siPfmKMvBD}#$L+BE*%^Wv`3GujMW*=oVB-{;y`X75=~;-2J?tDhgaOhVL3g@ zOf&)8x={^&cp&Mkm`PhPk$lO6F=aER`8mTOXK$dYPHPqqtljXeFZ;a4(k}04QjIDX zaYDA?mV0%jb1k;CWc+ey#aD=0a%c#!oru70wFZkdiVrDobFGb{hNW0vl)!LNapGXi zOcfzQ#c5=a;}KYOoem^F9=o+sOb-zYl`ZoGs zKHZFQq{p*3u#G0FTx^l;vGc?VEs=}YCk8vV!4om3j?zPHw2I8`%5hyNS01QL>XB2? z{Ce>yiyYtRq^lv{9zpZRrd4l8O*`h)?ke80yHC!cfx|dbURLASg1muWLP;ysHc!be ze5%qLS)Ww3N7gf=xDykK&-EMi5?p<|U%f(J7RR3vwhCaMCC)vEKD-Z5p&@&|$lF=267H72ma^ofS7!Iq9R(P82IS>ckcU zx8uMS3{!nW+HTW5O$~?=npl8zcl7$qqsn1SLdzM-s*udY-VWC|!M&s%hf3drPwpQY zt8SqoD03%7TyTxY>114s&afTad9Zqiq&*&X)QdfZ534{W@1!r zQ%Kn=etM5p3A|I+Al#nh3^A&~&KPxkJ+rG=C~GRHjKa^W~&gV?>*y2HSC z0@*vTjTlw+NFSAtl8Lw?mzFgQOKU%=Mye)@qN(+}M!p@0KSy zLkGn*#%PMj&6z3cjKO*$xM!;q&e_+@Hhiq-`ua!7N5PPc-fK-$qLW_DNVj4|vvO#! zX$aZ6!^V>CE|Pw>MjjL*R&$iQb@n1>ii1{0R=zPH8dS(Oq_CI8Tk-P|Ex{m?dDUD8 z`g?Ra)9%;W7hNuGuCgD^m2PnO=A&gX!$5}!{1ljsR;MGLaoUn;i;6Qx{mkHk3@!Y$ zzO%7ClyhL0fEx=ke_3OgO_F<Iv|&ORfvdYEUC4Ly^8C3`WrWKkQ9rHC^(Ri zTG9or`%Pp`_tB!fV$WR$78gL7pKngUJL)p8%+=RAFmVV`-OFTiSq;PCk7(DEszU)w z6cU0f`lv_$fOTH1_GCyH17VN$(SAq`Lx!6`^t2E%NK@Y#Sg61T&czOF3}`r;#h+}M zv5yvI0o?G{X_~}((#iqJ5gb36SvOspf&J{j+OIB`!eZoxrIsh5!dTCT-P8h%;+ot^ zKRLU1PADk)oBFX@mMGJDN&|X_IwQhM7CW65Lakr5mH25kNzuf1Zpp4NbQg{z22Lxe zmuUjE(B6RVFEi9bF>&Y~5-vrC-ah!p+0u{GR5CIs21)8>Ojz0&k484@3BFeS%`_~K zP1=n?FsPbR(x7r8!zh({!~px%XpM7G0u;yB$x&C&db8)Oi;if_&~%A8OcCD~(Ke9N zTQ(}JC&MxM6n!G9ZOAGR5ueCGF#Mz#PcM zjrGI6Zct1isc$vL*29=}SKBx=^`X!JDUeDSIW&W~Eva^Rq1+?0D1~T26wYv@h4kh& z%yFlVnaDE2ya+j#lssp5mWBD!ZwQT2Z4G7Gzu-JW7(c>SW5)xpq6% zj8fI=Q8*!8T7-@ngCh=V=nZ^rvb#7$yy55?j(fR~zP)>hBkH0ut_~K*gUkM?zlI@K zhBgE1Ux_bq;<7Vt0&pWoHen>;%us4$dY88=c6LjFPJ`SfX5J57-@)#AbqCh{o?j`f z(NWPFL=??oDbYFz(}*}^tNh$L!j`NSl^qih)nON&MoLj9>RP3{3F6bHHWex@)^JzfCbHa70oDuE4pF`l zC1s+Dxw`LMy^=cN4%f6x$S6k43c()GZaO=l7>4cA2wBzF+O4zobD##^uhWh`*&d$l zE%^=;yT#@dSs63iT7;&A`?Ki?rjGL)t2;VbpE7U|`sB?X(3uy+bqa;x4j}+6jfZxt z_hRo@x-vwf7`JiJLNr((HS-4U?ox*}3r(cVcpx+Sxy8s2h_>3P#>@aWXd5LAPP>do z6hWSPCO_*#2xrxmbP=uFHM3h?AbsSPHjfwXzTe`pRLquQaToe~C2cI#zIHpX%@H2j z?I{epp7dqCu1=|^sb9LYo2|F9GVRvgPzqtU;^rOf6*+|U)H7qzcB9;4auRbk!sr2r zYtX%2ewBjuY6I1RK>RX;-FOWBQrse?ZsLHzYF#r~are7!vS971fA>`;Mpy@%pKjJL zgVQcIGYWeVi4MC>2Muzs4{B9HfFCg|PB>arYn`Zf0ZNvCNv6EV+t>89~m&duGTLMOO}R%RD~D%0l(39oR_8 zyJaeFUSjd&dbi?iMNH1R&!~M=+?E2FZC$d7GnGP4&W|=26Iw3W8^+P#U{jR*;+4~wxGj6t@mna}j+9Fyz1f~i zhqI_rX;J~PA#TYzQ0L-Ks_H(usmJwrndwI4}vyU!cyp^RN$_70%pPHu>4o!Bj39~dQYqs=33lms;fuxfT!yHLoDCU144 z4N5l}Paw9L#z(iPQtpadWI>6(;-+qkJif|JlNKVHYDXjEV*)xuUmXrUR@;l!j=s*8 z+nPaWer7PKuv}S=$e%=4To&(Ci7GY?)`|_` zQO>4yLC%`wyNL?hQlV34HmxSjYNAi2;`1PzSKQHzwGVNS))LUyd{@n^3X@rKC61C3 zW6=~Q*;!1peip0bX-ljitzCCc6XTfBN_iWR_)F5;--hQXCt;P;cDyT-ytepkA)-jI zaJvs;Az37Iwo35f$|jyTVOx&NdzizG?1cIBDxN*pGt4?5Rxe|?Sgf>jVOR%m_3HJ^ zZbw}+7jYI@=d>`Hi>fz;OWjr>WX}89HdP83_pIUyg`KC^NIs27gpoPewHN|!ak zgmw=o6JyOZZzZF!@<<~o9%NkKv3k{3#-t==gD0v}+UfUb)@_#BZ#O}um^8@^t+>qJ zc`KdIrN>Ajy?AiM5(c{_Fhcjt;=4UADAs3q-0nNRSs+yxCo1CmLmRoBTIYIV@wBm% z+4`rQQ1LR#Z7e&piA(Kl3`r!;dUY!o)68N|l&u6isbM=oqN^%|wCo`%oN!1*M{~Cm ztwAIcsBEbf(>Z$*rgt5krPTbP(HYc36bKl;lv%ttf z+1Iq%=INu^Y7?73=}a^hv!R9|YeaE_RQX*X8Guz-3iNjjb_JWjqwDl^0~( z_(|Ixk@7;^Ky}9+2n-s;2#^OmB?zVl(e4azT9yf(@mm8f=9m1LCWsry>I?{wd--+; zVhdd~EpE?Vv^6c1OSkX4&J~oVT{pDRK(VxD)hBd(ib;AUHmscmHsN2+o;VXE>6$nb zpG=eLC~X&V*5MJ943cqu2U&8#7|T%8e#~x;NM~L|Yo;B?DJmnqaBkL*+Lf&}{kpp* z=t4HKXfu;^huwh_mAb!StTR2No4e#W!mYQgc?Wx8R`hY7q$%jbU2T|(+`HNYVNN`0 zcce->%?sPz*^%jc<<)J{h8EQMo-?s_ro22*g9dTCouRf&{J{wgJ1 zIqAueq>uF_r*@S2P2ng8am6WLG-Y8l#>4P>`XX!>7rtnfY%8HI)NQ!)N|%RA0*q$q zXeSS!cG+m9rc_64-cd6)nd@tG>nIE#7URCx1}=PUh{Z(eTiFF*Lq-w@QAlMxvmof- zAbk#G*|Z{ZZGJa0O(2QJHLT_SYSQzPD@nFwg6#ye4a`zWeVVOENxM5xS@C>|cj0q) zSsErIgJ)6VzV`9{VD53AGBeX2x5!F*DXD|x|2dn-ovy-f@6_GnULaq|c^;!#xpN0y zt>|j|i4BiAX;?Rd>NdvK)W_0b7$oR6BrA4GZWkqzVhqT^1xu^sa zFt?b%cd3%~F7&aERh)`^nHFR6^%o!7a8aHIY9VLp+23G(9uPGzL0 zm&q;WjoFi(Gj^Y3h(+BhtaOPiBi@I+oXnib-HIiiO0y}gRbj8RBM~_*8FL=Gp@c@% zkv%t}`C^;x8Z8Jx?bef(RB-=lUFEihS;d$Z1kns6cb3+H-ASW6rlQ2ajFAEC9ArOZ z4c`UOM{>BxnxlLA;Y5~QqGAW0jBGM$^vt-j5%z8@VfAb45F9ZxhY{Z?N>l=}5@Ko;rZXq+;SVBdE?WLR$3sKiUIHD*K%bQJZ>L*rqFHG|9xiPB2E0f2xiS zVoEvjD=9ku!9KoyH_6SYC0-20;1`;~?+mHbIsLO`R*J_h+}XlTF(bNl>? zbs5X6)t3rswpd_OxbvyWje`sy&AAP1sVOntZN`ol3lvoY^qqSPv_w~q++PbI;?`y> z1C1H_VhuQbYL72onxcpJck@adxii=-N4P+(5=3*XHal&gwcE9?=452u1E&sP?oks= z^TTp|Btlnx>3ToL_>k|Zu54j+hn2HU5p`vweUhTPiBTB3&x%KfI~NYlW_As261{Ag zPjEABl*z1Sf{T-bO_?13ve{5Nk?L6S03`S9(4Z~M89t=i>|z)ZN_24gyPM_fY7$Px zxhP%}#JR^#qc&x7F4Q`yjcpSXh_7&om-aj3(2M#2IwWNz%j}v5Tn|T0;2-Yt`!Sgz ztGmA2Tw|FFLwwN-=VkY%*{Map7Dq!B4p7S%)}|`FpF6cn7`zU0w<LzojSKIX5}8u z4oc15I6o}2A+q|u24m5c8Bpgj#r7;VvXPl-emf#>KP>0$P{YDBEsqRpLo~Az)2Pqa z)JnxdqNs^=r>~t6y=fX|uj$4hXL+=p=tGrVmL#pvKx@HFdiXS_$Eb8Fh5RITpj_w0$RQkLtPmUyoiw5HtBa|*<$BxHZ9;~~d55js< zSSfK}yx)?1oa@(Htl^5K_4H{5k*Tb+p7Io;fg0dwhBjkanxaK0+GZy>ds>-SJj3)I z?wTU{`0Wy`u$wfGXt36<1|FkkqG->7gmR7Q{**rqA@Wfm#ipkS8d zF;uMB_{xbZb6^1r9kmTLRlV&h;9#Ga8y@JULzzOJR5nD9XK-bcK1s!~KJM6|=MThN zb~b825KZ2Ste4xZ#Ab_alP;>00UKIU1mP7kLoj6~HdGkXRXQ<39VX2?RS1Vz7v^A& zp6S{(s515#E3U}|2j{WlmYH;vCN>K#3VncPh(xIF>~o0lcOqd(#d_PPWv1y2(Lt`U zbk~ZR(K4up&iXmp{ISofpDqzK($ah&jV9f4#l)J~V^WpqNiy9=-axna!Kl4ddaiYp zR3%K69B)oF%UT6R5uIiAvjt0x%(ITN6BL6seC%AECgp6kWePc!rLwFhFK9P~TsLl% zYcFR5oKLpzW;6Mxk6Je*lFd}l#6aaU2sDwhROU4wza~xAoUNucVrdMDDTaxAm9q|= z>S;T$&=1VABC_NrO%Eb-3MR8cxzfLE7TX5jr`qHXZAJ5q7Jm6i3o4|F$P9MERWER^ znqR)wCyDO-ffdPcwi_0WjzlL+XCuF0_MZ>$q$e)0TD@8Wz09nQE67w<7EP|r_D-cviVNZfr=9s zczR$cnmqi0G+4GyeV=Nij~T=7QxoCQVSeLEG+9QI#n7Ij;v0P)XFKn^7cscOau9=S zhI6A+cv6Zo1DR|BRO;=L5>-OzZh?v|=2uBt*qCG1N1=a}1?$jl$<9REoMDbGt1@G! zsyIg2Jyr8_gIBusJYq2oyW#j`wFA2-zTckh(!6w&wQ}eg^*aUV{<#ikDgu@MXV%nB z&64`54I=21`m&q-G!P4sl`C0k+K}j91@$o<&i+-jcqIJ&+#xs+&3svkLPfn`H@jA_ z$uTsIdY_ZYl)vdYaLv|>;@lE7;FS@5+q%Ci=RlRB-{wnTb~emLMfr7oC=#x+^#M=Q zR~9Ql`$&-P`6kKZ89Y;s4*nW?%x#&7yXu)H*x|Ptnz0g zpy-l?VJQ`yeC~XQ5z&P9xlDChGZ~$N;V9L4&E8@tT!>&D0b&FNo^J~;X~l~bF^w*r zYe$qQ@;n1!8(ILaV#lCxLl1i}`oxAB*Qf?<67Qg(rJ_k+JkZYET5c?Ig5)m~Vvz|~ z@Ru?f4^#&^R!fF$Mnp728LW3w8MblfU6s`X>m}x3p4l{DrIL%!+AOW1J+Xtp1*b2F z(7+@Xl_8BDiF@6!$yO{a+9={%wfabae(m6MG|?Pxayhc`kkmitz{IY|G+k3IIrSko zG77ObxwiFgNWZzGw$8<|X5^HJ>-O8xa<06K3=UgoE06}RJ6k{JaF6>6a5gwc2`rGz zTEab2%FHZ%)^;>+Vt(Xa^F;Se|J6SPt}N*8Jh(5u$sI?Wn|;LDhYbBl9-lOHw-i?L zcSVrGC%eCsw^=LY!qOXzPE@^}xy1LY?8K1SNp_aFzfI(q9~yw6Wgom~lYB~BFepS? zXV$_n$)$Z-HFrNprce095oBt+0|+#=qfp^2-K-S}n-h#&Bl|Ll`{AJj2^A*PPuRgC zMyGt-3h9TZbbE_F?--@c>k+XqS{6ITGnF}>J6 z+2jREi+7`zG`AEFTpDWop>P-|p%3yYP915oFD%$HL=zbsX+AHw*-~amM@JgNef`sj zmbk4H_>8i#HK>T$#bxYY>7b4A{P9a8te>>7Ro121&fvt~0&vHoqx)P?I6IEM&25F13|zsiC8Vs<&XGd9i!E-{CTmyUDA6cC z;te3@QEHQ&Zc!iA8H4C8c|(IL#VTWpF4i~ISzTT{#ShV%RMzdNS;K@$&&%!J5Lp1e zcBcccYxx=O=4Vtte%ZIm?Wv1!%SfslqUq$S#fiZKHsv@=PK zI!-rLOwDDA8<7diJQ$Lh88XW3Xr~WVnTU&}w>-pD!-b%*?!$d{4Yt&yymQ+vOh$Ym zC%z=0tGdCaQ@cdmkC?D9^HV0B+}Y6Qno2|y5lNcerlG$fKT}&p<#C3PP#>DKh=8g^O)B~P3Zmy;K@Z_SdlkCRI*d)zmNZf@q zGJ{Vg!Zq1~nVa=>4v}6VcCTYK5_N7t<1-nsLrB}hhG}8L^ssSS*vLwbFQj6(hud(M z4L=HyEzLStS+Dh@XA*984bqp}?dT;{tDD)IN`6leGvy zAU{EJDbaYi6NsxWqteV_cdN_bG(`8lF)L7MCRKtGsvt-bsc^*C*lh+u+9SI}KYF4c zU{5~XnERHEwF&c`i|zCYYR$-O|L|RGgsKn%mb^-uC1m_8w%9FJ0v)S4-p&UfO&;#e zshs;8RtPuh5+x=Pk#+=ste;~cOeizV2#4`6YLcvJ zBfzwj*)^v-rR~eSQ{}6ACdiK$xk;w)_q%oX>$FEjMzfO7Dd`^AOlXrF(%0kcWn3KZlYeB;!#M^#ckEzYxqVSd$v_K3|6`Mb!?%N+h0vNMH7Ti!O2NG zFtLrTDbPftBYEZ7_fjMq;LvC~wJw51Lt{Hw{45Q!G`p9WKnoGzhgSW_FB{ z_@-Uks4-SgO?wu0ERaK@*5sz!K_~MID7>dw6K2$fJs_3{bZKcwMKuHq=M+J?@hj7G z&4T7dG(u&9=a7)uuN`8!$-rh~$aV+P=?m>INm%B6#zKf7NJJ2|A6(r(sb%N}u{4x9 z*KhS}398@d_AF6iP0LXYTc4WXLv88CFTWy^iP^3tM|5Ggi|Hf?$3?3hX&$!F83w$Z z?ntraj*m(&dWGnTkc!-;f~B}EhnXW~(;Z-RiWsFGVG`+MjbjyI4mL&S>{deak%Cps zXUw3V%s{h4-}#DeiE!|VJ0h0CL%dIq8;iMnB)MrHO)cuZ%@V10qE*T7fHJ^%*#31{Yl##lL8?vhUoSmjm~ z+Gd|j?qN2*WNerFdoN)G_@M~`ktgS|BI~l&mri0!y<10jB_|;$3P02#%O4TVW5}C! zDC8=_=muPzM<3EvK5(>gd1SYpP;6Cz)~4cW))}i{ix(1J&wdq3i1HVAn-a&ch zKC~Ug#A6(xWDrb_(pnfY1@rZac%^-W7=gU4Uu-Esr&M>guY*c@#@-+&?<6&mXraB^ zwb|hR`dGZ_TL!Ey`V;dHgAZBv4?DE4N?&@g+a0yVqi^?Z)P?==dM^4P!Z7V7XH&6z zrH~(NlJBon4e2+4-cOoO97eq-KY30mzONUiW%3|l};6^q}#J1`pDwlM!@>B76 z*k^@&Bfze(u^Ep_x9-W>fu*t?C3cM=6hk-}?{^tk3z~4z-l2Zwh1kZVsxc6KiRJ8QI_+Y(&klxx=F3b@WT|u=4jf45iplV|XCS#Sm6`#pm z?@1d>fjT)`Zi(o{I4rGmc&^;YJp$GnDmEXN5`?msTGMkq8XBx2-I6&= zciUUoJj_Zd_%e;rVlB@3*0Gymgw5gu$1+40fRsuDREum^nA2`Y+|`MnOpZ41d-e%( zrlC>x6QnMH(LBtcOJGcYBA3^goPBVZz*gUO&$llTshZJsE>J(;*+#27_S2D@^rBm= z>x^fl>#)Q&TMe_!(AVdj3PZv~p>4;VQKMT$qJv#zQ0-(F-l#2@qiiFqE6j!k4YSwj zGbMg+JL0?8#F~2BWj2HRyAcV$P0Z-UpzYTS9pIXApDF0ZzGa|&Kc_Ih09V(r{eh_6 zBRenaJ~oAfFxtYTT^A3ejobK*RVHSeITPJW)=Z`W(UoR9-(-j%(^CxgNj2rpzm{y{ zCK)wsVn5cdibAa$)a9|d2HX3&5rNj8wXS9aD{PylREZZ<<@7xtUxdfYPOZA48Qumh zZ);L|yJ|PH*{7T(<{Hw4$68NG)S*=x0xVmsNw*H|MlDOF}*J61)>WKf~|q8wAHmJR>eBuG+Rtb9J1Io z`a3u9uw3%tQL#w|Yb=^g*ER%QiG@qH%_*SE=v#u4q`QU-Ng@05&pU9+g9(AAGd4y$ z*S;;xsSIuG>X-4$(W73A&UPb3=b}|!vQ{E@WmBn0DdP}&eTmfd)RF?BZg58*EOyUi zF>bXX`mqE`Z>2AZ*rnl;JzEzeUT-&T9l-9Y2@!FN&rp4!7ppNzTf3kEi!$e3L2Q~)e>F_y(9HUkcKJAN=4m-X!~-Km z#WP}3lO_Fp1cO5+j@O{E`6hFL6iGJD>73PwggHrr(#1wKOPa2s`&_gDpVELlT|Gtx z^eZ>iNN&;v9yF=G@Zv_B=Il6ubg(h3TGOv@oT@$;f&3Hl*+}Q5w`^J{~c^1|K^m%uP zYdWu?Xkl*wJ97nO)p!?JLK_%vEHSwicKzAvU`os&eNdhIJ*HR+Q1|H*rCQ;p;b;q=qVvH!aD56){{b3lXhW zxVMyD1YKGem*u>`S1`r+FkrM|GKW}dEuEa?am9hrMVdjAB;5)c3U90qK+E`TzR}gD zZ{H22$b7|HLT*L_M)aNX_oy;pP*SiSXeJ9oW0QhWGdD_XBAq|uUFlYpi_XrSehdl- zsvD!9+VgcP<@G5&bnJdYSAt#<3sj4!SU64@trSdMEWQ~kDIt?>xP;zvq<36EhjTF!t%^&~fDMt~nm70H&4c0TFl%(5&XOpywrYzrSFhfcs5#K_Uqj7I1M=j5C`y->Yma-ZCHPu9?{u8}|FnZ4+LJ*~gmWt7aD)=`m$i zMOCp7msz$IndBX-B3EN&qA`cX;~THbC^n&}TdXrdE}$)G6|!FY;cW4wr|&Gf8+}a* z-qC4jswU*2Y5MJUOU4Y^%e*@lBC(DwPZI1h-Z7}MoQ15rUPf9#B_*h;)RW_wTqNghj z+(0}Mr=?Nqi}0#&o1P;{9kDo55iQ<(U2U$ym@w-^{z+_*4GKxUOm)s}a+e~V+n_Qo z*Flz;+$5%?(_7M!sZHBcQBX!$>8rtIx!$-8xanb?Fdp#ZLEFX;W3jY%9xrXs8N*jy zC0r^nJgj>Dxcushj_DN_Fo=Lz)yU7hb{% zD4R~S!WwID*etd~mo448Iiu@*gQp>Tg%$D7DcK!mp7FQ>L9T|zUe$|LPEmH}5yQLd zMkC3eFo>PZSo0`Q^bP1}F%_94=`)K*V@3%Oyt76h2~=%kKhHErQewJ}c@-_@KeQh! z%eS0;x-D@UhG19YoSv~O*nOU`AQ_tjp&Kz4J)835K6+;NjcN$4h@R#ZUkSS%#aEWg zl6{&Xig3V8 znzQLYu>EAcklfNat!VTiYAdt4k%f3aiXoaetQSX;?#@18jcRY%MC|RO>(Mh@pH!u6 zX%^=L>VT_1Y`7TVM>=8m+D4(id59%r8&i8CEL8pJdoFQV=x)A5^jMhbS;iO{ZQyeW zJ~(y%05n$h&Js&~Myqj-F6pjo8zy#_vwx(`7V1$voYP=$h+i0Q_b+s0);QKPd)yM@ z{!|<7sKe>vGL(j;Ue5sKW~@=07b#UH=7wX-%yJ)QWtnsebn2|yfk{+jSxkfY*uhSe zT?RX+vzz2sT;&F=P2f`HZQlUrgT|?}>ZG!3E~7&%+j1^wIE@LTkGNEa*|b%dO;ur( z+v>F3B_EGms?&0pv09ycwbJ`IH=LW^1(9r5}ABULVS)7EA*u}Wd36c1fQ6K;}GF!!zVPaLTR zayHd&`c$iJROM{=dGdNEnNa)Z4slm)OEf?3!wzwDs6MXZ2mb5-Evmm+cgMqNj{U+4$h4QcJ8@revtH>Tn4Cs&+t$ciJj$rq^= zCp#s>g4+)WF)K5NiL_<hib=5&M!m_AJO&`F6cca@lExy{@F_esQo?dZIMmf)@ zIAau-1aHcO%yk`>t9Tm@9E0d2haQxGMeUJdL>0~=!iY}4me<)%F>|IgmUH$>q3Msd zo6NZ!cC109^w6Y0@U{0;cUosZ=1HosJxa z-zo`{@J(Jf)d#7T>hZxxP=bEo(7(MfDrE~Ul%NkmJMLb`(MTEJn zOP54OZT`?;lSw?oBAe0z4zo?Iw6RsQW@zl$v;=O7DDVkq_H1l~6Idlfn8lLJ(otj- zrYFdt*qatLw5c{@F-*4#2GB%f5%PhRuDh9;L+k$}CK2bDR()6&b8Oe$N zTDmPLe9h7I28|+4ja;HGmqr-Dun_h2Fq_UjU$-U_>4?1NAY(S4x$_u`UL13@h+A~y zQ%jpoDWRp6-ISn8a>D}dR}3xsUAoMllq<9}>s(gL5_|Y>%QA6eEpuQjLrasbQQSr0 z8*%R+v4m#Z=^if!t%qv$a07sjSFt$hJZ=ZEtg`y_?xQ z+DOQ}$li(6IxTtkHviyvmD>VWW2tiUo|u2LQ8xfpg;CzB9A;^EsLG|KU*8X}a#GIQ zG^td%HmdklE^QL9Ztc>@NcvXh1t3kp;N9Zb!2gYE>0p!<3#Fx4mSW&E5mVWVp`A5DXAePZN9)T@D+ZQZ+f9VaVNj=W$uPWs%g>5wBa^?*a;#Iw&A+-eNe3<=?DvyPl`&Vz(21>WB=i;rC zHWy>L^o|H|h}1ZAdTxAXUNG406GWTcf7ymCQj4yY~^;J&^foYTfAYXxSnPG zo3iTfY_Y>ht!P7rMlSB_84=xSgznf7A|b8vLgr}1-?A1K_xJWQ^LKAt)LAjlCh0|; zB4(k9@AULXW^nPsxnYjU3J2GEuNw}nODvu_Qi@HM7C4IJPN_p%qb6|J8>JKZNK9?E zkjA&IizNUOe;cSCbXk%xEw_)w8Yet!UH@zbe3#L?v-BxiNm#b$lvPf1bIVXqZzb3) z?k*m*IE;^U4sd~;Bgp1kDgaF*XEZ%Pg|l?_&mw>{XAGkPWNGF-e0JKH`89Hs#@_ab zb4Et0q_RQ$9Mhm1npyj5o#u>#g*Jb6ge8=}#rKzNAO{fC1wINPpRY`p`d5-IrYxjY zl<{58Oji5au;TS)=$|fO-pO9;Y{PXp5M?FLt$m!m?#fXsmq@hn?cZ4ltcHzGRZUv6 zdjw5LA6S3#fnGk#OT$XX(pLw%;5!=|u@lbK7f&;9TZ$~Un*0AD>tIo zM`@jQd7w7w)P?nH)O2gLIBH%I;_FrowhENP^rqZ<)0_M~3t}9(nHqJCmYEjm^76(7 z^VxggstOoo&F%J%@%R27E4I!i){AYnS72@nxd`11%8yfo%<3MHwE+C9!fpNmN->5W zr4|Rq!ivT@=TC>yHyF*|D4%|`oTb!@SghLN3v=@?D>k>apeZ?r-6z(N`Z(g!rL0~v zlf9|nP5o;v&|)@ojX35Vm-#0LeX$z@R#{+OJxjg>j0KseO;1utJUW2|CMv zG-t~)qp)U6EQwaW7E~*@pdWmoc8gXH+W;}Y1$L1>|?T+-1KoyMH;TSj<16ld9Bh zs61>n$J3TLmM16{Ia{L5snLE&G5aI#G@I<}I#Tn?C^=8N-Hk(zWMebJV)zC?Fzp%g7F$!PMG0@0id4HV_>p|lP ztzuU4*{t@kdw{B(=8e+I#%xtNH?l15ql=J-jxj5uj3{iiOkCc_enzaGs@SqumY_a@ za$uFGa~AL~EJHCH=aQaUE(9&XhuLwa#)NmRTgwHlAl4AZl3Dm%4=z%n7o+O zw9lNZ=^5J@#oW+&#vn^0_?zU%QirKYL{Fh8wtaKK%_++^E}c=!IT`zy*{we^QF+JA zoI5ppkA2l<$x4t^Qx%u7FCY-Cc)B1jXU{gqDsIO4R;*ru6??3wii6mmiVdEiUmNBl z8!K*0)(xpfI%%m6jIKALo)kl=Fo3JP!+&eXs(7K+rdG|`8Bs0(Zc&j8bo;s{ggT^NL zyyr$8xPW+xM`|;(O~ht5uGdUa1n#VWZ!Va7;iz@xoai zTmIb`KOyJn4k&xibF)lW@ggGL%FU$6Te)(twd7!1xi4d-t$C+XOpAE&+{T!jTxzN) z79=D-G@N2!;Dbv6=x48 zqt&+C=EnUx^K!WWMK_ydCtUAkW*9yg_9k5!q&&^#qFc{TU(HS!N#{XymH^!`WV&3!KuZ7Kz^Mu&T@86RgUQ0nHc9U((+{mtOvYW-~Ah|^8m(3x`Eqgsq z;K|*DaB)*BbCUq5t#zIW%`(AA^35ESiOiCGZK1C$MpSJ?57j@JaFuUqWW{UNfflxok>D;fAcuqXW*?Rh(zHv@`mVY!3Nw zu-B4HFxzZDCuU~n^4;B7gJCy2d9Wbxs;EtM2j8@hy~Zsp3$=eMjx%oQH+yex_8zYV zFQsP;thKFs%u>KYAmr0G1{X1si8UVy-; zon_7PB}*4KE?qEZ;p{oA{_QkbMTX)l^h~7UvM#e)F*OfY*`i#v%FQdpoDjzv6AYih z8lAZt@po0&ZMhlk+g8LCqF5bCHgc-&^m-U7Iwh0^nI$cxmk+We zX`j7(ubRW*wi#sWWVRWsIXf#ejul^WYB2-<0!)%N)<%gk1x+WH4Z zwH9E;>O$rX(RrD$LkLScR*z}Tt)gt@Lbv__3pFj*IbSXu`#alDwh{JNdZf@7$tai+ zw;y&%{}9{nqQ);1NIF=(I)s}Jm~213xg0yCniXL9WnyGW*rN^Hm#e+$O^f^zwC$%h z9p*A#f%r0snHEOngnSm=)*Wd!%4_|$rN?d(s%@S9T~1bvhndycHH*`HD7VZ*T+8SS zOJElYp%9AvmEvE0&|e7S!$eTRyfe@7VRE=6YzWumH9pM5|Eh3%?NB%<%nP@Nd&ASA zFH8v!@y=v0G5iBt>z)${*IJrbni;l~G4fu0m|3{JFfr8EY{7naxTG+%)Ee$BToq2J znOIyw+`L;pOsU0y zN&l|5-%CiNo-o&ktBRZP*+7hsmmcEXq3}2{j<+|a7Wyc2Utu%l86t#2-6#LT^%l0i z@OZeSbWe%07gkVjf%hK=Q_1-TYWL|v2p95BDBO!*D|x(!=XjuhJBP`|DdhKhaySpa zd&3F56AHIuUr{@AHPTDXeDpsLp`RI*SgyImPUnsm#K!cnd zU1ffo^)4YUB+ku-E#!()hXp*p%X2efH;421ZRI_ca56rZ@b*>MufcW+`B*_ex`I-v z#_LIED*2#RHNh+U}lip}$PSs!SQxPdwZ{pRM7?YtznAcKptkGj#}^i65^f&;Q*fVWIc5YD zhDc>}Q z;@SO0jo~8Dvk-O(H6VaO*a`P>U?<#mqD6PbTnx3Kj`9~n8FLx)Zulp28Pf#9igK62 z4q!*HQ`nu~GHzwu%D9zr+rxZzCXHP%jRU)eJ@MO<^!Frv_1Zw}MPdvVgKB(F!tDk2 z=65Il0w`dfh|50M_Ohw`@a zJOv!a`wif5%tsL0kv#Y3ouk0f#9T+rQ}Le$rUTW8@;Sp&Q^@_v*8$-eQaqO29|w-l zg+BrFiQpt~GME5P$?B#QPQ`p0I33I+y;#a(T69<@8p;tt__>=%G`TrMPR2k6A!1-f~shv!Pr zOCI}Zv3}YI5)du|t1RD#l1@3S25Z0o7{qS~TujT!Z!H)GBVZKwb)cCRRST~t%m&ig z2sY8e>XWYquc1t@1+TNRsXoi$_23eEz+RSj)r*(;QVUZKZ@~YJ;7#Do;4R=Xuo=7+ zybW9quCThB6y8qy?;wsVW7=2Ivv#Fty_1~13tSDZ0oUSx9e6i@HiR2U??%uJZUQ%h zTfhW*V~zF5qp0(v!>#nl5(q$Tp!PkGUQz-96s)hyZF=;dLFyV48V|>W+pM3DgU%lt z?f~y0jXS}6i9!AIE+E?eKA!IfcY_ar4}uSY599X{;`%7hk6BvdnCtfqAEypJf!iku z^C@sW=1+sq5cad+Ufe!Mn9qYRfG;vyzJ&Xi!B@b2;H&hPuQ7tYPTs!(^;Dn#Cb%Cw z0Jbn5zr~39HetU5z6-twz7HM*4}pilBgFp$@F;i;{E&Bl1Re)J22X$|!BhDC1pE~I z3_J~f4m3ue0lxsxf?tAPfnS5)fZu}Of!~8afIoug!1Le*@F(zR@FMsN_$&Au_&fLq z_$T-m_&4|u_%HY$cnO3;ITSz<)D%iVW3Pm{7Sw@q;Uw$-`Fz*oK9{{>XL8K@j~0}}`@+O|99)YtbQ?LBed3+#>)hDMB=XAo&080B9p2vdY!14GUYGo^j6EL4hS|<_5 z$(T<8*F#-3Q+$hhITib9pqajOdN%H%!-Ss+W`Ra98#IAApc%{sYL9t5=YuoAnP35E z0Smz*&$jKM00s)2YlzJJ2>4W3SYe-i0pXHcY-pz)_6gMOpoNIW<3xQVxy9 zb%f3LV~xM{xNQI%!6xu(@EY)1@H+5%a0$2+yaBusya~LSe)1OL-502hQa`>7zs=yS z;BDY?{I39S2k!t^QV&;wcVd1QxEfpot_9Z-{@vhua09pzx0}Gt;1+NzxDDKn-yPsR z;7;&fa2I$Vct5xsd;ok9dA?*SHai7*TFXmq7Z7MQuroqb3YJgTC#o;!UNd1 zfM&ReD{^i2E#gwU=G*Dp#P=QWUGP2deefW72s{iP0Y3nbg2%uQ!H>Y>;K$$z@FaK& z{Dd<8l)U{6^V8tx;2H1>@GSTx_!W8hHTVtqE%oy|@O#|<0RD*EbKrT*FMvORKZ6%> z`wRFhWf}#41Ahnq!0n&lU*O;1KZN}+_#b!)gd+486hRFrfm%=pGganU4|V`M7U6ku z+Zo(KesDtBG?)se z5pFt|L3xhhc`VpMJsijLcyIzZ5u5~02B(m(Qwe(-xV$hgoL(FkW){z6osf8p1(aC) z_C8@&u?23v1&Y!FFS0N+^1k!X%ukq`NZ;2N%xnD3!QKq!f_Y#*I0Kvs_QHPw&z9mM zcpjxCUTs`hNcxLFYf&_BemIN#iH0pE{x+a_UwocuocICJxh2H26f7fu%ZrnZzOBH1 zHaG|DM|++`9On|(dEk6-0cZyof)2uTf-caFy{C8pF_*(i>>fvvcZ!5nT$Bk;doSa* zTd4=HgI@F3*eZoS>arjEBlum!a}`(()_?&pNIXN}V$$)oMlr0#eVF$~if7q+Z4`Si zc~RNb=aw5+U#Z`9yuZHKMrz~2hT@X2k#{#)-j@4-b7vOIpzHp`EBO;ZJyr&-v!^Z z`tJ?jColD3r|=;0JVf}1@l!u}1b@xNKj8T&`G(qs$MF9l_z`#i&F>O;kC z$MtBjpE1h3Q@n_0Dg3Iqig!c!H9x;8t~S4iifiooY;k}PrSMzQ{T=21J_A;8sg}>0xUL>Bsg1>>kgMWa3f`5U3g9)s-)#tuK{r(60e~Tl;ukwx3 zW?D6<42pLhX68f86Ie+Tl&54O8*=82@PAreZ?rhXn`@4J$==tRRO?;-)oh~82vdU; zq-Ij6sX<^@Qwp`9uIAMiN1=w)z+cE$J5%>|^ni!@k7v3a}rLd}C70r7=F{X-lUZ4&c4XHE*C!m1pK`3;V_xe>uDg`+>2X z2k|@@90Cpn&BUoWdkXIzM*bRV-W1F7=5Tn;Tfz}FmxUwoJBm2QBZ1gyyLGENDutsh z4(55x%}6VDj%A!yGb2pLO=Xxte8+%e!ExYt-broLjC8}(U`<8-PQ>pda5CXeiE*Eb zyXsf%e_GAuu|8N!nZNtZthoaEliE;zJ}+KG7ioy^k4JK{=XT38Da^{nr}?~*IA((; zpt)rZ&t@z-FZ5{~?=J$a zil;{Fi&8j?_ZMStBi!ytZwvPBJ7fE*-@hv?sku5Vt+^&FtGPBTuNj9t`nqs7@0z>WH-?L9Zi;2{_g2;1 z99Gxdf_o{f0RuI+#(v{tW{|uNfk$}j;+orNtx{M^T;~*TH?!nX!!>s>(^cw0?J^SE z<`JYuqr|(8ch>V19okTHd)P=^o3Otcyao*8|61@m@Op3wxRf#chMM=pv3_TGBYAxj zcr)SO0xkoaV>-=9p;AAYO3oxVP~XznQk%b(_}*4?S1cR+XMFDp+}}?5zJr9q--n05 zekBn7yNc&K!3DJIBS^J;Y~CH-W$p8UY+PK;*u92u*Am}##Qko}*MoVaeFM)M!A;;1 zq+z0eqDePnSNOGrxdrnm{bqljK7V~Ec>nltY-ja%_!z?8%JVjGJ5br~;Q1bKC-tE+ zznApys`&_Wfv596+}{uG1}75k13+U?X^G#PfJAPRh5cCgV9h<@LxlS<_z2-X3N$W0 z2KHuNx`*e-!6(2c!KZ*|%BR6+i0`xDUhp~ad7!d^c-eR6-LJ+teT;nqTBb5OE%+K~>`NZM&O6^A>^H&v-~s%%klweL zOTJB<-@*J{+`h;2`!%1;;&>3ZhY0^Lcm(qgz@y-?|1*wHWpOkR=MTY;NayjFeUJ4l z{!dt*wHNW}NdG<)o~-$7c#1eQH#Tcu$jS&$K=_}6pOL4%=_{&R^_ga*qdw2E4#rRJ zKj--f5>t0qzbJ)gi1Qbq*`%ndH~1d#OE8aj5@JH;=0nx$dsf!md|B2_HdAu>fY`S1hqVRdQNz6p~^e zd!Fz7SSrOZ8at05P2SD&H7V2*PaP(ICcZ#6(*Fv9^301VRz!#1MCSlvC^+WlD!x4`?~9X zWT=Op!V9tx?KFbs~IUfs|tL!5N=YKg1c4*hY`2< zlZMhH_B&F(zZDKAe_GQYLAWEqQQ&CuIF)b*@%}WP)4>dIjO9yf%x{NdOWzL1mA(^> zr)`T!98V~HFPvEVemJQ#E}RTb0jGk~h)=x5=_Oy=&%~}Zk7z9JuF9vHdUrI|1 zV;&*wC|F0GtOpywMz9IDR}*dveeyM!AEs_zOMYHgdN916_bvgF*ujyni*g z23%YELAb8;Xm~eiTwgjO+<@DSr7hv6lH^m5!CyT_DIT-_bP(;Nx|clJ`6~6r#8jaoL*T>UBjBUpW8fa}aqtQ7N$@G~Y492FS#U4-9QZu=0{9~M z68JLs3b+q^6?_eR9ekst{i+{@Z(_cmd`^IdJWzTZ9!Byz>KXTMktgN(+xR!LLsbh{ zbyH@aKfYsQ{L+~S@eyn)Ze;y|vr|_os6n{*;J^`KtPZ94=N>7HLlE%+UPZ6(VT@Qx+t*)7` zD8tXeGsN=?@GSTx_!Vxy2EPHn1-}Eo2Y=kZuz!3*F|;LqSi@E7n`@Hg;x@DJkp zC-@iUe}k^l!|W1zzW-DDN%(K+r{RC(Q}U0OC_|`4hFgm$muC$qfm%=p%Ag+X0CogB z)uI_e*j;#z!@et!R@H8`+M}gzdG3zi9$?Sfr@~&?_Xf+TgNcOQ2kZ-8f&YGB64)Oc z049T1f>(h9Ykw9FBHY2?klJg*p|x5UoPo~QN@H`eAhxvG(Cx8<%p9D?@r|{mX;52YL(E4&F&sq32g4v*n z^3LJe4CdBq?qJ;DHXodU+nI!4z_SG`#JmVd_SA~~EU=jTw&8XnZcDH)1E+))cFbqb(C|C#9gAHIK*aTh;UISjsJFf$;2bX|LaeD)JBX|>d zGj4AImx0aTt+>4nTn?@PZwK!HSAwhXe+pZK)q8#)NIZ<_r{w*T zu|ETE^b9@x85`G&7!TK5I~2nW#B*b<)_T8y=i4dVRJ&8S8NXY=t>89rJGcY92iytX z3+@6MGw-W?7MinDct7vmjoSx+c#aR&{t_Ol6h4Ig!{8&}qu^uU9`JGS3GhkqDe!6V z8S?U3a4+W1fzN|^?4Bzg@xqGZ3*d|3OW@1kE8srr;Hx~p1|*mGI?r!_Z-V>51GUoc z`86~UT1D7zfp3HF;P+k96aCaW>KW+6a(3y*0k~Z1O7v`g_+IT9;roPDy*PqQ_@Hpe+$KVNY6xslyn@?gE zU;h+Oh4~53pMsx(r^)Bf!87Fh7ucT#zXZPmJ&>)hLe+j<`-kwG+CPTh);>pD{yzK; zzXM6{GUmG`=CUrEE1;v~=MVV(5j+Q;2hv-5q4xQ3iM{uW@F&{!&$Qu-wZ95~A-rS* zPSc>T*#8Fp4*miD8S8K=dHWamH~0_uFZdsRF9B_W6+jW}%^0hxL;8ui7Sw?&al44T zmND1kw*%M_^G;xA%)5Ybn4co9C&8|mf5LNo9rPAVz<+ljes2%__5`ANd-2>GOa%LY zeZed0b`Sf3Np%y#{&nNR0k};DudIU?1_y$Jz`?|K2+u>o6mS@5Al%{L2yi4g3LFil z;x`RU$2i$e$ zht86&crC3jMHdbzzK9*#OSnGJ4=w_$z-q7t41hr}L|!lExfTo)&j?VPE=M!wP_$%5 z$Aw6^|)^U8^I~XKZQ*^Ukz%B>os*RhS&0Ry07`j>Hh2RPqhE_m@fgR+a8^N2vo55Rfy9_LczHBDXmlysDkM>te`&Xm4--W*rpE`jx&0FjKhFs?FtndF3 z-bQ_2Ubj=Yf^xl`_e8ti!ShPuyo%>?w0(9#`{$j+tvtSq=hfgEa4r6$=)+uBHzT|o zTo0avH@<;)Z>;+l>HBzkm@$77;U_VEHDByp^KWD>9^cKl-vVwW{B7jpI^Mk-KT=!qfudvcks+2=~ z;|`3|kJNRAk6OAfv5xfodLAJa;id2~^J5+&e$m4oc;3eg1=zC!R1yPjlIh=rKXR;s z^f@J4`Z(!JUqJh@pTPV{dmnxr^QSR?hUaH_-pliI;PaTj!1If=!}Dt0zUyi1wX5+D=b6X>uKuq=d{D&rT>O!aQ_8(7W|U7 z{1v!^cYh6j1AYsBhu`mU{{!Yfg6F{V;05p}@aMWvco91Im%4w3zt;Ub{EhH`2mj!m ze}aDz=HK8ynE#9W|G-Nil;M>@5!8SZs0DSPT!xMlWCyS#*a_@ho)mWBIS%X!#)I9! z1h6~U1MCU*0(*mrU?1Yy7rX-O2PWaRKR5tP2CoFK0tbSFz`@`UaA+AlU2qs^0EhGL z5#VzA-I3()C~$PSSeRNa6{eMI3)9Qxf^?E+5cU{wEI1Av4^9BSe^$@i0l<9RX!4aJn^og13wRqxXmt)3r*!`!W`k13YI~Nv}cPzA)pJ&hT*WoPUTMXLDJB1}+ zDOd)UgB9gn3TN{?r#!B3F7cfQBo8{D@E4RtPyZ6y%k_l|%aW<=Q0OS{TIeim-M(Y! zDkt9JxX@i5U+5`|zuc{`E1(q_i_#gB4w>GWP*_R+(>}Y#WH0tU(vxngXxUx#{c$zB z7aH*E$L}Jr3akcezyKHoL*Qbtw!AP5mv=9Wl=mo%miH{Iqa5qYdlfd6_bzP2e-n5$ zkiOSzc)k|A4oH{t^|aL`;8Jii>Ar#I8^KZdy@@=%8N7wCm+{;T-irBc;Bs&Uczbzb z;T`3D3bSlyXJ5)XE?h~QT!r5|3I8shDebF?_Zo{Eeu*&G;eRQ(*=YZy@b2>N;d<)( zhVpKO8;Ns-us3DxOgO^c0&WGj0oB!F=$Q0}Zzr8Qz7oezNzgOA|$QSb=U<;Qs5Kt0@3J}i8kdi+Fre)y!dIr_KweH!e|`2Gy(d=}hG zT%QA)`Cxp+JCxkD6FB0xc;LG4E;6B2C6?_eR9ee|P6R14*^Lzko z0p9}O2DkCfcc_Q&g7200i|x8E^MEA%+p6SjV^6>)CKY?bG+fFI`nfg&*e6f5O^Lj(!FWCPC{tEsE{$4(ublC^M{7>*N@Ne)R z@L%vh@DlMMoDT(11RM+srFwWhpm|tw57m7g_A-9YQkV6Zcc^D>sz0Kz+g9a5Kd=7q z!p`+a7IvveO9Jd#e^g<7{oaM$z=Zmv3%m3F9$-(f7udUgDt&dTSQ7dQa~E#=fPKLu zXdmm0!YfF7KQO6&I`(OW{V^W^n$b$$5pX($Hep_?_qFsZ>vx2o*@68v<~Z_tAULT0 z82bG&1UrVX=ttvrKJOe%9uFa|L&22#V+#||ZVsS2%#6Ze_&0#VdG83)IkNs#_Vb~I zxE)Pir-BQhZ_}_(2Q%uAqg>;{F_@19$ARO)3A}$|{qfL(v3*Z{R5}8h3r?VYPb{2N zula;E4-7$?6P~BPoPzyS;?W+~X{4*RI-TcC+-8ABFdN)P-)O2osqo6J(n|FAkT8cl zHG{d9e`poY`Mi4uI1~2;pam?%eGzB{XMx4!p{;&GSOS*fzYHwrofY70{LcaBV(uyK z6wV{;`SmB$R+`6m3Kvj+?chSt0XlhCJbV}7yY)`}DTEzcKg#pTg_XoBeU*8 z>rZ9oI+dC@l{VA-ep;aqKglKfiR+^J(+dY|Gp;oL_6n=&b^gZtx@h%k@++BLzRpjk zpRB1@{EcCNcn3*i2poWn;9~N$7EB};!}#qDPdHLPvoLDyH)}g(QTm?dGI$jq*Nv2= zkysk7|E(i_>D8S>-K@tv9_{#X+bv6pc2hj;Q;^q<<^YAEds28u&OdnOBbs8%g^+x>P1hm(B3hO4d!JDzah4e3@ zex8F5)>=>WSM%h__3EE<$=6)UJeM+uu$gdg1#bhFgDdLi!SlQQ?bzQzUatgS!R;#S z?*#7xSA%Q7{fv)mN%Ok;`HbcHL^!rVmoo53yMR&X1*9ozxl z1MURx1U@DcFQ`ZJ+3@Cy9g13nHu0X_*nMVjL0 znmN6I=qP*|x6km-XTkq#>^z{PD7rS>)4MLa6MBXvOU`)(BMI)nVP z=<*ryo&$|xo#*}n_MgK=_#(QlYZvxgxxNHS>z5#%zku>|Ug`02- zZo_wQhq&)X*LHo+^*y)`KfsUh0Dgjp@Cbf}U*K2x4Iabq@C5#Vr|>5{gTLT!pvgCQ zDH|q4KqR~bQIG_pAqL#w0WbK#0zU*GDa1lDNDe6=C8UDXkOp3cw2%(cLk7qQnIJP{ zfvk`XvO^BY3ArFQ1+}3L)P;Ib9~wYIXatR+3B>b3+7z=HG=~<@5?VoPXajAb z9khoI&=ER8XXpZ5p&N9E9?%ndL2u{-eW4%phXF7U2Ekw$0(1dN2&VHAvp zG4KYAg>f(*Ccs3P1e0M3OoeGM9cIAHn0j`doW-@u-(%{9+O{COic$kPW49x%qw2V3 z$JBMrfw?db=EIxt7A$~;un69U#qbWi3rk=rya&sOZ+Q%3L=a@x5-Z$@qk$dAikK9} z%9w`e(-6Ccw%rHl<@Bi=Vefo1t9|{9Z=6*;o6crq+8xG{xLyrwU@feJ^)XIb;@Ax} zoUk7e=LS&!_G8SA$le5-VGC@9ZLl47z)si&yYagRS)agO*ax4&emH>JK{y15xjzC& zxjqKR;RKw7Q}7z?+G*sSfq3%xEPg+Ob1{~29xlM=a1p+MOYkLrzrxRD_!_=}D{vLA z!F9M1)5!HL=1sT-x8Xau19#zjxJUf=;Ro{NNA4eh#<_pOd8)fuEF+itE()O#?4OT1W@!A%nZIDCw_CmY+gROG4nuP$Ori$4qkx*U@=}@kT8YZsa&tRJw{=7 zQ~J40DW^>-r%hc&+y3QCjCGEf%EL3zSf0QGkzzarO_pfYY%+|6A<^r`A@#WzALWVW*FO*MCG z##&l)-{BO*~=3-|bDg&I8iF8SyFKgX|_O!E*AqoUArnw}p1LJnh%uJAiBDQ*LMvanJ!eLXa;D z#nTBoLl@`@-9T}6=b83EpPuAnFL!5`PA}+9xIWMq`r&3p#Jl>t^BV)mqk%BU?KTEu zKLjR4cOmb)pmP^=*1qYk-0Pc;I*;F>?ryYmw0GPO<6hqu!`(0TPi{A5KKD>!uZ@~iW7s4WUFW1{{&GkF;0*l@1N9)^Nd&61FN|<-uynDqfM|Gw%}(gY=iBv!=237>F!5rS&KuQ zn!nmj8uz&S(+)6>h237*2cP19KOArmu-{Dwu{#8Z;RqbXtvLC44D+~qAmu>wUg{qY zvdh5<{G7y1--ZGFopKMh{hY@BjC+V(CeGsi8TaSlJm~x50($FRd6>F4lcsquyIW&` z9)w*cG$$^1J=@O-e~~nQ;m+f_J*O$op$~}zubYIT6>>mEy^@xza@Lt@J z$d$j>6YRexe2|^9idXAJzu{i%Ca+*#1%2sV!@N%X0d{0Z8D)$c?lQ)=a1(C9ZTQYT z8n@BtKAJcZ$7Jr1=cU<^8x54`|8R5m@6Bh&ZhoLw^n#ycq{vGhx{Ds)!#$`$KHo>D zCdwo9{sFrm;Q{;v58)A1#jPW0_?hcpKz)&4F@J-{==M82fj{6W{0YzCFZdg@S5TWd z>tZq;XE01)L@?Qr)HT)>>Crl^ag6beL+^3_p*Q(Q{QtEV;U#29H)k(GX3CM1XHmqZ zHaCe!-}~cvPR^Mf(H^aMpFm0`5Z46aQn?7{Gw)p5g8b1Fkt2I&oIJ+E96JQrR z5}sLxkd7HKGeKr>=Asps)}hXKW$`#?zG%Mnd&)yr`~=wvjz~LAn(xbooufDVcZfd+ z+|q4-<1zp;jzv9TuUeE83*c*YOR5z z+d_1k=XwQuo!C==cnW$J+0R33_cd2rfZgeSRvQ+=k0Uc&mmJ++#lA2U0i7*U6tftp zy)I6Un7pyweyE8*t66ZDQ)?5d1h>7f3s z_S{$TyvukI>w_r^j&9O7-UyPhdd^h|UkzF_*Ik{kH9%``8`|ShOA_ji;tPh}S(Brd z+T~Pp(RwaUIhEY^5_D8t%1^D!t%>|vpgE(wl(34}1)(-}b$IS|JI~X^-Cyo)0OTDyysQy4;EMI?s&rdywDBqcXk5u7l?Y zuYOU$&Wp7?X{X)Ton#&P!x#nf!gW-0`JD-`vZ}o{T|DdUdZqJUq(@iMpnO;R)D3^# zp$B$7NrU|N@_d9#qAtC0?*o0IAN2PuhrZhfeS`W|77 z#NMy&F$Q|l7=t|O6FFsh5T^P#;rfu9vZ(iekhWq845o3_-0Tp~2J&eG@opeq$@Unp z5ue6jt%w?|p>e)@hI%yL%DOz{4)c8M%EpNgjLH#4{UY77_uAHxJRm(I;dK~A9%#;J zG}mL`4Hyf`C*|olt^<^}@t6}}B20qGFa@TFY3S_kjcDV4kJgwcBc9pwE^*ac%~cXwm%A?=?KJ{w{8 zk{A2nQ;+s3q&N0se}FtZh`;ruBfLlZ5O&&opnV55klPnj*AHWV1hntqDCRLZ4kzFw zoPyJE2LAVR+u}M)+@JA0&UsFdKa5p)8W|Tzhti|=@N?3w`2+21zlgjq(EAd0U&2>} zy9{4@wC93xQ_oiNMfTfhuVk`D4p~>=D%aQGI@f)9&MJpDxc?Sz!Yz+ZBH2#fZbyb? z+(y3IgYU?bWSoR^$8+3>36=l5=x`pshX#}v`MZbz`=Gf^o!yp;wdUvPbNxX0AF+QB zlJ}GCX9w;2i}M1`{Jp+QwXYmgy)_i^S;=_7h}B6}w`JJE5w>u0-;YoCd9ke#}lsq@a&;2 z-$U3vgiUWe#cv(z>7V4~GtjeAyZV>s6Y@}Ps@ef3U;ZYK3~xBhUf%1vrhm$TBMN6? zM(|NwhjuX%^Cd6iJD~O;31&3z&U;7g#6H?Zh39(>88NuILvlR$^@0y9@OwX{Et6mB zp*PY<3Qn7+xc1ZLJ8pKHZ^wV&KkN?vhutA+snVvl^)T0xBbi4+y5UCr+Ka06Rb!d9?>sIv*tZxP9{j0F*|48n!1Rd0eNMVOR{tr9#ZRua=aftDz^A;c_A2j4=gas@3+W&|WPps22{J>L z&@)gQ>ZJ3u-G^1)D}Ni9XDE}2`K>l2tDTOsyt~5rXByd%lO6jUkQ2GNAUEWJypRv_ zLma#U1)v}lf>*tth2l^ew1I~%w63=sFJuG30hV*V=p8tRNx$yt+qf>&y z>2cm`lPDo72kJ8i?GuF52aubyFIRhUi=m75<#sZ4x{$^%n3v!gDep><7bU4blcUlb zrM#EOSGhZG?6KjQKYuU3%3JyWiWtIs_b&7NFH?UnQ-2fdeQEqUXN57YOMNOsxB{GJ zloFVUvi&-`n?_mks+?EtiOQwcUpnU!sLYl}P6en4l|XwPHD6hndRiI%t3c4J@se-o zC((DJZad}NX@{yJyBbu78c-8z!8uM;N(0P>q01FlZLiuDo-gv$|EY@~r$5IWI@k5R zS6vNotA zWyf(1UsSx?Hy!hyvdBd&=2}!Hvk3_E}oO7 z26@Y(eTz6; zhY7e(ME^;IbMotsYcje|!9K{zSW`*oG?>o)49uA@3ueO{m<#i~-&3P#*Fk4d)T6Db z@3|MU(|2^ZjNPXm&^M-j#c|4(6Na%w^3^GWKazIF6}=DaZ&1lod-|65C&D>(cY*gI z^~^b|PWuj63T!MSFBg%PAg6Ri5xx>NSL06_i+UT`i|w@hjN2pEJKjgGcVP)E#qB*< z=KY0d;>_tU=l*?I0V}<~+VbQkxm}stR#}-y-!jPQU$Xmex5wy9f0KAud4H!3PaL<_ zNhlwp>uS*1sy!*QYlutdSFFWchrP~^TThy<@T@*U#s=>b-ubLw#(g8?rmv^5j!j%Y zV2y>&(AbRsASaM%+;R){Tai~^*E)ZJHGAF&lPpo6$|OqT4FAr;1={A%kfS_3 zM|hp{E+Q)qz^9FH!iiCgwsZ^imLbbN^YBTS7)|BM;rG&#<0#!u1&8NXovEB-W=`Rl@xr+&}fEPPo?`Ly!~eoM-(q`RTM{ zf8y_%9X2h`UvbjEwey$rfzUM_;nq^t)&D(4JL{Yk%9xs~EDIpgh2*8TO_whNGAPk3 zIFEoxA7=+)MnMvY<~|18-~liAd>Wl$?FEI$@?}C_)>Cj@9n*@)OddII0qoSjPl~Cs z6zj`EzJ|x>wC9R4j9YSFR%FnBM7GY_Na@RFKig-tWhs5xZ9P-^a$v_?C_1I~f> z>V@5hN#n~!I+%mxJ5c>!?OS{qziA;Iq$f-U$OxIZ&kR|7<){hHyQC6kR^rd*OJ-z; z9LURwpInd|@<3i+36jj7TiWw{+~7OFHMfzDgX0 z@mB=1C}uGz&UFdQl9;71OA}8S%(74p%0mU*DngLcaHB&y>s?TZ{Hu(6N78%6UCyZD z^B6(j4~EK2RbNrtOvVX?I)kzhb*>tIwdW(q-kK8jyEC_0oqWjPD{j<)n!d+IEngX< zwol_IrHnehJZ4?us7JW^(11f2yHMU5a@`!MI!{_@Ys7tH^lJj~FblV)*fo6KZx*yA;`&%CN@I|^BQS(-1C_lD;bLWFkgOC zXRxau;e0(@1*k6}H=geVbejlq5e2bNZ%pzPGE?AQns$9M_N6&t zQt!4Y$e#++e1(z9xqn>GfSLH21+!s}?Y{_ZViEGD2>Pmj9chHm0~*A$l0GRsMUhby zKSe`+_^PzWD0pY_Rxiy7mdQBfa&}|^b1rF_ht83ng64eU)BbJA&>2y0axXpJdMnF6d0|?=klyYai$g zhkM-LC(I9^HKIRq{{Vi1hwun~hF{=U_zfPz@9+fvfT!>$JcGaBZ)9=MjN!7%874%q zktz~ivb6VG=Wtj?lvTq>Vx>2tA;!|Tqt59#Yq%|XN8q)V(_${CMlYugEn)hsVy0yk zHurkMXEc;D{Z=V6U|B{|h_z-L$*jdja!7&9lvZgo6{g0UIsA%t!8r$|7j+>ux}-rr z&BMJclX9!)l$PsskRCFigT`DlVrGKOh{=MP6|zBgtBje$3ZHRc89A+2&0K`b4SB4x zW?oBYn3Xg05m$c5$!XRFjPm9Z^oXG?iNo#{P}?zp=b-0XfP0+-S`f1kyb6V(2o!~4 zP#oNZFM(MSN`Z&_B%m`NN^@TZ%0f9P4;7#yRD#Orr}|z6(;oA}tV(*SL3OABHK7*N zhB{D}wD0k#?#^RRW_hz7a_U0^(7C*tcWTIWBWP^P<-3<~@pfFATV_6o`(BY1@Ez_q z=t^z9_Ij$F(sQV2_d^oT=d5JLa*8f*S-U;|iguwHa@4TIzeZvGI3W%R^^Z^XAMIaTb}w&Rd^3n!MzIZdM~m5&F;&{El58-h+7c13cQml znq5g-Ci;2Z2=C~mF^OoSJ9*WExO!stvZ^ApD&eZyGJ6xIj~yRvoK?+C&I!PbNZ4+3 z@zXElCVBl~0BINqgFx#ox*&6~U8XtDf$IY3mk;!=dJR8At&_a{^j_8Xxb}-HPdV!b zS;H-lF#uTy76S=G_cGDf4<7H4 ztVNG?Fcq}+YCYyhu))%ro%)nBovK_Pois+IwP?&*A#Wq-9i{o`Oh>yGGbC(oVd4NN+WC{)Di5Lvr?^=chcU z{p1_7xcILX(#J3k5auG|<_Gb^?`60wVAO)~iLkzn%@V9pIz;%xmh`A@9wE$8E6#Py z(mFp!SJtGWOA}-_LAH9zY8%62W%TzLtC~-Filr@a#^~bhKG1REJpm`dnd5It*`bc1 z=_$(9X*h$M`e(765UqZbGlrtN?VJ_e+H8(}Gg<@Z9F?<#as0F(&sdX6KAeN|aKUPc zzZ^zqd%mC*?Lso+bL2bav$Y+!-iK;CE+S_h;dNfa7gifP?n|~E>$XUbGso7JFdBDb zT|IgK6>(e!$@|)BM?b6`S<%kU?_`{6{SAJufS$eDoAUN)*p_h>yKCg}b>x@FzBBz( zC(Rw~zTb@m9XryG>WIva$kcpHd$R)1zHDSBevzbu`7Qo*mP~nDzJB+B_cpS>#NJEa zYXEMyh~u`UnQ7MZ<95gDOg?qywlgx1GgfRFcdagF8v6v}F4!^eWN8exvw4qae;>-) zbAZls{Q-G?^6U9=*?*45vS)-mc>wBj1t=dsh0+tx>1|QK2xKT8=UE)304C#9HxIDd z95*MA9}@0sHfp&YCa`j{^a@@{1r-r-sgWKSDU(Bew{uZZYz5s zyB7|-f1sf03aR>f8WMEgyi61MEEW z`PuIWe!ukOU1ZlgbSF&G1RXUG#W!a}Ni!Ah(jgZ2WT0=lEK3)AEGU z8aXj@L2kn3fxM6p@ksrQizvhtk}a z;kqp7Telqd<)H$ouTznHtOS+0uYw<)9~{K2%6&Dc4mHTnnotYQ(Gu1seRcfm`>@9y zzv_S0!(V-_8(=oXYy^#=3B*HFXy%{5$wtZ(om;CjVM`dzv2Q_`-sE#ju3JHC&~IO; zzPI5z7tf8#I#ze-0!*PY-$OQ!}*6$hP9?QaZPY< z^y%aGv(q|UpERD!+6Pz(eUa(>9+K7)zeXQe^8-W8ek{i8kGuh-LG7^C`)WRrSBZrxzupjLoL7kEv>q)rp z?HWn_;hbLljs^9Z#$i7mCU8Fys$n;Y`^hi`rouFsPMmtz&ER?_%!1i=eA0V3zfdup zdO6%~m-L-62lu%N{xs&pm<9glBj-)*--0pRE6ocq7ji#%oqhB+=3?yM!Tw#p zGnb+{?`e*FIYjlFlvS=(v`er>{Mj5a^>k2KF= zpQy_i^E_#OYK<~4VE;LOFTxl8ac12l6U|HhNoFB_HGWeg}8p zE_@I7;6D5SKf(j}2_C{D_!)kIUkR^sk|G%|{tcOr;dlR5p4JxQiQVS$9!9695MEpH zr+*v2S{Qa$n^>J5uA}oaWG4QWfYW~eh27tv16W*vQicf;{NPL^{6RjvgsFNQg?kc+ zhL}Je=6}NNkY%_z3CtkA8Tgxl zKh0n<_JE(0^v@J#7%S)bdcu7s?t0dikv3o%=>pTu^vKD89+z)lYP#!vEs}_3H2CWON zL)z;?J*W@y)U_<;Y_maN4$pTEVdoH5-yMvx6DH2M%U8W+G{UdGdm3Zvtl%cZ84pc) zM$H16VVq0Yxe4)VZH&GRRQ9_hnMa+*EuxgsJTRZqq-%}&JMOH#HlzMw$2%O^Er~10 zu6W14!qR7e)`0~t_;>8(e=lD@RGflvK|ii zZ};crzZ24rJ`MV|rQRm${_YF9JANd8$-i`$U04QvB4o7>EDeQsWOhX34yvE(%kc|1 z|IWum_hq3p)0YZ`(X)w-SpJXv?LZtI1Mj~e$FWx&EB;eQ$33j$%IBW<2mkTBSG^$L zNt@(<_?$jY`REi_{ep~6fi*A42$z{ofwi<D4#< zMZS@O{L)X@UUuqJceTs=2JRer-9r9#-hkYc@74Hap#SZ@F(Ll$wmzE@?t9qxn-lIG z{kA0BYpy5AuM9czo&4yD4wBOgdPASUwgkPy-?z>>i0z^B%30BrqrQae2U@GpA9DZ< zwBz5A5MM^S9PLby=R6ns$hN=Prt>?a8eewVG2xzY4|@A9scb!#^Y$0 zX249C71%}kcF{iVvfHQ2kq2qf!tco4=0MiT&c@#y-Yc3Do{Jei*M1&4sDE~neyP3( P9ww<$r*cI+z3}&c_MMAk literal 0 HcmV?d00001 diff --git a/mods/default/models/character.png b/mods/player_api/models/character.png similarity index 100% rename from mods/default/models/character.png rename to mods/player_api/models/character.png diff --git a/mods/default/sounds/player_damage.ogg b/mods/player_api/sounds/player_damage.ogg similarity index 100% rename from mods/default/sounds/player_damage.ogg rename to mods/player_api/sounds/player_damage.ogg diff --git a/mods/player_api/textures/gui_hotbar.png b/mods/player_api/textures/gui_hotbar.png new file mode 100644 index 0000000000000000000000000000000000000000..7bc788755243f163c95c0f5ed028bd3d4c61db76 GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0y~yUEY1>t% z&wZ1kZhiBlU)iH0zj*pxELG)7#S2+z%_zIIkXrU99dzaFhx*Nkm+>L z3bF>|G$gkm*$NUx^#+oIacfOT)AclGW;kF03 1 then + return "tabheader[0,0;sfinv_nav_tabs;" .. table.concat(nav, ",") .. + ";" .. current_idx .. ";true;false]" + else + return "" + end +end + +local theme_inv = [[ + list[current_player;main;0,4.7;8,1;] + list[current_player;main;0,5.85;8,3;8] + ]] + +function sfinv.make_formspec(player, context, content, show_inv, size) + local tmp = { + size or "size[8,8.6]", + sfinv.get_nav_fs(player, context, context.nav_titles, context.nav_idx), + content + } + if show_inv then + tmp[#tmp + 1] = theme_inv + end + return table.concat(tmp, "") +end + +function sfinv.get_homepage_name(player) + return "sfinv:crafting" +end + +function sfinv.get_formspec(player, context) + -- Generate navigation tabs + local nav = {} + local nav_ids = {} + local current_idx = 1 + for i, pdef in pairs(sfinv.pages_unordered) do + if not pdef.is_in_nav or pdef:is_in_nav(player, context) then + nav[#nav + 1] = pdef.title + nav_ids[#nav_ids + 1] = pdef.name + if pdef.name == context.page then + current_idx = #nav_ids + end + end + end + context.nav = nav_ids + context.nav_titles = nav + context.nav_idx = current_idx + + -- Generate formspec + local page = sfinv.pages[context.page] or sfinv.pages["404"] + if page then + return page:get(player, context) + else + local old_page = context.page + local home_page = sfinv.get_homepage_name(player) + + if old_page == home_page then + minetest.log("error", "[sfinv] Couldn't find " .. dump(old_page) .. + ", which is also the old page") + + return "" + end + + context.page = home_page + assert(sfinv.pages[context.page], "[sfinv] Invalid homepage") + minetest.log("warning", "[sfinv] Couldn't find " .. dump(old_page) .. + " so switching to homepage") + + return sfinv.get_formspec(player, context) + end +end + +function sfinv.get_or_create_context(player) + local name = player:get_player_name() + local context = sfinv.contexts[name] + if not context then + context = { + page = sfinv.get_homepage_name(player) + } + sfinv.contexts[name] = context + end + return context +end + +function sfinv.set_context(player, context) + sfinv.contexts[player:get_player_name()] = context +end + +function sfinv.set_player_inventory_formspec(player, context) + local fs = sfinv.get_formspec(player, + context or sfinv.get_or_create_context(player)) + player:set_inventory_formspec(fs) +end + +function sfinv.set_page(player, pagename) + local context = sfinv.get_or_create_context(player) + local oldpage = sfinv.pages[context.page] + if oldpage and oldpage.on_leave then + oldpage:on_leave(player, context) + end + context.page = pagename + local page = sfinv.pages[pagename] + if page.on_enter then + page:on_enter(player, context) + end + sfinv.set_player_inventory_formspec(player, context) +end + +function sfinv.get_page(player) + local context = sfinv.contexts[player:get_player_name()] + return context and context.page or sfinv.get_homepage_name(player) +end + +minetest.register_on_joinplayer(function(player) + if sfinv.enabled then + sfinv.set_player_inventory_formspec(player) + end +end) + +minetest.register_on_leaveplayer(function(player) + sfinv.contexts[player:get_player_name()] = nil +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "" or not sfinv.enabled then + return false + end + + -- Get Context + local name = player:get_player_name() + local context = sfinv.contexts[name] + if not context then + sfinv.set_player_inventory_formspec(player) + return false + end + + -- Was a tab selected? + if fields.sfinv_nav_tabs and context.nav then + local tid = tonumber(fields.sfinv_nav_tabs) + if tid and tid > 0 then + local id = context.nav[tid] + local page = sfinv.pages[id] + if id and page then + sfinv.set_page(player, id) + end + end + else + -- Pass event to page + local page = sfinv.pages[context.page] + if page and page.on_player_receive_fields then + return page:on_player_receive_fields(player, context, fields) + end + end +end) diff --git a/mods/sfinv/init.lua b/mods/sfinv/init.lua new file mode 100644 index 0000000..a2294a4 --- /dev/null +++ b/mods/sfinv/init.lua @@ -0,0 +1,22 @@ +dofile(minetest.get_modpath("sfinv") .. "/api.lua") + +sfinv.register_page("sfinv:crafting", { + title = "Crafting", + get = function(self, player, context) + return sfinv.make_formspec(player, context, [[ + list[current_player;craft;1.75,0.5;3,3;] + list[current_player;craftpreview;5.75,1.5;1,1;] + image[4.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270] + listring[current_player;main] + listring[current_player;craft] + image[0,4.7;1,1;gui_hb_bg.png] + image[1,4.7;1,1;gui_hb_bg.png] + image[2,4.7;1,1;gui_hb_bg.png] + image[3,4.7;1,1;gui_hb_bg.png] + image[4,4.7;1,1;gui_hb_bg.png] + image[5,4.7;1,1;gui_hb_bg.png] + image[6,4.7;1,1;gui_hb_bg.png] + image[7,4.7;1,1;gui_hb_bg.png] + ]], true) + end +}) diff --git a/mods/sfinv/license.txt b/mods/sfinv/license.txt new file mode 100644 index 0000000..e27dc85 --- /dev/null +++ b/mods/sfinv/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2016-2018 rubenwardy + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/spawn/README.txt b/mods/spawn/README.txt new file mode 100644 index 0000000..fc16c2a --- /dev/null +++ b/mods/spawn/README.txt @@ -0,0 +1,7 @@ +Minetest Game mod: spawn +======================== +See license.txt for license information. + +Authors of source code +---------------------- +paramat (MIT) diff --git a/mods/spawn/depends.txt b/mods/spawn/depends.txt new file mode 100644 index 0000000..548489e --- /dev/null +++ b/mods/spawn/depends.txt @@ -0,0 +1,2 @@ +default +beds? diff --git a/mods/spawn/init.lua b/mods/spawn/init.lua new file mode 100644 index 0000000..6707932 --- /dev/null +++ b/mods/spawn/init.lua @@ -0,0 +1,144 @@ +-- Disable by mapgen, setting or if 'static_spawnpoint' is set +-------------------------------------------------------------- + +local mg_name = minetest.get_mapgen_setting("mg_name") +if mg_name == "v6" or mg_name == "singlenode" or + minetest.settings:get("static_spawnpoint") or + minetest.settings:get_bool("engine_spawn") then + return +end + + +-- Parameters +------------- + +-- Resolution of search grid in nodes. +local res = 64 +-- Number of points checked in the square search grid (edge * edge). +local checks = 128 * 128 +-- Starting point for biome checks. This also sets the y co-ordinate for all +-- points checked, so the suitable biomes must be active at this y. +local pos = {x = 0, y = 8, z = 0} + + +-- Table of suitable biomes + +local biome_ids = { + minetest.get_biome_id("taiga"), + minetest.get_biome_id("coniferous_forest"), + minetest.get_biome_id("deciduous_forest"), + minetest.get_biome_id("grassland"), + minetest.get_biome_id("savanna"), +} + +-- End of parameters +-------------------- + + +-- Direction table + +local dirs = { + {x = 0, y = 0, z = 1}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, + {x = 1, y = 0, z = 0}, +} + + +-- Initial variables + +local edge_len = 1 +local edge_dist = 0 +local dir_step = 0 +local dir_ind = 1 +local searched = false +local success = false +local spawn_pos = {} + + +--Functions +----------- + +-- Get next position on square search spiral + +local function next_pos() + if edge_dist == edge_len then + edge_dist = 0 + dir_ind = dir_ind + 1 + if dir_ind == 5 then + dir_ind = 1 + end + dir_step = dir_step + 1 + edge_len = math.floor(dir_step / 2) + 1 + end + + local dir = dirs[dir_ind] + local move = vector.multiply(dir, res) + + edge_dist = edge_dist + 1 + + return vector.add(pos, move) +end + + +-- Spawn position search + +local function search() + for iter = 1, checks do + local biome_data = minetest.get_biome_data(pos) + -- Sometimes biome_data is nil + local biome = biome_data and biome_data.biome + for id_ind = 1, #biome_ids do + local biome_id = biome_ids[id_ind] + if biome == biome_id then + local spawn_y = minetest.get_spawn_level(pos.x, pos.z) + if spawn_y then + spawn_pos = {x = pos.x, y = spawn_y, z = pos.z} + return true + end + end + end + + pos = next_pos() + end + + return false +end + + +-- On new player spawn and player respawn + +-- Search for spawn position once per server session. If successful, store +-- position and reposition players, otherwise leave them at engine spawn +-- position. + +local function on_spawn(player) + if not searched then + success = search() + searched = true + end + if success then + player:set_pos(spawn_pos) + end +end + +minetest.register_on_newplayer(function(player) + on_spawn(player) +end) + +local enable_bed_respawn = minetest.settings:get_bool("enable_bed_respawn") +if enable_bed_respawn == nil then + enable_bed_respawn = true +end + +minetest.register_on_respawnplayer(function(player) + -- Avoid respawn conflict with beds mod + if beds and enable_bed_respawn and + beds.spawn[player:get_player_name()] then + return + end + + on_spawn(player) + + return true +end) diff --git a/mods/spawn/license.txt b/mods/spawn/license.txt new file mode 100644 index 0000000..a466aab --- /dev/null +++ b/mods/spawn/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2018 paramat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/stairs/README.txt b/mods/stairs/README.txt index d32cd71..26317f7 100644 --- a/mods/stairs/README.txt +++ b/mods/stairs/README.txt @@ -4,13 +4,24 @@ See license.txt for license information. Authors of source code ---------------------- -Originally by Kahrl (LGPL 2.1) and -celeron55, Perttu Ahola (LGPL 2.1) -Various Minetest developers and contributors (LGPL 2.1) +Originally by Kahrl (LGPLv2.1+) and +celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest developers and contributors (LGPLv2.1+) -Authors of media (models) -------------------------- -Jean-Patrick G. (kilbith) (CC BY-SA 3.0): - stairs_stair.obj +Authors of media (textures) +--------------------------- +Textures +-------- +Copyright (c) 2018 Shara RedCat (CC BY-SA 3.0): + Derived from a texture by PilzAdam (CC BY-SA 3.0): + stairs_obsidian_glass_outer_stairside.png + stairs_obsidian_glass_stairside.png +Copyright (c) 2018 TumeniNodes (CC BY-SA 3.0): + Derived from a texture by celeron55 (CC BY-SA 3.0) and + converted to bright white by Krock (CC BY-SA 3.0): + stairs_glass_stairside.png + stairs_glass_split.png + Derived from a texture by PilzAdam (CC BY-SA 3.0): + stairs_obsidian_glass_split.png diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 6e98d74..e9f6dc1 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -23,7 +23,7 @@ local function rotate_and_place(itemstack, placer, pointed_thing) local param2 = 0 if placer then - local placer_pos = placer:getpos() + local placer_pos = placer:get_pos() if placer_pos then param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) end @@ -44,10 +44,13 @@ local function rotate_and_place(itemstack, placer, pointed_thing) return minetest.item_place(itemstack, placer, pointed_thing, param2) end --- Register stairs. + +-- Register stair -- Node will be called stairs:stair_ -function stairs.register_stair(subname, recipeitem, groups, images, description, sounds) +function stairs.register_stair(subname, recipeitem, groups, images, description, + sounds, worldaligntex) + -- Set backface culling and world-aligned textures local stair_images = {} for i, image in ipairs(images) do if type(image) == "string" then @@ -55,35 +58,35 @@ function stairs.register_stair(subname, recipeitem, groups, images, description, name = image, backface_culling = true, } - elseif image.backface_culling == nil then -- override using any other value + if worldaligntex then + stair_images[i].align_style = "world" + end + else stair_images[i] = table.copy(image) - stair_images[i].backface_culling = true + if stair_images[i].backface_culling == nil then + stair_images[i].backface_culling = true + end + if worldaligntex and stair_images[i].align_style == nil then + stair_images[i].align_style = "world" + end end end local new_groups = table.copy(groups) new_groups.stair = 1 minetest.register_node(":stairs:stair_" .. subname, { description = description, - drawtype = "mesh", - mesh = "stairs_stair.obj", + drawtype = "nodebox", tiles = stair_images, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, groups = new_groups, sounds = sounds, - selection_box = { + node_box = { type = "fixed", fixed = { - {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - {-0.5, 0, 0, 0.5, 0.5, 0.5}, - }, - }, - collision_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - {-0.5, 0, 0, 0.5, 0.5, 0.5}, + {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5}, + {-0.5, 0.0, 0.0, 0.5, 0.5, 0.5}, }, }, on_place = function(itemstack, placer, pointed_thing) @@ -114,6 +117,15 @@ function stairs.register_stair(subname, recipeitem, groups, images, description, }, }) + -- Use stairs to craft full blocks again (1:1) + minetest.register_craft({ + output = recipeitem .. ' 3', + recipe = { + {'stairs:stair_' .. subname, 'stairs:stair_' .. subname}, + {'stairs:stair_' .. subname, 'stairs:stair_' .. subname}, + }, + }) + -- Fuel local baseburntime = minetest.get_craft_result({ method = "fuel", @@ -131,19 +143,34 @@ function stairs.register_stair(subname, recipeitem, groups, images, description, end --- Slab facedir to placement 6d matching table -local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4} - --- Register slabs. +-- Register slab -- Node will be called stairs:slab_ -function stairs.register_slab(subname, recipeitem, groups, images, description, sounds) +function stairs.register_slab(subname, recipeitem, groups, images, description, + sounds, worldaligntex) + -- Set world-aligned textures + local slab_images = {} + for i, image in ipairs(images) do + if type(image) == "string" then + slab_images[i] = { + name = image, + } + if worldaligntex then + slab_images[i].align_style = "world" + end + else + slab_images[i] = table.copy(image) + if worldaligntex and image.align_style == nil then + slab_images[i].align_style = "world" + end + end + end local new_groups = table.copy(groups) new_groups.slab = 1 minetest.register_node(":stairs:slab_" .. subname, { description = description, drawtype = "nodebox", - tiles = images, + tiles = slab_images, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, @@ -160,33 +187,13 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, local creative_enabled = (creative and creative.is_enabled_for and creative.is_enabled_for(player_name)) - if under and under.name:find("stairs:slab_") then + if under and under.name:find("^stairs:slab_") then -- place slab using under node orientation local dir = minetest.dir_to_facedir(vector.subtract( pointed_thing.above, pointed_thing.under), true) local p2 = under.param2 - -- combine two slabs if possible - if slab_trans_dir[math.floor(p2 / 4)] == dir - and wield_item == under.name then - - if not recipeitem then - return itemstack - end - if minetest.is_protected(pointed_thing.under, player_name) and not - minetest.check_player_privs(player_name, "protection_bypass") then - minetest.record_protection_violation(pointed_thing.under, - player_name) - return - end - minetest.set_node(pointed_thing.under, {name = recipeitem, param2 = p2}) - if not creative_enabled then - itemstack:take_item() - end - return itemstack - end - -- Placing a slab on an upside down slab should make it right-side up. if p2 >= 20 and dir == 8 then p2 = p2 - 20 @@ -223,6 +230,15 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, }, }) + -- Use 2 slabs to craft a full block again (1:1) + minetest.register_craft({ + output = recipeitem, + recipe = { + {'stairs:slab_' .. subname}, + {'stairs:slab_' .. subname}, + }, + }) + -- Fuel local baseburntime = minetest.get_craft_result({ method = "fuel", @@ -263,13 +279,179 @@ if replace then end +-- Register inner stair +-- Node will be called stairs:stair_inner_ + +function stairs.register_stair_inner(subname, recipeitem, groups, images, + description, sounds, worldaligntex) + -- Set backface culling and world-aligned textures + local stair_images = {} + for i, image in ipairs(images) do + if type(image) == "string" then + stair_images[i] = { + name = image, + backface_culling = true, + } + if worldaligntex then + stair_images[i].align_style = "world" + end + else + stair_images[i] = table.copy(image) + if stair_images[i].backface_culling == nil then + stair_images[i].backface_culling = true + end + if worldaligntex and stair_images[i].align_style == nil then + stair_images[i].align_style = "world" + end + end + end + local new_groups = table.copy(groups) + new_groups.stair = 1 + minetest.register_node(":stairs:stair_inner_" .. subname, { + description = "Inner " .. description, + drawtype = "nodebox", + tiles = stair_images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = new_groups, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5}, + {-0.5, 0.0, 0.0, 0.5, 0.5, 0.5}, + {-0.5, 0.0, -0.5, 0.0, 0.5, 0.0}, + }, + }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + return rotate_and_place(itemstack, placer, pointed_thing) + end, + }) + + if recipeitem then + minetest.register_craft({ + output = 'stairs:stair_inner_' .. subname .. ' 7', + recipe = { + {"", recipeitem, ""}, + {recipeitem, "", recipeitem}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Fuel + local baseburntime = minetest.get_craft_result({ + method = "fuel", + width = 1, + items = {recipeitem} + }).time + if baseburntime > 0 then + minetest.register_craft({ + type = "fuel", + recipe = 'stairs:stair_inner_' .. subname, + burntime = math.floor(baseburntime * 0.875), + }) + end + end +end + + +-- Register outer stair +-- Node will be called stairs:stair_outer_ + +function stairs.register_stair_outer(subname, recipeitem, groups, images, + description, sounds, worldaligntex) + -- Set backface culling and world-aligned textures + local stair_images = {} + for i, image in ipairs(images) do + if type(image) == "string" then + stair_images[i] = { + name = image, + backface_culling = true, + } + if worldaligntex then + stair_images[i].align_style = "world" + end + else + stair_images[i] = table.copy(image) + if stair_images[i].backface_culling == nil then + stair_images[i].backface_culling = true + end + if worldaligntex and stair_images[i].align_style == nil then + stair_images[i].align_style = "world" + end + end + end + local new_groups = table.copy(groups) + new_groups.stair = 1 + minetest.register_node(":stairs:stair_outer_" .. subname, { + description = "Outer " .. description, + drawtype = "nodebox", + tiles = stair_images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = new_groups, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5}, + {-0.5, 0.0, 0.0, 0.0, 0.5, 0.5}, + }, + }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + return rotate_and_place(itemstack, placer, pointed_thing) + end, + }) + + if recipeitem then + minetest.register_craft({ + output = 'stairs:stair_outer_' .. subname .. ' 6', + recipe = { + {"", recipeitem, ""}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Fuel + local baseburntime = minetest.get_craft_result({ + method = "fuel", + width = 1, + items = {recipeitem} + }).time + if baseburntime > 0 then + minetest.register_craft({ + type = "fuel", + recipe = 'stairs:stair_outer_' .. subname, + burntime = math.floor(baseburntime * 0.625), + }) + end + end +end + + -- Stair/slab registration function. -- Nodes will be called stairs:{stair,slab}_ -function stairs.register_stair_and_slab(subname, recipeitem, - groups, images, desc_stair, desc_slab, sounds) - stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds) - stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds) +function stairs.register_stair_and_slab(subname, recipeitem, groups, images, + desc_stair, desc_slab, sounds, worldaligntex) + stairs.register_stair(subname, recipeitem, groups, images, desc_stair, + sounds, worldaligntex) + stairs.register_stair_inner(subname, recipeitem, groups, images, desc_stair, + sounds, worldaligntex) + stairs.register_stair_outer(subname, recipeitem, groups, images, desc_stair, + sounds, worldaligntex) + stairs.register_slab(subname, recipeitem, groups, images, desc_slab, + sounds, worldaligntex) end @@ -282,7 +464,8 @@ stairs.register_stair_and_slab( {"default_wood.png"}, "Wooden Stair", "Wooden Slab", - default.node_sound_wood_defaults() + default.node_sound_wood_defaults(), + false ) stairs.register_stair_and_slab( @@ -292,7 +475,8 @@ stairs.register_stair_and_slab( {"default_junglewood.png"}, "Jungle Wood Stair", "Jungle Wood Slab", - default.node_sound_wood_defaults() + default.node_sound_wood_defaults(), + false ) stairs.register_stair_and_slab( @@ -302,7 +486,8 @@ stairs.register_stair_and_slab( {"default_pine_wood.png"}, "Pine Wood Stair", "Pine Wood Slab", - default.node_sound_wood_defaults() + default.node_sound_wood_defaults(), + false ) stairs.register_stair_and_slab( @@ -312,7 +497,8 @@ stairs.register_stair_and_slab( {"default_acacia_wood.png"}, "Acacia Wood Stair", "Acacia Wood Slab", - default.node_sound_wood_defaults() + default.node_sound_wood_defaults(), + false ) stairs.register_stair_and_slab( @@ -322,7 +508,8 @@ stairs.register_stair_and_slab( {"default_aspen_wood.png"}, "Aspen Wood Stair", "Aspen Wood Slab", - default.node_sound_wood_defaults() + default.node_sound_wood_defaults(), + false ) stairs.register_stair_and_slab( @@ -332,7 +519,8 @@ stairs.register_stair_and_slab( {"default_stone.png"}, "Stone Stair", "Stone Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -342,17 +530,19 @@ stairs.register_stair_and_slab( {"default_cobble.png"}, "Cobblestone Stair", "Cobblestone Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( "mossycobble", - nil, + "default:mossycobble", {cracky = 3}, {"default_mossycobble.png"}, "Mossy Cobblestone Stair", "Mossy Cobblestone Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -362,7 +552,8 @@ stairs.register_stair_and_slab( {"default_stone_brick.png"}, "Stone Brick Stair", "Stone Brick Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + false ) stairs.register_stair_and_slab( @@ -372,7 +563,8 @@ stairs.register_stair_and_slab( {"default_stone_block.png"}, "Stone Block Stair", "Stone Block Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -382,7 +574,8 @@ stairs.register_stair_and_slab( {"default_desert_stone.png"}, "Desert Stone Stair", "Desert Stone Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -392,7 +585,8 @@ stairs.register_stair_and_slab( {"default_desert_cobble.png"}, "Desert Cobblestone Stair", "Desert Cobblestone Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -402,7 +596,8 @@ stairs.register_stair_and_slab( {"default_desert_stone_brick.png"}, "Desert Stone Brick Stair", "Desert Stone Brick Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + false ) stairs.register_stair_and_slab( @@ -412,7 +607,8 @@ stairs.register_stair_and_slab( {"default_desert_stone_block.png"}, "Desert Stone Block Stair", "Desert Stone Block Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -422,7 +618,8 @@ stairs.register_stair_and_slab( {"default_sandstone.png"}, "Sandstone Stair", "Sandstone Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -432,7 +629,8 @@ stairs.register_stair_and_slab( {"default_sandstone_brick.png"}, "Sandstone Brick Stair", "Sandstone Brick Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + false ) stairs.register_stair_and_slab( @@ -442,7 +640,8 @@ stairs.register_stair_and_slab( {"default_sandstone_block.png"}, "Sandstone Block Stair", "Sandstone Block Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -452,7 +651,8 @@ stairs.register_stair_and_slab( {"default_desert_sandstone.png"}, "Desert Sandstone Stair", "Desert Sandstone Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -462,7 +662,8 @@ stairs.register_stair_and_slab( {"default_desert_sandstone_brick.png"}, "Desert Sandstone Brick Stair", "Desert Sandstone Brick Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + false ) stairs.register_stair_and_slab( @@ -472,7 +673,8 @@ stairs.register_stair_and_slab( {"default_desert_sandstone_block.png"}, "Desert Sandstone Block Stair", "Desert Sandstone Block Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -482,7 +684,8 @@ stairs.register_stair_and_slab( {"default_silver_sandstone.png"}, "Silver Sandstone Stair", "Silver Sandstone Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -492,7 +695,8 @@ stairs.register_stair_and_slab( {"default_silver_sandstone_brick.png"}, "Silver Sandstone Brick Stair", "Silver Sandstone Brick Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + false ) stairs.register_stair_and_slab( @@ -502,7 +706,8 @@ stairs.register_stair_and_slab( {"default_silver_sandstone_block.png"}, "Silver Sandstone Block Stair", "Silver Sandstone Block Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -512,7 +717,8 @@ stairs.register_stair_and_slab( {"default_obsidian.png"}, "Obsidian Stair", "Obsidian Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -522,7 +728,8 @@ stairs.register_stair_and_slab( {"default_obsidian_brick.png"}, "Obsidian Brick Stair", "Obsidian Brick Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + false ) stairs.register_stair_and_slab( @@ -532,7 +739,8 @@ stairs.register_stair_and_slab( {"default_obsidian_block.png"}, "Obsidian Block Stair", "Obsidian Block Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + true ) stairs.register_stair_and_slab( @@ -542,7 +750,8 @@ stairs.register_stair_and_slab( {"default_brick.png"}, "Brick Stair", "Brick Slab", - default.node_sound_stone_defaults() + default.node_sound_stone_defaults(), + false ) stairs.register_stair_and_slab( @@ -552,7 +761,19 @@ stairs.register_stair_and_slab( {"default_steel_block.png"}, "Steel Block Stair", "Steel Block Slab", - default.node_sound_metal_defaults() + default.node_sound_metal_defaults(), + true +) + +stairs.register_stair_and_slab( + "tinblock", + "default:tinblock", + {cracky = 1, level = 2}, + {"default_tin_block.png"}, + "Tin Block Stair", + "Tin Block Slab", + default.node_sound_metal_defaults(), + true ) stairs.register_stair_and_slab( @@ -562,7 +783,8 @@ stairs.register_stair_and_slab( {"default_copper_block.png"}, "Copper Block Stair", "Copper Block Slab", - default.node_sound_metal_defaults() + default.node_sound_metal_defaults(), + true ) stairs.register_stair_and_slab( @@ -572,7 +794,8 @@ stairs.register_stair_and_slab( {"default_bronze_block.png"}, "Bronze Block Stair", "Bronze Block Slab", - default.node_sound_metal_defaults() + default.node_sound_metal_defaults(), + true ) stairs.register_stair_and_slab( @@ -582,29 +805,122 @@ stairs.register_stair_and_slab( {"default_gold_block.png"}, "Gold Block Stair", "Gold Block Slab", - default.node_sound_metal_defaults() + default.node_sound_metal_defaults(), + true ) stairs.register_stair_and_slab( "ice", "default:ice", - {cracky = 3, puts_out_fire = 1, cools_lava = 1}, + {cracky = 3, cools_lava = 1, slippery = 3}, {"default_ice.png"}, "Ice Stair", "Ice Slab", - default.node_sound_glass_defaults() + default.node_sound_glass_defaults(), + true ) stairs.register_stair_and_slab( "snowblock", "default:snowblock", - {crumbly = 3, puts_out_fire = 1, cools_lava = 1, snowy = 1}, + {crumbly = 3, cools_lava = 1, snowy = 1}, {"default_snow.png"}, "Snow Block Stair", "Snow Block Slab", - default.node_sound_dirt_defaults({ - footstep = {name = "default_snow_footstep", gain = 0.15}, - dug = {name = "default_snow_footstep", gain = 0.2}, - dig = {name = "default_snow_footstep", gain = 0.2} - }) + default.node_sound_snow_defaults(), + true +) + +-- Glass stair nodes need to be registered individually to utilize specialized textures. + +stairs.register_stair( + "glass", + "default:glass", + {cracky = 3}, + {"stairs_glass_split.png", "default_glass.png", + "stairs_glass_stairside.png^[transformFX", "stairs_glass_stairside.png", + "default_glass.png", "stairs_glass_split.png"}, + "Glass Stair", + default.node_sound_glass_defaults(), + false +) + +stairs.register_slab( + "glass", + "default:glass", + {cracky = 3}, + {"default_glass.png", "default_glass.png", "stairs_glass_split.png"}, + "Glass Slab", + default.node_sound_glass_defaults(), + false +) + +stairs.register_stair_inner( + "glass", + "default:glass", + {cracky = 3}, + {"stairs_glass_stairside.png^[transformR270", "default_glass.png", + "stairs_glass_stairside.png^[transformFX", "default_glass.png", + "default_glass.png", "stairs_glass_stairside.png"}, + "Glass Stair", + default.node_sound_glass_defaults(), + false +) + +stairs.register_stair_outer( + "glass", + "default:glass", + {cracky = 3}, + {"stairs_glass_stairside.png^[transformR90", "default_glass.png", + "stairs_glass_outer_stairside.png", "stairs_glass_stairside.png", + "stairs_glass_stairside.png^[transformR90","stairs_glass_outer_stairside.png"}, + "Glass Stair", + default.node_sound_glass_defaults(), + false +) + +stairs.register_stair( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 3}, + {"stairs_obsidian_glass_split.png", "default_obsidian_glass.png", + "stairs_obsidian_glass_stairside.png^[transformFX", "stairs_obsidian_glass_stairside.png", + "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"}, + "Obsidian Glass Stair", + default.node_sound_glass_defaults(), + false +) + +stairs.register_slab( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 3}, + {"default_obsidian_glass.png", "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"}, + "Obsidian Glass Slab", + default.node_sound_glass_defaults(), + false +) + +stairs.register_stair_inner( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 3}, + {"stairs_obsidian_glass_stairside.png^[transformR270", "default_obsidian_glass.png", + "stairs_obsidian_glass_stairside.png^[transformFX", "default_obsidian_glass.png", + "default_obsidian_glass.png", "stairs_obsidian_glass_stairside.png"}, + "Obsidian Glass Stair", + default.node_sound_glass_defaults(), + false +) + +stairs.register_stair_outer( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 3}, + {"stairs_obsidian_glass_stairside.png^[transformR90", "default_obsidian_glass.png", + "stairs_obsidian_glass_outer_stairside.png", "stairs_obsidian_glass_stairside.png", + "stairs_obsidian_glass_stairside.png^[transformR90","stairs_obsidian_glass_outer_stairside.png"}, + "Obsidian Glass Stair", + default.node_sound_glass_defaults(), + false ) diff --git a/mods/stairs/license.txt b/mods/stairs/license.txt index 8f16bbd..57bd98c 100644 --- a/mods/stairs/license.txt +++ b/mods/stairs/license.txt @@ -2,9 +2,9 @@ License of source code ---------------------- GNU Lesser General Public License, version 2.1 -Copyright (C) 2011-2016 Kahrl -Copyright (C) 2011-2016 celeron55, Perttu Ahola -Copyright (C) 2012-2016 Various Minetest developers and contributors +Copyright (C) 2011-2017 Kahrl +Copyright (C) 2011-2017 celeron55, Perttu Ahola +Copyright (C) 2012-2017 Various Minetest developers and contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; @@ -14,38 +14,3 @@ This program is distributed in the hope that it will be useful, but WITHOUT ANY without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html - - -Licenses of media (models) --------------------------- - -Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) -Copyright (C) 2015-2016 Jean-Patrick G. (kilbith) - -You are free to: -Share — copy and redistribute the material in any medium or format. -Adapt — remix, transform, and build upon the material for any purpose, even commercially. -The licensor cannot revoke these freedoms as long as you follow the license terms. - -Under the following terms: - -Attribution — You must give appropriate credit, provide a link to the license, and -indicate if changes were made. You may do so in any reasonable manner, but not in any way -that suggests the licensor endorses you or your use. - -ShareAlike — If you remix, transform, or build upon the material, you must distribute -your contributions under the same license as the original. - -No additional restrictions — You may not apply legal terms or technological measures that -legally restrict others from doing anything the license permits. - -Notices: - -You do not have to comply with the license for elements of the material in the public -domain or where your use is permitted by an applicable exception or limitation. -No warranties are given. The license may not give you all of the permissions necessary -for your intended use. For example, other rights such as publicity, privacy, or moral -rights may limit how you use the material. - -For more details: -http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/stairs/models/stairs_stair.obj b/mods/stairs/models/stairs_stair.obj deleted file mode 100644 index 198edf6..0000000 --- a/mods/stairs/models/stairs_stair.obj +++ /dev/null @@ -1,115 +0,0 @@ -# Blender v2.72 (sub 0) OBJ File: '' -# www.blender.org -mtllib stairs.mtl -o stairs_top -v -0.500000 0.000000 -0.500000 -v -0.500000 0.000000 0.000000 -v 0.500000 0.000000 0.000000 -v 0.500000 0.000000 -0.500000 -v -0.500000 0.500000 0.000000 -v 0.500000 0.500000 0.000000 -v -0.500000 0.500000 0.500000 -v 0.500000 0.500000 0.500000 -vt 0.000000 0.000000 -vt 1.000000 0.000000 -vt 1.000000 0.500000 -vt 0.000000 0.500000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vn 0.000000 1.000000 0.000000 -g stairs_top -usemtl None -s off -f 4/1/1 1/2/1 2/3/1 3/4/1 -f 7/5/1 8/6/1 6/4/1 5/3/1 -o stairs_bottom -v -0.500000 -0.500000 -0.500000 -v 0.500000 -0.500000 -0.500000 -v -0.500000 -0.500000 0.500000 -v 0.500000 -0.500000 0.500000 -vt 1.000000 0.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 0.000000 -vn 0.000000 -1.000000 -0.000000 -g stairs_bottom -usemtl None -s off -f 11/7/2 9/8/2 10/9/2 12/10/2 -o stairs_right -v -0.500000 0.000000 -0.500000 -v -0.500000 -0.500000 -0.500000 -v -0.500000 0.000000 0.000000 -v -0.500000 -0.500000 0.500000 -v -0.500000 0.500000 0.000000 -v -0.500000 0.500000 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.000000 -vt 0.500000 0.500000 -vt 1.000000 1.000000 -vt 0.500000 1.000000 -vt 1.000000 0.000000 -vn -1.000000 0.000000 0.000000 -g stairs_right -usemtl None -s off -f 13/11/3 14/12/3 15/13/3 -f 15/13/3 18/14/3 17/15/3 -f 14/12/3 16/16/3 15/13/3 -f 16/16/3 18/14/3 15/13/3 -o stairs_left -v 0.500000 0.000000 0.000000 -v 0.500000 -0.500000 -0.500000 -v 0.500000 0.000000 -0.500000 -v 0.500000 -0.500000 0.500000 -v 0.500000 0.500000 0.000000 -v 0.500000 0.500000 0.500000 -vt 0.500000 0.500000 -vt 1.000000 0.000000 -vt 1.000000 0.500000 -vt 0.500000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 0.000000 -vn 1.000000 0.000000 0.000000 -g stairs_left -usemtl None -s off -f 19/17/4 20/18/4 21/19/4 -f 19/17/4 23/20/4 24/21/4 -f 20/18/4 19/17/4 22/22/4 -f 19/17/4 24/21/4 22/22/4 -o stairs_back -v -0.500000 -0.500000 0.500000 -v 0.500000 -0.500000 0.500000 -v -0.500000 0.500000 0.500000 -v 0.500000 0.500000 0.500000 -vt 1.000000 0.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 0.000000 -vn 0.000000 -0.000000 1.000000 -g stairs_back -usemtl None -s off -f 26/23/5 28/24/5 27/25/5 25/26/5 -o stairs_front -v -0.500000 0.000000 -0.500000 -v -0.500000 -0.500000 -0.500000 -v -0.500000 0.000000 0.000000 -v 0.500000 0.000000 0.000000 -v 0.500000 -0.500000 -0.500000 -v 0.500000 0.000000 -0.500000 -v -0.500000 0.500000 0.000000 -v 0.500000 0.500000 0.000000 -vt 1.000000 0.000000 -vt 1.000000 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vn 0.000000 0.000000 -1.000000 -g stairs_front -usemtl None -s off -f 30/27/6 29/28/6 34/29/6 33/30/6 -f 31/28/6 35/31/6 36/32/6 32/29/6 diff --git a/mods/stairs/textures/stairs_glass_outer_stairside.png b/mods/stairs/textures/stairs_glass_outer_stairside.png new file mode 100644 index 0000000000000000000000000000000000000000..9b298c8bfccd6308589556672b13d982d9a76d5b GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Wq?nJE0F&A^XH#GfBygf|N8ao zckkZ4fB*jD$B&;refs?Q^VhFmzkU1m{rh*InqR+u{r>$MsPf;xe?Y}^CU!0aYGx@3 z@&g&huz7OYEFe|r>Eak7A<25Mld)NWfn`HPlxStk?fM&PMw>SUeSTwCHk&Dh$+toB zL80K25V1vzj1Q^bk+WE`@B+&YIfZ93#rraCPu`9$j@`O$Zs6y+`|I{uF>Em9d(e=v xq(S5li)Mn13qwORL&Lha_pa}o95eIroBFUC*85Wmb{zpZ!qe5yWt~$(69A!~d4~W1 literal 0 HcmV?d00001 diff --git a/mods/stairs/textures/stairs_glass_split.png b/mods/stairs/textures/stairs_glass_split.png new file mode 100644 index 0000000000000000000000000000000000000000..62879597850e75ff1e5258d14897c0902a4c67b7 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Wq?nJE0F&D`SZ7L-~Rmh^Z)<< zw{PFRfB*i&hYz1VeFBPq`SJxQ_5J(zpFe;8`t=K_=I`IX|Ni|0s??2&&;x2_EeY}i z8OFeHD4T5~kjnCOaSV}=WIf2p)TAK7x*;@$tL8%a|HIpEehU)jzYIl+4ADv<4-u6{1-oD!MEak7A<24>F{#;sgJHuKztx9iKm0$h7r1qi+WM=qhS|Rvw>G9W_#}9n8O>?_@Yh7ML)50LT#kH}&M25w;xW@MN(M*=9wUgGKN%KnI(lUcwx z>&oIaKp`Vf7sn8e>&YCwv!qTvIPl^Chw2QO84^+w(h?InHV7G9JaB*^SpkC^>bP0l+XkKF2^tv literal 0 HcmV?d00001 diff --git a/mods/stairs/textures/stairs_obsidian_glass_split.png b/mods/stairs/textures/stairs_obsidian_glass_split.png new file mode 100644 index 0000000000000000000000000000000000000000..7647b9b0858e976a6b6dbfda04594bc1b66d0094 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t_%$60s;c^YKGP7c6C5O z#*!evUYoHDWPgg&ebxsLQ0LSAX9smFU literal 0 HcmV?d00001 diff --git a/mods/stairs/textures/stairs_obsidian_glass_stairside.png b/mods/stairs/textures/stairs_obsidian_glass_stairside.png new file mode 100644 index 0000000000000000000000000000000000000000..850f4c61aca3b350843fc1eb162e38b01bb01c7c GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t_%$60s;c^YKGP7c6C5O z#*!evUYh7ML)50LT#kH}&M25w;xW@MN(M*=9wUgGKN%KnI(lUZ1D zmXqa9ppdbri(?2!wC{04K?VaJ=8feOX0}XU#M$}b?FF9L67?drh-*Q5QEU0LKV=BC fEn4`Y?BvWC5f>hLm$gb=K= 1 then + timer = 0 + for i = 10, 28 do + for m = 9,27 do + minetest.set_node({x=i, y=m, z=-75}, {name="sudoku:gray"}) + end + end + for i = 75, 85 do + for m = 9,28 do + minetest.set_node({x=9, y=m, z=(-1)*i}, {name="sudoku:wall"}) + minetest.set_node({x=29, y=m, z=(-1)*i}, {name="sudoku:wall"}) + end + end + for i = 86, 87 do + for m = 9,28 do + minetest.set_node({x=10, y=m, z=(-1)*i}, {name="sudoku:wall"}) + minetest.set_node({x=28, y=m, z=(-1)*i}, {name="sudoku:wall"}) + end + end + for i = 88, 89 do + for m = 9,28 do + minetest.set_node({x=11, y=m, z=(-1)*i}, {name="sudoku:wall"}) + minetest.set_node({x=27, y=m, z=(-1)*i}, {name="sudoku:wall"}) + end + end + for m = 9,28 do + minetest.set_node({x=12, y=m, z=-90}, {name="sudoku:wall"}) + minetest.set_node({x=26, y=m, z=-90}, {name="sudoku:wall"}) + minetest.set_node({x=13, y=m, z=-91}, {name="sudoku:wall"}) + minetest.set_node({x=25, y=m, z=-91}, {name="sudoku:wall"}) + minetest.set_node({x=14, y=m, z=-92}, {name="sudoku:wall"}) + minetest.set_node({x=24, y=m, z=-92}, {name="sudoku:wall"}) + end + for i = 15, 23 do + for m = 9,28 do + minetest.set_node({x=i, y=m, z=-93}, {name="sudoku:wall"}) + end + end + + for i = 10, 28 do + for j = 75, 78 do + minetest.set_node({x=i, y=28, z=(-1)*j}, {name="sudoku:wall"}) + end + end + for i = 10, 28 do + for j = 75, 93 do + minetest.set_node({x=i, y=7, z=(-1)*j}, {name="sudoku:desert"}) + minetest.set_node({x=i, y=8, z=(-1)*j}, {name="sudoku:desert"}) + end + end + for i = 11, 27 do + for j = 80, 84 do + minetest.set_node({x=i, y=8, z=(-1)*j}, {name="air"}) + end + end + for i = 12, 26 do + for j = 85, 86 do + minetest.set_node({x=i, y=8, z=(-1)*j}, {name="air"}) + end + end + for i = 13, 25 do + for j = 87, 88 do + minetest.set_node({x=i, y=8, z=(-1)*j}, {name="air"}) + end + end + for i = 14, 24 do + minetest.set_node({x=i, y=8, z=-89}, {name="air"}) + end + for i = 15, 23 do + minetest.set_node({x=i, y=8, z=-90}, {name="air"}) + end + for i = 16, 22 do + minetest.set_node({x=i, y=8, z=-91}, {name="air"}) + end + minetest.set_node({x=17, y=8, z=-80}, {name="sudoku:new_w1"}) + minetest.set_node({x=18, y=8, z=-80}, {name="sudoku:new_w2"}) + minetest.set_node({x=19, y=8, z=-80}, {name="sudoku:new_w3"}) + minetest.set_node({x=20, y=8, z=-80}, {name="sudoku:new_w4"}) + minetest.set_node({x=21, y=8, z=-80}, {name="sudoku:new_w5"}) + minetest.set_node({x=19, y=7, z=-85}, {name="sudoku:finisch"}) + end + end +end) + minetest.register_node("sudoku:desert",{ description = "Desert", tiles = {"default_desert_sand.png"}, - --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, }) minetest.register_node("sudoku:black",{ description = "Black", tiles = {"wool_black.png"}, - --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, }) minetest.register_node("sudoku:gray",{ description = "Gray", tiles = {"default_sand.png"}, - --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, }) minetest.register_node("sudoku:glass", { description = "Obsidian Glass", @@ -104,17 +258,28 @@ minetest.register_node("sudoku:glass", { paramtype2 = "glasslikeliquidlevel", is_ground_content = false, sunlight_propagates = true, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, }) minetest.register_node("sudoku:wall",{ description = "Wall", tiles = {"default_mossycobble.png"}, - --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, +}) +minetest.register_node("sudoku:meselamp", { + description = "Mese Lamp", + drawtype = "glasslike", + tiles = {"sudoku_meselamp.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + light_source = 15, }) for i=1,9 do minetest.register_node("sudoku:"..i,{ description = ""..i, tiles = {"sudoku_1_"..i..".png"}, - --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, }) end for i=1,9 do @@ -122,6 +287,13 @@ for i=1,9 do description = ""..i, tiles = {"sudoku_2_"..i..".png"}, groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if Place(placer,i,pos) == false or pos.z ~= -76 then + minetest.set_node(pos, {name="air"}) + local player_inv = placer:get_inventory() + return itemstack + end + end, }) end function New(player,page) @@ -137,10 +309,25 @@ function New(player,page) for i=1,9 do ar1[i] = lv:read("*l") end - for i=14,24 do - for k=9,19 do + for i=10,28 do + for k=9,27 do minetest.set_node({x=i, y=k, z=-76}, {name="air"}) end + end + for i=10,13 do + for k=9,27 do + minetest.set_node({x=i, y=k, z=-76}, {name="sudoku:wall"}) + end + end + for i=25,28 do + for k=9,27 do + minetest.set_node({x=i, y=k, z=-76}, {name="sudoku:wall"}) + end + end + for i=10,28 do + for k=18,27 do + minetest.set_node({x=i, y=k, z=-76}, {name="sudoku:wall"}) + end end local a1 = 0 local a2 = 0 @@ -242,6 +429,184 @@ function Fi(i,k) end return temp end +function repeats(s,c) + local _,n = s:gsub(c,"") + return n +end +function Place(player,number,pos) + local dd = 0 + local ar = {} + for i=14,24 do + local d = 0 + local temp = "" + for k=9,19 do + temp = temp..Fi(i,k) + end + ar[i-13] = temp + end + for i=1,3 do + if repeats(ar[i],"1") < 2 and repeats(ar[i],"2") < 2 and repeats(ar[i],"3") < 2 and repeats(ar[i],"4") < 2 and repeats(ar[i],"5") < 2 and repeats(ar[i],"6") < 2 and repeats(ar[i],"7") < 2 and repeats(ar[i],"8") < 2 and repeats(ar[i],"9") < 2 then + else + dd = 1 + end + end + for i=5,7 do + if repeats(ar[i],"1") < 2 and repeats(ar[i],"2") < 2 and repeats(ar[i],"3") < 2 and repeats(ar[i],"4") < 2 and repeats(ar[i],"5") < 2 and repeats(ar[i],"6") < 2 and repeats(ar[i],"7") < 2 and repeats(ar[i],"8") < 2 and repeats(ar[i],"9") < 2 then + else + dd = 1 + end + end + for i=9,11 do + if repeats(ar[i],"1") < 2 and repeats(ar[i],"2") < 2 and repeats(ar[i],"3") < 2 and repeats(ar[i],"4") < 2 and repeats(ar[i],"5") < 2 and repeats(ar[i],"6") < 2 and repeats(ar[i],"7") < 2 and repeats(ar[i],"8") < 2 and repeats(ar[i],"9") < 2 then + else + dd = 1 + end + end + local ar = {} + for k=9,19 do + local d = 0 + local temp = "" + for i=14,24 do + temp = temp..Fi(i,k) + end + ar[k-8] = temp + end + for i=1,3 do + if repeats(ar[i],"1") < 2 and repeats(ar[i],"2") < 2 and repeats(ar[i],"3") < 2 and repeats(ar[i],"4") < 2 and repeats(ar[i],"5") < 2 and repeats(ar[i],"6") < 2 and repeats(ar[i],"7") < 2 and repeats(ar[i],"8") < 2 and repeats(ar[i],"9") < 2 then + else + dd = 1 + end + end + for i=5,7 do + if repeats(ar[i],"1") < 2 and repeats(ar[i],"2") < 2 and repeats(ar[i],"3") < 2 and repeats(ar[i],"4") < 2 and repeats(ar[i],"5") < 2 and repeats(ar[i],"6") < 2 and repeats(ar[i],"7") < 2 and repeats(ar[i],"8") < 2 and repeats(ar[i],"9") < 2 then + else + dd = 1 + end + end + for i=9,11 do + if repeats(ar[i],"1") < 2 and repeats(ar[i],"2") < 2 and repeats(ar[i],"3") < 2 and repeats(ar[i],"4") < 2 and repeats(ar[i],"5") < 2 and repeats(ar[i],"6") < 2 and repeats(ar[i],"7") < 2 and repeats(ar[i],"8") < 2 and repeats(ar[i],"9") < 2 then + else + dd = 1 + end + end + + local ar = {} + local temp = "" + for k=9,11 do + local d = 0 + for i=14,16 do + temp = temp..Fi(i,k) + end + end + if repeats(temp,"1") < 2 and repeats(temp,"2") < 2 and repeats(temp,"3") < 2 and repeats(temp,"4") < 2 and repeats(temp,"5") < 2 and repeats(temp,"6") < 2 and repeats(temp,"7") < 2 and repeats(temp,"8") < 2 and repeats(temp,"9") < 2 then + else + dd = 1 + end + local ar = {} + local temp = "" + for k=9,11 do + local d = 0 + for i=18,20 do + temp = temp..Fi(i,k) + end + end + if repeats(temp,"1") < 2 and repeats(temp,"2") < 2 and repeats(temp,"3") < 2 and repeats(temp,"4") < 2 and repeats(temp,"5") < 2 and repeats(temp,"6") < 2 and repeats(temp,"7") < 2 and repeats(temp,"8") < 2 and repeats(temp,"9") < 2 then + else + dd = 1 + end + local ar = {} + local temp = "" + for k=9,11 do + local d = 0 + for i=22,24 do + temp = temp..Fi(i,k) + end + end + if repeats(temp,"1") < 2 and repeats(temp,"2") < 2 and repeats(temp,"3") < 2 and repeats(temp,"4") < 2 and repeats(temp,"5") < 2 and repeats(temp,"6") < 2 and repeats(temp,"7") < 2 and repeats(temp,"8") < 2 and repeats(temp,"9") < 2 then + else + dd = 1 + end + + local ar = {} + local temp = "" + for k=13,15 do + local d = 0 + for i=14,16 do + temp = temp..Fi(i,k) + end + end + if repeats(temp,"1") < 2 and repeats(temp,"2") < 2 and repeats(temp,"3") < 2 and repeats(temp,"4") < 2 and repeats(temp,"5") < 2 and repeats(temp,"6") < 2 and repeats(temp,"7") < 2 and repeats(temp,"8") < 2 and repeats(temp,"9") < 2 then + else + dd = 1 + end + local ar = {} + local temp = "" + for k=13,15 do + local d = 0 + for i=18,20 do + temp = temp..Fi(i,k) + end + end + if repeats(temp,"1") < 2 and repeats(temp,"2") < 2 and repeats(temp,"3") < 2 and repeats(temp,"4") < 2 and repeats(temp,"5") < 2 and repeats(temp,"6") < 2 and repeats(temp,"7") < 2 and repeats(temp,"8") < 2 and repeats(temp,"9") < 2 then + else + dd = 1 + end + local ar = {} + local temp = "" + for k=13,15 do + local d = 0 + for i=22,24 do + temp = temp..Fi(i,k) + end + end + if repeats(temp,"1") < 2 and repeats(temp,"2") < 2 and repeats(temp,"3") < 2 and repeats(temp,"4") < 2 and repeats(temp,"5") < 2 and repeats(temp,"6") < 2 and repeats(temp,"7") < 2 and repeats(temp,"8") < 2 and repeats(temp,"9") < 2 then + else + dd = 1 + end + local ar = {} + local temp = "" + for k=17,29 do + local d = 0 + for i=14,16 do + temp = temp..Fi(i,k) + end + end + if repeats(temp,"1") < 2 and repeats(temp,"2") < 2 and repeats(temp,"3") < 2 and repeats(temp,"4") < 2 and repeats(temp,"5") < 2 and repeats(temp,"6") < 2 and repeats(temp,"7") < 2 and repeats(temp,"8") < 2 and repeats(temp,"9") < 2 then + else + dd = 1 + end + local ar = {} + local temp = "" + for k=17,19 do + local d = 0 + for i=18,20 do + temp = temp..Fi(i,k) + end + end + if repeats(temp,"1") < 2 and repeats(temp,"2") < 2 and repeats(temp,"3") < 2 and repeats(temp,"4") < 2 and repeats(temp,"5") < 2 and repeats(temp,"6") < 2 and repeats(temp,"7") < 2 and repeats(temp,"8") < 2 and repeats(temp,"9") < 2 then + else + dd = 1 + end + + local ar = {} + local temp = "" + for k=17,19 do + local d = 0 + for i=22,24 do + temp = temp..Fi(i,k) + end + end + if repeats(temp,"1") < 2 and repeats(temp,"2") < 2 and repeats(temp,"3") < 2 and repeats(temp,"4") < 2 and repeats(temp,"5") < 2 and repeats(temp,"6") < 2 and repeats(temp,"7") < 2 and repeats(temp,"8") < 2 and repeats(temp,"9") < 2 then + else + dd = 1 + end + if dd == 1 then + minetest.chat_send_all("number already exists") + return false + else + return true + end +end function Finisch(player) local dd = 0 local ar = {} @@ -426,6 +791,91 @@ function Finisch(player) end end end + +function lvbut(from,num,level2) + local formspec = "" + .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" + .."background[5,6.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + if tonumber(level2) > from and num > 0 then + formspec = formspec.."button[0,1;1,1;a;"..(from+1).."]" + end + if tonumber(level2) > (from+1) and num > 1 then + formspec = formspec.."button[1,1;1,1;b;"..(from+2).."]" + end + if tonumber(level2) > (from+2) and num > 2 then + formspec = formspec.."button[2,1;1,1;c;"..(from+3).."]" + end + if tonumber(level2) > (from+3) and num > 3 then + formspec = formspec.."button[3,1;1,1;d;"..(from+4).."]" + end + if tonumber(level2) > (from+4) and num > 4 then + formspec = formspec.."button[4,1;1,1;e;"..(from+5).."]" + end + if tonumber(level2) > (from+5) and num > 5 then + formspec = formspec.."button[0,2;1,1;f;"..(from+6).."]" + end + if tonumber(level2) > (from+6) and num > 6 then + formspec = formspec.."button[1,2;1,1;g;"..(from+7).."]" + end + if tonumber(level2) > (from+7) and num > 7 then + formspec = formspec.."button[2,2;1,1;h;"..(from+8).."]" + end + if tonumber(level2) > (from+8) and num > 8 then + formspec = formspec.."button[3,2;1,1;i;"..(from+9).."]" + end + if tonumber(level2) > (from+9) and num > 9 then + formspec = formspec.."button[4,2;1,1;j;"..(from+10).."]" + end + if tonumber(level2) > (from+10) and num > 10 then + formspec = formspec.."button[0,3;1,1;k;"..(from+11).."]" + end + if tonumber(level2) > (from+11) and num > 11 then + formspec = formspec.."button[1,3;1,1;l;"..(from+12).."]" + end + if tonumber(level2) > (from+12) and num > 12 then + formspec = formspec.."button[2,3;1,1;m;"..(from+13).."]" + end + if tonumber(level2) > (from+13) and num > 13 then + formspec = formspec.."button[3,3;1,1;n;"..(from+14).."]" + end + if tonumber(level2) > (from+14) and num > 14 then + formspec = formspec.."button[4,3;1,1;o;"..(from+15).."]" + end + if tonumber(level2) > (from+15) and num > 15 then + formspec = formspec.."button[0,4;1,1;p;"..(from+16).."]" + end + if tonumber(level2) > (from+16) and num > 16 then + formspec = formspec.."button[1,4;1,1;q;"..(from+17).."]" + end + if tonumber(level2) > (from+17) and num > 17 then + formspec = formspec.."button[2,4;1,1;r;"..(from+18).."]" + end + if tonumber(level2) > (from+18) and num > 18 then + formspec = formspec.."button[3,4;1,1;s;"..(from+19).."]" + end + if tonumber(level2) > (from+19) and num > 19 then + formspec = formspec.."button[4,4;1,1;t;"..(from+20).."]" + end + if tonumber(level2) > (from+20) and num > 20 then + formspec = formspec.."button[0,5;1,1;u;"..(from+21).."]" + end + if tonumber(level2) > (from+21) and num > 21 then + formspec = formspec.."button[1,5;1,1;v;"..(from+22).."]" + end + if tonumber(level2) > (from+22) and num > 22 then + formspec = formspec.."button[2,5;1,1;w;"..(from+23).."]" + end + if tonumber(level2) > (from+23) and num > 23 then + formspec = formspec.."button[3,5;1,1;x;"..(from+24).."]" + end + if tonumber(level2) > (from+24) and num > 24 then + formspec = formspec.."button[4,5;1,1;y;"..(from+25).."]" + end + return formspec +end + local w11 = {} w11.get_formspec = function(player, pos) if player == nil then @@ -436,84 +886,8 @@ w11.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/160]" - .."button[0,1;1,1;;1]" - if tonumber(level2) > 1 then - formspec = formspec.."button[1,1;1,1;;2]" - end - if tonumber(level2) > 2 then - formspec = formspec.."button[2,1;1,1;;3]" - end - if tonumber(level2) > 3 then - formspec = formspec.."button[3,1;1,1;;4]" - end - if tonumber(level2) > 4 then - formspec = formspec.."button[4,1;1,1;;5]" - end - if tonumber(level2) > 5 then - formspec = formspec.."button[0,2;1,1;;6]" - end - if tonumber(level2) > 6 then - formspec = formspec.."button[1,2;1,1;;7]" - end - if tonumber(level2) > 7 then - formspec = formspec.."button[2,2;1,1;;8]" - end - if tonumber(level2) > 8 then - formspec = formspec.."button[3,2;1,1;;9]" - end - if tonumber(level2) > 9 then - formspec = formspec.."button[4,2;1,1;;10]" - end - if tonumber(level2) > 10 then - formspec = formspec.."button[0,3;1,1;;11]" - end - if tonumber(level2) > 11 then - formspec = formspec.."button[1,3;1,1;;12]" - end - if tonumber(level2) > 12 then - formspec = formspec.."button[2,3;1,1;;13]" - end - if tonumber(level2) > 13 then - formspec = formspec.."button[3,3;1,1;;14]" - end - if tonumber(level2) > 14 then - formspec = formspec.."button[4,3;1,1;;15]" - end - if tonumber(level2) > 15 then - formspec = formspec.."button[0,4;1,1;;16]" - end - if tonumber(level2) > 16 then - formspec = formspec.."button[1,4;1,1;;17]" - end - if tonumber(level2) > 17 then - formspec = formspec.."button[2,4;1,1;;18]" - end - if tonumber(level2) > 18 then - formspec = formspec.."button[3,4;1,1;;19]" - end - if tonumber(level2) > 19 then - formspec = formspec.."button[4,4;1,1;;20]" - end - if tonumber(level2) > 20 then - formspec = formspec.."button[0,5;1,1;;21]" - end - if tonumber(level2) > 21 then - formspec = formspec.."button[1,5;1,1;;22]" - end - if tonumber(level2) > 22 then - formspec = formspec.."button[2,5;1,1;;23]" - end - if tonumber(level2) > 23 then - formspec = formspec.."button[3,5;1,1;;24]" - end - if tonumber(level2) > 24 then - formspec = formspec.."button[4,5;1,1;;25]" - end + formspec = formspec..lvbut(0,25,level2) if tonumber(level2) > 25 then formspec = formspec.."button[2.5,6;1,1;wab;>]" end @@ -529,85 +903,9 @@ w12.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/160]" - .."button[0,1;1,1;;26]" - .."button[1.5,6;1,1;waa;<]" - if tonumber(level2) > 26 then - formspec = formspec.."button[1,1;1,1;;27]" - end - if tonumber(level2) > 27 then - formspec = formspec.."button[2,1;1,1;;28]" - end - if tonumber(level2) > 28 then - formspec = formspec.."button[3,1;1,1;;29]" - end - if tonumber(level2) > 29 then - formspec = formspec.."button[4,1;1,1;;30]" - end - if tonumber(level2) > 30 then - formspec = formspec.."button[0,2;1,1;;31]" - end - if tonumber(level2) > 31 then - formspec = formspec.."button[1,2;1,1;;32]" - end - if tonumber(level2) > 32 then - formspec = formspec.."button[2,2;1,1;;33]" - end - if tonumber(level2) > 33 then - formspec = formspec.."button[3,2;1,1;;34]" - end - if tonumber(level2) > 34 then - formspec = formspec.."button[4,2;1,1;;35]" - end - if tonumber(level2) > 35 then - formspec = formspec.."button[0,3;1,1;;36]" - end - if tonumber(level2) > 36 then - formspec = formspec.."button[1,3;1,1;;37]" - end - if tonumber(level2) > 37 then - formspec = formspec.."button[2,3;1,1;;38]" - end - if tonumber(level2) > 38 then - formspec = formspec.."button[3,3;1,1;;39]" - end - if tonumber(level2) > 39 then - formspec = formspec.."button[4,3;1,1;;40]" - end - if tonumber(level2) > 40 then - formspec = formspec.."button[0,4;1,1;;41]" - end - if tonumber(level2) > 41 then - formspec = formspec.."button[1,4;1,1;;42]" - end - if tonumber(level2) > 42 then - formspec = formspec.."button[2,4;1,1;;43]" - end - if tonumber(level2) > 43 then - formspec = formspec.."button[3,4;1,1;;44]" - end - if tonumber(level2) > 44 then - formspec = formspec.."button[4,4;1,1;;45]" - end - if tonumber(level2) > 45 then - formspec = formspec.."button[0,5;1,1;;46]" - end - if tonumber(level2) > 46 then - formspec = formspec.."button[1,5;1,1;;47]" - end - if tonumber(level2) > 47 then - formspec = formspec.."button[2,5;1,1;;48]" - end - if tonumber(level2) > 48 then - formspec = formspec.."button[3,5;1,1;;49]" - end - if tonumber(level2) > 49 then - formspec = formspec.."button[4,5;1,1;;50]" - end + formspec = formspec.."button[1.5,6;1,1;waa;<]" + formspec = formspec..lvbut(25,25,level2) if tonumber(level2) > 50 then formspec = formspec.."button[2.5,6;1,1;wac;>]" end @@ -623,85 +921,9 @@ w13.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/160]" - .."button[0,1;1,1;;51]" - .."button[1.5,6;1,1;wab;<]" - if tonumber(level2) > 51 then - formspec = formspec.."button[1,1;1,1;;52]" - end - if tonumber(level2) > 52 then - formspec = formspec.."button[2,1;1,1;;53]" - end - if tonumber(level2) > 53 then - formspec = formspec.."button[3,1;1,1;;54]" - end - if tonumber(level2) > 54 then - formspec = formspec.."button[4,1;1,1;;55]" - end - if tonumber(level2) > 55 then - formspec = formspec.."button[0,2;1,1;;56]" - end - if tonumber(level2) > 56 then - formspec = formspec.."button[1,2;1,1;;57]" - end - if tonumber(level2) > 57 then - formspec = formspec.."button[2,2;1,1;;58]" - end - if tonumber(level2) > 58 then - formspec = formspec.."button[3,2;1,1;;59]" - end - if tonumber(level2) > 59 then - formspec = formspec.."button[4,2;1,1;;60]" - end - if tonumber(level2) > 60 then - formspec = formspec.."button[0,3;1,1;;61]" - end - if tonumber(level2) > 61 then - formspec = formspec.."button[1,3;1,1;;62]" - end - if tonumber(level2) > 62 then - formspec = formspec.."button[2,3;1,1;;63]" - end - if tonumber(level2) > 63 then - formspec = formspec.."button[3,3;1,1;;64]" - end - if tonumber(level2) > 64 then - formspec = formspec.."button[4,3;1,1;;65]" - end - if tonumber(level2) > 65 then - formspec = formspec.."button[0,4;1,1;;66]" - end - if tonumber(level2) > 66 then - formspec = formspec.."button[1,4;1,1;;67]" - end - if tonumber(level2) > 67 then - formspec = formspec.."button[2,4;1,1;;68]" - end - if tonumber(level2) > 68 then - formspec = formspec.."button[3,4;1,1;;69]" - end - if tonumber(level2) > 69 then - formspec = formspec.."button[4,4;1,1;;70]" - end - if tonumber(level2) > 70 then - formspec = formspec.."button[0,5;1,1;;71]" - end - if tonumber(level2) > 71 then - formspec = formspec.."button[1,5;1,1;;72]" - end - if tonumber(level2) > 72 then - formspec = formspec.."button[2,5;1,1;;73]" - end - if tonumber(level2) > 73 then - formspec = formspec.."button[3,5;1,1;;74]" - end - if tonumber(level2) > 74 then - formspec = formspec.."button[4,5;1,1;;75]" - end + formspec = formspec.."button[1.5,6;1,1;wab;<]" + formspec = formspec..lvbut(50,25,level2) if tonumber(level2) > 75 then formspec = formspec.."button[2.5,6;1,1;wad;>]" end @@ -717,85 +939,9 @@ w14.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/160]" - .."button[0,1;1,1;;76]" - formspec = formspec.."button[1.5,6;1,1;wac;<]" - if tonumber(level2) > 76 then - formspec = formspec.."button[1,1;1,1;;77]" - end - if tonumber(level2) > 77 then - formspec = formspec.."button[2,1;1,1;;78]" - end - if tonumber(level2) > 78 then - formspec = formspec.."button[3,1;1,1;;79]" - end - if tonumber(level2) > 79 then - formspec = formspec.."button[4,1;1,1;;80]" - end - if tonumber(level2) > 80 then - formspec = formspec.."button[0,2;1,1;;81]" - end - if tonumber(level2) > 81 then - formspec = formspec.."button[1,2;1,1;;82]" - end - if tonumber(level2) > 82 then - formspec = formspec.."button[2,2;1,1;;83]" - end - if tonumber(level2) > 83 then - formspec = formspec.."button[3,2;1,1;;84]" - end - if tonumber(level2) > 84 then - formspec = formspec.."button[4,2;1,1;;85]" - end - if tonumber(level2) > 85 then - formspec = formspec.."button[0,3;1,1;;86]" - end - if tonumber(level2) > 86 then - formspec = formspec.."button[1,3;1,1;;87]" - end - if tonumber(level2) > 87 then - formspec = formspec.."button[2,3;1,1;;88]" - end - if tonumber(level2) > 88 then - formspec = formspec.."button[3,3;1,1;;89]" - end - if tonumber(level2) > 89 then - formspec = formspec.."button[4,3;1,1;;90]" - end - if tonumber(level2) > 90 then - formspec = formspec.."button[0,4;1,1;;91]" - end - if tonumber(level2) > 91 then - formspec = formspec.."button[1,4;1,1;;92]" - end - if tonumber(level2) > 92 then - formspec = formspec.."button[2,4;1,1;;93]" - end - if tonumber(level2) > 93 then - formspec = formspec.."button[3,4;1,1;;94]" - end - if tonumber(level2) > 94 then - formspec = formspec.."button[4,4;1,1;;95]" - end - if tonumber(level2) > 95 then - formspec = formspec.."button[0,5;1,1;;96]" - end - if tonumber(level2) > 96 then - formspec = formspec.."button[1,5;1,1;;97]" - end - if tonumber(level2) > 97 then - formspec = formspec.."button[2,5;1,1;;98]" - end - if tonumber(level2) > 98 then - formspec = formspec.."button[3,5;1,1;;99]" - end - if tonumber(level2) > 99 then - formspec = formspec.."button[4,5;1,1;;100]" - end + formspec = formspec.."button[1.5,6;1,1;wac;<]" + formspec = formspec..lvbut(75,25,level2) if tonumber(level2) > 100 then formspec = formspec.."button[2.5,6;1,1;wae;>]" end @@ -811,85 +957,9 @@ w15.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/160]" - .."button[0,1;1,1;;101]" - formspec = formspec.."button[1.5,6;1,1;wad;<]" - if tonumber(level2) > 101 then - formspec = formspec.."button[1,1;1,1;;102]" - end - if tonumber(level2) > 102 then - formspec = formspec.."button[2,1;1,1;;103]" - end - if tonumber(level2) > 103 then - formspec = formspec.."button[3,1;1,1;;104]" - end - if tonumber(level2) > 104 then - formspec = formspec.."button[4,1;1,1;;105]" - end - if tonumber(level2) > 105 then - formspec = formspec.."button[0,2;1,1;;106]" - end - if tonumber(level2) > 106 then - formspec = formspec.."button[1,2;1,1;;107]" - end - if tonumber(level2) > 107 then - formspec = formspec.."button[2,2;1,1;;108]" - end - if tonumber(level2) > 108 then - formspec = formspec.."button[3,2;1,1;;109]" - end - if tonumber(level2) > 109 then - formspec = formspec.."button[4,2;1,1;;110]" - end - if tonumber(level2) > 110 then - formspec = formspec.."button[0,3;1,1;;111]" - end - if tonumber(level2) > 111 then - formspec = formspec.."button[1,3;1,1;;112]" - end - if tonumber(level2) > 112 then - formspec = formspec.."button[2,3;1,1;;113]" - end - if tonumber(level2) > 113 then - formspec = formspec.."button[3,3;1,1;;114]" - end - if tonumber(level2) > 114 then - formspec = formspec.."button[4,3;1,1;;115]" - end - if tonumber(level2) > 115 then - formspec = formspec.."button[0,4;1,1;;116]" - end - if tonumber(level2) > 116 then - formspec = formspec.."button[1,4;1,1;;117]" - end - if tonumber(level2) > 117 then - formspec = formspec.."button[2,4;1,1;;118]" - end - if tonumber(level2) > 118 then - formspec = formspec.."button[3,4;1,1;;119]" - end - if tonumber(level2) > 119 then - formspec = formspec.."button[4,4;1,1;;120]" - end - if tonumber(level2) > 120 then - formspec = formspec.."button[0,5;1,1;;121]" - end - if tonumber(level2) > 121 then - formspec = formspec.."button[1,5;1,1;;122]" - end - if tonumber(level2) > 122 then - formspec = formspec.."button[2,5;1,1;;123]" - end - if tonumber(level2) > 123 then - formspec = formspec.."button[3,5;1,1;;124]" - end - if tonumber(level2) > 124 then - formspec = formspec.."button[4,5;1,1;;125]" - end + formspec = formspec.."button[1.5,6;1,1;wad;<]" + formspec = formspec..lvbut(100,25,level2) if tonumber(level2) > 125 then formspec = formspec.."button[2.5,6;1,1;waf;>]" end @@ -905,85 +975,9 @@ w16.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/160]" - .."button[0,1;1,1;;126]" - formspec = formspec.."button[1.5,6;1,1;wae;<]" - if tonumber(level2) > 126 then - formspec = formspec.."button[1,1;1,1;;127]" - end - if tonumber(level2) > 127 then - formspec = formspec.."button[2,1;1,1;;128]" - end - if tonumber(level2) > 128 then - formspec = formspec.."button[3,1;1,1;;129]" - end - if tonumber(level2) > 129 then - formspec = formspec.."button[4,1;1,1;;130]" - end - if tonumber(level2) > 130 then - formspec = formspec.."button[0,2;1,1;;131]" - end - if tonumber(level2) > 131 then - formspec = formspec.."button[1,2;1,1;;132]" - end - if tonumber(level2) > 132 then - formspec = formspec.."button[2,2;1,1;;133]" - end - if tonumber(level2) > 133 then - formspec = formspec.."button[3,2;1,1;;134]" - end - if tonumber(level2) > 134 then - formspec = formspec.."button[4,2;1,1;;135]" - end - if tonumber(level2) > 135 then - formspec = formspec.."button[0,3;1,1;;136]" - end - if tonumber(level2) > 136 then - formspec = formspec.."button[1,3;1,1;;137]" - end - if tonumber(level2) > 137 then - formspec = formspec.."button[2,3;1,1;;138]" - end - if tonumber(level2) > 138 then - formspec = formspec.."button[3,3;1,1;;139]" - end - if tonumber(level2) > 139 then - formspec = formspec.."button[4,3;1,1;;140]" - end - if tonumber(level2) > 140 then - formspec = formspec.."button[0,4;1,1;;141]" - end - if tonumber(level2) > 141 then - formspec = formspec.."button[1,4;1,1;;142]" - end - if tonumber(level2) > 142 then - formspec = formspec.."button[2,4;1,1;;143]" - end - if tonumber(level2) > 143 then - formspec = formspec.."button[3,4;1,1;;144]" - end - if tonumber(level2) > 144 then - formspec = formspec.."button[4,4;1,1;;145]" - end - if tonumber(level2) > 145 then - formspec = formspec.."button[0,5;1,1;;146]" - end - if tonumber(level2) > 146 then - formspec = formspec.."button[1,5;1,1;;147]" - end - if tonumber(level2) > 147 then - formspec = formspec.."button[2,5;1,1;;148]" - end - if tonumber(level2) > 148 then - formspec = formspec.."button[3,5;1,1;;149]" - end - if tonumber(level2) > 149 then - formspec = formspec.."button[4,5;1,1;;150]" - end + formspec = formspec.."button[1.5,6;1,1;wae;<]" + formspec = formspec..lvbut(125,25,level2) if tonumber(level2) > 150 then formspec = formspec.."button[2.5,6;1,1;wag;>]" end @@ -999,40 +993,9 @@ w17.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/160]" - .."button[0,1;1,1;;151]" - formspec = formspec.."button[1.5,6;1,1;waf;<]" - if tonumber(level2) > 151 then - formspec = formspec.."button[1,1;1,1;;152]" - end - if tonumber(level2) > 152 then - formspec = formspec.."button[2,1;1,1;;153]" - end - if tonumber(level2) > 153 then - formspec = formspec.."button[3,1;1,1;;154]" - end - if tonumber(level2) > 154 then - formspec = formspec.."button[4,1;1,1;;155]" - end - if tonumber(level2) > 155 then - formspec = formspec.."button[0,2;1,1;;156]" - end - if tonumber(level2) > 156 then - formspec = formspec.."button[1,2;1,1;;157]" - end - if tonumber(level2) > 157 then - formspec = formspec.."button[2,2;1,1;;158]" - end - if tonumber(level2) > 158 then - formspec = formspec.."button[3,2;1,1;;159]" - end - if tonumber(level2) > 159 then - formspec = formspec.."button[4,2;1,1;;160]" - end + formspec = formspec.."button[1.5,6;1,1;waf;<]" + formspec = formspec..lvbut(150,10,level2) if tonumber(level2) > 160 then formspec = formspec.."label[0,3;play world 2 and 3]" end @@ -1048,86 +1011,10 @@ w21.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/190]" - .."button[0,1;1,1;;1]" - if tonumber(level2) > 1 then - formspec = formspec.."button[1,1;1,1;;2]" - end - if tonumber(level2) > 2 then - formspec = formspec.."button[2,1;1,1;;3]" - end - if tonumber(level2) > 3 then - formspec = formspec.."button[3,1;1,1;;4]" - end - if tonumber(level2) > 4 then - formspec = formspec.."button[4,1;1,1;;5]" - end - if tonumber(level2) > 5 then - formspec = formspec.."button[0,2;1,1;;6]" - end - if tonumber(level2) > 6 then - formspec = formspec.."button[1,2;1,1;;7]" - end - if tonumber(level2) > 7 then - formspec = formspec.."button[2,2;1,1;;8]" - end - if tonumber(level2) > 8 then - formspec = formspec.."button[3,2;1,1;;9]" - end - if tonumber(level2) > 9 then - formspec = formspec.."button[4,2;1,1;;10]" - end - if tonumber(level2) > 10 then - formspec = formspec.."button[0,3;1,1;;11]" - end - if tonumber(level2) > 11 then - formspec = formspec.."button[1,3;1,1;;12]" - end - if tonumber(level2) > 12 then - formspec = formspec.."button[2,3;1,1;;13]" - end - if tonumber(level2) > 13 then - formspec = formspec.."button[3,3;1,1;;14]" - end - if tonumber(level2) > 14 then - formspec = formspec.."button[4,3;1,1;;15]" - end - if tonumber(level2) > 15 then - formspec = formspec.."button[0,4;1,1;;16]" - end - if tonumber(level2) > 16 then - formspec = formspec.."button[1,4;1,1;;17]" - end - if tonumber(level2) > 17 then - formspec = formspec.."button[2,4;1,1;;18]" - end - if tonumber(level2) > 18 then - formspec = formspec.."button[3,4;1,1;;19]" - end - if tonumber(level2) > 19 then - formspec = formspec.."button[4,4;1,1;;20]" - end - if tonumber(level2) > 20 then - formspec = formspec.."button[0,5;1,1;;21]" - end - if tonumber(level2) > 21 then - formspec = formspec.."button[1,5;1,1;;22]" - end - if tonumber(level2) > 22 then - formspec = formspec.."button[2,5;1,1;;23]" - end - if tonumber(level2) > 23 then - formspec = formspec.."button[3,5;1,1;;24]" - end - if tonumber(level2) > 24 then - formspec = formspec.."button[4,5;1,1;;25]" - end + formspec = formspec..lvbut(0,25,level2) if tonumber(level2) > 25 then - formspec = formspec.."button[2.5,6;1,1;wab;>]" + formspec = formspec.."button[2.5,6;1,1;wbb;>]" end return formspec end @@ -1141,87 +1028,11 @@ w22.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/190]" - .."button[0,1;1,1;;26]" - .."button[1.5,6;1,1;waa;<]" - if tonumber(level2) > 26 then - formspec = formspec.."button[1,1;1,1;;27]" - end - if tonumber(level2) > 27 then - formspec = formspec.."button[2,1;1,1;;28]" - end - if tonumber(level2) > 28 then - formspec = formspec.."button[3,1;1,1;;29]" - end - if tonumber(level2) > 29 then - formspec = formspec.."button[4,1;1,1;;30]" - end - if tonumber(level2) > 30 then - formspec = formspec.."button[0,2;1,1;;31]" - end - if tonumber(level2) > 31 then - formspec = formspec.."button[1,2;1,1;;32]" - end - if tonumber(level2) > 32 then - formspec = formspec.."button[2,2;1,1;;33]" - end - if tonumber(level2) > 33 then - formspec = formspec.."button[3,2;1,1;;34]" - end - if tonumber(level2) > 34 then - formspec = formspec.."button[4,2;1,1;;35]" - end - if tonumber(level2) > 35 then - formspec = formspec.."button[0,3;1,1;;36]" - end - if tonumber(level2) > 36 then - formspec = formspec.."button[1,3;1,1;;37]" - end - if tonumber(level2) > 37 then - formspec = formspec.."button[2,3;1,1;;38]" - end - if tonumber(level2) > 38 then - formspec = formspec.."button[3,3;1,1;;39]" - end - if tonumber(level2) > 39 then - formspec = formspec.."button[4,3;1,1;;40]" - end - if tonumber(level2) > 40 then - formspec = formspec.."button[0,4;1,1;;41]" - end - if tonumber(level2) > 41 then - formspec = formspec.."button[1,4;1,1;;42]" - end - if tonumber(level2) > 42 then - formspec = formspec.."button[2,4;1,1;;43]" - end - if tonumber(level2) > 43 then - formspec = formspec.."button[3,4;1,1;;44]" - end - if tonumber(level2) > 44 then - formspec = formspec.."button[4,4;1,1;;45]" - end - if tonumber(level2) > 45 then - formspec = formspec.."button[0,5;1,1;;46]" - end - if tonumber(level2) > 46 then - formspec = formspec.."button[1,5;1,1;;47]" - end - if tonumber(level2) > 47 then - formspec = formspec.."button[2,5;1,1;;48]" - end - if tonumber(level2) > 48 then - formspec = formspec.."button[3,5;1,1;;49]" - end - if tonumber(level2) > 49 then - formspec = formspec.."button[4,5;1,1;;50]" - end + formspec = formspec.."button[1.5,6;1,1;wba;<]" + formspec = formspec..lvbut(25,25,level2) if tonumber(level2) > 50 then - formspec = formspec.."button[2.5,6;1,1;wac;>]" + formspec = formspec.."button[2.5,6;1,1;wbc;>]" end return formspec end @@ -1235,87 +1046,11 @@ w23.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/190]" - .."button[0,1;1,1;;51]" - .."button[1.5,6;1,1;wab;<]" - if tonumber(level2) > 51 then - formspec = formspec.."button[1,1;1,1;;52]" - end - if tonumber(level2) > 52 then - formspec = formspec.."button[2,1;1,1;;53]" - end - if tonumber(level2) > 53 then - formspec = formspec.."button[3,1;1,1;;54]" - end - if tonumber(level2) > 54 then - formspec = formspec.."button[4,1;1,1;;55]" - end - if tonumber(level2) > 55 then - formspec = formspec.."button[0,2;1,1;;56]" - end - if tonumber(level2) > 56 then - formspec = formspec.."button[1,2;1,1;;57]" - end - if tonumber(level2) > 57 then - formspec = formspec.."button[2,2;1,1;;58]" - end - if tonumber(level2) > 58 then - formspec = formspec.."button[3,2;1,1;;59]" - end - if tonumber(level2) > 59 then - formspec = formspec.."button[4,2;1,1;;60]" - end - if tonumber(level2) > 60 then - formspec = formspec.."button[0,3;1,1;;61]" - end - if tonumber(level2) > 61 then - formspec = formspec.."button[1,3;1,1;;62]" - end - if tonumber(level2) > 62 then - formspec = formspec.."button[2,3;1,1;;63]" - end - if tonumber(level2) > 63 then - formspec = formspec.."button[3,3;1,1;;64]" - end - if tonumber(level2) > 64 then - formspec = formspec.."button[4,3;1,1;;65]" - end - if tonumber(level2) > 65 then - formspec = formspec.."button[0,4;1,1;;66]" - end - if tonumber(level2) > 66 then - formspec = formspec.."button[1,4;1,1;;67]" - end - if tonumber(level2) > 67 then - formspec = formspec.."button[2,4;1,1;;68]" - end - if tonumber(level2) > 68 then - formspec = formspec.."button[3,4;1,1;;69]" - end - if tonumber(level2) > 69 then - formspec = formspec.."button[4,4;1,1;;70]" - end - if tonumber(level2) > 70 then - formspec = formspec.."button[0,5;1,1;;71]" - end - if tonumber(level2) > 71 then - formspec = formspec.."button[1,5;1,1;;72]" - end - if tonumber(level2) > 72 then - formspec = formspec.."button[2,5;1,1;;73]" - end - if tonumber(level2) > 73 then - formspec = formspec.."button[3,5;1,1;;74]" - end - if tonumber(level2) > 74 then - formspec = formspec.."button[4,5;1,1;;75]" - end + formspec = formspec.."button[1.5,6;1,1;wbb;<]" + formspec = formspec..lvbut(50,25,level2) if tonumber(level2) > 75 then - formspec = formspec.."button[2.5,6;1,1;wad;>]" + formspec = formspec.."button[2.5,6;1,1;wbd;>]" end return formspec end @@ -1329,87 +1064,11 @@ w24.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/190]" - .."button[0,1;1,1;;76]" - .."button[1.5,6;1,1;wac;<]" - if tonumber(level2) > 76 then - formspec = formspec.."button[1,1;1,1;;77]" - end - if tonumber(level2) > 77 then - formspec = formspec.."button[2,1;1,1;;78]" - end - if tonumber(level2) > 78 then - formspec = formspec.."button[3,1;1,1;;79]" - end - if tonumber(level2) > 79 then - formspec = formspec.."button[4,1;1,1;;80]" - end - if tonumber(level2) > 80 then - formspec = formspec.."button[0,2;1,1;;81]" - end - if tonumber(level2) > 81 then - formspec = formspec.."button[1,2;1,1;;82]" - end - if tonumber(level2) > 82 then - formspec = formspec.."button[2,2;1,1;;83]" - end - if tonumber(level2) > 83 then - formspec = formspec.."button[3,2;1,1;;84]" - end - if tonumber(level2) > 84 then - formspec = formspec.."button[4,2;1,1;;85]" - end - if tonumber(level2) > 85 then - formspec = formspec.."button[0,3;1,1;;86]" - end - if tonumber(level2) > 86 then - formspec = formspec.."button[1,3;1,1;;87]" - end - if tonumber(level2) > 87 then - formspec = formspec.."button[2,3;1,1;;88]" - end - if tonumber(level2) > 88 then - formspec = formspec.."button[3,3;1,1;;89]" - end - if tonumber(level2) > 89 then - formspec = formspec.."button[4,3;1,1;;90]" - end - if tonumber(level2) > 90 then - formspec = formspec.."button[0,4;1,1;;91]" - end - if tonumber(level2) > 91 then - formspec = formspec.."button[1,4;1,1;;92]" - end - if tonumber(level2) > 92 then - formspec = formspec.."button[2,4;1,1;;93]" - end - if tonumber(level2) > 93 then - formspec = formspec.."button[3,4;1,1;;94]" - end - if tonumber(level2) > 94 then - formspec = formspec.."button[4,4;1,1;;95]" - end - if tonumber(level2) > 95 then - formspec = formspec.."button[0,5;1,1;;96]" - end - if tonumber(level2) > 96 then - formspec = formspec.."button[1,5;1,1;;97]" - end - if tonumber(level2) > 97 then - formspec = formspec.."button[2,5;1,1;;98]" - end - if tonumber(level2) > 98 then - formspec = formspec.."button[3,5;1,1;;99]" - end - if tonumber(level2) > 99 then - formspec = formspec.."button[4,5;1,1;;100]" - end + formspec = formspec.."button[1.5,6;1,1;wbc;<]" + formspec = formspec..lvbut(75,25,level2) if tonumber(level2) > 100 then - formspec = formspec.."button[2.5,6;1,1;wae;>]" + formspec = formspec.."button[2.5,6;1,1;wbe;>]" end return formspec end @@ -1423,87 +1082,11 @@ w25.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/190]" - .."button[0,1;1,1;;101]" - .."button[1.5,6;1,1;wad;<]" - if tonumber(level2) > 101 then - formspec = formspec.."button[1,1;1,1;;102]" - end - if tonumber(level2) > 102 then - formspec = formspec.."button[2,1;1,1;;103]" - end - if tonumber(level2) > 103 then - formspec = formspec.."button[3,1;1,1;;104]" - end - if tonumber(level2) > 104 then - formspec = formspec.."button[4,1;1,1;;105]" - end - if tonumber(level2) > 105 then - formspec = formspec.."button[0,2;1,1;;106]" - end - if tonumber(level2) > 106 then - formspec = formspec.."button[1,2;1,1;;107]" - end - if tonumber(level2) > 107 then - formspec = formspec.."button[2,2;1,1;;108]" - end - if tonumber(level2) > 108 then - formspec = formspec.."button[3,2;1,1;;109]" - end - if tonumber(level2) > 109 then - formspec = formspec.."button[4,2;1,1;;110]" - end - if tonumber(level2) > 110 then - formspec = formspec.."button[0,3;1,1;;111]" - end - if tonumber(level2) > 111 then - formspec = formspec.."button[1,3;1,1;;112]" - end - if tonumber(level2) > 112 then - formspec = formspec.."button[2,3;1,1;;113]" - end - if tonumber(level2) > 113 then - formspec = formspec.."button[3,3;1,1;;114]" - end - if tonumber(level2) > 114 then - formspec = formspec.."button[4,3;1,1;;115]" - end - if tonumber(level2) > 115 then - formspec = formspec.."button[0,4;1,1;;116]" - end - if tonumber(level2) > 116 then - formspec = formspec.."button[1,4;1,1;;117]" - end - if tonumber(level2) > 117 then - formspec = formspec.."button[2,4;1,1;;118]" - end - if tonumber(level2) > 118 then - formspec = formspec.."button[3,4;1,1;;119]" - end - if tonumber(level2) > 119 then - formspec = formspec.."button[4,4;1,1;;120]" - end - if tonumber(level2) > 120 then - formspec = formspec.."button[0,5;1,1;;121]" - end - if tonumber(level2) > 121 then - formspec = formspec.."button[1,5;1,1;;122]" - end - if tonumber(level2) > 122 then - formspec = formspec.."button[2,5;1,1;;123]" - end - if tonumber(level2) > 123 then - formspec = formspec.."button[3,5;1,1;;124]" - end - if tonumber(level2) > 124 then - formspec = formspec.."button[4,5;1,1;;125]" - end + formspec = formspec.."button[1.5,6;1,1;wbd;<]" + formspec = formspec..lvbut(100,25,level2) if tonumber(level2) > 125 then - formspec = formspec.."button[2.5,6;1,1;waf;>]" + formspec = formspec.."button[2.5,6;1,1;wbf;>]" end return formspec end @@ -1517,87 +1100,11 @@ w26.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/190]" - .."button[0,1;1,1;;126]" - .."button[1.5,6;1,1;wae;<]" - if tonumber(level2) > 126 then - formspec = formspec.."button[1,1;1,1;;127]" - end - if tonumber(level2) > 127 then - formspec = formspec.."button[2,1;1,1;;128]" - end - if tonumber(level2) > 128 then - formspec = formspec.."button[3,1;1,1;;129]" - end - if tonumber(level2) > 129 then - formspec = formspec.."button[4,1;1,1;;130]" - end - if tonumber(level2) > 130 then - formspec = formspec.."button[0,2;1,1;;131]" - end - if tonumber(level2) > 131 then - formspec = formspec.."button[1,2;1,1;;132]" - end - if tonumber(level2) > 132 then - formspec = formspec.."button[2,2;1,1;;133]" - end - if tonumber(level2) > 133 then - formspec = formspec.."button[3,2;1,1;;134]" - end - if tonumber(level2) > 134 then - formspec = formspec.."button[4,2;1,1;;135]" - end - if tonumber(level2) > 135 then - formspec = formspec.."button[0,3;1,1;;136]" - end - if tonumber(level2) > 136 then - formspec = formspec.."button[1,3;1,1;;137]" - end - if tonumber(level2) > 137 then - formspec = formspec.."button[2,3;1,1;;138]" - end - if tonumber(level2) > 138 then - formspec = formspec.."button[3,3;1,1;;139]" - end - if tonumber(level2) > 139 then - formspec = formspec.."button[4,3;1,1;;140]" - end - if tonumber(level2) > 140 then - formspec = formspec.."button[0,4;1,1;;141]" - end - if tonumber(level2) > 141 then - formspec = formspec.."button[1,4;1,1;;142]" - end - if tonumber(level2) > 142 then - formspec = formspec.."button[2,4;1,1;;143]" - end - if tonumber(level2) > 143 then - formspec = formspec.."button[3,4;1,1;;144]" - end - if tonumber(level2) > 144 then - formspec = formspec.."button[4,4;1,1;;145]" - end - if tonumber(level2) > 145 then - formspec = formspec.."button[0,5;1,1;;146]" - end - if tonumber(level2) > 146 then - formspec = formspec.."button[1,5;1,1;;147]" - end - if tonumber(level2) > 147 then - formspec = formspec.."button[2,5;1,1;;148]" - end - if tonumber(level2) > 148 then - formspec = formspec.."button[3,5;1,1;;149]" - end - if tonumber(level2) > 149 then - formspec = formspec.."button[4,5;1,1;;150]" - end + formspec = formspec.."button[1.5,6;1,1;wbe;<]" + formspec = formspec..lvbut(125,25,level2) if tonumber(level2) > 150 then - formspec = formspec.."button[2.5,6;1,1;wag;>]" + formspec = formspec.."button[2.5,6;1,1;wbg;>]" end return formspec end @@ -1611,87 +1118,11 @@ w27.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/190]" - .."button[0,1;1,1;;151]" - .."button[1.5,6;1,1;waf;<]" - if tonumber(level2) > 151 then - formspec = formspec.."button[1,1;1,1;;152]" - end - if tonumber(level2) > 152 then - formspec = formspec.."button[2,1;1,1;;153]" - end - if tonumber(level2) > 153 then - formspec = formspec.."button[3,1;1,1;;154]" - end - if tonumber(level2) > 154 then - formspec = formspec.."button[4,1;1,1;;155]" - end - if tonumber(level2) > 155 then - formspec = formspec.."button[0,2;1,1;;156]" - end - if tonumber(level2) > 156 then - formspec = formspec.."button[1,2;1,1;;157]" - end - if tonumber(level2) > 157 then - formspec = formspec.."button[2,2;1,1;;158]" - end - if tonumber(level2) > 158 then - formspec = formspec.."button[3,2;1,1;;159]" - end - if tonumber(level2) > 159 then - formspec = formspec.."button[4,2;1,1;;160]" - end - if tonumber(level2) > 160 then - formspec = formspec.."button[0,3;1,1;;161]" - end - if tonumber(level2) > 161 then - formspec = formspec.."button[1,3;1,1;;162]" - end - if tonumber(level2) > 162 then - formspec = formspec.."button[2,3;1,1;;163]" - end - if tonumber(level2) > 163 then - formspec = formspec.."button[3,3;1,1;;164]" - end - if tonumber(level2) > 164 then - formspec = formspec.."button[4,3;1,1;;165]" - end - if tonumber(level2) > 165 then - formspec = formspec.."button[0,4;1,1;;166]" - end - if tonumber(level2) > 166 then - formspec = formspec.."button[1,4;1,1;;167]" - end - if tonumber(level2) > 167 then - formspec = formspec.."button[2,4;1,1;;168]" - end - if tonumber(level2) > 168 then - formspec = formspec.."button[3,4;1,1;;169]" - end - if tonumber(level2) > 169 then - formspec = formspec.."button[4,4;1,1;;170]" - end - if tonumber(level2) > 170 then - formspec = formspec.."button[0,5;1,1;;171]" - end - if tonumber(level2) > 171 then - formspec = formspec.."button[1,5;1,1;;172]" - end - if tonumber(level2) > 172 then - formspec = formspec.."button[2,5;1,1;;173]" - end - if tonumber(level2) > 173 then - formspec = formspec.."button[3,5;1,1;;174]" - end - if tonumber(level2) > 174 then - formspec = formspec.."button[4,5;1,1;;175]" - end + formspec = formspec.."button[1.5,6;1,1;wbf;<]" + formspec = formspec..lvbut(150,25,level2) if tonumber(level2) > 175 then - formspec = formspec.."button[2.5,6;1,1;wah;>]" + formspec = formspec.."button[2.5,6;1,1;wbh;>]" end return formspec end @@ -1705,55 +1136,9 @@ w28.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/190]" - .."button[0,1;1,1;;176]" - .."button[1.5,6;1,1;wag;<]" - if tonumber(level2) > 176 then - formspec = formspec.."button[1,1;1,1;;177]" - end - if tonumber(level2) > 177 then - formspec = formspec.."button[2,1;1,1;;178]" - end - if tonumber(level2) > 178 then - formspec = formspec.."button[3,1;1,1;;179]" - end - if tonumber(level2) > 179 then - formspec = formspec.."button[4,1;1,1;;180]" - end - if tonumber(level2) > 180 then - formspec = formspec.."button[0,2;1,1;;181]" - end - if tonumber(level2) > 181 then - formspec = formspec.."button[1,2;1,1;;182]" - end - if tonumber(level2) > 182 then - formspec = formspec.."button[2,2;1,1;;183]" - end - if tonumber(level2) > 183 then - formspec = formspec.."button[3,2;1,1;;184]" - end - if tonumber(level2) > 184 then - formspec = formspec.."button[4,2;1,1;;185]" - end - if tonumber(level2) > 185 then - formspec = formspec.."button[0,3;1,1;;186]" - end - if tonumber(level2) > 186 then - formspec = formspec.."button[1,3;1,1;;187]" - end - if tonumber(level2) > 187 then - formspec = formspec.."button[2,3;1,1;;188]" - end - if tonumber(level2) > 188 then - formspec = formspec.."button[3,3;1,1;;189]" - end - if tonumber(level2) > 189 then - formspec = formspec.."button[4,3;1,1;;190]" - end + formspec = formspec.."button[1.5,6;1,1;wbg;<]" + formspec = formspec..lvbut(175,15,level2) if tonumber(level2) > 190 then formspec = formspec.."label[0,4;play world 1 and 3]" end @@ -1769,86 +1154,10 @@ w31.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]" - .."button[0,1;1,1;;1]" - if tonumber(level2) > 1 then - formspec = formspec.."button[1,1;1,1;;2]" - end - if tonumber(level2) > 2 then - formspec = formspec.."button[2,1;1,1;;3]" - end - if tonumber(level2) > 3 then - formspec = formspec.."button[3,1;1,1;;4]" - end - if tonumber(level2) > 4 then - formspec = formspec.."button[4,1;1,1;;5]" - end - if tonumber(level2) > 5 then - formspec = formspec.."button[0,2;1,1;;6]" - end - if tonumber(level2) > 6 then - formspec = formspec.."button[1,2;1,1;;7]" - end - if tonumber(level2) > 7 then - formspec = formspec.."button[2,2;1,1;;8]" - end - if tonumber(level2) > 8 then - formspec = formspec.."button[3,2;1,1;;9]" - end - if tonumber(level2) > 9 then - formspec = formspec.."button[4,2;1,1;;10]" - end - if tonumber(level2) > 10 then - formspec = formspec.."button[0,3;1,1;;11]" - end - if tonumber(level2) > 11 then - formspec = formspec.."button[1,3;1,1;;12]" - end - if tonumber(level2) > 12 then - formspec = formspec.."button[2,3;1,1;;13]" - end - if tonumber(level2) > 13 then - formspec = formspec.."button[3,3;1,1;;14]" - end - if tonumber(level2) > 14 then - formspec = formspec.."button[4,3;1,1;;15]" - end - if tonumber(level2) > 15 then - formspec = formspec.."button[0,4;1,1;;16]" - end - if tonumber(level2) > 16 then - formspec = formspec.."button[1,4;1,1;;17]" - end - if tonumber(level2) > 17 then - formspec = formspec.."button[2,4;1,1;;18]" - end - if tonumber(level2) > 18 then - formspec = formspec.."button[3,4;1,1;;19]" - end - if tonumber(level2) > 19 then - formspec = formspec.."button[4,4;1,1;;20]" - end - if tonumber(level2) > 20 then - formspec = formspec.."button[0,5;1,1;;21]" - end - if tonumber(level2) > 21 then - formspec = formspec.."button[1,5;1,1;;22]" - end - if tonumber(level2) > 22 then - formspec = formspec.."button[2,5;1,1;;23]" - end - if tonumber(level2) > 23 then - formspec = formspec.."button[3,5;1,1;;24]" - end - if tonumber(level2) > 24 then - formspec = formspec.."button[4,5;1,1;;25]" - end + formspec = formspec..lvbut(0,25,level2) if tonumber(level2) > 25 then - formspec = formspec.."button[2.5,6;1,1;wab;>]" + formspec = formspec.."button[2.5,6;1,1;wcb;>]" end return formspec end @@ -1862,87 +1171,11 @@ w32.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]" - .."button[0,1;1,1;;26]" - .."button[1.5,6;1,1;waa;<]" - if tonumber(level2) > 26 then - formspec = formspec.."button[1,1;1,1;;27]" - end - if tonumber(level2) > 27 then - formspec = formspec.."button[2,1;1,1;;28]" - end - if tonumber(level2) > 28 then - formspec = formspec.."button[3,1;1,1;;29]" - end - if tonumber(level2) > 29 then - formspec = formspec.."button[4,1;1,1;;30]" - end - if tonumber(level2) > 30 then - formspec = formspec.."button[0,2;1,1;;31]" - end - if tonumber(level2) > 31 then - formspec = formspec.."button[1,2;1,1;;32]" - end - if tonumber(level2) > 32 then - formspec = formspec.."button[2,2;1,1;;33]" - end - if tonumber(level2) > 33 then - formspec = formspec.."button[3,2;1,1;;34]" - end - if tonumber(level2) > 34 then - formspec = formspec.."button[4,2;1,1;;35]" - end - if tonumber(level2) > 35 then - formspec = formspec.."button[0,3;1,1;;36]" - end - if tonumber(level2) > 36 then - formspec = formspec.."button[1,3;1,1;;37]" - end - if tonumber(level2) > 37 then - formspec = formspec.."button[2,3;1,1;;38]" - end - if tonumber(level2) > 38 then - formspec = formspec.."button[3,3;1,1;;39]" - end - if tonumber(level2) > 39 then - formspec = formspec.."button[4,3;1,1;;40]" - end - if tonumber(level2) > 40 then - formspec = formspec.."button[0,4;1,1;;41]" - end - if tonumber(level2) > 41 then - formspec = formspec.."button[1,4;1,1;;42]" - end - if tonumber(level2) > 42 then - formspec = formspec.."button[2,4;1,1;;43]" - end - if tonumber(level2) > 43 then - formspec = formspec.."button[3,4;1,1;;44]" - end - if tonumber(level2) > 44 then - formspec = formspec.."button[4,4;1,1;;45]" - end - if tonumber(level2) > 45 then - formspec = formspec.."button[0,5;1,1;;46]" - end - if tonumber(level2) > 46 then - formspec = formspec.."button[1,5;1,1;;47]" - end - if tonumber(level2) > 47 then - formspec = formspec.."button[2,5;1,1;;48]" - end - if tonumber(level2) > 48 then - formspec = formspec.."button[3,5;1,1;;49]" - end - if tonumber(level2) > 49 then - formspec = formspec.."button[4,5;1,1;;50]" - end + formspec = formspec.."button[1.5,6;1,1;wca;<]" + formspec = formspec..lvbut(25,25,level2) if tonumber(level2) > 50 then - formspec = formspec.."button[2.5,6;1,1;wac;>]" + formspec = formspec.."button[2.5,6;1,1;wcc;>]" end return formspec end @@ -1956,87 +1189,11 @@ w33.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]" - .."button[0,1;1,1;;51]" - .."button[1.5,6;1,1;wab;<]" - if tonumber(level2) > 51 then - formspec = formspec.."button[1,1;1,1;;52]" - end - if tonumber(level2) > 52 then - formspec = formspec.."button[2,1;1,1;;53]" - end - if tonumber(level2) > 53 then - formspec = formspec.."button[3,1;1,1;;54]" - end - if tonumber(level2) > 54 then - formspec = formspec.."button[4,1;1,1;;55]" - end - if tonumber(level2) > 55 then - formspec = formspec.."button[0,2;1,1;;56]" - end - if tonumber(level2) > 56 then - formspec = formspec.."button[1,2;1,1;;57]" - end - if tonumber(level2) > 57 then - formspec = formspec.."button[2,2;1,1;;58]" - end - if tonumber(level2) > 58 then - formspec = formspec.."button[3,2;1,1;;59]" - end - if tonumber(level2) > 59 then - formspec = formspec.."button[4,2;1,1;;60]" - end - if tonumber(level2) > 60 then - formspec = formspec.."button[0,3;1,1;;61]" - end - if tonumber(level2) > 61 then - formspec = formspec.."button[1,3;1,1;;62]" - end - if tonumber(level2) > 62 then - formspec = formspec.."button[2,3;1,1;;63]" - end - if tonumber(level2) > 63 then - formspec = formspec.."button[3,3;1,1;;64]" - end - if tonumber(level2) > 64 then - formspec = formspec.."button[4,3;1,1;;65]" - end - if tonumber(level2) > 65 then - formspec = formspec.."button[0,4;1,1;;66]" - end - if tonumber(level2) > 66 then - formspec = formspec.."button[1,4;1,1;;67]" - end - if tonumber(level2) > 67 then - formspec = formspec.."button[2,4;1,1;;68]" - end - if tonumber(level2) > 68 then - formspec = formspec.."button[3,4;1,1;;69]" - end - if tonumber(level2) > 69 then - formspec = formspec.."button[4,4;1,1;;70]" - end - if tonumber(level2) > 70 then - formspec = formspec.."button[0,5;1,1;;71]" - end - if tonumber(level2) > 71 then - formspec = formspec.."button[1,5;1,1;;72]" - end - if tonumber(level2) > 72 then - formspec = formspec.."button[2,5;1,1;;73]" - end - if tonumber(level2) > 73 then - formspec = formspec.."button[3,5;1,1;;74]" - end - if tonumber(level2) > 74 then - formspec = formspec.."button[4,5;1,1;;75]" - end + formspec = formspec.."button[1.5,6;1,1;wcb;<]" + formspec = formspec..lvbut(50,25,level2) if tonumber(level2) > 75 then - formspec = formspec.."button[2.5,6;1,1;wad;>]" + formspec = formspec.."button[2.5,6;1,1;wcd;>]" end return formspec end @@ -2050,87 +1207,11 @@ w34.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]" - .."button[0,1;1,1;;76]" - .."button[1.5,6;1,1;wac;<]" - if tonumber(level2) > 76 then - formspec = formspec.."button[1,1;1,1;;77]" - end - if tonumber(level2) > 77 then - formspec = formspec.."button[2,1;1,1;;78]" - end - if tonumber(level2) > 78 then - formspec = formspec.."button[3,1;1,1;;79]" - end - if tonumber(level2) > 79 then - formspec = formspec.."button[4,1;1,1;;80]" - end - if tonumber(level2) > 80 then - formspec = formspec.."button[0,2;1,1;;81]" - end - if tonumber(level2) > 81 then - formspec = formspec.."button[1,2;1,1;;82]" - end - if tonumber(level2) > 82 then - formspec = formspec.."button[2,2;1,1;;83]" - end - if tonumber(level2) > 83 then - formspec = formspec.."button[3,2;1,1;;84]" - end - if tonumber(level2) > 84 then - formspec = formspec.."button[4,2;1,1;;85]" - end - if tonumber(level2) > 85 then - formspec = formspec.."button[0,3;1,1;;86]" - end - if tonumber(level2) > 86 then - formspec = formspec.."button[1,3;1,1;;87]" - end - if tonumber(level2) > 87 then - formspec = formspec.."button[2,3;1,1;;88]" - end - if tonumber(level2) > 88 then - formspec = formspec.."button[3,3;1,1;;89]" - end - if tonumber(level2) > 89 then - formspec = formspec.."button[4,3;1,1;;90]" - end - if tonumber(level2) > 90 then - formspec = formspec.."button[0,4;1,1;;91]" - end - if tonumber(level2) > 91 then - formspec = formspec.."button[1,4;1,1;;92]" - end - if tonumber(level2) > 92 then - formspec = formspec.."button[2,4;1,1;;93]" - end - if tonumber(level2) > 93 then - formspec = formspec.."button[3,4;1,1;;94]" - end - if tonumber(level2) > 94 then - formspec = formspec.."button[4,4;1,1;;95]" - end - if tonumber(level2) > 95 then - formspec = formspec.."button[0,5;1,1;;96]" - end - if tonumber(level2) > 96 then - formspec = formspec.."button[1,5;1,1;;97]" - end - if tonumber(level2) > 97 then - formspec = formspec.."button[2,5;1,1;;98]" - end - if tonumber(level2) > 98 then - formspec = formspec.."button[3,5;1,1;;99]" - end - if tonumber(level2) > 99 then - formspec = formspec.."button[4,5;1,1;;100]" - end + formspec = formspec.."button[1.5,6;1,1;wcc;<]" + formspec = formspec..lvbut(75,25,level2) if tonumber(level2) > 100 then - formspec = formspec.."button[2.5,6;1,1;wae;>]" + formspec = formspec.."button[2.5,6;1,1;wce;>]" end return formspec end @@ -2144,87 +1225,11 @@ w35.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]" - .."button[0,1;1,1;;101]" - .."button[1.5,6;1,1;wad;<]" - if tonumber(level2) > 101 then - formspec = formspec.."button[1,1;1,1;;102]" - end - if tonumber(level2) > 102 then - formspec = formspec.."button[2,1;1,1;;103]" - end - if tonumber(level2) > 103 then - formspec = formspec.."button[3,1;1,1;;104]" - end - if tonumber(level2) > 104 then - formspec = formspec.."button[4,1;1,1;;105]" - end - if tonumber(level2) > 105 then - formspec = formspec.."button[0,2;1,1;;106]" - end - if tonumber(level2) > 106 then - formspec = formspec.."button[1,2;1,1;;107]" - end - if tonumber(level2) > 107 then - formspec = formspec.."button[2,2;1,1;;108]" - end - if tonumber(level2) > 108 then - formspec = formspec.."button[3,2;1,1;;109]" - end - if tonumber(level2) > 109 then - formspec = formspec.."button[4,2;1,1;;110]" - end - if tonumber(level2) > 110 then - formspec = formspec.."button[0,3;1,1;;111]" - end - if tonumber(level2) > 111 then - formspec = formspec.."button[1,3;1,1;;112]" - end - if tonumber(level2) > 112 then - formspec = formspec.."button[2,3;1,1;;113]" - end - if tonumber(level2) > 113 then - formspec = formspec.."button[3,3;1,1;;114]" - end - if tonumber(level2) > 114 then - formspec = formspec.."button[4,3;1,1;;115]" - end - if tonumber(level2) > 115 then - formspec = formspec.."button[0,4;1,1;;116]" - end - if tonumber(level2) > 116 then - formspec = formspec.."button[1,4;1,1;;117]" - end - if tonumber(level2) > 117 then - formspec = formspec.."button[2,4;1,1;;118]" - end - if tonumber(level2) > 118 then - formspec = formspec.."button[3,4;1,1;;119]" - end - if tonumber(level2) > 119 then - formspec = formspec.."button[4,4;1,1;;120]" - end - if tonumber(level2) > 120 then - formspec = formspec.."button[0,5;1,1;;121]" - end - if tonumber(level2) > 121 then - formspec = formspec.."button[1,5;1,1;;122]" - end - if tonumber(level2) > 122 then - formspec = formspec.."button[2,5;1,1;;123]" - end - if tonumber(level2) > 123 then - formspec = formspec.."button[3,5;1,1;;124]" - end - if tonumber(level2) > 124 then - formspec = formspec.."button[4,5;1,1;;125]" - end + formspec = formspec.."button[1.5,6;1,1;wcd;<]" + formspec = formspec..lvbut(100,25,level2) if tonumber(level2) > 125 then - formspec = formspec.."button[2.5,6;1,1;waf;>]" + formspec = formspec.."button[2.5,6;1,1;wcf;>]" end return formspec end @@ -2238,87 +1243,11 @@ w36.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]" - .."button[0,1;1,1;;126]" - .."button[1.5,6;1,1;wae;<]" - if tonumber(level2) > 126 then - formspec = formspec.."button[1,1;1,1;;127]" - end - if tonumber(level2) > 127 then - formspec = formspec.."button[2,1;1,1;;128]" - end - if tonumber(level2) > 128 then - formspec = formspec.."button[3,1;1,1;;129]" - end - if tonumber(level2) > 129 then - formspec = formspec.."button[4,1;1,1;;130]" - end - if tonumber(level2) > 130 then - formspec = formspec.."button[0,2;1,1;;131]" - end - if tonumber(level2) > 131 then - formspec = formspec.."button[1,2;1,1;;132]" - end - if tonumber(level2) > 132 then - formspec = formspec.."button[2,2;1,1;;133]" - end - if tonumber(level2) > 133 then - formspec = formspec.."button[3,2;1,1;;134]" - end - if tonumber(level2) > 134 then - formspec = formspec.."button[4,2;1,1;;135]" - end - if tonumber(level2) > 135 then - formspec = formspec.."button[0,3;1,1;;136]" - end - if tonumber(level2) > 136 then - formspec = formspec.."button[1,3;1,1;;137]" - end - if tonumber(level2) > 137 then - formspec = formspec.."button[2,3;1,1;;138]" - end - if tonumber(level2) > 138 then - formspec = formspec.."button[3,3;1,1;;139]" - end - if tonumber(level2) > 139 then - formspec = formspec.."button[4,3;1,1;;140]" - end - if tonumber(level2) > 140 then - formspec = formspec.."button[0,4;1,1;;141]" - end - if tonumber(level2) > 141 then - formspec = formspec.."button[1,4;1,1;;142]" - end - if tonumber(level2) > 142 then - formspec = formspec.."button[2,4;1,1;;143]" - end - if tonumber(level2) > 143 then - formspec = formspec.."button[3,4;1,1;;144]" - end - if tonumber(level2) > 144 then - formspec = formspec.."button[4,4;1,1;;145]" - end - if tonumber(level2) > 145 then - formspec = formspec.."button[0,5;1,1;;146]" - end - if tonumber(level2) > 146 then - formspec = formspec.."button[1,5;1,1;;147]" - end - if tonumber(level2) > 147 then - formspec = formspec.."button[2,5;1,1;;148]" - end - if tonumber(level2) > 148 then - formspec = formspec.."button[3,5;1,1;;149]" - end - if tonumber(level2) > 149 then - formspec = formspec.."button[4,5;1,1;;150]" - end + formspec = formspec.."button[1.5,6;1,1;wce;<]" + formspec = formspec..lvbut(125,25,level2) if tonumber(level2) > 150 then - formspec = formspec.."button[2.5,6;1,1;wag;>]" + formspec = formspec.."button[2.5,6;1,1;wcg;>]" end return formspec end @@ -2332,87 +1261,11 @@ w37.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]" - .."button[0,1;1,1;;151]" - .."button[1.5,6;1,1;waf;<]" - if tonumber(level2) > 151 then - formspec = formspec.."button[1,1;1,1;;152]" - end - if tonumber(level2) > 152 then - formspec = formspec.."button[2,1;1,1;;153]" - end - if tonumber(level2) > 153 then - formspec = formspec.."button[3,1;1,1;;154]" - end - if tonumber(level2) > 154 then - formspec = formspec.."button[4,1;1,1;;155]" - end - if tonumber(level2) > 155 then - formspec = formspec.."button[0,2;1,1;;156]" - end - if tonumber(level2) > 156 then - formspec = formspec.."button[1,2;1,1;;157]" - end - if tonumber(level2) > 157 then - formspec = formspec.."button[2,2;1,1;;158]" - end - if tonumber(level2) > 158 then - formspec = formspec.."button[3,2;1,1;;159]" - end - if tonumber(level2) > 159 then - formspec = formspec.."button[4,2;1,1;;160]" - end - if tonumber(level2) > 160 then - formspec = formspec.."button[0,3;1,1;;161]" - end - if tonumber(level2) > 161 then - formspec = formspec.."button[1,3;1,1;;162]" - end - if tonumber(level2) > 162 then - formspec = formspec.."button[2,3;1,1;;163]" - end - if tonumber(level2) > 163 then - formspec = formspec.."button[3,3;1,1;;164]" - end - if tonumber(level2) > 164 then - formspec = formspec.."button[4,3;1,1;;165]" - end - if tonumber(level2) > 165 then - formspec = formspec.."button[0,4;1,1;;166]" - end - if tonumber(level2) > 166 then - formspec = formspec.."button[1,4;1,1;;167]" - end - if tonumber(level2) > 167 then - formspec = formspec.."button[2,4;1,1;;168]" - end - if tonumber(level2) > 168 then - formspec = formspec.."button[3,4;1,1;;169]" - end - if tonumber(level2) > 169 then - formspec = formspec.."button[4,4;1,1;;170]" - end - if tonumber(level2) > 170 then - formspec = formspec.."button[0,5;1,1;;171]" - end - if tonumber(level2) > 171 then - formspec = formspec.."button[1,5;1,1;;172]" - end - if tonumber(level2) > 172 then - formspec = formspec.."button[2,5;1,1;;173]" - end - if tonumber(level2) > 173 then - formspec = formspec.."button[3,5;1,1;;174]" - end - if tonumber(level2) > 174 then - formspec = formspec.."button[4,5;1,1;;175]" - end + formspec = formspec.."button[1.5,6;1,1;wcf;<]" + formspec = formspec..lvbut(150,25,level2) if tonumber(level2) > 175 then - formspec = formspec.."button[2.5,6;1,1;wah;>]" + formspec = formspec.."button[2.5,6;1,1;wch;>]" end return formspec end @@ -2426,87 +1279,11 @@ w38.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]" - .."button[0,1;1,1;;176]" - .."button[1.5,6;1,1;wag;<]" - if tonumber(level2) > 176 then - formspec = formspec.."button[1,1;1,1;;177]" - end - if tonumber(level2) > 177 then - formspec = formspec.."button[2,1;1,1;;178]" - end - if tonumber(level2) > 178 then - formspec = formspec.."button[3,1;1,1;;179]" - end - if tonumber(level2) > 179 then - formspec = formspec.."button[4,1;1,1;;180]" - end - if tonumber(level2) > 180 then - formspec = formspec.."button[0,2;1,1;;181]" - end - if tonumber(level2) > 181 then - formspec = formspec.."button[1,2;1,1;;182]" - end - if tonumber(level2) > 182 then - formspec = formspec.."button[2,2;1,1;;183]" - end - if tonumber(level2) > 183 then - formspec = formspec.."button[3,2;1,1;;184]" - end - if tonumber(level2) > 184 then - formspec = formspec.."button[4,2;1,1;;185]" - end - if tonumber(level2) > 185 then - formspec = formspec.."button[0,3;1,1;;186]" - end - if tonumber(level2) > 186 then - formspec = formspec.."button[1,3;1,1;;187]" - end - if tonumber(level2) > 187 then - formspec = formspec.."button[2,3;1,1;;188]" - end - if tonumber(level2) > 188 then - formspec = formspec.."button[3,3;1,1;;189]" - end - if tonumber(level2) > 189 then - formspec = formspec.."button[4,3;1,1;;190]" - end - if tonumber(level2) > 190 then - formspec = formspec.."button[0,4;1,1;;191]" - end - if tonumber(level2) > 191 then - formspec = formspec.."button[1,4;1,1;;192]" - end - if tonumber(level2) > 192 then - formspec = formspec.."button[2,4;1,1;;193]" - end - if tonumber(level2) > 193 then - formspec = formspec.."button[3,4;1,1;;194]" - end - if tonumber(level2) > 194 then - formspec = formspec.."button[4,4;1,1;;195]" - end - if tonumber(level2) > 195 then - formspec = formspec.."button[0,5;1,1;;196]" - end - if tonumber(level2) > 196 then - formspec = formspec.."button[1,5;1,1;;197]" - end - if tonumber(level2) > 197 then - formspec = formspec.."button[2,5;1,1;;198]" - end - if tonumber(level2) > 198 then - formspec = formspec.."button[3,5;1,1;;199]" - end - if tonumber(level2) > 199 then - formspec = formspec.."button[4,5;1,1;;200]" - end + formspec = formspec.."button[1.5,6;1,1;wcg;<]" + formspec = formspec..lvbut(175,25,level2) if tonumber(level2) > 200 then - formspec = formspec.."button[2.5,6;1,1;wai;>]" + formspec = formspec.."button[2.5,6;1,1;wci;>]" end return formspec end @@ -2520,87 +1297,11 @@ w39.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]" - .."button[0,1;1,1;;201]" - .."button[1.5,6;1,1;wah;<]" - if tonumber(level2) > 201 then - formspec = formspec.."button[1,1;1,1;;202]" - end - if tonumber(level2) > 202 then - formspec = formspec.."button[2,1;1,1;;203]" - end - if tonumber(level2) > 203 then - formspec = formspec.."button[3,1;1,1;;204]" - end - if tonumber(level2) > 204 then - formspec = formspec.."button[4,1;1,1;;205]" - end - if tonumber(level2) > 205 then - formspec = formspec.."button[0,2;1,1;;206]" - end - if tonumber(level2) > 206 then - formspec = formspec.."button[1,2;1,1;;207]" - end - if tonumber(level2) > 207 then - formspec = formspec.."button[2,2;1,1;;208]" - end - if tonumber(level2) > 208 then - formspec = formspec.."button[3,2;1,1;;209]" - end - if tonumber(level2) > 209 then - formspec = formspec.."button[4,2;1,1;;210]" - end - if tonumber(level2) > 210 then - formspec = formspec.."button[0,3;1,1;;211]" - end - if tonumber(level2) > 211 then - formspec = formspec.."button[1,3;1,1;;212]" - end - if tonumber(level2) > 212 then - formspec = formspec.."button[2,3;1,1;;213]" - end - if tonumber(level2) > 213 then - formspec = formspec.."button[3,3;1,1;;214]" - end - if tonumber(level2) > 214 then - formspec = formspec.."button[4,3;1,1;;215]" - end - if tonumber(level2) > 215 then - formspec = formspec.."button[0,4;1,1;;216]" - end - if tonumber(level2) > 216 then - formspec = formspec.."button[1,4;1,1;;217]" - end - if tonumber(level2) > 217 then - formspec = formspec.."button[2,4;1,1;;218]" - end - if tonumber(level2) > 218 then - formspec = formspec.."button[3,4;1,1;;219]" - end - if tonumber(level2) > 219 then - formspec = formspec.."button[4,4;1,1;;220]" - end - if tonumber(level2) > 220 then - formspec = formspec.."button[0,5;1,1;;221]" - end - if tonumber(level2) > 221 then - formspec = formspec.."button[1,5;1,1;;222]" - end - if tonumber(level2) > 222 then - formspec = formspec.."button[2,5;1,1;;223]" - end - if tonumber(level2) > 223 then - formspec = formspec.."button[3,5;1,1;;224]" - end - if tonumber(level2) > 224 then - formspec = formspec.."button[4,5;1,1;;225]" - end + formspec = formspec.."button[1.5,6;1,1;wch;<]" + formspec = formspec..lvbut(200,25,level2) if tonumber(level2) > 225 then - formspec = formspec.."button[2.5,6;1,1;waj;>]" + formspec = formspec.."button[2.5,6;1,1;wcj;>]" end return formspec end @@ -2614,87 +1315,11 @@ w310.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]" - .."button[0,1;1,1;;226]" - .."button[1.5,6;1,1;wai;<]" - if tonumber(level2) > 226 then - formspec = formspec.."button[1,1;1,1;;227]" - end - if tonumber(level2) > 227 then - formspec = formspec.."button[2,1;1,1;;228]" - end - if tonumber(level2) > 228 then - formspec = formspec.."button[3,1;1,1;;229]" - end - if tonumber(level2) > 229 then - formspec = formspec.."button[4,1;1,1;;230]" - end - if tonumber(level2) > 230 then - formspec = formspec.."button[0,2;1,1;;231]" - end - if tonumber(level2) > 231 then - formspec = formspec.."button[1,2;1,1;;232]" - end - if tonumber(level2) > 232 then - formspec = formspec.."button[2,2;1,1;;233]" - end - if tonumber(level2) > 233 then - formspec = formspec.."button[3,2;1,1;;234]" - end - if tonumber(level2) > 234 then - formspec = formspec.."button[4,2;1,1;;235]" - end - if tonumber(level2) > 235 then - formspec = formspec.."button[0,3;1,1;;236]" - end - if tonumber(level2) > 236 then - formspec = formspec.."button[1,3;1,1;;237]" - end - if tonumber(level2) > 237 then - formspec = formspec.."button[2,3;1,1;;238]" - end - if tonumber(level2) > 238 then - formspec = formspec.."button[3,3;1,1;;239]" - end - if tonumber(level2) > 239 then - formspec = formspec.."button[4,3;1,1;;240]" - end - if tonumber(level2) > 240 then - formspec = formspec.."button[0,4;1,1;;241]" - end - if tonumber(level2) > 241 then - formspec = formspec.."button[1,4;1,1;;242]" - end - if tonumber(level2) > 242 then - formspec = formspec.."button[2,4;1,1;;243]" - end - if tonumber(level2) > 243 then - formspec = formspec.."button[3,4;1,1;;244]" - end - if tonumber(level2) > 244 then - formspec = formspec.."button[4,4;1,1;;245]" - end - if tonumber(level2) > 245 then - formspec = formspec.."button[0,5;1,1;;246]" - end - if tonumber(level2) > 246 then - formspec = formspec.."button[1,5;1,1;;247]" - end - if tonumber(level2) > 247 then - formspec = formspec.."button[2,5;1,1;;248]" - end - if tonumber(level2) > 248 then - formspec = formspec.."button[3,5;1,1;;249]" - end - if tonumber(level2) > 249 then - formspec = formspec.."button[4,5;1,1;;250]" - end + formspec = formspec.."button[1.5,6;1,1;wci;<]" + formspec = formspec..lvbut(225,25,level2) if tonumber(level2) > 250 then - formspec = formspec.."button[2.5,6;1,1;wak;>]" + formspec = formspec.."button[2.5,6;1,1;wck;>]" end return formspec end @@ -2708,87 +1333,11 @@ w311.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]" - .."button[0,1;1,1;;251]" - .."button[1.5,6;1,1;waj;<]" - if tonumber(level2) > 251 then - formspec = formspec.."button[1,1;1,1;;252]" - end - if tonumber(level2) > 252 then - formspec = formspec.."button[2,1;1,1;;253]" - end - if tonumber(level2) > 253 then - formspec = formspec.."button[3,1;1,1;;254]" - end - if tonumber(level2) > 254 then - formspec = formspec.."button[4,1;1,1;;255]" - end - if tonumber(level2) > 255 then - formspec = formspec.."button[0,2;1,1;;256]" - end - if tonumber(level2) > 256 then - formspec = formspec.."button[1,2;1,1;;257]" - end - if tonumber(level2) > 257 then - formspec = formspec.."button[2,2;1,1;;258]" - end - if tonumber(level2) > 258 then - formspec = formspec.."button[3,2;1,1;;259]" - end - if tonumber(level2) > 259 then - formspec = formspec.."button[4,2;1,1;;260]" - end - if tonumber(level2) > 260 then - formspec = formspec.."button[0,3;1,1;;261]" - end - if tonumber(level2) > 261 then - formspec = formspec.."button[1,3;1,1;;262]" - end - if tonumber(level2) > 262 then - formspec = formspec.."button[2,3;1,1;;263]" - end - if tonumber(level2) > 263 then - formspec = formspec.."button[3,3;1,1;;264]" - end - if tonumber(level2) > 264 then - formspec = formspec.."button[4,3;1,1;;265]" - end - if tonumber(level2) > 265 then - formspec = formspec.."button[0,4;1,1;;266]" - end - if tonumber(level2) > 266 then - formspec = formspec.."button[1,4;1,1;;267]" - end - if tonumber(level2) > 267 then - formspec = formspec.."button[2,4;1,1;;268]" - end - if tonumber(level2) > 268 then - formspec = formspec.."button[3,4;1,1;;269]" - end - if tonumber(level2) > 269 then - formspec = formspec.."button[4,4;1,1;;270]" - end - if tonumber(level2) > 270 then - formspec = formspec.."button[0,5;1,1;;271]" - end - if tonumber(level2) > 271 then - formspec = formspec.."button[1,5;1,1;;272]" - end - if tonumber(level2) > 272 then - formspec = formspec.."button[2,5;1,1;;273]" - end - if tonumber(level2) > 273 then - formspec = formspec.."button[3,5;1,1;;274]" - end - if tonumber(level2) > 274 then - formspec = formspec.."button[4,5;1,1;;275]" - end + formspec = formspec.."button[1.5,6;1,1;wcj;<]" + formspec = formspec..lvbut(250,25,level2) if tonumber(level2) > 275 then - formspec = formspec.."button[2.5,6;1,1;wal;>]" + formspec = formspec.."button[2.5,6;1,1;wcl;>]" end return formspec end @@ -2802,87 +1351,11 @@ w312.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]" - .."button[0,1;1,1;;276]" - .."button[1.5,6;1,1;wak;<]" - if tonumber(level2) > 276 then - formspec = formspec.."button[1,1;1,1;;277]" - end - if tonumber(level2) > 277 then - formspec = formspec.."button[2,1;1,1;;278]" - end - if tonumber(level2) > 278 then - formspec = formspec.."button[3,1;1,1;;279]" - end - if tonumber(level2) > 279 then - formspec = formspec.."button[4,1;1,1;;280]" - end - if tonumber(level2) > 280 then - formspec = formspec.."button[0,2;1,1;;281]" - end - if tonumber(level2) > 281 then - formspec = formspec.."button[1,2;1,1;;282]" - end - if tonumber(level2) > 282 then - formspec = formspec.."button[2,2;1,1;;283]" - end - if tonumber(level2) > 283 then - formspec = formspec.."button[3,2;1,1;;284]" - end - if tonumber(level2) > 284 then - formspec = formspec.."button[4,2;1,1;;285]" - end - if tonumber(level2) > 285 then - formspec = formspec.."button[0,3;1,1;;286]" - end - if tonumber(level2) > 286 then - formspec = formspec.."button[1,3;1,1;;287]" - end - if tonumber(level2) > 287 then - formspec = formspec.."button[2,3;1,1;;288]" - end - if tonumber(level2) > 288 then - formspec = formspec.."button[3,3;1,1;;289]" - end - if tonumber(level2) > 289 then - formspec = formspec.."button[4,3;1,1;;290]" - end - if tonumber(level2) > 290 then - formspec = formspec.."button[0,4;1,1;;291]" - end - if tonumber(level2) > 291 then - formspec = formspec.."button[1,4;1,1;;292]" - end - if tonumber(level2) > 292 then - formspec = formspec.."button[2,4;1,1;;293]" - end - if tonumber(level2) > 293 then - formspec = formspec.."button[3,4;1,1;;294]" - end - if tonumber(level2) > 294 then - formspec = formspec.."button[4,4;1,1;;295]" - end - if tonumber(level2) > 295 then - formspec = formspec.."button[0,5;1,1;;296]" - end - if tonumber(level2) > 296 then - formspec = formspec.."button[1,5;1,1;;297]" - end - if tonumber(level2) > 297 then - formspec = formspec.."button[2,5;1,1;;298]" - end - if tonumber(level2) > 298 then - formspec = formspec.."button[3,5;1,1;;299]" - end - if tonumber(level2) > 299 then - formspec = formspec.."button[4,5;1,1;;300]" - end + formspec = formspec.."button[1.5,6;1,1;wck;<]" + formspec = formspec..lvbut(275,25,level2) if tonumber(level2) > 300 then - formspec = formspec.."button[2.5,6;1,1;wam;>]" + formspec = formspec.."button[2.5,6;1,1;wcm;>]" end return formspec end @@ -2896,87 +1369,11 @@ w313.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]" - .."button[0,1;1,1;;301]" - .."button[1.5,6;1,1;wal;<]" - if tonumber(level2) > 301 then - formspec = formspec.."button[1,1;1,1;;302]" - end - if tonumber(level2) > 302 then - formspec = formspec.."button[2,1;1,1;;303]" - end - if tonumber(level2) > 303 then - formspec = formspec.."button[3,1;1,1;;304]" - end - if tonumber(level2) > 304 then - formspec = formspec.."button[4,1;1,1;;305]" - end - if tonumber(level2) > 305 then - formspec = formspec.."button[0,2;1,1;;306]" - end - if tonumber(level2) > 306 then - formspec = formspec.."button[1,2;1,1;;307]" - end - if tonumber(level2) > 307 then - formspec = formspec.."button[2,2;1,1;;308]" - end - if tonumber(level2) > 308 then - formspec = formspec.."button[3,2;1,1;;309]" - end - if tonumber(level2) > 309 then - formspec = formspec.."button[4,2;1,1;;310]" - end - if tonumber(level2) > 310 then - formspec = formspec.."button[0,3;1,1;;311]" - end - if tonumber(level2) > 311 then - formspec = formspec.."button[1,3;1,1;;312]" - end - if tonumber(level2) > 312 then - formspec = formspec.."button[2,3;1,1;;313]" - end - if tonumber(level2) > 313 then - formspec = formspec.."button[3,3;1,1;;314]" - end - if tonumber(level2) > 314 then - formspec = formspec.."button[4,3;1,1;;315]" - end - if tonumber(level2) > 315 then - formspec = formspec.."button[0,4;1,1;;316]" - end - if tonumber(level2) > 316 then - formspec = formspec.."button[1,4;1,1;;317]" - end - if tonumber(level2) > 317 then - formspec = formspec.."button[2,4;1,1;;318]" - end - if tonumber(level2) > 318 then - formspec = formspec.."button[3,4;1,1;;319]" - end - if tonumber(level2) > 319 then - formspec = formspec.."button[4,4;1,1;;320]" - end - if tonumber(level2) > 320 then - formspec = formspec.."button[0,5;1,1;;321]" - end - if tonumber(level2) > 321 then - formspec = formspec.."button[1,5;1,1;;322]" - end - if tonumber(level2) > 322 then - formspec = formspec.."button[2,5;1,1;;323]" - end - if tonumber(level2) > 323 then - formspec = formspec.."button[3,5;1,1;;324]" - end - if tonumber(level2) > 324 then - formspec = formspec.."button[4,5;1,1;;325]" - end + formspec = formspec.."button[1.5,6;1,1;wcl;<]" + formspec = formspec..lvbut(300,25,level2) if tonumber(level2) > 325 then - formspec = formspec.."button[2.5,6;1,1;wan;>]" + formspec = formspec.."button[2.5,6;1,1;wcn;>]" end return formspec end @@ -2990,39 +1387,85 @@ w314.get_formspec = function(player, pos) local level2 = lv:read("*l") lv:close() formspec = "size[5,6.5]" - .."background[5,6.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."image_button[4.5,-0.3;0.8,0.8;;esc;X]" .."label[0,0;World Level: "..(tonumber(level2)-1).."/333]" - .."button[0,1;1,1;;326]" - .."button[1.5,6;1,1;wam;<]" - if tonumber(level2) > 326 then - formspec = formspec.."button[1,1;1,1;;327]" - end - if tonumber(level2) > 327 then - formspec = formspec.."button[2,1;1,1;;328]" - end - if tonumber(level2) > 328 then - formspec = formspec.."button[3,1;1,1;;329]" - end - if tonumber(level2) > 329 then - formspec = formspec.."button[4,1;1,1;;330]" - end - if tonumber(level2) > 330 then - formspec = formspec.."button[0,2;1,1;;331]" - end - if tonumber(level2) > 331 then - formspec = formspec.."button[1,2;1,1;;332]" - end - if tonumber(level2) > 332 then - formspec = formspec.."button[2,2;1,1;;333]" - end + formspec = formspec.."button[1.5,6;1,1;wcm;<]" + formspec = formspec..lvbut(325,8,level2) if tonumber(level2) > 333 then formspec = formspec.."label[0,3;play world 1 and 2]" end return formspec end +local w41 = {} +w41.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level4.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/100]" + formspec = formspec..lvbut(0,25,level2) + if tonumber(level2) > 25 then + formspec = formspec.."button[2.5,6;1,1;wdb;>]" + end + return formspec +end +local w42 = {} +w42.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level4.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/100]" + formspec = formspec.."button[1.5,6;1,1;wda;<]" + formspec = formspec..lvbut(25,25,level2) + if tonumber(level2) > 50 then + formspec = formspec.."button[2.5,6;1,1;wdc;>]" + end + return formspec +end +local w43 = {} +w43.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level4.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/100]" + formspec = formspec.."button[1.5,6;1,1;wdb;<]" + formspec = formspec..lvbut(50,25,level2) + if tonumber(level2) > 75 then + formspec = formspec.."button[2.5,6;1,1;wdd;>]" + end + return formspec +end +local w44 = {} +w44.get_formspec = function(player, pos) + if player == nil then + return + end + local player_inv = player:get_inventory() + lv = io.open(minetest.get_worldpath().."/level4.txt", "r") + local level2 = lv:read("*l") + lv:close() + formspec = "size[5,6.5]" + .."label[0,0;World Level: "..(tonumber(level2)-1).."/100]" + formspec = formspec.."button[1.5,6;1,1;wdc;<]" + formspec = formspec..lvbut(75,25,level2) + if tonumber(level2) > 100 then + formspec = formspec.."label[0,6;more comming soon]" + end + return formspec +end local w3 = {} w3.get_formspec = function(player, pos) if player == nil then @@ -3129,7 +1572,17 @@ minetest.register_node("sudoku:new_w4",{ description = "New", --groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, on_punch = function(pos, node, player, pointed_thing) - minetest.show_formspec(player:get_player_name(), "w3" , w3.get_formspec(player)) + local player_inv = player:get_inventory() + local page = player_inv:get_stack("page4", 1):get_count()+1 + if page == 1 then + minetest.show_formspec(player:get_player_name(), "w41" , w41.get_formspec(player)) + elseif page == 2 then + minetest.show_formspec(player:get_player_name(), "w42" , w42.get_formspec(player)) + elseif page == 3 then + minetest.show_formspec(player:get_player_name(), "w43" , w43.get_formspec(player)) + elseif page == 4 then + minetest.show_formspec(player:get_player_name(), "w44" , w44.get_formspec(player)) + end end, }) minetest.register_node("sudoku:new_w5",{ @@ -3163,9 +1616,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) player_inv:set_size("page1", 1) player_inv:set_size("page2", 1) player_inv:set_size("page3", 1) - local d = 0 - if formname == "w11" then - d = 1 + player_inv:set_size("page4", 1) + if formname == "w11" or formname == "w12" or formname == "w13" or formname == "w14" or formname == "w15" or formname == "w16" or formname == "w17" then for k, v in pairs(fields) do if tonumber(v) ~= nil then New(player,"1_"..v) @@ -3173,126 +1625,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) player_inv:set_stack("ll", 1, "default:dirt 1") end end - if fields.wab then - player_inv:set_stack("page1", 1, "default:dirt") - minetest.show_formspec(player:get_player_name(), "w12" , w12.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end end - if formname == "w12" and d == 0 then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"1_"..v) - player_inv:set_stack("l", 1, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 1") - end - end - if fields.waa then - player_inv:set_stack("page1", 1, nil) - minetest.show_formspec(player:get_player_name(), "w11" , w11.get_formspec(player)) - elseif fields.wac then - player_inv:set_stack("page1", 1, "default:dirt 2") - minetest.show_formspec(player:get_player_name(), "w13" , w13.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w13" and d == 0 then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"1_"..v) - player_inv:set_stack("l", 1, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 1") - end - end - if fields.wab then - player_inv:set_stack("page1", 1, "default:dirt 1") - minetest.show_formspec(player:get_player_name(), "w12" , w12.get_formspec(player)) - elseif fields.wad then - player_inv:set_stack("page1", 1, "default:dirt 3") - minetest.show_formspec(player:get_player_name(), "w14" , w14.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w14" and d == 0 then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"1_"..v) - player_inv:set_stack("l", 1, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 1") - end - end - if fields.wac then - player_inv:set_stack("page1", 1, "default:dirt 2") - minetest.show_formspec(player:get_player_name(), "w13" , w13.get_formspec(player)) - elseif fields.wae then - player_inv:set_stack("page1", 1, "default:dirt 4") - minetest.show_formspec(player:get_player_name(), "w15" , w15.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w15" and d == 0 then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"1_"..v) - player_inv:set_stack("l", 1, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 1") - end - end - if fields.wad then - player_inv:set_stack("page1", 1, "default:dirt 3") - minetest.show_formspec(player:get_player_name(), "w14" , w14.get_formspec(player)) - elseif fields.waf then - player_inv:set_stack("page1", 1, "default:dirt 5") - minetest.show_formspec(player:get_player_name(), "w16" , w16.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w16" and d == 0 then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"1_"..v) - player_inv:set_stack("l", 1, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 1") - end - end - if fields.wae then - player_inv:set_stack("page1", 1, "default:dirt 4") - minetest.show_formspec(player:get_player_name(), "w15" , w15.get_formspec(player)) - elseif fields.wag then - player_inv:set_stack("page1", 1, "default:dirt 6") - minetest.show_formspec(player:get_player_name(), "w17" , w17.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w17" and d == 0 then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"1_"..v) - player_inv:set_stack("l", 1, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 1") - end - end - if fields.waf then - player_inv:set_stack("page1", 1, "default:dirt 5") - minetest.show_formspec(player:get_player_name(), "w16" , w16.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w21" then - d = 1 + if formname == "w21" or formname == "w22" or formname == "w23" or formname == "w24" or formname == "w25" or formname == "w26" or formname == "w27" or formname == "w28" then for k, v in pairs(fields) do if tonumber(v) ~= nil then New(player,"2_"..v) @@ -3300,145 +1634,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) player_inv:set_stack("ll", 1, "default:dirt 2") end end - if fields.wab then - player_inv:set_stack("page2", 1, "default:dirt") - minetest.show_formspec(player:get_player_name(), "w22" , w22.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end end - if formname == "w22" and d == 0 then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"2_"..v) - player_inv:set_stack("l", 2, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 2") - end - end - if fields.waa then - player_inv:set_stack("page2", 1, nil) - minetest.show_formspec(player:get_player_name(), "w21" , w21.get_formspec(player)) - elseif fields.wac then - player_inv:set_stack("page2", 1, "default:dirt 2") - minetest.show_formspec(player:get_player_name(), "w23" , w23.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w23" and d == 0 then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"2_"..v) - player_inv:set_stack("l", 2, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 2") - end - end - if fields.wab then - player_inv:set_stack("page2", 1, nil) - minetest.show_formspec(player:get_player_name(), "w22" , w22.get_formspec(player)) - elseif fields.wad then - player_inv:set_stack("page2", 1, "default:dirt 3") - minetest.show_formspec(player:get_player_name(), "w24" , w24.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w24" and d == 0 then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"2_"..v) - player_inv:set_stack("l", 2, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 2") - end - end - if fields.wac then - player_inv:set_stack("page2", 1, "default:dirt 2") - minetest.show_formspec(player:get_player_name(), "w23" , w23.get_formspec(player)) - elseif fields.wae then - player_inv:set_stack("page2", 1, "default:dirt 4") - minetest.show_formspec(player:get_player_name(), "w25" , w25.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w25" and d == 0 then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"2_"..v) - player_inv:set_stack("l", 2, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 2") - end - end - if fields.wad then - player_inv:set_stack("page2", 1, "default:dirt 3") - minetest.show_formspec(player:get_player_name(), "w24" , w24.get_formspec(player)) - elseif fields.waf then - player_inv:set_stack("page2", 1, "default:dirt 5") - minetest.show_formspec(player:get_player_name(), "w26" , w26.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w26" and d == 0 then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"2_"..v) - player_inv:set_stack("l", 2, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 2") - end - end - if fields.wae then - player_inv:set_stack("page2", 1, "default:dirt 4") - minetest.show_formspec(player:get_player_name(), "w25" , w25.get_formspec(player)) - elseif fields.wag then - player_inv:set_stack("page2", 1, "default:dirt 6") - minetest.show_formspec(player:get_player_name(), "w27" , w27.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w27" and d == 0 then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"2_"..v) - player_inv:set_stack("l", 2, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 2") - end - end - if fields.waf then - player_inv:set_stack("page2", 1, "default:dirt 5") - minetest.show_formspec(player:get_player_name(), "w26" , w26.get_formspec(player)) - elseif fields.wah then - player_inv:set_stack("page2", 1, "default:dirt 7") - minetest.show_formspec(player:get_player_name(), "w28" , w28.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w28" and d == 0 then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"2_"..v) - player_inv:set_stack("l", 2, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 2") - end - end - if fields.wag then - player_inv:set_stack("page2", 1, "default:dirt 6") - minetest.show_formspec(player:get_player_name(), "w27" , w27.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w31" then - d = 1 + if formname == "w31" or formname == "w32" or formname == "w33" or formname == "w34" or formname == "w35" or formname == "w36" or formname == "w37" or formname == "w38" or formname == "w39" or formname == "w310" or formname == "w311" or formname == "w312" or formname == "w313" or formname == "w314" then for k, v in pairs(fields) do if tonumber(v) ~= nil then New(player,"3_"..v) @@ -3446,255 +1643,116 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) player_inv:set_stack("ll", 1, "default:dirt 3") end end - if fields.wab then - player_inv:set_stack("page3", 1, "default:dirt") - minetest.show_formspec(player:get_player_name(), "w32" , w32.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end end - if formname == "w32" then - d = 1 + if formname == "w41" or formname == "w42" or formname == "w43" or formname == "w44" then for k, v in pairs(fields) do if tonumber(v) ~= nil then - New(player,"3_"..v) - player_inv:set_stack("l", 3, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 3") + New(player,"4_"..v) + player_inv:set_stack("l", 4, "default:dirt "..v) + player_inv:set_stack("ll", 1, "default:dirt 4") end end - if fields.waa then - player_inv:set_stack("page3", 1,nil) - minetest.show_formspec(player:get_player_name(), "w31" , w31.get_formspec(player)) - elseif fields.wac then - player_inv:set_stack("page3", 1, "default:dirt 2") - minetest.show_formspec(player:get_player_name(), "w33" , w33.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end end - if formname == "w33" then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"3_"..v) - player_inv:set_stack("l", 3, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 3") - end - end - if fields.wab then - player_inv:set_stack("page3", 1,"default:dirt") - minetest.show_formspec(player:get_player_name(), "w32" , w32.get_formspec(player)) - elseif fields.wad then - player_inv:set_stack("page3", 1, "default:dirt 3") - minetest.show_formspec(player:get_player_name(), "w34" , w34.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w34" then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"3_"..v) - player_inv:set_stack("l", 3, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 3") - end - end - if fields.wac then - player_inv:set_stack("page3", 1,"default:dirt 2") - minetest.show_formspec(player:get_player_name(), "w33" , w33.get_formspec(player)) - elseif fields.wae then - player_inv:set_stack("page3", 1, "default:dirt 4") - minetest.show_formspec(player:get_player_name(), "w35" , w35.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w35" then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"3_"..v) - player_inv:set_stack("l", 3, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 3") - end - end - if fields.wad then - player_inv:set_stack("page3", 1,"default:dirt 3") - minetest.show_formspec(player:get_player_name(), "w34" , w34.get_formspec(player)) - elseif fields.waf then - player_inv:set_stack("page3", 1, "default:dirt 5") - minetest.show_formspec(player:get_player_name(), "w36" , w36.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w36" then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"3_"..v) - player_inv:set_stack("l", 3, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 3") - end - end - if fields.wae then - player_inv:set_stack("page3", 1,"default:dirt 4") - minetest.show_formspec(player:get_player_name(), "w35" , w35.get_formspec(player)) - elseif fields.wag then - player_inv:set_stack("page3", 1, "default:dirt 6") - minetest.show_formspec(player:get_player_name(), "w37" , w37.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w37" then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"3_"..v) - player_inv:set_stack("l", 3, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 3") - end - end - if fields.waf then - player_inv:set_stack("page3", 1,"default:dirt 5") - minetest.show_formspec(player:get_player_name(), "w36" , w36.get_formspec(player)) - elseif fields.wah then - player_inv:set_stack("page3", 1, "default:dirt 7") - minetest.show_formspec(player:get_player_name(), "w38" , w38.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w38" then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"3_"..v) - player_inv:set_stack("l", 3, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 3") - end - end - if fields.wag then - player_inv:set_stack("page3", 1,"default:dirt 6") - minetest.show_formspec(player:get_player_name(), "w37" , w37.get_formspec(player)) - elseif fields.wai then - player_inv:set_stack("page3", 1, "default:dirt 8") - minetest.show_formspec(player:get_player_name(), "w39" , w39.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w39" then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"3_"..v) - player_inv:set_stack("l", 3, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 3") - end - end - if fields.wah then - player_inv:set_stack("page3", 1,"default:dirt 7") - minetest.show_formspec(player:get_player_name(), "w38" , w38.get_formspec(player)) - elseif fields.waj then - player_inv:set_stack("page3", 1, "default:dirt 9") - minetest.show_formspec(player:get_player_name(), "w310" , w310.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w310" then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"3_"..v) - player_inv:set_stack("l", 3, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 3") - end - end - if fields.wai then - player_inv:set_stack("page3", 1,"default:dirt 8") - minetest.show_formspec(player:get_player_name(), "w39" , w39.get_formspec(player)) - elseif fields.wak then - player_inv:set_stack("page3", 1, "default:dirt 10") - minetest.show_formspec(player:get_player_name(), "w311" , w311.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w311" then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"3_"..v) - player_inv:set_stack("l", 3, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 3") - end - end - if fields.waj then - player_inv:set_stack("page3", 1,"default:dirt 9") - minetest.show_formspec(player:get_player_name(), "w310" , w310.get_formspec(player)) - elseif fields.wal then - player_inv:set_stack("page3", 1, "default:dirt 11") - minetest.show_formspec(player:get_player_name(), "w312" , w312.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w312" then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"3_"..v) - player_inv:set_stack("l", 3, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 3") - end - end - if fields.wak then - player_inv:set_stack("page3", 1,"default:dirt 10") - minetest.show_formspec(player:get_player_name(), "w311" , w311.get_formspec(player)) - elseif fields.wam then - player_inv:set_stack("page3", 1, "default:dirt 12") - minetest.show_formspec(player:get_player_name(), "w313" , w313.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w313" then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"3_"..v) - player_inv:set_stack("l", 3, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 3") - end - end - if fields.wal then - player_inv:set_stack("page3", 1,"default:dirt 11") - minetest.show_formspec(player:get_player_name(), "w312" , w312.get_formspec(player)) - elseif fields.wan then - player_inv:set_stack("page3", 1, "default:dirt 13") - minetest.show_formspec(player:get_player_name(), "w314" , w314.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end - end - if formname == "w314" then - d = 1 - for k, v in pairs(fields) do - if tonumber(v) ~= nil then - New(player,"3_"..v) - player_inv:set_stack("l", 3, "default:dirt "..v) - player_inv:set_stack("ll", 1, "default:dirt 3") - end - end - if fields.wam then - player_inv:set_stack("page3", 1,"default:dirt 12") - minetest.show_formspec(player:get_player_name(), "w313" , w313.get_formspec(player)) - else - minetest.show_formspec(player:get_player_name(), "", "") - end + if fields.waa then + player_inv:set_stack("page1", 1, nil) + minetest.show_formspec(player:get_player_name(), "w11" , w11.get_formspec(player)) + elseif fields.wab then + player_inv:set_stack("page1", 1, "default:dirt") + minetest.show_formspec(player:get_player_name(), "w12" , w12.get_formspec(player)) + elseif fields.wac then + player_inv:set_stack("page1", 1, "default:dirt 2") + minetest.show_formspec(player:get_player_name(), "w13" , w13.get_formspec(player)) + elseif fields.wad then + player_inv:set_stack("page1", 1, "default:dirt 3") + minetest.show_formspec(player:get_player_name(), "w14" , w14.get_formspec(player)) + elseif fields.wae then + player_inv:set_stack("page1", 1, "default:dirt 4") + minetest.show_formspec(player:get_player_name(), "w15" , w15.get_formspec(player)) + elseif fields.waf then + player_inv:set_stack("page1", 1, "default:dirt 5") + minetest.show_formspec(player:get_player_name(), "w16" , w16.get_formspec(player)) + elseif fields.wag then + player_inv:set_stack("page1", 1, "default:dirt 6") + minetest.show_formspec(player:get_player_name(), "w17" , w17.get_formspec(player)) + elseif fields.wba then + player_inv:set_stack("page2", 1, nil) + minetest.show_formspec(player:get_player_name(), "w21" , w21.get_formspec(player)) + elseif fields.wbb then + player_inv:set_stack("page2", 1, "default:dirt") + minetest.show_formspec(player:get_player_name(), "w22" , w22.get_formspec(player)) + elseif fields.wbc then + player_inv:set_stack("page2", 1, "default:dirt 2") + minetest.show_formspec(player:get_player_name(), "w23" , w23.get_formspec(player)) + elseif fields.wbd then + player_inv:set_stack("page2", 1, "default:dirt 3") + minetest.show_formspec(player:get_player_name(), "w24" , w24.get_formspec(player)) + elseif fields.wbe then + player_inv:set_stack("page2", 1, "default:dirt 4") + minetest.show_formspec(player:get_player_name(), "w25" , w25.get_formspec(player)) + elseif fields.wbf then + player_inv:set_stack("page2", 1, "default:dirt 5") + minetest.show_formspec(player:get_player_name(), "w26" , w26.get_formspec(player)) + elseif fields.wbg then + player_inv:set_stack("page2", 1, "default:dirt 6") + minetest.show_formspec(player:get_player_name(), "w27" , w27.get_formspec(player)) + elseif fields.wbh then + player_inv:set_stack("page2", 1, "default:dirt 7") + minetest.show_formspec(player:get_player_name(), "w28" , w28.get_formspec(player)) + elseif fields.wca then + player_inv:set_stack("page3", 1, nil) + minetest.show_formspec(player:get_player_name(), "w31" , w31.get_formspec(player)) + elseif fields.wcb then + player_inv:set_stack("page3", 1, "default:dirt") + minetest.show_formspec(player:get_player_name(), "w32" , w32.get_formspec(player)) + elseif fields.wcc then + player_inv:set_stack("page3", 1, "default:dirt 2") + minetest.show_formspec(player:get_player_name(), "w33" , w33.get_formspec(player)) + elseif fields.wcd then + player_inv:set_stack("page3", 1, "default:dirt 3") + minetest.show_formspec(player:get_player_name(), "w34" , w34.get_formspec(player)) + elseif fields.wce then + player_inv:set_stack("page3", 1, "default:dirt 4") + minetest.show_formspec(player:get_player_name(), "w35" , w35.get_formspec(player)) + elseif fields.wcf then + player_inv:set_stack("page3", 1, "default:dirt 5") + minetest.show_formspec(player:get_player_name(), "w36" , w36.get_formspec(player)) + elseif fields.wcg then + player_inv:set_stack("page3", 1, "default:dirt 6") + minetest.show_formspec(player:get_player_name(), "w37" , w37.get_formspec(player)) + elseif fields.wch then + player_inv:set_stack("page3", 1, "default:dirt 7") + minetest.show_formspec(player:get_player_name(), "w38" , w38.get_formspec(player)) + elseif fields.wci then + player_inv:set_stack("page3", 1, "default:dirt 8") + minetest.show_formspec(player:get_player_name(), "w39" , w39.get_formspec(player)) + elseif fields.wcj then + player_inv:set_stack("page3", 1, "default:dirt 9") + minetest.show_formspec(player:get_player_name(), "w310" , w310.get_formspec(player)) + elseif fields.wck then + player_inv:set_stack("page3", 1, "default:dirt 10") + minetest.show_formspec(player:get_player_name(), "w311" , w311.get_formspec(player)) + elseif fields.wcl then + player_inv:set_stack("page3", 1, "default:dirt 11") + minetest.show_formspec(player:get_player_name(), "w312" , w312.get_formspec(player)) + elseif fields.wcm then + player_inv:set_stack("page3", 1, "default:dirt 12") + minetest.show_formspec(player:get_player_name(), "w313" , w313.get_formspec(player)) + elseif fields.wcn then + player_inv:set_stack("page3", 1, "default:dirt 13") + minetest.show_formspec(player:get_player_name(), "w314" , w314.get_formspec(player)) + elseif fields.wda then + player_inv:set_stack("page4", 1, "") + minetest.show_formspec(player:get_player_name(), "w41" , w41.get_formspec(player)) + elseif fields.wdb then + player_inv:set_stack("page4", 1, "default:dirt") + minetest.show_formspec(player:get_player_name(), "w42" , w42.get_formspec(player)) + elseif fields.wdc then + player_inv:set_stack("page4", 1, "default:dirt 2") + minetest.show_formspec(player:get_player_name(), "w43" , w43.get_formspec(player)) + elseif fields.wdd then + player_inv:set_stack("page4", 1, "default:dirt 3") + minetest.show_formspec(player:get_player_name(), "w44" , w44.get_formspec(player)) + else + minetest.show_formspec(player:get_player_name(), "", "") end end) \ No newline at end of file diff --git a/mods/sudoku/lv4_1.txt b/mods/sudoku/lv4_1.txt new file mode 100644 index 0000000..1c069a1 --- /dev/null +++ b/mods/sudoku/lv4_1.txt @@ -0,0 +1,9 @@ +000876000 +001000400 +030000060 +600090003 +800107009 +100080005 +040000080 +002000300 +000923000 \ No newline at end of file diff --git a/mods/sudoku/lv4_10.txt b/mods/sudoku/lv4_10.txt new file mode 100644 index 0000000..f09af03 --- /dev/null +++ b/mods/sudoku/lv4_10.txt @@ -0,0 +1,9 @@ +000509000 +005030800 +080000040 +500060004 +060402090 +400090007 +090000080 +001020300 +000301000 \ No newline at end of file diff --git a/mods/sudoku/lv4_100.txt b/mods/sudoku/lv4_100.txt new file mode 100644 index 0000000..164b964 --- /dev/null +++ b/mods/sudoku/lv4_100.txt @@ -0,0 +1,9 @@ +050000020 +302000708 +060030090 +000601000 +008000900 +000704000 +090050080 +601000302 +070000010 \ No newline at end of file diff --git a/mods/sudoku/lv4_11.txt b/mods/sudoku/lv4_11.txt new file mode 100644 index 0000000..cde0caf --- /dev/null +++ b/mods/sudoku/lv4_11.txt @@ -0,0 +1,9 @@ +000908000 +004203800 +010000060 +760000031 +000000000 +390000058 +070000020 +009805600 +000104000 \ No newline at end of file diff --git a/mods/sudoku/lv4_12.txt b/mods/sudoku/lv4_12.txt new file mode 100644 index 0000000..f1ec260 --- /dev/null +++ b/mods/sudoku/lv4_12.txt @@ -0,0 +1,9 @@ +020060080 +900000004 +000703000 +005020400 +200508009 +004070600 +000102000 +400000002 +030050070 \ No newline at end of file diff --git a/mods/sudoku/lv4_13.txt b/mods/sudoku/lv4_13.txt new file mode 100644 index 0000000..7808393 --- /dev/null +++ b/mods/sudoku/lv4_13.txt @@ -0,0 +1,9 @@ +020000080 +500000003 +008406200 +002805700 +000000000 +005304600 +006102800 +300000005 +090000010 \ No newline at end of file diff --git a/mods/sudoku/lv4_14.txt b/mods/sudoku/lv4_14.txt new file mode 100644 index 0000000..7452389 --- /dev/null +++ b/mods/sudoku/lv4_14.txt @@ -0,0 +1,9 @@ +000184000 +001000700 +030000020 +500907004 +200000007 +900503006 +040000060 +002000900 +000758000 \ No newline at end of file diff --git a/mods/sudoku/lv4_15.txt b/mods/sudoku/lv4_15.txt new file mode 100644 index 0000000..f44c402 --- /dev/null +++ b/mods/sudoku/lv4_15.txt @@ -0,0 +1,9 @@ +000867000 +009000400 +010040030 +400000005 +205000109 +800000002 +060080020 +007000800 +000679000 \ No newline at end of file diff --git a/mods/sudoku/lv4_16.txt b/mods/sudoku/lv4_16.txt new file mode 100644 index 0000000..65dbaaf --- /dev/null +++ b/mods/sudoku/lv4_16.txt @@ -0,0 +1,9 @@ +009603500 +000901000 +500000004 +710000053 +000000000 +420000018 +100000007 +000709000 +007802300 \ No newline at end of file diff --git a/mods/sudoku/lv4_17.txt b/mods/sudoku/lv4_17.txt new file mode 100644 index 0000000..c4bf5c8 --- /dev/null +++ b/mods/sudoku/lv4_17.txt @@ -0,0 +1,9 @@ +000000000 +005208100 +013000760 +090010040 +000809000 +080060090 +064000920 +001305800 +000000000 \ No newline at end of file diff --git a/mods/sudoku/lv4_18.txt b/mods/sudoku/lv4_18.txt new file mode 100644 index 0000000..6a95cf7 --- /dev/null +++ b/mods/sudoku/lv4_18.txt @@ -0,0 +1,9 @@ +000904000 +009000600 +060080010 +200010003 +004308900 +800050007 +070030060 +001000800 +000102000 \ No newline at end of file diff --git a/mods/sudoku/lv4_19.txt b/mods/sudoku/lv4_19.txt new file mode 100644 index 0000000..405e7b6 --- /dev/null +++ b/mods/sudoku/lv4_19.txt @@ -0,0 +1,9 @@ +800703004 +007000900 +050000020 +400030008 +000209000 +200060001 +020000010 +006000500 +500401003 \ No newline at end of file diff --git a/mods/sudoku/lv4_2.txt b/mods/sudoku/lv4_2.txt new file mode 100644 index 0000000..8192068 --- /dev/null +++ b/mods/sudoku/lv4_2.txt @@ -0,0 +1,9 @@ +000106000 +001000400 +065000970 +300804005 +000000000 +200903004 +057000130 +009000600 +000607000 \ No newline at end of file diff --git a/mods/sudoku/lv4_20.txt b/mods/sudoku/lv4_20.txt new file mode 100644 index 0000000..a3c114d --- /dev/null +++ b/mods/sudoku/lv4_20.txt @@ -0,0 +1,9 @@ +070000010 +500607008 +000901000 +038000140 +000000000 +059000380 +000204000 +800506007 +090000050 \ No newline at end of file diff --git a/mods/sudoku/lv4_21.txt b/mods/sudoku/lv4_21.txt new file mode 100644 index 0000000..4e81449 --- /dev/null +++ b/mods/sudoku/lv4_21.txt @@ -0,0 +1,9 @@ +008000600 +000905000 +900402007 +065000320 +000000000 +024000780 +300801004 +000609000 +002000500 \ No newline at end of file diff --git a/mods/sudoku/lv4_22.txt b/mods/sudoku/lv4_22.txt new file mode 100644 index 0000000..4799996 --- /dev/null +++ b/mods/sudoku/lv4_22.txt @@ -0,0 +1,9 @@ +010203060 +700000003 +000609000 +104000708 +000000000 +205000304 +000307000 +600000007 +050401090 \ No newline at end of file diff --git a/mods/sudoku/lv4_23.txt b/mods/sudoku/lv4_23.txt new file mode 100644 index 0000000..a72ab82 --- /dev/null +++ b/mods/sudoku/lv4_23.txt @@ -0,0 +1,9 @@ +020507090 +300000002 +000304000 +208000501 +000000000 +907000608 +000405000 +500000006 +010203040 \ No newline at end of file diff --git a/mods/sudoku/lv4_24.txt b/mods/sudoku/lv4_24.txt new file mode 100644 index 0000000..a6e6228 --- /dev/null +++ b/mods/sudoku/lv4_24.txt @@ -0,0 +1,9 @@ +706000804 +000704000 +100000005 +050090040 +000801000 +010060020 +300000006 +000408000 +804000703 \ No newline at end of file diff --git a/mods/sudoku/lv4_25.txt b/mods/sudoku/lv4_25.txt new file mode 100644 index 0000000..e78b3f6 --- /dev/null +++ b/mods/sudoku/lv4_25.txt @@ -0,0 +1,9 @@ +005706400 +000301000 +700000002 +360000029 +000000000 +120000037 +400000003 +000908000 +006407800 \ No newline at end of file diff --git a/mods/sudoku/lv4_26.txt b/mods/sudoku/lv4_26.txt new file mode 100644 index 0000000..fc55705 --- /dev/null +++ b/mods/sudoku/lv4_26.txt @@ -0,0 +1,9 @@ +030506080 +100000004 +000307000 +205000301 +000000000 +407000605 +000709000 +300000006 +050201090 \ No newline at end of file diff --git a/mods/sudoku/lv4_27.txt b/mods/sudoku/lv4_27.txt new file mode 100644 index 0000000..0f97438 --- /dev/null +++ b/mods/sudoku/lv4_27.txt @@ -0,0 +1,9 @@ +000306000 +007010400 +080000090 +600050003 +050104080 +200090004 +030000020 +001040600 +000207000 \ No newline at end of file diff --git a/mods/sudoku/lv4_28.txt b/mods/sudoku/lv4_28.txt new file mode 100644 index 0000000..292d234 --- /dev/null +++ b/mods/sudoku/lv4_28.txt @@ -0,0 +1,9 @@ +400903008 +009000300 +060000050 +200030007 +000405000 +100090002 +020000080 +003000900 +700802004 \ No newline at end of file diff --git a/mods/sudoku/lv4_29.txt b/mods/sudoku/lv4_29.txt new file mode 100644 index 0000000..d004e04 --- /dev/null +++ b/mods/sudoku/lv4_29.txt @@ -0,0 +1,9 @@ +700603005 +000204000 +002000800 +820000063 +000000000 +690000071 +005000400 +000908000 +300705002 \ No newline at end of file diff --git a/mods/sudoku/lv4_3.txt b/mods/sudoku/lv4_3.txt new file mode 100644 index 0000000..4bc0ee7 --- /dev/null +++ b/mods/sudoku/lv4_3.txt @@ -0,0 +1,9 @@ +000090000 +002000400 +070804010 +007609500 +300000008 +009205100 +080401050 +004000900 +000020000 \ No newline at end of file diff --git a/mods/sudoku/lv4_30.txt b/mods/sudoku/lv4_30.txt new file mode 100644 index 0000000..b74bbb4 --- /dev/null +++ b/mods/sudoku/lv4_30.txt @@ -0,0 +1,9 @@ +000207000 +006000200 +059000360 +900304005 +000000000 +700102009 +043000950 +002000800 +000801000 \ No newline at end of file diff --git a/mods/sudoku/lv4_31.txt b/mods/sudoku/lv4_31.txt new file mode 100644 index 0000000..ce9af94 --- /dev/null +++ b/mods/sudoku/lv4_31.txt @@ -0,0 +1,9 @@ +020000030 +400702009 +007000100 +040050080 +000604000 +090030010 +005000800 +600108005 +010000020 \ No newline at end of file diff --git a/mods/sudoku/lv4_32.txt b/mods/sudoku/lv4_32.txt new file mode 100644 index 0000000..6a26dd9 --- /dev/null +++ b/mods/sudoku/lv4_32.txt @@ -0,0 +1,9 @@ +005060100 +000809000 +100000004 +050040030 +800305006 +060020010 +700000009 +000901000 +003050600 \ No newline at end of file diff --git a/mods/sudoku/lv4_33.txt b/mods/sudoku/lv4_33.txt new file mode 100644 index 0000000..ef0ec9a --- /dev/null +++ b/mods/sudoku/lv4_33.txt @@ -0,0 +1,9 @@ +000000000 +003604900 +069000210 +070060050 +000201000 +080090030 +096000170 +002309400 +000000000 \ No newline at end of file diff --git a/mods/sudoku/lv4_34.txt b/mods/sudoku/lv4_34.txt new file mode 100644 index 0000000..bfc7a72 --- /dev/null +++ b/mods/sudoku/lv4_34.txt @@ -0,0 +1,9 @@ +000708000 +009000100 +018000320 +500030002 +000204000 +900070001 +054000960 +002000500 +000409000 \ No newline at end of file diff --git a/mods/sudoku/lv4_35.txt b/mods/sudoku/lv4_35.txt new file mode 100644 index 0000000..1c01517 --- /dev/null +++ b/mods/sudoku/lv4_35.txt @@ -0,0 +1,9 @@ +008000900 +070506030 +100000005 +060907010 +000000000 +030104070 +600000002 +010809040 +009000600 \ No newline at end of file diff --git a/mods/sudoku/lv4_36.txt b/mods/sudoku/lv4_36.txt new file mode 100644 index 0000000..cb62b42 --- /dev/null +++ b/mods/sudoku/lv4_36.txt @@ -0,0 +1,9 @@ +002801400 +000050000 +100090003 +200000007 +048000260 +600000004 +900070006 +000010000 +006205800 \ No newline at end of file diff --git a/mods/sudoku/lv4_37.txt b/mods/sudoku/lv4_37.txt new file mode 100644 index 0000000..709feb1 --- /dev/null +++ b/mods/sudoku/lv4_37.txt @@ -0,0 +1,9 @@ +002000300 +000703000 +100204005 +018000430 +000000000 +094000180 +600305007 +000102000 +001000800 \ No newline at end of file diff --git a/mods/sudoku/lv4_38.txt b/mods/sudoku/lv4_38.txt new file mode 100644 index 0000000..78f9371 --- /dev/null +++ b/mods/sudoku/lv4_38.txt @@ -0,0 +1,8 @@ +000105000 +003070100 +090000080 +500080009 +060502040 +800060001 +080000030 +009040200 \ No newline at end of file diff --git a/mods/sudoku/lv4_39.txt b/mods/sudoku/lv4_39.txt new file mode 100644 index 0000000..89ee1bf --- /dev/null +++ b/mods/sudoku/lv4_39.txt @@ -0,0 +1,10 @@ +007000500 +000106000 +200030004 +070060040 +002809600 +060050090 +500070001 +000208000 +009000800 +000090000 \ No newline at end of file diff --git a/mods/sudoku/lv4_4.txt b/mods/sudoku/lv4_4.txt new file mode 100644 index 0000000..75bb683 --- /dev/null +++ b/mods/sudoku/lv4_4.txt @@ -0,0 +1,9 @@ +000208000 +001604500 +070000040 +430000097 +000000000 +160000083 +050000030 +002506400 +000807000 \ No newline at end of file diff --git a/mods/sudoku/lv4_40.txt b/mods/sudoku/lv4_40.txt new file mode 100644 index 0000000..3c5c7ad --- /dev/null +++ b/mods/sudoku/lv4_40.txt @@ -0,0 +1,9 @@ +002000700 +000901000 +700503001 +043000920 +000000000 +089000130 +500704009 +000102000 +008000400 \ No newline at end of file diff --git a/mods/sudoku/lv4_41.txt b/mods/sudoku/lv4_41.txt new file mode 100644 index 0000000..3d527d6 --- /dev/null +++ b/mods/sudoku/lv4_41.txt @@ -0,0 +1,9 @@ +001000200 +000403000 +500206003 +015000840 +000000000 +086000170 +600302008 +000904000 +002000900 \ No newline at end of file diff --git a/mods/sudoku/lv4_42.txt b/mods/sudoku/lv4_42.txt new file mode 100644 index 0000000..4aebf6d --- /dev/null +++ b/mods/sudoku/lv4_42.txt @@ -0,0 +1,9 @@ +002501900 +000803000 +800000007 +140000063 +000000000 +960000041 +300000004 +000405000 +005309100 \ No newline at end of file diff --git a/mods/sudoku/lv4_43.txt b/mods/sudoku/lv4_43.txt new file mode 100644 index 0000000..e12e830 --- /dev/null +++ b/mods/sudoku/lv4_43.txt @@ -0,0 +1,9 @@ +000174000 +009000200 +060000030 +300702004 +600000008 +200506007 +040000010 +003000700 +000961000 \ No newline at end of file diff --git a/mods/sudoku/lv4_44.txt b/mods/sudoku/lv4_44.txt new file mode 100644 index 0000000..172ca19 --- /dev/null +++ b/mods/sudoku/lv4_44.txt @@ -0,0 +1,9 @@ +140000023 +900000007 +000609000 +004080700 +000105000 +003020100 +000806000 +500000009 +230000018 \ No newline at end of file diff --git a/mods/sudoku/lv4_45.txt b/mods/sudoku/lv4_45.txt new file mode 100644 index 0000000..a71782d --- /dev/null +++ b/mods/sudoku/lv4_45.txt @@ -0,0 +1,9 @@ +006708100 +000302000 +100000009 +820000046 +000000000 +460000017 +900000002 +000503000 +007109300 \ No newline at end of file diff --git a/mods/sudoku/lv4_46.txt b/mods/sudoku/lv4_46.txt new file mode 100644 index 0000000..b06af8b --- /dev/null +++ b/mods/sudoku/lv4_46.txt @@ -0,0 +1,9 @@ +000803000 +004000800 +050109020 +901000208 +000000000 +306000401 +070204090 +003000600 +000701000 \ No newline at end of file diff --git a/mods/sudoku/lv4_47.txt b/mods/sudoku/lv4_47.txt new file mode 100644 index 0000000..bc73627 --- /dev/null +++ b/mods/sudoku/lv4_47.txt @@ -0,0 +1,9 @@ +000403000 +006000800 +014000290 +400080006 +000105000 +600040007 +028000970 +009000300 +000708000 \ No newline at end of file diff --git a/mods/sudoku/lv4_48.txt b/mods/sudoku/lv4_48.txt new file mode 100644 index 0000000..43350cc --- /dev/null +++ b/mods/sudoku/lv4_48.txt @@ -0,0 +1,9 @@ +008000200 +000607000 +200504009 +014000520 +000000000 +053000870 +600709005 +000302000 +007000400 \ No newline at end of file diff --git a/mods/sudoku/lv4_49.txt b/mods/sudoku/lv4_49.txt new file mode 100644 index 0000000..73c97b8 --- /dev/null +++ b/mods/sudoku/lv4_49.txt @@ -0,0 +1,9 @@ +100030008 +002000900 +070105020 +009000700 +700000006 +003000200 +020401030 +004000500 +800090002 \ No newline at end of file diff --git a/mods/sudoku/lv4_5.txt b/mods/sudoku/lv4_5.txt new file mode 100644 index 0000000..694575c --- /dev/null +++ b/mods/sudoku/lv4_5.txt @@ -0,0 +1,9 @@ +001000400 +000314000 +500000007 +070050040 +040602070 +090040030 +600000002 +000869000 +003000500 \ No newline at end of file diff --git a/mods/sudoku/lv4_50.txt b/mods/sudoku/lv4_50.txt new file mode 100644 index 0000000..ffd42bf --- /dev/null +++ b/mods/sudoku/lv4_50.txt @@ -0,0 +1,9 @@ +006000400 +090203080 +500000007 +020080010 +000709000 +030010050 +400000001 +060507020 +003000500 \ No newline at end of file diff --git a/mods/sudoku/lv4_51.txt b/mods/sudoku/lv4_51.txt new file mode 100644 index 0000000..8e83a17 --- /dev/null +++ b/mods/sudoku/lv4_51.txt @@ -0,0 +1,9 @@ +300080001 +090000060 +000519000 +005000900 +104000805 +009000700 +000746000 +040000080 +200030004 \ No newline at end of file diff --git a/mods/sudoku/lv4_52.txt b/mods/sudoku/lv4_52.txt new file mode 100644 index 0000000..40e23db --- /dev/null +++ b/mods/sudoku/lv4_52.txt @@ -0,0 +1,9 @@ +300907002 +000401000 +004000800 +460000085 +000000000 +730000029 +005000400 +000609000 +600302001 \ No newline at end of file diff --git a/mods/sudoku/lv4_53.txt b/mods/sudoku/lv4_53.txt new file mode 100644 index 0000000..d42ac9b --- /dev/null +++ b/mods/sudoku/lv4_53.txt @@ -0,0 +1,9 @@ +010000080 +900000002 +000864000 +005070200 +003605900 +007020300 +000387000 +800000006 +040000050 \ No newline at end of file diff --git a/mods/sudoku/lv4_54.txt b/mods/sudoku/lv4_54.txt new file mode 100644 index 0000000..f08599c --- /dev/null +++ b/mods/sudoku/lv4_54.txt @@ -0,0 +1,9 @@ +038000620 +200070004 +600000009 +000906000 +050000030 +000207000 +500000003 +900040005 +061000940 \ No newline at end of file diff --git a/mods/sudoku/lv4_55.txt b/mods/sudoku/lv4_55.txt new file mode 100644 index 0000000..91e852e --- /dev/null +++ b/mods/sudoku/lv4_55.txt @@ -0,0 +1,9 @@ +020703080 +900000007 +000208000 +306000209 +000000000 +507000106 +000507000 +200000001 +040102090 \ No newline at end of file diff --git a/mods/sudoku/lv4_56.txt b/mods/sudoku/lv4_56.txt new file mode 100644 index 0000000..977bb6f --- /dev/null +++ b/mods/sudoku/lv4_56.txt @@ -0,0 +1,9 @@ +020409080 +500000004 +000203000 +709000602 +000000000 +205000309 +000608000 +400000006 +090105040 \ No newline at end of file diff --git a/mods/sudoku/lv4_57.txt b/mods/sudoku/lv4_57.txt new file mode 100644 index 0000000..4b2ddd7 --- /dev/null +++ b/mods/sudoku/lv4_57.txt @@ -0,0 +1,9 @@ +050000080 +700000004 +000576000 +003801600 +009000400 +001304500 +000789000 +600000005 +030000020 \ No newline at end of file diff --git a/mods/sudoku/lv4_58.txt b/mods/sudoku/lv4_58.txt new file mode 100644 index 0000000..d7834ae --- /dev/null +++ b/mods/sudoku/lv4_58.txt @@ -0,0 +1,9 @@ +600000007 +002000100 +050103060 +001080900 +000406000 +008050700 +020309050 +007000400 +100000002 diff --git a/mods/sudoku/lv4_59.txt b/mods/sudoku/lv4_59.txt new file mode 100644 index 0000000..ea9740b --- /dev/null +++ b/mods/sudoku/lv4_59.txt @@ -0,0 +1,9 @@ +006000800 +020000050 +500702006 +007080900 +000604000 +009070200 +900401005 +080000040 +003000700 \ No newline at end of file diff --git a/mods/sudoku/lv4_6.txt b/mods/sudoku/lv4_6.txt new file mode 100644 index 0000000..4ae714a --- /dev/null +++ b/mods/sudoku/lv4_6.txt @@ -0,0 +1,9 @@ +007000600 +000203000 +500809001 +014000260 +000000000 +039000570 +100305008 +000402000 +003000400 \ No newline at end of file diff --git a/mods/sudoku/lv4_60.txt b/mods/sudoku/lv4_60.txt new file mode 100644 index 0000000..32777da --- /dev/null +++ b/mods/sudoku/lv4_60.txt @@ -0,0 +1,9 @@ +002000700 +000904000 +900603004 +078000190 +000000000 +069000850 +600809005 +000301000 +001000900 \ No newline at end of file diff --git a/mods/sudoku/lv4_61.txt b/mods/sudoku/lv4_61.txt new file mode 100644 index 0000000..b61a51d --- /dev/null +++ b/mods/sudoku/lv4_61.txt @@ -0,0 +1,9 @@ +200000008 +006000100 +070409020 +002050800 +000301000 +003040500 +030602070 +004000900 +800000001 \ No newline at end of file diff --git a/mods/sudoku/lv4_62.txt b/mods/sudoku/lv4_62.txt new file mode 100644 index 0000000..3334604 --- /dev/null +++ b/mods/sudoku/lv4_62.txt @@ -0,0 +1,9 @@ +080000020 +790000014 +000107000 +001080200 +000609000 +006030900 +000205000 +510000037 +040000060 \ No newline at end of file diff --git a/mods/sudoku/lv4_63.txt b/mods/sudoku/lv4_63.txt new file mode 100644 index 0000000..c2db71c --- /dev/null +++ b/mods/sudoku/lv4_63.txt @@ -0,0 +1,9 @@ +060307040 +800000001 +000608000 +509000204 +000000000 +403000108 +000705000 +900000003 +030106080 \ No newline at end of file diff --git a/mods/sudoku/lv4_64.txt b/mods/sudoku/lv4_64.txt new file mode 100644 index 0000000..afda64a --- /dev/null +++ b/mods/sudoku/lv4_64.txt @@ -0,0 +1,9 @@ +000706000 +063000540 +020000090 +500010004 +000208000 +200090003 +090000010 +084000360 +000405000 \ No newline at end of file diff --git a/mods/sudoku/lv4_65.txt b/mods/sudoku/lv4_65.txt new file mode 100644 index 0000000..288d671 --- /dev/null +++ b/mods/sudoku/lv4_65.txt @@ -0,0 +1,9 @@ +060000030 +820000057 +001030200 +000608000 +009000100 +000207000 +004050800 +780000015 +010000020 \ No newline at end of file diff --git a/mods/sudoku/lv4_66.txt b/mods/sudoku/lv4_66.txt new file mode 100644 index 0000000..c36f6fb --- /dev/null +++ b/mods/sudoku/lv4_66.txt @@ -0,0 +1,9 @@ +000607000 +004209700 +060000090 +180000026 +000000000 +320000085 +050000010 +002706300 +000904000 \ No newline at end of file diff --git a/mods/sudoku/lv4_67.txt b/mods/sudoku/lv4_67.txt new file mode 100644 index 0000000..32262f9 --- /dev/null +++ b/mods/sudoku/lv4_67.txt @@ -0,0 +1,9 @@ +090204030 +100000005 +000501000 +908000701 +000000000 +706000802 +000308000 +400000007 +010609020 \ No newline at end of file diff --git a/mods/sudoku/lv4_68.txt b/mods/sudoku/lv4_68.txt new file mode 100644 index 0000000..99d2aa2 --- /dev/null +++ b/mods/sudoku/lv4_68.txt @@ -0,0 +1,9 @@ +000201000 +004603800 +070000060 +130000075 +000000000 +280000036 +040000090 +001805700 +000702000 \ No newline at end of file diff --git a/mods/sudoku/lv4_69.txt b/mods/sudoku/lv4_69.txt new file mode 100644 index 0000000..849dd07 --- /dev/null +++ b/mods/sudoku/lv4_69.txt @@ -0,0 +1,9 @@ +400000008 +000912000 +002000100 +070601050 +090000010 +040209030 +005000700 +000856000 +800000009 diff --git a/mods/sudoku/lv4_7.txt b/mods/sudoku/lv4_7.txt new file mode 100644 index 0000000..16ec4cf --- /dev/null +++ b/mods/sudoku/lv4_7.txt @@ -0,0 +1,9 @@ +004000100 +000524000 +500000008 +020306080 +050000040 +040207060 +800000005 +000719000 +009000600 \ No newline at end of file diff --git a/mods/sudoku/lv4_70.txt b/mods/sudoku/lv4_70.txt new file mode 100644 index 0000000..68f6ac7 --- /dev/null +++ b/mods/sudoku/lv4_70.txt @@ -0,0 +1,9 @@ +000010000 +005070900 +070302040 +006000100 +530000086 +002000700 +040807050 +001050400 +000030000 \ No newline at end of file diff --git a/mods/sudoku/lv4_71.txt b/mods/sudoku/lv4_71.txt new file mode 100644 index 0000000..86c486f --- /dev/null +++ b/mods/sudoku/lv4_71.txt @@ -0,0 +1,9 @@ +100030005 +098000420 +070000060 +000809000 +500000004 +000507000 +060000010 +052000870 +900080006 \ No newline at end of file diff --git a/mods/sudoku/lv4_72.txt b/mods/sudoku/lv4_72.txt new file mode 100644 index 0000000..46ee758 --- /dev/null +++ b/mods/sudoku/lv4_72.txt @@ -0,0 +1,9 @@ +090000030 +200301004 +000405000 +059000620 +000000000 +076000310 +000508000 +800907003 +010000060 \ No newline at end of file diff --git a/mods/sudoku/lv4_73.txt b/mods/sudoku/lv4_73.txt new file mode 100644 index 0000000..a70a3a7 --- /dev/null +++ b/mods/sudoku/lv4_73.txt @@ -0,0 +1,9 @@ +020000070 +500030006 +007604200 +009000700 +070000010 +003000800 +004906300 +900080005 +010000060 \ No newline at end of file diff --git a/mods/sudoku/lv4_74.txt b/mods/sudoku/lv4_74.txt new file mode 100644 index 0000000..8a03b6b --- /dev/null +++ b/mods/sudoku/lv4_74.txt @@ -0,0 +1,9 @@ +109000602 +000102000 +500000008 +070050030 +000703000 +080010020 +200000004 +000604000 +805000106 \ No newline at end of file diff --git a/mods/sudoku/lv4_75.txt b/mods/sudoku/lv4_75.txt new file mode 100644 index 0000000..2a28c89 --- /dev/null +++ b/mods/sudoku/lv4_75.txt @@ -0,0 +1,9 @@ +030000010 +800903002 +000605000 +082000530 +000000000 +056000790 +000108000 +200306008 +090000020 \ No newline at end of file diff --git a/mods/sudoku/lv4_76.txt b/mods/sudoku/lv4_76.txt new file mode 100644 index 0000000..33d0d9b --- /dev/null +++ b/mods/sudoku/lv4_76.txt @@ -0,0 +1,9 @@ +006809500 +000705000 +400000009 +820000074 +000000000 +170000068 +500000007 +000603000 +008204600 \ No newline at end of file diff --git a/mods/sudoku/lv4_77.txt b/mods/sudoku/lv4_77.txt new file mode 100644 index 0000000..a5fe694 --- /dev/null +++ b/mods/sudoku/lv4_77.txt @@ -0,0 +1,9 @@ +002501300 +000809000 +100000009 +630000075 +000000000 +980000014 +800000006 +000708000 +003205700 \ No newline at end of file diff --git a/mods/sudoku/lv4_78.txt b/mods/sudoku/lv4_78.txt new file mode 100644 index 0000000..6ccc642 --- /dev/null +++ b/mods/sudoku/lv4_78.txt @@ -0,0 +1,9 @@ +800203009 +003000100 +050000070 +100804003 +000000000 +600107005 +010000050 +002000700 +300405008 \ No newline at end of file diff --git a/mods/sudoku/lv4_79.txt b/mods/sudoku/lv4_79.txt new file mode 100644 index 0000000..9891daf --- /dev/null +++ b/mods/sudoku/lv4_79.txt @@ -0,0 +1,9 @@ +000403000 +008702300 +090000080 +150000047 +000000000 +820000056 +060000010 +004108500 +000307000 \ No newline at end of file diff --git a/mods/sudoku/lv4_8.txt b/mods/sudoku/lv4_8.txt new file mode 100644 index 0000000..275a694 --- /dev/null +++ b/mods/sudoku/lv4_8.txt @@ -0,0 +1,9 @@ +280000016 +600000003 +000107000 +005040300 +000509000 +007020500 +000802000 +700000001 +320000098 \ No newline at end of file diff --git a/mods/sudoku/lv4_80.txt b/mods/sudoku/lv4_80.txt new file mode 100644 index 0000000..af79b12 --- /dev/null +++ b/mods/sudoku/lv4_80.txt @@ -0,0 +1,9 @@ +001904800 +000803000 +500000002 +260000015 +000000000 +870000069 +700000004 +000402000 +008601300 \ No newline at end of file diff --git a/mods/sudoku/lv4_81.txt b/mods/sudoku/lv4_81.txt new file mode 100644 index 0000000..ec022fd --- /dev/null +++ b/mods/sudoku/lv4_81.txt @@ -0,0 +1,9 @@ +000403000 +006000200 +040106050 +802000307 +000000000 +904000806 +010709020 +008000900 +000504000 \ No newline at end of file diff --git a/mods/sudoku/lv4_82.txt b/mods/sudoku/lv4_82.txt new file mode 100644 index 0000000..5216d31 --- /dev/null +++ b/mods/sudoku/lv4_82.txt @@ -0,0 +1,9 @@ +003000900 +000201000 +100080007 +030906020 +002000700 +010408090 +700040001 +000702000 +009000800 \ No newline at end of file diff --git a/mods/sudoku/lv4_83.txt b/mods/sudoku/lv4_83.txt new file mode 100644 index 0000000..b9ac0f2 --- /dev/null +++ b/mods/sudoku/lv4_83.txt @@ -0,0 +1,9 @@ +070000010 +600000003 +000651000 +001403700 +006000800 +002908500 +000579000 +500000004 +030000020 \ No newline at end of file diff --git a/mods/sudoku/lv4_84.txt b/mods/sudoku/lv4_84.txt new file mode 100644 index 0000000..b5de255 --- /dev/null +++ b/mods/sudoku/lv4_84.txt @@ -0,0 +1,9 @@ +005000900 +000805000 +600304002 +094000120 +000000000 +012000580 +300201004 +000509000 +009000800 \ No newline at end of file diff --git a/mods/sudoku/lv4_85.txt b/mods/sudoku/lv4_85.txt new file mode 100644 index 0000000..c09e49c --- /dev/null +++ b/mods/sudoku/lv4_85.txt @@ -0,0 +1,9 @@ +007503600 +000602000 +100000002 +910000028 +000000000 +580000014 +400000003 +000709000 +003408900 \ No newline at end of file diff --git a/mods/sudoku/lv4_86.txt b/mods/sudoku/lv4_86.txt new file mode 100644 index 0000000..e49cd8c --- /dev/null +++ b/mods/sudoku/lv4_86.txt @@ -0,0 +1,9 @@ +000205000 +004000700 +010903080 +903000607 +000000000 +206000103 +070104050 +008000900 +000607000 \ No newline at end of file diff --git a/mods/sudoku/lv4_87.txt b/mods/sudoku/lv4_87.txt new file mode 100644 index 0000000..de16389 --- /dev/null +++ b/mods/sudoku/lv4_87.txt @@ -0,0 +1,9 @@ +200807003 +004000500 +090000020 +900030002 +000409000 +700080001 +070000090 +008000200 +600201008 \ No newline at end of file diff --git a/mods/sudoku/lv4_88.txt b/mods/sudoku/lv4_88.txt new file mode 100644 index 0000000..2c60c50 --- /dev/null +++ b/mods/sudoku/lv4_88.txt @@ -0,0 +1,9 @@ +000503000 +006000900 +050906040 +904000702 +000000000 +201000806 +040705090 +007000200 +000408000 \ No newline at end of file diff --git a/mods/sudoku/lv4_89.txt b/mods/sudoku/lv4_89.txt new file mode 100644 index 0000000..a528b8b --- /dev/null +++ b/mods/sudoku/lv4_89.txt @@ -0,0 +1,9 @@ +090000040 +500108003 +000203000 +016000290 +000000000 +059000860 +000504000 +700609005 +060000070 \ No newline at end of file diff --git a/mods/sudoku/lv4_9.txt b/mods/sudoku/lv4_9.txt new file mode 100644 index 0000000..cce36a0 --- /dev/null +++ b/mods/sudoku/lv4_9.txt @@ -0,0 +1,9 @@ +009000800 +000701000 +200403005 +048000210 +000000000 +025000460 +100206007 +000507000 +002000600 \ No newline at end of file diff --git a/mods/sudoku/lv4_90.txt b/mods/sudoku/lv4_90.txt new file mode 100644 index 0000000..bff7352 --- /dev/null +++ b/mods/sudoku/lv4_90.txt @@ -0,0 +1,9 @@ +000723000 +008090400 +060000070 +800000007 +390000058 +100000004 +040000020 +009080100 +000254000 \ No newline at end of file diff --git a/mods/sudoku/lv4_91.txt b/mods/sudoku/lv4_91.txt new file mode 100644 index 0000000..5942a77 --- /dev/null +++ b/mods/sudoku/lv4_91.txt @@ -0,0 +1,9 @@ +006040100 +000716000 +900000004 +080000020 +560000037 +020000010 +700000008 +000583000 +003020900 \ No newline at end of file diff --git a/mods/sudoku/lv4_92.txt b/mods/sudoku/lv4_92.txt new file mode 100644 index 0000000..8451804 --- /dev/null +++ b/mods/sudoku/lv4_92.txt @@ -0,0 +1,9 @@ +000409000 +006000700 +020706050 +704000801 +000000000 +901000304 +040103090 +008000600 +000602000 \ No newline at end of file diff --git a/mods/sudoku/lv4_93.txt b/mods/sudoku/lv4_93.txt new file mode 100644 index 0000000..f804b40 --- /dev/null +++ b/mods/sudoku/lv4_93.txt @@ -0,0 +1,9 @@ +000203000 +007000900 +052000340 +800402001 +000000000 +400901008 +073000590 +004000800 +000104000 \ No newline at end of file diff --git a/mods/sudoku/lv4_94.txt b/mods/sudoku/lv4_94.txt new file mode 100644 index 0000000..cc20bf0 --- /dev/null +++ b/mods/sudoku/lv4_94.txt @@ -0,0 +1,9 @@ +070000080 +500000004 +009405200 +005304100 +000000000 +001706900 +004209700 +300000006 +090000030 \ No newline at end of file diff --git a/mods/sudoku/lv4_95.txt b/mods/sudoku/lv4_95.txt new file mode 100644 index 0000000..3e70313 --- /dev/null +++ b/mods/sudoku/lv4_95.txt @@ -0,0 +1,9 @@ +501000208 +000609000 +900000004 +020080010 +000203000 +070010040 +400000007 +000305000 +702000501 \ No newline at end of file diff --git a/mods/sudoku/lv4_96.txt b/mods/sudoku/lv4_96.txt new file mode 100644 index 0000000..fc3902c --- /dev/null +++ b/mods/sudoku/lv4_96.txt @@ -0,0 +1,9 @@ +090104060 +500000009 +000306000 +302000905 +000000000 +908000107 +000908000 +400000008 +080601030 \ No newline at end of file diff --git a/mods/sudoku/lv4_97.txt b/mods/sudoku/lv4_97.txt new file mode 100644 index 0000000..9759243 --- /dev/null +++ b/mods/sudoku/lv4_97.txt @@ -0,0 +1,9 @@ +060000070 +840000025 +000802000 +009020600 +000308000 +006040500 +000907000 +720000091 +010000040 \ No newline at end of file diff --git a/mods/sudoku/lv4_98.txt b/mods/sudoku/lv4_98.txt new file mode 100644 index 0000000..72b91df --- /dev/null +++ b/mods/sudoku/lv4_98.txt @@ -0,0 +1,9 @@ +070000060 +940000078 +000904000 +002010500 +000405000 +003080900 +000506000 +290000057 +010000040 \ No newline at end of file diff --git a/mods/sudoku/lv4_99.txt b/mods/sudoku/lv4_99.txt new file mode 100644 index 0000000..805eeec --- /dev/null +++ b/mods/sudoku/lv4_99.txt @@ -0,0 +1,9 @@ +008000100 +000402000 +200090004 +070030060 +004207800 +020060070 +600020009 +000501000 +001000300 \ No newline at end of file diff --git a/mods/sudoku/textures/sudoku_meselamp.png b/mods/sudoku/textures/sudoku_meselamp.png new file mode 100644 index 0000000000000000000000000000000000000000..30160ada0942479f1f84aa2bff4a61cb989d6f74 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#F*~mSi>BH(%SfQm6;Bt(5RLP_K^OTB8F1KS#BMVG%U^$)-)!dWZLBp3FSF)$ zx0qaz`?AAf`|YWnSI+p$M4c4#-d6a8f$70>{nM_+7damMoK(o8`LeK@-Npai_Zmxn zC2duHrvHVyk>oy|D9_E-S?JWJh@|)2oo=} z{Q9}x;*2w#j!bjyD?iz}aiwj%QqnsHpR@CK7tXyc{Z?(w&vcK_+d%&@c)I$ztaD0e F0szoxd&d9( literal 0 HcmV?d00001 diff --git a/mods/tnt/README.txt b/mods/tnt/README.txt index 4e74841..1970804 100644 --- a/mods/tnt/README.txt +++ b/mods/tnt/README.txt @@ -23,22 +23,35 @@ All gunpowder textures except tnt_gunpowder_inventory.png. sofar (sofar@foo-projects.org) (CC BY-SA 3.0): tnt_blast.png +paramat (CC BY-SA 3.0) +tnt_tnt_stick.png - Derived from a texture by benrob0329. + Introduction ------------ This mod adds TNT to Minetest. TNT is a tool to help the player in mining. How to use the mod: -Craft gunpowder by placing coal and gravel in the crafting area. -The gunpowder can be used to craft TNT or as fuse for TNT. -To craft TNT place items like this: --- wood - gunpowder -- wood - -gunpowder gunpowder gunpowder --- wood - gunpowder -- wood - -There are different ways to blow up TNT: +Craft gunpowder by placing coal and gravel in the crafting area. +The gunpowder can be used to craft TNT sticks or as a fuse trail for TNT. + +To craft 2 TNT sticks: +G_G +GPG +G_G +G = gunpowder +P = paper +The sticks are not usable as an explosive. + +Craft TNT from 9 TNT sticks. + +There are different ways to ignite TNT: 1. Hit it with a torch. - 2. Hit a gunpowder fuse that leads to a TNT block with a torch or flint-and-steel. + 2. Hit a gunpowder fuse trail that leads to TNT with a torch or + flint-and-steel. 3. Activate it with mesecons (fastest way). -Be aware of the damage radius of 6 blocks! +For 1 TNT: +Node destruction radius is 3 nodes. +Player and object damage radius is 6 nodes. diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index d12e814..3efc6ec 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -58,8 +58,8 @@ local function eject_drops(drops, pos, radius) local obj = minetest.add_item(drop_pos, dropitem) if obj then obj:get_luaentity().collect = true - obj:setacceleration({x = 0, y = -10, z = 0}) - obj:setvelocity({x = math.random(-3, 3), + obj:set_acceleration({x = 0, y = -10, z = 0}) + obj:set_velocity({x = math.random(-3, 3), y = math.random(0, 10), z = math.random(-3, 3)}) end @@ -152,7 +152,7 @@ end local function entity_physics(pos, radius, drops) local objs = minetest.get_objects_inside_radius(pos, radius) for _, obj in pairs(objs) do - local obj_pos = obj:getpos() + local obj_pos = obj:get_pos() local dist = math.max(1, vector.distance(pos, obj_pos)) local damage = (4 / dist) * radius @@ -164,7 +164,7 @@ local function entity_physics(pos, radius, drops) local moveoff = vector.multiply(dir, dist + 1.0) local newpos = vector.add(pos, moveoff) newpos = vector.add(newpos, {x = 0, y = 0.2, z = 0}) - obj:setpos(newpos) + obj:set_pos(newpos) obj:set_hp(obj:get_hp() - damage) else @@ -179,8 +179,8 @@ local function entity_physics(pos, radius, drops) end if do_knockback then - local obj_vel = obj:getvelocity() - obj:setvelocity(calc_velocity(pos, obj_pos, + local obj_vel = obj:get_velocity() + obj:set_velocity(calc_velocity(pos, obj_pos, obj_vel, radius * 10)) end if do_damage then @@ -395,7 +395,9 @@ function tnt.boom(pos, def) if not def.explode_center then minetest.set_node(pos, {name = "tnt:boom"}) end - minetest.sound_play("tnt_explode", {pos = pos, gain = 1.5, max_hear_distance = 2*64}) + local sound = def.sound or "tnt_explode" + minetest.sound_play(sound, {pos = pos, gain = 1.5, + max_hear_distance = math.min(def.radius * 20, 128)}) local drops, radius = tnt_explode(pos, def.radius, def.ignore_protection, def.ignore_on_blast, owner, def.explode_center) -- append entity drops @@ -544,13 +546,28 @@ minetest.register_craft({ recipe = {"default:coal_lump", "default:gravel"} }) +minetest.register_craftitem("tnt:tnt_stick", { + description = "TNT Stick", + inventory_image = "tnt_tnt_stick.png", + groups = {flammable = 5}, +}) + if enable_tnt then + minetest.register_craft({ + output = "tnt:tnt_stick 2", + recipe = { + {"tnt:gunpowder", "", "tnt:gunpowder"}, + {"tnt:gunpowder", "default:paper", "tnt:gunpowder"}, + {"tnt:gunpowder", "", "tnt:gunpowder"}, + } + }) + minetest.register_craft({ output = "tnt:tnt", recipe = { - {"group:wood", "tnt:gunpowder", "group:wood"}, - {"tnt:gunpowder", "tnt:gunpowder", "tnt:gunpowder"}, - {"group:wood", "tnt:gunpowder", "group:wood"} + {"tnt:tnt_stick", "tnt:tnt_stick", "tnt:tnt_stick"}, + {"tnt:tnt_stick", "tnt:tnt_stick", "tnt:tnt_stick"}, + {"tnt:tnt_stick", "tnt:tnt_stick", "tnt:tnt_stick"} } }) diff --git a/mods/tnt/license.txt b/mods/tnt/license.txt index 210f2bd..2c57df3 100644 --- a/mods/tnt/license.txt +++ b/mods/tnt/license.txt @@ -35,6 +35,7 @@ Copyright (C) 2014-2016 BlockMen Copyright (C) 2014-2016 ShadowNinja Copyright (C) 2015-2016 Wuzzy Copyright (C) 2016 sofar (sofar@foo-projects.org) +Copyright (C) 2018 paramat You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/tnt/textures/tnt_tnt_stick.png b/mods/tnt/textures/tnt_tnt_stick.png new file mode 100644 index 0000000000000000000000000000000000000000..bc47a291902b7251dc20e237df4d1c3af5f4184f GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ%`eIYGP@WU7BVpGVqmzy z!0?KJ;i%8HDL_%ik|4ie28U-i(tsR2PZ!4!j_b(@4vb9!vnDz+91>tKQdD5nIwZy< r>QNfjz$GzJ>%f5|md$~TR~Z>v-m^*UJjzl5)XCuK>gTe~DWM4f67?qE literal 0 HcmV?d00001 diff --git a/mods/vessels/README.txt b/mods/vessels/README.txt index 5bb798c..a54e330 100644 --- a/mods/vessels/README.txt +++ b/mods/vessels/README.txt @@ -4,9 +4,9 @@ See license.txt for license information. Authors of source code ---------------------- -Originally by Vanessa Ezekowitz (LGPL 2.1) -Modified by Perttu Ahola (LGPL 2.1) -Various Minetest developers and contributors (LGPL 2.1) +Originally by Vanessa Ezekowitz (LGPLv2.1+) +Modified by Perttu Ahola (LGPLv2.1+) +Various Minetest developers and contributors (LGPLv2.1+) Authors of media (textures) --------------------------- diff --git a/mods/vessels/init.lua b/mods/vessels/init.lua index 688413f..e5c68a7 100644 --- a/mods/vessels/init.lua +++ b/mods/vessels/init.lua @@ -3,9 +3,6 @@ local vessels_shelf_formspec = "size[8,7;]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. "list[context;vessels;0,0.3;8,2;]" .. "list[current_player;main;0,2.85;8,1;]" .. "list[current_player;main;0,4.08;8,3;8]" .. @@ -94,7 +91,7 @@ minetest.register_craft({ }) minetest.register_node("vessels:glass_bottle", { - description = "Glass Bottle (empty)", + description = "Empty Glass Bottle", drawtype = "plantlike", tiles = {"vessels_glass_bottle.png"}, inventory_image = "vessels_glass_bottle.png", @@ -120,7 +117,7 @@ minetest.register_craft( { }) minetest.register_node("vessels:drinking_glass", { - description = "Drinking Glass (empty)", + description = "Empty Drinking Glass", drawtype = "plantlike", tiles = {"vessels_drinking_glass.png"}, inventory_image = "vessels_drinking_glass_inv.png", @@ -146,7 +143,7 @@ minetest.register_craft( { }) minetest.register_node("vessels:steel_bottle", { - description = "Heavy Steel Bottle (empty)", + description = "Empty Heavy Steel Bottle", drawtype = "plantlike", tiles = {"vessels_steel_bottle.png"}, inventory_image = "vessels_steel_bottle.png", @@ -175,7 +172,7 @@ minetest.register_craft( { -- Glass and steel recycling minetest.register_craftitem("vessels:glass_fragments", { - description = "Pile of Glass Fragments", + description = "Glass Fragments", inventory_image = "vessels_glass_fragments.png", }) diff --git a/mods/walls/README.txt b/mods/walls/README.txt index 0389174..ba33bd7 100644 --- a/mods/walls/README.txt +++ b/mods/walls/README.txt @@ -4,4 +4,4 @@ See license.txt for license information. Authors of source code ---------------------- -Auke Kok (LGPL 2.1) +Auke Kok (LGPLv2.1+) diff --git a/mods/walls/init.lua b/mods/walls/init.lua index bee8e46..91a89cf 100644 --- a/mods/walls/init.lua +++ b/mods/walls/init.lua @@ -1,6 +1,10 @@ walls = {} -walls.register = function(wall_name, wall_desc, wall_texture, wall_mat, wall_sounds) +walls.register = function(wall_name, wall_desc, wall_texture_table, wall_mat, wall_sounds) + --make wall_texture_table paramenter backwards compatible for mods passing single texture + if type(wall_texture_table) ~= "table" then + wall_texture_table = { wall_texture_table } + end -- inventory node, and pole-type wall start item minetest.register_node(wall_name, { description = wall_desc, @@ -14,10 +18,10 @@ walls.register = function(wall_name, wall_desc, wall_texture, wall_mat, wall_sou connect_back = {{-3/16, -1/2, 1/4, 3/16, 3/8, 1/2}}, connect_right = {{ 1/4, -1/2, -3/16, 1/2, 3/8, 3/16}}, }, - connects_to = { "group:wall", "group:stone" }, + connects_to = { "group:wall", "group:stone", "group:fence" }, paramtype = "light", is_ground_content = false, - tiles = { wall_texture, }, + tiles = wall_texture_table, walkable = true, groups = { cracky = 3, wall = 1, stone = 2 }, sounds = wall_sounds, @@ -35,12 +39,12 @@ walls.register = function(wall_name, wall_desc, wall_texture, wall_mat, wall_sou end -walls.register("walls:cobble", "Cobblestone Wall", "default_cobble.png", +walls.register("walls:cobble", "Cobblestone Wall", {"default_cobble.png"}, "default:cobble", default.node_sound_stone_defaults()) -walls.register("walls:mossycobble", "Mossy Cobblestone Wall", "default_mossycobble.png", +walls.register("walls:mossycobble", "Mossy Cobblestone Wall", {"default_mossycobble.png"}, "default:mossycobble", default.node_sound_stone_defaults()) -walls.register("walls:desertcobble", "Desert Cobblestone Wall", "default_desert_cobble.png", +walls.register("walls:desertcobble", "Desert Cobblestone Wall", {"default_desert_cobble.png"}, "default:desert_cobble", default.node_sound_stone_defaults()) diff --git a/mods/wool/init.lua b/mods/wool/init.lua index a36e4dd..3e565a4 100644 --- a/mods/wool/init.lua +++ b/mods/wool/init.lua @@ -1,27 +1,23 @@ --- This uses a trick: you can first define the recipes using all of the base --- colors, and then some recipes using more specific colors for a few non-base --- colors available. When crafting, the last recipes will be checked first. - local dyes = { - {"white", "White", "basecolor_white"}, - {"grey", "Grey", "basecolor_grey"}, - {"black", "Black", "basecolor_black"}, - {"red", "Red", "basecolor_red"}, - {"yellow", "Yellow", "basecolor_yellow"}, - {"green", "Green", "basecolor_green"}, - {"cyan", "Cyan", "basecolor_cyan"}, - {"blue", "Blue", "basecolor_blue"}, - {"magenta", "Magenta", "basecolor_magenta"}, - {"orange", "Orange", "excolor_orange"}, - {"violet", "Violet", "excolor_violet"}, - {"brown", "Brown", "unicolor_dark_orange"}, - {"pink", "Pink", "unicolor_light_red"}, - {"dark_grey", "Dark Grey", "unicolor_darkgrey"}, - {"dark_green", "Dark Green", "unicolor_dark_green"}, + {"white", "White"}, + {"grey", "Grey"}, + {"black", "Black"}, + {"red", "Red"}, + {"yellow", "Yellow"}, + {"green", "Green"}, + {"cyan", "Cyan"}, + {"blue", "Blue"}, + {"magenta", "Magenta"}, + {"orange", "Orange"}, + {"violet", "Violet"}, + {"brown", "Brown"}, + {"pink", "Pink"}, + {"dark_grey", "Dark Grey"}, + {"dark_green", "Dark Green"}, } for i = 1, #dyes do - local name, desc, craft_color_group = unpack(dyes[i]) + local name, desc = unpack(dyes[i]) minetest.register_node("wool:" .. name, { description = desc .. " Wool", @@ -35,13 +31,11 @@ for i = 1, #dyes do minetest.register_craft{ type = "shapeless", output = "wool:" .. name, - recipe = {"group:dye," .. craft_color_group, "group:wool"}, + recipe = {"group:dye,color_" .. name, "group:wool"}, } end - --- legacy - +-- Legacy -- Backwards compatibility with jordach's 16-color wool mod minetest.register_alias("wool:dark_blue", "wool:blue") minetest.register_alias("wool:gold", "wool:yellow") diff --git a/mods/xpanes/README.txt b/mods/xpanes/README.txt index bcbc129..47161da 100644 --- a/mods/xpanes/README.txt +++ b/mods/xpanes/README.txt @@ -19,3 +19,6 @@ Gambit (CC BY-SA 3.0): paramat (CC BY-SA 3.0): xpanes_bar_top.png + +Krock (CC0 1.0): + xpanes_edge.png diff --git a/mods/xpanes/init.lua b/mods/xpanes/init.lua index 77278a5..653c8cd 100644 --- a/mods/xpanes/init.lua +++ b/mods/xpanes/init.lua @@ -104,6 +104,7 @@ function xpanes.register_pane(name, def) groups = flatgroups, drop = "xpanes:" .. name .. "_flat", sounds = def.sounds, + use_texture_alpha = def.use_texture_alpha or false, node_box = { type = "fixed", fixed = {{-1/2, -1/2, -1/32, 1/2, 1/2, 1/32}}, @@ -128,6 +129,7 @@ function xpanes.register_pane(name, def) groups = groups, drop = "xpanes:" .. name .. "_flat", sounds = def.sounds, + use_texture_alpha = def.use_texture_alpha or false, node_box = { type = "connected", fixed = {{-1/32, -1/2, -1/32, 1/32, 1/2, 1/32}}, @@ -147,7 +149,7 @@ end xpanes.register_pane("pane", { description = "Glass Pane", - textures = {"default_glass.png","xpanes_pane_half.png","xpanes_white.png"}, + textures = {"default_glass.png","xpanes_pane_half.png","xpanes_edge.png"}, inventory_image = "default_glass.png", wield_image = "default_glass.png", sounds = default.node_sound_glass_defaults(), @@ -158,8 +160,21 @@ xpanes.register_pane("pane", { } }) +xpanes.register_pane("obsidian_pane", { + description = "Obsidian Glass Pane", + textures = {"default_obsidian_glass.png","xpanes_pane_half.png","xpanes_edge_obsidian.png"}, + inventory_image = "default_obsidian_glass.png", + wield_image = "default_obsidian_glass.png", + sounds = default.node_sound_glass_defaults(), + groups = {snappy=2, cracky=3}, + recipe = { + {"default:obsidian_glass", "default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default:obsidian_glass", "default:obsidian_glass"} + } +}) + xpanes.register_pane("bar", { - description = "Iron bar", + description = "Steel Bars", textures = {"xpanes_bar.png","xpanes_bar.png","xpanes_bar_top.png"}, inventory_image = "xpanes_bar.png", wield_image = "xpanes_bar.png", diff --git a/mods/xpanes/textures/xpanes_bar_top.png b/mods/xpanes/textures/xpanes_bar_top.png index 887518aa2aa038594626d0583cb5ecf70de269b8..7b74508f27402c1b469870a321e629efd05db576 100644 GIT binary patch delta 22 dcmdlZy+?XO125M@HfB*1(`w(mw#i+*MgUq<2X+7e delta 22 dcmdlZy+?XO125MDZgyc|>wm($qLaILjR04Z2G{@q diff --git a/mods/xpanes/textures/xpanes_edge.png b/mods/xpanes/textures/xpanes_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..5768d66325e223045786219ecb00b985d1199bd4 GIT binary patch literal 269 zcmV+o0rLKdP)F5Ay*UoJz za&1-s7O7L7?y2g&0IaU#g>~e)>j3KRu0DL_sNMkPj9!VYy5;Kt$*k_}jkjdJaxYXH TK;|{U00000NkvXXu0mjfkVTVO literal 0 HcmV?d00001 diff --git a/mods/xpanes/textures/xpanes_edge_obsidian.png b/mods/xpanes/textures/xpanes_edge_obsidian.png new file mode 100644 index 0000000000000000000000000000000000000000..abdd14e340c5bb68b8aae84d4d1600838fd87e51 GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9tAK!jyqck~k&F~jMBLNG tF@)oKasmVMF*df8gab@Y8BGZc4C*%-vn#!d;(FKNUcJ&>cJ+8|dB6OVhm{PQ0}W1< zzOFp&e?s!to~OCDS5A0s?fmo(e_ucUE3+f}Wbg28S6+D9(PrDiUA&z6=U?u!Uzd6` z=FUC+g}Hw>&R=ixBSvbM%CSh}NT>N0vz|8XEcR*J^Hp-ijZgnAe$~k5g}V9FcpY?K z&%yf8ds^4L3y(wls{Mj4Y<}~kS*$%{#&qlT@$vDla_=sff9hZHUh;4EAK8~1gsSW( z__usA{uku;OO5~iM7_NCHqZZ5{8KQmjInugs5igoUGkjkud+@>6y59IHGNas1?#kJ z*Pv8g#t`1 zUVKRj%|a||rilDLJ}H?$RMdCXtgBbHW}Kar-ug7Ba^8xoM<%UIH7?c;YwlJLKcDw5 zZjYE=lW;iqtBn-(kGp6c5!&GfVVoVk4d(>2V|xhFiF-Q~<`rWm|(&Q1Qi@-KVVmX#lsOhw-= zWLtSNx9M5oqREmSg-Q(DJsVUE{L?OKs?K|&wmCu~bYYJ|>7kb7Rs;*q&%d|Mn6 z{CB-A<-vC5e}z2%8Pe*uJbduicquS{Bx21NnFS@upp0SbwUf8Of#bpU)fv^7*YmoT<5Tyl zPYi~NBDbd3{kg@!z?qc^%!LuYK32*3xq68y`AMmI6}bgKS1>Tx*jE%JCTFLXC?ut( zXXe=|z2CiGNg*@ERw>-n*TA>HIW;5GqpB!1xXLdixhgx^GDXSWj?1RP3TQxXYDuC( zMQ%=Bu~mhw64+cTAR8pCucQE0Qj%?}6yY17;GAESs$imLqGzD%T9H|1q-4jXU{jQm zW)m6U+;3Q)sSlHq0-losWHO-@PHPt8fqP0cGQ z);H8M)Ca3iNw#v!FUm~>>d(wgOi$G>$V*q!2f0=s>Rh1j_2J$Jxq_1 zgNvjPAW89P>KY9$l0twa#iOZfXayG+q5+kf2W&N!1Di(-{~H{DO)KUApAgso|Nk#P zB7FkLWlZvRcVXyYmGuB}I14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sf18#OeCk|A^<>}%W!f`!00mx=zV0@&w R#~8?B@O1TaS?83{1OUBqR%rkL